@tambo-ai/react 1.0.3 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (458) hide show
  1. package/README.md +1 -1
  2. package/dist/context-helpers/current-interactables-context-helper.d.ts +16 -2
  3. package/dist/context-helpers/current-interactables-context-helper.d.ts.map +1 -1
  4. package/dist/context-helpers/current-interactables-context-helper.js.map +1 -1
  5. package/dist/context-helpers/current-interactables-context-helper.test.d.ts +2 -0
  6. package/dist/context-helpers/current-interactables-context-helper.test.d.ts.map +1 -0
  7. package/dist/context-helpers/current-interactables-context-helper.test.js +70 -0
  8. package/dist/context-helpers/current-interactables-context-helper.test.js.map +1 -0
  9. package/dist/mcp/elicitation.d.ts +3 -37
  10. package/dist/mcp/elicitation.d.ts.map +1 -1
  11. package/dist/mcp/elicitation.js +7 -24
  12. package/dist/mcp/elicitation.js.map +1 -1
  13. package/dist/mcp/index.d.ts +4 -4
  14. package/dist/mcp/index.d.ts.map +1 -1
  15. package/dist/mcp/index.js +2 -2
  16. package/dist/mcp/index.js.map +1 -1
  17. package/dist/mcp/mcp-client.test.js +17 -17
  18. package/dist/mcp/mcp-client.test.js.map +1 -1
  19. package/dist/mcp/mcp-hooks.d.ts.map +1 -1
  20. package/dist/mcp/mcp-hooks.js +8 -5
  21. package/dist/mcp/mcp-hooks.js.map +1 -1
  22. package/dist/mcp/mcp-hooks.test.js +30 -29
  23. package/dist/mcp/mcp-hooks.test.js.map +1 -1
  24. package/dist/mcp/tambo-mcp-provider.d.ts +6 -9
  25. package/dist/mcp/tambo-mcp-provider.d.ts.map +1 -1
  26. package/dist/mcp/tambo-mcp-provider.js +9 -13
  27. package/dist/mcp/tambo-mcp-provider.js.map +1 -1
  28. package/dist/mcp/tambo-mcp-provider.test.js +26 -25
  29. package/dist/mcp/tambo-mcp-provider.test.js.map +1 -1
  30. package/dist/mcp/use-mcp-servers.test.js +2 -1
  31. package/dist/mcp/use-mcp-servers.test.js.map +1 -1
  32. package/dist/model/component-metadata.d.ts +7 -372
  33. package/dist/model/component-metadata.d.ts.map +1 -1
  34. package/dist/model/component-metadata.js.map +1 -1
  35. package/dist/model/validate-input.test.d.ts +2 -0
  36. package/dist/model/validate-input.test.d.ts.map +1 -0
  37. package/dist/model/validate-input.test.js +38 -0
  38. package/dist/model/validate-input.test.js.map +1 -0
  39. package/dist/providers/tambo-interactable-provider.d.ts +7 -7
  40. package/dist/providers/tambo-registry-provider.d.ts +1 -1
  41. package/dist/providers/tambo-registry-provider.d.ts.map +1 -1
  42. package/dist/providers/tambo-registry-provider.js.map +1 -1
  43. package/dist/providers/tambo-registry-schema-compat.test.js +4 -4
  44. package/dist/providers/tambo-registry-schema-compat.test.js.map +1 -1
  45. package/dist/schema/index.d.ts +2 -4
  46. package/dist/schema/index.d.ts.map +1 -1
  47. package/dist/schema/index.js +9 -11
  48. package/dist/schema/index.js.map +1 -1
  49. package/dist/schema/json-schema.d.ts +1 -17
  50. package/dist/schema/json-schema.d.ts.map +1 -1
  51. package/dist/schema/json-schema.js +5 -69
  52. package/dist/schema/json-schema.js.map +1 -1
  53. package/dist/schema/schema.test.js +24 -25
  54. package/dist/schema/schema.test.js.map +1 -1
  55. package/dist/schema/standard-schema.test.js +25 -25
  56. package/dist/schema/standard-schema.test.js.map +1 -1
  57. package/dist/schema/validate.test.js +33 -33
  58. package/dist/schema/validate.test.js.map +1 -1
  59. package/dist/testing/tools.d.ts +4 -4
  60. package/dist/testing/tools.test.d.ts +2 -0
  61. package/dist/testing/tools.test.d.ts.map +1 -0
  62. package/dist/testing/tools.test.js +60 -0
  63. package/dist/testing/tools.test.js.map +1 -0
  64. package/dist/util/mcp-server-utils.d.ts +1 -1
  65. package/dist/util/mcp-server-utils.d.ts.map +1 -1
  66. package/dist/util/mcp-server-utils.js +4 -4
  67. package/dist/util/mcp-server-utils.js.map +1 -1
  68. package/dist/util/mcp-server-utils.test.js +27 -27
  69. package/dist/util/mcp-server-utils.test.js.map +1 -1
  70. package/dist/util/registry.js +1 -1
  71. package/dist/util/registry.js.map +1 -1
  72. package/dist/util/resource-content-resolver.js +5 -5
  73. package/dist/util/resource-content-resolver.js.map +1 -1
  74. package/dist/util/resource-content-resolver.test.js +6 -6
  75. package/dist/util/resource-content-resolver.test.js.map +1 -1
  76. package/dist/util/tool-caller.test.d.ts +2 -0
  77. package/dist/util/tool-caller.test.d.ts.map +1 -0
  78. package/dist/util/tool-caller.test.js +71 -0
  79. package/dist/util/tool-caller.test.js.map +1 -0
  80. package/dist/v1/__tests__/v1-interactables.test.js +1 -0
  81. package/dist/v1/__tests__/v1-interactables.test.js.map +1 -1
  82. package/dist/v1/hooks/use-tambo-v1-auth-state.d.ts +1 -1
  83. package/dist/v1/hooks/use-tambo-v1-auth-state.d.ts.map +1 -1
  84. package/dist/v1/hooks/use-tambo-v1-auth-state.js.map +1 -1
  85. package/dist/v1/hooks/use-tambo-v1-component-state.js +2 -2
  86. package/dist/v1/hooks/use-tambo-v1-component-state.js.map +1 -1
  87. package/dist/v1/hooks/use-tambo-v1-component-state.test.js +1 -1
  88. package/dist/v1/hooks/use-tambo-v1-component-state.test.js.map +1 -1
  89. package/dist/v1/hooks/use-tambo-v1-send-message.d.ts +1 -1
  90. package/dist/v1/hooks/use-tambo-v1-send-message.d.ts.map +1 -1
  91. package/dist/v1/hooks/use-tambo-v1-send-message.js +17 -17
  92. package/dist/v1/hooks/use-tambo-v1-send-message.js.map +1 -1
  93. package/dist/v1/hooks/use-tambo-v1-send-message.test.js +1 -1
  94. package/dist/v1/hooks/use-tambo-v1-send-message.test.js.map +1 -1
  95. package/dist/v1/hooks/use-tambo-v1-stream-status.js +2 -2
  96. package/dist/v1/hooks/use-tambo-v1-stream-status.js.map +1 -1
  97. package/dist/v1/hooks/use-tambo-v1-stream-status.test.js +9 -5
  98. package/dist/v1/hooks/use-tambo-v1-stream-status.test.js.map +1 -1
  99. package/dist/v1/hooks/use-tambo-v1-suggestions.js +2 -2
  100. package/dist/v1/hooks/use-tambo-v1-suggestions.js.map +1 -1
  101. package/dist/v1/hooks/use-tambo-v1-thread-input.test.js +104 -0
  102. package/dist/v1/hooks/use-tambo-v1-thread-input.test.js.map +1 -1
  103. package/dist/v1/hooks/use-tambo-v1.d.ts +7 -6
  104. package/dist/v1/hooks/use-tambo-v1.d.ts.map +1 -1
  105. package/dist/v1/hooks/use-tambo-v1.js +2 -2
  106. package/dist/v1/hooks/use-tambo-v1.js.map +1 -1
  107. package/dist/v1/hooks/use-tambo-v1.test.js +23 -23
  108. package/dist/v1/hooks/use-tambo-v1.test.js.map +1 -1
  109. package/dist/v1/index.d.ts +6 -6
  110. package/dist/v1/index.d.ts.map +1 -1
  111. package/dist/v1/index.js +2 -2
  112. package/dist/v1/index.js.map +1 -1
  113. package/dist/v1/providers/tambo-v1-provider.d.ts +2 -1
  114. package/dist/v1/providers/tambo-v1-provider.d.ts.map +1 -1
  115. package/dist/v1/providers/tambo-v1-provider.js +2 -0
  116. package/dist/v1/providers/tambo-v1-provider.js.map +1 -1
  117. package/dist/v1/providers/tambo-v1-stream-context.d.ts +2 -2
  118. package/dist/v1/providers/tambo-v1-stream-context.d.ts.map +1 -1
  119. package/dist/v1/providers/tambo-v1-stream-context.js +9 -9
  120. package/dist/v1/providers/tambo-v1-stream-context.js.map +1 -1
  121. package/dist/v1/providers/tambo-v1-stream-context.test.js +35 -0
  122. package/dist/v1/providers/tambo-v1-stream-context.test.js.map +1 -1
  123. package/dist/v1/providers/tambo-v1-stub-provider.d.ts +1 -1
  124. package/dist/v1/providers/tambo-v1-stub-provider.d.ts.map +1 -1
  125. package/dist/v1/providers/tambo-v1-stub-provider.js +1 -1
  126. package/dist/v1/providers/tambo-v1-stub-provider.js.map +1 -1
  127. package/dist/v1/providers/tambo-v1-stub-provider.test.js.map +1 -1
  128. package/dist/v1/providers/tambo-v1-thread-input-provider.d.ts +1 -1
  129. package/dist/v1/providers/tambo-v1-thread-input-provider.d.ts.map +1 -1
  130. package/dist/v1/providers/tambo-v1-thread-input-provider.js +33 -17
  131. package/dist/v1/providers/tambo-v1-thread-input-provider.js.map +1 -1
  132. package/dist/v1/types/event.test.js +13 -13
  133. package/dist/v1/types/event.test.js.map +1 -1
  134. package/dist/v1/types/message.d.ts +12 -109
  135. package/dist/v1/types/message.d.ts.map +1 -1
  136. package/dist/v1/types/message.js +0 -7
  137. package/dist/v1/types/message.js.map +1 -1
  138. package/dist/v1/utils/event-accumulator.test.js +183 -184
  139. package/dist/v1/utils/event-accumulator.test.js.map +1 -1
  140. package/dist/v1/utils/json-patch.test.js +4 -4
  141. package/dist/v1/utils/json-patch.test.js.map +1 -1
  142. package/dist/v1/utils/keyed-throttle.test.js +12 -12
  143. package/dist/v1/utils/keyed-throttle.test.js.map +1 -1
  144. package/dist/v1/utils/registry-conversion.test.js +13 -13
  145. package/dist/v1/utils/registry-conversion.test.js.map +1 -1
  146. package/dist/v1/utils/stream-handler.test.js +5 -5
  147. package/dist/v1/utils/stream-handler.test.js.map +1 -1
  148. package/dist/v1/utils/tool-call-tracker.test.js +15 -9
  149. package/dist/v1/utils/tool-call-tracker.test.js.map +1 -1
  150. package/dist/v1/utils/tool-executor.test.js +25 -26
  151. package/dist/v1/utils/tool-executor.test.js.map +1 -1
  152. package/dist/v1/utils/unstrictify.test.js +16 -16
  153. package/dist/v1/utils/unstrictify.test.js.map +1 -1
  154. package/esm/context-helpers/current-interactables-context-helper.d.ts +16 -2
  155. package/esm/context-helpers/current-interactables-context-helper.d.ts.map +1 -1
  156. package/esm/context-helpers/current-interactables-context-helper.js.map +1 -1
  157. package/esm/context-helpers/current-interactables-context-helper.test.d.ts +2 -0
  158. package/esm/context-helpers/current-interactables-context-helper.test.d.ts.map +1 -0
  159. package/esm/context-helpers/current-interactables-context-helper.test.js +68 -0
  160. package/esm/context-helpers/current-interactables-context-helper.test.js.map +1 -0
  161. package/esm/mcp/elicitation.d.ts +3 -37
  162. package/esm/mcp/elicitation.d.ts.map +1 -1
  163. package/esm/mcp/elicitation.js +4 -24
  164. package/esm/mcp/elicitation.js.map +1 -1
  165. package/esm/mcp/index.d.ts +4 -4
  166. package/esm/mcp/index.d.ts.map +1 -1
  167. package/esm/mcp/index.js +1 -1
  168. package/esm/mcp/index.js.map +1 -1
  169. package/esm/mcp/mcp-client.test.js +1 -1
  170. package/esm/mcp/mcp-client.test.js.map +1 -1
  171. package/esm/mcp/mcp-hooks.d.ts.map +1 -1
  172. package/esm/mcp/mcp-hooks.js +4 -1
  173. package/esm/mcp/mcp-hooks.js.map +1 -1
  174. package/esm/mcp/mcp-hooks.test.js +3 -2
  175. package/esm/mcp/mcp-hooks.test.js.map +1 -1
  176. package/esm/mcp/tambo-mcp-provider.d.ts +6 -9
  177. package/esm/mcp/tambo-mcp-provider.d.ts.map +1 -1
  178. package/esm/mcp/tambo-mcp-provider.js +4 -8
  179. package/esm/mcp/tambo-mcp-provider.js.map +1 -1
  180. package/esm/mcp/tambo-mcp-provider.test.js +3 -2
  181. package/esm/mcp/tambo-mcp-provider.test.js.map +1 -1
  182. package/esm/mcp/use-mcp-servers.test.js +2 -1
  183. package/esm/mcp/use-mcp-servers.test.js.map +1 -1
  184. package/esm/model/component-metadata.d.ts +7 -372
  185. package/esm/model/component-metadata.d.ts.map +1 -1
  186. package/esm/model/component-metadata.js.map +1 -1
  187. package/esm/model/validate-input.test.d.ts +2 -0
  188. package/esm/model/validate-input.test.d.ts.map +1 -0
  189. package/esm/model/validate-input.test.js +36 -0
  190. package/esm/model/validate-input.test.js.map +1 -0
  191. package/esm/providers/tambo-interactable-provider.d.ts +7 -7
  192. package/esm/providers/tambo-registry-provider.d.ts +1 -1
  193. package/esm/providers/tambo-registry-provider.d.ts.map +1 -1
  194. package/esm/providers/tambo-registry-provider.js.map +1 -1
  195. package/esm/providers/tambo-registry-schema-compat.test.js +4 -4
  196. package/esm/providers/tambo-registry-schema-compat.test.js.map +1 -1
  197. package/esm/schema/index.d.ts +2 -4
  198. package/esm/schema/index.d.ts.map +1 -1
  199. package/esm/schema/index.js +2 -4
  200. package/esm/schema/index.js.map +1 -1
  201. package/esm/schema/json-schema.d.ts +1 -17
  202. package/esm/schema/json-schema.d.ts.map +1 -1
  203. package/esm/schema/json-schema.js +2 -67
  204. package/esm/schema/json-schema.js.map +1 -1
  205. package/esm/schema/schema.test.js +1 -2
  206. package/esm/schema/schema.test.js.map +1 -1
  207. package/esm/schema/standard-schema.test.js +1 -1
  208. package/esm/schema/standard-schema.test.js.map +1 -1
  209. package/esm/schema/validate.test.js +1 -1
  210. package/esm/schema/validate.test.js.map +1 -1
  211. package/esm/testing/tools.d.ts +4 -4
  212. package/esm/testing/tools.test.d.ts +2 -0
  213. package/esm/testing/tools.test.d.ts.map +1 -0
  214. package/esm/testing/tools.test.js +58 -0
  215. package/esm/testing/tools.test.js.map +1 -0
  216. package/esm/util/mcp-server-utils.d.ts +1 -1
  217. package/esm/util/mcp-server-utils.d.ts.map +1 -1
  218. package/esm/util/mcp-server-utils.js +1 -1
  219. package/esm/util/mcp-server-utils.js.map +1 -1
  220. package/esm/util/mcp-server-utils.test.js +1 -1
  221. package/esm/util/mcp-server-utils.test.js.map +1 -1
  222. package/esm/util/registry.js +1 -1
  223. package/esm/util/registry.js.map +1 -1
  224. package/esm/util/resource-content-resolver.js +1 -1
  225. package/esm/util/resource-content-resolver.js.map +1 -1
  226. package/esm/util/resource-content-resolver.test.js +2 -2
  227. package/esm/util/resource-content-resolver.test.js.map +1 -1
  228. package/esm/util/tool-caller.test.d.ts +2 -0
  229. package/esm/util/tool-caller.test.d.ts.map +1 -0
  230. package/esm/util/tool-caller.test.js +69 -0
  231. package/esm/util/tool-caller.test.js.map +1 -0
  232. package/esm/v1/__tests__/v1-interactables.test.js +1 -0
  233. package/esm/v1/__tests__/v1-interactables.test.js.map +1 -1
  234. package/esm/v1/hooks/use-tambo-v1-auth-state.d.ts +1 -1
  235. package/esm/v1/hooks/use-tambo-v1-auth-state.d.ts.map +1 -1
  236. package/esm/v1/hooks/use-tambo-v1-auth-state.js.map +1 -1
  237. package/esm/v1/hooks/use-tambo-v1-component-state.js +1 -1
  238. package/esm/v1/hooks/use-tambo-v1-component-state.js.map +1 -1
  239. package/esm/v1/hooks/use-tambo-v1-component-state.test.js +1 -1
  240. package/esm/v1/hooks/use-tambo-v1-component-state.test.js.map +1 -1
  241. package/esm/v1/hooks/use-tambo-v1-send-message.d.ts +1 -1
  242. package/esm/v1/hooks/use-tambo-v1-send-message.d.ts.map +1 -1
  243. package/esm/v1/hooks/use-tambo-v1-send-message.js +6 -6
  244. package/esm/v1/hooks/use-tambo-v1-send-message.js.map +1 -1
  245. package/esm/v1/hooks/use-tambo-v1-send-message.test.js +1 -1
  246. package/esm/v1/hooks/use-tambo-v1-send-message.test.js.map +1 -1
  247. package/esm/v1/hooks/use-tambo-v1-stream-status.js +1 -1
  248. package/esm/v1/hooks/use-tambo-v1-stream-status.js.map +1 -1
  249. package/esm/v1/hooks/use-tambo-v1-stream-status.test.js +9 -5
  250. package/esm/v1/hooks/use-tambo-v1-stream-status.test.js.map +1 -1
  251. package/esm/v1/hooks/use-tambo-v1-suggestions.js +1 -1
  252. package/esm/v1/hooks/use-tambo-v1-suggestions.js.map +1 -1
  253. package/esm/v1/hooks/use-tambo-v1-thread-input.test.js +104 -0
  254. package/esm/v1/hooks/use-tambo-v1-thread-input.test.js.map +1 -1
  255. package/esm/v1/hooks/use-tambo-v1.d.ts +7 -6
  256. package/esm/v1/hooks/use-tambo-v1.d.ts.map +1 -1
  257. package/esm/v1/hooks/use-tambo-v1.js +1 -1
  258. package/esm/v1/hooks/use-tambo-v1.js.map +1 -1
  259. package/esm/v1/hooks/use-tambo-v1.test.js +22 -22
  260. package/esm/v1/hooks/use-tambo-v1.test.js.map +1 -1
  261. package/esm/v1/index.d.ts +6 -6
  262. package/esm/v1/index.d.ts.map +1 -1
  263. package/esm/v1/index.js +1 -1
  264. package/esm/v1/index.js.map +1 -1
  265. package/esm/v1/providers/tambo-v1-provider.d.ts +2 -1
  266. package/esm/v1/providers/tambo-v1-provider.d.ts.map +1 -1
  267. package/esm/v1/providers/tambo-v1-provider.js +2 -0
  268. package/esm/v1/providers/tambo-v1-provider.js.map +1 -1
  269. package/esm/v1/providers/tambo-v1-stream-context.d.ts +2 -2
  270. package/esm/v1/providers/tambo-v1-stream-context.d.ts.map +1 -1
  271. package/esm/v1/providers/tambo-v1-stream-context.js +1 -1
  272. package/esm/v1/providers/tambo-v1-stream-context.js.map +1 -1
  273. package/esm/v1/providers/tambo-v1-stream-context.test.js +35 -0
  274. package/esm/v1/providers/tambo-v1-stream-context.test.js.map +1 -1
  275. package/esm/v1/providers/tambo-v1-stub-provider.d.ts +1 -1
  276. package/esm/v1/providers/tambo-v1-stub-provider.d.ts.map +1 -1
  277. package/esm/v1/providers/tambo-v1-stub-provider.js +1 -1
  278. package/esm/v1/providers/tambo-v1-stub-provider.js.map +1 -1
  279. package/esm/v1/providers/tambo-v1-stub-provider.test.js.map +1 -1
  280. package/esm/v1/providers/tambo-v1-thread-input-provider.d.ts +1 -1
  281. package/esm/v1/providers/tambo-v1-thread-input-provider.d.ts.map +1 -1
  282. package/esm/v1/providers/tambo-v1-thread-input-provider.js +32 -16
  283. package/esm/v1/providers/tambo-v1-thread-input-provider.js.map +1 -1
  284. package/esm/v1/types/event.test.js +1 -1
  285. package/esm/v1/types/event.test.js.map +1 -1
  286. package/esm/v1/types/message.d.ts +12 -109
  287. package/esm/v1/types/message.d.ts.map +1 -1
  288. package/esm/v1/types/message.js +0 -7
  289. package/esm/v1/types/message.js.map +1 -1
  290. package/esm/v1/utils/event-accumulator.test.js +2 -3
  291. package/esm/v1/utils/event-accumulator.test.js.map +1 -1
  292. package/esm/v1/utils/json-patch.test.js +1 -1
  293. package/esm/v1/utils/json-patch.test.js.map +1 -1
  294. package/esm/v1/utils/keyed-throttle.test.js +1 -1
  295. package/esm/v1/utils/keyed-throttle.test.js.map +1 -1
  296. package/esm/v1/utils/registry-conversion.test.js +1 -1
  297. package/esm/v1/utils/registry-conversion.test.js.map +1 -1
  298. package/esm/v1/utils/stream-handler.test.js +1 -1
  299. package/esm/v1/utils/stream-handler.test.js.map +1 -1
  300. package/esm/v1/utils/tool-call-tracker.test.js +9 -3
  301. package/esm/v1/utils/tool-call-tracker.test.js.map +1 -1
  302. package/esm/v1/utils/tool-executor.test.js +1 -2
  303. package/esm/v1/utils/tool-executor.test.js.map +1 -1
  304. package/esm/v1/utils/unstrictify.test.js +1 -1
  305. package/esm/v1/utils/unstrictify.test.js.map +1 -1
  306. package/package.json +12 -15
  307. package/dist/mcp/mcp-client.d.ts +0 -185
  308. package/dist/mcp/mcp-client.d.ts.map +0 -1
  309. package/dist/mcp/mcp-client.js +0 -219
  310. package/dist/mcp/mcp-client.js.map +0 -1
  311. package/dist/mcp/mcp-constants.d.ts +0 -19
  312. package/dist/mcp/mcp-constants.d.ts.map +0 -1
  313. package/dist/mcp/mcp-constants.js +0 -21
  314. package/dist/mcp/mcp-constants.js.map +0 -1
  315. package/dist/model/mcp-server-info.d.ts +0 -76
  316. package/dist/model/mcp-server-info.d.ts.map +0 -1
  317. package/dist/model/mcp-server-info.js +0 -29
  318. package/dist/model/mcp-server-info.js.map +0 -1
  319. package/dist/schema/schema.d.ts +0 -49
  320. package/dist/schema/schema.d.ts.map +0 -1
  321. package/dist/schema/schema.js +0 -129
  322. package/dist/schema/schema.js.map +0 -1
  323. package/dist/schema/standard-schema.d.ts +0 -22
  324. package/dist/schema/standard-schema.d.ts.map +0 -1
  325. package/dist/schema/standard-schema.js +0 -42
  326. package/dist/schema/standard-schema.js.map +0 -1
  327. package/dist/schema/validate.d.ts +0 -14
  328. package/dist/schema/validate.d.ts.map +0 -1
  329. package/dist/schema/validate.js +0 -148
  330. package/dist/schema/validate.js.map +0 -1
  331. package/dist/v1/types/auth.d.ts +0 -24
  332. package/dist/v1/types/auth.d.ts.map +0 -1
  333. package/dist/v1/types/auth.js +0 -3
  334. package/dist/v1/types/auth.js.map +0 -1
  335. package/dist/v1/types/event.d.ts +0 -89
  336. package/dist/v1/types/event.d.ts.map +0 -1
  337. package/dist/v1/types/event.js +0 -57
  338. package/dist/v1/types/event.js.map +0 -1
  339. package/dist/v1/types/thread.d.ts +0 -58
  340. package/dist/v1/types/thread.d.ts.map +0 -1
  341. package/dist/v1/types/thread.js +0 -9
  342. package/dist/v1/types/thread.js.map +0 -1
  343. package/dist/v1/types/tool-choice.d.ts +0 -8
  344. package/dist/v1/types/tool-choice.d.ts.map +0 -1
  345. package/dist/v1/types/tool-choice.js +0 -3
  346. package/dist/v1/types/tool-choice.js.map +0 -1
  347. package/dist/v1/utils/event-accumulator.d.ts +0 -165
  348. package/dist/v1/utils/event-accumulator.d.ts.map +0 -1
  349. package/dist/v1/utils/event-accumulator.js +0 -1277
  350. package/dist/v1/utils/event-accumulator.js.map +0 -1
  351. package/dist/v1/utils/json-patch.d.ts +0 -18
  352. package/dist/v1/utils/json-patch.d.ts.map +0 -1
  353. package/dist/v1/utils/json-patch.js +0 -35
  354. package/dist/v1/utils/json-patch.js.map +0 -1
  355. package/dist/v1/utils/keyed-throttle.d.ts +0 -42
  356. package/dist/v1/utils/keyed-throttle.d.ts.map +0 -1
  357. package/dist/v1/utils/keyed-throttle.js +0 -86
  358. package/dist/v1/utils/keyed-throttle.js.map +0 -1
  359. package/dist/v1/utils/registry-conversion.d.ts +0 -53
  360. package/dist/v1/utils/registry-conversion.d.ts.map +0 -1
  361. package/dist/v1/utils/registry-conversion.js +0 -115
  362. package/dist/v1/utils/registry-conversion.js.map +0 -1
  363. package/dist/v1/utils/stream-handler.d.ts +0 -45
  364. package/dist/v1/utils/stream-handler.d.ts.map +0 -1
  365. package/dist/v1/utils/stream-handler.js +0 -47
  366. package/dist/v1/utils/stream-handler.js.map +0 -1
  367. package/dist/v1/utils/thread-utils.d.ts +0 -16
  368. package/dist/v1/utils/thread-utils.d.ts.map +0 -1
  369. package/dist/v1/utils/thread-utils.js +0 -34
  370. package/dist/v1/utils/thread-utils.js.map +0 -1
  371. package/dist/v1/utils/tool-call-tracker.d.ts +0 -73
  372. package/dist/v1/utils/tool-call-tracker.d.ts.map +0 -1
  373. package/dist/v1/utils/tool-call-tracker.js +0 -180
  374. package/dist/v1/utils/tool-call-tracker.js.map +0 -1
  375. package/dist/v1/utils/tool-executor.d.ts +0 -67
  376. package/dist/v1/utils/tool-executor.d.ts.map +0 -1
  377. package/dist/v1/utils/tool-executor.js +0 -160
  378. package/dist/v1/utils/tool-executor.js.map +0 -1
  379. package/dist/v1/utils/unstrictify.d.ts +0 -32
  380. package/dist/v1/utils/unstrictify.d.ts.map +0 -1
  381. package/dist/v1/utils/unstrictify.js +0 -159
  382. package/dist/v1/utils/unstrictify.js.map +0 -1
  383. package/esm/mcp/mcp-client.d.ts +0 -185
  384. package/esm/mcp/mcp-client.d.ts.map +0 -1
  385. package/esm/mcp/mcp-client.js +0 -216
  386. package/esm/mcp/mcp-client.js.map +0 -1
  387. package/esm/mcp/mcp-constants.d.ts +0 -19
  388. package/esm/mcp/mcp-constants.d.ts.map +0 -1
  389. package/esm/mcp/mcp-constants.js +0 -18
  390. package/esm/mcp/mcp-constants.js.map +0 -1
  391. package/esm/model/mcp-server-info.d.ts +0 -76
  392. package/esm/model/mcp-server-info.d.ts.map +0 -1
  393. package/esm/model/mcp-server-info.js +0 -25
  394. package/esm/model/mcp-server-info.js.map +0 -1
  395. package/esm/schema/schema.d.ts +0 -49
  396. package/esm/schema/schema.d.ts.map +0 -1
  397. package/esm/schema/schema.js +0 -124
  398. package/esm/schema/schema.js.map +0 -1
  399. package/esm/schema/standard-schema.d.ts +0 -22
  400. package/esm/schema/standard-schema.d.ts.map +0 -1
  401. package/esm/schema/standard-schema.js +0 -39
  402. package/esm/schema/standard-schema.js.map +0 -1
  403. package/esm/schema/validate.d.ts +0 -14
  404. package/esm/schema/validate.d.ts.map +0 -1
  405. package/esm/schema/validate.js +0 -145
  406. package/esm/schema/validate.js.map +0 -1
  407. package/esm/v1/types/auth.d.ts +0 -24
  408. package/esm/v1/types/auth.d.ts.map +0 -1
  409. package/esm/v1/types/auth.js +0 -2
  410. package/esm/v1/types/auth.js.map +0 -1
  411. package/esm/v1/types/event.d.ts +0 -89
  412. package/esm/v1/types/event.d.ts.map +0 -1
  413. package/esm/v1/types/event.js +0 -53
  414. package/esm/v1/types/event.js.map +0 -1
  415. package/esm/v1/types/thread.d.ts +0 -58
  416. package/esm/v1/types/thread.d.ts.map +0 -1
  417. package/esm/v1/types/thread.js +0 -8
  418. package/esm/v1/types/thread.js.map +0 -1
  419. package/esm/v1/types/tool-choice.d.ts +0 -8
  420. package/esm/v1/types/tool-choice.d.ts.map +0 -1
  421. package/esm/v1/types/tool-choice.js +0 -2
  422. package/esm/v1/types/tool-choice.js.map +0 -1
  423. package/esm/v1/utils/event-accumulator.d.ts +0 -165
  424. package/esm/v1/utils/event-accumulator.d.ts.map +0 -1
  425. package/esm/v1/utils/event-accumulator.js +0 -1268
  426. package/esm/v1/utils/event-accumulator.js.map +0 -1
  427. package/esm/v1/utils/json-patch.d.ts +0 -18
  428. package/esm/v1/utils/json-patch.d.ts.map +0 -1
  429. package/esm/v1/utils/json-patch.js +0 -32
  430. package/esm/v1/utils/json-patch.js.map +0 -1
  431. package/esm/v1/utils/keyed-throttle.d.ts +0 -42
  432. package/esm/v1/utils/keyed-throttle.d.ts.map +0 -1
  433. package/esm/v1/utils/keyed-throttle.js +0 -83
  434. package/esm/v1/utils/keyed-throttle.js.map +0 -1
  435. package/esm/v1/utils/registry-conversion.d.ts +0 -53
  436. package/esm/v1/utils/registry-conversion.d.ts.map +0 -1
  437. package/esm/v1/utils/registry-conversion.js +0 -109
  438. package/esm/v1/utils/registry-conversion.js.map +0 -1
  439. package/esm/v1/utils/stream-handler.d.ts +0 -45
  440. package/esm/v1/utils/stream-handler.d.ts.map +0 -1
  441. package/esm/v1/utils/stream-handler.js +0 -44
  442. package/esm/v1/utils/stream-handler.js.map +0 -1
  443. package/esm/v1/utils/thread-utils.d.ts +0 -16
  444. package/esm/v1/utils/thread-utils.d.ts.map +0 -1
  445. package/esm/v1/utils/thread-utils.js +0 -31
  446. package/esm/v1/utils/thread-utils.js.map +0 -1
  447. package/esm/v1/utils/tool-call-tracker.d.ts +0 -73
  448. package/esm/v1/utils/tool-call-tracker.d.ts.map +0 -1
  449. package/esm/v1/utils/tool-call-tracker.js +0 -176
  450. package/esm/v1/utils/tool-call-tracker.js.map +0 -1
  451. package/esm/v1/utils/tool-executor.d.ts +0 -67
  452. package/esm/v1/utils/tool-executor.d.ts.map +0 -1
  453. package/esm/v1/utils/tool-executor.js +0 -154
  454. package/esm/v1/utils/tool-executor.js.map +0 -1
  455. package/esm/v1/utils/unstrictify.d.ts +0 -32
  456. package/esm/v1/utils/unstrictify.d.ts.map +0 -1
  457. package/esm/v1/utils/unstrictify.js +0 -155
  458. package/esm/v1/utils/unstrictify.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"use-tambo-v1-stream-status.test.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-stream-status.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import { renderHook } from \"@testing-library/react\";\nimport { useTamboStreamStatus } from \"./use-tambo-v1-stream-status\";\n\n// Mock the required hooks\njest.mock(\"../utils/component-renderer\", () => ({\n useComponentContent: jest.fn(),\n}));\n\njest.mock(\"../providers/tambo-v1-stream-context\", () => ({\n useStreamState: jest.fn(),\n}));\n\n// Import the mocked functions\nimport { useComponentContent } from \"../utils/component-renderer\";\nimport { useStreamState } from \"../providers/tambo-v1-stream-context\";\nimport type { StreamState, ThreadState } from \"../utils/event-accumulator\";\nimport type {\n TamboComponentContent,\n TamboThreadMessage,\n} from \"../types/message\";\n\n// Mock window for SSR tests\nconst originalWindow = global.window;\n\n// Get the mocked functions\nconst mockUseTamboComponentContent = jest.mocked(useComponentContent);\nconst mockUseStreamState = jest.mocked(useStreamState);\n\n/**\n * Helper to create a component content block\n */\nfunction createComponentContent(\n overrides: Partial<TamboComponentContent> = {},\n): TamboComponentContent {\n return {\n type: \"component\",\n id: \"test-component\",\n name: \"TestComponent\",\n props: {},\n streamingState: \"started\",\n ...overrides,\n };\n}\n\n/**\n * Helper to create a message with a component\n */\nfunction createMessage(\n componentContent: TamboComponentContent,\n overrides: Partial<TamboThreadMessage> = {},\n): TamboThreadMessage {\n return {\n id: \"test-message\",\n role: \"assistant\",\n content: [componentContent],\n createdAt: new Date().toISOString(),\n ...overrides,\n };\n}\n\n/**\n * Helper to create a thread state\n */\nfunction createThreadState(\n messages: TamboThreadMessage[],\n overrides: Partial<ThreadState> = {},\n): ThreadState {\n return {\n thread: {\n id: \"test-thread\",\n messages,\n status: \"idle\",\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n lastRunCancelled: false,\n },\n streaming: {\n status: \"idle\",\n },\n accumulatingToolArgs: new Map(),\n ...overrides,\n };\n}\n\n/**\n * Helper to create a stream state\n */\nfunction createStreamState(\n threadState: ThreadState,\n threadId = \"test-thread\",\n): StreamState {\n return {\n threadMap: {\n [threadId]: threadState,\n },\n currentThreadId: threadId,\n };\n}\n\ndescribe(\"useTamboStreamStatus\", () => {\n beforeEach(() => {\n // Restore window for client-side tests\n global.window = originalWindow;\n\n // Default mock implementations\n mockUseTamboComponentContent.mockReturnValue({\n componentId: \"test-component\",\n threadId: \"test-thread\",\n messageId: \"test-message\",\n componentName: \"TestComponent\",\n });\n\n const componentContent = createComponentContent({ props: {} });\n const message = createMessage(componentContent);\n const threadState = createThreadState([message]);\n mockUseStreamState.mockReturnValue(createStreamState(threadState));\n });\n\n afterEach(() => {\n jest.clearAllMocks();\n // Restore window after each test\n global.window = originalWindow;\n });\n\n describe(\"Initial State\", () => {\n it(\"should start with all flags as pending when component streaming is 'started' and no props\", () => {\n const componentContent = createComponentContent({\n props: { title: \"\", body: \"\" },\n streamingState: \"started\",\n });\n const message = createMessage(componentContent);\n const threadState = createThreadState([message]);\n mockUseStreamState.mockReturnValue(createStreamState(threadState));\n\n const { result } = renderHook(() =>\n useTamboStreamStatus<{ title: string; body: string }>(),\n );\n\n expect(result.current.streamStatus).toEqual({\n isPending: true,\n isStreaming: false,\n isSuccess: false,\n isError: false,\n streamError: undefined,\n });\n\n expect(result.current.propStatus.title).toEqual({\n isPending: true,\n isStreaming: false,\n isSuccess: false,\n error: undefined,\n });\n\n expect(result.current.propStatus.body).toEqual({\n isPending: true,\n isStreaming: false,\n isSuccess: false,\n error: undefined,\n });\n });\n });\n\n describe(\"Streaming State Transitions\", () => {\n it(\"should show isStreaming when component is streaming even before props receive content\", () => {\n // Component is streaming but props are still empty\n const componentContent = createComponentContent({\n props: { title: \"\", body: \"\" },\n streamingState: \"streaming\",\n });\n const message = createMessage(componentContent);\n const threadState = createThreadState([message]);\n mockUseStreamState.mockReturnValue(createStreamState(threadState));\n\n const { result } = renderHook(() =>\n useTamboStreamStatus<{ title: string; body: string }>(),\n );\n\n // Global should be streaming even though no props have content yet\n expect(result.current.streamStatus.isStreaming).toBe(true);\n expect(result.current.streamStatus.isPending).toBe(false);\n\n // Individual props should still be pending\n expect(result.current.propStatus.title?.isPending).toBe(true);\n expect(result.current.propStatus.title?.isStreaming).toBe(false);\n });\n\n it(\"should show prop streaming when props receive content during streaming\", () => {\n const componentContent = createComponentContent({\n props: { title: \"Hello\", body: \"\" },\n streamingState: \"streaming\",\n });\n const message = createMessage(componentContent);\n const threadState = createThreadState([message]);\n mockUseStreamState.mockReturnValue(createStreamState(threadState));\n\n const { result } = renderHook(() =>\n useTamboStreamStatus<{ title: string; body: string }>(),\n );\n\n // Title prop should be streaming since it has content\n expect(result.current.propStatus.title?.isStreaming).toBe(true);\n expect(result.current.propStatus.title?.isPending).toBe(false);\n\n // Body prop should still be pending since it has no content\n expect(result.current.propStatus.body?.isStreaming).toBe(false);\n expect(result.current.propStatus.body?.isPending).toBe(true);\n\n // Global should be streaming because at least one prop is streaming\n expect(result.current.streamStatus.isStreaming).toBe(true);\n });\n\n it(\"should transition through Init -> Streaming -> Success lifecycle\", () => {\n // Start with \"started\" (Init phase)\n const componentContent = createComponentContent({\n props: { title: \"\", body: \"\" },\n streamingState: \"started\",\n });\n const message = createMessage(componentContent);\n let threadState = createThreadState([message]);\n mockUseStreamState.mockReturnValue(createStreamState(threadState));\n\n const { result, rerender } = renderHook(() =>\n useTamboStreamStatus<{ title: string; body: string }>(),\n );\n\n // Phase 1: Init - isPending = true\n expect(result.current.streamStatus.isPending).toBe(true);\n expect(result.current.streamStatus.isStreaming).toBe(false);\n expect(result.current.streamStatus.isSuccess).toBe(false);\n\n // Phase 2: Streaming - move to \"streaming\" with content\n const streamingComponent = createComponentContent({\n props: { title: \"Hello World\", body: \"Some content\" },\n streamingState: \"streaming\",\n });\n const streamingMessage = createMessage(streamingComponent);\n threadState = createThreadState([streamingMessage]);\n mockUseStreamState.mockReturnValue(createStreamState(threadState));\n\n rerender();\n\n expect(result.current.streamStatus.isPending).toBe(false);\n expect(result.current.streamStatus.isStreaming).toBe(true);\n expect(result.current.streamStatus.isSuccess).toBe(false);\n\n // Phase 3: Complete - move to \"done\"\n const doneComponent = createComponentContent({\n props: { title: \"Hello World\", body: \"Some content\" },\n streamingState: \"done\",\n });\n const doneMessage = createMessage(doneComponent);\n threadState = createThreadState([doneMessage]);\n mockUseStreamState.mockReturnValue(createStreamState(threadState));\n\n rerender();\n\n expect(result.current.streamStatus.isPending).toBe(false);\n expect(result.current.streamStatus.isStreaming).toBe(false);\n expect(result.current.streamStatus.isSuccess).toBe(true);\n });\n });\n\n describe(\"Error Handling\", () => {\n it(\"should handle error state correctly\", () => {\n const componentContent = createComponentContent({\n props: { title: \"\", body: \"\" },\n streamingState: \"started\",\n });\n const message = createMessage(componentContent);\n const threadState = createThreadState([message], {\n streaming: {\n status: \"idle\",\n error: { message: \"Generation failed\", code: \"GENERATION_ERROR\" },\n },\n });\n mockUseStreamState.mockReturnValue(createStreamState(threadState));\n\n const { result } = renderHook(() =>\n useTamboStreamStatus<{ title: string; body: string }>(),\n );\n\n // Error state: isPending=false (error overrides pending), isStreaming=false (error stops streaming)\n expect(result.current.streamStatus.isPending).toBe(false);\n expect(result.current.streamStatus.isStreaming).toBe(false);\n expect(result.current.streamStatus.isSuccess).toBe(false);\n expect(result.current.streamStatus.isError).toBe(true);\n expect(result.current.streamStatus.streamError?.message).toBe(\n \"Generation failed\",\n );\n });\n });\n\n describe(\"Derivation Rules\", () => {\n it(\"should derive isPending correctly (no streaming activity AND all props pending)\", () => {\n const componentContent = createComponentContent({\n props: { title: \"\", body: \"\", footer: \"\" },\n streamingState: \"started\",\n });\n const message = createMessage(componentContent);\n const threadState = createThreadState([message]);\n mockUseStreamState.mockReturnValue(createStreamState(threadState));\n\n const { result } = renderHook(() =>\n useTamboStreamStatus<{\n title: string;\n body: string;\n footer: string;\n }>(),\n );\n\n // All props are pending and no streaming activity\n expect(result.current.streamStatus.isPending).toBe(true);\n expect(result.current.propStatus.title?.isPending).toBe(true);\n expect(result.current.propStatus.body?.isPending).toBe(true);\n expect(result.current.propStatus.footer?.isPending).toBe(true);\n });\n\n it(\"should derive isSuccess correctly (streaming done AND all props successful)\", () => {\n // Step 1: Start with streaming, props empty\n const startComponent = createComponentContent({\n props: { title: \"\", body: \"\" },\n streamingState: \"streaming\",\n });\n const startMessage = createMessage(startComponent);\n let threadState = createThreadState([startMessage]);\n mockUseStreamState.mockReturnValue(createStreamState(threadState));\n\n const { result, rerender } = renderHook(() =>\n useTamboStreamStatus<{ title: string; body: string }>(),\n );\n\n // Step 2: Simulate streaming in title\n const titleComponent = createComponentContent({\n props: { title: \"Complete Title\", body: \"\" },\n streamingState: \"streaming\",\n });\n const titleMessage = createMessage(titleComponent);\n threadState = createThreadState([titleMessage]);\n mockUseStreamState.mockReturnValue(createStreamState(threadState));\n rerender();\n\n // Step 3: Simulate streaming in body\n const bodyComponent = createComponentContent({\n props: { title: \"Complete Title\", body: \"Complete Body\" },\n streamingState: \"streaming\",\n });\n const bodyMessage = createMessage(bodyComponent);\n threadState = createThreadState([bodyMessage]);\n mockUseStreamState.mockReturnValue(createStreamState(threadState));\n rerender();\n\n // Step 4: Component streaming done\n const doneComponent = createComponentContent({\n props: { title: \"Complete Title\", body: \"Complete Body\" },\n streamingState: \"done\",\n });\n const doneMessage = createMessage(doneComponent);\n threadState = createThreadState([doneMessage]);\n mockUseStreamState.mockReturnValue(createStreamState(threadState));\n rerender();\n\n // Now both props should be successful\n expect(result.current.propStatus.title?.isSuccess).toBe(true);\n expect(result.current.propStatus.body?.isSuccess).toBe(true);\n expect(result.current.streamStatus.isSuccess).toBe(true);\n });\n });\n\n describe(\"Type Safety\", () => {\n it(\"should provide strongly typed prop status based on generic\", () => {\n interface TestProps {\n title: string;\n description: string;\n count: number;\n }\n\n const componentContent = createComponentContent({\n props: { title: \"Test\", description: \"Test desc\", count: 42 },\n streamingState: \"done\",\n });\n const message = createMessage(componentContent);\n const threadState = createThreadState([message]);\n mockUseStreamState.mockReturnValue(createStreamState(threadState));\n\n const { result } = renderHook(() => useTamboStreamStatus<TestProps>());\n\n // TypeScript should infer these keys correctly\n expect(result.current.propStatus.title).toBeDefined();\n expect(result.current.propStatus.description).toBeDefined();\n expect(result.current.propStatus.count).toBeDefined();\n });\n\n it(\"should work without generic type parameter\", () => {\n const componentContent = createComponentContent({\n props: { dynamicProp: \"value\" },\n streamingState: \"done\",\n });\n const message = createMessage(componentContent);\n const threadState = createThreadState([message]);\n mockUseStreamState.mockReturnValue(createStreamState(threadState));\n\n const { result } = renderHook(() => useTamboStreamStatus());\n\n expect(result.current.streamStatus).toBeDefined();\n expect(result.current.propStatus).toBeDefined();\n });\n });\n\n describe(\"Edge Cases\", () => {\n it(\"should handle missing component gracefully\", () => {\n const threadState = createThreadState([\n {\n id: \"test-message\",\n role: \"assistant\",\n content: [{ type: \"text\", text: \"Hello\" }],\n createdAt: new Date().toISOString(),\n },\n ]);\n mockUseStreamState.mockReturnValue(createStreamState(threadState));\n\n const { result } = renderHook(() => useTamboStreamStatus());\n\n expect(result.current.streamStatus.isPending).toBe(true);\n expect(result.current.propStatus).toEqual({});\n });\n\n it(\"should handle missing thread gracefully\", () => {\n mockUseStreamState.mockReturnValue({\n threadMap: {},\n currentThreadId: \"non-existent\",\n });\n\n const { result } = renderHook(() => useTamboStreamStatus());\n\n expect(result.current.streamStatus.isPending).toBe(true);\n expect(result.current.propStatus).toEqual({});\n });\n\n it(\"should error when component ID changes unexpectedly\", () => {\n const consoleSpy = jest.spyOn(console, \"error\").mockImplementation();\n\n const componentContent = createComponentContent({\n id: \"first-component\",\n props: { title: \"Title\" },\n streamingState: \"streaming\",\n });\n const message = createMessage(componentContent);\n const threadState = createThreadState([message]);\n mockUseStreamState.mockReturnValue(createStreamState(threadState));\n\n mockUseTamboComponentContent.mockReturnValue({\n componentId: \"first-component\",\n threadId: \"test-thread\",\n messageId: \"test-message\",\n componentName: \"TestComponent\",\n });\n\n const { rerender } = renderHook(() =>\n useTamboStreamStatus<{ title: string }>(),\n );\n\n // No error initially\n expect(consoleSpy).not.toHaveBeenCalled();\n\n // Change componentId (this should not happen in practice)\n mockUseTamboComponentContent.mockReturnValue({\n componentId: \"second-component\",\n threadId: \"test-thread\",\n messageId: \"test-message\",\n componentName: \"TestComponent\",\n });\n\n rerender();\n\n // Should log an error indicating incorrect provider usage\n expect(consoleSpy).toHaveBeenCalledWith(\n expect.stringContaining(\"componentId changed\"),\n );\n\n consoleSpy.mockRestore();\n });\n });\n});\n"]}
