@tambo-ai/react 0.75.0 → 1.0.0-rc.3

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.
Files changed (605) hide show
  1. package/dist/hoc/with-tambo-interactable.d.ts.map +1 -1
  2. package/dist/hoc/with-tambo-interactable.js +13 -13
  3. package/dist/hoc/with-tambo-interactable.js.map +1 -1
  4. package/dist/hoc/with-tambo-interactable.test.js +3 -3
  5. package/dist/hoc/with-tambo-interactable.test.js.map +1 -1
  6. package/dist/index.d.ts +7 -25
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +7 -59
  9. package/dist/index.js.map +1 -1
  10. package/dist/mcp/mcp-hooks.js +5 -5
  11. package/dist/mcp/mcp-hooks.js.map +1 -1
  12. package/dist/providers/tambo-client-provider.d.ts +6 -0
  13. package/dist/providers/tambo-client-provider.d.ts.map +1 -1
  14. package/dist/providers/tambo-client-provider.js +4 -2
  15. package/dist/providers/tambo-client-provider.js.map +1 -1
  16. package/dist/providers/tambo-interactable-provider.d.ts +1 -1
  17. package/dist/providers/tambo-interactables-additional-context-edge-cases.test.js +2 -10
  18. package/dist/providers/tambo-interactables-additional-context-edge-cases.test.js.map +1 -1
  19. package/dist/providers/tambo-interactables-additional-context.test.js +3 -19
  20. package/dist/providers/tambo-interactables-additional-context.test.js.map +1 -1
  21. package/dist/providers/tambo-mcp-token-provider.d.ts +8 -17
  22. package/dist/providers/tambo-mcp-token-provider.d.ts.map +1 -1
  23. package/dist/providers/tambo-mcp-token-provider.js +20 -97
  24. package/dist/providers/tambo-mcp-token-provider.js.map +1 -1
  25. package/dist/testing/tools.d.ts +3 -3
  26. package/dist/testing/tools.d.ts.map +1 -1
  27. package/dist/testing/tools.js.map +1 -1
  28. package/dist/v1/__tests__/v1-interactables.test.js +1 -1
  29. package/dist/v1/__tests__/v1-interactables.test.js.map +1 -1
  30. package/dist/v1/components/v1-component-renderer.d.ts +9 -9
  31. package/dist/v1/components/v1-component-renderer.d.ts.map +1 -1
  32. package/dist/v1/components/v1-component-renderer.js +13 -13
  33. package/dist/v1/components/v1-component-renderer.js.map +1 -1
  34. package/dist/v1/components/v1-component-renderer.test.js +15 -15
  35. package/dist/v1/components/v1-component-renderer.test.js.map +1 -1
  36. package/{esm/hooks/use-current-message.d.ts → dist/v1/hooks/use-tambo-current-message.d.ts} +30 -9
  37. package/dist/v1/hooks/use-tambo-current-message.d.ts.map +1 -0
  38. package/dist/{hooks/use-current-message.js → v1/hooks/use-tambo-current-message.js} +13 -8
  39. package/dist/v1/hooks/use-tambo-current-message.js.map +1 -0
  40. package/dist/v1/hooks/use-tambo-v1-auth-state.d.ts +5 -5
  41. package/dist/v1/hooks/use-tambo-v1-auth-state.d.ts.map +1 -1
  42. package/dist/v1/hooks/use-tambo-v1-auth-state.js +8 -8
  43. package/dist/v1/hooks/use-tambo-v1-auth-state.js.map +1 -1
  44. package/dist/v1/hooks/use-tambo-v1-auth-state.test.js +12 -12
  45. package/dist/v1/hooks/use-tambo-v1-auth-state.test.js.map +1 -1
  46. package/dist/v1/hooks/use-tambo-v1-component-state.d.ts +7 -6
  47. package/dist/v1/hooks/use-tambo-v1-component-state.d.ts.map +1 -1
  48. package/dist/v1/hooks/use-tambo-v1-component-state.js +50 -24
  49. package/dist/v1/hooks/use-tambo-v1-component-state.js.map +1 -1
  50. package/dist/v1/hooks/use-tambo-v1-component-state.test.js +60 -35
  51. package/dist/v1/hooks/use-tambo-v1-component-state.test.js.map +1 -1
  52. package/dist/v1/hooks/use-tambo-v1-messages.d.ts +9 -9
  53. package/dist/v1/hooks/use-tambo-v1-messages.d.ts.map +1 -1
  54. package/dist/v1/hooks/use-tambo-v1-messages.js +4 -4
  55. package/dist/v1/hooks/use-tambo-v1-messages.js.map +1 -1
  56. package/dist/v1/hooks/use-tambo-v1-messages.test.js +7 -7
  57. package/dist/v1/hooks/use-tambo-v1-messages.test.js.map +1 -1
  58. package/dist/v1/hooks/use-tambo-v1-send-message.d.ts +2 -2
  59. package/dist/v1/hooks/use-tambo-v1-send-message.d.ts.map +1 -1
  60. package/dist/v1/hooks/use-tambo-v1-send-message.js +11 -13
  61. package/dist/v1/hooks/use-tambo-v1-send-message.js.map +1 -1
  62. package/dist/v1/hooks/use-tambo-v1-send-message.test.js +51 -51
  63. package/dist/v1/hooks/use-tambo-v1-send-message.test.js.map +1 -1
  64. package/dist/v1/hooks/use-tambo-v1-stream-status.d.ts +5 -5
  65. package/dist/v1/hooks/use-tambo-v1-stream-status.d.ts.map +1 -1
  66. package/dist/v1/hooks/use-tambo-v1-stream-status.js +12 -14
  67. package/dist/v1/hooks/use-tambo-v1-stream-status.js.map +1 -1
  68. package/dist/v1/hooks/use-tambo-v1-stream-status.test.js +19 -19
  69. package/dist/v1/hooks/use-tambo-v1-stream-status.test.js.map +1 -1
  70. package/dist/v1/hooks/use-tambo-v1-suggestions.d.ts +7 -7
  71. package/dist/v1/hooks/use-tambo-v1-suggestions.d.ts.map +1 -1
  72. package/dist/v1/hooks/use-tambo-v1-suggestions.js +9 -9
  73. package/dist/v1/hooks/use-tambo-v1-suggestions.js.map +1 -1
  74. package/dist/v1/hooks/use-tambo-v1-suggestions.test.js +44 -44
  75. package/dist/v1/hooks/use-tambo-v1-suggestions.test.js.map +1 -1
  76. package/dist/v1/hooks/use-tambo-v1-thread-input.d.ts +3 -3
  77. package/dist/v1/hooks/use-tambo-v1-thread-input.d.ts.map +1 -1
  78. package/dist/v1/hooks/use-tambo-v1-thread-input.js +4 -4
  79. package/dist/v1/hooks/use-tambo-v1-thread-input.js.map +1 -1
  80. package/dist/v1/hooks/use-tambo-v1-thread-input.test.js +29 -29
  81. package/dist/v1/hooks/use-tambo-v1-thread-input.test.js.map +1 -1
  82. package/dist/v1/hooks/use-tambo-v1-thread-list.d.ts +4 -4
  83. package/dist/v1/hooks/use-tambo-v1-thread-list.d.ts.map +1 -1
  84. package/dist/v1/hooks/use-tambo-v1-thread-list.js +5 -5
  85. package/dist/v1/hooks/use-tambo-v1-thread-list.js.map +1 -1
  86. package/dist/v1/hooks/use-tambo-v1-thread-list.test.js +13 -17
  87. package/dist/v1/hooks/use-tambo-v1-thread-list.test.js.map +1 -1
  88. package/dist/v1/hooks/use-tambo-v1-thread.d.ts +3 -3
  89. package/dist/v1/hooks/use-tambo-v1-thread.d.ts.map +1 -1
  90. package/dist/v1/hooks/use-tambo-v1-thread.js +4 -4
  91. package/dist/v1/hooks/use-tambo-v1-thread.js.map +1 -1
  92. package/dist/v1/hooks/use-tambo-v1-thread.test.js +5 -5
  93. package/dist/v1/hooks/use-tambo-v1-thread.test.js.map +1 -1
  94. package/dist/v1/hooks/use-tambo-v1.d.ts +7 -7
  95. package/dist/v1/hooks/use-tambo-v1.d.ts.map +1 -1
  96. package/dist/v1/hooks/use-tambo-v1.js +10 -7
  97. package/dist/v1/hooks/use-tambo-v1.js.map +1 -1
  98. package/dist/v1/hooks/use-tambo-v1.test.js +54 -45
  99. package/dist/v1/hooks/use-tambo-v1.test.js.map +1 -1
  100. package/dist/v1/index.d.ts +31 -27
  101. package/dist/v1/index.d.ts.map +1 -1
  102. package/dist/v1/index.js +45 -35
  103. package/dist/v1/index.js.map +1 -1
  104. package/dist/v1/providers/tambo-v1-provider.d.ts +20 -20
  105. package/dist/v1/providers/tambo-v1-provider.d.ts.map +1 -1
  106. package/dist/v1/providers/tambo-v1-provider.js +32 -32
  107. package/dist/v1/providers/tambo-v1-provider.js.map +1 -1
  108. package/dist/v1/providers/tambo-v1-provider.test.js +22 -22
  109. package/dist/v1/providers/tambo-v1-provider.test.js.map +1 -1
  110. package/dist/v1/providers/tambo-v1-stream-context.d.ts +15 -15
  111. package/dist/v1/providers/tambo-v1-stream-context.d.ts.map +1 -1
  112. package/dist/v1/providers/tambo-v1-stream-context.js +17 -17
  113. package/dist/v1/providers/tambo-v1-stream-context.js.map +1 -1
  114. package/dist/v1/providers/tambo-v1-stream-context.test.js +7 -7
  115. package/dist/v1/providers/tambo-v1-stream-context.test.js.map +1 -1
  116. package/dist/v1/providers/tambo-v1-stub-provider.d.ts +9 -9
  117. package/dist/v1/providers/tambo-v1-stub-provider.d.ts.map +1 -1
  118. package/dist/v1/providers/tambo-v1-stub-provider.js +7 -7
  119. package/dist/v1/providers/tambo-v1-stub-provider.js.map +1 -1
  120. package/dist/v1/providers/tambo-v1-stub-provider.test.js +25 -25
  121. package/dist/v1/providers/tambo-v1-stub-provider.test.js.map +1 -1
  122. package/dist/v1/providers/tambo-v1-thread-input-provider.d.ts +9 -9
  123. package/dist/v1/providers/tambo-v1-thread-input-provider.d.ts.map +1 -1
  124. package/dist/v1/providers/tambo-v1-thread-input-provider.js +16 -16
  125. package/dist/v1/providers/tambo-v1-thread-input-provider.js.map +1 -1
  126. package/dist/v1/types/auth.d.ts +2 -2
  127. package/dist/v1/types/auth.d.ts.map +1 -1
  128. package/dist/v1/types/auth.js.map +1 -1
  129. package/dist/v1/types/component.d.ts +3 -3
  130. package/dist/v1/types/component.d.ts.map +1 -1
  131. package/dist/v1/types/component.js +2 -2
  132. package/dist/v1/types/component.js.map +1 -1
  133. package/dist/v1/types/event.d.ts +1 -1
  134. package/dist/v1/types/event.js +1 -1
  135. package/dist/v1/types/event.js.map +1 -1
  136. package/dist/v1/types/message.d.ts +17 -22
  137. package/dist/v1/types/message.d.ts.map +1 -1
  138. package/dist/v1/types/message.js +1 -1
  139. package/dist/v1/types/message.js.map +1 -1
  140. package/dist/v1/types/thread.d.ts +8 -6
  141. package/dist/v1/types/thread.d.ts.map +1 -1
  142. package/dist/v1/types/thread.js +1 -1
  143. package/dist/v1/types/thread.js.map +1 -1
  144. package/dist/v1/types/tool-choice.d.ts +1 -1
  145. package/dist/v1/types/tool-choice.js.map +1 -1
  146. package/dist/v1/utils/component-renderer.d.ts +11 -5
  147. package/dist/v1/utils/component-renderer.d.ts.map +1 -1
  148. package/dist/v1/utils/component-renderer.js +16 -7
  149. package/dist/v1/utils/component-renderer.js.map +1 -1
  150. package/dist/v1/utils/component-renderer.test.js +7 -7
  151. package/dist/v1/utils/component-renderer.test.js.map +1 -1
  152. package/dist/v1/utils/event-accumulator.d.ts +8 -8
  153. package/dist/v1/utils/event-accumulator.d.ts.map +1 -1
  154. package/dist/v1/utils/event-accumulator.js +24 -13
  155. package/dist/v1/utils/event-accumulator.js.map +1 -1
  156. package/dist/v1/utils/event-accumulator.test.js +43 -8
  157. package/dist/v1/utils/event-accumulator.test.js.map +1 -1
  158. package/dist/v1/utils/registry-conversion.d.ts +18 -18
  159. package/dist/v1/utils/registry-conversion.js +23 -23
  160. package/dist/v1/utils/registry-conversion.js.map +1 -1
  161. package/dist/v1/utils/stream-handler.d.ts +1 -1
  162. package/dist/v1/utils/stream-handler.js +1 -1
  163. package/dist/v1/utils/stream-handler.js.map +1 -1
  164. package/dist/v1/utils/thread-utils.d.ts +2 -2
  165. package/dist/v1/utils/thread-utils.d.ts.map +1 -1
  166. package/dist/v1/utils/thread-utils.js.map +1 -1
  167. package/dist/v1/utils/tool-call-tracker.d.ts +1 -1
  168. package/dist/v1/utils/tool-call-tracker.js +1 -1
  169. package/dist/v1/utils/tool-call-tracker.js.map +1 -1
  170. package/dist/v1/utils/tool-executor.d.ts +1 -1
  171. package/dist/v1/utils/tool-executor.js +2 -2
  172. package/dist/v1/utils/tool-executor.js.map +1 -1
  173. package/esm/hoc/with-tambo-interactable.d.ts.map +1 -1
  174. package/esm/hoc/with-tambo-interactable.js +13 -13
  175. package/esm/hoc/with-tambo-interactable.js.map +1 -1
  176. package/esm/hoc/with-tambo-interactable.test.js +1 -1
  177. package/esm/hoc/with-tambo-interactable.test.js.map +1 -1
  178. package/esm/index.d.ts +7 -25
  179. package/esm/index.d.ts.map +1 -1
  180. package/esm/index.js +7 -21
  181. package/esm/index.js.map +1 -1
  182. package/esm/mcp/mcp-hooks.js +1 -1
  183. package/esm/mcp/mcp-hooks.js.map +1 -1
  184. package/esm/providers/tambo-client-provider.d.ts +6 -0
  185. package/esm/providers/tambo-client-provider.d.ts.map +1 -1
  186. package/esm/providers/tambo-client-provider.js +4 -2
  187. package/esm/providers/tambo-client-provider.js.map +1 -1
  188. package/esm/providers/tambo-interactable-provider.d.ts +1 -1
  189. package/esm/providers/tambo-interactables-additional-context-edge-cases.test.js +2 -10
  190. package/esm/providers/tambo-interactables-additional-context-edge-cases.test.js.map +1 -1
  191. package/esm/providers/tambo-interactables-additional-context.test.js +3 -19
  192. package/esm/providers/tambo-interactables-additional-context.test.js.map +1 -1
  193. package/esm/providers/tambo-mcp-token-provider.d.ts +8 -17
  194. package/esm/providers/tambo-mcp-token-provider.d.ts.map +1 -1
  195. package/esm/providers/tambo-mcp-token-provider.js +20 -97
  196. package/esm/providers/tambo-mcp-token-provider.js.map +1 -1
  197. package/esm/testing/tools.d.ts +3 -3
  198. package/esm/testing/tools.d.ts.map +1 -1
  199. package/esm/testing/tools.js.map +1 -1
  200. package/esm/v1/__tests__/v1-interactables.test.js +1 -1
  201. package/esm/v1/__tests__/v1-interactables.test.js.map +1 -1
  202. package/esm/v1/components/v1-component-renderer.d.ts +9 -9
  203. package/esm/v1/components/v1-component-renderer.d.ts.map +1 -1
  204. package/esm/v1/components/v1-component-renderer.js +12 -12
  205. package/esm/v1/components/v1-component-renderer.js.map +1 -1
  206. package/esm/v1/components/v1-component-renderer.test.js +16 -16
  207. package/esm/v1/components/v1-component-renderer.test.js.map +1 -1
  208. package/{dist/hooks/use-current-message.d.ts → esm/v1/hooks/use-tambo-current-message.d.ts} +30 -9
  209. package/esm/v1/hooks/use-tambo-current-message.d.ts.map +1 -0
  210. package/esm/{hooks/use-current-message.js → v1/hooks/use-tambo-current-message.js} +13 -8
  211. package/esm/v1/hooks/use-tambo-current-message.js.map +1 -0
  212. package/esm/v1/hooks/use-tambo-v1-auth-state.d.ts +5 -5
  213. package/esm/v1/hooks/use-tambo-v1-auth-state.d.ts.map +1 -1
  214. package/esm/v1/hooks/use-tambo-v1-auth-state.js +8 -8
  215. package/esm/v1/hooks/use-tambo-v1-auth-state.js.map +1 -1
  216. package/esm/v1/hooks/use-tambo-v1-auth-state.test.js +14 -14
  217. package/esm/v1/hooks/use-tambo-v1-auth-state.test.js.map +1 -1
  218. package/esm/v1/hooks/use-tambo-v1-component-state.d.ts +7 -6
  219. package/esm/v1/hooks/use-tambo-v1-component-state.d.ts.map +1 -1
  220. package/esm/v1/hooks/use-tambo-v1-component-state.js +50 -24
  221. package/esm/v1/hooks/use-tambo-v1-component-state.js.map +1 -1
  222. package/esm/v1/hooks/use-tambo-v1-component-state.test.js +62 -37
  223. package/esm/v1/hooks/use-tambo-v1-component-state.test.js.map +1 -1
  224. package/esm/v1/hooks/use-tambo-v1-messages.d.ts +9 -9
  225. package/esm/v1/hooks/use-tambo-v1-messages.d.ts.map +1 -1
  226. package/esm/v1/hooks/use-tambo-v1-messages.js +3 -3
  227. package/esm/v1/hooks/use-tambo-v1-messages.js.map +1 -1
  228. package/esm/v1/hooks/use-tambo-v1-messages.test.js +9 -9
  229. package/esm/v1/hooks/use-tambo-v1-messages.test.js.map +1 -1
  230. package/esm/v1/hooks/use-tambo-v1-send-message.d.ts +2 -2
  231. package/esm/v1/hooks/use-tambo-v1-send-message.d.ts.map +1 -1
  232. package/esm/v1/hooks/use-tambo-v1-send-message.js +12 -14
  233. package/esm/v1/hooks/use-tambo-v1-send-message.js.map +1 -1
  234. package/esm/v1/hooks/use-tambo-v1-send-message.test.js +54 -54
  235. package/esm/v1/hooks/use-tambo-v1-send-message.test.js.map +1 -1
  236. package/esm/v1/hooks/use-tambo-v1-stream-status.d.ts +5 -5
  237. package/esm/v1/hooks/use-tambo-v1-stream-status.d.ts.map +1 -1
  238. package/esm/v1/hooks/use-tambo-v1-stream-status.js +12 -14
  239. package/esm/v1/hooks/use-tambo-v1-stream-status.js.map +1 -1
  240. package/esm/v1/hooks/use-tambo-v1-stream-status.test.js +21 -21
  241. package/esm/v1/hooks/use-tambo-v1-stream-status.test.js.map +1 -1
  242. package/esm/v1/hooks/use-tambo-v1-suggestions.d.ts +7 -7
  243. package/esm/v1/hooks/use-tambo-v1-suggestions.d.ts.map +1 -1
  244. package/esm/v1/hooks/use-tambo-v1-suggestions.js +11 -11
  245. package/esm/v1/hooks/use-tambo-v1-suggestions.js.map +1 -1
  246. package/esm/v1/hooks/use-tambo-v1-suggestions.test.js +48 -48
  247. package/esm/v1/hooks/use-tambo-v1-suggestions.test.js.map +1 -1
  248. package/esm/v1/hooks/use-tambo-v1-thread-input.d.ts +3 -3
  249. package/esm/v1/hooks/use-tambo-v1-thread-input.d.ts.map +1 -1
  250. package/esm/v1/hooks/use-tambo-v1-thread-input.js +3 -3
  251. package/esm/v1/hooks/use-tambo-v1-thread-input.js.map +1 -1
  252. package/esm/v1/hooks/use-tambo-v1-thread-input.test.js +32 -32
  253. package/esm/v1/hooks/use-tambo-v1-thread-input.test.js.map +1 -1
  254. package/esm/v1/hooks/use-tambo-v1-thread-list.d.ts +4 -4
  255. package/esm/v1/hooks/use-tambo-v1-thread-list.d.ts.map +1 -1
  256. package/esm/v1/hooks/use-tambo-v1-thread-list.js +6 -6
  257. package/esm/v1/hooks/use-tambo-v1-thread-list.js.map +1 -1
  258. package/esm/v1/hooks/use-tambo-v1-thread-list.test.js +15 -19
  259. package/esm/v1/hooks/use-tambo-v1-thread-list.test.js.map +1 -1
  260. package/esm/v1/hooks/use-tambo-v1-thread.d.ts +3 -3
  261. package/esm/v1/hooks/use-tambo-v1-thread.d.ts.map +1 -1
  262. package/esm/v1/hooks/use-tambo-v1-thread.js +4 -4
  263. package/esm/v1/hooks/use-tambo-v1-thread.js.map +1 -1
  264. package/esm/v1/hooks/use-tambo-v1-thread.test.js +6 -6
  265. package/esm/v1/hooks/use-tambo-v1-thread.test.js.map +1 -1
  266. package/esm/v1/hooks/use-tambo-v1.d.ts +7 -7
  267. package/esm/v1/hooks/use-tambo-v1.d.ts.map +1 -1
  268. package/esm/v1/hooks/use-tambo-v1.js +11 -8
  269. package/esm/v1/hooks/use-tambo-v1.js.map +1 -1
  270. package/esm/v1/hooks/use-tambo-v1.test.js +56 -47
  271. package/esm/v1/hooks/use-tambo-v1.test.js.map +1 -1
  272. package/esm/v1/index.d.ts +31 -27
  273. package/esm/v1/index.d.ts.map +1 -1
  274. package/esm/v1/index.js +38 -33
  275. package/esm/v1/index.js.map +1 -1
  276. package/esm/v1/providers/tambo-v1-provider.d.ts +20 -20
  277. package/esm/v1/providers/tambo-v1-provider.d.ts.map +1 -1
  278. package/esm/v1/providers/tambo-v1-provider.js +32 -32
  279. package/esm/v1/providers/tambo-v1-provider.js.map +1 -1
  280. package/esm/v1/providers/tambo-v1-provider.test.js +23 -23
  281. package/esm/v1/providers/tambo-v1-provider.test.js.map +1 -1
  282. package/esm/v1/providers/tambo-v1-stream-context.d.ts +15 -15
  283. package/esm/v1/providers/tambo-v1-stream-context.d.ts.map +1 -1
  284. package/esm/v1/providers/tambo-v1-stream-context.js +17 -17
  285. package/esm/v1/providers/tambo-v1-stream-context.js.map +1 -1
  286. package/esm/v1/providers/tambo-v1-stream-context.test.js +8 -8
  287. package/esm/v1/providers/tambo-v1-stream-context.test.js.map +1 -1
  288. package/esm/v1/providers/tambo-v1-stub-provider.d.ts +9 -9
  289. package/esm/v1/providers/tambo-v1-stub-provider.d.ts.map +1 -1
  290. package/esm/v1/providers/tambo-v1-stub-provider.js +9 -9
  291. package/esm/v1/providers/tambo-v1-stub-provider.js.map +1 -1
  292. package/esm/v1/providers/tambo-v1-stub-provider.test.js +28 -28
  293. package/esm/v1/providers/tambo-v1-stub-provider.test.js.map +1 -1
  294. package/esm/v1/providers/tambo-v1-thread-input-provider.d.ts +9 -9
  295. package/esm/v1/providers/tambo-v1-thread-input-provider.d.ts.map +1 -1
  296. package/esm/v1/providers/tambo-v1-thread-input-provider.js +15 -15
  297. package/esm/v1/providers/tambo-v1-thread-input-provider.js.map +1 -1
  298. package/esm/v1/types/auth.d.ts +2 -2
  299. package/esm/v1/types/auth.d.ts.map +1 -1
  300. package/esm/v1/types/auth.js.map +1 -1
  301. package/esm/v1/types/component.d.ts +3 -3
  302. package/esm/v1/types/component.d.ts.map +1 -1
  303. package/esm/v1/types/component.js +2 -2
  304. package/esm/v1/types/component.js.map +1 -1
  305. package/esm/v1/types/event.d.ts +1 -1
  306. package/esm/v1/types/event.js +1 -1
  307. package/esm/v1/types/event.js.map +1 -1
  308. package/esm/v1/types/message.d.ts +17 -22
  309. package/esm/v1/types/message.d.ts.map +1 -1
  310. package/esm/v1/types/message.js +1 -1
  311. package/esm/v1/types/message.js.map +1 -1
  312. package/esm/v1/types/thread.d.ts +8 -6
  313. package/esm/v1/types/thread.d.ts.map +1 -1
  314. package/esm/v1/types/thread.js +1 -1
  315. package/esm/v1/types/thread.js.map +1 -1
  316. package/esm/v1/types/tool-choice.d.ts +1 -1
  317. package/esm/v1/types/tool-choice.js.map +1 -1
  318. package/esm/v1/utils/component-renderer.d.ts +11 -5
  319. package/esm/v1/utils/component-renderer.d.ts.map +1 -1
  320. package/esm/v1/utils/component-renderer.js +13 -5
  321. package/esm/v1/utils/component-renderer.js.map +1 -1
  322. package/esm/v1/utils/component-renderer.test.js +8 -8
  323. package/esm/v1/utils/component-renderer.test.js.map +1 -1
  324. package/esm/v1/utils/event-accumulator.d.ts +8 -8
  325. package/esm/v1/utils/event-accumulator.d.ts.map +1 -1
  326. package/esm/v1/utils/event-accumulator.js +24 -13
  327. package/esm/v1/utils/event-accumulator.js.map +1 -1
  328. package/esm/v1/utils/event-accumulator.test.js +43 -8
  329. package/esm/v1/utils/event-accumulator.test.js.map +1 -1
  330. package/esm/v1/utils/registry-conversion.d.ts +18 -18
  331. package/esm/v1/utils/registry-conversion.js +23 -23
  332. package/esm/v1/utils/registry-conversion.js.map +1 -1
  333. package/esm/v1/utils/stream-handler.d.ts +1 -1
  334. package/esm/v1/utils/stream-handler.js +1 -1
  335. package/esm/v1/utils/stream-handler.js.map +1 -1
  336. package/esm/v1/utils/thread-utils.d.ts +2 -2
  337. package/esm/v1/utils/thread-utils.d.ts.map +1 -1
  338. package/esm/v1/utils/thread-utils.js.map +1 -1
  339. package/esm/v1/utils/tool-call-tracker.d.ts +1 -1
  340. package/esm/v1/utils/tool-call-tracker.js +1 -1
  341. package/esm/v1/utils/tool-call-tracker.js.map +1 -1
  342. package/esm/v1/utils/tool-executor.d.ts +1 -1
  343. package/esm/v1/utils/tool-executor.js +2 -2
  344. package/esm/v1/utils/tool-executor.js.map +1 -1
  345. package/package.json +3 -8
  346. package/dist/hooks/index.d.ts +0 -9
  347. package/dist/hooks/index.d.ts.map +0 -1
  348. package/dist/hooks/index.js +0 -34
  349. package/dist/hooks/index.js.map +0 -1
  350. package/dist/hooks/use-component-state.d.ts +0 -30
  351. package/dist/hooks/use-component-state.d.ts.map +0 -1
  352. package/dist/hooks/use-component-state.js +0 -139
  353. package/dist/hooks/use-component-state.js.map +0 -1
  354. package/dist/hooks/use-component-state.test.d.ts +0 -2
  355. package/dist/hooks/use-component-state.test.d.ts.map +0 -1
  356. package/dist/hooks/use-component-state.test.js +0 -406
  357. package/dist/hooks/use-component-state.test.js.map +0 -1
  358. package/dist/hooks/use-current-message.d.ts.map +0 -1
  359. package/dist/hooks/use-current-message.js.map +0 -1
  360. package/dist/hooks/use-current-message.test.d.ts +0 -2
  361. package/dist/hooks/use-current-message.test.d.ts.map +0 -1
  362. package/dist/hooks/use-current-message.test.js +0 -269
  363. package/dist/hooks/use-current-message.test.js.map +0 -1
  364. package/dist/hooks/use-streaming-props.d.ts +0 -11
  365. package/dist/hooks/use-streaming-props.d.ts.map +0 -1
  366. package/dist/hooks/use-streaming-props.js +0 -37
  367. package/dist/hooks/use-streaming-props.js.map +0 -1
  368. package/dist/hooks/use-suggestions.d.ts +0 -46
  369. package/dist/hooks/use-suggestions.d.ts.map +0 -1
  370. package/dist/hooks/use-suggestions.js +0 -118
  371. package/dist/hooks/use-suggestions.js.map +0 -1
  372. package/dist/hooks/use-suggestions.test.d.ts +0 -2
  373. package/dist/hooks/use-suggestions.test.d.ts.map +0 -1
  374. package/dist/hooks/use-suggestions.test.js +0 -247
  375. package/dist/hooks/use-suggestions.test.js.map +0 -1
  376. package/dist/hooks/use-tambo-stream-status.d.ts +0 -90
  377. package/dist/hooks/use-tambo-stream-status.d.ts.map +0 -1
  378. package/dist/hooks/use-tambo-stream-status.js +0 -213
  379. package/dist/hooks/use-tambo-stream-status.js.map +0 -1
  380. package/dist/hooks/use-tambo-stream-status.test.d.ts +0 -2
  381. package/dist/hooks/use-tambo-stream-status.test.d.ts.map +0 -1
  382. package/dist/hooks/use-tambo-stream-status.test.js +0 -378
  383. package/dist/hooks/use-tambo-stream-status.test.js.map +0 -1
  384. package/dist/hooks/use-tambo-threads.d.ts +0 -158
  385. package/dist/hooks/use-tambo-threads.d.ts.map +0 -1
  386. package/dist/hooks/use-tambo-threads.js +0 -45
  387. package/dist/hooks/use-tambo-threads.js.map +0 -1
  388. package/dist/hooks/use-tambo-threads.test.d.ts +0 -2
  389. package/dist/hooks/use-tambo-threads.test.d.ts.map +0 -1
  390. package/dist/hooks/use-tambo-threads.test.js +0 -214
  391. package/dist/hooks/use-tambo-threads.test.js.map +0 -1
  392. package/dist/model/generate-component-response.d.ts +0 -37
  393. package/dist/model/generate-component-response.d.ts.map +0 -1
  394. package/dist/model/generate-component-response.js +0 -29
  395. package/dist/model/generate-component-response.js.map +0 -1
  396. package/dist/model/tambo-thread.d.ts +0 -15
  397. package/dist/model/tambo-thread.d.ts.map +0 -1
  398. package/dist/model/tambo-thread.js +0 -3
  399. package/dist/model/tambo-thread.js.map +0 -1
  400. package/dist/providers/__tests__/thread-input-resource-resolution.test.d.ts +0 -2
  401. package/dist/providers/__tests__/thread-input-resource-resolution.test.d.ts.map +0 -1
  402. package/dist/providers/__tests__/thread-input-resource-resolution.test.js +0 -592
  403. package/dist/providers/__tests__/thread-input-resource-resolution.test.js.map +0 -1
  404. package/dist/providers/index.d.ts +0 -13
  405. package/dist/providers/index.d.ts.map +0 -1
  406. package/dist/providers/index.js +0 -41
  407. package/dist/providers/index.js.map +0 -1
  408. package/dist/providers/tambo-component-provider.d.ts +0 -23
  409. package/dist/providers/tambo-component-provider.d.ts.map +0 -1
  410. package/dist/providers/tambo-component-provider.js +0 -88
  411. package/dist/providers/tambo-component-provider.js.map +0 -1
  412. package/dist/providers/tambo-prop-stream-provider/index.d.ts +0 -19
  413. package/dist/providers/tambo-prop-stream-provider/index.d.ts.map +0 -1
  414. package/dist/providers/tambo-prop-stream-provider/index.js +0 -43
  415. package/dist/providers/tambo-prop-stream-provider/index.js.map +0 -1
  416. package/dist/providers/tambo-prop-stream-provider/pending.d.ts +0 -12
  417. package/dist/providers/tambo-prop-stream-provider/pending.d.ts.map +0 -1
  418. package/dist/providers/tambo-prop-stream-provider/pending.js +0 -31
  419. package/dist/providers/tambo-prop-stream-provider/pending.js.map +0 -1
  420. package/dist/providers/tambo-prop-stream-provider/provider.d.ts +0 -17
  421. package/dist/providers/tambo-prop-stream-provider/provider.d.ts.map +0 -1
  422. package/dist/providers/tambo-prop-stream-provider/provider.js +0 -107
  423. package/dist/providers/tambo-prop-stream-provider/provider.js.map +0 -1
  424. package/dist/providers/tambo-prop-stream-provider/streaming.d.ts +0 -12
  425. package/dist/providers/tambo-prop-stream-provider/streaming.d.ts.map +0 -1
  426. package/dist/providers/tambo-prop-stream-provider/streaming.js +0 -28
  427. package/dist/providers/tambo-prop-stream-provider/streaming.js.map +0 -1
  428. package/dist/providers/tambo-prop-stream-provider/success.d.ts +0 -12
  429. package/dist/providers/tambo-prop-stream-provider/success.d.ts.map +0 -1
  430. package/dist/providers/tambo-prop-stream-provider/success.js +0 -28
  431. package/dist/providers/tambo-prop-stream-provider/success.js.map +0 -1
  432. package/dist/providers/tambo-prop-stream-provider/types.d.ts +0 -25
  433. package/dist/providers/tambo-prop-stream-provider/types.d.ts.map +0 -1
  434. package/dist/providers/tambo-prop-stream-provider/types.js +0 -6
  435. package/dist/providers/tambo-prop-stream-provider/types.js.map +0 -1
  436. package/dist/providers/tambo-prop-stream-provider.test.d.ts +0 -2
  437. package/dist/providers/tambo-prop-stream-provider.test.d.ts.map +0 -1
  438. package/dist/providers/tambo-prop-stream-provider.test.js +0 -275
  439. package/dist/providers/tambo-prop-stream-provider.test.js.map +0 -1
  440. package/dist/providers/tambo-provider.d.ts +0 -53
  441. package/dist/providers/tambo-provider.d.ts.map +0 -1
  442. package/dist/providers/tambo-provider.js +0 -133
  443. package/dist/providers/tambo-provider.js.map +0 -1
  444. package/dist/providers/tambo-stubs.d.ts +0 -89
  445. package/dist/providers/tambo-stubs.d.ts.map +0 -1
  446. package/dist/providers/tambo-stubs.js +0 -279
  447. package/dist/providers/tambo-stubs.js.map +0 -1
  448. package/dist/providers/tambo-stubs.test.d.ts +0 -2
  449. package/dist/providers/tambo-stubs.test.d.ts.map +0 -1
  450. package/dist/providers/tambo-stubs.test.js +0 -97
  451. package/dist/providers/tambo-stubs.test.js.map +0 -1
  452. package/dist/providers/tambo-thread-input-provider.d.ts +0 -65
  453. package/dist/providers/tambo-thread-input-provider.d.ts.map +0 -1
  454. package/dist/providers/tambo-thread-input-provider.js +0 -179
  455. package/dist/providers/tambo-thread-input-provider.js.map +0 -1
  456. package/dist/providers/tambo-thread-provider-initial-messages.test.d.ts +0 -2
  457. package/dist/providers/tambo-thread-provider-initial-messages.test.d.ts.map +0 -1
  458. package/dist/providers/tambo-thread-provider-initial-messages.test.js +0 -278
  459. package/dist/providers/tambo-thread-provider-initial-messages.test.js.map +0 -1
  460. package/dist/providers/tambo-thread-provider.d.ts +0 -126
  461. package/dist/providers/tambo-thread-provider.d.ts.map +0 -1
  462. package/dist/providers/tambo-thread-provider.js +0 -931
  463. package/dist/providers/tambo-thread-provider.js.map +0 -1
  464. package/dist/providers/tambo-thread-provider.test.d.ts +0 -2
  465. package/dist/providers/tambo-thread-provider.test.d.ts.map +0 -1
  466. package/dist/providers/tambo-thread-provider.test.js +0 -1591
  467. package/dist/providers/tambo-thread-provider.test.js.map +0 -1
  468. package/dist/util/generate-component.d.ts +0 -12
  469. package/dist/util/generate-component.d.ts.map +0 -1
  470. package/dist/util/generate-component.js +0 -58
  471. package/dist/util/generate-component.js.map +0 -1
  472. package/dist/util/generate-component.test.d.ts +0 -2
  473. package/dist/util/generate-component.test.d.ts.map +0 -1
  474. package/dist/util/generate-component.test.js +0 -340
  475. package/dist/util/generate-component.test.js.map +0 -1
  476. package/esm/hooks/index.d.ts +0 -9
  477. package/esm/hooks/index.d.ts.map +0 -1
  478. package/esm/hooks/index.js +0 -10
  479. package/esm/hooks/index.js.map +0 -1
  480. package/esm/hooks/use-component-state.d.ts +0 -30
  481. package/esm/hooks/use-component-state.d.ts.map +0 -1
  482. package/esm/hooks/use-component-state.js +0 -136
  483. package/esm/hooks/use-component-state.js.map +0 -1
  484. package/esm/hooks/use-component-state.test.d.ts +0 -2
  485. package/esm/hooks/use-component-state.test.d.ts.map +0 -1
  486. package/esm/hooks/use-component-state.test.js +0 -401
  487. package/esm/hooks/use-component-state.test.js.map +0 -1
  488. package/esm/hooks/use-current-message.d.ts.map +0 -1
  489. package/esm/hooks/use-current-message.js.map +0 -1
  490. package/esm/hooks/use-current-message.test.d.ts +0 -2
  491. package/esm/hooks/use-current-message.test.d.ts.map +0 -1
  492. package/esm/hooks/use-current-message.test.js +0 -264
  493. package/esm/hooks/use-current-message.test.js.map +0 -1
  494. package/esm/hooks/use-streaming-props.d.ts +0 -11
  495. package/esm/hooks/use-streaming-props.d.ts.map +0 -1
  496. package/esm/hooks/use-streaming-props.js +0 -34
  497. package/esm/hooks/use-streaming-props.js.map +0 -1
  498. package/esm/hooks/use-suggestions.d.ts +0 -46
  499. package/esm/hooks/use-suggestions.d.ts.map +0 -1
  500. package/esm/hooks/use-suggestions.js +0 -115
  501. package/esm/hooks/use-suggestions.js.map +0 -1
  502. package/esm/hooks/use-suggestions.test.d.ts +0 -2
  503. package/esm/hooks/use-suggestions.test.d.ts.map +0 -1
  504. package/esm/hooks/use-suggestions.test.js +0 -245
  505. package/esm/hooks/use-suggestions.test.js.map +0 -1
  506. package/esm/hooks/use-tambo-stream-status.d.ts +0 -90
  507. package/esm/hooks/use-tambo-stream-status.d.ts.map +0 -1
  508. package/esm/hooks/use-tambo-stream-status.js +0 -210
  509. package/esm/hooks/use-tambo-stream-status.js.map +0 -1
  510. package/esm/hooks/use-tambo-stream-status.test.d.ts +0 -2
  511. package/esm/hooks/use-tambo-stream-status.test.d.ts.map +0 -1
  512. package/esm/hooks/use-tambo-stream-status.test.js +0 -376
  513. package/esm/hooks/use-tambo-stream-status.test.js.map +0 -1
  514. package/esm/hooks/use-tambo-threads.d.ts +0 -158
  515. package/esm/hooks/use-tambo-threads.d.ts.map +0 -1
  516. package/esm/hooks/use-tambo-threads.js +0 -42
  517. package/esm/hooks/use-tambo-threads.js.map +0 -1
  518. package/esm/hooks/use-tambo-threads.test.d.ts +0 -2
  519. package/esm/hooks/use-tambo-threads.test.d.ts.map +0 -1
  520. package/esm/hooks/use-tambo-threads.test.js +0 -212
  521. package/esm/hooks/use-tambo-threads.test.js.map +0 -1
  522. package/esm/model/generate-component-response.d.ts +0 -37
  523. package/esm/model/generate-component-response.d.ts.map +0 -1
  524. package/esm/model/generate-component-response.js +0 -25
  525. package/esm/model/generate-component-response.js.map +0 -1
  526. package/esm/model/tambo-thread.d.ts +0 -15
  527. package/esm/model/tambo-thread.d.ts.map +0 -1
  528. package/esm/model/tambo-thread.js +0 -2
  529. package/esm/model/tambo-thread.js.map +0 -1
  530. package/esm/providers/__tests__/thread-input-resource-resolution.test.d.ts +0 -2
  531. package/esm/providers/__tests__/thread-input-resource-resolution.test.d.ts.map +0 -1
  532. package/esm/providers/__tests__/thread-input-resource-resolution.test.js +0 -587
  533. package/esm/providers/__tests__/thread-input-resource-resolution.test.js.map +0 -1
  534. package/esm/providers/index.d.ts +0 -13
  535. package/esm/providers/index.d.ts.map +0 -1
  536. package/esm/providers/index.js +0 -11
  537. package/esm/providers/index.js.map +0 -1
  538. package/esm/providers/tambo-component-provider.d.ts +0 -23
  539. package/esm/providers/tambo-component-provider.d.ts.map +0 -1
  540. package/esm/providers/tambo-component-provider.js +0 -50
  541. package/esm/providers/tambo-component-provider.js.map +0 -1
  542. package/esm/providers/tambo-prop-stream-provider/index.d.ts +0 -19
  543. package/esm/providers/tambo-prop-stream-provider/index.d.ts.map +0 -1
  544. package/esm/providers/tambo-prop-stream-provider/index.js +0 -22
  545. package/esm/providers/tambo-prop-stream-provider/index.js.map +0 -1
  546. package/esm/providers/tambo-prop-stream-provider/pending.d.ts +0 -12
  547. package/esm/providers/tambo-prop-stream-provider/pending.d.ts.map +0 -1
  548. package/esm/providers/tambo-prop-stream-provider/pending.js +0 -24
  549. package/esm/providers/tambo-prop-stream-provider/pending.js.map +0 -1
  550. package/esm/providers/tambo-prop-stream-provider/provider.d.ts +0 -17
  551. package/esm/providers/tambo-prop-stream-provider/provider.d.ts.map +0 -1
  552. package/esm/providers/tambo-prop-stream-provider/provider.js +0 -70
  553. package/esm/providers/tambo-prop-stream-provider/provider.js.map +0 -1
  554. package/esm/providers/tambo-prop-stream-provider/streaming.d.ts +0 -12
  555. package/esm/providers/tambo-prop-stream-provider/streaming.d.ts.map +0 -1
  556. package/esm/providers/tambo-prop-stream-provider/streaming.js +0 -21
  557. package/esm/providers/tambo-prop-stream-provider/streaming.js.map +0 -1
  558. package/esm/providers/tambo-prop-stream-provider/success.d.ts +0 -12
  559. package/esm/providers/tambo-prop-stream-provider/success.d.ts.map +0 -1
  560. package/esm/providers/tambo-prop-stream-provider/success.js +0 -21
  561. package/esm/providers/tambo-prop-stream-provider/success.js.map +0 -1
  562. package/esm/providers/tambo-prop-stream-provider/types.d.ts +0 -25
  563. package/esm/providers/tambo-prop-stream-provider/types.d.ts.map +0 -1
  564. package/esm/providers/tambo-prop-stream-provider/types.js +0 -3
  565. package/esm/providers/tambo-prop-stream-provider/types.js.map +0 -1
  566. package/esm/providers/tambo-prop-stream-provider.test.d.ts +0 -2
  567. package/esm/providers/tambo-prop-stream-provider.test.d.ts.map +0 -1
  568. package/esm/providers/tambo-prop-stream-provider.test.js +0 -270
  569. package/esm/providers/tambo-prop-stream-provider.test.js.map +0 -1
  570. package/esm/providers/tambo-provider.d.ts +0 -53
  571. package/esm/providers/tambo-provider.d.ts.map +0 -1
  572. package/esm/providers/tambo-provider.js +0 -94
  573. package/esm/providers/tambo-provider.js.map +0 -1
  574. package/esm/providers/tambo-stubs.d.ts +0 -89
  575. package/esm/providers/tambo-stubs.d.ts.map +0 -1
  576. package/esm/providers/tambo-stubs.js +0 -242
  577. package/esm/providers/tambo-stubs.js.map +0 -1
  578. package/esm/providers/tambo-stubs.test.d.ts +0 -2
  579. package/esm/providers/tambo-stubs.test.d.ts.map +0 -1
  580. package/esm/providers/tambo-stubs.test.js +0 -62
  581. package/esm/providers/tambo-stubs.test.js.map +0 -1
  582. package/esm/providers/tambo-thread-input-provider.d.ts +0 -65
  583. package/esm/providers/tambo-thread-input-provider.d.ts.map +0 -1
  584. package/esm/providers/tambo-thread-input-provider.js +0 -141
  585. package/esm/providers/tambo-thread-input-provider.js.map +0 -1
  586. package/esm/providers/tambo-thread-provider-initial-messages.test.d.ts +0 -2
  587. package/esm/providers/tambo-thread-provider-initial-messages.test.d.ts.map +0 -1
  588. package/esm/providers/tambo-thread-provider-initial-messages.test.js +0 -273
  589. package/esm/providers/tambo-thread-provider-initial-messages.test.js.map +0 -1
  590. package/esm/providers/tambo-thread-provider.d.ts +0 -126
  591. package/esm/providers/tambo-thread-provider.d.ts.map +0 -1
  592. package/esm/providers/tambo-thread-provider.js +0 -891
  593. package/esm/providers/tambo-thread-provider.js.map +0 -1
  594. package/esm/providers/tambo-thread-provider.test.d.ts +0 -2
  595. package/esm/providers/tambo-thread-provider.test.d.ts.map +0 -1
  596. package/esm/providers/tambo-thread-provider.test.js +0 -1553
  597. package/esm/providers/tambo-thread-provider.test.js.map +0 -1
  598. package/esm/util/generate-component.d.ts +0 -12
  599. package/esm/util/generate-component.d.ts.map +0 -1
  600. package/esm/util/generate-component.js +0 -52
  601. package/esm/util/generate-component.js.map +0 -1
  602. package/esm/util/generate-component.test.d.ts +0 -2
  603. package/esm/util/generate-component.test.d.ts.map +0 -1
  604. package/esm/util/generate-component.test.js +0 -302
  605. package/esm/util/generate-component.test.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import { act, renderHook } from "@testing-library/react";
