@tambo-ai/react 0.75.0 → 1.0.0-rc.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/hoc/with-tambo-interactable.d.ts.map +1 -1
- package/dist/hoc/with-tambo-interactable.js +13 -13
- package/dist/hoc/with-tambo-interactable.js.map +1 -1
- package/dist/hoc/with-tambo-interactable.test.js +3 -3
- package/dist/hoc/with-tambo-interactable.test.js.map +1 -1
- package/dist/index.d.ts +7 -25
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -59
- package/dist/index.js.map +1 -1
- package/dist/mcp/mcp-hooks.js +5 -5
- package/dist/mcp/mcp-hooks.js.map +1 -1
- package/dist/model/component-metadata.d.ts +4 -4
- package/dist/model/component-metadata.js.map +1 -1
- package/dist/providers/tambo-client-provider.d.ts +6 -0
- package/dist/providers/tambo-client-provider.d.ts.map +1 -1
- package/dist/providers/tambo-client-provider.js +4 -2
- package/dist/providers/tambo-client-provider.js.map +1 -1
- package/dist/providers/tambo-interactable-provider.d.ts +1 -1
- package/dist/providers/tambo-interactables-additional-context-edge-cases.test.js +2 -10
- package/dist/providers/tambo-interactables-additional-context-edge-cases.test.js.map +1 -1
- package/dist/providers/tambo-interactables-additional-context.test.js +3 -19
- package/dist/providers/tambo-interactables-additional-context.test.js.map +1 -1
- package/dist/providers/tambo-mcp-token-provider.d.ts +8 -17
- package/dist/providers/tambo-mcp-token-provider.d.ts.map +1 -1
- package/dist/providers/tambo-mcp-token-provider.js +20 -97
- package/dist/providers/tambo-mcp-token-provider.js.map +1 -1
- package/dist/testing/tools.d.ts +3 -3
- package/dist/testing/tools.d.ts.map +1 -1
- package/dist/testing/tools.js.map +1 -1
- package/dist/util/registry-validators.js +1 -1
- package/dist/util/registry-validators.js.map +1 -1
- package/dist/v1/__tests__/v1-interactables.test.js +1 -1
- package/dist/v1/__tests__/v1-interactables.test.js.map +1 -1
- package/dist/v1/components/v1-component-renderer.d.ts +9 -9
- package/dist/v1/components/v1-component-renderer.d.ts.map +1 -1
- package/dist/v1/components/v1-component-renderer.js +13 -13
- package/dist/v1/components/v1-component-renderer.js.map +1 -1
- package/dist/v1/components/v1-component-renderer.test.js +15 -15
- package/dist/v1/components/v1-component-renderer.test.js.map +1 -1
- package/{esm/hooks/use-current-message.d.ts → dist/v1/hooks/use-tambo-current-message.d.ts} +30 -9
- package/dist/v1/hooks/use-tambo-current-message.d.ts.map +1 -0
- package/dist/{hooks/use-current-message.js → v1/hooks/use-tambo-current-message.js} +13 -8
- package/dist/v1/hooks/use-tambo-current-message.js.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-auth-state.d.ts +5 -5
- package/dist/v1/hooks/use-tambo-v1-auth-state.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-auth-state.js +8 -8
- package/dist/v1/hooks/use-tambo-v1-auth-state.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-auth-state.test.js +12 -12
- package/dist/v1/hooks/use-tambo-v1-auth-state.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-component-state.d.ts +7 -6
- package/dist/v1/hooks/use-tambo-v1-component-state.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-component-state.js +50 -24
- package/dist/v1/hooks/use-tambo-v1-component-state.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-component-state.test.js +60 -35
- package/dist/v1/hooks/use-tambo-v1-component-state.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-messages.d.ts +9 -9
- package/dist/v1/hooks/use-tambo-v1-messages.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-messages.js +4 -4
- package/dist/v1/hooks/use-tambo-v1-messages.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-messages.test.js +7 -7
- package/dist/v1/hooks/use-tambo-v1-messages.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-send-message.d.ts +3 -3
- package/dist/v1/hooks/use-tambo-v1-send-message.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-send-message.js +20 -22
- package/dist/v1/hooks/use-tambo-v1-send-message.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-send-message.test.js +51 -51
- package/dist/v1/hooks/use-tambo-v1-send-message.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-stream-status.d.ts +5 -5
- package/dist/v1/hooks/use-tambo-v1-stream-status.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-stream-status.js +12 -14
- package/dist/v1/hooks/use-tambo-v1-stream-status.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-stream-status.test.js +19 -19
- package/dist/v1/hooks/use-tambo-v1-stream-status.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-suggestions.d.ts +7 -7
- package/dist/v1/hooks/use-tambo-v1-suggestions.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-suggestions.js +9 -9
- package/dist/v1/hooks/use-tambo-v1-suggestions.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-suggestions.test.js +44 -44
- package/dist/v1/hooks/use-tambo-v1-suggestions.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread-input.d.ts +3 -3
- package/dist/v1/hooks/use-tambo-v1-thread-input.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread-input.js +4 -4
- package/dist/v1/hooks/use-tambo-v1-thread-input.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread-input.test.js +29 -29
- package/dist/v1/hooks/use-tambo-v1-thread-input.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread-list.d.ts +4 -4
- package/dist/v1/hooks/use-tambo-v1-thread-list.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread-list.js +5 -5
- package/dist/v1/hooks/use-tambo-v1-thread-list.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread-list.test.js +13 -17
- package/dist/v1/hooks/use-tambo-v1-thread-list.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread.d.ts +3 -3
- package/dist/v1/hooks/use-tambo-v1-thread.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread.js +4 -4
- package/dist/v1/hooks/use-tambo-v1-thread.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread.test.js +5 -5
- package/dist/v1/hooks/use-tambo-v1-thread.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1.d.ts +16 -7
- package/dist/v1/hooks/use-tambo-v1.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1.js +41 -10
- package/dist/v1/hooks/use-tambo-v1.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1.test.js +176 -48
- package/dist/v1/hooks/use-tambo-v1.test.js.map +1 -1
- package/dist/v1/index.d.ts +31 -27
- package/dist/v1/index.d.ts.map +1 -1
- package/dist/v1/index.js +45 -35
- package/dist/v1/index.js.map +1 -1
- package/dist/v1/providers/tambo-v1-provider.d.ts +20 -20
- package/dist/v1/providers/tambo-v1-provider.d.ts.map +1 -1
- package/dist/v1/providers/tambo-v1-provider.js +32 -32
- package/dist/v1/providers/tambo-v1-provider.js.map +1 -1
- package/dist/v1/providers/tambo-v1-provider.test.js +22 -22
- package/dist/v1/providers/tambo-v1-provider.test.js.map +1 -1
- package/dist/v1/providers/tambo-v1-stream-context.d.ts +15 -15
- package/dist/v1/providers/tambo-v1-stream-context.d.ts.map +1 -1
- package/dist/v1/providers/tambo-v1-stream-context.js +17 -17
- package/dist/v1/providers/tambo-v1-stream-context.js.map +1 -1
- package/dist/v1/providers/tambo-v1-stream-context.test.js +9 -9
- package/dist/v1/providers/tambo-v1-stream-context.test.js.map +1 -1
- package/dist/v1/providers/tambo-v1-stub-provider.d.ts +9 -9
- package/dist/v1/providers/tambo-v1-stub-provider.d.ts.map +1 -1
- package/dist/v1/providers/tambo-v1-stub-provider.js +7 -7
- package/dist/v1/providers/tambo-v1-stub-provider.js.map +1 -1
- package/dist/v1/providers/tambo-v1-stub-provider.test.js +25 -25
- package/dist/v1/providers/tambo-v1-stub-provider.test.js.map +1 -1
- package/dist/v1/providers/tambo-v1-thread-input-provider.d.ts +9 -9
- package/dist/v1/providers/tambo-v1-thread-input-provider.d.ts.map +1 -1
- package/dist/v1/providers/tambo-v1-thread-input-provider.js +16 -16
- package/dist/v1/providers/tambo-v1-thread-input-provider.js.map +1 -1
- package/dist/v1/types/auth.d.ts +2 -2
- package/dist/v1/types/auth.d.ts.map +1 -1
- package/dist/v1/types/auth.js.map +1 -1
- package/dist/v1/types/component.d.ts +3 -3
- package/dist/v1/types/component.d.ts.map +1 -1
- package/dist/v1/types/component.js +2 -2
- package/dist/v1/types/component.js.map +1 -1
- package/dist/v1/types/event.d.ts +1 -1
- package/dist/v1/types/event.js +1 -1
- package/dist/v1/types/event.js.map +1 -1
- package/dist/v1/types/message.d.ts +17 -24
- package/dist/v1/types/message.d.ts.map +1 -1
- package/dist/v1/types/message.js +1 -1
- package/dist/v1/types/message.js.map +1 -1
- package/dist/v1/types/thread.d.ts +10 -8
- package/dist/v1/types/thread.d.ts.map +1 -1
- package/dist/v1/types/thread.js +1 -1
- package/dist/v1/types/thread.js.map +1 -1
- package/dist/v1/types/tool-choice.d.ts +1 -1
- package/dist/v1/types/tool-choice.js.map +1 -1
- package/dist/v1/utils/component-renderer.d.ts +11 -5
- package/dist/v1/utils/component-renderer.d.ts.map +1 -1
- package/dist/v1/utils/component-renderer.js +16 -7
- package/dist/v1/utils/component-renderer.js.map +1 -1
- package/dist/v1/utils/component-renderer.test.js +7 -7
- package/dist/v1/utils/component-renderer.test.js.map +1 -1
- package/dist/v1/utils/event-accumulator.d.ts +13 -13
- package/dist/v1/utils/event-accumulator.d.ts.map +1 -1
- package/dist/v1/utils/event-accumulator.js +26 -15
- package/dist/v1/utils/event-accumulator.js.map +1 -1
- package/dist/v1/utils/event-accumulator.test.js +54 -19
- package/dist/v1/utils/event-accumulator.test.js.map +1 -1
- package/dist/v1/utils/registry-conversion.d.ts +18 -18
- package/dist/v1/utils/registry-conversion.js +23 -23
- package/dist/v1/utils/registry-conversion.js.map +1 -1
- package/dist/v1/utils/stream-handler.d.ts +1 -1
- package/dist/v1/utils/stream-handler.js +1 -1
- package/dist/v1/utils/stream-handler.js.map +1 -1
- package/dist/v1/utils/thread-utils.d.ts +2 -2
- package/dist/v1/utils/thread-utils.d.ts.map +1 -1
- package/dist/v1/utils/thread-utils.js.map +1 -1
- package/dist/v1/utils/tool-call-tracker.d.ts +1 -1
- package/dist/v1/utils/tool-call-tracker.js +1 -1
- package/dist/v1/utils/tool-call-tracker.js.map +1 -1
- package/dist/v1/utils/tool-executor.d.ts +1 -1
- package/dist/v1/utils/tool-executor.js +2 -2
- package/dist/v1/utils/tool-executor.js.map +1 -1
- package/esm/hoc/with-tambo-interactable.d.ts.map +1 -1
- package/esm/hoc/with-tambo-interactable.js +13 -13
- package/esm/hoc/with-tambo-interactable.js.map +1 -1
- package/esm/hoc/with-tambo-interactable.test.js +1 -1
- package/esm/hoc/with-tambo-interactable.test.js.map +1 -1
- package/esm/index.d.ts +7 -25
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +7 -21
- package/esm/index.js.map +1 -1
- package/esm/mcp/mcp-hooks.js +1 -1
- package/esm/mcp/mcp-hooks.js.map +1 -1
- package/esm/model/component-metadata.d.ts +4 -4
- package/esm/model/component-metadata.js.map +1 -1
- package/esm/providers/tambo-client-provider.d.ts +6 -0
- package/esm/providers/tambo-client-provider.d.ts.map +1 -1
- package/esm/providers/tambo-client-provider.js +4 -2
- package/esm/providers/tambo-client-provider.js.map +1 -1
- package/esm/providers/tambo-interactable-provider.d.ts +1 -1
- package/esm/providers/tambo-interactables-additional-context-edge-cases.test.js +2 -10
- package/esm/providers/tambo-interactables-additional-context-edge-cases.test.js.map +1 -1
- package/esm/providers/tambo-interactables-additional-context.test.js +3 -19
- package/esm/providers/tambo-interactables-additional-context.test.js.map +1 -1
- package/esm/providers/tambo-mcp-token-provider.d.ts +8 -17
- package/esm/providers/tambo-mcp-token-provider.d.ts.map +1 -1
- package/esm/providers/tambo-mcp-token-provider.js +20 -97
- package/esm/providers/tambo-mcp-token-provider.js.map +1 -1
- package/esm/testing/tools.d.ts +3 -3
- package/esm/testing/tools.d.ts.map +1 -1
- package/esm/testing/tools.js.map +1 -1
- package/esm/util/registry-validators.js +1 -1
- package/esm/util/registry-validators.js.map +1 -1
- package/esm/v1/__tests__/v1-interactables.test.js +1 -1
- package/esm/v1/__tests__/v1-interactables.test.js.map +1 -1
- package/esm/v1/components/v1-component-renderer.d.ts +9 -9
- package/esm/v1/components/v1-component-renderer.d.ts.map +1 -1
- package/esm/v1/components/v1-component-renderer.js +12 -12
- package/esm/v1/components/v1-component-renderer.js.map +1 -1
- package/esm/v1/components/v1-component-renderer.test.js +16 -16
- package/esm/v1/components/v1-component-renderer.test.js.map +1 -1
- package/{dist/hooks/use-current-message.d.ts → esm/v1/hooks/use-tambo-current-message.d.ts} +30 -9
- package/esm/v1/hooks/use-tambo-current-message.d.ts.map +1 -0
- package/esm/{hooks/use-current-message.js → v1/hooks/use-tambo-current-message.js} +13 -8
- package/esm/v1/hooks/use-tambo-current-message.js.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-auth-state.d.ts +5 -5
- package/esm/v1/hooks/use-tambo-v1-auth-state.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-auth-state.js +8 -8
- package/esm/v1/hooks/use-tambo-v1-auth-state.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-auth-state.test.js +14 -14
- package/esm/v1/hooks/use-tambo-v1-auth-state.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-component-state.d.ts +7 -6
- package/esm/v1/hooks/use-tambo-v1-component-state.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-component-state.js +50 -24
- package/esm/v1/hooks/use-tambo-v1-component-state.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-component-state.test.js +62 -37
- package/esm/v1/hooks/use-tambo-v1-component-state.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-messages.d.ts +9 -9
- package/esm/v1/hooks/use-tambo-v1-messages.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-messages.js +3 -3
- package/esm/v1/hooks/use-tambo-v1-messages.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-messages.test.js +9 -9
- package/esm/v1/hooks/use-tambo-v1-messages.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-send-message.d.ts +3 -3
- package/esm/v1/hooks/use-tambo-v1-send-message.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-send-message.js +21 -23
- package/esm/v1/hooks/use-tambo-v1-send-message.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-send-message.test.js +54 -54
- package/esm/v1/hooks/use-tambo-v1-send-message.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-stream-status.d.ts +5 -5
- package/esm/v1/hooks/use-tambo-v1-stream-status.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-stream-status.js +12 -14
- package/esm/v1/hooks/use-tambo-v1-stream-status.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-stream-status.test.js +21 -21
- package/esm/v1/hooks/use-tambo-v1-stream-status.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-suggestions.d.ts +7 -7
- package/esm/v1/hooks/use-tambo-v1-suggestions.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-suggestions.js +11 -11
- package/esm/v1/hooks/use-tambo-v1-suggestions.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-suggestions.test.js +48 -48
- package/esm/v1/hooks/use-tambo-v1-suggestions.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-input.d.ts +3 -3
- package/esm/v1/hooks/use-tambo-v1-thread-input.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-input.js +3 -3
- package/esm/v1/hooks/use-tambo-v1-thread-input.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-input.test.js +32 -32
- package/esm/v1/hooks/use-tambo-v1-thread-input.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-list.d.ts +4 -4
- package/esm/v1/hooks/use-tambo-v1-thread-list.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-list.js +6 -6
- package/esm/v1/hooks/use-tambo-v1-thread-list.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-list.test.js +15 -19
- package/esm/v1/hooks/use-tambo-v1-thread-list.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread.d.ts +3 -3
- package/esm/v1/hooks/use-tambo-v1-thread.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread.js +4 -4
- package/esm/v1/hooks/use-tambo-v1-thread.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread.test.js +6 -6
- package/esm/v1/hooks/use-tambo-v1-thread.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1.d.ts +16 -7
- package/esm/v1/hooks/use-tambo-v1.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1.js +43 -12
- package/esm/v1/hooks/use-tambo-v1.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1.test.js +178 -50
- package/esm/v1/hooks/use-tambo-v1.test.js.map +1 -1
- package/esm/v1/index.d.ts +31 -27
- package/esm/v1/index.d.ts.map +1 -1
- package/esm/v1/index.js +38 -33
- package/esm/v1/index.js.map +1 -1
- package/esm/v1/providers/tambo-v1-provider.d.ts +20 -20
- package/esm/v1/providers/tambo-v1-provider.d.ts.map +1 -1
- package/esm/v1/providers/tambo-v1-provider.js +32 -32
- package/esm/v1/providers/tambo-v1-provider.js.map +1 -1
- package/esm/v1/providers/tambo-v1-provider.test.js +23 -23
- package/esm/v1/providers/tambo-v1-provider.test.js.map +1 -1
- package/esm/v1/providers/tambo-v1-stream-context.d.ts +15 -15
- package/esm/v1/providers/tambo-v1-stream-context.d.ts.map +1 -1
- package/esm/v1/providers/tambo-v1-stream-context.js +17 -17
- package/esm/v1/providers/tambo-v1-stream-context.js.map +1 -1
- package/esm/v1/providers/tambo-v1-stream-context.test.js +10 -10
- package/esm/v1/providers/tambo-v1-stream-context.test.js.map +1 -1
- package/esm/v1/providers/tambo-v1-stub-provider.d.ts +9 -9
- package/esm/v1/providers/tambo-v1-stub-provider.d.ts.map +1 -1
- package/esm/v1/providers/tambo-v1-stub-provider.js +9 -9
- package/esm/v1/providers/tambo-v1-stub-provider.js.map +1 -1
- package/esm/v1/providers/tambo-v1-stub-provider.test.js +28 -28
- package/esm/v1/providers/tambo-v1-stub-provider.test.js.map +1 -1
- package/esm/v1/providers/tambo-v1-thread-input-provider.d.ts +9 -9
- package/esm/v1/providers/tambo-v1-thread-input-provider.d.ts.map +1 -1
- package/esm/v1/providers/tambo-v1-thread-input-provider.js +15 -15
- package/esm/v1/providers/tambo-v1-thread-input-provider.js.map +1 -1
- package/esm/v1/types/auth.d.ts +2 -2
- package/esm/v1/types/auth.d.ts.map +1 -1
- package/esm/v1/types/auth.js.map +1 -1
- package/esm/v1/types/component.d.ts +3 -3
- package/esm/v1/types/component.d.ts.map +1 -1
- package/esm/v1/types/component.js +2 -2
- package/esm/v1/types/component.js.map +1 -1
- package/esm/v1/types/event.d.ts +1 -1
- package/esm/v1/types/event.js +1 -1
- package/esm/v1/types/event.js.map +1 -1
- package/esm/v1/types/message.d.ts +17 -24
- package/esm/v1/types/message.d.ts.map +1 -1
- package/esm/v1/types/message.js +1 -1
- package/esm/v1/types/message.js.map +1 -1
- package/esm/v1/types/thread.d.ts +10 -8
- package/esm/v1/types/thread.d.ts.map +1 -1
- package/esm/v1/types/thread.js +1 -1
- package/esm/v1/types/thread.js.map +1 -1
- package/esm/v1/types/tool-choice.d.ts +1 -1
- package/esm/v1/types/tool-choice.js.map +1 -1
- package/esm/v1/utils/component-renderer.d.ts +11 -5
- package/esm/v1/utils/component-renderer.d.ts.map +1 -1
- package/esm/v1/utils/component-renderer.js +13 -5
- package/esm/v1/utils/component-renderer.js.map +1 -1
- package/esm/v1/utils/component-renderer.test.js +8 -8
- package/esm/v1/utils/component-renderer.test.js.map +1 -1
- package/esm/v1/utils/event-accumulator.d.ts +13 -13
- package/esm/v1/utils/event-accumulator.d.ts.map +1 -1
- package/esm/v1/utils/event-accumulator.js +26 -15
- package/esm/v1/utils/event-accumulator.js.map +1 -1
- package/esm/v1/utils/event-accumulator.test.js +54 -19
- package/esm/v1/utils/event-accumulator.test.js.map +1 -1
- package/esm/v1/utils/registry-conversion.d.ts +18 -18
- package/esm/v1/utils/registry-conversion.js +23 -23
- package/esm/v1/utils/registry-conversion.js.map +1 -1
- package/esm/v1/utils/stream-handler.d.ts +1 -1
- package/esm/v1/utils/stream-handler.js +1 -1
- package/esm/v1/utils/stream-handler.js.map +1 -1
- package/esm/v1/utils/thread-utils.d.ts +2 -2
- package/esm/v1/utils/thread-utils.d.ts.map +1 -1
- package/esm/v1/utils/thread-utils.js.map +1 -1
- package/esm/v1/utils/tool-call-tracker.d.ts +1 -1
- package/esm/v1/utils/tool-call-tracker.js +1 -1
- package/esm/v1/utils/tool-call-tracker.js.map +1 -1
- package/esm/v1/utils/tool-executor.d.ts +1 -1
- package/esm/v1/utils/tool-executor.js +2 -2
- package/esm/v1/utils/tool-executor.js.map +1 -1
- package/package.json +4 -9
- package/dist/hooks/index.d.ts +0 -9
- package/dist/hooks/index.d.ts.map +0 -1
- package/dist/hooks/index.js +0 -34
- package/dist/hooks/index.js.map +0 -1
- package/dist/hooks/use-component-state.d.ts +0 -30
- package/dist/hooks/use-component-state.d.ts.map +0 -1
- package/dist/hooks/use-component-state.js +0 -139
- package/dist/hooks/use-component-state.js.map +0 -1
- package/dist/hooks/use-component-state.test.d.ts +0 -2
- package/dist/hooks/use-component-state.test.d.ts.map +0 -1
- package/dist/hooks/use-component-state.test.js +0 -406
- package/dist/hooks/use-component-state.test.js.map +0 -1
- package/dist/hooks/use-current-message.d.ts.map +0 -1
- package/dist/hooks/use-current-message.js.map +0 -1
- package/dist/hooks/use-current-message.test.d.ts +0 -2
- package/dist/hooks/use-current-message.test.d.ts.map +0 -1
- package/dist/hooks/use-current-message.test.js +0 -269
- package/dist/hooks/use-current-message.test.js.map +0 -1
- package/dist/hooks/use-streaming-props.d.ts +0 -11
- package/dist/hooks/use-streaming-props.d.ts.map +0 -1
- package/dist/hooks/use-streaming-props.js +0 -37
- package/dist/hooks/use-streaming-props.js.map +0 -1
- package/dist/hooks/use-suggestions.d.ts +0 -46
- package/dist/hooks/use-suggestions.d.ts.map +0 -1
- package/dist/hooks/use-suggestions.js +0 -118
- package/dist/hooks/use-suggestions.js.map +0 -1
- package/dist/hooks/use-suggestions.test.d.ts +0 -2
- package/dist/hooks/use-suggestions.test.d.ts.map +0 -1
- package/dist/hooks/use-suggestions.test.js +0 -247
- package/dist/hooks/use-suggestions.test.js.map +0 -1
- package/dist/hooks/use-tambo-stream-status.d.ts +0 -90
- package/dist/hooks/use-tambo-stream-status.d.ts.map +0 -1
- package/dist/hooks/use-tambo-stream-status.js +0 -213
- package/dist/hooks/use-tambo-stream-status.js.map +0 -1
- package/dist/hooks/use-tambo-stream-status.test.d.ts +0 -2
- package/dist/hooks/use-tambo-stream-status.test.d.ts.map +0 -1
- package/dist/hooks/use-tambo-stream-status.test.js +0 -378
- package/dist/hooks/use-tambo-stream-status.test.js.map +0 -1
- package/dist/hooks/use-tambo-threads.d.ts +0 -158
- package/dist/hooks/use-tambo-threads.d.ts.map +0 -1
- package/dist/hooks/use-tambo-threads.js +0 -45
- package/dist/hooks/use-tambo-threads.js.map +0 -1
- package/dist/hooks/use-tambo-threads.test.d.ts +0 -2
- package/dist/hooks/use-tambo-threads.test.d.ts.map +0 -1
- package/dist/hooks/use-tambo-threads.test.js +0 -214
- package/dist/hooks/use-tambo-threads.test.js.map +0 -1
- package/dist/model/generate-component-response.d.ts +0 -37
- package/dist/model/generate-component-response.d.ts.map +0 -1
- package/dist/model/generate-component-response.js +0 -29
- package/dist/model/generate-component-response.js.map +0 -1
- package/dist/model/tambo-thread.d.ts +0 -15
- package/dist/model/tambo-thread.d.ts.map +0 -1
- package/dist/model/tambo-thread.js +0 -3
- package/dist/model/tambo-thread.js.map +0 -1
- package/dist/providers/__tests__/thread-input-resource-resolution.test.d.ts +0 -2
- package/dist/providers/__tests__/thread-input-resource-resolution.test.d.ts.map +0 -1
- package/dist/providers/__tests__/thread-input-resource-resolution.test.js +0 -592
- package/dist/providers/__tests__/thread-input-resource-resolution.test.js.map +0 -1
- package/dist/providers/index.d.ts +0 -13
- package/dist/providers/index.d.ts.map +0 -1
- package/dist/providers/index.js +0 -41
- package/dist/providers/index.js.map +0 -1
- package/dist/providers/tambo-component-provider.d.ts +0 -23
- package/dist/providers/tambo-component-provider.d.ts.map +0 -1
- package/dist/providers/tambo-component-provider.js +0 -88
- package/dist/providers/tambo-component-provider.js.map +0 -1
- package/dist/providers/tambo-prop-stream-provider/index.d.ts +0 -19
- package/dist/providers/tambo-prop-stream-provider/index.d.ts.map +0 -1
- package/dist/providers/tambo-prop-stream-provider/index.js +0 -43
- package/dist/providers/tambo-prop-stream-provider/index.js.map +0 -1
- package/dist/providers/tambo-prop-stream-provider/pending.d.ts +0 -12
- package/dist/providers/tambo-prop-stream-provider/pending.d.ts.map +0 -1
- package/dist/providers/tambo-prop-stream-provider/pending.js +0 -31
- package/dist/providers/tambo-prop-stream-provider/pending.js.map +0 -1
- package/dist/providers/tambo-prop-stream-provider/provider.d.ts +0 -17
- package/dist/providers/tambo-prop-stream-provider/provider.d.ts.map +0 -1
- package/dist/providers/tambo-prop-stream-provider/provider.js +0 -107
- package/dist/providers/tambo-prop-stream-provider/provider.js.map +0 -1
- package/dist/providers/tambo-prop-stream-provider/streaming.d.ts +0 -12
- package/dist/providers/tambo-prop-stream-provider/streaming.d.ts.map +0 -1
- package/dist/providers/tambo-prop-stream-provider/streaming.js +0 -28
- package/dist/providers/tambo-prop-stream-provider/streaming.js.map +0 -1
- package/dist/providers/tambo-prop-stream-provider/success.d.ts +0 -12
- package/dist/providers/tambo-prop-stream-provider/success.d.ts.map +0 -1
- package/dist/providers/tambo-prop-stream-provider/success.js +0 -28
- package/dist/providers/tambo-prop-stream-provider/success.js.map +0 -1
- package/dist/providers/tambo-prop-stream-provider/types.d.ts +0 -25
- package/dist/providers/tambo-prop-stream-provider/types.d.ts.map +0 -1
- package/dist/providers/tambo-prop-stream-provider/types.js +0 -6
- package/dist/providers/tambo-prop-stream-provider/types.js.map +0 -1
- package/dist/providers/tambo-prop-stream-provider.test.d.ts +0 -2
- package/dist/providers/tambo-prop-stream-provider.test.d.ts.map +0 -1
- package/dist/providers/tambo-prop-stream-provider.test.js +0 -275
- package/dist/providers/tambo-prop-stream-provider.test.js.map +0 -1
- package/dist/providers/tambo-provider.d.ts +0 -53
- package/dist/providers/tambo-provider.d.ts.map +0 -1
- package/dist/providers/tambo-provider.js +0 -133
- package/dist/providers/tambo-provider.js.map +0 -1
- package/dist/providers/tambo-stubs.d.ts +0 -89
- package/dist/providers/tambo-stubs.d.ts.map +0 -1
- package/dist/providers/tambo-stubs.js +0 -279
- package/dist/providers/tambo-stubs.js.map +0 -1
- package/dist/providers/tambo-stubs.test.d.ts +0 -2
- package/dist/providers/tambo-stubs.test.d.ts.map +0 -1
- package/dist/providers/tambo-stubs.test.js +0 -97
- package/dist/providers/tambo-stubs.test.js.map +0 -1
- package/dist/providers/tambo-thread-input-provider.d.ts +0 -65
- package/dist/providers/tambo-thread-input-provider.d.ts.map +0 -1
- package/dist/providers/tambo-thread-input-provider.js +0 -179
- package/dist/providers/tambo-thread-input-provider.js.map +0 -1
- package/dist/providers/tambo-thread-provider-initial-messages.test.d.ts +0 -2
- package/dist/providers/tambo-thread-provider-initial-messages.test.d.ts.map +0 -1
- package/dist/providers/tambo-thread-provider-initial-messages.test.js +0 -278
- package/dist/providers/tambo-thread-provider-initial-messages.test.js.map +0 -1
- package/dist/providers/tambo-thread-provider.d.ts +0 -126
- package/dist/providers/tambo-thread-provider.d.ts.map +0 -1
- package/dist/providers/tambo-thread-provider.js +0 -931
- package/dist/providers/tambo-thread-provider.js.map +0 -1
- package/dist/providers/tambo-thread-provider.test.d.ts +0 -2
- package/dist/providers/tambo-thread-provider.test.d.ts.map +0 -1
- package/dist/providers/tambo-thread-provider.test.js +0 -1591
- package/dist/providers/tambo-thread-provider.test.js.map +0 -1
- package/dist/util/generate-component.d.ts +0 -12
- package/dist/util/generate-component.d.ts.map +0 -1
- package/dist/util/generate-component.js +0 -58
- package/dist/util/generate-component.js.map +0 -1
- package/dist/util/generate-component.test.d.ts +0 -2
- package/dist/util/generate-component.test.d.ts.map +0 -1
- package/dist/util/generate-component.test.js +0 -340
- package/dist/util/generate-component.test.js.map +0 -1
- package/esm/hooks/index.d.ts +0 -9
- package/esm/hooks/index.d.ts.map +0 -1
- package/esm/hooks/index.js +0 -10
- package/esm/hooks/index.js.map +0 -1
- package/esm/hooks/use-component-state.d.ts +0 -30
- package/esm/hooks/use-component-state.d.ts.map +0 -1
- package/esm/hooks/use-component-state.js +0 -136
- package/esm/hooks/use-component-state.js.map +0 -1
- package/esm/hooks/use-component-state.test.d.ts +0 -2
- package/esm/hooks/use-component-state.test.d.ts.map +0 -1
- package/esm/hooks/use-component-state.test.js +0 -401
- package/esm/hooks/use-component-state.test.js.map +0 -1
- package/esm/hooks/use-current-message.d.ts.map +0 -1
- package/esm/hooks/use-current-message.js.map +0 -1
- package/esm/hooks/use-current-message.test.d.ts +0 -2
- package/esm/hooks/use-current-message.test.d.ts.map +0 -1
- package/esm/hooks/use-current-message.test.js +0 -264
- package/esm/hooks/use-current-message.test.js.map +0 -1
- package/esm/hooks/use-streaming-props.d.ts +0 -11
- package/esm/hooks/use-streaming-props.d.ts.map +0 -1
- package/esm/hooks/use-streaming-props.js +0 -34
- package/esm/hooks/use-streaming-props.js.map +0 -1
- package/esm/hooks/use-suggestions.d.ts +0 -46
- package/esm/hooks/use-suggestions.d.ts.map +0 -1
- package/esm/hooks/use-suggestions.js +0 -115
- package/esm/hooks/use-suggestions.js.map +0 -1
- package/esm/hooks/use-suggestions.test.d.ts +0 -2
- package/esm/hooks/use-suggestions.test.d.ts.map +0 -1
- package/esm/hooks/use-suggestions.test.js +0 -245
- package/esm/hooks/use-suggestions.test.js.map +0 -1
- package/esm/hooks/use-tambo-stream-status.d.ts +0 -90
- package/esm/hooks/use-tambo-stream-status.d.ts.map +0 -1
- package/esm/hooks/use-tambo-stream-status.js +0 -210
- package/esm/hooks/use-tambo-stream-status.js.map +0 -1
- package/esm/hooks/use-tambo-stream-status.test.d.ts +0 -2
- package/esm/hooks/use-tambo-stream-status.test.d.ts.map +0 -1
- package/esm/hooks/use-tambo-stream-status.test.js +0 -376
- package/esm/hooks/use-tambo-stream-status.test.js.map +0 -1
- package/esm/hooks/use-tambo-threads.d.ts +0 -158
- package/esm/hooks/use-tambo-threads.d.ts.map +0 -1
- package/esm/hooks/use-tambo-threads.js +0 -42
- package/esm/hooks/use-tambo-threads.js.map +0 -1
- package/esm/hooks/use-tambo-threads.test.d.ts +0 -2
- package/esm/hooks/use-tambo-threads.test.d.ts.map +0 -1
- package/esm/hooks/use-tambo-threads.test.js +0 -212
- package/esm/hooks/use-tambo-threads.test.js.map +0 -1
- package/esm/model/generate-component-response.d.ts +0 -37
- package/esm/model/generate-component-response.d.ts.map +0 -1
- package/esm/model/generate-component-response.js +0 -25
- package/esm/model/generate-component-response.js.map +0 -1
- package/esm/model/tambo-thread.d.ts +0 -15
- package/esm/model/tambo-thread.d.ts.map +0 -1
- package/esm/model/tambo-thread.js +0 -2
- package/esm/model/tambo-thread.js.map +0 -1
- package/esm/providers/__tests__/thread-input-resource-resolution.test.d.ts +0 -2
- package/esm/providers/__tests__/thread-input-resource-resolution.test.d.ts.map +0 -1
- package/esm/providers/__tests__/thread-input-resource-resolution.test.js +0 -587
- package/esm/providers/__tests__/thread-input-resource-resolution.test.js.map +0 -1
- package/esm/providers/index.d.ts +0 -13
- package/esm/providers/index.d.ts.map +0 -1
- package/esm/providers/index.js +0 -11
- package/esm/providers/index.js.map +0 -1
- package/esm/providers/tambo-component-provider.d.ts +0 -23
- package/esm/providers/tambo-component-provider.d.ts.map +0 -1
- package/esm/providers/tambo-component-provider.js +0 -50
- package/esm/providers/tambo-component-provider.js.map +0 -1
- package/esm/providers/tambo-prop-stream-provider/index.d.ts +0 -19
- package/esm/providers/tambo-prop-stream-provider/index.d.ts.map +0 -1
- package/esm/providers/tambo-prop-stream-provider/index.js +0 -22
- package/esm/providers/tambo-prop-stream-provider/index.js.map +0 -1
- package/esm/providers/tambo-prop-stream-provider/pending.d.ts +0 -12
- package/esm/providers/tambo-prop-stream-provider/pending.d.ts.map +0 -1
- package/esm/providers/tambo-prop-stream-provider/pending.js +0 -24
- package/esm/providers/tambo-prop-stream-provider/pending.js.map +0 -1
- package/esm/providers/tambo-prop-stream-provider/provider.d.ts +0 -17
- package/esm/providers/tambo-prop-stream-provider/provider.d.ts.map +0 -1
- package/esm/providers/tambo-prop-stream-provider/provider.js +0 -70
- package/esm/providers/tambo-prop-stream-provider/provider.js.map +0 -1
- package/esm/providers/tambo-prop-stream-provider/streaming.d.ts +0 -12
- package/esm/providers/tambo-prop-stream-provider/streaming.d.ts.map +0 -1
- package/esm/providers/tambo-prop-stream-provider/streaming.js +0 -21
- package/esm/providers/tambo-prop-stream-provider/streaming.js.map +0 -1
- package/esm/providers/tambo-prop-stream-provider/success.d.ts +0 -12
- package/esm/providers/tambo-prop-stream-provider/success.d.ts.map +0 -1
- package/esm/providers/tambo-prop-stream-provider/success.js +0 -21
- package/esm/providers/tambo-prop-stream-provider/success.js.map +0 -1
- package/esm/providers/tambo-prop-stream-provider/types.d.ts +0 -25
- package/esm/providers/tambo-prop-stream-provider/types.d.ts.map +0 -1
- package/esm/providers/tambo-prop-stream-provider/types.js +0 -3
- package/esm/providers/tambo-prop-stream-provider/types.js.map +0 -1
- package/esm/providers/tambo-prop-stream-provider.test.d.ts +0 -2
- package/esm/providers/tambo-prop-stream-provider.test.d.ts.map +0 -1
- package/esm/providers/tambo-prop-stream-provider.test.js +0 -270
- package/esm/providers/tambo-prop-stream-provider.test.js.map +0 -1
- package/esm/providers/tambo-provider.d.ts +0 -53
- package/esm/providers/tambo-provider.d.ts.map +0 -1
- package/esm/providers/tambo-provider.js +0 -94
- package/esm/providers/tambo-provider.js.map +0 -1
- package/esm/providers/tambo-stubs.d.ts +0 -89
- package/esm/providers/tambo-stubs.d.ts.map +0 -1
- package/esm/providers/tambo-stubs.js +0 -242
- package/esm/providers/tambo-stubs.js.map +0 -1
- package/esm/providers/tambo-stubs.test.d.ts +0 -2
- package/esm/providers/tambo-stubs.test.d.ts.map +0 -1
- package/esm/providers/tambo-stubs.test.js +0 -62
- package/esm/providers/tambo-stubs.test.js.map +0 -1
- package/esm/providers/tambo-thread-input-provider.d.ts +0 -65
- package/esm/providers/tambo-thread-input-provider.d.ts.map +0 -1
- package/esm/providers/tambo-thread-input-provider.js +0 -141
- package/esm/providers/tambo-thread-input-provider.js.map +0 -1
- package/esm/providers/tambo-thread-provider-initial-messages.test.d.ts +0 -2
- package/esm/providers/tambo-thread-provider-initial-messages.test.d.ts.map +0 -1
- package/esm/providers/tambo-thread-provider-initial-messages.test.js +0 -273
- package/esm/providers/tambo-thread-provider-initial-messages.test.js.map +0 -1
- package/esm/providers/tambo-thread-provider.d.ts +0 -126
- package/esm/providers/tambo-thread-provider.d.ts.map +0 -1
- package/esm/providers/tambo-thread-provider.js +0 -891
- package/esm/providers/tambo-thread-provider.js.map +0 -1
- package/esm/providers/tambo-thread-provider.test.d.ts +0 -2
- package/esm/providers/tambo-thread-provider.test.d.ts.map +0 -1
- package/esm/providers/tambo-thread-provider.test.js +0 -1553
- package/esm/providers/tambo-thread-provider.test.js.map +0 -1
- package/esm/util/generate-component.d.ts +0 -12
- package/esm/util/generate-component.d.ts.map +0 -1
- package/esm/util/generate-component.js +0 -52
- package/esm/util/generate-component.js.map +0 -1
- package/esm/util/generate-component.test.d.ts +0 -2
- package/esm/util/generate-component.test.d.ts.map +0 -1
- package/esm/util/generate-component.test.js +0 -302
- package/esm/util/generate-component.test.js.map +0 -1
|
@@ -1,6 +1,23 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import {
|
|
3
|
-
|
|
2
|
+
import type { InteractableConfig } from "../../hoc/with-tambo-interactable.js";
|
|
3
|
+
import type { TamboThreadMessage } from "../types/message.js";
|
|
4
|
+
/**
|
|
5
|
+
* Metadata for interactable components.
|
|
6
|
+
* Used when a component is wrapped with withTamboInteractable.
|
|
7
|
+
*/
|
|
8
|
+
export interface InteractableMetadata extends InteractableConfig {
|
|
9
|
+
/** Unique identifier for this interactable instance */
|
|
10
|
+
id: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Message with optional interactable metadata merged in by the provider.
|
|
14
|
+
* Used as the context type so consumers can access both the message and
|
|
15
|
+
* any interactable information attached by withTamboInteractable.
|
|
16
|
+
*/
|
|
17
|
+
type MessageWithMetadata = TamboThreadMessage & {
|
|
18
|
+
interactableMetadata?: InteractableMetadata;
|
|
19
|
+
};
|
|
20
|
+
export declare const TamboMessageContext: React.Context<MessageWithMetadata | null>;
|
|
4
21
|
export interface TamboMessageProviderProps {
|
|
5
22
|
children: React.ReactNode;
|
|
6
23
|
message: TamboThreadMessage;
|
|
@@ -8,9 +25,9 @@ export interface TamboMessageProviderProps {
|
|
|
8
25
|
interactableMetadata?: InteractableMetadata;
|
|
9
26
|
}
|
|
10
27
|
/**
|
|
11
|
-
* Wraps all components
|
|
28
|
+
* Wraps all components so that they can find what message they are in.
|
|
12
29
|
* Also supports optional interactable metadata for components wrapped with withInteractable.
|
|
13
|
-
* @param props -
|
|
30
|
+
* @param props - Props for the TamboMessageProvider
|
|
14
31
|
* @param props.children - The children to wrap
|
|
15
32
|
* @param props.message - The message object
|
|
16
33
|
* @param props.interactableMetadata - Optional interactable component metadata
|
|
@@ -19,7 +36,7 @@ export interface TamboMessageProviderProps {
|
|
|
19
36
|
export declare const TamboMessageProvider: React.FC<TamboMessageProviderProps>;
|
|
20
37
|
/**
|
|
21
38
|
* Wraps a component with a TamboMessageProvider - this allows the provider
|
|
22
|
-
* to be used outside of a TSX file
|
|
39
|
+
* to be used outside of a TSX file.
|
|
23
40
|
* @param children - The children to wrap
|
|
24
41
|
* @param message - The message object
|
|
25
42
|
* @param interactableMetadata - Optional interactable metadata
|
|
@@ -31,7 +48,7 @@ export declare function wrapWithTamboMessageProvider(children: React.ReactNode,
|
|
|
31
48
|
* the current message.
|
|
32
49
|
* @returns The current message that is used to render the component
|
|
33
50
|
*/
|
|
34
|
-
export declare const useTamboCurrentMessage: () =>
|
|
51
|
+
export declare const useTamboCurrentMessage: () => MessageWithMetadata;
|
|
35
52
|
/**
|
|
36
53
|
* Component info extracted from the current message and interactable context.
|
|
37
54
|
* Provides a unified interface for accessing component metadata.
|
|
@@ -40,18 +57,21 @@ export interface TamboCurrentComponent {
|
|
|
40
57
|
/** Component name from the message */
|
|
41
58
|
componentName?: string;
|
|
42
59
|
/** Component props from the message */
|
|
43
|
-
props?: Record<string,
|
|
60
|
+
props?: Record<string, unknown>;
|
|
44
61
|
/** Interactable ID (only present for components wrapped with withInteractable) */
|
|
45
62
|
interactableId?: string;
|
|
46
63
|
/** Description (only present for components wrapped with withInteractable) */
|
|
47
64
|
description?: string;
|
|
48
|
-
/** Thread ID
|
|
65
|
+
/** Thread ID (not available on messages directly) */
|
|
49
66
|
threadId?: string;
|
|
50
67
|
}
|
|
51
68
|
/**
|
|
52
69
|
* Hook to access the current component information from the message context.
|
|
53
70
|
* Provides a unified interface for both AI-generated and interactable components.
|
|
54
71
|
*
|
|
72
|
+
* Component info is derived from content blocks rather than
|
|
73
|
+
* top-level message fields.
|
|
74
|
+
*
|
|
55
75
|
* **Use this hook when you need component metadata regardless of the context.**
|
|
56
76
|
* @returns Component info including name, props, and interactable metadata if available, or null if used outside TamboMessageProvider
|
|
57
77
|
* @example
|
|
@@ -71,4 +91,5 @@ export interface TamboCurrentComponent {
|
|
|
71
91
|
* ```
|
|
72
92
|
*/
|
|
73
93
|
export declare const useTamboCurrentComponent: () => TamboCurrentComponent | null;
|
|
74
|
-
|
|
94
|
+
export {};
|
|
95
|
+
//# sourceMappingURL=use-tambo-current-message.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-tambo-current-message.d.ts","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-current-message.tsx"],"names":[],"mappings":"AACA,OAAO,KAAoC,MAAM,OAAO,CAAC;AACzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAC5E,OAAO,KAAK,EACV,kBAAkB,EAEnB,MAAM,kBAAkB,CAAC;AAE1B;;;GAGG;AACH,MAAM,WAAW,oBAAqB,SAAQ,kBAAkB;IAC9D,uDAAuD;IACvD,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;;;GAIG;AACH,KAAK,mBAAmB,GAAG,kBAAkB,GAAG;IAC9C,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC7C,CAAC;AAEF,eAAO,MAAM,mBAAmB,2CAE/B,CAAC;AAEF,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,OAAO,EAAE,kBAAkB,CAAC;IAC5B,kFAAkF;IAClF,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC7C;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,EAAE,KAAK,CAAC,EAAE,CAAC,yBAAyB,CAkBpE,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,KAAK,CAAC,SAAS,EACzB,OAAO,EAAE,kBAAkB,EAC3B,oBAAoB,CAAC,EAAE,oBAAoB,qBAU5C;AAED;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,2BAQlC,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,sCAAsC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,kFAAkF;IAClF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,wBAAwB,QAAO,qBAAqB,GAAG,IAsBnE,CAAC"}
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
import React, { createContext, useContext } from "react";
|
|
3
3
|
export const TamboMessageContext = createContext(null);
|
|
4
4
|
/**
|
|
5
|
-
* Wraps all components
|
|
5
|
+
* Wraps all components so that they can find what message they are in.
|
|
6
6
|
* Also supports optional interactable metadata for components wrapped with withInteractable.
|
|
7
|
-
* @param props -
|
|
7
|
+
* @param props - Props for the TamboMessageProvider
|
|
8
8
|
* @param props.children - The children to wrap
|
|
9
9
|
* @param props.message - The message object
|
|
10
10
|
* @param props.interactableMetadata - Optional interactable component metadata
|
|
@@ -16,13 +16,13 @@ export const TamboMessageProvider = ({ children, message, interactableMetadata,
|
|
|
16
16
|
? { ...message, interactableMetadata }
|
|
17
17
|
: message;
|
|
18
18
|
// Use a unique key={...} to force a re-render when the message changes - this
|
|
19
|
-
//
|
|
19
|
+
// makes sure that if the rendered component is swapped into a tree (like if
|
|
20
20
|
// you always show the last rendered component) then the state/etc is correct
|
|
21
21
|
return (React.createElement(TamboMessageContext.Provider, { value: enhancedMessage, key: message.id }, children));
|
|
22
22
|
};
|
|
23
23
|
/**
|
|
24
24
|
* Wraps a component with a TamboMessageProvider - this allows the provider
|
|
25
|
-
* to be used outside of a TSX file
|
|
25
|
+
* to be used outside of a TSX file.
|
|
26
26
|
* @param children - The children to wrap
|
|
27
27
|
* @param message - The message object
|
|
28
28
|
* @param interactableMetadata - Optional interactable metadata
|
|
@@ -47,6 +47,9 @@ export const useTamboCurrentMessage = () => {
|
|
|
47
47
|
* Hook to access the current component information from the message context.
|
|
48
48
|
* Provides a unified interface for both AI-generated and interactable components.
|
|
49
49
|
*
|
|
50
|
+
* Component info is derived from content blocks rather than
|
|
51
|
+
* top-level message fields.
|
|
52
|
+
*
|
|
50
53
|
* **Use this hook when you need component metadata regardless of the context.**
|
|
51
54
|
* @returns Component info including name, props, and interactable metadata if available, or null if used outside TamboMessageProvider
|
|
52
55
|
* @example
|
|
@@ -70,14 +73,16 @@ export const useTamboCurrentComponent = () => {
|
|
|
70
73
|
if (!message) {
|
|
71
74
|
return null;
|
|
72
75
|
}
|
|
76
|
+
// Find first component content block
|
|
77
|
+
const componentContent = message.content.find((c) => c.type === "component");
|
|
73
78
|
return {
|
|
74
79
|
componentName: message.interactableMetadata?.componentName ??
|
|
75
|
-
|
|
80
|
+
componentContent?.name ??
|
|
76
81
|
undefined,
|
|
77
|
-
props:
|
|
82
|
+
props: componentContent?.props,
|
|
78
83
|
interactableId: message.interactableMetadata?.id ?? undefined,
|
|
79
84
|
description: message.interactableMetadata?.description ?? undefined,
|
|
80
|
-
threadId:
|
|
85
|
+
threadId: undefined, // Messages don't carry threadId
|
|
81
86
|
};
|
|
82
87
|
};
|
|
83
|
-
//# sourceMappingURL=use-current-message.js.map
|
|
88
|
+
//# sourceMappingURL=use-tambo-current-message.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-tambo-current-message.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-current-message.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;AACb,OAAO,KAAK,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAyBzD,MAAM,CAAC,MAAM,mBAAmB,GAAG,aAAa,CAC9C,IAAI,CACL,CAAC;AASF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAwC,CAAC,EACxE,QAAQ,EACR,OAAO,EACP,oBAAoB,GACrB,EAAE,EAAE;IACH,uDAAuD;IACvD,MAAM,eAAe,GAAwB,oBAAoB;QAC/D,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,oBAAoB,EAAE;QACtC,CAAC,CAAC,OAAO,CAAC;IAEZ,8EAA8E;IAC9E,4EAA4E;IAC5E,6EAA6E;IAC7E,OAAO,CACL,oBAAC,mBAAmB,CAAC,QAAQ,IAAC,KAAK,EAAE,eAAe,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,IAClE,QAAQ,CACoB,CAChC,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,UAAU,4BAA4B,CAC1C,QAAyB,EACzB,OAA2B,EAC3B,oBAA2C;IAE3C,OAAO,CACL,oBAAC,oBAAoB,IACnB,OAAO,EAAE,OAAO,EAChB,oBAAoB,EAAE,oBAAoB,IAEzC,QAAQ,CACY,CACxB,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,EAAE;IACzC,MAAM,OAAO,GAAG,UAAU,CAAC,mBAAmB,CAAC,CAAC;IAChD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,mEAAmE,CACpE,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAmBF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAiC,EAAE;IACzE,MAAM,OAAO,GAAG,UAAU,CAAC,mBAAmB,CAAC,CAAC;IAEhD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED,qCAAqC;IACrC,MAAM,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAC3C,CAAC,CAAC,EAA8B,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAC1D,CAAC;IAEF,OAAO;QACL,aAAa,EACX,OAAO,CAAC,oBAAoB,EAAE,aAAa;YAC3C,gBAAgB,EAAE,IAAI;YACtB,SAAS;QACX,KAAK,EAAE,gBAAgB,EAAE,KAA4C;QACrE,cAAc,EAAE,OAAO,CAAC,oBAAoB,EAAE,EAAE,IAAI,SAAS;QAC7D,WAAW,EAAE,OAAO,CAAC,oBAAoB,EAAE,WAAW,IAAI,SAAS;QACnE,QAAQ,EAAE,SAAS,EAAE,gCAAgC;KACtD,CAAC;AACJ,CAAC,CAAC","sourcesContent":["\"use client\";\nimport React, { createContext, useContext } from \"react\";\nimport type { InteractableConfig } from \"../../hoc/with-tambo-interactable\";\nimport type {\n TamboThreadMessage,\n TamboComponentContent,\n} from \"../types/message\";\n\n/**\n * Metadata for interactable components.\n * Used when a component is wrapped with withTamboInteractable.\n */\nexport interface InteractableMetadata extends InteractableConfig {\n /** Unique identifier for this interactable instance */\n id: string;\n}\n\n/**\n * Message with optional interactable metadata merged in by the provider.\n * Used as the context type so consumers can access both the message and\n * any interactable information attached by withTamboInteractable.\n */\ntype MessageWithMetadata = TamboThreadMessage & {\n interactableMetadata?: InteractableMetadata;\n};\n\nexport const TamboMessageContext = createContext<MessageWithMetadata | null>(\n null,\n);\n\nexport interface TamboMessageProviderProps {\n children: React.ReactNode;\n message: TamboThreadMessage;\n /** Optional interactable metadata for components wrapped with withInteractable */\n interactableMetadata?: InteractableMetadata;\n}\n\n/**\n * Wraps all components so that they can find what message they are in.\n * Also supports optional interactable metadata for components wrapped with withInteractable.\n * @param props - Props for the TamboMessageProvider\n * @param props.children - The children to wrap\n * @param props.message - The message object\n * @param props.interactableMetadata - Optional interactable component metadata\n * @returns The wrapped component\n */\nexport const TamboMessageProvider: React.FC<TamboMessageProviderProps> = ({\n children,\n message,\n interactableMetadata,\n}) => {\n // Merge interactable metadata into message if provided\n const enhancedMessage: MessageWithMetadata = interactableMetadata\n ? { ...message, interactableMetadata }\n : message;\n\n // Use a unique key={...} to force a re-render when the message changes - this\n // makes sure that if the rendered component is swapped into a tree (like if\n // you always show the last rendered component) then the state/etc is correct\n return (\n <TamboMessageContext.Provider value={enhancedMessage} key={message.id}>\n {children}\n </TamboMessageContext.Provider>\n );\n};\n\n/**\n * Wraps a component with a TamboMessageProvider - this allows the provider\n * to be used outside of a TSX file.\n * @param children - The children to wrap\n * @param message - The message object\n * @param interactableMetadata - Optional interactable metadata\n * @returns The wrapped component\n */\nexport function wrapWithTamboMessageProvider(\n children: React.ReactNode,\n message: TamboThreadMessage,\n interactableMetadata?: InteractableMetadata,\n) {\n return (\n <TamboMessageProvider\n message={message}\n interactableMetadata={interactableMetadata}\n >\n {children}\n </TamboMessageProvider>\n );\n}\n\n/**\n * Hook used inside a component wrapped with TamboMessageProvider, to get\n * the current message.\n * @returns The current message that is used to render the component\n */\nexport const useTamboCurrentMessage = () => {\n const message = useContext(TamboMessageContext);\n if (!message) {\n throw new Error(\n \"useTamboCurrentMessage must be used within a TamboMessageProvider\",\n );\n }\n return message;\n};\n\n/**\n * Component info extracted from the current message and interactable context.\n * Provides a unified interface for accessing component metadata.\n */\nexport interface TamboCurrentComponent {\n /** Component name from the message */\n componentName?: string;\n /** Component props from the message */\n props?: Record<string, unknown>;\n /** Interactable ID (only present for components wrapped with withInteractable) */\n interactableId?: string;\n /** Description (only present for components wrapped with withInteractable) */\n description?: string;\n /** Thread ID (not available on messages directly) */\n threadId?: string;\n}\n\n/**\n * Hook to access the current component information from the message context.\n * Provides a unified interface for both AI-generated and interactable components.\n *\n * Component info is derived from content blocks rather than\n * top-level message fields.\n *\n * **Use this hook when you need component metadata regardless of the context.**\n * @returns Component info including name, props, and interactable metadata if available, or null if used outside TamboMessageProvider\n * @example\n * ```tsx\n * function MyInlineEditor() {\n * const component = useTamboCurrentComponent();\n *\n * if (!component) return null; // Not inside a component\n *\n * return (\n * <div>\n * Editing: {component.componentName}\n * {component.interactableId && <span>ID: {component.interactableId}</span>}\n * </div>\n * );\n * }\n * ```\n */\nexport const useTamboCurrentComponent = (): TamboCurrentComponent | null => {\n const message = useContext(TamboMessageContext);\n\n if (!message) {\n return null;\n }\n\n // Find first component content block\n const componentContent = message.content.find(\n (c): c is TamboComponentContent => c.type === \"component\",\n );\n\n return {\n componentName:\n message.interactableMetadata?.componentName ??\n componentContent?.name ??\n undefined,\n props: componentContent?.props as Record<string, unknown> | undefined,\n interactableId: message.interactableMetadata?.id ?? undefined,\n description: message.interactableMetadata?.description ?? undefined,\n threadId: undefined, // Messages don't carry threadId\n };\n};\n"]}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { TamboAuthState } from "../types/auth.js";
|
|
2
2
|
/**
|
|
3
|
-
* Hook to compute the current authentication state for the
|
|
3
|
+
* Hook to compute the current authentication state for the SDK.
|
|
4
4
|
*
|
|
5
|
-
* Reads from TamboClientContext and
|
|
5
|
+
* Reads from TamboClientContext and TamboConfigContext to determine
|
|
6
6
|
* whether the SDK is ready to make API calls.
|
|
7
7
|
* @returns The current auth state as a discriminated union
|
|
8
|
-
* @throws {Error} If used outside
|
|
8
|
+
* @throws {Error} If used outside TamboProvider
|
|
9
9
|
*/
|
|
10
|
-
export declare function
|
|
10
|
+
export declare function useTamboAuthState(): TamboAuthState;
|
|
11
11
|
//# sourceMappingURL=use-tambo-v1-auth-state.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-tambo-v1-auth-state.d.ts","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-auth-state.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"use-tambo-v1-auth-state.d.ts","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-auth-state.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,CAqClD"}
|
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { useContext } from "react";
|
|
3
3
|
import { TamboClientContext } from "../../providers/tambo-client-provider.js";
|
|
4
|
-
import {
|
|
4
|
+
import { TamboConfigContext } from "../providers/tambo-v1-provider.js";
|
|
5
5
|
/**
|
|
6
|
-
* Hook to compute the current authentication state for the
|
|
6
|
+
* Hook to compute the current authentication state for the SDK.
|
|
7
7
|
*
|
|
8
|
-
* Reads from TamboClientContext and
|
|
8
|
+
* Reads from TamboClientContext and TamboConfigContext to determine
|
|
9
9
|
* whether the SDK is ready to make API calls.
|
|
10
10
|
* @returns The current auth state as a discriminated union
|
|
11
|
-
* @throws {Error} If used outside
|
|
11
|
+
* @throws {Error} If used outside TamboProvider
|
|
12
12
|
*/
|
|
13
|
-
export function
|
|
13
|
+
export function useTamboAuthState() {
|
|
14
14
|
const clientContext = useContext(TamboClientContext);
|
|
15
15
|
if (!clientContext) {
|
|
16
|
-
throw new Error("
|
|
16
|
+
throw new Error("useTamboAuthState must be used within TamboProvider");
|
|
17
17
|
}
|
|
18
|
-
const config = useContext(
|
|
18
|
+
const config = useContext(TamboConfigContext);
|
|
19
19
|
if (!config) {
|
|
20
|
-
throw new Error("
|
|
20
|
+
throw new Error("useTamboAuthState must be used within TamboProvider");
|
|
21
21
|
}
|
|
22
22
|
const { tokenExchangeError, userToken, hasValidToken } = clientContext;
|
|
23
23
|
const { userKey } = config;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-tambo-v1-auth-state.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-auth-state.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"use-tambo-v1-auth-state.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-auth-state.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAGpE;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,aAAa,GAAG,UAAU,CAAC,kBAAkB,CAAC,CAAC;IACrD,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,CAAC,kBAAkB,CAAC,CAAC;IAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,EAAE,kBAAkB,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,aAAa,CAAC;IACvE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAE3B,+CAA+C;IAC/C,IAAI,OAAO,IAAI,SAAS,EAAE,CAAC;QACzB,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC/B,CAAC;IAED,yBAAyB;IACzB,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IACrD,CAAC;IAED,2BAA2B;IAC3B,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,kBAAkB,EAAE,CAAC;YACvB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC;QACxD,CAAC;QACD,IAAI,aAAa,EAAE,CAAC;YAClB,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;QAC3D,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;IAClC,CAAC;IAED,mBAAmB;IACnB,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;AACvC,CAAC","sourcesContent":["\"use client\";\n\nimport { useContext } from \"react\";\nimport { TamboClientContext } from \"../../providers/tambo-client-provider\";\nimport { TamboConfigContext } from \"../providers/tambo-v1-provider\";\nimport type { TamboAuthState } from \"../types/auth\";\n\n/**\n * Hook to compute the current authentication state for the SDK.\n *\n * Reads from TamboClientContext and TamboConfigContext to determine\n * whether the SDK is ready to make API calls.\n * @returns The current auth state as a discriminated union\n * @throws {Error} If used outside TamboProvider\n */\nexport function useTamboAuthState(): TamboAuthState {\n const clientContext = useContext(TamboClientContext);\n if (!clientContext) {\n throw new Error(\"useTamboAuthState must be used within TamboProvider\");\n }\n\n const config = useContext(TamboConfigContext);\n if (!config) {\n throw new Error(\"useTamboAuthState must be used within TamboProvider\");\n }\n\n const { tokenExchangeError, userToken, hasValidToken } = clientContext;\n const { userKey } = config;\n\n // Invalid: both userKey AND userToken provided\n if (userKey && userToken) {\n return { status: \"invalid\" };\n }\n\n // Identified via userKey\n if (userKey) {\n return { status: \"identified\", source: \"userKey\" };\n }\n\n // Token exchange scenarios\n if (userToken) {\n if (tokenExchangeError) {\n return { status: \"error\", error: tokenExchangeError };\n }\n if (hasValidToken) {\n return { status: \"identified\", source: \"tokenExchange\" };\n }\n return { status: \"exchanging\" };\n }\n\n // Neither provided\n return { status: \"unauthenticated\" };\n}\n"]}
|
|
@@ -2,8 +2,8 @@ import { renderHook } from "@testing-library/react";
|
|
|
2
2
|
import React from "react";
|
|
3
3
|
import { QueryClient } from "@tanstack/react-query";
|
|
4
4
|
import { TamboClientContext } from "../../providers/tambo-client-provider.js";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
5
|
+
import { TamboConfigContext, } from "../providers/tambo-v1-provider.js";
|
|
6
|
+
import { useTamboAuthState } from "./use-tambo-v1-auth-state.js";
|
|
7
7
|
function createWrapper(clientOverrides, configOverrides = {}) {
|
|
8
8
|
const clientContext = {
|
|
9
9
|
client: {},
|
|
@@ -19,13 +19,13 @@ function createWrapper(clientOverrides, configOverrides = {}) {
|
|
|
19
19
|
...configOverrides,
|
|
20
20
|
};
|
|
21
21
|
function Wrapper({ children }) {
|
|
22
|
-
return React.createElement(TamboClientContext.Provider, { value: clientContext }, React.createElement(
|
|
22
|
+
return React.createElement(TamboClientContext.Provider, { value: clientContext }, React.createElement(TamboConfigContext.Provider, { value: config }, children));
|
|
23
23
|
}
|
|
24
24
|
return Wrapper;
|
|
25
25
|
}
|
|
26
|
-
describe("
|
|
26
|
+
describe("useTamboAuthState", () => {
|
|
27
27
|
it("returns 'identified' with source 'userKey' when only userKey is provided", () => {
|
|
28
|
-
const { result } = renderHook(() =>
|
|
28
|
+
const { result } = renderHook(() => useTamboAuthState(), {
|
|
29
29
|
wrapper: createWrapper({}, { userKey: "user_123" }),
|
|
30
30
|
});
|
|
31
31
|
expect(result.current).toEqual({
|
|
@@ -34,7 +34,7 @@ describe("useTamboV1AuthState", () => {
|
|
|
34
34
|
});
|
|
35
35
|
});
|
|
36
36
|
it("returns 'identified' with source 'tokenExchange' when token exchange succeeded", () => {
|
|
37
|
-
const { result } = renderHook(() =>
|
|
37
|
+
const { result } = renderHook(() => useTamboAuthState(), {
|
|
38
38
|
wrapper: createWrapper({
|
|
39
39
|
userToken: "oauth_token",
|
|
40
40
|
hasValidToken: true,
|
|
@@ -46,7 +46,7 @@ describe("useTamboV1AuthState", () => {
|
|
|
46
46
|
});
|
|
47
47
|
});
|
|
48
48
|
it("returns 'exchanging' when userToken provided but exchange not yet complete", () => {
|
|
49
|
-
const { result } = renderHook(() =>
|
|
49
|
+
const { result } = renderHook(() => useTamboAuthState(), {
|
|
50
50
|
wrapper: createWrapper({
|
|
51
51
|
userToken: "oauth_token",
|
|
52
52
|
hasValidToken: false,
|
|
@@ -56,7 +56,7 @@ describe("useTamboV1AuthState", () => {
|
|
|
56
56
|
});
|
|
57
57
|
it("returns 'error' when token exchange failed", () => {
|
|
58
58
|
const exchangeError = new Error("Token exchange failed");
|
|
59
|
-
const { result } = renderHook(() =>
|
|
59
|
+
const { result } = renderHook(() => useTamboAuthState(), {
|
|
60
60
|
wrapper: createWrapper({
|
|
61
61
|
userToken: "oauth_token",
|
|
62
62
|
tokenExchangeError: exchangeError,
|
|
@@ -69,22 +69,22 @@ describe("useTamboV1AuthState", () => {
|
|
|
69
69
|
});
|
|
70
70
|
});
|
|
71
71
|
it("returns 'invalid' when both userKey and userToken are provided", () => {
|
|
72
|
-
const { result } = renderHook(() =>
|
|
72
|
+
const { result } = renderHook(() => useTamboAuthState(), {
|
|
73
73
|
wrapper: createWrapper({ userToken: "oauth_token" }, { userKey: "user_123" }),
|
|
74
74
|
});
|
|
75
75
|
expect(result.current).toEqual({ status: "invalid" });
|
|
76
76
|
});
|
|
77
77
|
it("returns 'unauthenticated' when neither userKey nor userToken is provided", () => {
|
|
78
|
-
const { result } = renderHook(() =>
|
|
78
|
+
const { result } = renderHook(() => useTamboAuthState(), {
|
|
79
79
|
wrapper: createWrapper({}),
|
|
80
80
|
});
|
|
81
81
|
expect(result.current).toEqual({ status: "unauthenticated" });
|
|
82
82
|
});
|
|
83
83
|
it("throws when used outside TamboClientContext", () => {
|
|
84
|
-
const wrapper = ({ children }) => React.createElement(
|
|
85
|
-
expect(() => renderHook(() =>
|
|
84
|
+
const wrapper = ({ children }) => React.createElement(TamboConfigContext.Provider, { value: { userKey: "x" } }, children);
|
|
85
|
+
expect(() => renderHook(() => useTamboAuthState(), { wrapper })).toThrow("useTamboAuthState must be used within TamboProvider");
|
|
86
86
|
});
|
|
87
|
-
it("throws when used outside
|
|
87
|
+
it("throws when used outside TamboConfigContext", () => {
|
|
88
88
|
const clientContext = {
|
|
89
89
|
client: {},
|
|
90
90
|
queryClient: new QueryClient(),
|
|
@@ -94,7 +94,7 @@ describe("useTamboV1AuthState", () => {
|
|
|
94
94
|
hasValidToken: false,
|
|
95
95
|
};
|
|
96
96
|
const wrapper = ({ children }) => React.createElement(TamboClientContext.Provider, { value: clientContext }, children);
|
|
97
|
-
expect(() => renderHook(() =>
|
|
97
|
+
expect(() => renderHook(() => useTamboAuthState(), { wrapper })).toThrow("useTamboAuthState must be used within TamboProvider");
|
|
98
98
|
});
|
|
99
99
|
});
|
|
100
100
|
//# sourceMappingURL=use-tambo-v1-auth-state.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-tambo-v1-auth-state.test.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-auth-state.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAE3E,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"use-tambo-v1-auth-state.test.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-auth-state.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { renderHook } from \"@testing-library/react\";\nimport React from \"react\";\nimport { QueryClient } from \"@tanstack/react-query\";\nimport TamboAI from \"@tambo-ai/typescript-sdk\";\nimport { TamboClientContext } from \"../../providers/tambo-client-provider\";\nimport type { TamboClientContextProps } from \"../../providers/tambo-client-provider\";\nimport {\n TamboConfigContext,\n type TamboConfig,\n} from \"../providers/tambo-v1-provider\";\nimport { useTamboAuthState } from \"./use-tambo-v1-auth-state\";\n\nfunction createWrapper(\n clientOverrides: Partial<TamboClientContextProps>,\n configOverrides: Partial<TamboConfig> = {},\n) {\n const clientContext: TamboClientContextProps = {\n client: {} as TamboAI,\n queryClient: new QueryClient(),\n isUpdatingToken: false,\n tokenExchangeError: null,\n userToken: undefined,\n hasValidToken: false,\n ...clientOverrides,\n };\n\n const config: TamboConfig = {\n userKey: undefined,\n ...configOverrides,\n };\n\n function Wrapper({ children }: { children: React.ReactNode }) {\n return React.createElement(\n TamboClientContext.Provider,\n { value: clientContext },\n React.createElement(\n TamboConfigContext.Provider,\n { value: config },\n children,\n ),\n );\n }\n return Wrapper;\n}\n\ndescribe(\"useTamboAuthState\", () => {\n it(\"returns 'identified' with source 'userKey' when only userKey is provided\", () => {\n const { result } = renderHook(() => useTamboAuthState(), {\n wrapper: createWrapper({}, { userKey: \"user_123\" }),\n });\n\n expect(result.current).toEqual({\n status: \"identified\",\n source: \"userKey\",\n });\n });\n\n it(\"returns 'identified' with source 'tokenExchange' when token exchange succeeded\", () => {\n const { result } = renderHook(() => useTamboAuthState(), {\n wrapper: createWrapper({\n userToken: \"oauth_token\",\n hasValidToken: true,\n }),\n });\n\n expect(result.current).toEqual({\n status: \"identified\",\n source: \"tokenExchange\",\n });\n });\n\n it(\"returns 'exchanging' when userToken provided but exchange not yet complete\", () => {\n const { result } = renderHook(() => useTamboAuthState(), {\n wrapper: createWrapper({\n userToken: \"oauth_token\",\n hasValidToken: false,\n }),\n });\n\n expect(result.current).toEqual({ status: \"exchanging\" });\n });\n\n it(\"returns 'error' when token exchange failed\", () => {\n const exchangeError = new Error(\"Token exchange failed\");\n const { result } = renderHook(() => useTamboAuthState(), {\n wrapper: createWrapper({\n userToken: \"oauth_token\",\n tokenExchangeError: exchangeError,\n hasValidToken: false,\n }),\n });\n\n expect(result.current).toEqual({\n status: \"error\",\n error: exchangeError,\n });\n });\n\n it(\"returns 'invalid' when both userKey and userToken are provided\", () => {\n const { result } = renderHook(() => useTamboAuthState(), {\n wrapper: createWrapper(\n { userToken: \"oauth_token\" },\n { userKey: \"user_123\" },\n ),\n });\n\n expect(result.current).toEqual({ status: \"invalid\" });\n });\n\n it(\"returns 'unauthenticated' when neither userKey nor userToken is provided\", () => {\n const { result } = renderHook(() => useTamboAuthState(), {\n wrapper: createWrapper({}),\n });\n\n expect(result.current).toEqual({ status: \"unauthenticated\" });\n });\n\n it(\"throws when used outside TamboClientContext\", () => {\n const wrapper = ({ children }: { children: React.ReactNode }) =>\n React.createElement(\n TamboConfigContext.Provider,\n { value: { userKey: \"x\" } },\n children,\n );\n\n expect(() => renderHook(() => useTamboAuthState(), { wrapper })).toThrow(\n \"useTamboAuthState must be used within TamboProvider\",\n );\n });\n\n it(\"throws when used outside TamboConfigContext\", () => {\n const clientContext: TamboClientContextProps = {\n client: {} as TamboAI,\n queryClient: new QueryClient(),\n isUpdatingToken: false,\n tokenExchangeError: null,\n userToken: undefined,\n hasValidToken: false,\n };\n\n const wrapper = ({ children }: { children: React.ReactNode }) =>\n React.createElement(\n TamboClientContext.Provider,\n { value: clientContext },\n children,\n );\n\n expect(() => renderHook(() => useTamboAuthState(), { wrapper })).toThrow(\n \"useTamboAuthState must be used within TamboProvider\",\n );\n });\n});\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Return type for
|
|
2
|
+
* Return type for useTamboComponentState hook.
|
|
3
3
|
* Similar to useState but with additional metadata.
|
|
4
4
|
*/
|
|
5
|
-
export type
|
|
5
|
+
export type UseTamboComponentStateReturn<S> = [
|
|
6
6
|
currentState: S,
|
|
7
7
|
setState: (newState: S | ((prev: S) => S)) => void,
|
|
8
8
|
meta: {
|
|
@@ -18,7 +18,8 @@ export type UseTamboV1ComponentStateReturn<S> = [
|
|
|
18
18
|
* to the Tambo backend. Server-side state updates are also reflected
|
|
19
19
|
* in the component.
|
|
20
20
|
*
|
|
21
|
-
*
|
|
21
|
+
* Can be used within rendered components, interactable components, or
|
|
22
|
+
* components awaiting provider context (acts as plain useState until context is available).
|
|
22
23
|
* @param keyName - The unique key to identify this state value within the component's state
|
|
23
24
|
* @param initialValue - Initial value for the state (used if no server state exists)
|
|
24
25
|
* @param debounceTime - Debounce time in milliseconds (default: 500ms)
|
|
@@ -26,7 +27,7 @@ export type UseTamboV1ComponentStateReturn<S> = [
|
|
|
26
27
|
* @example
|
|
27
28
|
* ```tsx
|
|
28
29
|
* function Counter() {
|
|
29
|
-
* const [count, setCount, { isPending }] =
|
|
30
|
+
* const [count, setCount, { isPending }] = useTamboComponentState('count', 0);
|
|
30
31
|
*
|
|
31
32
|
* return (
|
|
32
33
|
* <div>
|
|
@@ -39,6 +40,6 @@ export type UseTamboV1ComponentStateReturn<S> = [
|
|
|
39
40
|
* }
|
|
40
41
|
* ```
|
|
41
42
|
*/
|
|
42
|
-
export declare function
|
|
43
|
-
export declare function
|
|
43
|
+
export declare function useTamboComponentState<S = undefined>(keyName: string, initialValue?: S, debounceTime?: number): UseTamboComponentStateReturn<S | undefined>;
|
|
44
|
+
export declare function useTamboComponentState<S>(keyName: string, initialValue: S, debounceTime?: number): UseTamboComponentStateReturn<S>;
|
|
44
45
|
//# sourceMappingURL=use-tambo-v1-component-state.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-tambo-v1-component-state.d.ts","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-component-state.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"use-tambo-v1-component-state.d.ts","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-component-state.ts"],"names":[],"mappings":"AA0BA;;;GAGG;AACH,MAAM,MAAM,4BAA4B,CAAC,CAAC,IAAI;IAC5C,YAAY,EAAE,CAAC;IACf,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI;IAClD,IAAI,EAAE;QACJ,SAAS,EAAE,OAAO,CAAC;QACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;QACpB,KAAK,EAAE,MAAM,IAAI,CAAC;KACnB;CACF,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,GAAG,SAAS,EAClD,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,CAAC,EAChB,YAAY,CAAC,EAAE,MAAM,GACpB,4BAA4B,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;AAC/C,wBAAgB,sBAAsB,CAAC,CAAC,EACtC,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,CAAC,EACf,YAAY,CAAC,EAAE,MAAM,GACpB,4BAA4B,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -1,33 +1,47 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* useTamboComponentState - Component State Hook
|
|
4
4
|
*
|
|
5
5
|
* Provides bidirectional state synchronization between React components
|
|
6
6
|
* and the Tambo backend. State changes are debounced before syncing to
|
|
7
7
|
* the server, and server state updates are reflected in the component.
|
|
8
8
|
*
|
|
9
|
-
*
|
|
9
|
+
* Works in three modes:
|
|
10
|
+
* - **Rendered components**: syncs state bidirectionally with the server
|
|
11
|
+
* - **Interactable components**: syncs state via the interactable provider
|
|
12
|
+
* - **No context yet**: acts as plain useState (no side effects) until a
|
|
13
|
+
* provider wraps the component (e.g., first render before withTamboInteractable)
|
|
10
14
|
*/
|
|
11
15
|
import { useCallback, useEffect, useState, useRef } from "react";
|
|
12
16
|
import { useDebouncedCallback } from "use-debounce";
|
|
13
17
|
import { deepEqual } from "fast-equals";
|
|
14
18
|
import { useTamboClient } from "../../providers/tambo-client-provider.js";
|
|
15
19
|
import { useTamboInteractable } from "../../providers/tambo-interactable-provider.js";
|
|
16
|
-
import {
|
|
20
|
+
import { useComponentContentOptional } from "../utils/component-renderer.js";
|
|
21
|
+
import { useTamboConfig } from "../providers/tambo-v1-provider.js";
|
|
17
22
|
import { useStreamState } from "../providers/tambo-v1-stream-context.js";
|
|
18
23
|
import { findComponentContent } from "../utils/thread-utils.js";
|
|
19
|
-
export function
|
|
24
|
+
export function useTamboComponentState(keyName, initialValue, debounceTime = 500) {
|
|
20
25
|
const client = useTamboClient();
|
|
21
|
-
const {
|
|
26
|
+
const { userKey } = useTamboConfig();
|
|
27
|
+
const componentContent = useComponentContentOptional();
|
|
22
28
|
const streamState = useStreamState();
|
|
23
29
|
const { setInteractableState, getInteractableComponentState } = useTamboInteractable();
|
|
24
|
-
//
|
|
25
|
-
|
|
26
|
-
//
|
|
27
|
-
const
|
|
30
|
+
// componentContent is null on the first render of interactable components
|
|
31
|
+
// (before withTamboInteractable sets the interactableId and wraps with provider).
|
|
32
|
+
// When null, we act as plain useState with no side effects.
|
|
33
|
+
const isContextAvailable = componentContent !== null;
|
|
34
|
+
const componentId = componentContent?.componentId ?? "";
|
|
35
|
+
const threadId = componentContent?.threadId ?? "";
|
|
36
|
+
// Only treat as interactable when we have real context with threadId=""
|
|
37
|
+
// (set by withTamboInteractable). When context is missing entirely,
|
|
38
|
+
// neither interactable nor server-sync paths should run.
|
|
39
|
+
const isInteractable = isContextAvailable && threadId === "";
|
|
40
|
+
// Find the component content to get server state (only for rendered components)
|
|
41
|
+
const renderedContent = isInteractable
|
|
28
42
|
? undefined
|
|
29
43
|
: findComponentContent(streamState, threadId, componentId);
|
|
30
|
-
const serverState =
|
|
44
|
+
const serverState = renderedContent?.state;
|
|
31
45
|
const serverValue = serverState?.[keyName];
|
|
32
46
|
// For interactable components, read state from the interactable provider
|
|
33
47
|
const interactableState = isInteractable
|
|
@@ -44,9 +58,9 @@ export function useTamboV1ComponentState(keyName, initialValue, debounceTime = 5
|
|
|
44
58
|
const hasPendingLocalChangeRef = useRef(false);
|
|
45
59
|
// Track in-flight sync requests to avoid stale completions clearing pending state
|
|
46
60
|
const syncSeqRef = useRef(0);
|
|
47
|
-
// Debounced function to sync state to server (only used for
|
|
61
|
+
// Debounced function to sync state to server (only used for rendered components)
|
|
48
62
|
const syncToServer = useDebouncedCallback(async (newState) => {
|
|
49
|
-
if (isInteractable)
|
|
63
|
+
if (!isContextAvailable || isInteractable)
|
|
50
64
|
return;
|
|
51
65
|
const seq = ++syncSeqRef.current;
|
|
52
66
|
setIsPending(true);
|
|
@@ -56,6 +70,7 @@ export function useTamboV1ComponentState(keyName, initialValue, debounceTime = 5
|
|
|
56
70
|
await client.threads.state.updateState(componentId, {
|
|
57
71
|
threadId,
|
|
58
72
|
state: { [keyName]: newState },
|
|
73
|
+
userKey,
|
|
59
74
|
});
|
|
60
75
|
// Clear pending flag after successful sync
|
|
61
76
|
hasPendingLocalChangeRef.current = false;
|
|
@@ -65,7 +80,7 @@ export function useTamboV1ComponentState(keyName, initialValue, debounceTime = 5
|
|
|
65
80
|
hasPendingLocalChangeRef.current = false;
|
|
66
81
|
const syncError = err instanceof Error ? err : new Error(String(err));
|
|
67
82
|
setError(syncError);
|
|
68
|
-
console.error(`[
|
|
83
|
+
console.error(`[useTamboComponentState] Failed to sync state for ${componentId}:`, syncError);
|
|
69
84
|
}
|
|
70
85
|
finally {
|
|
71
86
|
// Only clear isPending if this is the most recent request
|
|
@@ -80,18 +95,29 @@ export function useTamboV1ComponentState(keyName, initialValue, debounceTime = 5
|
|
|
80
95
|
const nextState = typeof newState === "function"
|
|
81
96
|
? newState(prev)
|
|
82
97
|
: newState;
|
|
98
|
+
// No side effects when context isn't available yet (local-only update)
|
|
99
|
+
if (!isContextAvailable) {
|
|
100
|
+
return nextState;
|
|
101
|
+
}
|
|
83
102
|
if (isInteractable) {
|
|
84
103
|
// For interactable components, update the interactable provider's state
|
|
85
104
|
setInteractableState(componentId, keyName, nextState);
|
|
86
105
|
}
|
|
87
106
|
else {
|
|
88
|
-
// For
|
|
107
|
+
// For rendered components, trigger debounced sync to server
|
|
89
108
|
hasPendingLocalChangeRef.current = true;
|
|
90
109
|
void syncToServer(nextState);
|
|
91
110
|
}
|
|
92
111
|
return nextState;
|
|
93
112
|
});
|
|
94
|
-
}, [
|
|
113
|
+
}, [
|
|
114
|
+
isContextAvailable,
|
|
115
|
+
isInteractable,
|
|
116
|
+
syncToServer,
|
|
117
|
+
setInteractableState,
|
|
118
|
+
componentId,
|
|
119
|
+
keyName,
|
|
120
|
+
]);
|
|
95
121
|
// Set initial value in interactable state on mount if no existing state
|
|
96
122
|
const existingInteractableState = isInteractable
|
|
97
123
|
? getInteractableComponentState(componentId)?.[keyName]
|
|
@@ -118,9 +144,9 @@ export function useTamboV1ComponentState(keyName, initialValue, debounceTime = 5
|
|
|
118
144
|
return;
|
|
119
145
|
setLocalState((prev) => deepEqual(prev, interactableState) ? prev : interactableState);
|
|
120
146
|
}, [isInteractable, interactableState]);
|
|
121
|
-
// Sync from server state when it changes (e.g., from streaming events) -
|
|
147
|
+
// Sync from server state when it changes (e.g., from streaming events) - rendered components only
|
|
122
148
|
useEffect(() => {
|
|
123
|
-
if (isInteractable)
|
|
149
|
+
if (!isContextAvailable || isInteractable)
|
|
124
150
|
return;
|
|
125
151
|
if (serverValue === undefined)
|
|
126
152
|
return;
|
|
@@ -135,21 +161,21 @@ export function useTamboV1ComponentState(keyName, initialValue, debounceTime = 5
|
|
|
135
161
|
}
|
|
136
162
|
// Use functional update to avoid localState in deps
|
|
137
163
|
setLocalState((prev) => deepEqual(serverValue, prev) ? prev : serverValue);
|
|
138
|
-
}, [isInteractable, serverValue]);
|
|
139
|
-
// Flush pending updates on unmount (only for
|
|
164
|
+
}, [isContextAvailable, isInteractable, serverValue]);
|
|
165
|
+
// Flush pending updates on unmount (only for rendered components)
|
|
140
166
|
useEffect(() => {
|
|
141
|
-
if (isInteractable)
|
|
167
|
+
if (!isContextAvailable || isInteractable)
|
|
142
168
|
return;
|
|
143
169
|
return () => {
|
|
144
170
|
void syncToServer.flush();
|
|
145
171
|
};
|
|
146
|
-
}, [isInteractable, syncToServer]);
|
|
147
|
-
// Flush function for immediate sync (noop
|
|
172
|
+
}, [isContextAvailable, isInteractable, syncToServer]);
|
|
173
|
+
// Flush function for immediate sync (noop when context is unavailable or interactable)
|
|
148
174
|
const flush = useCallback(() => {
|
|
149
|
-
if (isInteractable)
|
|
175
|
+
if (!isContextAvailable || isInteractable)
|
|
150
176
|
return;
|
|
151
177
|
void syncToServer.flush();
|
|
152
|
-
}, [isInteractable, syncToServer]);
|
|
178
|
+
}, [isContextAvailable, isInteractable, syncToServer]);
|
|
153
179
|
return [localState, setState, { isPending, error, flush }];
|
|
154
180
|
}
|
|
155
181
|
//# sourceMappingURL=use-tambo-v1-component-state.js.map
|