1
+ {"version":3,"file":"use-tambo-v1-stream-status.test.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-stream-status.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import { renderHook } from \"@testing-library/react\";\nimport { useTamboStreamStatus } from \"./use-tambo-v1-stream-status\";\n\n// Mock the required hooks\njest.mock(\"../utils/component-renderer\", () => ({\n useComponentContent: jest.fn(),\n}));\n\njest.mock(\"../providers/tambo-v1-stream-context\", () => ({\n useStreamState: jest.fn(),\n}));\n\n// Import the mocked functions\nimport { useComponentContent } from \"../utils/component-renderer\";\nimport { useStreamState } from \"../providers/tambo-v1-stream-context\";\nimport type { StreamState, ThreadState } from \"@tambo-ai/client\";\nimport type {\n TamboComponentContent,\n TamboThreadMessage,\n} from \"../types/message\";\n\n// Mock window for SSR tests\nconst originalWindow = global.window;\n\n// Get the mocked functions\nconst mockUseTamboComponentContent = jest.mocked(useComponentContent);\nconst mockUseStreamState = jest.mocked(useStreamState);\n\n/**\n * Helper to create a component content block.\n * @returns A TamboComponentContent with test defaults.\n */\nfunction createComponentContent(\n overrides: Partial<TamboComponentContent> = {},\n): TamboComponentContent {\n return {\n type: \"component\",\n id: \"test-component\",\n name: \"TestComponent\",\n props: {},\n streamingState: \"started\",\n ...overrides,\n };\n}\n\n/**\n * Helper to create a message with a component.\n * @returns A TamboThreadMessage with a component content block.\n */\nfunction createMessage(\n componentContent: TamboComponentContent,\n overrides: Partial<TamboThreadMessage> = {},\n): TamboThreadMessage {\n return {\n id: \"test-message\",\n role: \"assistant\",\n content: [componentContent],\n createdAt: new Date().toISOString(),\n ...overrides,\n };\n}\n\n/**\n * Helper to create a thread state.\n * @returns A ThreadState with test defaults.\n */\nfunction createThreadState(\n messages: TamboThreadMessage[],\n overrides: Partial<ThreadState> = {},\n): ThreadState {\n return {\n thread: {\n id: \"test-thread\",\n messages,\n status: \"idle\",\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n lastRunCancelled: false,\n },\n streaming: {\n status: \"idle\",\n },\n accumulatingToolArgs: {},\n ...overrides,\n };\n}\n\n/**\n * Helper to create a stream state.\n * @returns A StreamState with test defaults.\n */\nfunction createStreamState(\n threadState: ThreadState,\n threadId = \"test-thread\",\n): StreamState {\n return {\n threadMap: {\n [threadId]: threadState,\n },\n currentThreadId: threadId,\n };\n}\n\ndescribe(\"useTamboStreamStatus\", () => {\n beforeEach(() => {\n // Restore window for client-side tests\n global.window = originalWindow;\n\n // Default mock implementations\n mockUseTamboComponentContent.mockReturnValue({\n componentId: \"test-component\",\n threadId: \"test-thread\",\n messageId: \"test-message\",\n componentName: \"TestComponent\",\n });\n\n const componentContent = createComponentContent({ props: {} });\n const message = createMessage(componentContent);\n const threadState = createThreadState([message]);\n mockUseStreamState.mockReturnValue(createStreamState(threadState));\n });\n\n afterEach(() => {\n jest.clearAllMocks();\n // Restore window after each test\n global.window = originalWindow;\n });\n\n describe(\"Initial State\", () => {\n it(\"should start with all flags as pending when component streaming is 'started' and no props\", () => {\n const componentContent = createComponentContent({\n props: { title: \"\", body: \"\" },\n streamingState: \"started\",\n });\n const message = createMessage(componentContent);\n const threadState = createThreadState([message]);\n mockUseStreamState.mockReturnValue(createStreamState(threadState));\n\n const { result } = renderHook(() =>\n useTamboStreamStatus<{ title: string; body: string }>(),\n );\n\n expect(result.current.streamStatus).toEqual({\n isPending: true,\n isStreaming: false,\n isSuccess: false,\n isError: false,\n streamError: undefined,\n });\n\n expect(result.current.propStatus.title).toEqual({\n isPending: true,\n isStreaming: false,\n isSuccess: false,\n error: undefined,\n });\n\n expect(result.current.propStatus.body).toEqual({\n isPending: true,\n isStreaming: false,\n isSuccess: false,\n error: undefined,\n });\n });\n });\n\n describe(\"Streaming State Transitions\", () => {\n it(\"should show isStreaming when component is streaming even before props receive content\", () => {\n // Component is streaming but props are still empty\n const componentContent = createComponentContent({\n props: { title: \"\", body: \"\" },\n streamingState: \"streaming\",\n });\n const message = createMessage(componentContent);\n const threadState = createThreadState([message]);\n mockUseStreamState.mockReturnValue(createStreamState(threadState));\n\n const { result } = renderHook(() =>\n useTamboStreamStatus<{ title: string; body: string }>(),\n );\n\n // Global should be streaming even though no props have content yet\n expect(result.current.streamStatus.isStreaming).toBe(true);\n expect(result.current.streamStatus.isPending).toBe(false);\n\n // Individual props should still be pending\n expect(result.current.propStatus.title?.isPending).toBe(true);\n expect(result.current.propStatus.title?.isStreaming).toBe(false);\n });\n\n it(\"should show prop streaming when props receive content during streaming\", () => {\n const componentContent = createComponentContent({\n props: { title: \"Hello\", body: \"\" },\n streamingState: \"streaming\",\n });\n const message = createMessage(componentContent);\n const threadState = createThreadState([message]);\n mockUseStreamState.mockReturnValue(createStreamState(threadState));\n\n const { result } = renderHook(() =>\n useTamboStreamStatus<{ title: string; body: string }>(),\n );\n\n // Title prop should be streaming since it has content\n expect(result.current.propStatus.title?.isStreaming).toBe(true);\n expect(result.current.propStatus.title?.isPending).toBe(false);\n\n // Body prop should still be pending since it has no content\n expect(result.current.propStatus.body?.isStreaming).toBe(false);\n expect(result.current.propStatus.body?.isPending).toBe(true);\n\n // Global should be streaming because at least one prop is streaming\n expect(result.current.streamStatus.isStreaming).toBe(true);\n });\n\n it(\"should transition through Init -> Streaming -> Success lifecycle\", () => {\n // Start with \"started\" (Init phase)\n const componentContent = createComponentContent({\n props: { title: \"\", body: \"\" },\n streamingState: \"started\",\n });\n const message = createMessage(componentContent);\n let threadState = createThreadState([message]);\n mockUseStreamState.mockReturnValue(createStreamState(threadState));\n\n const { result, rerender } = renderHook(() =>\n useTamboStreamStatus<{ title: string; body: string }>(),\n );\n\n // Phase 1: Init - isPending = true\n expect(result.current.streamStatus.isPending).toBe(true);\n expect(result.current.streamStatus.isStreaming).toBe(false);\n expect(result.current.streamStatus.isSuccess).toBe(false);\n\n // Phase 2: Streaming - move to \"streaming\" with content\n const streamingComponent = createComponentContent({\n props: { title: \"Hello World\", body: \"Some content\" },\n streamingState: \"streaming\",\n });\n const streamingMessage = createMessage(streamingComponent);\n threadState = createThreadState([streamingMessage]);\n mockUseStreamState.mockReturnValue(createStreamState(threadState));\n\n rerender();\n\n expect(result.current.streamStatus.isPending).toBe(false);\n expect(result.current.streamStatus.isStreaming).toBe(true);\n expect(result.current.streamStatus.isSuccess).toBe(false);\n\n // Phase 3: Complete - move to \"done\"\n const doneComponent = createComponentContent({\n props: { title: \"Hello World\", body: \"Some content\" },\n streamingState: \"done\",\n });\n const doneMessage = createMessage(doneComponent);\n threadState = createThreadState([doneMessage]);\n mockUseStreamState.mockReturnValue(createStreamState(threadState));\n\n rerender();\n\n expect(result.current.streamStatus.isPending).toBe(false);\n expect(result.current.streamStatus.isStreaming).toBe(false);\n expect(result.current.streamStatus.isSuccess).toBe(true);\n });\n });\n\n describe(\"Error Handling\", () => {\n it(\"should handle error state correctly\", () => {\n const componentContent = createComponentContent({\n props: { title: \"\", body: \"\" },\n streamingState: \"started\",\n });\n const message = createMessage(componentContent);\n const threadState = createThreadState([message], {\n streaming: {\n status: \"idle\",\n error: { message: \"Generation failed\", code: \"GENERATION_ERROR\" },\n },\n });\n mockUseStreamState.mockReturnValue(createStreamState(threadState));\n\n const { result } = renderHook(() =>\n useTamboStreamStatus<{ title: string; body: string }>(),\n );\n\n // Error state: isPending=false (error overrides pending), isStreaming=false (error stops streaming)\n expect(result.current.streamStatus.isPending).toBe(false);\n expect(result.current.streamStatus.isStreaming).toBe(false);\n expect(result.current.streamStatus.isSuccess).toBe(false);\n expect(result.current.streamStatus.isError).toBe(true);\n expect(result.current.streamStatus.streamError?.message).toBe(\n \"Generation failed\",\n );\n });\n });\n\n describe(\"Derivation Rules\", () => {\n it(\"should derive isPending correctly (no streaming activity AND all props pending)\", () => {\n const componentContent = createComponentContent({\n props: { title: \"\", body: \"\", footer: \"\" },\n streamingState: \"started\",\n });\n const message = createMessage(componentContent);\n const threadState = createThreadState([message]);\n mockUseStreamState.mockReturnValue(createStreamState(threadState));\n\n const { result } = renderHook(() =>\n useTamboStreamStatus<{\n title: string;\n body: string;\n footer: string;\n }>(),\n );\n\n // All props are pending and no streaming activity\n expect(result.current.streamStatus.isPending).toBe(true);\n expect(result.current.propStatus.title?.isPending).toBe(true);\n expect(result.current.propStatus.body?.isPending).toBe(true);\n expect(result.current.propStatus.footer?.isPending).toBe(true);\n });\n\n it(\"should derive isSuccess correctly (streaming done AND all props successful)\", () => {\n // Step 1: Start with streaming, props empty\n const startComponent = createComponentContent({\n props: { title: \"\", body: \"\" },\n streamingState: \"streaming\",\n });\n const startMessage = createMessage(startComponent);\n let threadState = createThreadState([startMessage]);\n mockUseStreamState.mockReturnValue(createStreamState(threadState));\n\n const { result, rerender } = renderHook(() =>\n useTamboStreamStatus<{ title: string; body: string }>(),\n );\n\n // Step 2: Simulate streaming in title\n const titleComponent = createComponentContent({\n props: { title: \"Complete Title\", body: \"\" },\n streamingState: \"streaming\",\n });\n const titleMessage = createMessage(titleComponent);\n threadState = createThreadState([titleMessage]);\n mockUseStreamState.mockReturnValue(createStreamState(threadState));\n rerender();\n\n // Step 3: Simulate streaming in body\n const bodyComponent = createComponentContent({\n props: { title: \"Complete Title\", body: \"Complete Body\" },\n streamingState: \"streaming\",\n });\n const bodyMessage = createMessage(bodyComponent);\n threadState = createThreadState([bodyMessage]);\n mockUseStreamState.mockReturnValue(createStreamState(threadState));\n rerender();\n\n // Step 4: Component streaming done\n const doneComponent = createComponentContent({\n props: { title: \"Complete Title\", body: \"Complete Body\" },\n streamingState: \"done\",\n });\n const doneMessage = createMessage(doneComponent);\n threadState = createThreadState([doneMessage]);\n mockUseStreamState.mockReturnValue(createStreamState(threadState));\n rerender();\n\n // Now both props should be successful\n expect(result.current.propStatus.title?.isSuccess).toBe(true);\n expect(result.current.propStatus.body?.isSuccess).toBe(true);\n expect(result.current.streamStatus.isSuccess).toBe(true);\n });\n });\n\n describe(\"Type Safety\", () => {\n it(\"should provide strongly typed prop status based on generic\", () => {\n interface TestProps {\n title: string;\n description: string;\n count: number;\n }\n\n const componentContent = createComponentContent({\n props: { title: \"Test\", description: \"Test desc\", count: 42 },\n streamingState: \"done\",\n });\n const message = createMessage(componentContent);\n const threadState = createThreadState([message]);\n mockUseStreamState.mockReturnValue(createStreamState(threadState));\n\n const { result } = renderHook(() => useTamboStreamStatus<TestProps>());\n\n // TypeScript should infer these keys correctly\n expect(result.current.propStatus.title).toBeDefined();\n expect(result.current.propStatus.description).toBeDefined();\n expect(result.current.propStatus.count).toBeDefined();\n });\n\n it(\"should work without generic type parameter\", () => {\n const componentContent = createComponentContent({\n props: { dynamicProp: \"value\" },\n streamingState: \"done\",\n });\n const message = createMessage(componentContent);\n const threadState = createThreadState([message]);\n mockUseStreamState.mockReturnValue(createStreamState(threadState));\n\n const { result } = renderHook(() => useTamboStreamStatus());\n\n expect(result.current.streamStatus).toBeDefined();\n expect(result.current.propStatus).toBeDefined();\n });\n });\n\n describe(\"Edge Cases\", () => {\n it(\"should handle missing component gracefully\", () => {\n const threadState = createThreadState([\n {\n id: \"test-message\",\n role: \"assistant\",\n content: [{ type: \"text\", text: \"Hello\" }],\n createdAt: new Date().toISOString(),\n },\n ]);\n mockUseStreamState.mockReturnValue(createStreamState(threadState));\n\n const { result } = renderHook(() => useTamboStreamStatus());\n\n expect(result.current.streamStatus.isPending).toBe(true);\n expect(result.current.propStatus).toEqual({});\n });\n\n it(\"should handle missing thread gracefully\", () => {\n mockUseStreamState.mockReturnValue({\n threadMap: {},\n currentThreadId: \"non-existent\",\n });\n\n const { result } = renderHook(() => useTamboStreamStatus());\n\n expect(result.current.streamStatus.isPending).toBe(true);\n expect(result.current.propStatus).toEqual({});\n });\n\n it(\"should error when component ID changes unexpectedly\", () => {\n const consoleSpy = jest.spyOn(console, \"error\").mockImplementation();\n\n const componentContent = createComponentContent({\n id: \"first-component\",\n props: { title: \"Title\" },\n streamingState: \"streaming\",\n });\n const message = createMessage(componentContent);\n const threadState = createThreadState([message]);\n mockUseStreamState.mockReturnValue(createStreamState(threadState));\n\n mockUseTamboComponentContent.mockReturnValue({\n componentId: \"first-component\",\n threadId: \"test-thread\",\n messageId: \"test-message\",\n componentName: \"TestComponent\",\n });\n\n const { rerender } = renderHook(() =>\n useTamboStreamStatus<{ title: string }>(),\n );\n\n // No error initially\n expect(consoleSpy).not.toHaveBeenCalled();\n\n // Change componentId (this should not happen in practice)\n mockUseTamboComponentContent.mockReturnValue({\n componentId: \"second-component\",\n threadId: \"test-thread\",\n messageId: \"test-message\",\n componentName: \"TestComponent\",\n });\n\n rerender();\n\n // Should log an error indicating incorrect provider usage\n expect(consoleSpy).toHaveBeenCalledWith(\n expect.stringContaining(\"componentId changed\"),\n );\n\n consoleSpy.mockRestore();\n });\n });\n});\n"]}
@@ -15,7 +15,7 @@ const tambo_registry_provider_1 = require("../../providers/tambo-registry-provid
15
15
  const tambo_v1_provider_1 = require("../providers/tambo-v1-provider");
16
16
  const use_tambo_v1_1 = require("./use-tambo-v1");
17
17
  const use_tambo_v1_thread_input_1 = require("./use-tambo-v1-thread-input");
18
- const registry_conversion_1 = require("../utils/registry-conversion");
18
+ const client_1 = require("@tambo-ai/client");
19
19
  /**
20
20
  * Hook for managing AI-powered suggestions in a thread.
21
21
  *
@@ -105,7 +105,7 @@ function useTamboSuggestions(options = {}) {
105
105
  if (!currentThreadId || !latestMessageId || !isLatestFromAssistant) {
106
106
  return undefined;
107
107
  }
108
- const availableComponents = (0, registry_conversion_1.toAvailableComponents)(componentList);
108
+ const availableComponents = (0, client_1.toAvailableComponents)(componentList);
109
109
  return await client.threads.suggestions.create(latestMessageId, {
110
110
  threadId: currentThreadId,
111
111
  maxSuggestions,
@@ -1 +1 @@
1
- {"version":3,"file":"use-tambo-v1-suggestions.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-suggestions.ts"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\n/**\n * useTamboSuggestions - Suggestions Hook\n *\n * Manages AI-powered suggestions for thread messages.\n * Uses the API endpoints for listing and creating suggestions.\n */\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n SuggestionCreateResponse,\n SuggestionListResponse,\n} from \"@tambo-ai/typescript-sdk/resources/threads/suggestions\";\nimport type { Suggestion } from \"@tambo-ai/typescript-sdk/resources/beta/threads/suggestions\";\nimport {\n useTamboClient,\n useTamboQueryClient,\n} from \"../../providers/tambo-client-provider\";\nimport { useTamboQuery, useTamboMutation } from \"../../hooks/react-query-hooks\";\nimport { useTamboRegistry } from \"../../providers/tambo-registry-provider\";\nimport { useTamboConfig } from \"../providers/tambo-v1-provider\";\nimport { useTambo } from \"./use-tambo-v1\";\nimport { useTamboThreadInput } from \"./use-tambo-v1-thread-input\";\nimport { toAvailableComponents } from \"../utils/registry-conversion\";\n\n/**\n * Response type for suggestions queries (union of list and create responses)\n */\ntype SuggestionsQueryResponse =\n | SuggestionListResponse\n | SuggestionCreateResponse;\n\n/**\n * Configuration options for the useTamboSuggestions hook\n */\nexport interface UseTamboSuggestionsOptions {\n /** Maximum number of suggestions to generate (1-10, default 3) */\n maxSuggestions?: number;\n /**\n * Whether to automatically generate suggestions when the latest message is from the assistant.\n * Default: true\n */\n autoGenerate?: boolean;\n /**\n * Additional React Query options for the suggestions query.\n * Allows customizing caching, refetching behavior, etc.\n */\n queryOptions?: Omit<\n UseQueryOptions<SuggestionsQueryResponse>,\n \"queryKey\" | \"queryFn\" | \"enabled\"\n >;\n}\n\n/**\n * Options for accepting a suggestion\n */\nexport interface AcceptSuggestionOptions {\n /** The suggestion to accept */\n suggestion: Suggestion;\n /** Whether to automatically submit the suggestion after accepting (default: false) */\n shouldSubmit?: boolean;\n}\n\n/**\n * Return type for useTamboSuggestions hook\n */\nexport interface UseTamboSuggestionsReturn {\n // ---------------------------------------------------------------------------\n // Data (mirrors react-query patterns)\n // ---------------------------------------------------------------------------\n\n /**\n * The raw response data from the suggestions query.\n * Use this for direct access to the API response shape.\n */\n data: SuggestionsQueryResponse | undefined;\n\n /** List of available suggestions for the current message (convenience accessor) */\n suggestions: Suggestion[];\n\n // ---------------------------------------------------------------------------\n // Query state (matches react-query UseQueryResult)\n // ---------------------------------------------------------------------------\n\n /** Whether the suggestions query is loading (first fetch) */\n isLoading: boolean;\n\n /** Whether suggestions have been successfully loaded */\n isSuccess: boolean;\n\n /** Whether there was an error loading suggestions */\n isError: boolean;\n\n /** Error from loading suggestions, if any */\n error: Error | null;\n\n /** Whether the query is currently fetching (includes background refetches) */\n isFetching: boolean;\n\n // ---------------------------------------------------------------------------\n // Generate mutation (for manual suggestion generation)\n // ---------------------------------------------------------------------------\n\n /**\n * Manually generate new suggestions for the current message.\n * Use this when autoGenerate is false or to refresh suggestions.\n */\n generate: () => Promise<SuggestionCreateResponse | undefined>;\n\n /** Whether suggestions are being generated (mutation pending) */\n isGenerating: boolean;\n\n /** Error from generating suggestions, if any */\n generateError: Error | null;\n\n // ---------------------------------------------------------------------------\n // Accept mutation (for applying a suggestion)\n // ---------------------------------------------------------------------------\n\n /**\n * Accept and apply a suggestion.\n * Sets the suggestion text as input value, optionally submitting it.\n */\n accept: (options: AcceptSuggestionOptions) => Promise<void>;\n\n /** Whether accepting a suggestion is in progress */\n isAccepting: boolean;\n\n /** Error from accepting a suggestion, if any */\n acceptError: Error | null;\n\n // ---------------------------------------------------------------------------\n // UI state\n // ---------------------------------------------------------------------------\n\n /** ID of the currently selected suggestion */\n selectedSuggestionId: string | null;\n}\n\n/**\n * Hook for managing AI-powered suggestions in a thread.\n *\n * Provides functionality to:\n * - Automatically generate suggestions when an assistant message arrives\n * - Manually generate suggestions on demand\n * - Accept suggestions by setting them as input or auto-submitting\n * @param options - Configuration options\n * @returns Suggestions state and control functions\n * @example\n * ```tsx\n * function SuggestionsPanel() {\n * const {\n * suggestions,\n * accept,\n * isLoading,\n * selectedSuggestionId,\n * } = useTamboSuggestions();\n *\n * if (isLoading) return <Spinner />;\n *\n * return (\n * <div>\n * {suggestions.map((suggestion) => (\n * <button\n * key={suggestion.id}\n * onClick={() => accept({ suggestion })}\n * className={selectedSuggestionId === suggestion.id ? 'selected' : ''}\n * >\n * {suggestion.title}\n * </button>\n * ))}\n * </div>\n * );\n * }\n * ```\n */\nexport function useTamboSuggestions(\n options: UseTamboSuggestionsOptions = {},\n): UseTamboSuggestionsReturn {\n const { maxSuggestions = 3, autoGenerate = true, queryOptions } = options;\n\n const client = useTamboClient();\n const { userKey } = useTamboConfig();\n const { componentList } = useTamboRegistry();\n const queryClient = useTamboQueryClient();\n\n const { messages, isIdle, currentThreadId } = useTambo();\n const { setValue: setInputValue, submit } = useTamboThreadInput();\n\n const [selectedSuggestionId, setSelectedSuggestionId] = useState<\n string | null\n >(null);\n\n // Get the latest message info\n const latestMessage = messages[messages.length - 1];\n const isLatestFromAssistant = latestMessage?.role === \"assistant\";\n const latestMessageId = latestMessage?.id;\n\n // Reset selected suggestion when the message changes\n useEffect(() => {\n setSelectedSuggestionId(null);\n }, [latestMessageId]);\n\n // Determine if we should fetch/generate suggestions\n const shouldFetchSuggestions =\n currentThreadId &&\n latestMessageId &&\n isLatestFromAssistant &&\n isIdle &&\n autoGenerate;\n\n const suggestionsQueryKey = [\n \"v1-suggestions\",\n currentThreadId ?? null,\n latestMessageId ?? null,\n ] as const;\n\n // Query to list existing suggestions\n const suggestionsQuery = useTamboQuery({\n queryKey: suggestionsQueryKey,\n queryFn: async (): Promise<SuggestionsQueryResponse> => {\n if (!shouldFetchSuggestions || !latestMessageId || !currentThreadId) {\n return { suggestions: [], hasMore: false };\n }\n\n return await client.threads.suggestions.list(latestMessageId, {\n threadId: currentThreadId,\n userKey,\n });\n },\n ...queryOptions,\n enabled: Boolean(shouldFetchSuggestions),\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n retry: false,\n });\n\n // Mutation to manually generate suggestions\n const generateMutation = useTamboMutation({\n mutationFn: async () => {\n if (!currentThreadId || !latestMessageId || !isLatestFromAssistant) {\n return undefined;\n }\n\n const availableComponents = toAvailableComponents(componentList);\n\n return await client.threads.suggestions.create(latestMessageId, {\n threadId: currentThreadId,\n maxSuggestions,\n availableComponents,\n userKey,\n });\n },\n onSuccess: (data) => {\n if (data && currentThreadId && latestMessageId) {\n // Update the query cache with new suggestions\n queryClient.setQueryData(suggestionsQueryKey, data);\n }\n },\n });\n\n const lastAutoGenerateMessageIdRef = useRef<string | null>(null);\n\n useEffect(() => {\n lastAutoGenerateMessageIdRef.current = null;\n }, [latestMessageId]);\n\n const listSuggestionsCount = suggestionsQuery.data?.suggestions.length ?? 0;\n const generateMutate = generateMutation.mutate;\n const isGenerating = generateMutation.isPending;\n const isListError = suggestionsQuery.isError;\n const isListSuccess = suggestionsQuery.isSuccess;\n\n useEffect(() => {\n if (!shouldFetchSuggestions || !latestMessageId) {\n return;\n }\n\n if (listSuggestionsCount > 0) {\n return;\n }\n\n const shouldAutoGenerate =\n (isListSuccess && listSuggestionsCount === 0) || isListError;\n\n if (!shouldAutoGenerate) {\n return;\n }\n\n if (isGenerating) {\n return;\n }\n\n if (lastAutoGenerateMessageIdRef.current === latestMessageId) {\n return;\n }\n\n lastAutoGenerateMessageIdRef.current = latestMessageId;\n generateMutate();\n }, [\n generateMutate,\n isGenerating,\n isListError,\n isListSuccess,\n latestMessageId,\n listSuggestionsCount,\n shouldFetchSuggestions,\n ]);\n\n // Mutation to accept a suggestion\n const acceptMutation = useTamboMutation({\n mutationFn: async ({\n suggestion,\n shouldSubmit = false,\n }: AcceptSuggestionOptions) => {\n const text = suggestion.detailedSuggestion?.trim();\n if (!text) {\n throw new Error(\"Suggestion has no content\");\n }\n\n if (shouldSubmit) {\n // Set value and submit\n setInputValue(text);\n await submit();\n } else {\n // Just set the input value\n setInputValue(text);\n }\n\n setSelectedSuggestionId(suggestion.id);\n },\n });\n\n // Generate callback\n const generateMutateAsync = generateMutation.mutateAsync;\n const generate = useCallback(async () => {\n return await generateMutateAsync();\n }, [generateMutateAsync]);\n\n // Accept callback\n const accept = useCallback(\n async (acceptOptions: AcceptSuggestionOptions) => {\n await acceptMutation.mutateAsync(acceptOptions);\n },\n [acceptMutation],\n );\n\n // Get suggestions from query or mutation result\n const queryData = suggestionsQuery.data;\n const mutationData = generateMutation.data;\n\n // Use mutation data if available (more recent), otherwise query data\n const currentData = mutationData ?? queryData;\n const suggestions = isLatestFromAssistant\n ? (currentData?.suggestions ?? [])\n : [];\n\n return {\n // Data\n data: currentData,\n suggestions,\n\n // Query state (matches react-query patterns)\n isLoading: suggestionsQuery.isLoading,\n isSuccess: suggestionsQuery.isSuccess,\n isError: suggestionsQuery.isError,\n error: suggestionsQuery.error,\n isFetching: suggestionsQuery.isFetching,\n\n // Generate mutation\n generate,\n isGenerating: generateMutation.isPending,\n generateError: generateMutation.error,\n\n // Accept mutation\n accept,\n isAccepting: acceptMutation.isPending,\n acceptError: acceptMutation.error,\n\n // UI state\n selectedSuggestionId,\n };\n}\n"]}
1
+ {"version":3,"file":"use-tambo-v1-suggestions.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-suggestions.ts"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\n/**\n * useTamboSuggestions - Suggestions Hook\n *\n * Manages AI-powered suggestions for thread messages.\n * Uses the API endpoints for listing and creating suggestions.\n */\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n SuggestionCreateResponse,\n SuggestionListResponse,\n} from \"@tambo-ai/typescript-sdk/resources/threads/suggestions\";\nimport type { Suggestion } from \"@tambo-ai/typescript-sdk/resources/beta/threads/suggestions\";\nimport {\n useTamboClient,\n useTamboQueryClient,\n} from \"../../providers/tambo-client-provider\";\nimport { useTamboQuery, useTamboMutation } from \"../../hooks/react-query-hooks\";\nimport { useTamboRegistry } from \"../../providers/tambo-registry-provider\";\nimport { useTamboConfig } from \"../providers/tambo-v1-provider\";\nimport { useTambo } from \"./use-tambo-v1\";\nimport { useTamboThreadInput } from \"./use-tambo-v1-thread-input\";\nimport { toAvailableComponents } from \"@tambo-ai/client\";\n\n/**\n * Response type for suggestions queries (union of list and create responses)\n */\ntype SuggestionsQueryResponse =\n | SuggestionListResponse\n | SuggestionCreateResponse;\n\n/**\n * Configuration options for the useTamboSuggestions hook\n */\nexport interface UseTamboSuggestionsOptions {\n /** Maximum number of suggestions to generate (1-10, default 3) */\n maxSuggestions?: number;\n /**\n * Whether to automatically generate suggestions when the latest message is from the assistant.\n * Default: true\n */\n autoGenerate?: boolean;\n /**\n * Additional React Query options for the suggestions query.\n * Allows customizing caching, refetching behavior, etc.\n */\n queryOptions?: Omit<\n UseQueryOptions<SuggestionsQueryResponse>,\n \"queryKey\" | \"queryFn\" | \"enabled\"\n >;\n}\n\n/**\n * Options for accepting a suggestion\n */\nexport interface AcceptSuggestionOptions {\n /** The suggestion to accept */\n suggestion: Suggestion;\n /** Whether to automatically submit the suggestion after accepting (default: false) */\n shouldSubmit?: boolean;\n}\n\n/**\n * Return type for useTamboSuggestions hook\n */\nexport interface UseTamboSuggestionsReturn {\n // ---------------------------------------------------------------------------\n // Data (mirrors react-query patterns)\n // ---------------------------------------------------------------------------\n\n /**\n * The raw response data from the suggestions query.\n * Use this for direct access to the API response shape.\n */\n data: SuggestionsQueryResponse | undefined;\n\n /** List of available suggestions for the current message (convenience accessor) */\n suggestions: Suggestion[];\n\n // ---------------------------------------------------------------------------\n // Query state (matches react-query UseQueryResult)\n // ---------------------------------------------------------------------------\n\n /** Whether the suggestions query is loading (first fetch) */\n isLoading: boolean;\n\n /** Whether suggestions have been successfully loaded */\n isSuccess: boolean;\n\n /** Whether there was an error loading suggestions */\n isError: boolean;\n\n /** Error from loading suggestions, if any */\n error: Error | null;\n\n /** Whether the query is currently fetching (includes background refetches) */\n isFetching: boolean;\n\n // ---------------------------------------------------------------------------\n // Generate mutation (for manual suggestion generation)\n // ---------------------------------------------------------------------------\n\n /**\n * Manually generate new suggestions for the current message.\n * Use this when autoGenerate is false or to refresh suggestions.\n */\n generate: () => Promise<SuggestionCreateResponse | undefined>;\n\n /** Whether suggestions are being generated (mutation pending) */\n isGenerating: boolean;\n\n /** Error from generating suggestions, if any */\n generateError: Error | null;\n\n // ---------------------------------------------------------------------------\n // Accept mutation (for applying a suggestion)\n // ---------------------------------------------------------------------------\n\n /**\n * Accept and apply a suggestion.\n * Sets the suggestion text as input value, optionally submitting it.\n */\n accept: (options: AcceptSuggestionOptions) => Promise<void>;\n\n /** Whether accepting a suggestion is in progress */\n isAccepting: boolean;\n\n /** Error from accepting a suggestion, if any */\n acceptError: Error | null;\n\n // ---------------------------------------------------------------------------\n // UI state\n // ---------------------------------------------------------------------------\n\n /** ID of the currently selected suggestion */\n selectedSuggestionId: string | null;\n}\n\n/**\n * Hook for managing AI-powered suggestions in a thread.\n *\n * Provides functionality to:\n * - Automatically generate suggestions when an assistant message arrives\n * - Manually generate suggestions on demand\n * - Accept suggestions by setting them as input or auto-submitting\n * @param options - Configuration options\n * @returns Suggestions state and control functions\n * @example\n * ```tsx\n * function SuggestionsPanel() {\n * const {\n * suggestions,\n * accept,\n * isLoading,\n * selectedSuggestionId,\n * } = useTamboSuggestions();\n *\n * if (isLoading) return <Spinner />;\n *\n * return (\n * <div>\n * {suggestions.map((suggestion) => (\n * <button\n * key={suggestion.id}\n * onClick={() => accept({ suggestion })}\n * className={selectedSuggestionId === suggestion.id ? 'selected' : ''}\n * >\n * {suggestion.title}\n * </button>\n * ))}\n * </div>\n * );\n * }\n * ```\n */\nexport function useTamboSuggestions(\n options: UseTamboSuggestionsOptions = {},\n): UseTamboSuggestionsReturn {\n const { maxSuggestions = 3, autoGenerate = true, queryOptions } = options;\n\n const client = useTamboClient();\n const { userKey } = useTamboConfig();\n const { componentList } = useTamboRegistry();\n const queryClient = useTamboQueryClient();\n\n const { messages, isIdle, currentThreadId } = useTambo();\n const { setValue: setInputValue, submit } = useTamboThreadInput();\n\n const [selectedSuggestionId, setSelectedSuggestionId] = useState<\n string | null\n >(null);\n\n // Get the latest message info\n const latestMessage = messages[messages.length - 1];\n const isLatestFromAssistant = latestMessage?.role === \"assistant\";\n const latestMessageId = latestMessage?.id;\n\n // Reset selected suggestion when the message changes\n useEffect(() => {\n setSelectedSuggestionId(null);\n }, [latestMessageId]);\n\n // Determine if we should fetch/generate suggestions\n const shouldFetchSuggestions =\n currentThreadId &&\n latestMessageId &&\n isLatestFromAssistant &&\n isIdle &&\n autoGenerate;\n\n const suggestionsQueryKey = [\n \"v1-suggestions\",\n currentThreadId ?? null,\n latestMessageId ?? null,\n ] as const;\n\n // Query to list existing suggestions\n const suggestionsQuery = useTamboQuery({\n queryKey: suggestionsQueryKey,\n queryFn: async (): Promise<SuggestionsQueryResponse> => {\n if (!shouldFetchSuggestions || !latestMessageId || !currentThreadId) {\n return { suggestions: [], hasMore: false };\n }\n\n return await client.threads.suggestions.list(latestMessageId, {\n threadId: currentThreadId,\n userKey,\n });\n },\n ...queryOptions,\n enabled: Boolean(shouldFetchSuggestions),\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n retry: false,\n });\n\n // Mutation to manually generate suggestions\n const generateMutation = useTamboMutation({\n mutationFn: async () => {\n if (!currentThreadId || !latestMessageId || !isLatestFromAssistant) {\n return undefined;\n }\n\n const availableComponents = toAvailableComponents(componentList);\n\n return await client.threads.suggestions.create(latestMessageId, {\n threadId: currentThreadId,\n maxSuggestions,\n availableComponents,\n userKey,\n });\n },\n onSuccess: (data) => {\n if (data && currentThreadId && latestMessageId) {\n // Update the query cache with new suggestions\n queryClient.setQueryData(suggestionsQueryKey, data);\n }\n },\n });\n\n const lastAutoGenerateMessageIdRef = useRef<string | null>(null);\n\n useEffect(() => {\n lastAutoGenerateMessageIdRef.current = null;\n }, [latestMessageId]);\n\n const listSuggestionsCount = suggestionsQuery.data?.suggestions.length ?? 0;\n const generateMutate = generateMutation.mutate;\n const isGenerating = generateMutation.isPending;\n const isListError = suggestionsQuery.isError;\n const isListSuccess = suggestionsQuery.isSuccess;\n\n useEffect(() => {\n if (!shouldFetchSuggestions || !latestMessageId) {\n return;\n }\n\n if (listSuggestionsCount > 0) {\n return;\n }\n\n const shouldAutoGenerate =\n (isListSuccess && listSuggestionsCount === 0) || isListError;\n\n if (!shouldAutoGenerate) {\n return;\n }\n\n if (isGenerating) {\n return;\n }\n\n if (lastAutoGenerateMessageIdRef.current === latestMessageId) {\n return;\n }\n\n lastAutoGenerateMessageIdRef.current = latestMessageId;\n generateMutate();\n }, [\n generateMutate,\n isGenerating,\n isListError,\n isListSuccess,\n latestMessageId,\n listSuggestionsCount,\n shouldFetchSuggestions,\n ]);\n\n // Mutation to accept a suggestion\n const acceptMutation = useTamboMutation({\n mutationFn: async ({\n suggestion,\n shouldSubmit = false,\n }: AcceptSuggestionOptions) => {\n const text = suggestion.detailedSuggestion?.trim();\n if (!text) {\n throw new Error(\"Suggestion has no content\");\n }\n\n if (shouldSubmit) {\n // Set value and submit\n setInputValue(text);\n await submit();\n } else {\n // Just set the input value\n setInputValue(text);\n }\n\n setSelectedSuggestionId(suggestion.id);\n },\n });\n\n // Generate callback\n const generateMutateAsync = generateMutation.mutateAsync;\n const generate = useCallback(async () => {\n return await generateMutateAsync();\n }, [generateMutateAsync]);\n\n // Accept callback\n const accept = useCallback(\n async (acceptOptions: AcceptSuggestionOptions) => {\n await acceptMutation.mutateAsync(acceptOptions);\n },\n [acceptMutation],\n );\n\n // Get suggestions from query or mutation result\n const queryData = suggestionsQuery.data;\n const mutationData = generateMutation.data;\n\n // Use mutation data if available (more recent), otherwise query data\n const currentData = mutationData ?? queryData;\n const suggestions = isLatestFromAssistant\n ? (currentData?.suggestions ?? [])\n : [];\n\n return {\n // Data\n data: currentData,\n suggestions,\n\n // Query state (matches react-query patterns)\n isLoading: suggestionsQuery.isLoading,\n isSuccess: suggestionsQuery.isSuccess,\n isError: suggestionsQuery.isError,\n error: suggestionsQuery.error,\n isFetching: suggestionsQuery.isFetching,\n\n // Generate mutation\n generate,\n isGenerating: generateMutation.isPending,\n generateError: generateMutation.error,\n\n // Accept mutation\n accept,\n isAccepting: acceptMutation.isPending,\n acceptError: acceptMutation.error,\n\n // UI state\n selectedSuggestionId,\n };\n}\n"]}
@@ -147,6 +147,70 @@ describe("useTamboThreadInput", () => {
147
147
  debug: undefined,
148
148
  });
