@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":"tambo-v1-stream-context.js","sourceRoot":"","sources":["../../../src/v1/providers/tambo-v1-stream-context.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\n/**\n * Stream Context Provider for v1 API\n *\n * Manages streaming state using React Context and useReducer.\n * Provides state and dispatch to child components via separate contexts\n * following the split-context pattern for optimal re-render performance.\n */\n\nimport React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n} from \"react\";\nimport { useTamboClient } from \"../../providers/tambo-client-provider\";\nimport { useTamboQuery } from \"../../hooks/react-query-hooks\";\nimport type { TamboV1Message } from \"../types/message\";\nimport type { TamboV1Thread } from \"../types/thread\";\nimport {\n createInitialState,\n createInitialThreadState,\n isPlaceholderThreadId,\n PLACEHOLDER_THREAD_ID,\n streamReducer,\n type StreamAction,\n type StreamState,\n} from \"../utils/event-accumulator\";\n\n/**\n * Thread management functions exposed by the stream context.\n */\nexport interface ThreadManagement {\n /**\n * Initialize a new thread in the stream context.\n * Use this before sending messages to a new thread.\n * @param threadId - The thread ID to initialize\n * @param initialThread - Optional initial thread data\n */\n initThread: (\n threadId: string,\n initialThread?: Partial<TamboV1Thread>,\n ) => void;\n\n /**\n * Switch the current active thread.\n * Does not fetch thread data - use useTamboV1Thread for that.\n * @param threadId - The thread ID to switch to\n */\n switchThread: (threadId: string) => void;\n\n /**\n * Start a new thread (generates a temporary ID).\n * The actual thread ID will be assigned when the first message is sent.\n * @returns The temporary thread ID\n */\n startNewThread: () => string;\n}\n\n/**\n * Context for accessing stream state (read-only).\n * Separated from dispatch context to prevent unnecessary re-renders.\n */\nconst StreamStateContext = createContext<StreamState | null>(null);\n\n/**\n * Context for dispatching events to the stream reducer.\n * Separated from state context to prevent unnecessary re-renders.\n */\nconst StreamDispatchContext =\n createContext<React.Dispatch<StreamAction> | null>(null);\n\n/**\n * Context for thread management functions.\n * Separated from state to prevent unnecessary re-renders.\n */\nconst ThreadManagementContext = createContext<ThreadManagement | null>(null);\n\n/**\n * Props for TamboV1StreamProvider\n */\nexport interface TamboV1StreamProviderProps {\n children: React.ReactNode;\n\n /**\n * Optional override for stream state (primarily for tests).\n * If provided, you must also provide `dispatch`.\n */\n state?: StreamState;\n\n /**\n * Optional override for stream dispatch (primarily for tests).\n * If provided, you must also provide `state`.\n */\n dispatch?: React.Dispatch<StreamAction>;\n\n /**\n * Optional override for thread management functions (primarily for tests).\n */\n threadManagement?: ThreadManagement;\n}\n\n/**\n * Provider component for stream state management.\n *\n * Uses useReducer with streamReducer to accumulate AG-UI events into\n * thread state. Provides state, dispatch, and thread management via separate contexts.\n *\n * Thread management is done programmatically via the hooks:\n * - startNewThread() - Start a new conversation\n * - switchThread(threadId) - Switch to an existing thread\n * - initThread(threadId) - Initialize a thread for receiving events\n * @returns JSX element wrapping children with stream contexts\n * @example\n * ```tsx\n * <TamboV1StreamProvider>\n * <ChatInterface />\n * </TamboV1StreamProvider>\n * ```\n */\nexport function TamboV1StreamProvider(props: TamboV1StreamProviderProps) {\n const { children, state: providedState, dispatch: providedDispatch } = props;\n\n if (\n (providedState && !providedDispatch) ||\n (!providedState && providedDispatch)\n ) {\n throw new Error(\n \"TamboV1StreamProvider requires both state and dispatch when overriding\",\n );\n }\n\n if (props.threadManagement) {\n const { initThread, switchThread, startNewThread } = props.threadManagement;\n if (\n typeof initThread !== \"function\" ||\n typeof switchThread !== \"function\" ||\n typeof startNewThread !== \"function\"\n ) {\n throw new Error(\n \"TamboV1StreamProvider: threadManagement override is missing required methods\",\n );\n }\n }\n\n // Create stable initial state - only computed once on mount\n // Uses createInitialState which sets up placeholder thread for optimistic UI\n const [state, dispatch] = useReducer(\n streamReducer,\n undefined,\n createInitialState,\n );\n\n const activeState = providedState ?? state;\n const activeDispatch = providedDispatch ?? dispatch;\n\n // Thread management functions\n const initThread = useCallback(\n (threadId: string, initialThread?: Partial<TamboV1Thread>) => {\n activeDispatch({ type: \"INIT_THREAD\", threadId, initialThread });\n },\n [activeDispatch],\n );\n\n const switchThread = useCallback(\n (threadId: string) => {\n activeDispatch({ type: \"SET_CURRENT_THREAD\", threadId });\n },\n [activeDispatch],\n );\n\n const startNewThread = useCallback(() => {\n // Reset placeholder thread to empty state and switch to it\n // This prepares for a new conversation while preserving existing threads\n activeDispatch({\n type: \"START_NEW_THREAD\",\n threadId: PLACEHOLDER_THREAD_ID,\n initialThread: createInitialThreadState(PLACEHOLDER_THREAD_ID).thread,\n });\n return PLACEHOLDER_THREAD_ID;\n }, [activeDispatch]);\n\n const threadManagement = useMemo<ThreadManagement>(() => {\n return (\n props.threadManagement ?? {\n initThread,\n switchThread,\n startNewThread,\n }\n );\n }, [props.threadManagement, initThread, switchThread, startNewThread]);\n\n return (\n <StreamStateContext.Provider value={activeState}>\n <StreamDispatchContext.Provider value={activeDispatch}>\n <ThreadManagementContext.Provider value={threadManagement}>\n <ThreadSyncManager />\n {children}\n </ThreadManagementContext.Provider>\n </StreamDispatchContext.Provider>\n </StreamStateContext.Provider>\n );\n}\n\n/**\n * Internal component that handles automatic thread message syncing.\n * Fetches thread messages when switching to a non-placeholder thread.\n * Must be used within StreamStateContext, StreamDispatchContext, and TamboClientProvider.\n * @internal\n * @returns null - this component renders nothing\n */\nfunction ThreadSyncManager(): null {\n const client = useTamboClient();\n const state = useContext(StreamStateContext);\n const dispatch = useContext(StreamDispatchContext);\n\n // Track which threads have been synced to avoid redundant fetches\n const lastSyncedThreadRef = useRef<string | null>(null);\n const currentThreadId = state?.currentThreadId ?? PLACEHOLDER_THREAD_ID;\n const threadState = state?.threadMap[currentThreadId];\n\n // Determine if we need to fetch thread messages\n // Only fetch for non-placeholder threads that haven't been synced and have no messages\n const isNotPlaceholder = !isPlaceholderThreadId(currentThreadId);\n const isNotSynced = currentThreadId !== lastSyncedThreadRef.current;\n const hasNoMessages =\n !threadState || threadState.thread.messages.length === 0;\n const shouldFetch = isNotPlaceholder && isNotSynced && hasNoMessages;\n\n // Fetch messages from the messages endpoint (not the thread endpoint)\n const { data: messagesData, isSuccess } = useTamboQuery({\n queryKey: [\"v1-thread-messages\", currentThreadId],\n queryFn: async () => await client.threads.messages.list(currentThreadId),\n enabled: shouldFetch,\n staleTime: 1000,\n refetchOnWindowFocus: false,\n });\n\n // Sync fetched messages to stream state\n useEffect(() => {\n if (!isSuccess || !messagesData || !dispatch) return;\n if (lastSyncedThreadRef.current === currentThreadId) return;\n\n dispatch({\n type: \"LOAD_THREAD_MESSAGES\",\n threadId: currentThreadId,\n messages: messagesData.messages as TamboV1Message[],\n skipIfStreaming: true,\n });\n\n lastSyncedThreadRef.current = currentThreadId;\n }, [isSuccess, messagesData, currentThreadId, dispatch]);\n\n return null;\n}\n\n/**\n * Hook to access stream state.\n *\n * Must be used within TamboV1StreamProvider.\n * @returns Current stream state\n * @throws {Error} if used outside TamboV1StreamProvider\n * @example\n * ```tsx\n * function ChatMessages() {\n * const { thread, streaming } = useStreamState();\n *\n * return (\n * <div>\n * {thread.messages.map(msg => <Message key={msg.id} message={msg} />)}\n * {streaming.status === 'streaming' && <LoadingIndicator />}\n * </div>\n * );\n * }\n * ```\n */\nexport function useStreamState(): StreamState {\n const context = useContext(StreamStateContext);\n\n if (!context) {\n throw new Error(\"useStreamState must be used within TamboV1StreamProvider\");\n }\n\n return context;\n}\n\n/**\n * Hook to access stream dispatch function.\n *\n * Must be used within TamboV1StreamProvider.\n * @returns Dispatch function for sending events to reducer\n * @throws {Error} if used outside TamboV1StreamProvider\n * @example\n * ```tsx\n * function StreamHandler() {\n * const dispatch = useStreamDispatch();\n *\n * useEffect(() => {\n * async function handleStream() {\n * for await (const event of streamEvents) {\n * dispatch({ type: 'EVENT', event });\n * }\n * }\n * handleStream();\n * }, [dispatch]);\n *\n * return null;\n * }\n * ```\n */\nexport function useStreamDispatch(): React.Dispatch<StreamAction> {\n const context = useContext(StreamDispatchContext);\n\n if (!context) {\n throw new Error(\n \"useStreamDispatch must be used within TamboV1StreamProvider\",\n );\n }\n\n return context;\n}\n\n/**\n * Hook to access thread management functions.\n *\n * Must be used within TamboV1StreamProvider.\n * @returns Thread management functions\n * @throws {Error} if used outside TamboV1StreamProvider\n * @example\n * ```tsx\n * function ThreadSwitcher() {\n * const { switchThread, startNewThread } = useThreadManagement();\n *\n * return (\n * <div>\n * <button onClick={() => switchThread('thread_123')}>\n * Load Thread\n * </button>\n * <button onClick={startNewThread}>\n * New Chat\n * </button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useThreadManagement(): ThreadManagement {\n const context = useContext(ThreadManagementContext);\n\n if (!context) {\n throw new Error(\n \"useThreadManagement must be used within TamboV1StreamProvider\",\n );\n }\n\n return context;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tambo-v1-stream-context.js","sourceRoot":"","sources":["../../../src/v1/providers/tambo-v1-stream-context.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoIb,sDA8GC;AA6FD,wCAQC;AA0BD,8CAUC;AA0BD,kDAUC;AA7ZD;;;;;;GAMG;AAEH,+CAQe;AACf,qEAA8D;AAC9D,iFAAuE;AAGvE,kEASoC;AACpC,2DAAuD;AAgCvD;;;GAGG;AACH,MAAM,kBAAkB,GAAG,IAAA,qBAAa,EAAqB,IAAI,CAAC,CAAC;AAEnE;;;GAGG;AACH,MAAM,qBAAqB,GACzB,IAAA,qBAAa,EAAsC,IAAI,CAAC,CAAC;AAE3D;;;GAGG;AACH,MAAM,uBAAuB,GAAG,IAAA,qBAAa,EAA0B,IAAI,CAAC,CAAC;AAgC7E;;;;;;;;;;;;;;;;;GAiBG;AACH,SAAgB,qBAAqB,CAAC,KAAiC;IACrE,MAAM,EACJ,QAAQ,EACR,eAAe,EACf,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,gBAAgB,GAC3B,GAAG,KAAK,CAAC;IAEV,IACE,CAAC,aAAa,IAAI,CAAC,gBAAgB,CAAC;QACpC,CAAC,CAAC,aAAa,IAAI,gBAAgB,CAAC,EACpC,CAAC;QACD,MAAM,IAAI,KAAK,CACb,wEAAwE,CACzE,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;QAC3B,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC;QAC5E,IACE,OAAO,UAAU,KAAK,UAAU;YAChC,OAAO,YAAY,KAAK,UAAU;YAClC,OAAO,cAAc,KAAK,UAAU,EACpC,CAAC;YACD,MAAM,IAAI,KAAK,CACb,8EAA8E,CAC/E,CAAC;QACJ,CAAC;IACH,CAAC;IAED,4DAA4D;IAC5D,6EAA6E;IAC7E,8EAA8E;IAC9E,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,IAAA,kBAAU,EAClC,iCAAa,EACb,eAAe,EACf,CAAC,IAAI,EAAE,EAAE,CACP,IAAI,EAAE,MAAM;QACV,CAAC,CAAC,IAAA,kDAA8B,EAAC,IAAI,CAAC;QACtC,CAAC,CAAC,IAAA,sCAAkB,GAAE,CAC3B,CAAC;IAEF,MAAM,WAAW,GAAG,aAAa,IAAI,KAAK,CAAC;IAC3C,MAAM,cAAc,GAAG,gBAAgB,IAAI,QAAQ,CAAC;IAEpD,8BAA8B;IAC9B,MAAM,UAAU,GAAG,IAAA,mBAAW,EAC5B,CAAC,QAAgB,EAAE,aAAsC,EAAE,EAAE;QAC3D,cAAc,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC;IACnE,CAAC,EACD,CAAC,cAAc,CAAC,CACjB,CAAC;IAEF,MAAM,YAAY,GAAG,IAAA,mBAAW,EAC9B,CAAC,QAAgB,EAAE,EAAE;QACnB,cAAc,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC3D,CAAC,EACD,CAAC,cAAc,CAAC,CACjB,CAAC;IAEF,MAAM,cAAc,GAAG,IAAA,mBAAW,EAAC,GAAG,EAAE;QACtC,4CAA4C;QAC5C,0EAA0E;QAC1E,uEAAuE;QACvE,MAAM,UAAU,GAAG,IAAA,4CAAwB,EAAC,yCAAqB,CAAC,CAAC,MAAM,CAAC;QAC1E,MAAM,kBAAkB,GAAG,eAAe,EAAE,MAAM;YAChD,CAAC,CAAC;gBACE,GAAG,UAAU;gBACb,QAAQ,EAAE,eAAe,CAAC,GAAG,CAC3B,CAAC,GAAG,EAAkB,EAAE,CAAC,CAAC;oBACxB,EAAE,EAAE,WAAW,MAAM,CAAC,UAAU,EAAE,EAAE;oBACpC,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;wBAC7B,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;4BACtB,OAAO,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;wBACjD,CAAC;wBACD,OAAO,CAAC,CAAC;oBACX,CAAC,CAAC;iBACH,CAAC,CACH;aACF;YACH,CAAC,CAAC,UAAU,CAAC;QACf,cAAc,CAAC;YACb,IAAI,EAAE,kBAAkB;YACxB,QAAQ,EAAE,yCAAqB;YAC/B,aAAa,EAAE,kBAAkB;SAClC,CAAC,CAAC;QACH,OAAO,yCAAqB,CAAC;IAC/B,CAAC,EAAE,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC,CAAC;IAEtC,MAAM,gBAAgB,GAAG,IAAA,eAAO,EAAmB,GAAG,EAAE;QACtD,OAAO,CACL,KAAK,CAAC,gBAAgB,IAAI;YACxB,UAAU;YACV,YAAY;YACZ,cAAc;SACf,CACF,CAAC;IACJ,CAAC,EAAE,CAAC,KAAK,CAAC,gBAAgB,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,CAAC,CAAC,CAAC;IAEvE,OAAO,CACL,8BAAC,kBAAkB,CAAC,QAAQ,IAAC,KAAK,EAAE,WAAW;QAC7C,8BAAC,qBAAqB,CAAC,QAAQ,IAAC,KAAK,EAAE,cAAc;YACnD,8BAAC,uBAAuB,CAAC,QAAQ,IAAC,KAAK,EAAE,gBAAgB;gBACvD,8BAAC,iBAAiB,OAAG;gBACpB,QAAQ,CACwB,CACJ,CACL,CAC/B,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,iBAAiB;IACxB,MAAM,MAAM,GAAG,IAAA,sCAAc,GAAE,CAAC;IAChC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAA,oCAAgB,GAAE,CAAC;IACvC,MAAM,KAAK,GAAG,IAAA,kBAAU,EAAC,kBAAkB,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAA,kBAAU,EAAC,qBAAqB,CAAC,CAAC;IAEnD,kEAAkE;IAClE,MAAM,mBAAmB,GAAG,IAAA,cAAM,EAAgB,IAAI,CAAC,CAAC;IACxD,MAAM,eAAe,GAAG,KAAK,EAAE,eAAe,IAAI,yCAAqB,CAAC;IACxE,MAAM,WAAW,GAAG,KAAK,EAAE,SAAS,CAAC,eAAe,CAAC,CAAC;IAEtD,gDAAgD;IAChD,uFAAuF;IACvF,MAAM,gBAAgB,GAAG,CAAC,IAAA,yCAAqB,EAAC,eAAe,CAAC,CAAC;IACjE,MAAM,WAAW,GAAG,eAAe,KAAK,mBAAmB,CAAC,OAAO,CAAC;IACpE,MAAM,aAAa,GACjB,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;IAC3D,MAAM,WAAW,GAAG,gBAAgB,IAAI,WAAW,IAAI,aAAa,CAAC;IAErE,iDAAiD;IACjD,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,IAAA,iCAAa,EAAC;QACvE,QAAQ,EAAE,CAAC,oBAAoB,EAAE,eAAe,CAAC;QACjD,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC;QACxE,OAAO,EAAE,WAAW;QACpB,SAAS,EAAE,IAAI;QACf,oBAAoB,EAAE,KAAK;KAC5B,CAAC,CAAC;IAEH,IAAA,iCAAa,EAAC;QACZ,QAAQ,EAAE,CAAC,oBAAoB,EAAE,eAAe,CAAC;QACjD,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YACzE,IAAI,IAAI,CAAC,kBAAkB,IAAI,QAAQ,EAAE,CAAC;gBACxC,QAAQ,CAAC;oBACP,IAAI,EAAE,2BAA2B;oBACjC,QAAQ,EAAE,eAAe;oBACzB,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;iBAC5C,CAAC,CAAC;YACL,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,EAAE,WAAW;QACpB,SAAS,EAAE,IAAI;QACf,oBAAoB,EAAE,KAAK;KAC5B,CAAC,CAAC;IAEH,wCAAwC;IACxC,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,CAAC,eAAe,IAAI,CAAC,YAAY,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC3D,IAAI,mBAAmB,CAAC,OAAO,KAAK,eAAe;YAAE,OAAO;QAE5D,QAAQ,CAAC;YACP,IAAI,EAAE,sBAAsB;YAC5B,QAAQ,EAAE,eAAe;YACzB,QAAQ,EAAE,YAAY,CAAC,QAA4B;YACnD,eAAe,EAAE,IAAI;SACtB,CAAC,CAAC;QAEH,mBAAmB,CAAC,OAAO,GAAG,eAAe,CAAC;IAChD,CAAC,EAAE,CAAC,eAAe,EAAE,YAAY,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE/D,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,SAAgB,cAAc;IAC5B,MAAM,OAAO,GAAG,IAAA,kBAAU,EAAC,kBAAkB,CAAC,CAAC;IAE/C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC9E,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,SAAgB,iBAAiB;IAC/B,MAAM,OAAO,GAAG,IAAA,kBAAU,EAAC,qBAAqB,CAAC,CAAC;IAElD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,6DAA6D,CAC9D,CAAC;IACJ,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,SAAgB,mBAAmB;IACjC,MAAM,OAAO,GAAG,IAAA,kBAAU,EAAC,uBAAuB,CAAC,CAAC;IAEpD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,+DAA+D,CAChE,CAAC;IACJ,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC","sourcesContent":["\"use client\";\n\n/**\n * Stream Context Provider for v1 API\n *\n * Manages streaming state using React Context and useReducer.\n * Provides state and dispatch to child components via separate contexts\n * following the split-context pattern for optimal re-render performance.\n */\n\nimport React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n} from \"react\";\nimport { useTamboQuery } from \"../../hooks/react-query-hooks\";\nimport { useTamboClient } from \"../../providers/tambo-client-provider\";\nimport type { InitialInputMessage, TamboV1Message } from \"../types/message\";\nimport type { TamboV1Thread } from \"../types/thread\";\nimport {\n createInitialState,\n createInitialStateWithMessages,\n createInitialThreadState,\n isPlaceholderThreadId,\n PLACEHOLDER_THREAD_ID,\n streamReducer,\n type StreamAction,\n type StreamState,\n} from \"../utils/event-accumulator\";\nimport { useTamboV1Config } from \"./tambo-v1-provider\";\n\n/**\n * Thread management functions exposed by the stream context.\n */\nexport interface ThreadManagement {\n /**\n * Initialize a new thread in the stream context.\n * Use this before sending messages to a new thread.\n * @param threadId - The thread ID to initialize\n * @param initialThread - Optional initial thread data\n */\n initThread: (\n threadId: string,\n initialThread?: Partial<TamboV1Thread>,\n ) => void;\n\n /**\n * Switch the current active thread.\n * Does not fetch thread data - use useTamboV1Thread for that.\n * @param threadId - The thread ID to switch to\n */\n switchThread: (threadId: string) => void;\n\n /**\n * Start a new thread (generates a temporary ID).\n * The actual thread ID will be assigned when the first message is sent.\n * @returns The temporary thread ID\n */\n startNewThread: () => string;\n}\n\n/**\n * Context for accessing stream state (read-only).\n * Separated from dispatch context to prevent unnecessary re-renders.\n */\nconst StreamStateContext = createContext<StreamState | null>(null);\n\n/**\n * Context for dispatching events to the stream reducer.\n * Separated from state context to prevent unnecessary re-renders.\n */\nconst StreamDispatchContext =\n createContext<React.Dispatch<StreamAction> | null>(null);\n\n/**\n * Context for thread management functions.\n * Separated from state to prevent unnecessary re-renders.\n */\nconst ThreadManagementContext = createContext<ThreadManagement | null>(null);\n\n/**\n * Props for TamboV1StreamProvider\n */\nexport interface TamboV1StreamProviderProps {\n children: React.ReactNode;\n\n /**\n * Initial messages to populate the placeholder thread with.\n * These render in the UI before any API call is made.\n */\n initialMessages?: InitialInputMessage[];\n\n /**\n * Optional override for stream state (primarily for tests).\n * If provided, you must also provide `dispatch`.\n */\n state?: StreamState;\n\n /**\n * Optional override for stream dispatch (primarily for tests).\n * If provided, you must also provide `state`.\n */\n dispatch?: React.Dispatch<StreamAction>;\n\n /**\n * Optional override for thread management functions (primarily for tests).\n */\n threadManagement?: ThreadManagement;\n}\n\n/**\n * Provider component for stream state management.\n *\n * Uses useReducer with streamReducer to accumulate AG-UI events into\n * thread state. Provides state, dispatch, and thread management via separate contexts.\n *\n * Thread management is done programmatically via the hooks:\n * - startNewThread() - Start a new conversation\n * - switchThread(threadId) - Switch to an existing thread\n * - initThread(threadId) - Initialize a thread for receiving events\n * @returns JSX element wrapping children with stream contexts\n * @example\n * ```tsx\n * <TamboV1StreamProvider>\n * <ChatInterface />\n * </TamboV1StreamProvider>\n * ```\n */\nexport function TamboV1StreamProvider(props: TamboV1StreamProviderProps) {\n const {\n children,\n initialMessages,\n state: providedState,\n dispatch: providedDispatch,\n } = props;\n\n if (\n (providedState && !providedDispatch) ||\n (!providedState && providedDispatch)\n ) {\n throw new Error(\n \"TamboV1StreamProvider requires both state and dispatch when overriding\",\n );\n }\n\n if (props.threadManagement) {\n const { initThread, switchThread, startNewThread } = props.threadManagement;\n if (\n typeof initThread !== \"function\" ||\n typeof switchThread !== \"function\" ||\n typeof startNewThread !== \"function\"\n ) {\n throw new Error(\n \"TamboV1StreamProvider: threadManagement override is missing required methods\",\n );\n }\n }\n\n // Create stable initial state - only computed once on mount\n // Uses createInitialState which sets up placeholder thread for optimistic UI\n // If initialMessages are provided, the placeholder thread is seeded with them\n const [state, dispatch] = useReducer(\n streamReducer,\n initialMessages,\n (msgs) =>\n msgs?.length\n ? createInitialStateWithMessages(msgs)\n : createInitialState(),\n );\n\n const activeState = providedState ?? state;\n const activeDispatch = providedDispatch ?? dispatch;\n\n // Thread management functions\n const initThread = useCallback(\n (threadId: string, initialThread?: Partial<TamboV1Thread>) => {\n activeDispatch({ type: \"INIT_THREAD\", threadId, initialThread });\n },\n [activeDispatch],\n );\n\n const switchThread = useCallback(\n (threadId: string) => {\n activeDispatch({ type: \"SET_CURRENT_THREAD\", threadId });\n },\n [activeDispatch],\n );\n\n const startNewThread = useCallback(() => {\n // Reset placeholder thread and switch to it\n // This prepares for a new conversation while preserving existing threads.\n // If initialMessages were provided, re-seed the placeholder with them.\n const baseThread = createInitialThreadState(PLACEHOLDER_THREAD_ID).thread;\n const threadWithMessages = initialMessages?.length\n ? {\n ...baseThread,\n messages: initialMessages.map(\n (msg): TamboV1Message => ({\n id: `initial_${crypto.randomUUID()}`,\n role: msg.role,\n content: msg.content.map((c) => {\n if (c.type === \"text\") {\n return { type: \"text\" as const, text: c.text };\n }\n return c;\n }),\n }),\n ),\n }\n : baseThread;\n activeDispatch({\n type: \"START_NEW_THREAD\",\n threadId: PLACEHOLDER_THREAD_ID,\n initialThread: threadWithMessages,\n });\n return PLACEHOLDER_THREAD_ID;\n }, [activeDispatch, initialMessages]);\n\n const threadManagement = useMemo<ThreadManagement>(() => {\n return (\n props.threadManagement ?? {\n initThread,\n switchThread,\n startNewThread,\n }\n );\n }, [props.threadManagement, initThread, switchThread, startNewThread]);\n\n return (\n <StreamStateContext.Provider value={activeState}>\n <StreamDispatchContext.Provider value={activeDispatch}>\n <ThreadManagementContext.Provider value={threadManagement}>\n <ThreadSyncManager />\n {children}\n </ThreadManagementContext.Provider>\n </StreamDispatchContext.Provider>\n </StreamStateContext.Provider>\n );\n}\n\n/**\n * Internal component that handles automatic thread message syncing.\n * Fetches thread messages when switching to a non-placeholder thread.\n * Must be used within StreamStateContext, StreamDispatchContext, and TamboClientProvider.\n * @internal\n * @returns null - this component renders nothing\n */\nfunction ThreadSyncManager(): null {\n const client = useTamboClient();\n const { userKey } = useTamboV1Config();\n const state = useContext(StreamStateContext);\n const dispatch = useContext(StreamDispatchContext);\n\n // Track which threads have been synced to avoid redundant fetches\n const lastSyncedThreadRef = useRef<string | null>(null);\n const currentThreadId = state?.currentThreadId ?? PLACEHOLDER_THREAD_ID;\n const threadState = state?.threadMap[currentThreadId];\n\n // Determine if we need to fetch thread messages\n // Only fetch for non-placeholder threads that haven't been synced and have no messages\n const isNotPlaceholder = !isPlaceholderThreadId(currentThreadId);\n const isNotSynced = currentThreadId !== lastSyncedThreadRef.current;\n const hasNoMessages =\n !threadState || threadState.thread.messages.length === 0;\n const shouldFetch = isNotPlaceholder && isNotSynced && hasNoMessages;\n\n // Fetch messages and thread metadata in parallel\n const { data: messagesData, isSuccess: messagesSuccess } = useTamboQuery({\n queryKey: [\"v1-thread-messages\", currentThreadId],\n queryFn: async () => await client.threads.messages.list(currentThreadId),\n enabled: shouldFetch,\n staleTime: 1000,\n refetchOnWindowFocus: false,\n });\n\n useTamboQuery({\n queryKey: [\"v1-thread-metadata\", currentThreadId],\n queryFn: async () => {\n const data = await client.threads.retrieve(currentThreadId, { userKey });\n if (data.lastCompletedRunId && dispatch) {\n dispatch({\n type: \"SET_LAST_COMPLETED_RUN_ID\",\n threadId: currentThreadId,\n lastCompletedRunId: data.lastCompletedRunId,\n });\n }\n return data;\n },\n enabled: shouldFetch,\n staleTime: 1000,\n refetchOnWindowFocus: false,\n });\n\n // Sync fetched messages to stream state\n useEffect(() => {\n if (!messagesSuccess || !messagesData || !dispatch) return;\n if (lastSyncedThreadRef.current === currentThreadId) return;\n\n dispatch({\n type: \"LOAD_THREAD_MESSAGES\",\n threadId: currentThreadId,\n messages: messagesData.messages as TamboV1Message[],\n skipIfStreaming: true,\n });\n\n lastSyncedThreadRef.current = currentThreadId;\n }, [messagesSuccess, messagesData, currentThreadId, dispatch]);\n\n return null;\n}\n\n/**\n * Hook to access stream state.\n *\n * Must be used within TamboV1StreamProvider.\n * @returns Current stream state\n * @throws {Error} if used outside TamboV1StreamProvider\n * @example\n * ```tsx\n * function ChatMessages() {\n * const { thread, streaming } = useStreamState();\n *\n * return (\n * <div>\n * {thread.messages.map(msg => <Message key={msg.id} message={msg} />)}\n * {streaming.status === 'streaming' && <LoadingIndicator />}\n * </div>\n * );\n * }\n * ```\n */\nexport function useStreamState(): StreamState {\n const context = useContext(StreamStateContext);\n\n if (!context) {\n throw new Error(\"useStreamState must be used within TamboV1StreamProvider\");\n }\n\n return context;\n}\n\n/**\n * Hook to access stream dispatch function.\n *\n * Must be used within TamboV1StreamProvider.\n * @returns Dispatch function for sending events to reducer\n * @throws {Error} if used outside TamboV1StreamProvider\n * @example\n * ```tsx\n * function StreamHandler() {\n * const dispatch = useStreamDispatch();\n *\n * useEffect(() => {\n * async function handleStream() {\n * for await (const event of streamEvents) {\n * dispatch({ type: 'EVENT', event });\n * }\n * }\n * handleStream();\n * }, [dispatch]);\n *\n * return null;\n * }\n * ```\n */\nexport function useStreamDispatch(): React.Dispatch<StreamAction> {\n const context = useContext(StreamDispatchContext);\n\n if (!context) {\n throw new Error(\n \"useStreamDispatch must be used within TamboV1StreamProvider\",\n );\n }\n\n return context;\n}\n\n/**\n * Hook to access thread management functions.\n *\n * Must be used within TamboV1StreamProvider.\n * @returns Thread management functions\n * @throws {Error} if used outside TamboV1StreamProvider\n * @example\n * ```tsx\n * function ThreadSwitcher() {\n * const { switchThread, startNewThread } = useThreadManagement();\n *\n * return (\n * <div>\n * <button onClick={() => switchThread('thread_123')}>\n * Load Thread\n * </button>\n * <button onClick={startNewThread}>\n * New Chat\n * </button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useThreadManagement(): ThreadManagement {\n const context = useContext(ThreadManagementContext);\n\n if (!context) {\n throw new Error(\n \"useThreadManagement must be used within TamboV1StreamProvider\",\n );\n }\n\n return context;\n}\n"]}
|
|
@@ -15,10 +15,19 @@ jest.mock("../../providers/tambo-client-provider", () => ({
|
|
|
15
15
|
messages: {
|
|
16
16
|
list: jest.fn().mockResolvedValue({ messages: [], hasMore: false }),
|
|
17
17
|
},
|
|
18
|
+
retrieve: jest.fn().mockResolvedValue({}),
|
|
18
19
|
},
|
|
19
20
|
})),
|
|
20
21
|
useTamboQueryClient: jest.fn(),
|
|
21
22
|
}));
|
|
23
|
+
// Mock useTamboV1Config to avoid TamboV1Provider dependency
|
|
24
|
+
jest.mock("./tambo-v1-provider", () => {
|
|
25
|
+
const actual = jest.requireActual("./tambo-v1-provider");
|
|
26
|
+
return {
|
|
27
|
+
...actual,
|
|
28
|
+
useTamboV1Config: () => ({ userKey: undefined }),
|
|
29
|
+
};
|
|
30
|
+
});
|
|
22
31
|
// Import for mocking
|
|
23
32
|
const tambo_client_provider_1 = require("../../providers/tambo-client-provider");
|
|
24
33
|
describe("TamboV1StreamProvider", () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tambo-v1-stream-context.test.js","sourceRoot":"","sources":["../../../src/v1/providers/tambo-v1-stream-context.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import { EventType, type RunStartedEvent } from \"@ag-ui/core\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { renderHook, act } from \"@testing-library/react\";\nimport React from \"react\";\nimport {\n TamboV1StreamProvider,\n useStreamState,\n useStreamDispatch,\n useThreadManagement,\n} from \"./tambo-v1-stream-context\";\n\n// Mock useTamboClient and useTamboQueryClient to avoid TamboClientProvider dependency\njest.mock(\"../../providers/tambo-client-provider\", () => ({\n useTamboClient: jest.fn(() => ({\n threads: {\n messages: {\n list: jest.fn().mockResolvedValue({ messages: [], hasMore: false }),\n },\n },\n })),\n useTamboQueryClient: jest.fn(),\n}));\n\n// Import for mocking\nimport { useTamboQueryClient } from \"../../providers/tambo-client-provider\";\n\ndescribe(\"TamboV1StreamProvider\", () => {\n let queryClient: QueryClient;\n\n beforeEach(() => {\n queryClient = new QueryClient({\n defaultOptions: {\n queries: { retry: false },\n },\n });\n // Configure mock to return the test's queryClient\n jest.mocked(useTamboQueryClient).mockReturnValue(queryClient);\n });\n\n const createWrapper = () => {\n return function Wrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n </QueryClientProvider>\n );\n };\n };\n describe(\"useStreamState\", () => {\n it(\"throws when used outside provider\", () => {\n // Suppress console.error for expected error\n const consoleSpy = jest\n .spyOn(console, \"error\")\n .mockImplementation(() => {});\n\n expect(() => {\n renderHook(() => useStreamState());\n }).toThrow(\"useStreamState must be used within TamboV1StreamProvider\");\n\n consoleSpy.mockRestore();\n });\n\n it(\"returns initial state with placeholder thread ready for new messages\", () => {\n const { result } = renderHook(() => useStreamState(), {\n wrapper: createWrapper(),\n });\n\n // Initial state should have placeholder thread ready for optimistic UI\n expect(result.current.currentThreadId).toBe(\"placeholder\");\n expect(result.current.threadMap.placeholder).toBeDefined();\n expect(result.current.threadMap.placeholder.thread.id).toBe(\n \"placeholder\",\n );\n expect(result.current.threadMap.placeholder.thread.messages).toEqual([]);\n expect(result.current.threadMap.placeholder.streaming.status).toBe(\n \"idle\",\n );\n });\n\n it(\"initializes thread via dispatch\", () => {\n const { result } = renderHook(\n () => ({\n state: useStreamState(),\n dispatch: useStreamDispatch(),\n }),\n { wrapper: createWrapper() },\n );\n\n act(() => {\n result.current.dispatch({\n type: \"INIT_THREAD\",\n threadId: \"thread_123\",\n });\n });\n\n expect(result.current.state.threadMap.thread_123).toBeDefined();\n expect(result.current.state.threadMap.thread_123.thread.id).toBe(\n \"thread_123\",\n );\n expect(result.current.state.threadMap.thread_123.thread.status).toBe(\n \"idle\",\n );\n expect(result.current.state.threadMap.thread_123.thread.messages).toEqual(\n [],\n );\n });\n\n it(\"initializes thread with initial data via dispatch\", () => {\n const { result } = renderHook(\n () => ({\n state: useStreamState(),\n dispatch: useStreamDispatch(),\n }),\n { wrapper: createWrapper() },\n );\n\n act(() => {\n result.current.dispatch({\n type: \"INIT_THREAD\",\n threadId: \"thread_123\",\n initialThread: {\n title: \"Test Thread\",\n metadata: { key: \"value\" },\n },\n });\n });\n\n expect(result.current.state.threadMap.thread_123.thread.title).toBe(\n \"Test Thread\",\n );\n expect(result.current.state.threadMap.thread_123.thread.metadata).toEqual(\n {\n key: \"value\",\n },\n );\n // Default values should still be set\n expect(result.current.state.threadMap.thread_123.thread.status).toBe(\n \"idle\",\n );\n });\n });\n\n describe(\"useStreamDispatch\", () => {\n it(\"throws when used outside provider\", () => {\n const consoleSpy = jest\n .spyOn(console, \"error\")\n .mockImplementation(() => {});\n\n expect(() => {\n renderHook(() => useStreamDispatch());\n }).toThrow(\"useStreamDispatch must be used within TamboV1StreamProvider\");\n\n consoleSpy.mockRestore();\n });\n\n it(\"dispatches events to update state\", () => {\n const { result } = renderHook(\n () => ({\n state: useStreamState(),\n dispatch: useStreamDispatch(),\n }),\n { wrapper: createWrapper() },\n );\n\n // Initialize the thread first\n act(() => {\n result.current.dispatch({\n type: \"INIT_THREAD\",\n threadId: \"thread_123\",\n });\n });\n\n const runStartedEvent: RunStartedEvent = {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId: \"thread_123\",\n };\n\n act(() => {\n result.current.dispatch({\n type: \"EVENT\",\n event: runStartedEvent,\n threadId: \"thread_123\",\n });\n });\n\n expect(result.current.state.threadMap.thread_123.thread.status).toBe(\n \"streaming\",\n );\n expect(result.current.state.threadMap.thread_123.streaming.status).toBe(\n \"streaming\",\n );\n expect(result.current.state.threadMap.thread_123.streaming.runId).toBe(\n \"run_1\",\n );\n });\n });\n\n describe(\"useThreadManagement\", () => {\n it(\"throws when used outside provider\", () => {\n const consoleSpy = jest\n .spyOn(console, \"error\")\n .mockImplementation(() => {});\n\n expect(() => {\n renderHook(() => useThreadManagement());\n }).toThrow(\n \"useThreadManagement must be used within TamboV1StreamProvider\",\n );\n\n consoleSpy.mockRestore();\n });\n\n it(\"initThread creates a new thread\", () => {\n const { result } = renderHook(\n () => ({\n state: useStreamState(),\n management: useThreadManagement(),\n }),\n { wrapper: createWrapper() },\n );\n\n act(() => {\n result.current.management.initThread(\"thread_456\");\n });\n\n expect(result.current.state.threadMap.thread_456).toBeDefined();\n expect(result.current.state.threadMap.thread_456.thread.id).toBe(\n \"thread_456\",\n );\n });\n\n it(\"switchThread changes currentThreadId\", () => {\n const { result } = renderHook(\n () => ({\n state: useStreamState(),\n management: useThreadManagement(),\n }),\n { wrapper: createWrapper() },\n );\n\n // Initialize and switch to a thread\n act(() => {\n result.current.management.initThread(\"thread_789\");\n result.current.management.switchThread(\"thread_789\");\n });\n\n expect(result.current.state.currentThreadId).toBe(\"thread_789\");\n });\n\n it(\"startNewThread creates temp thread and switches to it\", () => {\n const { result } = renderHook(\n () => ({\n state: useStreamState(),\n management: useThreadManagement(),\n }),\n { wrapper: createWrapper() },\n );\n\n let tempId: string;\n act(() => {\n tempId = result.current.management.startNewThread();\n });\n\n expect(tempId!).toBe(\"placeholder\");\n expect(result.current.state.currentThreadId).toBe(\"placeholder\");\n expect(result.current.state.threadMap.placeholder).toBeDefined();\n });\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"tambo-v1-stream-context.test.js","sourceRoot":"","sources":["../../../src/v1/providers/tambo-v1-stream-context.test.tsx"],"names":[],"mappings":";;;;;AAAA,sCAA8D;AAC9D,uDAAyE;AACzE,kDAAyD;AACzD,kDAA0B;AAC1B,uEAKmC;AAEnC,sFAAsF;AACtF,IAAI,CAAC,IAAI,CAAC,uCAAuC,EAAE,GAAG,EAAE,CAAC,CAAC;IACxD,cAAc,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;QAC7B,OAAO,EAAE;YACP,QAAQ,EAAE;gBACR,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;aACpE;YACD,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;SAC1C;KACF,CAAC,CAAC;IACH,mBAAmB,EAAE,IAAI,CAAC,EAAE,EAAE;CAC/B,CAAC,CAAC,CAAC;AAEJ,4DAA4D;AAC5D,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACpC,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC,CAAC;IACzD,OAAO;QACL,GAAG,MAAM;QACT,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;KACjD,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,qBAAqB;AACrB,iFAA4E;AAE5E,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,IAAI,WAAwB,CAAC;IAE7B,UAAU,CAAC,GAAG,EAAE;QACd,WAAW,GAAG,IAAI,yBAAW,CAAC;YAC5B,cAAc,EAAE;gBACd,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;aAC1B;SACF,CAAC,CAAC;QACH,kDAAkD;QAClD,IAAI,CAAC,MAAM,CAAC,2CAAmB,CAAC,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,GAAG,EAAE;QACzB,OAAO,SAAS,OAAO,CAAC,EAAE,QAAQ,EAAiC;YACjE,OAAO,CACL,8BAAC,iCAAmB,IAAC,MAAM,EAAE,WAAW;gBACtC,8BAAC,+CAAqB,QAAE,QAAQ,CAAyB,CACrC,CACvB,CAAC;QACJ,CAAC,CAAC;IACJ,CAAC,CAAC;IACF,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,4CAA4C;YAC5C,MAAM,UAAU,GAAG,IAAI;iBACpB,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC;iBACvB,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAEhC,MAAM,CAAC,GAAG,EAAE;gBACV,IAAA,kBAAU,EAAC,GAAG,EAAE,CAAC,IAAA,wCAAc,GAAE,CAAC,CAAC;YACrC,CAAC,CAAC,CAAC,OAAO,CAAC,0DAA0D,CAAC,CAAC;YAEvE,UAAU,CAAC,WAAW,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;YAC9E,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,kBAAU,EAAC,GAAG,EAAE,CAAC,IAAA,wCAAc,GAAE,EAAE;gBACpD,OAAO,EAAE,aAAa,EAAE;aACzB,CAAC,CAAC;YAEH,uEAAuE;YACvE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC3D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC;YAC3D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CACzD,aAAa,CACd,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACzE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAChE,MAAM,CACP,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,kBAAU,EAC3B,GAAG,EAAE,CAAC,CAAC;gBACL,KAAK,EAAE,IAAA,wCAAc,GAAE;gBACvB,QAAQ,EAAE,IAAA,2CAAiB,GAAE;aAC9B,CAAC,EACF,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,CAC7B,CAAC;YAEF,IAAA,WAAG,EAAC,GAAG,EAAE;gBACP,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;oBACtB,IAAI,EAAE,aAAa;oBACnB,QAAQ,EAAE,YAAY;iBACvB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;YAChE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAC9D,YAAY,CACb,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAClE,MAAM,CACP,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CACvE,EAAE,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,kBAAU,EAC3B,GAAG,EAAE,CAAC,CAAC;gBACL,KAAK,EAAE,IAAA,wCAAc,GAAE;gBACvB,QAAQ,EAAE,IAAA,2CAAiB,GAAE;aAC9B,CAAC,EACF,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,CAC7B,CAAC;YAEF,IAAA,WAAG,EAAC,GAAG,EAAE;gBACP,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;oBACtB,IAAI,EAAE,aAAa;oBACnB,QAAQ,EAAE,YAAY;oBACtB,aAAa,EAAE;wBACb,KAAK,EAAE,aAAa;wBACpB,QAAQ,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE;qBAC3B;iBACF,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CACjE,aAAa,CACd,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CACvE;gBACE,GAAG,EAAE,OAAO;aACb,CACF,CAAC;YACF,qCAAqC;YACrC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAClE,MAAM,CACP,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,UAAU,GAAG,IAAI;iBACpB,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC;iBACvB,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAEhC,MAAM,CAAC,GAAG,EAAE;gBACV,IAAA,kBAAU,EAAC,GAAG,EAAE,CAAC,IAAA,2CAAiB,GAAE,CAAC,CAAC;YACxC,CAAC,CAAC,CAAC,OAAO,CAAC,6DAA6D,CAAC,CAAC;YAE1E,UAAU,CAAC,WAAW,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,kBAAU,EAC3B,GAAG,EAAE,CAAC,CAAC;gBACL,KAAK,EAAE,IAAA,wCAAc,GAAE;gBACvB,QAAQ,EAAE,IAAA,2CAAiB,GAAE;aAC9B,CAAC,EACF,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,CAC7B,CAAC;YAEF,8BAA8B;YAC9B,IAAA,WAAG,EAAC,GAAG,EAAE;gBACP,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;oBACtB,IAAI,EAAE,aAAa;oBACnB,QAAQ,EAAE,YAAY;iBACvB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,MAAM,eAAe,GAAoB;gBACvC,IAAI,EAAE,gBAAS,CAAC,WAAW;gBAC3B,KAAK,EAAE,OAAO;gBACd,QAAQ,EAAE,YAAY;aACvB,CAAC;YAEF,IAAA,WAAG,EAAC,GAAG,EAAE;gBACP,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;oBACtB,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,eAAe;oBACtB,QAAQ,EAAE,YAAY;iBACvB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAClE,WAAW,CACZ,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CACrE,WAAW,CACZ,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CACpE,OAAO,CACR,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,UAAU,GAAG,IAAI;iBACpB,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC;iBACvB,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAEhC,MAAM,CAAC,GAAG,EAAE;gBACV,IAAA,kBAAU,EAAC,GAAG,EAAE,CAAC,IAAA,6CAAmB,GAAE,CAAC,CAAC;YAC1C,CAAC,CAAC,CAAC,OAAO,CACR,+DAA+D,CAChE,CAAC;YAEF,UAAU,CAAC,WAAW,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,kBAAU,EAC3B,GAAG,EAAE,CAAC,CAAC;gBACL,KAAK,EAAE,IAAA,wCAAc,GAAE;gBACvB,UAAU,EAAE,IAAA,6CAAmB,GAAE;aAClC,CAAC,EACF,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,CAC7B,CAAC;YAEF,IAAA,WAAG,EAAC,GAAG,EAAE;gBACP,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;YACrD,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;YAChE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAC9D,YAAY,CACb,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,kBAAU,EAC3B,GAAG,EAAE,CAAC,CAAC;gBACL,KAAK,EAAE,IAAA,wCAAc,GAAE;gBACvB,UAAU,EAAE,IAAA,6CAAmB,GAAE;aAClC,CAAC,EACF,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,CAC7B,CAAC;YAEF,oCAAoC;YACpC,IAAA,WAAG,EAAC,GAAG,EAAE;gBACP,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;gBACnD,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;YACvD,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;YAC/D,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,kBAAU,EAC3B,GAAG,EAAE,CAAC,CAAC;gBACL,KAAK,EAAE,IAAA,wCAAc,GAAE;gBACvB,UAAU,EAAE,IAAA,6CAAmB,GAAE;aAClC,CAAC,EACF,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,CAC7B,CAAC;YAEF,IAAI,MAAc,CAAC;YACnB,IAAA,WAAG,EAAC,GAAG,EAAE;gBACP,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC;YACtD,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,MAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACjE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC;QACnE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { EventType, type RunStartedEvent } from \"@ag-ui/core\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { renderHook, act } from \"@testing-library/react\";\nimport React from \"react\";\nimport {\n TamboV1StreamProvider,\n useStreamState,\n useStreamDispatch,\n useThreadManagement,\n} from \"./tambo-v1-stream-context\";\n\n// Mock useTamboClient and useTamboQueryClient to avoid TamboClientProvider dependency\njest.mock(\"../../providers/tambo-client-provider\", () => ({\n useTamboClient: jest.fn(() => ({\n threads: {\n messages: {\n list: jest.fn().mockResolvedValue({ messages: [], hasMore: false }),\n },\n retrieve: jest.fn().mockResolvedValue({}),\n },\n })),\n useTamboQueryClient: jest.fn(),\n}));\n\n// Mock useTamboV1Config to avoid TamboV1Provider dependency\njest.mock(\"./tambo-v1-provider\", () => {\n const actual = jest.requireActual(\"./tambo-v1-provider\");\n return {\n ...actual,\n useTamboV1Config: () => ({ userKey: undefined }),\n };\n});\n\n// Import for mocking\nimport { useTamboQueryClient } from \"../../providers/tambo-client-provider\";\n\ndescribe(\"TamboV1StreamProvider\", () => {\n let queryClient: QueryClient;\n\n beforeEach(() => {\n queryClient = new QueryClient({\n defaultOptions: {\n queries: { retry: false },\n },\n });\n // Configure mock to return the test's queryClient\n jest.mocked(useTamboQueryClient).mockReturnValue(queryClient);\n });\n\n const createWrapper = () => {\n return function Wrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n </QueryClientProvider>\n );\n };\n };\n describe(\"useStreamState\", () => {\n it(\"throws when used outside provider\", () => {\n // Suppress console.error for expected error\n const consoleSpy = jest\n .spyOn(console, \"error\")\n .mockImplementation(() => {});\n\n expect(() => {\n renderHook(() => useStreamState());\n }).toThrow(\"useStreamState must be used within TamboV1StreamProvider\");\n\n consoleSpy.mockRestore();\n });\n\n it(\"returns initial state with placeholder thread ready for new messages\", () => {\n const { result } = renderHook(() => useStreamState(), {\n wrapper: createWrapper(),\n });\n\n // Initial state should have placeholder thread ready for optimistic UI\n expect(result.current.currentThreadId).toBe(\"placeholder\");\n expect(result.current.threadMap.placeholder).toBeDefined();\n expect(result.current.threadMap.placeholder.thread.id).toBe(\n \"placeholder\",\n );\n expect(result.current.threadMap.placeholder.thread.messages).toEqual([]);\n expect(result.current.threadMap.placeholder.streaming.status).toBe(\n \"idle\",\n );\n });\n\n it(\"initializes thread via dispatch\", () => {\n const { result } = renderHook(\n () => ({\n state: useStreamState(),\n dispatch: useStreamDispatch(),\n }),\n { wrapper: createWrapper() },\n );\n\n act(() => {\n result.current.dispatch({\n type: \"INIT_THREAD\",\n threadId: \"thread_123\",\n });\n });\n\n expect(result.current.state.threadMap.thread_123).toBeDefined();\n expect(result.current.state.threadMap.thread_123.thread.id).toBe(\n \"thread_123\",\n );\n expect(result.current.state.threadMap.thread_123.thread.status).toBe(\n \"idle\",\n );\n expect(result.current.state.threadMap.thread_123.thread.messages).toEqual(\n [],\n );\n });\n\n it(\"initializes thread with initial data via dispatch\", () => {\n const { result } = renderHook(\n () => ({\n state: useStreamState(),\n dispatch: useStreamDispatch(),\n }),\n { wrapper: createWrapper() },\n );\n\n act(() => {\n result.current.dispatch({\n type: \"INIT_THREAD\",\n threadId: \"thread_123\",\n initialThread: {\n title: \"Test Thread\",\n metadata: { key: \"value\" },\n },\n });\n });\n\n expect(result.current.state.threadMap.thread_123.thread.title).toBe(\n \"Test Thread\",\n );\n expect(result.current.state.threadMap.thread_123.thread.metadata).toEqual(\n {\n key: \"value\",\n },\n );\n // Default values should still be set\n expect(result.current.state.threadMap.thread_123.thread.status).toBe(\n \"idle\",\n );\n });\n });\n\n describe(\"useStreamDispatch\", () => {\n it(\"throws when used outside provider\", () => {\n const consoleSpy = jest\n .spyOn(console, \"error\")\n .mockImplementation(() => {});\n\n expect(() => {\n renderHook(() => useStreamDispatch());\n }).toThrow(\"useStreamDispatch must be used within TamboV1StreamProvider\");\n\n consoleSpy.mockRestore();\n });\n\n it(\"dispatches events to update state\", () => {\n const { result } = renderHook(\n () => ({\n state: useStreamState(),\n dispatch: useStreamDispatch(),\n }),\n { wrapper: createWrapper() },\n );\n\n // Initialize the thread first\n act(() => {\n result.current.dispatch({\n type: \"INIT_THREAD\",\n threadId: \"thread_123\",\n });\n });\n\n const runStartedEvent: RunStartedEvent = {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId: \"thread_123\",\n };\n\n act(() => {\n result.current.dispatch({\n type: \"EVENT\",\n event: runStartedEvent,\n threadId: \"thread_123\",\n });\n });\n\n expect(result.current.state.threadMap.thread_123.thread.status).toBe(\n \"streaming\",\n );\n expect(result.current.state.threadMap.thread_123.streaming.status).toBe(\n \"streaming\",\n );\n expect(result.current.state.threadMap.thread_123.streaming.runId).toBe(\n \"run_1\",\n );\n });\n });\n\n describe(\"useThreadManagement\", () => {\n it(\"throws when used outside provider\", () => {\n const consoleSpy = jest\n .spyOn(console, \"error\")\n .mockImplementation(() => {});\n\n expect(() => {\n renderHook(() => useThreadManagement());\n }).toThrow(\n \"useThreadManagement must be used within TamboV1StreamProvider\",\n );\n\n consoleSpy.mockRestore();\n });\n\n it(\"initThread creates a new thread\", () => {\n const { result } = renderHook(\n () => ({\n state: useStreamState(),\n management: useThreadManagement(),\n }),\n { wrapper: createWrapper() },\n );\n\n act(() => {\n result.current.management.initThread(\"thread_456\");\n });\n\n expect(result.current.state.threadMap.thread_456).toBeDefined();\n expect(result.current.state.threadMap.thread_456.thread.id).toBe(\n \"thread_456\",\n );\n });\n\n it(\"switchThread changes currentThreadId\", () => {\n const { result } = renderHook(\n () => ({\n state: useStreamState(),\n management: useThreadManagement(),\n }),\n { wrapper: createWrapper() },\n );\n\n // Initialize and switch to a thread\n act(() => {\n result.current.management.initThread(\"thread_789\");\n result.current.management.switchThread(\"thread_789\");\n });\n\n expect(result.current.state.currentThreadId).toBe(\"thread_789\");\n });\n\n it(\"startNewThread creates temp thread and switches to it\", () => {\n const { result } = renderHook(\n () => ({\n state: useStreamState(),\n management: useThreadManagement(),\n }),\n { wrapper: createWrapper() },\n );\n\n let tempId: string;\n act(() => {\n tempId = result.current.management.startNewThread();\n });\n\n expect(tempId!).toBe(\"placeholder\");\n expect(result.current.state.currentThreadId).toBe(\"placeholder\");\n expect(result.current.state.threadMap.placeholder).toBeDefined();\n });\n });\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tambo-v1-stub-provider.d.ts","sourceRoot":"","sources":["../../../src/v1/providers/tambo-v1-stub-provider.tsx"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAE,EAAW,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAC/D,OAAO,KAAK,EACV,cAAc,EACd,SAAS,EAEV,MAAM,gCAAgC,CAAC;AAGxC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAgBrD;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC;;;OAGG;IACH,MAAM,CAAC,EAAE,aAAa,GAAG;QAAE,QAAQ,EAAE,cAAc,EAAE,CAAA;KAAE,CAAC;IAExD;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC;IAE9B;;OAEG;IACH,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;IAEpB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAE/C;;OAEG;IACH,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC,KAAK,IAAI,CAAC;IAElE;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,MAAM,CAAC;IAEhC;;OAEG;IACH,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAEnD;;OAEG;IACH,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3C;AAmCD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,QAAQ,EACR,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,gBAAgB,EAC1B,UAAe,EACf,KAAU,EACV,OAAO,EACP,UAAU,EAAE,iBAAsB,EAClC,WAAmB,EACnB,QAAQ,EACR,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,YAAY,GACb,EAAE,iBAAiB,CAAC,wBAAwB,CAAC,
|
|
1
|
+
{"version":3,"file":"tambo-v1-stub-provider.d.ts","sourceRoot":"","sources":["../../../src/v1/providers/tambo-v1-stub-provider.tsx"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAE,EAAW,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAC/D,OAAO,KAAK,EACV,cAAc,EACd,SAAS,EAEV,MAAM,gCAAgC,CAAC;AAGxC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAgBrD;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC;;;OAGG;IACH,MAAM,CAAC,EAAE,aAAa,GAAG;QAAE,QAAQ,EAAE,cAAc,EAAE,CAAA;KAAE,CAAC;IAExD;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC;IAE9B;;OAEG;IACH,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;IAEpB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAE/C;;OAEG;IACH,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC,KAAK,IAAI,CAAC;IAElE;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,MAAM,CAAC;IAEhC;;OAEG;IACH,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAEnD;;OAEG;IACH,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3C;AAmCD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,QAAQ,EACR,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,gBAAgB,EAC1B,UAAe,EACf,KAAU,EACV,OAAO,EACP,UAAU,EAAE,iBAAsB,EAClC,WAAmB,EACnB,QAAQ,EACR,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,YAAY,GACb,EAAE,iBAAiB,CAAC,wBAAwB,CAAC,qBA4L7C"}
|
|
@@ -177,6 +177,7 @@ function TamboV1StubProvider({ children, thread: threadData, threadId: providedT
|
|
|
177
177
|
context: undefined,
|
|
178
178
|
submittedAt: 0,
|
|
179
179
|
isPaused: false,
|
|
180
|
+
isDisabled: false,
|
|
180
181
|
};
|
|
181
182
|
}, [inputValue, threadId, onSubmit, onSetValue, setInputValueInternal]);
|
|
182
183
|
// Registry context
|
|
@@ -203,6 +204,9 @@ function TamboV1StubProvider({ children, thread: threadData, threadId: providedT
|
|
|
203
204
|
client: stubClient,
|
|
204
205
|
queryClient,
|
|
205
206
|
isUpdatingToken: false,
|
|
207
|
+
tokenExchangeError: null,
|
|
208
|
+
userToken: undefined,
|
|
209
|
+
hasValidToken: false,
|
|
206
210
|
}), [stubClient, queryClient]);
|
|
207
211
|
return (react_1.default.createElement(react_query_1.QueryClientProvider, { client: queryClient },
|
|
208
212
|
react_1.default.createElement(tambo_client_provider_1.TamboClientContext.Provider, { value: clientContext },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tambo-v1-stub-provider.js","sourceRoot":"","sources":["../../../src/v1/providers/tambo-v1-stub-provider.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\n/**\n * TamboV1StubProvider - Mock Provider for Testing\n *\n * Provides stubbed versions of all v1 contexts for testing components\n * that use Tambo hooks without making real API calls.\n * @example\n * ```tsx\n * const mockThread = {\n * id: \"thread_123\",\n * messages: [\n * { id: \"msg_1\", role: \"user\", content: [{ type: \"text\", text: \"Hello\" }], createdAt: \"...\" },\n * { id: \"msg_2\", role: \"assistant\", content: [{ type: \"text\", text: \"Hi!\" }], createdAt: \"...\" },\n * ],\n * status: \"idle\",\n * createdAt: \"2024-01-01T00:00:00Z\",\n * updatedAt: \"2024-01-01T00:00:00Z\",\n * };\n *\n * function TestComponent() {\n * return (\n * <TamboV1StubProvider thread={mockThread}>\n * <MyComponent />\n * </TamboV1StubProvider>\n * );\n * }\n * ```\n */\n\nimport TamboAI from \"@tambo-ai/typescript-sdk\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport React, { useMemo, type PropsWithChildren } from \"react\";\nimport type {\n TamboComponent,\n TamboTool,\n TamboToolRegistry,\n} from \"../../model/component-metadata\";\nimport { TamboClientContext } from \"../../providers/tambo-client-provider\";\nimport { TamboRegistryContext } from \"../../providers/tambo-registry-provider\";\nimport type { TamboV1Message } from \"../types/message\";\nimport type { TamboV1Thread } from \"../types/thread\";\nimport type {\n StreamAction,\n StreamState,\n ThreadState,\n} from \"../utils/event-accumulator\";\nimport { TamboV1ConfigContext, type TamboV1Config } from \"./tambo-v1-provider\";\nimport {\n TamboV1StreamProvider,\n type ThreadManagement,\n} from \"./tambo-v1-stream-context\";\nimport {\n TamboV1ThreadInputContext,\n type TamboV1ThreadInputContextProps,\n} from \"./tambo-v1-thread-input-provider\";\n\n/**\n * Props for TamboV1StubProvider\n */\nexport interface TamboV1StubProviderProps {\n /**\n * Thread data to display.\n * Can be a full TamboV1Thread or just an array of messages.\n */\n thread?: TamboV1Thread | { messages: TamboV1Message[] };\n\n /**\n * Optional thread ID. Defaults to \"stub_thread\" or thread.id if provided.\n */\n threadId?: string;\n\n /**\n * Components to register with the registry.\n */\n components?: TamboComponent[];\n\n /**\n * Tools to register with the registry.\n */\n tools?: TamboTool[];\n\n /**\n * User key for the config context.\n */\n userKey?: string;\n\n /**\n * Initial input value for the thread input context.\n */\n inputValue?: string;\n\n /**\n * Whether the thread is currently streaming.\n */\n isStreaming?: boolean;\n\n /**\n * Override for the submit function.\n * If not provided, submit will be a no-op that returns the threadId.\n */\n onSubmit?: () => Promise<{ threadId: string }>;\n\n /**\n * Override for the setValue function.\n */\n onSetValue?: (value: string | ((prev: string) => string)) => void;\n\n /**\n * Override for startNewThread.\n */\n onStartNewThread?: () => string;\n\n /**\n * Override for switchThread.\n */\n onSwitchThread?: (threadId: string | null) => void;\n\n /**\n * Override for initThread.\n */\n onInitThread?: (threadId: string) => void;\n}\n\n/**\n * Creates a default TamboV1Thread from messages or returns the full thread.\n * @returns A normalized thread object\n */\nfunction normalizeThread(\n threadData: TamboV1Thread | { messages: TamboV1Message[] } | undefined,\n threadId: string,\n): TamboV1Thread {\n if (!threadData) {\n return {\n id: threadId,\n messages: [],\n status: \"idle\",\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n lastRunCancelled: false,\n };\n }\n\n if (\"id\" in threadData && \"status\" in threadData) {\n return threadData;\n }\n\n return {\n id: threadId,\n messages: threadData.messages,\n status: \"idle\",\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n lastRunCancelled: false,\n };\n}\n\n/**\n * TamboV1StubProvider provides mock implementations of all v1 contexts\n * for testing components that use Tambo hooks.\n *\n * All operations are no-ops by default, returning stub data.\n * Override specific behaviors via props as needed for testing.\n * Stream state is derived once from props and is not updated by thread management.\n * @returns A provider wrapper suitable for tests\n */\nexport function TamboV1StubProvider({\n children,\n thread: threadData,\n threadId: providedThreadId,\n components = [],\n tools = [],\n userKey,\n inputValue: initialInputValue = \"\",\n isStreaming = false,\n onSubmit,\n onSetValue,\n onStartNewThread,\n onSwitchThread,\n onInitThread,\n}: PropsWithChildren<TamboV1StubProviderProps>) {\n // Determine thread ID\n const threadId =\n providedThreadId ??\n (threadData && \"id\" in threadData ? threadData.id : \"stub_thread\");\n\n // Normalize thread data\n const thread = normalizeThread(threadData, threadId);\n\n // Create stub QueryClient\n const queryClient = useMemo(\n () =>\n new QueryClient({\n defaultOptions: {\n queries: { retry: false },\n mutations: { retry: false },\n },\n }),\n [],\n );\n\n // Create stub client\n const stubClient = useMemo(() => ({}) as TamboAI, []);\n\n // Build component registry\n const componentList = useMemo(() => {\n const list: TamboRegistryContext[\"componentList\"] = {};\n\n for (const component of components) {\n list[component.name] = {\n component: component.component,\n loadingComponent: component.loadingComponent,\n name: component.name,\n description: component.description,\n props: component.propsDefinition ?? {},\n contextTools: [],\n };\n }\n\n return list;\n }, [components]);\n\n // Build tool registry\n const toolRegistry = useMemo(() => {\n return tools.reduce((acc, tool) => {\n acc[tool.name] = tool;\n return acc;\n }, {} as TamboToolRegistry);\n }, [tools]);\n\n // Stream state\n const streamState = useMemo<StreamState>(() => {\n const threadState: ThreadState = {\n thread,\n streaming: {\n status: isStreaming ? \"streaming\" : \"idle\",\n },\n accumulatingToolArgs: new Map(),\n };\n\n return {\n threadMap: { [threadId]: threadState },\n currentThreadId: threadId,\n };\n }, [thread, threadId, isStreaming]);\n\n // Stream dispatch (no-op)\n const streamDispatch = useMemo<React.Dispatch<StreamAction>>(\n () => () => {},\n [],\n );\n\n // Thread management\n const threadManagement = useMemo<ThreadManagement>(\n () => ({\n initThread: onInitThread ?? (() => {}),\n switchThread: onSwitchThread ?? (() => {}),\n startNewThread:\n onStartNewThread ??\n (() => {\n const newId = `stub_${crypto.randomUUID()}`;\n return newId;\n }),\n }),\n [onInitThread, onSwitchThread, onStartNewThread],\n );\n\n // Config context\n const config = useMemo<TamboV1Config>(() => ({ userKey }), [userKey]);\n\n // Input state (managed internally for stub)\n const [inputValue, setInputValueInternal] = React.useState(initialInputValue);\n\n // Thread input context\n const threadInputContext = useMemo<TamboV1ThreadInputContextProps>(() => {\n const setValue: React.Dispatch<React.SetStateAction<string>> =\n onSetValue ?? setInputValueInternal;\n\n const submit: TamboV1ThreadInputContextProps[\"submit\"] =\n onSubmit ??\n (async () => {\n return { threadId };\n });\n\n return {\n value: inputValue,\n setValue,\n submit,\n threadId,\n setThreadId: () => {},\n images: [],\n addImage: async () => {},\n addImages: async () => {},\n removeImage: () => {},\n clearImages: () => {},\n isPending: false,\n isError: false,\n error: null,\n isIdle: true,\n isSuccess: false,\n status: \"idle\",\n data: undefined,\n variables: undefined,\n failureCount: 0,\n failureReason: null,\n reset: () => {},\n context: undefined,\n submittedAt: 0,\n isPaused: false,\n };\n }, [inputValue, threadId, onSubmit, onSetValue, setInputValueInternal]);\n\n // Registry context\n const registryContext = useMemo<TamboRegistryContext>(\n () => ({\n componentList,\n toolRegistry,\n componentToolAssociations: {},\n mcpServerInfos: [],\n resources: [],\n resourceSource: null,\n onCallUnregisteredTool: undefined,\n registerComponent: () => {},\n registerTool: () => {},\n registerTools: () => {},\n addToolAssociation: () => {},\n registerMcpServer: () => {},\n registerMcpServers: () => {},\n registerResource: () => {},\n registerResources: () => {},\n registerResourceSource: () => {},\n }),\n [componentList, toolRegistry],\n );\n\n // Client context\n const clientContext = useMemo(\n () => ({\n client: stubClient,\n queryClient,\n isUpdatingToken: false,\n }),\n [stubClient, queryClient],\n );\n\n return (\n <QueryClientProvider client={queryClient}>\n <TamboClientContext.Provider value={clientContext}>\n <TamboRegistryContext.Provider value={registryContext}>\n <TamboV1ConfigContext.Provider value={config}>\n <TamboV1StreamProvider\n state={streamState}\n dispatch={streamDispatch}\n threadManagement={threadManagement}\n >\n <TamboV1ThreadInputContext.Provider value={threadInputContext}>\n {children}\n </TamboV1ThreadInputContext.Provider>\n </TamboV1StreamProvider>\n </TamboV1ConfigContext.Provider>\n </TamboRegistryContext.Provider>\n </TamboClientContext.Provider>\n </QueryClientProvider>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tambo-v1-stub-provider.js","sourceRoot":"","sources":["../../../src/v1/providers/tambo-v1-stub-provider.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\n/**\n * TamboV1StubProvider - Mock Provider for Testing\n *\n * Provides stubbed versions of all v1 contexts for testing components\n * that use Tambo hooks without making real API calls.\n * @example\n * ```tsx\n * const mockThread = {\n * id: \"thread_123\",\n * messages: [\n * { id: \"msg_1\", role: \"user\", content: [{ type: \"text\", text: \"Hello\" }], createdAt: \"...\" },\n * { id: \"msg_2\", role: \"assistant\", content: [{ type: \"text\", text: \"Hi!\" }], createdAt: \"...\" },\n * ],\n * status: \"idle\",\n * createdAt: \"2024-01-01T00:00:00Z\",\n * updatedAt: \"2024-01-01T00:00:00Z\",\n * };\n *\n * function TestComponent() {\n * return (\n * <TamboV1StubProvider thread={mockThread}>\n * <MyComponent />\n * </TamboV1StubProvider>\n * );\n * }\n * ```\n */\n\nimport TamboAI from \"@tambo-ai/typescript-sdk\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport React, { useMemo, type PropsWithChildren } from \"react\";\nimport type {\n TamboComponent,\n TamboTool,\n TamboToolRegistry,\n} from \"../../model/component-metadata\";\nimport { TamboClientContext } from \"../../providers/tambo-client-provider\";\nimport { TamboRegistryContext } from \"../../providers/tambo-registry-provider\";\nimport type { TamboV1Message } from \"../types/message\";\nimport type { TamboV1Thread } from \"../types/thread\";\nimport type {\n StreamAction,\n StreamState,\n ThreadState,\n} from \"../utils/event-accumulator\";\nimport { TamboV1ConfigContext, type TamboV1Config } from \"./tambo-v1-provider\";\nimport {\n TamboV1StreamProvider,\n type ThreadManagement,\n} from \"./tambo-v1-stream-context\";\nimport {\n TamboV1ThreadInputContext,\n type TamboV1ThreadInputContextProps,\n} from \"./tambo-v1-thread-input-provider\";\n\n/**\n * Props for TamboV1StubProvider\n */\nexport interface TamboV1StubProviderProps {\n /**\n * Thread data to display.\n * Can be a full TamboV1Thread or just an array of messages.\n */\n thread?: TamboV1Thread | { messages: TamboV1Message[] };\n\n /**\n * Optional thread ID. Defaults to \"stub_thread\" or thread.id if provided.\n */\n threadId?: string;\n\n /**\n * Components to register with the registry.\n */\n components?: TamboComponent[];\n\n /**\n * Tools to register with the registry.\n */\n tools?: TamboTool[];\n\n /**\n * User key for the config context.\n */\n userKey?: string;\n\n /**\n * Initial input value for the thread input context.\n */\n inputValue?: string;\n\n /**\n * Whether the thread is currently streaming.\n */\n isStreaming?: boolean;\n\n /**\n * Override for the submit function.\n * If not provided, submit will be a no-op that returns the threadId.\n */\n onSubmit?: () => Promise<{ threadId: string }>;\n\n /**\n * Override for the setValue function.\n */\n onSetValue?: (value: string | ((prev: string) => string)) => void;\n\n /**\n * Override for startNewThread.\n */\n onStartNewThread?: () => string;\n\n /**\n * Override for switchThread.\n */\n onSwitchThread?: (threadId: string | null) => void;\n\n /**\n * Override for initThread.\n */\n onInitThread?: (threadId: string) => void;\n}\n\n/**\n * Creates a default TamboV1Thread from messages or returns the full thread.\n * @returns A normalized thread object\n */\nfunction normalizeThread(\n threadData: TamboV1Thread | { messages: TamboV1Message[] } | undefined,\n threadId: string,\n): TamboV1Thread {\n if (!threadData) {\n return {\n id: threadId,\n messages: [],\n status: \"idle\",\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n lastRunCancelled: false,\n };\n }\n\n if (\"id\" in threadData && \"status\" in threadData) {\n return threadData;\n }\n\n return {\n id: threadId,\n messages: threadData.messages,\n status: \"idle\",\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n lastRunCancelled: false,\n };\n}\n\n/**\n * TamboV1StubProvider provides mock implementations of all v1 contexts\n * for testing components that use Tambo hooks.\n *\n * All operations are no-ops by default, returning stub data.\n * Override specific behaviors via props as needed for testing.\n * Stream state is derived once from props and is not updated by thread management.\n * @returns A provider wrapper suitable for tests\n */\nexport function TamboV1StubProvider({\n children,\n thread: threadData,\n threadId: providedThreadId,\n components = [],\n tools = [],\n userKey,\n inputValue: initialInputValue = \"\",\n isStreaming = false,\n onSubmit,\n onSetValue,\n onStartNewThread,\n onSwitchThread,\n onInitThread,\n}: PropsWithChildren<TamboV1StubProviderProps>) {\n // Determine thread ID\n const threadId =\n providedThreadId ??\n (threadData && \"id\" in threadData ? threadData.id : \"stub_thread\");\n\n // Normalize thread data\n const thread = normalizeThread(threadData, threadId);\n\n // Create stub QueryClient\n const queryClient = useMemo(\n () =>\n new QueryClient({\n defaultOptions: {\n queries: { retry: false },\n mutations: { retry: false },\n },\n }),\n [],\n );\n\n // Create stub client\n const stubClient = useMemo(() => ({}) as TamboAI, []);\n\n // Build component registry\n const componentList = useMemo(() => {\n const list: TamboRegistryContext[\"componentList\"] = {};\n\n for (const component of components) {\n list[component.name] = {\n component: component.component,\n loadingComponent: component.loadingComponent,\n name: component.name,\n description: component.description,\n props: component.propsDefinition ?? {},\n contextTools: [],\n };\n }\n\n return list;\n }, [components]);\n\n // Build tool registry\n const toolRegistry = useMemo(() => {\n return tools.reduce((acc, tool) => {\n acc[tool.name] = tool;\n return acc;\n }, {} as TamboToolRegistry);\n }, [tools]);\n\n // Stream state\n const streamState = useMemo<StreamState>(() => {\n const threadState: ThreadState = {\n thread,\n streaming: {\n status: isStreaming ? \"streaming\" : \"idle\",\n },\n accumulatingToolArgs: new Map(),\n };\n\n return {\n threadMap: { [threadId]: threadState },\n currentThreadId: threadId,\n };\n }, [thread, threadId, isStreaming]);\n\n // Stream dispatch (no-op)\n const streamDispatch = useMemo<React.Dispatch<StreamAction>>(\n () => () => {},\n [],\n );\n\n // Thread management\n const threadManagement = useMemo<ThreadManagement>(\n () => ({\n initThread: onInitThread ?? (() => {}),\n switchThread: onSwitchThread ?? (() => {}),\n startNewThread:\n onStartNewThread ??\n (() => {\n const newId = `stub_${crypto.randomUUID()}`;\n return newId;\n }),\n }),\n [onInitThread, onSwitchThread, onStartNewThread],\n );\n\n // Config context\n const config = useMemo<TamboV1Config>(() => ({ userKey }), [userKey]);\n\n // Input state (managed internally for stub)\n const [inputValue, setInputValueInternal] = React.useState(initialInputValue);\n\n // Thread input context\n const threadInputContext = useMemo<TamboV1ThreadInputContextProps>(() => {\n const setValue: React.Dispatch<React.SetStateAction<string>> =\n onSetValue ?? setInputValueInternal;\n\n const submit: TamboV1ThreadInputContextProps[\"submit\"] =\n onSubmit ??\n (async () => {\n return { threadId };\n });\n\n return {\n value: inputValue,\n setValue,\n submit,\n threadId,\n setThreadId: () => {},\n images: [],\n addImage: async () => {},\n addImages: async () => {},\n removeImage: () => {},\n clearImages: () => {},\n isPending: false,\n isError: false,\n error: null,\n isIdle: true,\n isSuccess: false,\n status: \"idle\",\n data: undefined,\n variables: undefined,\n failureCount: 0,\n failureReason: null,\n reset: () => {},\n context: undefined,\n submittedAt: 0,\n isPaused: false,\n isDisabled: false,\n };\n }, [inputValue, threadId, onSubmit, onSetValue, setInputValueInternal]);\n\n // Registry context\n const registryContext = useMemo<TamboRegistryContext>(\n () => ({\n componentList,\n toolRegistry,\n componentToolAssociations: {},\n mcpServerInfos: [],\n resources: [],\n resourceSource: null,\n onCallUnregisteredTool: undefined,\n registerComponent: () => {},\n registerTool: () => {},\n registerTools: () => {},\n addToolAssociation: () => {},\n registerMcpServer: () => {},\n registerMcpServers: () => {},\n registerResource: () => {},\n registerResources: () => {},\n registerResourceSource: () => {},\n }),\n [componentList, toolRegistry],\n );\n\n // Client context\n const clientContext = useMemo(\n () => ({\n client: stubClient,\n queryClient,\n isUpdatingToken: false,\n tokenExchangeError: null,\n userToken: undefined,\n hasValidToken: false,\n }),\n [stubClient, queryClient],\n );\n\n return (\n <QueryClientProvider client={queryClient}>\n <TamboClientContext.Provider value={clientContext}>\n <TamboRegistryContext.Provider value={registryContext}>\n <TamboV1ConfigContext.Provider value={config}>\n <TamboV1StreamProvider\n state={streamState}\n dispatch={streamDispatch}\n threadManagement={threadManagement}\n >\n <TamboV1ThreadInputContext.Provider value={threadInputContext}>\n {children}\n </TamboV1ThreadInputContext.Provider>\n </TamboV1StreamProvider>\n </TamboV1ConfigContext.Provider>\n </TamboRegistryContext.Provider>\n </TamboClientContext.Provider>\n </QueryClientProvider>\n );\n}\n"]}
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
import React, { type PropsWithChildren } from "react";
|
|
10
10
|
import { type StagedImage } from "../../hooks/use-message-images";
|
|
11
11
|
import { type UseTamboMutationResult } from "../../hooks/react-query-hooks";
|
|
12
|
+
import type { ToolChoice } from "../types/tool-choice";
|
|
12
13
|
export declare const INPUT_ERROR_MESSAGES: {
|
|
13
14
|
readonly EMPTY: "Message cannot be empty";
|
|
14
15
|
readonly VALIDATION: "Invalid message format";
|
|
@@ -21,6 +22,14 @@ export interface SubmitOptions {
|
|
|
21
22
|
* Enable debug logging for the stream
|
|
22
23
|
*/
|
|
23
24
|
debug?: boolean;
|
|
25
|
+
/**
|
|
26
|
+
* How the model should use tools. Defaults to "auto".
|
|
27
|
+
* - "auto": Model decides whether to use tools
|
|
28
|
+
* - "required": Model must use at least one tool
|
|
29
|
+
* - "none": Model cannot use tools
|
|
30
|
+
* - { name: "toolName" }: Model must use the specified tool
|
|
31
|
+
*/
|
|
32
|
+
toolChoice?: ToolChoice;
|
|
24
33
|
}
|
|
25
34
|
/**
|
|
26
35
|
* Context props for thread input state
|
|
@@ -55,6 +64,8 @@ export interface TamboV1ThreadInputContextProps extends Omit<UseTamboMutationRes
|
|
|
55
64
|
clearImages: () => void;
|
|
56
65
|
/** Current thread ID being used for input (from stream state) */
|
|
57
66
|
threadId: string | undefined;
|
|
67
|
+
/** Whether the input should be disabled (pending submission or not authenticated) */
|
|
68
|
+
isDisabled: boolean;
|
|
58
69
|
}
|
|
59
70
|
/**
|
|
60
71
|
* Context for thread input state.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tambo-v1-thread-input-provider.d.ts","sourceRoot":"","sources":["../../../src/v1/providers/tambo-v1-thread-input-provider.tsx"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,EAKZ,KAAK,iBAAiB,EACvB,MAAM,OAAO,CAAC;AACf,OAAO,EAEL,KAAK,WAAW,EACjB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"tambo-v1-thread-input-provider.d.ts","sourceRoot":"","sources":["../../../src/v1/providers/tambo-v1-thread-input-provider.tsx"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,EAKZ,KAAK,iBAAiB,EACvB,MAAM,OAAO,CAAC;AACf,OAAO,EAEL,KAAK,WAAW,EACjB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,+BAA+B,CAAC;AAGvC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AASvD,eAAO,MAAM,oBAAoB;;;CAGvB,CAAC;AAkCX;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,8BAA+B,SAAQ,IAAI,CAC1D,sBAAsB,CACpB;IAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,EAChC,KAAK,EACL,aAAa,GAAG,SAAS,CAC1B,EACD,QAAQ,GAAG,aAAa,CACzB;IACC,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;IAEvD;;;;OAIG;IACH,MAAM,EAAE,CACN,OAAO,CAAC,EAAE,aAAa,KACpB,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC,CAAC;IAE/C,8BAA8B;IAC9B,MAAM,EAAE,WAAW,EAAE,CAAC;IAEtB,yBAAyB;IACzB,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAExC,0BAA0B;IAC1B,SAAS,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5C,4BAA4B;IAC5B,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAElC,8BAA8B;IAC9B,WAAW,EAAE,MAAM,IAAI,CAAC;IAExB,iEAAiE;IACjE,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAE7B,qFAAqF;IACrF,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;;GAGG;AACH,eAAO,MAAM,yBAAyB,2DAE1B,CAAC;AAEb;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CAAC,EAAE,QAAQ,EAAE,EAAE,iBAAiB,qBAgGzE;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,qBAAqB,IAAI,8BAA8B,CAQtE"}
|
|
@@ -50,6 +50,7 @@ const use_message_images_1 = require("../../hooks/use-message-images");
|
|
|
50
50
|
const react_query_hooks_1 = require("../../hooks/react-query-hooks");
|
|
51
51
|
const use_tambo_v1_send_message_1 = require("../hooks/use-tambo-v1-send-message");
|
|
52
52
|
const event_accumulator_1 = require("../utils/event-accumulator");
|
|
53
|
+
const use_tambo_v1_auth_state_1 = require("../hooks/use-tambo-v1-auth-state");
|
|
53
54
|
const tambo_v1_stream_context_1 = require("./tambo-v1-stream-context");
|
|
54
55
|
// Error messages for various input-related error scenarios.
|
|
55
56
|
// TODO: Reintroduce explicit `NETWORK` and `SERVER` keys once `submit()` maps
|
|
@@ -103,12 +104,18 @@ function TamboV1ThreadInputProvider({ children }) {
|
|
|
103
104
|
const imageState = (0, use_message_images_1.useMessageImages)();
|
|
104
105
|
const streamState = (0, tambo_v1_stream_context_1.useStreamState)();
|
|
105
106
|
const dispatch = (0, tambo_v1_stream_context_1.useStreamDispatch)();
|
|
107
|
+
const authState = (0, use_tambo_v1_auth_state_1.useTamboV1AuthState)();
|
|
106
108
|
// Use the current thread from stream state directly
|
|
107
109
|
// Placeholder ID indicates a new thread should be created
|
|
108
110
|
const currentThreadId = streamState.currentThreadId ?? undefined;
|
|
109
111
|
const isNewThread = (0, event_accumulator_1.isPlaceholderThreadId)(currentThreadId);
|
|
110
112
|
const sendMessage = (0, use_tambo_v1_send_message_1.useTamboV1SendMessage)(currentThreadId);
|
|
113
|
+
const isIdentified = authState.status === "identified";
|
|
111
114
|
const submitFn = (0, react_1.useCallback)(async (options) => {
|
|
115
|
+
if (!isIdentified) {
|
|
116
|
+
throw new Error("Cannot submit: authentication is not ready. " +
|
|
117
|
+
"Ensure a valid userKey or userToken is provided.");
|
|
118
|
+
}
|
|
112
119
|
const trimmedValue = inputValue.trim();
|
|
113
120
|
// Check if we have content to send
|
|
114
121
|
if (!trimmedValue && imageState.images.length === 0) {
|
|
@@ -128,6 +135,7 @@ function TamboV1ThreadInputProvider({ children }) {
|
|
|
128
135
|
},
|
|
129
136
|
userMessageText: trimmedValue, // Pass text for optimistic display
|
|
130
137
|
debug: options?.debug,
|
|
138
|
+
toolChoice: options?.toolChoice,
|
|
131
139
|
});
|
|
132
140
|
// Clear input and images after successful submission
|
|
133
141
|
setInputValue("");
|
|
@@ -139,7 +147,7 @@ function TamboV1ThreadInputProvider({ children }) {
|
|
|
139
147
|
return result;
|
|
140
148
|
},
|
|
141
149
|
// `stagedImageToResourceContent` is a pure module-level helper (not a hook value).
|
|
142
|
-
[inputValue, imageState, sendMessage, isNewThread, dispatch]);
|
|
150
|
+
[inputValue, imageState, sendMessage, isNewThread, dispatch, isIdentified]);
|
|
143
151
|
const { mutateAsync: submitAsync, mutate: _unusedSubmit, ...mutationState } = (0, react_query_hooks_1.useTamboMutation)({
|
|
144
152
|
mutationKey: ["v1-thread-input", currentThreadId],
|
|
145
153
|
mutationFn: submitFn,
|
|
@@ -155,6 +163,7 @@ function TamboV1ThreadInputProvider({ children }) {
|
|
|
155
163
|
removeImage: imageState.removeImage,
|
|
156
164
|
clearImages: imageState.clearImages,
|
|
157
165
|
threadId: currentThreadId,
|
|
166
|
+
isDisabled: mutationState.isPending || !isIdentified,
|
|
158
167
|
};
|
|
159
168
|
return (react_1.default.createElement(exports.TamboV1ThreadInputContext.Provider, { value: contextValue }, children));
|
|
160
169
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tambo-v1-thread-input-provider.js","sourceRoot":"","sources":["../../../src/v1/providers/tambo-v1-thread-input-provider.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\n/**\n * TamboV1ThreadInputProvider - Shared Thread Input Context for v1 API\n *\n * Provides shared input state across all components, enabling features like\n * suggestions to update the input field directly.\n *\n * This mirrors the beta SDK's TamboThreadInputProvider pattern.\n */\n\nimport React, {\n createContext,\n useCallback,\n useContext,\n useState,\n type PropsWithChildren,\n} from \"react\";\nimport {\n useMessageImages,\n type StagedImage,\n} from \"../../hooks/use-message-images\";\nimport {\n useTamboMutation,\n type UseTamboMutationResult,\n} from \"../../hooks/react-query-hooks\";\nimport { useTamboV1SendMessage } from \"../hooks/use-tambo-v1-send-message\";\nimport type { InputMessage } from \"../types/message\";\nimport { isPlaceholderThreadId } from \"../utils/event-accumulator\";\nimport { useStreamDispatch, useStreamState } from \"./tambo-v1-stream-context\";\n\n// Error messages for various input-related error scenarios.\n// TODO: Reintroduce explicit `NETWORK` and `SERVER` keys once `submit()` maps\n// failures into a small, stable set of user-facing error codes (at minimum:\n// connectivity failures vs non-2xx responses).\nexport const INPUT_ERROR_MESSAGES = {\n EMPTY: \"Message cannot be empty\",\n VALIDATION: \"Invalid message format\",\n} as const;\n\nfunction stagedImageToResourceContent(\n image: StagedImage,\n): InputMessage[\"content\"][number] {\n if (!image.dataUrl.startsWith(\"data:\")) {\n throw new Error(INPUT_ERROR_MESSAGES.VALIDATION);\n }\n\n const commaIndex = image.dataUrl.indexOf(\",\");\n if (commaIndex === -1) {\n throw new Error(INPUT_ERROR_MESSAGES.VALIDATION);\n }\n\n const header = image.dataUrl.slice(\"data:\".length, commaIndex);\n const [mimeType, ...params] = header.split(\";\");\n const isBase64 = params.includes(\"base64\");\n\n if (mimeType !== image.type || !isBase64) {\n throw new Error(INPUT_ERROR_MESSAGES.VALIDATION);\n }\n\n return {\n type: \"resource\",\n resource: {\n name: image.name,\n mimeType: image.type,\n // Shared.Resource.blob expects base64-encoded data; this is the base64\n // payload from the `data:` URL.\n blob: image.dataUrl.slice(commaIndex + 1),\n },\n };\n}\n\n/**\n * Options for submitting a message\n */\nexport interface SubmitOptions {\n /**\n * Enable debug logging for the stream\n */\n debug?: boolean;\n}\n\n/**\n * Context props for thread input state\n */\nexport interface TamboV1ThreadInputContextProps extends Omit<\n UseTamboMutationResult<\n { threadId: string | undefined },\n Error,\n SubmitOptions | undefined\n >,\n \"mutate\" | \"mutateAsync\"\n> {\n /** Current value of the input field */\n value: string;\n\n /**\n * Function to update the input value\n * @param value - New value for the input field\n */\n setValue: React.Dispatch<React.SetStateAction<string>>;\n\n /**\n * Function to submit the current input value\n * @param options - Submission options\n * @returns Promise with the threadId\n */\n submit: (\n options?: SubmitOptions,\n ) => Promise<{ threadId: string | undefined }>;\n\n /** Currently staged images */\n images: StagedImage[];\n\n /** Add a single image */\n addImage: (file: File) => Promise<void>;\n\n /** Add multiple images */\n addImages: (files: File[]) => Promise<void>;\n\n /** Remove an image by id */\n removeImage: (id: string) => void;\n\n /** Clear all staged images */\n clearImages: () => void;\n\n /** Current thread ID being used for input (from stream state) */\n threadId: string | undefined;\n}\n\n/**\n * Context for thread input state.\n * @internal\n */\nexport const TamboV1ThreadInputContext = createContext<\n TamboV1ThreadInputContextProps | undefined\n>(undefined);\n\n/**\n * Provider that manages shared thread input state across all components.\n *\n * This ensures that useTamboV1ThreadInput, useTamboV1Suggestions, and other components\n * all share the same input state.\n * @param props - Provider props\n * @param props.children - Child components\n * @returns Thread input context provider\n */\nexport function TamboV1ThreadInputProvider({ children }: PropsWithChildren) {\n const [inputValue, setInputValue] = useState(\"\");\n const imageState = useMessageImages();\n const streamState = useStreamState();\n const dispatch = useStreamDispatch();\n\n // Use the current thread from stream state directly\n // Placeholder ID indicates a new thread should be created\n const currentThreadId = streamState.currentThreadId ?? undefined;\n const isNewThread = isPlaceholderThreadId(currentThreadId);\n const sendMessage = useTamboV1SendMessage(currentThreadId);\n\n const submitFn = useCallback(\n async (\n options?: SubmitOptions,\n ): Promise<{ threadId: string | undefined }> => {\n const trimmedValue = inputValue.trim();\n\n // Check if we have content to send\n if (!trimmedValue && imageState.images.length === 0) {\n throw new Error(INPUT_ERROR_MESSAGES.EMPTY);\n }\n\n const content: InputMessage[\"content\"] = [];\n\n if (trimmedValue) {\n content.push({ type: \"text\", text: trimmedValue });\n }\n\n for (const image of imageState.images) {\n content.push(stagedImageToResourceContent(image));\n }\n\n const result = await sendMessage.mutateAsync({\n message: {\n role: \"user\",\n content,\n },\n userMessageText: trimmedValue, // Pass text for optimistic display\n debug: options?.debug,\n });\n\n // Clear input and images after successful submission\n setInputValue(\"\");\n imageState.clearImages();\n\n // Update stream context's currentThreadId if a new thread was created\n if (result.threadId && isNewThread) {\n dispatch({ type: \"SET_CURRENT_THREAD\", threadId: result.threadId });\n }\n\n return result;\n },\n // `stagedImageToResourceContent` is a pure module-level helper (not a hook value).\n [inputValue, imageState, sendMessage, isNewThread, dispatch],\n );\n\n const {\n mutateAsync: submitAsync,\n mutate: _unusedSubmit,\n ...mutationState\n } = useTamboMutation({\n mutationKey: [\"v1-thread-input\", currentThreadId],\n mutationFn: submitFn,\n });\n\n const contextValue: TamboV1ThreadInputContextProps = {\n ...mutationState,\n value: inputValue,\n setValue: setInputValue,\n submit: submitAsync,\n images: imageState.images,\n addImage: imageState.addImage,\n addImages: imageState.addImages,\n removeImage: imageState.removeImage,\n clearImages: imageState.clearImages,\n threadId: currentThreadId,\n };\n\n return (\n <TamboV1ThreadInputContext.Provider value={contextValue}>\n {children}\n </TamboV1ThreadInputContext.Provider>\n );\n}\n\n/**\n * Hook to access the shared thread input state.\n *\n * All components using this hook share the same input state, enabling\n * features like suggestions to update the input field directly.\n * @returns The shared thread input context\n * @throws {Error} If used outside TamboV1ThreadInputProvider\n * @example\n * ```tsx\n * function ChatInput() {\n * const { value, setValue, submit, isPending } = useTamboV1ThreadInput();\n *\n * return (\n * <form onSubmit={(e) => { e.preventDefault(); submit(); }}>\n * <input\n * value={value}\n * onChange={(e) => setValue(e.target.value)}\n * disabled={isPending}\n * />\n * <button type=\"submit\" disabled={isPending}>Send</button>\n * </form>\n * );\n * }\n * ```\n */\nexport function useTamboV1ThreadInput(): TamboV1ThreadInputContextProps {\n const context = useContext(TamboV1ThreadInputContext);\n if (!context) {\n throw new Error(\n \"useTamboV1ThreadInput must be used within TamboV1ThreadInputProvider\",\n );\n }\n return context;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tambo-v1-thread-input-provider.js","sourceRoot":"","sources":["../../../src/v1/providers/tambo-v1-thread-input-provider.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\n/**\n * TamboV1ThreadInputProvider - Shared Thread Input Context for v1 API\n *\n * Provides shared input state across all components, enabling features like\n * suggestions to update the input field directly.\n *\n * This mirrors the beta SDK's TamboThreadInputProvider pattern.\n */\n\nimport React, {\n createContext,\n useCallback,\n useContext,\n useState,\n type PropsWithChildren,\n} from \"react\";\nimport {\n useMessageImages,\n type StagedImage,\n} from \"../../hooks/use-message-images\";\nimport {\n useTamboMutation,\n type UseTamboMutationResult,\n} from \"../../hooks/react-query-hooks\";\nimport { useTamboV1SendMessage } from \"../hooks/use-tambo-v1-send-message\";\nimport type { InputMessage } from \"../types/message\";\nimport type { ToolChoice } from \"../types/tool-choice\";\nimport { isPlaceholderThreadId } from \"../utils/event-accumulator\";\nimport { useTamboV1AuthState } from \"../hooks/use-tambo-v1-auth-state\";\nimport { useStreamDispatch, useStreamState } from \"./tambo-v1-stream-context\";\n\n// Error messages for various input-related error scenarios.\n// TODO: Reintroduce explicit `NETWORK` and `SERVER` keys once `submit()` maps\n// failures into a small, stable set of user-facing error codes (at minimum:\n// connectivity failures vs non-2xx responses).\nexport const INPUT_ERROR_MESSAGES = {\n EMPTY: \"Message cannot be empty\",\n VALIDATION: \"Invalid message format\",\n} as const;\n\nfunction stagedImageToResourceContent(\n image: StagedImage,\n): InputMessage[\"content\"][number] {\n if (!image.dataUrl.startsWith(\"data:\")) {\n throw new Error(INPUT_ERROR_MESSAGES.VALIDATION);\n }\n\n const commaIndex = image.dataUrl.indexOf(\",\");\n if (commaIndex === -1) {\n throw new Error(INPUT_ERROR_MESSAGES.VALIDATION);\n }\n\n const header = image.dataUrl.slice(\"data:\".length, commaIndex);\n const [mimeType, ...params] = header.split(\";\");\n const isBase64 = params.includes(\"base64\");\n\n if (mimeType !== image.type || !isBase64) {\n throw new Error(INPUT_ERROR_MESSAGES.VALIDATION);\n }\n\n return {\n type: \"resource\",\n resource: {\n name: image.name,\n mimeType: image.type,\n // Shared.Resource.blob expects base64-encoded data; this is the base64\n // payload from the `data:` URL.\n blob: image.dataUrl.slice(commaIndex + 1),\n },\n };\n}\n\n/**\n * Options for submitting a message\n */\nexport interface SubmitOptions {\n /**\n * Enable debug logging for the stream\n */\n debug?: boolean;\n\n /**\n * How the model should use tools. Defaults to \"auto\".\n * - \"auto\": Model decides whether to use tools\n * - \"required\": Model must use at least one tool\n * - \"none\": Model cannot use tools\n * - { name: \"toolName\" }: Model must use the specified tool\n */\n toolChoice?: ToolChoice;\n}\n\n/**\n * Context props for thread input state\n */\nexport interface TamboV1ThreadInputContextProps extends Omit<\n UseTamboMutationResult<\n { threadId: string | undefined },\n Error,\n SubmitOptions | undefined\n >,\n \"mutate\" | \"mutateAsync\"\n> {\n /** Current value of the input field */\n value: string;\n\n /**\n * Function to update the input value\n * @param value - New value for the input field\n */\n setValue: React.Dispatch<React.SetStateAction<string>>;\n\n /**\n * Function to submit the current input value\n * @param options - Submission options\n * @returns Promise with the threadId\n */\n submit: (\n options?: SubmitOptions,\n ) => Promise<{ threadId: string | undefined }>;\n\n /** Currently staged images */\n images: StagedImage[];\n\n /** Add a single image */\n addImage: (file: File) => Promise<void>;\n\n /** Add multiple images */\n addImages: (files: File[]) => Promise<void>;\n\n /** Remove an image by id */\n removeImage: (id: string) => void;\n\n /** Clear all staged images */\n clearImages: () => void;\n\n /** Current thread ID being used for input (from stream state) */\n threadId: string | undefined;\n\n /** Whether the input should be disabled (pending submission or not authenticated) */\n isDisabled: boolean;\n}\n\n/**\n * Context for thread input state.\n * @internal\n */\nexport const TamboV1ThreadInputContext = createContext<\n TamboV1ThreadInputContextProps | undefined\n>(undefined);\n\n/**\n * Provider that manages shared thread input state across all components.\n *\n * This ensures that useTamboV1ThreadInput, useTamboV1Suggestions, and other components\n * all share the same input state.\n * @param props - Provider props\n * @param props.children - Child components\n * @returns Thread input context provider\n */\nexport function TamboV1ThreadInputProvider({ children }: PropsWithChildren) {\n const [inputValue, setInputValue] = useState(\"\");\n const imageState = useMessageImages();\n const streamState = useStreamState();\n const dispatch = useStreamDispatch();\n const authState = useTamboV1AuthState();\n\n // Use the current thread from stream state directly\n // Placeholder ID indicates a new thread should be created\n const currentThreadId = streamState.currentThreadId ?? undefined;\n const isNewThread = isPlaceholderThreadId(currentThreadId);\n const sendMessage = useTamboV1SendMessage(currentThreadId);\n\n const isIdentified = authState.status === \"identified\";\n\n const submitFn = useCallback(\n async (\n options?: SubmitOptions,\n ): Promise<{ threadId: string | undefined }> => {\n if (!isIdentified) {\n throw new Error(\n \"Cannot submit: authentication is not ready. \" +\n \"Ensure a valid userKey or userToken is provided.\",\n );\n }\n\n const trimmedValue = inputValue.trim();\n\n // Check if we have content to send\n if (!trimmedValue && imageState.images.length === 0) {\n throw new Error(INPUT_ERROR_MESSAGES.EMPTY);\n }\n\n const content: InputMessage[\"content\"] = [];\n\n if (trimmedValue) {\n content.push({ type: \"text\", text: trimmedValue });\n }\n\n for (const image of imageState.images) {\n content.push(stagedImageToResourceContent(image));\n }\n\n const result = await sendMessage.mutateAsync({\n message: {\n role: \"user\",\n content,\n },\n userMessageText: trimmedValue, // Pass text for optimistic display\n debug: options?.debug,\n toolChoice: options?.toolChoice,\n });\n\n // Clear input and images after successful submission\n setInputValue(\"\");\n imageState.clearImages();\n\n // Update stream context's currentThreadId if a new thread was created\n if (result.threadId && isNewThread) {\n dispatch({ type: \"SET_CURRENT_THREAD\", threadId: result.threadId });\n }\n\n return result;\n },\n // `stagedImageToResourceContent` is a pure module-level helper (not a hook value).\n [inputValue, imageState, sendMessage, isNewThread, dispatch, isIdentified],\n );\n\n const {\n mutateAsync: submitAsync,\n mutate: _unusedSubmit,\n ...mutationState\n } = useTamboMutation({\n mutationKey: [\"v1-thread-input\", currentThreadId],\n mutationFn: submitFn,\n });\n\n const contextValue: TamboV1ThreadInputContextProps = {\n ...mutationState,\n value: inputValue,\n setValue: setInputValue,\n submit: submitAsync,\n images: imageState.images,\n addImage: imageState.addImage,\n addImages: imageState.addImages,\n removeImage: imageState.removeImage,\n clearImages: imageState.clearImages,\n threadId: currentThreadId,\n isDisabled: mutationState.isPending || !isIdentified,\n };\n\n return (\n <TamboV1ThreadInputContext.Provider value={contextValue}>\n {children}\n </TamboV1ThreadInputContext.Provider>\n );\n}\n\n/**\n * Hook to access the shared thread input state.\n *\n * All components using this hook share the same input state, enabling\n * features like suggestions to update the input field directly.\n * @returns The shared thread input context\n * @throws {Error} If used outside TamboV1ThreadInputProvider\n * @example\n * ```tsx\n * function ChatInput() {\n * const { value, setValue, submit, isPending } = useTamboV1ThreadInput();\n *\n * return (\n * <form onSubmit={(e) => { e.preventDefault(); submit(); }}>\n * <input\n * value={value}\n * onChange={(e) => setValue(e.target.value)}\n * disabled={isPending}\n * />\n * <button type=\"submit\" disabled={isPending}>Send</button>\n * </form>\n * );\n * }\n * ```\n */\nexport function useTamboV1ThreadInput(): TamboV1ThreadInputContextProps {\n const context = useContext(TamboV1ThreadInputContext);\n if (!context) {\n throw new Error(\n \"useTamboV1ThreadInput must be used within TamboV1ThreadInputProvider\",\n );\n }\n return context;\n}\n"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication state for the v1 SDK.
|
|
3
|
+
*
|
|
4
|
+
* Discriminated union tracking the current auth lifecycle:
|
|
5
|
+
* - `identified`: ready to make API calls (via userKey or successful token exchange)
|
|
6
|
+
* - `exchanging`: userToken provided, exchange in-flight
|
|
7
|
+
* - `error`: token exchange failed
|
|
8
|
+
* - `invalid`: both userKey AND userToken provided (must choose one)
|
|
9
|
+
* - `unauthenticated`: neither userKey nor userToken provided
|
|
10
|
+
*/
|
|
11
|
+
export type TamboV1AuthState = {
|
|
12
|
+
status: "identified";
|
|
13
|
+
source: "userKey" | "tokenExchange";
|
|
14
|
+
} | {
|
|
15
|
+
status: "exchanging";
|
|
16
|
+
} | {
|
|
17
|
+
status: "error";
|
|
18
|
+
error: Error;
|
|
19
|
+
} | {
|
|
20
|
+
status: "invalid";
|
|
21
|
+
} | {
|
|
22
|
+
status: "unauthenticated";
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/v1/types/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,MAAM,gBAAgB,GACxB;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,eAAe,CAAA;CAAE,GAC7D;IAAE,MAAM,EAAE,YAAY,CAAA;CAAE,GACxB;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,GACjC;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GACrB;IAAE,MAAM,EAAE,iBAAiB,CAAA;CAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/v1/types/auth.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * Authentication state for the v1 SDK.\n *\n * Discriminated union tracking the current auth lifecycle:\n * - `identified`: ready to make API calls (via userKey or successful token exchange)\n * - `exchanging`: userToken provided, exchange in-flight\n * - `error`: token exchange failed\n * - `invalid`: both userKey AND userToken provided (must choose one)\n * - `unauthenticated`: neither userKey nor userToken provided\n */\nexport type TamboV1AuthState =\n | { status: \"identified\"; source: \"userKey\" | \"tokenExchange\" }\n | { status: \"exchanging\" }\n | { status: \"error\"; error: Error }\n | { status: \"invalid\" }\n | { status: \"unauthenticated\" };\n"]}
|
|
@@ -7,7 +7,19 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import type { ReactElement } from "react";
|
|
9
9
|
export type { TextContent, ToolResultContent, ResourceContent, } from "@tambo-ai/typescript-sdk/resources/threads/threads";
|
|
10
|
+
import type { InputMessage } from "@tambo-ai/typescript-sdk/resources/threads/runs";
|
|
10
11
|
export type { InputMessage } from "@tambo-ai/typescript-sdk/resources/threads/runs";
|
|
12
|
+
/**
|
|
13
|
+
* Widened InputMessage type for initial messages that supports system and assistant roles
|
|
14
|
+
* in addition to the user role.
|
|
15
|
+
*
|
|
16
|
+
* The TS SDK `InputMessage` type constrains `role` to `'user'`, but the V1 API
|
|
17
|
+
* accepts `'user' | 'system' | 'assistant'` for `initialMessages`. This type
|
|
18
|
+
* widens the role field until the TS SDK type is regenerated.
|
|
19
|
+
*/
|
|
20
|
+
export type InitialInputMessage = Omit<InputMessage, "role"> & {
|
|
21
|
+
role: "user" | "system" | "assistant";
|
|
22
|
+
};
|
|
11
23
|
export type { MessageListResponse, MessageGetResponse, } from "@tambo-ai/typescript-sdk/resources/threads/messages";
|
|
12
24
|
import type { TextContent, ToolUseContent, ToolResultContent, ComponentContent, ResourceContent } from "@tambo-ai/typescript-sdk/resources/threads/threads";
|
|
13
25
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../../src/v1/types/message.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAK1C,YAAY,EACV,WAAW,EACX,iBAAiB,EACjB,eAAe,GAChB,MAAM,oDAAoD,CAAC;AAG5D,YAAY,EAAE,YAAY,EAAE,MAAM,iDAAiD,CAAC;AAEpF,YAAY,EACV,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,qDAAqD,CAAC;AAG7D,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EAChB,MAAM,oDAAoD,CAAC;AAE5D;;;GAGG;AACH,MAAM,MAAM,uBAAuB,GAAG,SAAS,GAAG,WAAW,GAAG,MAAM,CAAC;AAEvE;;;GAGG;AACH,MAAM,WAAW,kBAAmB,SAAQ,gBAAgB;IAC1D;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,uBAAuB,CAAC;IAEzC;;;OAGG;IACH,iBAAiB,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;CACzC;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,2CAA2C;IAC3C,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,gDAAgD;IAChD,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,6CAA6C;IAC7C,8BAA8B,CAAC,EAAE,MAAM,CAAC;CACzC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC;IACrE;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE/B;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,qBAAqB,CAAC;CAC3C;AAED;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE1D;;;GAGG;AACH,MAAM,MAAM,OAAO,GACf,WAAW,GACX,gBAAgB,GAChB,iBAAiB,GACjB,kBAAkB,GAClB,eAAe,CAAC;AAEpB;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,gCAAgC;IAChC,EAAE,EAAE,MAAM,CAAC;IAEX,uCAAuC;IACvC,IAAI,EAAE,WAAW,CAAC;IAElB,oCAAoC;IACpC,OAAO,EAAE,OAAO,EAAE,CAAC;IAEnB,sFAAsF;IACtF,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,uBAAuB;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEnC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IAErB;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B"}
|
|
1
|
+
{"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../../src/v1/types/message.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAK1C,YAAY,EACV,WAAW,EACX,iBAAiB,EACjB,eAAe,GAChB,MAAM,oDAAoD,CAAC;AAG5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iDAAiD,CAAC;AACpF,YAAY,EAAE,YAAY,EAAE,MAAM,iDAAiD,CAAC;AAEpF;;;;;;;GAOG;AACH,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,GAAG;IAC7D,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,WAAW,CAAC;CACvC,CAAC;AAEF,YAAY,EACV,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,qDAAqD,CAAC;AAG7D,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EAChB,MAAM,oDAAoD,CAAC;AAE5D;;;GAGG;AACH,MAAM,MAAM,uBAAuB,GAAG,SAAS,GAAG,WAAW,GAAG,MAAM,CAAC;AAEvE;;;GAGG;AACH,MAAM,WAAW,kBAAmB,SAAQ,gBAAgB;IAC1D;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,uBAAuB,CAAC;IAEzC;;;OAGG;IACH,iBAAiB,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;CACzC;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,2CAA2C;IAC3C,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,gDAAgD;IAChD,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,6CAA6C;IAC7C,8BAA8B,CAAC,EAAE,MAAM,CAAC;CACzC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC;IACrE;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE/B;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,qBAAqB,CAAC;CAC3C;AAED;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE1D;;;GAGG;AACH,MAAM,MAAM,OAAO,GACf,WAAW,GACX,gBAAgB,GAChB,iBAAiB,GACjB,kBAAkB,GAClB,eAAe,CAAC;AAEpB;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,gCAAgC;IAChC,EAAE,EAAE,MAAM,CAAC;IAEX,uCAAuC;IACvC,IAAI,EAAE,WAAW,CAAC;IAElB,oCAAoC;IACpC,OAAO,EAAE,OAAO,EAAE,CAAC;IAEnB,sFAAsF;IACtF,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,uBAAuB;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEnC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IAErB;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message.js","sourceRoot":"","sources":["../../../src/v1/types/message.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG","sourcesContent":["/**\n * Message and Content Types for v1 API\n *\n * Re-exports message and content types from `@tambo-ai/typescript-sdk`.\n * Messages use Anthropic-style content blocks pattern where a message\n * contains an array of content blocks (text, tool calls, tool results, components).\n */\n\nimport type { ReactElement } from \"react\";\n\n// Re-export content block types from TypeScript SDK\n// Note: ToolUseContent and ComponentContent are NOT re-exported - use V1ToolUseContent\n// and V1ComponentContent instead, which include computed state properties.\nexport type {\n TextContent,\n ToolResultContent,\n ResourceContent,\n} from \"@tambo-ai/typescript-sdk/resources/threads/threads\";\n\n// Re-export message types from TypeScript SDK\nexport type { InputMessage } from \"@tambo-ai/typescript-sdk/resources/threads/runs\";\n\nexport type {\n MessageListResponse,\n MessageGetResponse,\n} from \"@tambo-ai/typescript-sdk/resources/threads/messages\";\n\n// Import for Content union type\nimport type {\n TextContent,\n ToolUseContent,\n ToolResultContent,\n ComponentContent,\n ResourceContent,\n} from \"@tambo-ai/typescript-sdk/resources/threads/threads\";\n\n/**\n * Streaming state for component content blocks.\n * Tracks the lifecycle of component prop/state streaming.\n */\nexport type ComponentStreamingState = \"started\" | \"streaming\" | \"done\";\n\n/**\n * Extended ComponentContent with streaming state and rendered element.\n * Used by the v1 SDK to track component rendering lifecycle.\n */\nexport interface V1ComponentContent extends ComponentContent {\n /**\n * Current streaming state of this component's props.\n * - 'started': Component block created, awaiting props\n * - 'streaming': Props are being streamed\n * - 'done': Props streaming complete\n *\n * Optional for historical messages loaded from API (defaults to \"done\").\n */\n streamingState?: ComponentStreamingState;\n\n /**\n * The rendered React element for this component.\n * undefined if not yet rendered, null if the component couldn't be found in the registry.\n */\n renderedComponent?: ReactElement | null;\n}\n\n/**\n * Special display properties that can be included in tool input.\n * These are used to customize tool status messages shown in the UI.\n */\nexport interface TamboToolDisplayProps {\n /** Generic display message for the tool */\n _tambo_displayMessage?: string;\n /** Message shown while the tool is executing */\n _tambo_statusMessage?: string;\n /** Message shown after the tool completes */\n _tambo_completionStatusMessage?: string;\n}\n\n/**\n * Extended ToolUseContent with computed state properties.\n * Used by the v1 SDK to provide pre-computed tool state to consumers.\n *\n * Note: The computed properties are populated by `useTamboV1()` hook.\n * When accessed via lower-level APIs, they may be undefined.\n */\nexport interface V1ToolUseContent extends Omit<ToolUseContent, \"input\"> {\n /**\n * Tool input parameters with internal `_tambo_*` properties removed.\n * Consumers see only the actual tool parameters.\n */\n input: Record<string, unknown>;\n\n /**\n * Whether this tool call has completed (has a matching tool_result).\n * Computed by `useTamboV1()` based on presence of matching tool_result.\n */\n hasCompleted?: boolean;\n\n /**\n * The status message to display, resolved based on tool execution state.\n * Automatically updates as tool progresses through execution lifecycle.\n * Computed by `useTamboV1()`.\n */\n statusMessage?: string;\n\n /**\n * Extracted Tambo display properties from the tool input.\n * Consumers can use these for custom rendering if needed.\n * Computed by `useTamboV1()`.\n */\n tamboDisplayProps?: TamboToolDisplayProps;\n}\n\n/**\n * Message role (from SDK)\n * Includes 'system' to accommodate messages loaded from API.\n */\nexport type MessageRole = \"user\" | \"assistant\" | \"system\";\n\n/**\n * Union type of all content block types.\n * Uses V1ComponentContent and V1ToolUseContent which include computed state.\n */\nexport type Content =\n | TextContent\n | V1ToolUseContent\n | ToolResultContent\n | V1ComponentContent\n | ResourceContent;\n\n/**\n * Message in a thread (simplified from SDK's MessageGetResponse)\n */\nexport interface TamboV1Message {\n /** Unique message identifier */\n id: string;\n\n /** Message role (user or assistant) */\n role: MessageRole;\n\n /** Content blocks in the message */\n content: Content[];\n\n /** When the message was created (optional for historical messages loaded from API) */\n createdAt?: string;\n\n /** Message metadata */\n metadata?: Record<string, unknown>;\n\n /**\n * Reasoning content from the model (transient - only during streaming).\n * Each element is a reasoning \"chunk\" - models may emit multiple reasoning blocks.\n * This data is not persisted to the database and will not be present in\n * messages loaded from the API.\n */\n reasoning?: string[];\n\n /**\n * Duration of the reasoning phase in milliseconds (for display purposes).\n * Populated when reasoning completes.\n */\n reasoningDurationMS?: number;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"message.js","sourceRoot":"","sources":["../../../src/v1/types/message.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG","sourcesContent":["/**\n * Message and Content Types for v1 API\n *\n * Re-exports message and content types from `@tambo-ai/typescript-sdk`.\n * Messages use Anthropic-style content blocks pattern where a message\n * contains an array of content blocks (text, tool calls, tool results, components).\n */\n\nimport type { ReactElement } from \"react\";\n\n// Re-export content block types from TypeScript SDK\n// Note: ToolUseContent and ComponentContent are NOT re-exported - use V1ToolUseContent\n// and V1ComponentContent instead, which include computed state properties.\nexport type {\n TextContent,\n ToolResultContent,\n ResourceContent,\n} from \"@tambo-ai/typescript-sdk/resources/threads/threads\";\n\n// Re-export message types from TypeScript SDK\nimport type { InputMessage } from \"@tambo-ai/typescript-sdk/resources/threads/runs\";\nexport type { InputMessage } from \"@tambo-ai/typescript-sdk/resources/threads/runs\";\n\n/**\n * Widened InputMessage type for initial messages that supports system and assistant roles\n * in addition to the user role.\n *\n * The TS SDK `InputMessage` type constrains `role` to `'user'`, but the V1 API\n * accepts `'user' | 'system' | 'assistant'` for `initialMessages`. This type\n * widens the role field until the TS SDK type is regenerated.\n */\nexport type InitialInputMessage = Omit<InputMessage, \"role\"> & {\n role: \"user\" | \"system\" | \"assistant\";\n};\n\nexport type {\n MessageListResponse,\n MessageGetResponse,\n} from \"@tambo-ai/typescript-sdk/resources/threads/messages\";\n\n// Import for Content union type\nimport type {\n TextContent,\n ToolUseContent,\n ToolResultContent,\n ComponentContent,\n ResourceContent,\n} from \"@tambo-ai/typescript-sdk/resources/threads/threads\";\n\n/**\n * Streaming state for component content blocks.\n * Tracks the lifecycle of component prop/state streaming.\n */\nexport type ComponentStreamingState = \"started\" | \"streaming\" | \"done\";\n\n/**\n * Extended ComponentContent with streaming state and rendered element.\n * Used by the v1 SDK to track component rendering lifecycle.\n */\nexport interface V1ComponentContent extends ComponentContent {\n /**\n * Current streaming state of this component's props.\n * - 'started': Component block created, awaiting props\n * - 'streaming': Props are being streamed\n * - 'done': Props streaming complete\n *\n * Optional for historical messages loaded from API (defaults to \"done\").\n */\n streamingState?: ComponentStreamingState;\n\n /**\n * The rendered React element for this component.\n * undefined if not yet rendered, null if the component couldn't be found in the registry.\n */\n renderedComponent?: ReactElement | null;\n}\n\n/**\n * Special display properties that can be included in tool input.\n * These are used to customize tool status messages shown in the UI.\n */\nexport interface TamboToolDisplayProps {\n /** Generic display message for the tool */\n _tambo_displayMessage?: string;\n /** Message shown while the tool is executing */\n _tambo_statusMessage?: string;\n /** Message shown after the tool completes */\n _tambo_completionStatusMessage?: string;\n}\n\n/**\n * Extended ToolUseContent with computed state properties.\n * Used by the v1 SDK to provide pre-computed tool state to consumers.\n *\n * Note: The computed properties are populated by `useTamboV1()` hook.\n * When accessed via lower-level APIs, they may be undefined.\n */\nexport interface V1ToolUseContent extends Omit<ToolUseContent, \"input\"> {\n /**\n * Tool input parameters with internal `_tambo_*` properties removed.\n * Consumers see only the actual tool parameters.\n */\n input: Record<string, unknown>;\n\n /**\n * Whether this tool call has completed (has a matching tool_result).\n * Computed by `useTamboV1()` based on presence of matching tool_result.\n */\n hasCompleted?: boolean;\n\n /**\n * The status message to display, resolved based on tool execution state.\n * Automatically updates as tool progresses through execution lifecycle.\n * Computed by `useTamboV1()`.\n */\n statusMessage?: string;\n\n /**\n * Extracted Tambo display properties from the tool input.\n * Consumers can use these for custom rendering if needed.\n * Computed by `useTamboV1()`.\n */\n tamboDisplayProps?: TamboToolDisplayProps;\n}\n\n/**\n * Message role (from SDK)\n * Includes 'system' to accommodate messages loaded from API.\n */\nexport type MessageRole = \"user\" | \"assistant\" | \"system\";\n\n/**\n * Union type of all content block types.\n * Uses V1ComponentContent and V1ToolUseContent which include computed state.\n */\nexport type Content =\n | TextContent\n | V1ToolUseContent\n | ToolResultContent\n | V1ComponentContent\n | ResourceContent;\n\n/**\n * Message in a thread (simplified from SDK's MessageGetResponse)\n */\nexport interface TamboV1Message {\n /** Unique message identifier */\n id: string;\n\n /** Message role (user or assistant) */\n role: MessageRole;\n\n /** Content blocks in the message */\n content: Content[];\n\n /** When the message was created (optional for historical messages loaded from API) */\n createdAt?: string;\n\n /** Message metadata */\n metadata?: Record<string, unknown>;\n\n /**\n * Reasoning content from the model (transient - only during streaming).\n * Each element is a reasoning \"chunk\" - models may emit multiple reasoning blocks.\n * This data is not persisted to the database and will not be present in\n * messages loaded from the API.\n */\n reasoning?: string[];\n\n /**\n * Duration of the reasoning phase in milliseconds (for display purposes).\n * Populated when reasoning completes.\n */\n reasoningDurationMS?: number;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-choice.d.ts","sourceRoot":"","sources":["../../../src/v1/types/tool-choice.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,MAAM,UAAU,GAClB,MAAM,GACN,UAAU,GACV,MAAM,GACN;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-choice.js","sourceRoot":"","sources":["../../../src/v1/types/tool-choice.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * Tool choice type matching the V1 API format.\n * Controls how the model selects tools during generation.\n */\nexport type ToolChoice =\n | \"auto\" // Model decides (default)\n | \"required\" // Must use at least one tool\n | \"none\" // Cannot use tools\n | { name: string }; // Must use specific tool\n"]}
|