2
- import { useTamboV1ComponentState } from "./use-tambo-v1-component-state.js";
2
+ import { useTamboComponentState } from "./use-tambo-v1-component-state.js";
3
3
  // Mock the required modules
4
4
  jest.mock("../../providers/tambo-client-provider", () => ({
5
5
  useTamboClient: jest.fn(),
@@ -8,10 +8,13 @@ jest.mock("../providers/tambo-v1-stream-context", () => ({
8
8
  useStreamState: jest.fn(),
9
9
  }));
10
10
  jest.mock("../utils/component-renderer", () => ({
11
- useV1ComponentContent: jest.fn(),
11
+ useComponentContentOptional: jest.fn(),
12
12
  }));
13
13
  const mockSetInteractableState = jest.fn();
14
14
  const mockGetInteractableComponentState = jest.fn(() => undefined);
15
+ jest.mock("../providers/tambo-v1-provider", () => ({
16
+ useTamboConfig: jest.fn(() => ({})),
17
+ }));
15
18
  jest.mock("../../providers/tambo-interactable-provider", () => ({
16
19
  useTamboInteractable: () => ({
17
20
  interactableComponents: [],
@@ -41,10 +44,11 @@ jest.mock("use-debounce", () => ({
41
44
  }));
42
45
  // Import the mocked modules
43
46
  import { useTamboClient } from "../../providers/tambo-client-provider.js";
47
+ import { useTamboConfig } from "../providers/tambo-v1-provider.js";
44
48
  import { useStreamState } from "../providers/tambo-v1-stream-context.js";
45
- import { useV1ComponentContent } from "../utils/component-renderer.js";
49
+ import { useComponentContentOptional } from "../utils/component-renderer.js";
46
50
  import { useDebouncedCallback } from "use-debounce";
47
- describe("useTamboV1ComponentState", () => {
51
+ describe("useTamboComponentState", () => {
48
52
  const mockUpdateState = jest.fn();
49
53
  const mockComponentId = "comp_test123";
50
54
  const mockThreadId = "thread_abc";
@@ -85,6 +89,7 @@ describe("useTamboV1ComponentState", () => {
85
89
  });
86
90
  beforeEach(() => {
87
91
  jest.clearAllMocks();
92
+ jest.mocked(useTamboConfig).mockReturnValue({});
88
93
  // Setup default mocks
89
94
  jest.mocked(useTamboClient).mockReturnValue({
90
95
  threads: {
@@ -93,7 +98,7 @@ describe("useTamboV1ComponentState", () => {
93
98
  },
94
99
  },
95
100
  });
96
- jest.mocked(useV1ComponentContent).mockReturnValue({
101
+ jest.mocked(useComponentContentOptional).mockReturnValue({
97
102
  componentId: mockComponentId,
98
103
  threadId: mockThreadId,
99
104
  messageId: mockMessageId,
@@ -116,7 +121,7 @@ describe("useTamboV1ComponentState", () => {
116
121
  it("should initialize with initialValue when no server state exists", () => {
117
122
  const initialValue = "test-initial";
118
123
  jest.mocked(useStreamState).mockReturnValue(createMockStreamState({}));
119
- const { result } = renderHook(() => useTamboV1ComponentState("testKey", initialValue));
124
+ const { result } = renderHook(() => useTamboComponentState("testKey", initialValue));
120
125
  expect(result.current[0]).toBe(initialValue);
121
126
  });
122
127
  it("should use server state over initialValue", () => {
@@ -125,12 +130,12 @@ describe("useTamboV1ComponentState", () => {
125
130
  jest
126
131
  .mocked(useStreamState)
127
132
  .mockReturnValue(createMockStreamState({ testKey: serverValue }));
128
- const { result } = renderHook(() => useTamboV1ComponentState("testKey", initialValue));
133
+ const { result } = renderHook(() => useTamboComponentState("testKey", initialValue));
129
134
  expect(result.current[0]).toBe(serverValue);
130
135
  });
131
136
  it("should handle undefined initialValue gracefully", () => {
132
137
  jest.mocked(useStreamState).mockReturnValue(createMockStreamState({}));
133
- const { result } = renderHook(() => useTamboV1ComponentState("testKey"));
138
+ const { result } = renderHook(() => useTamboComponentState("testKey"));
134
139
  expect(result.current[0]).toBeUndefined();
135
140
  });
136
141
  it("should handle different data types correctly", () => {
@@ -145,7 +150,7 @@ describe("useTamboV1ComponentState", () => {
145
150
  jest
146
151
  .mocked(useStreamState)
147
152
  .mockReturnValue(createMockStreamState({ testKey: value }));
148
- const { result } = renderHook(() => useTamboV1ComponentState("testKey", value));
153
+ const { result } = renderHook(() => useTamboComponentState("testKey", value));
149
154
  expect(result.current[0]).toEqual(value);
150
155
  });
151
156
  });
@@ -156,7 +161,7 @@ describe("useTamboV1ComponentState", () => {
156
161
  jest
157
162
  .mocked(useStreamState)
158
163
  .mockReturnValue(createMockStreamState({ testKey: initialValue }));
159
- const { result } = renderHook(() => useTamboV1ComponentState("testKey", initialValue));
164
+ const { result } = renderHook(() => useTamboComponentState("testKey", initialValue));
160
165
  const newValue = "updated";
161
166
  act(() => {
162
167
  result.current[1](newValue);
@@ -168,7 +173,7 @@ describe("useTamboV1ComponentState", () => {
168
173
  jest
169
174
  .mocked(useStreamState)
170
175
  .mockReturnValue(createMockStreamState({ counter: initialValue }));
171
- const { result } = renderHook(() => useTamboV1ComponentState("counter", initialValue));
176
+ const { result } = renderHook(() => useTamboComponentState("counter", initialValue));
172
177
  act(() => {
173
178
  result.current[1]((prev) => (prev ?? 0) + 1);
174
179
  });
@@ -179,7 +184,7 @@ describe("useTamboV1ComponentState", () => {
179
184
  jest
180
185
  .mocked(useStreamState)
181
186
  .mockReturnValue(createMockStreamState({ testKey: initialValue }));
182
- const { result } = renderHook(() => useTamboV1ComponentState("testKey", initialValue));
187
+ const { result } = renderHook(() => useTamboComponentState("testKey", initialValue));
183
188
  const newValue = "updated";
184
189
  act(() => {
185
190
  result.current[1](newValue);
@@ -188,6 +193,7 @@ describe("useTamboV1ComponentState", () => {
188
193
  expect(mockUpdateState).toHaveBeenCalledWith(mockComponentId, {
189
194
  threadId: mockThreadId,
190
195
  state: { testKey: newValue },
196
+ userKey: undefined,
191
197
  });
192
198
  });
193
199
  it("should work with complex objects", () => {
@@ -195,7 +201,7 @@ describe("useTamboV1ComponentState", () => {
195
201
  jest
196
202
  .mocked(useStreamState)
197
203
  .mockReturnValue(createMockStreamState({ data: initialValue }));
198
- const { result } = renderHook(() => useTamboV1ComponentState("data", initialValue));
204
+ const { result } = renderHook(() => useTamboComponentState("data", initialValue));
199
205
  const newValue = { name: "updated", items: [4, 5, 6] };
200
206
  act(() => {
201
207
  result.current[1](newValue);
@@ -206,7 +212,7 @@ describe("useTamboV1ComponentState", () => {
206
212
  describe("Metadata", () => {
207
213
  it("should return isPending and error in meta", () => {
208
214
  jest.mocked(useStreamState).mockReturnValue(createMockStreamState({}));
209
- const { result } = renderHook(() => useTamboV1ComponentState("testKey", "initial"));
215
+ const { result } = renderHook(() => useTamboComponentState("testKey", "initial"));
210
216
  expect(result.current[2]).toEqual({
211
217
  isPending: false,
212
218
  error: null,
@@ -219,7 +225,7 @@ describe("useTamboV1ComponentState", () => {
219
225
  mockDebouncedFn.flush = mockFlush;
220
226
  jest.mocked(useDebouncedCallback).mockReturnValue(mockDebouncedFn);
221
227
  jest.mocked(useStreamState).mockReturnValue(createMockStreamState({}));
222
- const { result } = renderHook(() => useTamboV1ComponentState("testKey", "initial"));
228
+ const { result } = renderHook(() => useTamboComponentState("testKey", "initial"));
223
229
  act(() => {
224
230
  result.current[2].flush();
225
231
  });
@@ -229,13 +235,13 @@ describe("useTamboV1ComponentState", () => {
229
235
  describe("Debouncing Behavior", () => {
230
236
  it("should use default debounce time of 500ms", () => {
231
237
  jest.mocked(useStreamState).mockReturnValue(createMockStreamState({}));
232
- renderHook(() => useTamboV1ComponentState("testKey", "initial"));
238
+ renderHook(() => useTamboComponentState("testKey", "initial"));
233
239
  expect(useDebouncedCallback).toHaveBeenCalledWith(expect.any(Function), 500);
234
240
  });
235
241
  it("should use custom debounce time when provided", () => {
236
242
  jest.mocked(useStreamState).mockReturnValue(createMockStreamState({}));
237
243
  const customDebounceTime = 1000;
238
- renderHook(() => useTamboV1ComponentState("testKey", "initial", customDebounceTime));
244
+ renderHook(() => useTamboComponentState("testKey", "initial", customDebounceTime));
239
245
  expect(useDebouncedCallback).toHaveBeenCalledWith(expect.any(Function), customDebounceTime);
240
246
  });
241
247
  it("should flush debounced callback on unmount", () => {
@@ -244,7 +250,7 @@ describe("useTamboV1ComponentState", () => {
244
250
  mockDebouncedFn.flush = mockFlush;
245
251
  jest.mocked(useDebouncedCallback).mockReturnValue(mockDebouncedFn);
246
252
  jest.mocked(useStreamState).mockReturnValue(createMockStreamState({}));
247
- const { unmount } = renderHook(() => useTamboV1ComponentState("testKey", "initial"));
253
+ const { unmount } = renderHook(() => useTamboComponentState("testKey", "initial"));
248
254
  unmount();
249
255
  expect(mockFlush).toHaveBeenCalled();
250
256
  });
@@ -253,7 +259,7 @@ describe("useTamboV1ComponentState", () => {
253
259
  it("should sync with server state changes from streaming", () => {
254
260
  const streamState = createMockStreamState({ testKey: "initial" });
255
261
  jest.mocked(useStreamState).mockReturnValue(streamState);
256
- const { result, rerender } = renderHook(() => useTamboV1ComponentState("testKey", "initial"));
262
+ const { result, rerender } = renderHook(() => useTamboComponentState("testKey", "initial"));
257
263
  expect(result.current[0]).toBe("initial");
258
264
  // Simulate server state change from streaming
259
265
  const updatedStreamState = createMockStreamState({
@@ -269,7 +275,7 @@ describe("useTamboV1ComponentState", () => {
269
275
  threadMap: {},
270
276
  currentThreadId: "placeholder",
271
277
  });
272
- const { result } = renderHook(() => useTamboV1ComponentState("testKey", "default"));
278
+ const { result } = renderHook(() => useTamboComponentState("testKey", "default"));
273
279
  expect(result.current[0]).toBe("default");
274
280
  });
275
281
  });
@@ -288,7 +294,7 @@ describe("useTamboV1ComponentState", () => {
288
294
  });
289
295
  jest.mocked(useStreamState).mockReturnValue(createMockStreamState({}));
290
296
  const consoleSpy = jest.spyOn(console, "error").mockImplementation();
291
- const { result } = renderHook(() => useTamboV1ComponentState("testKey", "initial"));
297
+ const { result } = renderHook(() => useTamboComponentState("testKey", "initial"));
292
298
  await act(async () => {
293
299
  result.current[1]("new-value");
294
300
  // Wait for async operations
@@ -299,20 +305,39 @@ describe("useTamboV1ComponentState", () => {
299
305
  });
300
306
  });
301
307
  describe("Context Requirements", () => {
302
- it("should throw when used outside component content context", () => {
303
- jest.mocked(useV1ComponentContent).mockImplementation(() => {
304
- throw new Error("useV1ComponentContent must be used within a rendered component");
308
+ it("should act as plain useState when component content context is missing", () => {
309
+ jest.mocked(useComponentContentOptional).mockReturnValue(null);
310
+ jest.mocked(useStreamState).mockReturnValue({
311
+ threadMap: {},
312
+ currentThreadId: "",
313
+ });
314
+ const { result } = renderHook(() => useTamboComponentState("testKey", "initial"));
315
+ expect(result.current[0]).toBe("initial");
316
+ // No side effects when context is missing
317
+ expect(mockSetInteractableState).not.toHaveBeenCalled();
318
+ expect(mockUpdateState).not.toHaveBeenCalled();
319
+ });
320
+ it("should not trigger side effects on setState when context is missing", () => {
321
+ jest.mocked(useComponentContentOptional).mockReturnValue(null);
322
+ jest.mocked(useStreamState).mockReturnValue({
323
+ threadMap: {},
324
+ currentThreadId: "",
305
325
  });
306
- expect(() => {
307
- renderHook(() => useTamboV1ComponentState("testKey", "initial"));
308
- }).toThrow("useV1ComponentContent must be used within a rendered component");
326
+ const { result } = renderHook(() => useTamboComponentState("testKey", "initial"));
327
+ act(() => {
328
+ result.current[1]("updated");
329
+ });
330
+ // Local state updates, but no server sync or interactable writes
331
+ expect(result.current[0]).toBe("updated");
332
+ expect(mockSetInteractableState).not.toHaveBeenCalled();
333
+ expect(mockUpdateState).not.toHaveBeenCalled();
309
334
  });
310
335
  });
311
336
  describe("Interactable Component Support", () => {
312
337
  const interactableComponentId = "MyWidget-abc";
313
338
  beforeEach(() => {
314
339
  // Simulate interactable context: threadId="" signals interactable
315
- jest.mocked(useV1ComponentContent).mockReturnValue({
340
+ jest.mocked(useComponentContentOptional).mockReturnValue({
316
341
  componentId: interactableComponentId,
317
342
  threadId: "",
318
343
  messageId: "",
@@ -326,17 +351,17 @@ describe("useTamboV1ComponentState", () => {
326
351
  });
327
352
  it("should initialize with initialValue when no interactable state exists", () => {
328
353
  mockGetInteractableComponentState.mockReturnValue(undefined);
329
- const { result } = renderHook(() => useTamboV1ComponentState("count", 42));
354
+ const { result } = renderHook(() => useTamboComponentState("count", 42));
330
355
  expect(result.current[0]).toBe(42);
331
356
  });
332
357
  it("should initialize from interactable state when it exists", () => {
333
358
  mockGetInteractableComponentState.mockReturnValue({ count: 99 });
334
- const { result } = renderHook(() => useTamboV1ComponentState("count", 0));
359
+ const { result } = renderHook(() => useTamboComponentState("count", 0));
335
360
  expect(result.current[0]).toBe(99);
336
361
  });
337
362
  it("should call setInteractableState when setState is called", () => {
338
363
  mockGetInteractableComponentState.mockReturnValue(undefined);
339
- const { result } = renderHook(() => useTamboV1ComponentState("count", 0));
364
+ const { result } = renderHook(() => useTamboComponentState("count", 0));
340
365
  act(() => {
341
366
  result.current[1](10);
342
367
  });
@@ -344,7 +369,7 @@ describe("useTamboV1ComponentState", () => {
344
369
  });
345
370
  it("should NOT call client.threads.state.updateState for interactable components", () => {
346
371
  mockGetInteractableComponentState.mockReturnValue(undefined);
347
- const { result } = renderHook(() => useTamboV1ComponentState("count", 0));
372
+ const { result } = renderHook(() => useTamboComponentState("count", 0));
348
373
  act(() => {
349
374
  result.current[1](10);
350
375
  });
@@ -352,7 +377,7 @@ describe("useTamboV1ComponentState", () => {
352
377
  });
353
378
  it("should sync from interactable provider when state changes externally", () => {
354
379
  mockGetInteractableComponentState.mockReturnValue({ count: 0 });
355
- const { result, rerender } = renderHook(() => useTamboV1ComponentState("count", 0));
380
+ const { result, rerender } = renderHook(() => useTamboComponentState("count", 0));
356
381
  expect(result.current[0]).toBe(0);
357
382
  // Simulate external state change (e.g., AI tool call)
358
383
  mockGetInteractableComponentState.mockReturnValue({ count: 77 });
@@ -361,18 +386,18 @@ describe("useTamboV1ComponentState", () => {
361
386
  });
362
387
  it("should have isPending as false in interactable context", () => {
363
388
  mockGetInteractableComponentState.mockReturnValue(undefined);
364
- const { result } = renderHook(() => useTamboV1ComponentState("count", 0));
389
+ const { result } = renderHook(() => useTamboComponentState("count", 0));
365
390
  expect(result.current[2].isPending).toBe(false);
366
391
  expect(result.current[2].error).toBeNull();
367
392
  });
368
393
  it("should set initial value in interactable state on mount when no existing state", () => {
369
394
  mockGetInteractableComponentState.mockReturnValue(undefined);
370
- renderHook(() => useTamboV1ComponentState("count", 42));
395
+ renderHook(() => useTamboComponentState("count", 42));
371
396
  expect(mockSetInteractableState).toHaveBeenCalledWith(interactableComponentId, "count", 42);
372
397
  });
373
398
  it("should NOT set initial value in interactable state when state already exists", () => {
374
399
  mockGetInteractableComponentState.mockReturnValue({ count: 99 });
375
- renderHook(() => useTamboV1ComponentState("count", 42));
400
+ renderHook(() => useTamboComponentState("count", 42));
376
401
  // Should not be called because state already exists
377
402
  expect(mockSetInteractableState).not.toHaveBeenCalled();
378
403
  });
@@ -382,7 +407,7 @@ describe("useTamboV1ComponentState", () => {
382
407
  mockDebouncedFn.flush = mockFlush;
383
408
  jest.mocked(useDebouncedCallback).mockReturnValue(mockDebouncedFn);
384
409
  mockGetInteractableComponentState.mockReturnValue(undefined);
385
- const { unmount } = renderHook(() => useTamboV1ComponentState("count", 0));
410
+ const { unmount } = renderHook(() => useTamboComponentState("count", 0));
386
411
  unmount();
387
412
  expect(mockFlush).not.toHaveBeenCalled();
388
413
  });
@@ -1 +1 @@
1
- {"version":3,"file":"use-tambo-v1-component-state.test.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-component-state.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import { act, renderHook } from \"@testing-library/react\";\nimport { useTamboV1ComponentState } from \"./use-tambo-v1-component-state\";\n\n// Mock the required modules\njest.mock(\"../../providers/tambo-client-provider\", () => ({\n useTamboClient: jest.fn(),\n}));\n\njest.mock(\"../providers/tambo-v1-stream-context\", () => ({\n useStreamState: jest.fn(),\n}));\n\njest.mock(\"../utils/component-renderer\", () => ({\n useV1ComponentContent: jest.fn(),\n}));\n\nconst mockSetInteractableState = jest.fn();\nconst mockGetInteractableComponentState = jest.fn<\n Record<string, unknown> | undefined,\n [string]\n>(() => undefined);\n\njest.mock(\"../../providers/tambo-interactable-provider\", () => ({\n useTamboInteractable: () => ({\n interactableComponents: [],\n addInteractableComponent: jest.fn(),\n removeInteractableComponent: jest.fn(),\n updateInteractableComponentProps: jest.fn(),\n getInteractableComponent: jest.fn(),\n getInteractableComponentsByName: jest.fn(),\n clearAllInteractableComponents: jest.fn(),\n setInteractableState: mockSetInteractableState,\n getInteractableComponentState: mockGetInteractableComponentState,\n setInteractableSelected: jest.fn(),\n clearInteractableSelections: jest.fn(),\n }),\n}));\n\n// Create a mock debounced function with flush method\nconst createMockDebouncedFunction = (fn: (...args: unknown[]) => unknown) => {\n const debouncedFn = jest.fn((...args: unknown[]) =>\n fn(...args),\n ) as jest.Mock & {\n flush: jest.Mock;\n cancel: jest.Mock;\n isPending: () => boolean;\n };\n debouncedFn.flush = jest.fn();\n debouncedFn.cancel = jest.fn();\n debouncedFn.isPending = jest.fn(() => false);\n return debouncedFn;\n};\n\n// Mock use-debounce\njest.mock(\"use-debounce\", () => ({\n useDebouncedCallback: jest.fn(),\n}));\n\n// Import the mocked modules\nimport { useTamboClient } from \"../../providers/tambo-client-provider\";\nimport { useStreamState } from \"../providers/tambo-v1-stream-context\";\nimport { useV1ComponentContent } from \"../utils/component-renderer\";\nimport { useDebouncedCallback } from \"use-debounce\";\nimport type { StreamState } from \"../utils/event-accumulator\";\nimport type { V1ComponentContent } from \"../types/message\";\n\ndescribe(\"useTamboV1ComponentState\", () => {\n const mockUpdateState = jest.fn();\n const mockComponentId = \"comp_test123\";\n const mockThreadId = \"thread_abc\";\n const mockMessageId = \"msg_xyz\";\n\n // Helper to create mock stream state\n const createMockStreamState = (\n componentState?: Record<string, unknown>,\n ): StreamState => ({\n threadMap: {\n [mockThreadId]: {\n thread: {\n id: mockThreadId,\n messages: [\n {\n id: mockMessageId,\n role: \"assistant\",\n content: [\n {\n type: \"component\",\n id: mockComponentId,\n name: \"TestComponent\",\n props: {},\n state: componentState,\n streamingState: \"done\",\n } as V1ComponentContent,\n ],\n createdAt: new Date().toISOString(),\n },\n ],\n status: \"idle\",\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n lastRunCancelled: false,\n },\n streaming: { status: \"idle\" },\n accumulatingToolArgs: new Map(),\n },\n },\n currentThreadId: mockThreadId,\n });\n\n beforeEach(() => {\n jest.clearAllMocks();\n\n // Setup default mocks\n jest.mocked(useTamboClient).mockReturnValue({\n threads: {\n state: {\n updateState: mockUpdateState,\n },\n },\n } as unknown as ReturnType<typeof useTamboClient>);\n\n jest.mocked(useV1ComponentContent).mockReturnValue({\n componentId: mockComponentId,\n threadId: mockThreadId,\n messageId: mockMessageId,\n componentName: \"TestComponent\",\n });\n\n jest.mocked(useStreamState).mockReturnValue(createMockStreamState());\n\n // Setup default mock for useDebouncedCallback\n jest\n .mocked(useDebouncedCallback)\n .mockImplementation((fn) => createMockDebouncedFunction(fn));\n\n // Reset interactable mocks to default (no interactable state)\n mockSetInteractableState.mockClear();\n mockGetInteractableComponentState.mockReset();\n mockGetInteractableComponentState.mockReturnValue(undefined);\n });\n\n afterEach(() => {\n jest.restoreAllMocks();\n });\n\n describe(\"Initial State Management\", () => {\n it(\"should initialize with initialValue when no server state exists\", () => {\n const initialValue = \"test-initial\";\n jest.mocked(useStreamState).mockReturnValue(createMockStreamState({}));\n\n const { result } = renderHook(() =>\n useTamboV1ComponentState(\"testKey\", initialValue),\n );\n\n expect(result.current[0]).toBe(initialValue);\n });\n\n it(\"should use server state over initialValue\", () => {\n const initialValue = \"initial\";\n const serverValue = \"server-value\";\n jest\n .mocked(useStreamState)\n .mockReturnValue(createMockStreamState({ testKey: serverValue }));\n\n const { result } = renderHook(() =>\n useTamboV1ComponentState(\"testKey\", initialValue),\n );\n\n expect(result.current[0]).toBe(serverValue);\n });\n\n it(\"should handle undefined initialValue gracefully\", () => {\n jest.mocked(useStreamState).mockReturnValue(createMockStreamState({}));\n\n const { result } = renderHook(() => useTamboV1ComponentState(\"testKey\"));\n\n expect(result.current[0]).toBeUndefined();\n });\n\n it(\"should handle different data types correctly\", () => {\n const testCases = [\n { value: \"string\" },\n { value: 42 },\n { value: true },\n { value: { name: \"test\" } },\n { value: [1, 2, 3] },\n ];\n\n testCases.forEach(({ value }) => {\n jest\n .mocked(useStreamState)\n .mockReturnValue(createMockStreamState({ testKey: value }));\n\n const { result } = renderHook(() =>\n useTamboV1ComponentState(\"testKey\", value),\n );\n\n expect(result.current[0]).toEqual(value);\n });\n });\n });\n\n describe(\"State Updates\", () => {\n it(\"should update local state immediately when setState is called\", () => {\n const initialValue = \"initial\";\n jest\n .mocked(useStreamState)\n .mockReturnValue(createMockStreamState({ testKey: initialValue }));\n\n const { result } = renderHook(() =>\n useTamboV1ComponentState(\"testKey\", initialValue),\n );\n\n const newValue = \"updated\";\n act(() => {\n result.current[1](newValue);\n });\n\n expect(result.current[0]).toBe(newValue);\n });\n\n it(\"should support functional updates\", () => {\n const initialValue = 5;\n jest\n .mocked(useStreamState)\n .mockReturnValue(createMockStreamState({ counter: initialValue }));\n\n const { result } = renderHook(() =>\n useTamboV1ComponentState(\"counter\", initialValue),\n );\n\n act(() => {\n result.current[1]((prev) => (prev ?? 0) + 1);\n });\n\n expect(result.current[0]).toBe(6);\n });\n\n it(\"should trigger debounced API call when setState is called\", () => {\n const initialValue = \"initial\";\n jest\n .mocked(useStreamState)\n .mockReturnValue(createMockStreamState({ testKey: initialValue }));\n\n const { result } = renderHook(() =>\n useTamboV1ComponentState(\"testKey\", initialValue),\n );\n\n const newValue = \"updated\";\n act(() => {\n result.current[1](newValue);\n });\n\n // The debounced function should be called\n expect(mockUpdateState).toHaveBeenCalledWith(mockComponentId, {\n threadId: mockThreadId,\n state: { testKey: newValue },\n });\n });\n\n it(\"should work with complex objects\", () => {\n const initialValue = { name: \"test\", items: [1, 2, 3] };\n jest\n .mocked(useStreamState)\n .mockReturnValue(createMockStreamState({ data: initialValue }));\n\n const { result } = renderHook(() =>\n useTamboV1ComponentState(\"data\", initialValue),\n );\n\n const newValue = { name: \"updated\", items: [4, 5, 6] };\n act(() => {\n result.current[1](newValue);\n });\n\n expect(result.current[0]).toEqual(newValue);\n });\n });\n\n describe(\"Metadata\", () => {\n it(\"should return isPending and error in meta\", () => {\n jest.mocked(useStreamState).mockReturnValue(createMockStreamState({}));\n\n const { result } = renderHook(() =>\n useTamboV1ComponentState(\"testKey\", \"initial\"),\n );\n\n expect(result.current[2]).toEqual({\n isPending: false,\n error: null,\n flush: expect.any(Function),\n });\n });\n\n it(\"should provide a flush function\", () => {\n const mockFlush = jest.fn();\n const mockDebouncedFn = createMockDebouncedFunction(jest.fn());\n mockDebouncedFn.flush = mockFlush;\n jest.mocked(useDebouncedCallback).mockReturnValue(mockDebouncedFn);\n\n jest.mocked(useStreamState).mockReturnValue(createMockStreamState({}));\n\n const { result } = renderHook(() =>\n useTamboV1ComponentState(\"testKey\", \"initial\"),\n );\n\n act(() => {\n result.current[2].flush();\n });\n\n expect(mockFlush).toHaveBeenCalled();\n });\n });\n\n describe(\"Debouncing Behavior\", () => {\n it(\"should use default debounce time of 500ms\", () => {\n jest.mocked(useStreamState).mockReturnValue(createMockStreamState({}));\n\n renderHook(() => useTamboV1ComponentState(\"testKey\", \"initial\"));\n\n expect(useDebouncedCallback).toHaveBeenCalledWith(\n expect.any(Function),\n 500,\n );\n });\n\n it(\"should use custom debounce time when provided\", () => {\n jest.mocked(useStreamState).mockReturnValue(createMockStreamState({}));\n const customDebounceTime = 1000;\n\n renderHook(() =>\n useTamboV1ComponentState(\"testKey\", \"initial\", customDebounceTime),\n );\n\n expect(useDebouncedCallback).toHaveBeenCalledWith(\n expect.any(Function),\n customDebounceTime,\n );\n });\n\n it(\"should flush debounced callback on unmount\", () => {\n const mockFlush = jest.fn();\n const mockDebouncedFn = createMockDebouncedFunction(jest.fn());\n mockDebouncedFn.flush = mockFlush;\n jest.mocked(useDebouncedCallback).mockReturnValue(mockDebouncedFn);\n\n jest.mocked(useStreamState).mockReturnValue(createMockStreamState({}));\n\n const { unmount } = renderHook(() =>\n useTamboV1ComponentState(\"testKey\", \"initial\"),\n );\n\n unmount();\n\n expect(mockFlush).toHaveBeenCalled();\n });\n });\n\n describe(\"Server State Sync\", () => {\n it(\"should sync with server state changes from streaming\", () => {\n const streamState = createMockStreamState({ testKey: \"initial\" });\n jest.mocked(useStreamState).mockReturnValue(streamState);\n\n const { result, rerender } = renderHook(() =>\n useTamboV1ComponentState(\"testKey\", \"initial\"),\n );\n\n expect(result.current[0]).toBe(\"initial\");\n\n // Simulate server state change from streaming\n const updatedStreamState = createMockStreamState({\n testKey: \"updated-from-server\",\n });\n jest.mocked(useStreamState).mockReturnValue(updatedStreamState);\n\n rerender();\n\n expect(result.current[0]).toBe(\"updated-from-server\");\n });\n\n it(\"should handle component not found in stream state\", () => {\n // Empty stream state (no matching component)\n jest.mocked(useStreamState).mockReturnValue({\n threadMap: {},\n currentThreadId: \"placeholder\",\n });\n\n const { result } = renderHook(() =>\n useTamboV1ComponentState(\"testKey\", \"default\"),\n );\n\n expect(result.current[0]).toBe(\"default\");\n });\n });\n\n describe(\"Error Handling\", () => {\n it(\"should handle API errors gracefully\", async () => {\n const mockError = new Error(\"API Error\");\n mockUpdateState.mockRejectedValue(mockError);\n\n // Create a sync mock that calls the function immediately\n jest.mocked(useDebouncedCallback).mockImplementation((fn) => {\n const debouncedFn = Object.assign(\n async (...args: unknown[]) => fn(...args),\n {\n flush: jest.fn(),\n cancel: jest.fn(),\n isPending: () => false,\n },\n ) as unknown as ReturnType<typeof useDebouncedCallback>;\n return debouncedFn;\n });\n\n jest.mocked(useStreamState).mockReturnValue(createMockStreamState({}));\n\n const consoleSpy = jest.spyOn(console, \"error\").mockImplementation();\n\n const { result } = renderHook(() =>\n useTamboV1ComponentState(\"testKey\", \"initial\"),\n );\n\n await act(async () => {\n result.current[1](\"new-value\");\n // Wait for async operations\n await new Promise((resolve) => setTimeout(resolve, 0));\n });\n\n expect(consoleSpy).toHaveBeenCalledWith(\n expect.stringContaining(\"Failed to sync state\"),\n mockError,\n );\n\n consoleSpy.mockRestore();\n });\n });\n\n describe(\"Context Requirements\", () => {\n it(\"should throw when used outside component content context\", () => {\n jest.mocked(useV1ComponentContent).mockImplementation(() => {\n throw new Error(\n \"useV1ComponentContent must be used within a rendered component\",\n );\n });\n\n expect(() => {\n renderHook(() => useTamboV1ComponentState(\"testKey\", \"initial\"));\n }).toThrow(\n \"useV1ComponentContent must be used within a rendered component\",\n );\n });\n });\n\n describe(\"Interactable Component Support\", () => {\n const interactableComponentId = \"MyWidget-abc\";\n\n beforeEach(() => {\n // Simulate interactable context: threadId=\"\" signals interactable\n jest.mocked(useV1ComponentContent).mockReturnValue({\n componentId: interactableComponentId,\n threadId: \"\",\n messageId: \"\",\n componentName: \"MyWidget\",\n });\n\n // Empty stream state - interactable components don't use it\n jest.mocked(useStreamState).mockReturnValue({\n threadMap: {},\n currentThreadId: \"\",\n });\n });\n\n it(\"should initialize with initialValue when no interactable state exists\", () => {\n mockGetInteractableComponentState.mockReturnValue(undefined);\n\n const { result } = renderHook(() =>\n useTamboV1ComponentState(\"count\", 42),\n );\n\n expect(result.current[0]).toBe(42);\n });\n\n it(\"should initialize from interactable state when it exists\", () => {\n mockGetInteractableComponentState.mockReturnValue({ count: 99 });\n\n const { result } = renderHook(() => useTamboV1ComponentState(\"count\", 0));\n\n expect(result.current[0]).toBe(99);\n });\n\n it(\"should call setInteractableState when setState is called\", () => {\n mockGetInteractableComponentState.mockReturnValue(undefined);\n\n const { result } = renderHook(() => useTamboV1ComponentState(\"count\", 0));\n\n act(() => {\n result.current[1](10);\n });\n\n expect(mockSetInteractableState).toHaveBeenCalledWith(\n interactableComponentId,\n \"count\",\n 10,\n );\n });\n\n it(\"should NOT call client.threads.state.updateState for interactable components\", () => {\n mockGetInteractableComponentState.mockReturnValue(undefined);\n\n const { result } = renderHook(() => useTamboV1ComponentState(\"count\", 0));\n\n act(() => {\n result.current[1](10);\n });\n\n expect(mockUpdateState).not.toHaveBeenCalled();\n });\n\n it(\"should sync from interactable provider when state changes externally\", () => {\n mockGetInteractableComponentState.mockReturnValue({ count: 0 });\n\n const { result, rerender } = renderHook(() =>\n useTamboV1ComponentState(\"count\", 0),\n );\n\n expect(result.current[0]).toBe(0);\n\n // Simulate external state change (e.g., AI tool call)\n mockGetInteractableComponentState.mockReturnValue({ count: 77 });\n\n rerender();\n\n expect(result.current[0]).toBe(77);\n });\n\n it(\"should have isPending as false in interactable context\", () => {\n mockGetInteractableComponentState.mockReturnValue(undefined);\n\n const { result } = renderHook(() => useTamboV1ComponentState(\"count\", 0));\n\n expect(result.current[2].isPending).toBe(false);\n expect(result.current[2].error).toBeNull();\n });\n\n it(\"should set initial value in interactable state on mount when no existing state\", () => {\n mockGetInteractableComponentState.mockReturnValue(undefined);\n\n renderHook(() => useTamboV1ComponentState(\"count\", 42));\n\n expect(mockSetInteractableState).toHaveBeenCalledWith(\n interactableComponentId,\n \"count\",\n 42,\n );\n });\n\n it(\"should NOT set initial value in interactable state when state already exists\", () => {\n mockGetInteractableComponentState.mockReturnValue({ count: 99 });\n\n renderHook(() => useTamboV1ComponentState(\"count\", 42));\n\n // Should not be called because state already exists\n expect(mockSetInteractableState).not.toHaveBeenCalled();\n });\n\n it(\"should not flush on unmount for interactable components\", () => {\n const mockFlush = jest.fn();\n const mockDebouncedFn = createMockDebouncedFunction(jest.fn());\n mockDebouncedFn.flush = mockFlush;\n jest.mocked(useDebouncedCallback).mockReturnValue(mockDebouncedFn);\n\n mockGetInteractableComponentState.mockReturnValue(undefined);\n\n const { unmount } = renderHook(() =>\n useTamboV1ComponentState(\"count\", 0),\n );\n\n unmount();\n\n expect(mockFlush).not.toHaveBeenCalled();\n });\n });\n});\n"]}
1
+ {"version":3,"file":"use-tambo-v1-component-state.test.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-component-state.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import { act, renderHook } from \"@testing-library/react\";\nimport { useTamboComponentState } from \"./use-tambo-v1-component-state\";\n\n// Mock the required modules\njest.mock(\"../../providers/tambo-client-provider\", () => ({\n useTamboClient: jest.fn(),\n}));\n\njest.mock(\"../providers/tambo-v1-stream-context\", () => ({\n useStreamState: jest.fn(),\n}));\n\njest.mock(\"../utils/component-renderer\", () => ({\n useComponentContentOptional: jest.fn(),\n}));\n\nconst mockSetInteractableState = jest.fn();\nconst mockGetInteractableComponentState = jest.fn<\n Record<string, unknown> | undefined,\n [string]\n>(() => undefined);\n\njest.mock(\"../providers/tambo-v1-provider\", () => ({\n useTamboConfig: jest.fn(() => ({})),\n}));\n\njest.mock(\"../../providers/tambo-interactable-provider\", () => ({\n useTamboInteractable: () => ({\n interactableComponents: [],\n addInteractableComponent: jest.fn(),\n removeInteractableComponent: jest.fn(),\n updateInteractableComponentProps: jest.fn(),\n getInteractableComponent: jest.fn(),\n getInteractableComponentsByName: jest.fn(),\n clearAllInteractableComponents: jest.fn(),\n setInteractableState: mockSetInteractableState,\n getInteractableComponentState: mockGetInteractableComponentState,\n setInteractableSelected: jest.fn(),\n clearInteractableSelections: jest.fn(),\n }),\n}));\n\n// Create a mock debounced function with flush method\nconst createMockDebouncedFunction = (fn: (...args: unknown[]) => unknown) => {\n const debouncedFn = jest.fn((...args: unknown[]) =>\n fn(...args),\n ) as jest.Mock & {\n flush: jest.Mock;\n cancel: jest.Mock;\n isPending: () => boolean;\n };\n debouncedFn.flush = jest.fn();\n debouncedFn.cancel = jest.fn();\n debouncedFn.isPending = jest.fn(() => false);\n return debouncedFn;\n};\n\n// Mock use-debounce\njest.mock(\"use-debounce\", () => ({\n useDebouncedCallback: jest.fn(),\n}));\n\n// Import the mocked modules\nimport { useTamboClient } from \"../../providers/tambo-client-provider\";\nimport { useTamboConfig } from \"../providers/tambo-v1-provider\";\nimport { useStreamState } from \"../providers/tambo-v1-stream-context\";\nimport { useComponentContentOptional } from \"../utils/component-renderer\";\nimport { useDebouncedCallback } from \"use-debounce\";\nimport type { StreamState } from \"../utils/event-accumulator\";\nimport type { TamboComponentContent } from \"../types/message\";\n\ndescribe(\"useTamboComponentState\", () => {\n const mockUpdateState = jest.fn();\n const mockComponentId = \"comp_test123\";\n const mockThreadId = \"thread_abc\";\n const mockMessageId = \"msg_xyz\";\n\n // Helper to create mock stream state\n const createMockStreamState = (\n componentState?: Record<string, unknown>,\n ): StreamState => ({\n threadMap: {\n [mockThreadId]: {\n thread: {\n id: mockThreadId,\n messages: [\n {\n id: mockMessageId,\n role: \"assistant\",\n content: [\n {\n type: \"component\",\n id: mockComponentId,\n name: \"TestComponent\",\n props: {},\n state: componentState,\n streamingState: \"done\",\n } as TamboComponentContent,\n ],\n createdAt: new Date().toISOString(),\n },\n ],\n status: \"idle\",\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n lastRunCancelled: false,\n },\n streaming: { status: \"idle\" },\n accumulatingToolArgs: new Map(),\n },\n },\n currentThreadId: mockThreadId,\n });\n\n beforeEach(() => {\n jest.clearAllMocks();\n\n jest.mocked(useTamboConfig).mockReturnValue({});\n\n // Setup default mocks\n jest.mocked(useTamboClient).mockReturnValue({\n threads: {\n state: {\n updateState: mockUpdateState,\n },\n },\n } as unknown as ReturnType<typeof useTamboClient>);\n\n jest.mocked(useComponentContentOptional).mockReturnValue({\n componentId: mockComponentId,\n threadId: mockThreadId,\n messageId: mockMessageId,\n componentName: \"TestComponent\",\n });\n\n jest.mocked(useStreamState).mockReturnValue(createMockStreamState());\n\n // Setup default mock for useDebouncedCallback\n jest\n .mocked(useDebouncedCallback)\n .mockImplementation((fn) => createMockDebouncedFunction(fn));\n\n // Reset interactable mocks to default (no interactable state)\n mockSetInteractableState.mockClear();\n mockGetInteractableComponentState.mockReset();\n mockGetInteractableComponentState.mockReturnValue(undefined);\n });\n\n afterEach(() => {\n jest.restoreAllMocks();\n });\n\n describe(\"Initial State Management\", () => {\n it(\"should initialize with initialValue when no server state exists\", () => {\n const initialValue = \"test-initial\";\n jest.mocked(useStreamState).mockReturnValue(createMockStreamState({}));\n\n const { result } = renderHook(() =>\n useTamboComponentState(\"testKey\", initialValue),\n );\n\n expect(result.current[0]).toBe(initialValue);\n });\n\n it(\"should use server state over initialValue\", () => {\n const initialValue = \"initial\";\n const serverValue = \"server-value\";\n jest\n .mocked(useStreamState)\n .mockReturnValue(createMockStreamState({ testKey: serverValue }));\n\n const { result } = renderHook(() =>\n useTamboComponentState(\"testKey\", initialValue),\n );\n\n expect(result.current[0]).toBe(serverValue);\n });\n\n it(\"should handle undefined initialValue gracefully\", () => {\n jest.mocked(useStreamState).mockReturnValue(createMockStreamState({}));\n\n const { result } = renderHook(() => useTamboComponentState(\"testKey\"));\n\n expect(result.current[0]).toBeUndefined();\n });\n\n it(\"should handle different data types correctly\", () => {\n const testCases = [\n { value: \"string\" },\n { value: 42 },\n { value: true },\n { value: { name: \"test\" } },\n { value: [1, 2, 3] },\n ];\n\n testCases.forEach(({ value }) => {\n jest\n .mocked(useStreamState)\n .mockReturnValue(createMockStreamState({ testKey: value }));\n\n const { result } = renderHook(() =>\n useTamboComponentState(\"testKey\", value),\n );\n\n expect(result.current[0]).toEqual(value);\n });\n });\n });\n\n describe(\"State Updates\", () => {\n it(\"should update local state immediately when setState is called\", () => {\n const initialValue = \"initial\";\n jest\n .mocked(useStreamState)\n .mockReturnValue(createMockStreamState({ testKey: initialValue }));\n\n const { result } = renderHook(() =>\n useTamboComponentState(\"testKey\", initialValue),\n );\n\n const newValue = \"updated\";\n act(() => {\n result.current[1](newValue);\n });\n\n expect(result.current[0]).toBe(newValue);\n });\n\n it(\"should support functional updates\", () => {\n const initialValue = 5;\n jest\n .mocked(useStreamState)\n .mockReturnValue(createMockStreamState({ counter: initialValue }));\n\n const { result } = renderHook(() =>\n useTamboComponentState(\"counter\", initialValue),\n );\n\n act(() => {\n result.current[1]((prev) => (prev ?? 0) + 1);\n });\n\n expect(result.current[0]).toBe(6);\n });\n\n it(\"should trigger debounced API call when setState is called\", () => {\n const initialValue = \"initial\";\n jest\n .mocked(useStreamState)\n .mockReturnValue(createMockStreamState({ testKey: initialValue }));\n\n const { result } = renderHook(() =>\n useTamboComponentState(\"testKey\", initialValue),\n );\n\n const newValue = \"updated\";\n act(() => {\n result.current[1](newValue);\n });\n\n // The debounced function should be called\n expect(mockUpdateState).toHaveBeenCalledWith(mockComponentId, {\n threadId: mockThreadId,\n state: { testKey: newValue },\n userKey: undefined,\n });\n });\n\n it(\"should work with complex objects\", () => {\n const initialValue = { name: \"test\", items: [1, 2, 3] };\n jest\n .mocked(useStreamState)\n .mockReturnValue(createMockStreamState({ data: initialValue }));\n\n const { result } = renderHook(() =>\n useTamboComponentState(\"data\", initialValue),\n );\n\n const newValue = { name: \"updated\", items: [4, 5, 6] };\n act(() => {\n result.current[1](newValue);\n });\n\n expect(result.current[0]).toEqual(newValue);\n });\n });\n\n describe(\"Metadata\", () => {\n it(\"should return isPending and error in meta\", () => {\n jest.mocked(useStreamState).mockReturnValue(createMockStreamState({}));\n\n const { result } = renderHook(() =>\n useTamboComponentState(\"testKey\", \"initial\"),\n );\n\n expect(result.current[2]).toEqual({\n isPending: false,\n error: null,\n flush: expect.any(Function),\n });\n });\n\n it(\"should provide a flush function\", () => {\n const mockFlush = jest.fn();\n const mockDebouncedFn = createMockDebouncedFunction(jest.fn());\n mockDebouncedFn.flush = mockFlush;\n jest.mocked(useDebouncedCallback).mockReturnValue(mockDebouncedFn);\n\n jest.mocked(useStreamState).mockReturnValue(createMockStreamState({}));\n\n const { result } = renderHook(() =>\n useTamboComponentState(\"testKey\", \"initial\"),\n );\n\n act(() => {\n result.current[2].flush();\n });\n\n expect(mockFlush).toHaveBeenCalled();\n });\n });\n\n describe(\"Debouncing Behavior\", () => {\n it(\"should use default debounce time of 500ms\", () => {\n jest.mocked(useStreamState).mockReturnValue(createMockStreamState({}));\n\n renderHook(() => useTamboComponentState(\"testKey\", \"initial\"));\n\n expect(useDebouncedCallback).toHaveBeenCalledWith(\n expect.any(Function),\n 500,\n );\n });\n\n it(\"should use custom debounce time when provided\", () => {\n jest.mocked(useStreamState).mockReturnValue(createMockStreamState({}));\n const customDebounceTime = 1000;\n\n renderHook(() =>\n useTamboComponentState(\"testKey\", \"initial\", customDebounceTime),\n );\n\n expect(useDebouncedCallback).toHaveBeenCalledWith(\n expect.any(Function),\n customDebounceTime,\n );\n });\n\n it(\"should flush debounced callback on unmount\", () => {\n const mockFlush = jest.fn();\n const mockDebouncedFn = createMockDebouncedFunction(jest.fn());\n mockDebouncedFn.flush = mockFlush;\n jest.mocked(useDebouncedCallback).mockReturnValue(mockDebouncedFn);\n\n jest.mocked(useStreamState).mockReturnValue(createMockStreamState({}));\n\n const { unmount } = renderHook(() =>\n useTamboComponentState(\"testKey\", \"initial\"),\n );\n\n unmount();\n\n expect(mockFlush).toHaveBeenCalled();\n });\n });\n\n describe(\"Server State Sync\", () => {\n it(\"should sync with server state changes from streaming\", () => {\n const streamState = createMockStreamState({ testKey: \"initial\" });\n jest.mocked(useStreamState).mockReturnValue(streamState);\n\n const { result, rerender } = renderHook(() =>\n useTamboComponentState(\"testKey\", \"initial\"),\n );\n\n expect(result.current[0]).toBe(\"initial\");\n\n // Simulate server state change from streaming\n const updatedStreamState = createMockStreamState({\n testKey: \"updated-from-server\",\n });\n jest.mocked(useStreamState).mockReturnValue(updatedStreamState);\n\n rerender();\n\n expect(result.current[0]).toBe(\"updated-from-server\");\n });\n\n it(\"should handle component not found in stream state\", () => {\n // Empty stream state (no matching component)\n jest.mocked(useStreamState).mockReturnValue({\n threadMap: {},\n currentThreadId: \"placeholder\",\n });\n\n const { result } = renderHook(() =>\n useTamboComponentState(\"testKey\", \"default\"),\n );\n\n expect(result.current[0]).toBe(\"default\");\n });\n });\n\n describe(\"Error Handling\", () => {\n it(\"should handle API errors gracefully\", async () => {\n const mockError = new Error(\"API Error\");\n mockUpdateState.mockRejectedValue(mockError);\n\n // Create a sync mock that calls the function immediately\n jest.mocked(useDebouncedCallback).mockImplementation((fn) => {\n const debouncedFn = Object.assign(\n async (...args: unknown[]) => fn(...args),\n {\n flush: jest.fn(),\n cancel: jest.fn(),\n isPending: () => false,\n },\n ) as unknown as ReturnType<typeof useDebouncedCallback>;\n return debouncedFn;\n });\n\n jest.mocked(useStreamState).mockReturnValue(createMockStreamState({}));\n\n const consoleSpy = jest.spyOn(console, \"error\").mockImplementation();\n\n const { result } = renderHook(() =>\n useTamboComponentState(\"testKey\", \"initial\"),\n );\n\n await act(async () => {\n result.current[1](\"new-value\");\n // Wait for async operations\n await new Promise((resolve) => setTimeout(resolve, 0));\n });\n\n expect(consoleSpy).toHaveBeenCalledWith(\n expect.stringContaining(\"Failed to sync state\"),\n mockError,\n );\n\n consoleSpy.mockRestore();\n });\n });\n\n describe(\"Context Requirements\", () => {\n it(\"should act as plain useState when component content context is missing\", () => {\n jest.mocked(useComponentContentOptional).mockReturnValue(null);\n jest.mocked(useStreamState).mockReturnValue({\n threadMap: {},\n currentThreadId: \"\",\n });\n\n const { result } = renderHook(() =>\n useTamboComponentState(\"testKey\", \"initial\"),\n );\n\n expect(result.current[0]).toBe(\"initial\");\n\n // No side effects when context is missing\n expect(mockSetInteractableState).not.toHaveBeenCalled();\n expect(mockUpdateState).not.toHaveBeenCalled();\n });\n\n it(\"should not trigger side effects on setState when context is missing\", () => {\n jest.mocked(useComponentContentOptional).mockReturnValue(null);\n jest.mocked(useStreamState).mockReturnValue({\n threadMap: {},\n currentThreadId: \"\",\n });\n\n const { result } = renderHook(() =>\n useTamboComponentState(\"testKey\", \"initial\"),\n );\n\n act(() => {\n result.current[1](\"updated\");\n });\n\n // Local state updates, but no server sync or interactable writes\n expect(result.current[0]).toBe(\"updated\");\n expect(mockSetInteractableState).not.toHaveBeenCalled();\n expect(mockUpdateState).not.toHaveBeenCalled();\n });\n });\n\n describe(\"Interactable Component Support\", () => {\n const interactableComponentId = \"MyWidget-abc\";\n\n beforeEach(() => {\n // Simulate interactable context: threadId=\"\" signals interactable\n jest.mocked(useComponentContentOptional).mockReturnValue({\n componentId: interactableComponentId,\n threadId: \"\",\n messageId: \"\",\n componentName: \"MyWidget\",\n });\n\n // Empty stream state - interactable components don't use it\n jest.mocked(useStreamState).mockReturnValue({\n threadMap: {},\n currentThreadId: \"\",\n });\n });\n\n it(\"should initialize with initialValue when no interactable state exists\", () => {\n mockGetInteractableComponentState.mockReturnValue(undefined);\n\n const { result } = renderHook(() => useTamboComponentState(\"count\", 42));\n\n expect(result.current[0]).toBe(42);\n });\n\n it(\"should initialize from interactable state when it exists\", () => {\n mockGetInteractableComponentState.mockReturnValue({ count: 99 });\n\n const { result } = renderHook(() => useTamboComponentState(\"count\", 0));\n\n expect(result.current[0]).toBe(99);\n });\n\n it(\"should call setInteractableState when setState is called\", () => {\n mockGetInteractableComponentState.mockReturnValue(undefined);\n\n const { result } = renderHook(() => useTamboComponentState(\"count\", 0));\n\n act(() => {\n result.current[1](10);\n });\n\n expect(mockSetInteractableState).toHaveBeenCalledWith(\n interactableComponentId,\n \"count\",\n 10,\n );\n });\n\n it(\"should NOT call client.threads.state.updateState for interactable components\", () => {\n mockGetInteractableComponentState.mockReturnValue(undefined);\n\n const { result } = renderHook(() => useTamboComponentState(\"count\", 0));\n\n act(() => {\n result.current[1](10);\n });\n\n expect(mockUpdateState).not.toHaveBeenCalled();\n });\n\n it(\"should sync from interactable provider when state changes externally\", () => {\n mockGetInteractableComponentState.mockReturnValue({ count: 0 });\n\n const { result, rerender } = renderHook(() =>\n useTamboComponentState(\"count\", 0),\n );\n\n expect(result.current[0]).toBe(0);\n\n // Simulate external state change (e.g., AI tool call)\n mockGetInteractableComponentState.mockReturnValue({ count: 77 });\n\n rerender();\n\n expect(result.current[0]).toBe(77);\n });\n\n it(\"should have isPending as false in interactable context\", () => {\n mockGetInteractableComponentState.mockReturnValue(undefined);\n\n const { result } = renderHook(() => useTamboComponentState(\"count\", 0));\n\n expect(result.current[2].isPending).toBe(false);\n expect(result.current[2].error).toBeNull();\n });\n\n it(\"should set initial value in interactable state on mount when no existing state\", () => {\n mockGetInteractableComponentState.mockReturnValue(undefined);\n\n renderHook(() => useTamboComponentState(\"count\", 42));\n\n expect(mockSetInteractableState).toHaveBeenCalledWith(\n interactableComponentId,\n \"count\",\n 42,\n );\n });\n\n it(\"should NOT set initial value in interactable state when state already exists\", () => {\n mockGetInteractableComponentState.mockReturnValue({ count: 99 });\n\n renderHook(() => useTamboComponentState(\"count\", 42));\n\n // Should not be called because state already exists\n expect(mockSetInteractableState).not.toHaveBeenCalled();\n });\n\n it(\"should not flush on unmount for interactable components\", () => {\n const mockFlush = jest.fn();\n const mockDebouncedFn = createMockDebouncedFunction(jest.fn());\n mockDebouncedFn.flush = mockFlush;\n jest.mocked(useDebouncedCallback).mockReturnValue(mockDebouncedFn);\n\n mockGetInteractableComponentState.mockReturnValue(undefined);\n\n const { unmount } = renderHook(() => useTamboComponentState(\"count\", 0));\n\n unmount();\n\n expect(mockFlush).not.toHaveBeenCalled();\n });\n });\n});\n"]}
@@ -1,24 +1,24 @@
1
- import type { TamboV1Message } from "../types/message.js";
1
+ import type { TamboThreadMessage } from "../types/message.js";
2
2
  /**
3
- * Return type for useTamboV1Messages hook
3
+ * Return type for useTamboMessages hook
4
4
  */
5
- export interface UseTamboV1MessagesReturn {
5
+ export interface UseTamboThreadMessagesReturn {
6
6
  /**
7
7
  * All messages in the thread
8
8
  */
9
- messages: TamboV1Message[];
9
+ messages: TamboThreadMessage[];
10
10
  /**
11
11
  * The most recent message (last in the list)
12
12
  */
13
- lastMessage: TamboV1Message | undefined;
13
+ lastMessage: TamboThreadMessage | undefined;
14
14
  /**
15
15
  * User messages only
16
16
  */
17
- userMessages: TamboV1Message[];
17
+ userMessages: TamboThreadMessage[];
18
18
  /**
19
19
  * Assistant messages only
20
20
  */
21
- assistantMessages: TamboV1Message[];
21
+ assistantMessages: TamboThreadMessage[];
22
22
  /**
23
23
  * Whether there are any messages
24
24
  */
@@ -38,7 +38,7 @@ export interface UseTamboV1MessagesReturn {
38
38
  * @example
39
39
  * ```tsx
40
40
  * function MessageList({ threadId }: { threadId: string }) {
41
- * const { messages, hasMessages, lastMessage } = useTamboV1Messages(threadId);
41
+ * const { messages, hasMessages, lastMessage } = useTamboMessages(threadId);
42
42
  *
43
43
  * if (!hasMessages) {
44
44
  * return <EmptyState />;
@@ -54,5 +54,5 @@ export interface UseTamboV1MessagesReturn {
54
54
  * }
55
55
  * ```
56
56
  */
57
- export declare function useTamboV1Messages(threadId: string): UseTamboV1MessagesReturn;
57
+ export declare function useTamboMessages(threadId: string): UseTamboThreadMessagesReturn;
58
58
  //# sourceMappingURL=use-tambo-v1-messages.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-tambo-v1-messages.d.ts","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-messages.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,QAAQ,EAAE,cAAc,EAAE,CAAC;IAE3B;;OAEG;IACH,WAAW,EAAE,cAAc,GAAG,SAAS,CAAC;IAExC;;OAEG;IACH,YAAY,EAAE,cAAc,EAAE,CAAC;IAE/B;;OAEG;IACH,iBAAiB,EAAE,cAAc,EAAE,CAAC;IAEpC;;OAEG;IACH,WAAW,EAAE,OAAO,CAAC;IAErB;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,wBAAwB,CAgB7E"}
1
+ {"version":3,"file":"use-tambo-v1-messages.d.ts","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-messages.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE3D;;GAEG;AACH,MAAM,WAAW,4BAA4B;IAC3C;;OAEG;IACH,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAE/B;;OAEG;IACH,WAAW,EAAE,kBAAkB,GAAG,SAAS,CAAC;IAE5C;;OAEG;IACH,YAAY,EAAE,kBAAkB,EAAE,CAAC;IAEnC;;OAEG;IACH,iBAAiB,EAAE,kBAAkB,EAAE,CAAC;IAExC;;OAEG;IACH,WAAW,EAAE,OAAO,CAAC;IAErB;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,GACf,4BAA4B,CAgB9B"}
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  /**
3
- * useTamboV1Messages - Messages Hook for v1 API
3
+ * useTamboMessages - Messages Hook
4
4
  *
5
5
  * Provides access to messages in a thread with streaming state awareness.
6
6
  * Messages are accumulated from AG-UI events during streaming.
@@ -17,7 +17,7 @@ import { useStreamState } from "../providers/tambo-v1-stream-context.js";
17
17
  * @example
18
18
  * ```tsx
19
19
  * function MessageList({ threadId }: { threadId: string }) {
20
- * const { messages, hasMessages, lastMessage } = useTamboV1Messages(threadId);
20
+ * const { messages, hasMessages, lastMessage } = useTamboMessages(threadId);
21
21
  *
22
22
  * if (!hasMessages) {
23
23
  * return <EmptyState />;
@@ -33,7 +33,7 @@ import { useStreamState } from "../providers/tambo-v1-stream-context.js";
33
33
  * }
34
34
  * ```
35
35
  */
36
- export function useTamboV1Messages(threadId) {
36
+ export function useTamboMessages(threadId) {
37
37
  const streamState = useStreamState();
38
38
  const threadState = streamState.threadMap[threadId];
39
39
  return useMemo(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"use-tambo-v1-messages.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-messages.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAsCtE;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,WAAW,GAAG,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAEpD,OAAO,OAAO,CAAC,GAAG,EAAE;QAClB,MAAM,QAAQ,GAAG,WAAW,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;QAEpD,OAAO;YACL,QAAQ;YACR,WAAW,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;YAC1C,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;YACvD,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC;YACjE,WAAW,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC;YAChC,YAAY,EAAE,QAAQ,CAAC,MAAM;SAC9B,CAAC;IACJ,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;AACrC,CAAC","sourcesContent":["\"use client\";\n\n/**\n * useTamboV1Messages - Messages Hook for v1 API\n *\n * Provides access to messages in a thread with streaming state awareness.\n * Messages are accumulated from AG-UI events during streaming.\n */\n\nimport { useMemo } from \"react\";\nimport { useStreamState } from \"../providers/tambo-v1-stream-context\";\nimport type { TamboV1Message } from \"../types/message\";\n\n/**\n * Return type for useTamboV1Messages hook\n */\nexport interface UseTamboV1MessagesReturn {\n /**\n * All messages in the thread\n */\n messages: TamboV1Message[];\n\n /**\n * The most recent message (last in the list)\n */\n lastMessage: TamboV1Message | undefined;\n\n /**\n * User messages only\n */\n userMessages: TamboV1Message[];\n\n /**\n * Assistant messages only\n */\n assistantMessages: TamboV1Message[];\n\n /**\n * Whether there are any messages\n */\n hasMessages: boolean;\n\n /**\n * Total message count\n */\n messageCount: number;\n}\n\n/**\n * Hook to access messages in a thread.\n *\n * Provides filtered views of messages (user-only, assistant-only)\n * and metadata about the message list.\n * @param threadId - Thread ID to get messages for\n * @returns Message list and utilities\n * @example\n * ```tsx\n * function MessageList({ threadId }: { threadId: string }) {\n * const { messages, hasMessages, lastMessage } = useTamboV1Messages(threadId);\n *\n * if (!hasMessages) {\n * return <EmptyState />;\n * }\n *\n * return (\n * <div>\n * {messages.map(msg => (\n * <Message key={msg.id} message={msg} />\n * ))}\n * </div>\n * );\n * }\n * ```\n */\nexport function useTamboV1Messages(threadId: string): UseTamboV1MessagesReturn {\n const streamState = useStreamState();\n const threadState = streamState.threadMap[threadId];\n\n return useMemo(() => {\n const messages = threadState?.thread.messages ?? [];\n\n return {\n messages,\n lastMessage: messages[messages.length - 1],\n userMessages: messages.filter((m) => m.role === \"user\"),\n assistantMessages: messages.filter((m) => m.role === \"assistant\"),\n hasMessages: messages.length > 0,\n messageCount: messages.length,\n };\n }, [threadState?.thread.messages]);\n}\n"]}
1
+ {"version":3,"file":"use-tambo-v1-messages.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-messages.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAsCtE;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,UAAU,gBAAgB,CAC9B,QAAgB;IAEhB,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,WAAW,GAAG,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAEpD,OAAO,OAAO,CAAC,GAAG,EAAE;QAClB,MAAM,QAAQ,GAAG,WAAW,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;QAEpD,OAAO;YACL,QAAQ;YACR,WAAW,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;YAC1C,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;YACvD,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC;YACjE,WAAW,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC;YAChC,YAAY,EAAE,QAAQ,CAAC,MAAM;SAC9B,CAAC;IACJ,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;AACrC,CAAC","sourcesContent":["\"use client\";\n\n/**\n * useTamboMessages - Messages Hook\n *\n * Provides access to messages in a thread with streaming state awareness.\n * Messages are accumulated from AG-UI events during streaming.\n */\n\nimport { useMemo } from \"react\";\nimport { useStreamState } from \"../providers/tambo-v1-stream-context\";\nimport type { TamboThreadMessage } from \"../types/message\";\n\n/**\n * Return type for useTamboMessages hook\n */\nexport interface UseTamboThreadMessagesReturn {\n /**\n * All messages in the thread\n */\n messages: TamboThreadMessage[];\n\n /**\n * The most recent message (last in the list)\n */\n lastMessage: TamboThreadMessage | undefined;\n\n /**\n * User messages only\n */\n userMessages: TamboThreadMessage[];\n\n /**\n * Assistant messages only\n */\n assistantMessages: TamboThreadMessage[];\n\n /**\n * Whether there are any messages\n */\n hasMessages: boolean;\n\n /**\n * Total message count\n */\n messageCount: number;\n}\n\n/**\n * Hook to access messages in a thread.\n *\n * Provides filtered views of messages (user-only, assistant-only)\n * and metadata about the message list.\n * @param threadId - Thread ID to get messages for\n * @returns Message list and utilities\n * @example\n * ```tsx\n * function MessageList({ threadId }: { threadId: string }) {\n * const { messages, hasMessages, lastMessage } = useTamboMessages(threadId);\n *\n * if (!hasMessages) {\n * return <EmptyState />;\n * }\n *\n * return (\n * <div>\n * {messages.map(msg => (\n * <Message key={msg.id} message={msg} />\n * ))}\n * </div>\n * );\n * }\n * ```\n */\nexport function useTamboMessages(\n threadId: string,\n): UseTamboThreadMessagesReturn {\n const streamState = useStreamState();\n const threadState = streamState.threadMap[threadId];\n\n return useMemo(() => {\n const messages = threadState?.thread.messages ?? [];\n\n return {\n messages,\n lastMessage: messages[messages.length - 1],\n userMessages: messages.filter((m) => m.role === \"user\"),\n assistantMessages: messages.filter((m) => m.role === \"assistant\"),\n hasMessages: messages.length > 0,\n messageCount: messages.length,\n };\n }, [threadState?.thread.messages]);\n}\n"]}