149
149
  });
150
+ it("clears input immediately when submit starts", async () => {
151
+ let resolveSubmit;
152
+ const pendingSubmit = new Promise((resolve) => {
153
+ resolveSubmit = resolve;
154
+ });
155
+ mockMutateAsync.mockImplementation(async () => await pendingSubmit);
156
+ const { result } = (0, react_1.renderHook)(() => (0, tambo_v1_thread_input_provider_1.useTamboThreadInput)(), {
157
+ wrapper: createWrapper(),
158
+ });
159
+ (0, react_1.act)(() => {
160
+ result.current.setValue("message to send");
161
+ });
162
+ let inFlightSubmit;
163
+ await (0, react_1.act)(async () => {
164
+ inFlightSubmit = result.current.submit();
165
+ await Promise.resolve();
166
+ });
167
+ await (0, react_1.waitFor)(() => {
168
+ expect(result.current.value).toBe("");
169
+ });
170
+ (0, react_1.act)(() => {
171
+ resolveSubmit?.({ threadId: "thread_123" });
172
+ });
173
+ if (!inFlightSubmit) {
174
+ throw new Error("Submit promise was not created");
175
+ }
176
+ await (0, react_1.act)(async () => {
177
+ await inFlightSubmit;
178
+ });
179
+ });
180
+ it("preserves input edits made while a previous submit is pending", async () => {
181
+ let resolveSubmit;
182
+ const pendingSubmit = new Promise((resolve) => {
183
+ resolveSubmit = resolve;
184
+ });
185
+ mockMutateAsync.mockImplementation(async () => await pendingSubmit);
186
+ const { result } = (0, react_1.renderHook)(() => (0, tambo_v1_thread_input_provider_1.useTamboThreadInput)(), {
187
+ wrapper: createWrapper(),
188
+ });
189
+ (0, react_1.act)(() => {
190
+ result.current.setValue("first message");
191
+ });
192
+ let inFlightSubmit;
193
+ (0, react_1.act)(() => {
194
+ inFlightSubmit = result.current.submit();
195
+ });
196
+ await (0, react_1.waitFor)(() => {
197
+ expect(result.current.isPending).toBe(true);
198
+ });
199
+ (0, react_1.act)(() => {
200
+ result.current.setValue("second message");
201
+ });
202
+ expect(result.current.value).toBe("second message");
203
+ (0, react_1.act)(() => {
204
+ resolveSubmit?.({ threadId: "thread_123" });
205
+ });
206
+ if (!inFlightSubmit) {
207
+ throw new Error("Submit promise was not created");
208
+ }
209
+ await (0, react_1.act)(async () => {
210
+ await inFlightSubmit;
211
+ });
212
+ expect(result.current.value).toBe("second message");
213
+ });
150
214
  it("throws error when submitting empty message", async () => {
151
215
  const { result } = (0, react_1.renderHook)(() => (0, tambo_v1_thread_input_provider_1.useTamboThreadInput)(), {
152
216
  wrapper: createWrapper(),
@@ -246,6 +310,45 @@ describe("useTamboThreadInput", () => {
246
310
  debug: undefined,
247
311
  });
248
312
  });
313
+ it("preserves images added while a previous submit is pending", async () => {
314
+ let resolveSubmit;
315
+ const pendingSubmit = new Promise((resolve) => {
316
+ resolveSubmit = resolve;
317
+ });
318
+ mockMutateAsync.mockImplementation(async () => await pendingSubmit);
319
+ const { result } = (0, react_1.renderHook)(() => (0, tambo_v1_thread_input_provider_1.useTamboThreadInput)(), {
320
+ wrapper: createWrapper(),
321
+ });
322
+ await (0, react_1.act)(async () => {
323
+ await result.current.addImage(new File(["image-1"], "one.png", { type: "image/png" }));
324
+ });
325
+ (0, react_1.act)(() => {
326
+ result.current.setValue("Test message");
327
+ });
328
+ let inFlightSubmit;
329
+ (0, react_1.act)(() => {
330
+ inFlightSubmit = result.current.submit();
331
+ });
332
+ await (0, react_1.waitFor)(() => {
333
+ expect(result.current.isPending).toBe(true);
334
+ });
335
+ await (0, react_1.act)(async () => {
336
+ await result.current.addImage(new File(["image-2"], "two.png", { type: "image/png" }));
337
+ });
338
+ (0, react_1.act)(() => {
339
+ resolveSubmit?.({ threadId: "thread_123" });
340
+ });
341
+ if (!inFlightSubmit) {
342
+ throw new Error("Submit promise was not created");
343
+ }
344
+ await (0, react_1.act)(async () => {
345
+ await inFlightSubmit;
346
+ });
347
+ await (0, react_1.waitFor)(() => {
348
+ expect(result.current.images.length).toBe(1);
349
+ expect(result.current.images[0]?.name).toBe("two.png");
350
+ });
351
+ });
249
352
  });
250
353
  describe("Thread ID Management", () => {
251
354
  it("initializes with placeholder threadId for optimistic UI", () => {
@@ -317,6 +420,7 @@ describe("useTamboThreadInput", () => {
317
420
  /**
318
421
  * Creates a wrapper that allows dynamically changing the thread ID.
319
422
  * This simulates switching between threads in the UI.
423
+ * @returns An object with the Wrapper component and a setThreadId function.
320
424
  */
321
425
  function createDynamicThreadWrapper(initialThreadId) {
322
426
  let currentThreadId = initialThreadId;
@@ -1 +1 @@
1
- {"version":3,"file":"use-tambo-v1-thread-input.test.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-thread-input.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import { renderHook, act, waitFor } from \"@testing-library/react\";\nimport React from \"react\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport {\n TamboThreadInputProvider,\n useTamboThreadInput,\n} from \"../providers/tambo-v1-thread-input-provider\";\nimport { TamboStreamProvider } from \"../providers/tambo-v1-stream-context\";\nimport { useTamboSendMessage } from \"./use-tambo-v1-send-message\";\nimport type { StreamAction, StreamState } from \"../utils/event-accumulator\";\n\n// Mock useTamboSendMessage\njest.mock(\"./use-tambo-v1-send-message\", () => ({\n useTamboSendMessage: jest.fn(),\n}));\n\n// Mock useTamboQueryClient to avoid TamboClientProvider dependency\njest.mock(\"../../providers/tambo-client-provider\", () => ({\n useTamboQueryClient: jest.fn(() => new QueryClient()),\n useTamboClient: jest.fn(),\n}));\n\njest.mock(\"../providers/tambo-v1-provider\", () => {\n const actual = jest.requireActual(\"../providers/tambo-v1-provider\");\n return {\n ...actual,\n useTamboConfig: () => ({ userKey: undefined }),\n };\n});\n\njest.mock(\"./use-tambo-v1-auth-state\", () => ({\n useTamboAuthState: () => ({\n status: \"identified\",\n source: \"userKey\",\n }),\n}));\n\nconst createSuccessfulFileReader = () => {\n const reader = {\n readAsDataURL: jest.fn(),\n onload: null as ((e: unknown) => void) | null,\n onerror: null as ((e: unknown) => void) | null,\n result: \"data:image/png;base64,mock-data\",\n };\n\n reader.readAsDataURL = jest.fn(() => {\n setTimeout(() => {\n reader.onload?.({});\n }, 0);\n });\n\n return reader;\n};\n\nconst originalFileReader = (global as any).FileReader;\n\ndescribe(\"useTamboThreadInput\", () => {\n const mockMutateAsync = jest.fn();\n let queryClient: QueryClient;\n\n function createWrapper({ streamState }: { streamState?: StreamState } = {}) {\n const noopDispatch: React.Dispatch<StreamAction> = () => {};\n\n return function Wrapper({ children }: { children: React.ReactNode }) {\n const streamProviderProps =\n streamState === undefined\n ? {}\n : { state: streamState, dispatch: noopDispatch };\n\n return (\n <QueryClientProvider client={queryClient}>\n <TamboStreamProvider {...streamProviderProps}>\n <TamboThreadInputProvider>{children}</TamboThreadInputProvider>\n </TamboStreamProvider>\n </QueryClientProvider>\n );\n };\n }\n\n beforeEach(() => {\n jest.clearAllMocks();\n (global as any).FileReader = jest.fn(() => createSuccessfulFileReader());\n\n queryClient = new QueryClient({\n defaultOptions: {\n queries: { retry: false },\n mutations: { retry: false },\n },\n });\n mockMutateAsync.mockResolvedValue({ threadId: \"thread_123\" });\n jest.mocked(useTamboSendMessage).mockReturnValue({\n mutateAsync: mockMutateAsync,\n mutate: jest.fn(),\n isPending: false,\n isError: false,\n error: null,\n isSuccess: false,\n isIdle: true,\n isPaused: false,\n status: \"idle\",\n data: undefined,\n variables: undefined,\n failureCount: 0,\n failureReason: null,\n reset: jest.fn(),\n context: undefined,\n submittedAt: 0,\n } as any);\n });\n\n afterEach(() => {\n (global as any).FileReader = originalFileReader;\n });\n\n describe(\"State Management\", () => {\n it(\"initializes with empty value\", () => {\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper(),\n });\n\n expect(result.current.value).toBe(\"\");\n });\n\n it(\"updates value via setValue\", () => {\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper(),\n });\n\n act(() => {\n result.current.setValue(\"Hello world\");\n });\n\n expect(result.current.value).toBe(\"Hello world\");\n });\n\n it(\"supports functional updates for setValue\", () => {\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper(),\n });\n\n act(() => {\n result.current.setValue(\"Hello\");\n });\n\n act(() => {\n result.current.setValue((prev) => `${prev} world`);\n });\n\n expect(result.current.value).toBe(\"Hello world\");\n });\n });\n\n describe(\"Submit Behavior\", () => {\n it(\"submits message and clears input on success\", async () => {\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper(),\n });\n\n act(() => {\n result.current.setValue(\"Test message\");\n });\n\n await act(async () => {\n const response = await result.current.submit();\n expect(response.threadId).toBe(\"thread_123\");\n });\n\n // Input should be cleared\n await waitFor(() => {\n expect(result.current.value).toBe(\"\");\n });\n\n // Should have called mutateAsync with correct message format\n expect(mockMutateAsync).toHaveBeenCalledWith({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Test message\" }],\n },\n userMessageText: \"Test message\",\n debug: undefined,\n });\n });\n\n it(\"throws error when submitting empty message\", async () => {\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper(),\n });\n\n await expect(result.current.submit()).rejects.toThrow(\n \"Message cannot be empty\",\n );\n\n expect(mockMutateAsync).not.toHaveBeenCalled();\n });\n\n it(\"throws error when submitting whitespace-only message\", async () => {\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper(),\n });\n\n act(() => {\n result.current.setValue(\" \");\n });\n\n await expect(result.current.submit()).rejects.toThrow(\n \"Message cannot be empty\",\n );\n\n expect(mockMutateAsync).not.toHaveBeenCalled();\n });\n\n it(\"passes debug option to mutation\", async () => {\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper(),\n });\n\n act(() => {\n result.current.setValue(\"Debug message\");\n });\n\n await act(async () => {\n await result.current.submit({ debug: true });\n });\n\n expect(mockMutateAsync).toHaveBeenCalledWith({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Debug message\" }],\n },\n userMessageText: \"Debug message\",\n debug: true,\n });\n });\n\n it(\"submits image-only messages as resource content\", async () => {\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper(),\n });\n\n await act(async () => {\n await result.current.addImage(\n new File([\"image\"], \"photo.png\", { type: \"image/png\" }),\n );\n });\n\n await act(async () => {\n await result.current.submit();\n });\n\n expect(mockMutateAsync).toHaveBeenCalledWith({\n message: {\n role: \"user\",\n content: [\n {\n type: \"resource\",\n resource: {\n blob: \"mock-data\",\n mimeType: \"image/png\",\n name: \"photo.png\",\n },\n },\n ],\n },\n userMessageText: \"\",\n debug: undefined,\n });\n\n await waitFor(() => {\n expect(result.current.images).toEqual([]);\n });\n });\n\n it(\"includes both text and image resource content when both are present\", async () => {\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper(),\n });\n\n act(() => {\n result.current.setValue(\"Test message\");\n });\n\n await act(async () => {\n await result.current.addImage(\n new File([\"image\"], \"photo.png\", { type: \"image/png\" }),\n );\n });\n\n await act(async () => {\n await result.current.submit();\n });\n\n expect(mockMutateAsync).toHaveBeenCalledWith({\n message: {\n role: \"user\",\n content: [\n { type: \"text\", text: \"Test message\" },\n {\n type: \"resource\",\n resource: {\n blob: \"mock-data\",\n mimeType: \"image/png\",\n name: \"photo.png\",\n },\n },\n ],\n },\n userMessageText: \"Test message\",\n debug: undefined,\n });\n });\n });\n\n describe(\"Thread ID Management\", () => {\n it(\"initializes with placeholder threadId for optimistic UI\", () => {\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper(),\n });\n\n // Default state has placeholder thread for optimistic UI\n expect(result.current.threadId).toBe(\"placeholder\");\n });\n\n it(\"uses currentThreadId from stream state\", () => {\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper({\n streamState: { threadMap: {}, currentThreadId: \"thread_stream\" },\n }),\n });\n\n expect(result.current.threadId).toBe(\"thread_stream\");\n expect(\n jest.mocked(useTamboSendMessage).mock.calls.map((call) => call[0]),\n ).toContain(\"thread_stream\");\n });\n\n it(\"uses stream state threadId when submitting messages\", async () => {\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper({\n streamState: { threadMap: {}, currentThreadId: \"thread_stream\" },\n }),\n });\n\n act(() => {\n result.current.setValue(\"Test message\");\n });\n\n await act(async () => {\n await result.current.submit();\n });\n\n // Verify sendMessage was called with the stream state's threadId\n expect(mockMutateAsync).toHaveBeenCalledWith(\n expect.objectContaining({\n message: expect.objectContaining({\n content: [{ type: \"text\", text: \"Test message\" }],\n }),\n }),\n );\n });\n });\n\n describe(\"Image State\", () => {\n it(\"initializes with empty images array\", () => {\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper(),\n });\n\n expect(result.current.images).toEqual([]);\n });\n\n it(\"exposes image management functions\", () => {\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper(),\n });\n\n expect(typeof result.current.addImage).toBe(\"function\");\n expect(typeof result.current.addImages).toBe(\"function\");\n expect(typeof result.current.removeImage).toBe(\"function\");\n expect(typeof result.current.clearImages).toBe(\"function\");\n });\n });\n\n describe(\"Error handling\", () => {\n it(\"throws error when used outside provider\", () => {\n // Suppress console.error for this test\n const consoleSpy = jest\n .spyOn(console, \"error\")\n .mockImplementation(() => {});\n\n expect(() => {\n renderHook(() => useTamboThreadInput());\n }).toThrow(\n \"useTamboThreadInput must be used within TamboThreadInputProvider\",\n );\n\n consoleSpy.mockRestore();\n });\n });\n\n describe(\"Thread Isolation\", () => {\n /**\n * Creates a wrapper that allows dynamically changing the thread ID.\n * This simulates switching between threads in the UI.\n */\n function createDynamicThreadWrapper(initialThreadId: string) {\n let currentThreadId = initialThreadId;\n const listeners = new Set<() => void>();\n\n const setThreadId = (newThreadId: string) => {\n currentThreadId = newThreadId;\n listeners.forEach((listener) => listener());\n };\n\n const Wrapper = ({ children }: { children: React.ReactNode }) => {\n const [threadId, setThreadIdState] = React.useState(currentThreadId);\n\n React.useEffect(() => {\n const listener = () => setThreadIdState(currentThreadId);\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n }, []);\n\n const noopDispatch: React.Dispatch<StreamAction> = () => {};\n\n return (\n <QueryClientProvider client={queryClient}>\n <TamboStreamProvider\n state={{ threadMap: {}, currentThreadId: threadId }}\n dispatch={noopDispatch}\n >\n <TamboThreadInputProvider>{children}</TamboThreadInputProvider>\n </TamboStreamProvider>\n </QueryClientProvider>\n );\n };\n\n return { Wrapper, setThreadId };\n }\n\n it(\"isolates pending state per thread when switching threads\", async () => {\n // Create a deferred promise so we can control when the mutation resolves\n let resolveThreadA: (value: { threadId: string }) => void;\n const threadAPromise = new Promise<{ threadId: string }>((resolve) => {\n resolveThreadA = resolve;\n });\n\n mockMutateAsync.mockImplementation(async () => await threadAPromise);\n\n const { Wrapper, setThreadId } = createDynamicThreadWrapper(\"thread_A\");\n const { result, rerender } = renderHook(() => useTamboThreadInput(), {\n wrapper: Wrapper,\n });\n\n // Verify we're on thread A\n expect(result.current.threadId).toBe(\"thread_A\");\n\n // Set input and start submission on thread A\n act(() => {\n result.current.setValue(\"Message for thread A\");\n });\n\n // Start the submission (don't await - we want it pending)\n let submitPromise: Promise<{ threadId: string | undefined }>;\n act(() => {\n submitPromise = result.current.submit();\n });\n\n // Thread A should now be pending\n await waitFor(() => {\n expect(result.current.isPending).toBe(true);\n });\n\n // Switch to thread B while thread A is still pending\n act(() => {\n setThreadId(\"thread_B\");\n });\n rerender();\n\n // Wait for the thread switch to take effect\n await waitFor(() => {\n expect(result.current.threadId).toBe(\"thread_B\");\n });\n\n // Thread B should NOT be pending - its mutation state is independent\n // (The mutationKey includes threadId, so each thread has its own state)\n expect(result.current.isPending).toBe(false);\n\n // Now resolve thread A's submission\n act(() => {\n resolveThreadA!({ threadId: \"thread_A\" });\n });\n\n // Wait for promise to complete\n await act(async () => {\n await submitPromise!;\n });\n\n // Thread B should still not be pending\n expect(result.current.isPending).toBe(false);\n });\n\n it(\"multiple threads that never submitted should not be pending when another thread is\", async () => {\n // Create a promise that never resolves to keep thread A pending\n const neverResolvingPromise = new Promise<{ threadId: string }>(() => {});\n\n mockMutateAsync.mockImplementation(\n async () => await neverResolvingPromise,\n );\n\n const { Wrapper, setThreadId } = createDynamicThreadWrapper(\"thread_A\");\n const { result, rerender } = renderHook(() => useTamboThreadInput(), {\n wrapper: Wrapper,\n });\n\n // Start submission on thread A\n act(() => {\n result.current.setValue(\"Message A\");\n });\n\n act(() => {\n void result.current.submit();\n });\n\n await waitFor(() => {\n expect(result.current.isPending).toBe(true);\n });\n\n // Switch to thread B (which has never submitted anything)\n act(() => {\n setThreadId(\"thread_B\");\n });\n rerender();\n\n await waitFor(() => {\n expect(result.current.threadId).toBe(\"thread_B\");\n });\n\n // Thread B should not be pending - it has never submitted\n expect(result.current.isPending).toBe(false);\n\n // Switch to thread C (also never submitted)\n act(() => {\n setThreadId(\"thread_C\");\n });\n rerender();\n\n await waitFor(() => {\n expect(result.current.threadId).toBe(\"thread_C\");\n });\n\n // Thread C should also not be pending\n expect(result.current.isPending).toBe(false);\n\n // Switch to thread D (also never submitted)\n act(() => {\n setThreadId(\"thread_D\");\n });\n rerender();\n\n await waitFor(() => {\n expect(result.current.threadId).toBe(\"thread_D\");\n });\n\n // Thread D should also not be pending\n // This confirms the fix works - without mutationKey, ALL threads would be pending\n expect(result.current.isPending).toBe(false);\n });\n });\n});\n"]}
1
+ {"version":3,"file":"use-tambo-v1-thread-input.test.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-thread-input.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import { renderHook, act, waitFor } from \"@testing-library/react\";\nimport React from \"react\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport {\n TamboThreadInputProvider,\n useTamboThreadInput,\n} from \"../providers/tambo-v1-thread-input-provider\";\nimport { TamboStreamProvider } from \"../providers/tambo-v1-stream-context\";\nimport { useTamboSendMessage } from \"./use-tambo-v1-send-message\";\nimport type { StreamAction, StreamState } from \"@tambo-ai/client\";\n\n// Mock useTamboSendMessage\njest.mock(\"./use-tambo-v1-send-message\", () => ({\n useTamboSendMessage: jest.fn(),\n}));\n\n// Mock useTamboQueryClient to avoid TamboClientProvider dependency\njest.mock(\"../../providers/tambo-client-provider\", () => ({\n useTamboQueryClient: jest.fn(() => new QueryClient()),\n useTamboClient: jest.fn(),\n}));\n\njest.mock(\"../providers/tambo-v1-provider\", () => {\n const actual = jest.requireActual(\"../providers/tambo-v1-provider\");\n return {\n ...actual,\n useTamboConfig: () => ({ userKey: undefined }),\n };\n});\n\njest.mock(\"./use-tambo-v1-auth-state\", () => ({\n useTamboAuthState: () => ({\n status: \"identified\",\n source: \"userKey\",\n }),\n}));\n\nconst createSuccessfulFileReader = () => {\n const reader = {\n readAsDataURL: jest.fn(),\n onload: null as ((e: unknown) => void) | null,\n onerror: null as ((e: unknown) => void) | null,\n result: \"data:image/png;base64,mock-data\",\n };\n\n reader.readAsDataURL = jest.fn(() => {\n setTimeout(() => {\n reader.onload?.({});\n }, 0);\n });\n\n return reader;\n};\n\nconst originalFileReader = (global as any).FileReader;\n\ndescribe(\"useTamboThreadInput\", () => {\n const mockMutateAsync = jest.fn();\n let queryClient: QueryClient;\n\n function createWrapper({ streamState }: { streamState?: StreamState } = {}) {\n const noopDispatch: React.Dispatch<StreamAction> = () => {};\n\n return function Wrapper({ children }: { children: React.ReactNode }) {\n const streamProviderProps =\n streamState === undefined\n ? {}\n : { state: streamState, dispatch: noopDispatch };\n\n return (\n <QueryClientProvider client={queryClient}>\n <TamboStreamProvider {...streamProviderProps}>\n <TamboThreadInputProvider>{children}</TamboThreadInputProvider>\n </TamboStreamProvider>\n </QueryClientProvider>\n );\n };\n }\n\n beforeEach(() => {\n jest.clearAllMocks();\n (global as any).FileReader = jest.fn(() => createSuccessfulFileReader());\n\n queryClient = new QueryClient({\n defaultOptions: {\n queries: { retry: false },\n mutations: { retry: false },\n },\n });\n mockMutateAsync.mockResolvedValue({ threadId: \"thread_123\" });\n jest.mocked(useTamboSendMessage).mockReturnValue({\n mutateAsync: mockMutateAsync,\n mutate: jest.fn(),\n isPending: false,\n isError: false,\n error: null,\n isSuccess: false,\n isIdle: true,\n isPaused: false,\n status: \"idle\",\n data: undefined,\n variables: undefined,\n failureCount: 0,\n failureReason: null,\n reset: jest.fn(),\n context: undefined,\n submittedAt: 0,\n } as any);\n });\n\n afterEach(() => {\n (global as any).FileReader = originalFileReader;\n });\n\n describe(\"State Management\", () => {\n it(\"initializes with empty value\", () => {\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper(),\n });\n\n expect(result.current.value).toBe(\"\");\n });\n\n it(\"updates value via setValue\", () => {\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper(),\n });\n\n act(() => {\n result.current.setValue(\"Hello world\");\n });\n\n expect(result.current.value).toBe(\"Hello world\");\n });\n\n it(\"supports functional updates for setValue\", () => {\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper(),\n });\n\n act(() => {\n result.current.setValue(\"Hello\");\n });\n\n act(() => {\n result.current.setValue((prev) => `${prev} world`);\n });\n\n expect(result.current.value).toBe(\"Hello world\");\n });\n });\n\n describe(\"Submit Behavior\", () => {\n it(\"submits message and clears input on success\", async () => {\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper(),\n });\n\n act(() => {\n result.current.setValue(\"Test message\");\n });\n\n await act(async () => {\n const response = await result.current.submit();\n expect(response.threadId).toBe(\"thread_123\");\n });\n\n // Input should be cleared\n await waitFor(() => {\n expect(result.current.value).toBe(\"\");\n });\n\n // Should have called mutateAsync with correct message format\n expect(mockMutateAsync).toHaveBeenCalledWith({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Test message\" }],\n },\n userMessageText: \"Test message\",\n debug: undefined,\n });\n });\n\n it(\"clears input immediately when submit starts\", async () => {\n let resolveSubmit:\n | ((value: { threadId: string | undefined }) => void)\n | undefined;\n const pendingSubmit = new Promise<{ threadId: string | undefined }>(\n (resolve) => {\n resolveSubmit = resolve;\n },\n );\n mockMutateAsync.mockImplementation(async () => await pendingSubmit);\n\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper(),\n });\n\n act(() => {\n result.current.setValue(\"message to send\");\n });\n\n let inFlightSubmit: Promise<{ threadId: string | undefined }> | undefined;\n await act(async () => {\n inFlightSubmit = result.current.submit();\n await Promise.resolve();\n });\n\n await waitFor(() => {\n expect(result.current.value).toBe(\"\");\n });\n\n act(() => {\n resolveSubmit?.({ threadId: \"thread_123\" });\n });\n\n if (!inFlightSubmit) {\n throw new Error(\"Submit promise was not created\");\n }\n await act(async () => {\n await inFlightSubmit;\n });\n });\n\n it(\"preserves input edits made while a previous submit is pending\", async () => {\n let resolveSubmit:\n | ((value: { threadId: string | undefined }) => void)\n | undefined;\n const pendingSubmit = new Promise<{ threadId: string | undefined }>(\n (resolve) => {\n resolveSubmit = resolve;\n },\n );\n mockMutateAsync.mockImplementation(async () => await pendingSubmit);\n\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper(),\n });\n\n act(() => {\n result.current.setValue(\"first message\");\n });\n\n let inFlightSubmit: Promise<{ threadId: string | undefined }> | undefined;\n act(() => {\n inFlightSubmit = result.current.submit();\n });\n\n await waitFor(() => {\n expect(result.current.isPending).toBe(true);\n });\n\n act(() => {\n result.current.setValue(\"second message\");\n });\n expect(result.current.value).toBe(\"second message\");\n\n act(() => {\n resolveSubmit?.({ threadId: \"thread_123\" });\n });\n\n if (!inFlightSubmit) {\n throw new Error(\"Submit promise was not created\");\n }\n await act(async () => {\n await inFlightSubmit;\n });\n\n expect(result.current.value).toBe(\"second message\");\n });\n\n it(\"throws error when submitting empty message\", async () => {\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper(),\n });\n\n await expect(result.current.submit()).rejects.toThrow(\n \"Message cannot be empty\",\n );\n\n expect(mockMutateAsync).not.toHaveBeenCalled();\n });\n\n it(\"throws error when submitting whitespace-only message\", async () => {\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper(),\n });\n\n act(() => {\n result.current.setValue(\" \");\n });\n\n await expect(result.current.submit()).rejects.toThrow(\n \"Message cannot be empty\",\n );\n\n expect(mockMutateAsync).not.toHaveBeenCalled();\n });\n\n it(\"passes debug option to mutation\", async () => {\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper(),\n });\n\n act(() => {\n result.current.setValue(\"Debug message\");\n });\n\n await act(async () => {\n await result.current.submit({ debug: true });\n });\n\n expect(mockMutateAsync).toHaveBeenCalledWith({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Debug message\" }],\n },\n userMessageText: \"Debug message\",\n debug: true,\n });\n });\n\n it(\"submits image-only messages as resource content\", async () => {\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper(),\n });\n\n await act(async () => {\n await result.current.addImage(\n new File([\"image\"], \"photo.png\", { type: \"image/png\" }),\n );\n });\n\n await act(async () => {\n await result.current.submit();\n });\n\n expect(mockMutateAsync).toHaveBeenCalledWith({\n message: {\n role: \"user\",\n content: [\n {\n type: \"resource\",\n resource: {\n blob: \"mock-data\",\n mimeType: \"image/png\",\n name: \"photo.png\",\n },\n },\n ],\n },\n userMessageText: \"\",\n debug: undefined,\n });\n\n await waitFor(() => {\n expect(result.current.images).toEqual([]);\n });\n });\n\n it(\"includes both text and image resource content when both are present\", async () => {\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper(),\n });\n\n act(() => {\n result.current.setValue(\"Test message\");\n });\n\n await act(async () => {\n await result.current.addImage(\n new File([\"image\"], \"photo.png\", { type: \"image/png\" }),\n );\n });\n\n await act(async () => {\n await result.current.submit();\n });\n\n expect(mockMutateAsync).toHaveBeenCalledWith({\n message: {\n role: \"user\",\n content: [\n { type: \"text\", text: \"Test message\" },\n {\n type: \"resource\",\n resource: {\n blob: \"mock-data\",\n mimeType: \"image/png\",\n name: \"photo.png\",\n },\n },\n ],\n },\n userMessageText: \"Test message\",\n debug: undefined,\n });\n });\n\n it(\"preserves images added while a previous submit is pending\", async () => {\n let resolveSubmit:\n | ((value: { threadId: string | undefined }) => void)\n | undefined;\n const pendingSubmit = new Promise<{ threadId: string | undefined }>(\n (resolve) => {\n resolveSubmit = resolve;\n },\n );\n mockMutateAsync.mockImplementation(async () => await pendingSubmit);\n\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper(),\n });\n\n await act(async () => {\n await result.current.addImage(\n new File([\"image-1\"], \"one.png\", { type: \"image/png\" }),\n );\n });\n\n act(() => {\n result.current.setValue(\"Test message\");\n });\n\n let inFlightSubmit: Promise<{ threadId: string | undefined }> | undefined;\n act(() => {\n inFlightSubmit = result.current.submit();\n });\n\n await waitFor(() => {\n expect(result.current.isPending).toBe(true);\n });\n\n await act(async () => {\n await result.current.addImage(\n new File([\"image-2\"], \"two.png\", { type: \"image/png\" }),\n );\n });\n\n act(() => {\n resolveSubmit?.({ threadId: \"thread_123\" });\n });\n\n if (!inFlightSubmit) {\n throw new Error(\"Submit promise was not created\");\n }\n await act(async () => {\n await inFlightSubmit;\n });\n\n await waitFor(() => {\n expect(result.current.images.length).toBe(1);\n expect(result.current.images[0]?.name).toBe(\"two.png\");\n });\n });\n });\n\n describe(\"Thread ID Management\", () => {\n it(\"initializes with placeholder threadId for optimistic UI\", () => {\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper(),\n });\n\n // Default state has placeholder thread for optimistic UI\n expect(result.current.threadId).toBe(\"placeholder\");\n });\n\n it(\"uses currentThreadId from stream state\", () => {\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper({\n streamState: { threadMap: {}, currentThreadId: \"thread_stream\" },\n }),\n });\n\n expect(result.current.threadId).toBe(\"thread_stream\");\n expect(\n jest.mocked(useTamboSendMessage).mock.calls.map((call) => call[0]),\n ).toContain(\"thread_stream\");\n });\n\n it(\"uses stream state threadId when submitting messages\", async () => {\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper({\n streamState: { threadMap: {}, currentThreadId: \"thread_stream\" },\n }),\n });\n\n act(() => {\n result.current.setValue(\"Test message\");\n });\n\n await act(async () => {\n await result.current.submit();\n });\n\n // Verify sendMessage was called with the stream state's threadId\n expect(mockMutateAsync).toHaveBeenCalledWith(\n expect.objectContaining({\n message: expect.objectContaining({\n content: [{ type: \"text\", text: \"Test message\" }],\n }),\n }),\n );\n });\n });\n\n describe(\"Image State\", () => {\n it(\"initializes with empty images array\", () => {\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper(),\n });\n\n expect(result.current.images).toEqual([]);\n });\n\n it(\"exposes image management functions\", () => {\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper(),\n });\n\n expect(typeof result.current.addImage).toBe(\"function\");\n expect(typeof result.current.addImages).toBe(\"function\");\n expect(typeof result.current.removeImage).toBe(\"function\");\n expect(typeof result.current.clearImages).toBe(\"function\");\n });\n });\n\n describe(\"Error handling\", () => {\n it(\"throws error when used outside provider\", () => {\n // Suppress console.error for this test\n const consoleSpy = jest\n .spyOn(console, \"error\")\n .mockImplementation(() => {});\n\n expect(() => {\n renderHook(() => useTamboThreadInput());\n }).toThrow(\n \"useTamboThreadInput must be used within TamboThreadInputProvider\",\n );\n\n consoleSpy.mockRestore();\n });\n });\n\n describe(\"Thread Isolation\", () => {\n /**\n * Creates a wrapper that allows dynamically changing the thread ID.\n * This simulates switching between threads in the UI.\n * @returns An object with the Wrapper component and a setThreadId function.\n */\n function createDynamicThreadWrapper(initialThreadId: string) {\n let currentThreadId = initialThreadId;\n const listeners = new Set<() => void>();\n\n const setThreadId = (newThreadId: string) => {\n currentThreadId = newThreadId;\n listeners.forEach((listener) => listener());\n };\n\n const Wrapper = ({ children }: { children: React.ReactNode }) => {\n const [threadId, setThreadIdState] = React.useState(currentThreadId);\n\n React.useEffect(() => {\n const listener = () => setThreadIdState(currentThreadId);\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n }, []);\n\n const noopDispatch: React.Dispatch<StreamAction> = () => {};\n\n return (\n <QueryClientProvider client={queryClient}>\n <TamboStreamProvider\n state={{ threadMap: {}, currentThreadId: threadId }}\n dispatch={noopDispatch}\n >\n <TamboThreadInputProvider>{children}</TamboThreadInputProvider>\n </TamboStreamProvider>\n </QueryClientProvider>\n );\n };\n\n return { Wrapper, setThreadId };\n }\n\n it(\"isolates pending state per thread when switching threads\", async () => {\n // Create a deferred promise so we can control when the mutation resolves\n let resolveThreadA: (value: { threadId: string }) => void;\n const threadAPromise = new Promise<{ threadId: string }>((resolve) => {\n resolveThreadA = resolve;\n });\n\n mockMutateAsync.mockImplementation(async () => await threadAPromise);\n\n const { Wrapper, setThreadId } = createDynamicThreadWrapper(\"thread_A\");\n const { result, rerender } = renderHook(() => useTamboThreadInput(), {\n wrapper: Wrapper,\n });\n\n // Verify we're on thread A\n expect(result.current.threadId).toBe(\"thread_A\");\n\n // Set input and start submission on thread A\n act(() => {\n result.current.setValue(\"Message for thread A\");\n });\n\n // Start the submission (don't await - we want it pending)\n let submitPromise: Promise<{ threadId: string | undefined }>;\n act(() => {\n submitPromise = result.current.submit();\n });\n\n // Thread A should now be pending\n await waitFor(() => {\n expect(result.current.isPending).toBe(true);\n });\n\n // Switch to thread B while thread A is still pending\n act(() => {\n setThreadId(\"thread_B\");\n });\n rerender();\n\n // Wait for the thread switch to take effect\n await waitFor(() => {\n expect(result.current.threadId).toBe(\"thread_B\");\n });\n\n // Thread B should NOT be pending - its mutation state is independent\n // (The mutationKey includes threadId, so each thread has its own state)\n expect(result.current.isPending).toBe(false);\n\n // Now resolve thread A's submission\n act(() => {\n resolveThreadA!({ threadId: \"thread_A\" });\n });\n\n // Wait for promise to complete\n await act(async () => {\n await submitPromise!;\n });\n\n // Thread B should still not be pending\n expect(result.current.isPending).toBe(false);\n });\n\n it(\"multiple threads that never submitted should not be pending when another thread is\", async () => {\n // Create a promise that never resolves to keep thread A pending\n const neverResolvingPromise = new Promise<{ threadId: string }>(() => {});\n\n mockMutateAsync.mockImplementation(\n async () => await neverResolvingPromise,\n );\n\n const { Wrapper, setThreadId } = createDynamicThreadWrapper(\"thread_A\");\n const { result, rerender } = renderHook(() => useTamboThreadInput(), {\n wrapper: Wrapper,\n });\n\n // Start submission on thread A\n act(() => {\n result.current.setValue(\"Message A\");\n });\n\n act(() => {\n void result.current.submit();\n });\n\n await waitFor(() => {\n expect(result.current.isPending).toBe(true);\n });\n\n // Switch to thread B (which has never submitted anything)\n act(() => {\n setThreadId(\"thread_B\");\n });\n rerender();\n\n await waitFor(() => {\n expect(result.current.threadId).toBe(\"thread_B\");\n });\n\n // Thread B should not be pending - it has never submitted\n expect(result.current.isPending).toBe(false);\n\n // Switch to thread C (also never submitted)\n act(() => {\n setThreadId(\"thread_C\");\n });\n rerender();\n\n await waitFor(() => {\n expect(result.current.threadId).toBe(\"thread_C\");\n });\n\n // Thread C should also not be pending\n expect(result.current.isPending).toBe(false);\n\n // Switch to thread D (also never submitted)\n act(() => {\n setThreadId(\"thread_D\");\n });\n rerender();\n\n await waitFor(() => {\n expect(result.current.threadId).toBe(\"thread_D\");\n });\n\n // Thread D should also not be pending\n // This confirms the fix works - without mutationKey, ALL threads would be pending\n expect(result.current.isPending).toBe(false);\n });\n });\n});\n"]}
@@ -1,10 +1,10 @@
1
1
  import type TamboAI from "@tambo-ai/typescript-sdk";
2
- import type { TamboAuthState } from "../types/auth";
2
+ import type { TamboAuthState } from "@tambo-ai/client";
3
3
  import { type TamboRegistryContext as TamboRegistryContextType } from "../../providers/tambo-registry-provider";
4
4
  import { useStreamDispatch, type ThreadManagement } from "../providers/tambo-v1-stream-context";
5
- import type { TamboThreadMessage } from "../types/message";
6
- import type { StreamingState } from "../types/thread";
7
- import { type ThreadState } from "../utils/event-accumulator";
5
+ import type { ReactTamboThreadMessage } from "../types/message";
6
+ import type { StreamingState } from "@tambo-ai/client";
7
+ import { type ThreadState } from "@tambo-ai/client";
8
8
  /**
9
9
  * Return type for useTambo hook
10
10
  */
@@ -18,9 +18,10 @@ export interface UseTamboReturn {
18
18
  */
19
19
  thread: ThreadState | undefined;
20
20
  /**
21
- * Messages in the current thread
21
+ * Messages in the current thread.
22
+ * Component content blocks include `renderedComponent` for direct rendering.
22
23
  */
23
- messages: TamboThreadMessage[];
24
+ messages: ReactTamboThreadMessage[];
24
25
  /**
25
26
  * Current streaming state
26
27
  */
@@ -1 +1 @@
1
- {"version":3,"file":"use-tambo-v1.d.ts","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAC;AAcpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAEL,KAAK,oBAAoB,IAAI,wBAAwB,EACtD,MAAM,yCAAyC,CAAC;AAEjD,OAAO,EACL,iBAAiB,EAGjB,KAAK,gBAAgB,EACtB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAGV,kBAAkB,EAEnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAEL,KAAK,WAAW,EACjB,MAAM,4BAA4B,CAAC;AAEpC;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,MAAM,EAAE,OAAO,CAAC;IAEhB;;OAEG;IACH,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC;IAEhC;;OAEG;IACH,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAE/B;;OAEG;IACH,cAAc,EAAE,cAAc,CAAC;IAE/B;;OAEG;IACH,WAAW,EAAE,OAAO,CAAC;IAErB;;OAEG;IACH,SAAS,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,MAAM,EAAE,OAAO,CAAC;IAEhB;;OAEG;IACH,iBAAiB,EAAE,wBAAwB,CAAC,mBAAmB,CAAC,CAAC;IAEjE;;OAEG;IACH,YAAY,EAAE,wBAAwB,CAAC,cAAc,CAAC,CAAC;IAEvD;;OAEG;IACH,aAAa,EAAE,wBAAwB,CAAC,eAAe,CAAC,CAAC;IAEzD;;OAEG;IACH,aAAa,EAAE,wBAAwB,CAAC,eAAe,CAAC,CAAC;IAEzD;;OAEG;IACH,YAAY,EAAE,wBAAwB,CAAC,cAAc,CAAC,CAAC;IAEvD;;OAEG;IACH,eAAe,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,UAAU,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAE3C;;OAEG;IACH,YAAY,EAAE,gBAAgB,CAAC,cAAc,CAAC,CAAC;IAE/C;;OAEG;IACH,cAAc,EAAE,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;IAEnD;;OAEG;IACH,QAAQ,EAAE,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;IAE/C;;;;OAIG;IACH,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAE/B;;;OAGG;IACH,SAAS,EAAE,cAAc,CAAC;IAE1B;;;OAGG;IACH,YAAY,EAAE,OAAO,CAAC;IAEtB;;;;;;;OAOG;IACH,gBAAgB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACrE;AAwCD;;;GAGG;AACH,wBAAgB,QAAQ,IAAI,cAAc,CAqOzC"}
1
+ {"version":3,"file":"use-tambo-v1.d.ts","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAC;AAcpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAEL,KAAK,oBAAoB,IAAI,wBAAwB,EACtD,MAAM,yCAAyC,CAAC;AAEjD,OAAO,EACL,iBAAiB,EAGjB,KAAK,gBAAgB,EACtB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAEV,uBAAuB,EAGxB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAyB,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE3E;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,MAAM,EAAE,OAAO,CAAC;IAEhB;;OAEG;IACH,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC;IAEhC;;;OAGG;IACH,QAAQ,EAAE,uBAAuB,EAAE,CAAC;IAEpC;;OAEG;IACH,cAAc,EAAE,cAAc,CAAC;IAE/B;;OAEG;IACH,WAAW,EAAE,OAAO,CAAC;IAErB;;OAEG;IACH,SAAS,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,MAAM,EAAE,OAAO,CAAC;IAEhB;;OAEG;IACH,iBAAiB,EAAE,wBAAwB,CAAC,mBAAmB,CAAC,CAAC;IAEjE;;OAEG;IACH,YAAY,EAAE,wBAAwB,CAAC,cAAc,CAAC,CAAC;IAEvD;;OAEG;IACH,aAAa,EAAE,wBAAwB,CAAC,eAAe,CAAC,CAAC;IAEzD;;OAEG;IACH,aAAa,EAAE,wBAAwB,CAAC,eAAe,CAAC,CAAC;IAEzD;;OAEG;IACH,YAAY,EAAE,wBAAwB,CAAC,cAAc,CAAC,CAAC;IAEvD;;OAEG;IACH,eAAe,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,UAAU,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAE3C;;OAEG;IACH,YAAY,EAAE,gBAAgB,CAAC,cAAc,CAAC,CAAC;IAE/C;;OAEG;IACH,cAAc,EAAE,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;IAEnD;;OAEG;IACH,QAAQ,EAAE,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;IAE/C;;;;OAIG;IACH,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAE/B;;;OAGG;IACH,SAAS,EAAE,cAAc,CAAC;IAE1B;;;OAGG;IACH,YAAY,EAAE,OAAO,CAAC;IAEtB;;;;;;;OAOG;IACH,gBAAgB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACrE;AAwCD;;;GAGG;AACH,wBAAgB,QAAQ,IAAI,cAAc,CAqOzC"}