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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (693) hide show
  1. package/README.md +46 -449
  2. package/dist/hoc/with-tambo-interactable.d.ts +8 -0
  3. package/dist/hoc/with-tambo-interactable.d.ts.map +1 -1
  4. package/dist/hoc/with-tambo-interactable.js +16 -13
  5. package/dist/hoc/with-tambo-interactable.js.map +1 -1
  6. package/dist/hoc/with-tambo-interactable.test.js +15 -3
  7. package/dist/hoc/with-tambo-interactable.test.js.map +1 -1
  8. package/dist/hooks/use-tambo-voice.test.js +3 -0
  9. package/dist/hooks/use-tambo-voice.test.js.map +1 -1
  10. package/dist/index.d.ts +7 -25
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +7 -59
  13. package/dist/index.js.map +1 -1
  14. package/dist/mcp/mcp-hooks.js +5 -5
  15. package/dist/mcp/mcp-hooks.js.map +1 -1
  16. package/dist/mcp/mcp-hooks.test.js +69 -0
  17. package/dist/mcp/mcp-hooks.test.js.map +1 -1
  18. package/dist/mcp/tambo-mcp-provider.test.js +24 -0
  19. package/dist/mcp/tambo-mcp-provider.test.js.map +1 -1
  20. package/dist/mcp/use-mcp-servers.test.js +9 -0
  21. package/dist/mcp/use-mcp-servers.test.js.map +1 -1
  22. package/dist/model/component-metadata.d.ts +4 -4
  23. package/dist/model/component-metadata.js.map +1 -1
  24. package/dist/providers/tambo-client-provider.d.ts +12 -0
  25. package/dist/providers/tambo-client-provider.d.ts.map +1 -1
  26. package/dist/providers/tambo-client-provider.js +8 -3
  27. package/dist/providers/tambo-client-provider.js.map +1 -1
  28. package/dist/providers/tambo-interactable-provider.d.ts +1 -1
  29. package/dist/providers/tambo-interactable-provider.d.ts.map +1 -1
  30. package/dist/providers/tambo-interactable-provider.js +8 -0
  31. package/dist/providers/tambo-interactable-provider.js.map +1 -1
  32. package/dist/providers/tambo-interactable-provider.test.js +47 -0
  33. package/dist/providers/tambo-interactable-provider.test.js.map +1 -1
  34. package/dist/providers/tambo-interactables-additional-context-edge-cases.test.js +2 -10
  35. package/dist/providers/tambo-interactables-additional-context-edge-cases.test.js.map +1 -1
  36. package/dist/providers/tambo-interactables-additional-context.test.js +3 -19
  37. package/dist/providers/tambo-interactables-additional-context.test.js.map +1 -1
  38. package/dist/providers/tambo-mcp-token-provider.d.ts +8 -17
  39. package/dist/providers/tambo-mcp-token-provider.d.ts.map +1 -1
  40. package/dist/providers/tambo-mcp-token-provider.js +20 -97
  41. package/dist/providers/tambo-mcp-token-provider.js.map +1 -1
  42. package/dist/testing/tools.d.ts +3 -3
  43. package/dist/testing/tools.d.ts.map +1 -1
  44. package/dist/testing/tools.js.map +1 -1
  45. package/dist/util/registry-validators.js +1 -1
  46. package/dist/util/registry-validators.js.map +1 -1
  47. package/dist/util/resource-content-resolver.test.js +1 -1
  48. package/dist/util/resource-content-resolver.test.js.map +1 -1
  49. package/dist/v1/__tests__/v1-interactables.test.js +1 -1
  50. package/dist/v1/__tests__/v1-interactables.test.js.map +1 -1
  51. package/dist/v1/components/v1-component-renderer.d.ts +9 -9
  52. package/dist/v1/components/v1-component-renderer.d.ts.map +1 -1
  53. package/dist/v1/components/v1-component-renderer.js +13 -13
  54. package/dist/v1/components/v1-component-renderer.js.map +1 -1
  55. package/dist/v1/components/v1-component-renderer.test.js +15 -15
  56. package/dist/v1/components/v1-component-renderer.test.js.map +1 -1
  57. package/{esm/hooks/use-current-message.d.ts → dist/v1/hooks/use-tambo-current-message.d.ts} +30 -9
  58. package/dist/v1/hooks/use-tambo-current-message.d.ts.map +1 -0
  59. package/dist/{hooks/use-current-message.js → v1/hooks/use-tambo-current-message.js} +13 -8
  60. package/dist/v1/hooks/use-tambo-current-message.js.map +1 -0
  61. package/dist/v1/hooks/use-tambo-v1-auth-state.d.ts +11 -0
  62. package/dist/v1/hooks/use-tambo-v1-auth-state.d.ts.map +1 -0
  63. package/dist/v1/hooks/use-tambo-v1-auth-state.js +48 -0
  64. package/dist/v1/hooks/use-tambo-v1-auth-state.js.map +1 -0
  65. package/dist/v1/hooks/use-tambo-v1-auth-state.test.d.ts +2 -0
  66. package/dist/v1/hooks/use-tambo-v1-auth-state.test.d.ts.map +1 -0
  67. package/dist/v1/hooks/use-tambo-v1-auth-state.test.js +105 -0
  68. package/dist/v1/hooks/use-tambo-v1-auth-state.test.js.map +1 -0
  69. package/dist/v1/hooks/use-tambo-v1-component-state.d.ts +7 -6
  70. package/dist/v1/hooks/use-tambo-v1-component-state.d.ts.map +1 -1
  71. package/dist/v1/hooks/use-tambo-v1-component-state.js +101 -28
  72. package/dist/v1/hooks/use-tambo-v1-component-state.js.map +1 -1
  73. package/dist/v1/hooks/use-tambo-v1-component-state.test.js +150 -25
  74. package/dist/v1/hooks/use-tambo-v1-component-state.test.js.map +1 -1
  75. package/dist/v1/hooks/use-tambo-v1-messages.d.ts +9 -9
  76. package/dist/v1/hooks/use-tambo-v1-messages.d.ts.map +1 -1
  77. package/dist/v1/hooks/use-tambo-v1-messages.js +4 -4
  78. package/dist/v1/hooks/use-tambo-v1-messages.js.map +1 -1
  79. package/dist/v1/hooks/use-tambo-v1-messages.test.js +14 -6
  80. package/dist/v1/hooks/use-tambo-v1-messages.test.js.map +1 -1
  81. package/dist/v1/hooks/use-tambo-v1-send-message.d.ts +21 -3
  82. package/dist/v1/hooks/use-tambo-v1-send-message.d.ts.map +1 -1
  83. package/dist/v1/hooks/use-tambo-v1-send-message.js +92 -17
  84. package/dist/v1/hooks/use-tambo-v1-send-message.js.map +1 -1
  85. package/dist/v1/hooks/use-tambo-v1-send-message.test.js +315 -42
  86. package/dist/v1/hooks/use-tambo-v1-send-message.test.js.map +1 -1
  87. package/dist/v1/hooks/use-tambo-v1-stream-status.d.ts +7 -7
  88. package/dist/v1/hooks/use-tambo-v1-stream-status.d.ts.map +1 -1
  89. package/dist/v1/hooks/use-tambo-v1-stream-status.js +14 -16
  90. package/dist/v1/hooks/use-tambo-v1-stream-status.js.map +1 -1
  91. package/dist/v1/hooks/use-tambo-v1-stream-status.test.js +30 -30
  92. package/dist/v1/hooks/use-tambo-v1-stream-status.test.js.map +1 -1
  93. package/dist/v1/hooks/use-tambo-v1-suggestions.d.ts +7 -7
  94. package/dist/v1/hooks/use-tambo-v1-suggestions.d.ts.map +1 -1
  95. package/dist/v1/hooks/use-tambo-v1-suggestions.js +9 -9
  96. package/dist/v1/hooks/use-tambo-v1-suggestions.js.map +1 -1
  97. package/dist/v1/hooks/use-tambo-v1-suggestions.test.js +44 -44
  98. package/dist/v1/hooks/use-tambo-v1-suggestions.test.js.map +1 -1
  99. package/dist/v1/hooks/use-tambo-v1-thread-input.d.ts +3 -3
  100. package/dist/v1/hooks/use-tambo-v1-thread-input.d.ts.map +1 -1
  101. package/dist/v1/hooks/use-tambo-v1-thread-input.js +4 -4
  102. package/dist/v1/hooks/use-tambo-v1-thread-input.js.map +1 -1
  103. package/dist/v1/hooks/use-tambo-v1-thread-input.test.js +40 -27
  104. package/dist/v1/hooks/use-tambo-v1-thread-input.test.js.map +1 -1
  105. package/dist/v1/hooks/use-tambo-v1-thread-list.d.ts +4 -4
  106. package/dist/v1/hooks/use-tambo-v1-thread-list.d.ts.map +1 -1
  107. package/dist/v1/hooks/use-tambo-v1-thread-list.js +8 -4
  108. package/dist/v1/hooks/use-tambo-v1-thread-list.js.map +1 -1
  109. package/dist/v1/hooks/use-tambo-v1-thread-list.test.js +18 -16
  110. package/dist/v1/hooks/use-tambo-v1-thread-list.test.js.map +1 -1
  111. package/dist/v1/hooks/use-tambo-v1-thread.d.ts +3 -3
  112. package/dist/v1/hooks/use-tambo-v1-thread.d.ts.map +1 -1
  113. package/dist/v1/hooks/use-tambo-v1-thread.js +7 -3
  114. package/dist/v1/hooks/use-tambo-v1-thread.js.map +1 -1
  115. package/dist/v1/hooks/use-tambo-v1-thread.test.js +10 -4
  116. package/dist/v1/hooks/use-tambo-v1-thread.test.js.map +1 -1
  117. package/dist/v1/hooks/use-tambo-v1.d.ts +16 -5
  118. package/dist/v1/hooks/use-tambo-v1.d.ts.map +1 -1
  119. package/dist/v1/hooks/use-tambo-v1.js +14 -6
  120. package/dist/v1/hooks/use-tambo-v1.js.map +1 -1
  121. package/dist/v1/hooks/use-tambo-v1.test.js +65 -43
  122. package/dist/v1/hooks/use-tambo-v1.test.js.map +1 -1
  123. package/dist/v1/index.d.ts +34 -27
  124. package/dist/v1/index.d.ts.map +1 -1
  125. package/dist/v1/index.js +48 -35
  126. package/dist/v1/index.js.map +1 -1
  127. package/dist/v1/providers/tambo-v1-provider.d.ts +35 -20
  128. package/dist/v1/providers/tambo-v1-provider.d.ts.map +1 -1
  129. package/dist/v1/providers/tambo-v1-provider.js +63 -26
  130. package/dist/v1/providers/tambo-v1-provider.js.map +1 -1
  131. package/dist/v1/providers/tambo-v1-provider.test.js +40 -23
  132. package/dist/v1/providers/tambo-v1-provider.test.js.map +1 -1
  133. package/dist/v1/providers/tambo-v1-stream-context.d.ts +21 -15
  134. package/dist/v1/providers/tambo-v1-stream-context.d.ts.map +1 -1
  135. package/dist/v1/providers/tambo-v1-stream-context.js +66 -27
  136. package/dist/v1/providers/tambo-v1-stream-context.js.map +1 -1
  137. package/dist/v1/providers/tambo-v1-stream-context.test.js +14 -5
  138. package/dist/v1/providers/tambo-v1-stream-context.test.js.map +1 -1
  139. package/dist/v1/providers/tambo-v1-stub-provider.d.ts +9 -9
  140. package/dist/v1/providers/tambo-v1-stub-provider.d.ts.map +1 -1
  141. package/dist/v1/providers/tambo-v1-stub-provider.js +11 -7
  142. package/dist/v1/providers/tambo-v1-stub-provider.js.map +1 -1
  143. package/dist/v1/providers/tambo-v1-stub-provider.test.js +25 -25
  144. package/dist/v1/providers/tambo-v1-stub-provider.test.js.map +1 -1
  145. package/dist/v1/providers/tambo-v1-thread-input-provider.d.ts +20 -9
  146. package/dist/v1/providers/tambo-v1-thread-input-provider.d.ts.map +1 -1
  147. package/dist/v1/providers/tambo-v1-thread-input-provider.js +25 -16
  148. package/dist/v1/providers/tambo-v1-thread-input-provider.js.map +1 -1
  149. package/dist/v1/types/auth.d.ts +24 -0
  150. package/dist/v1/types/auth.d.ts.map +1 -0
  151. package/dist/{model/tambo-thread.js → v1/types/auth.js} +1 -1
  152. package/dist/v1/types/auth.js.map +1 -0
  153. package/dist/v1/types/component.d.ts +3 -3
  154. package/dist/v1/types/component.d.ts.map +1 -1
  155. package/dist/v1/types/component.js +2 -2
  156. package/dist/v1/types/component.js.map +1 -1
  157. package/dist/v1/types/event.d.ts +1 -1
  158. package/dist/v1/types/event.js +1 -1
  159. package/dist/v1/types/event.js.map +1 -1
  160. package/dist/v1/types/message.d.ts +19 -12
  161. package/dist/v1/types/message.d.ts.map +1 -1
  162. package/dist/v1/types/message.js +1 -1
  163. package/dist/v1/types/message.js.map +1 -1
  164. package/dist/v1/types/thread.d.ts +8 -6
  165. package/dist/v1/types/thread.d.ts.map +1 -1
  166. package/dist/v1/types/thread.js +1 -1
  167. package/dist/v1/types/thread.js.map +1 -1
  168. package/dist/v1/types/tool-choice.d.ts +8 -0
  169. package/dist/v1/types/tool-choice.d.ts.map +1 -0
  170. package/dist/v1/types/tool-choice.js +3 -0
  171. package/dist/v1/types/tool-choice.js.map +1 -0
  172. package/dist/v1/utils/component-renderer.d.ts +11 -5
  173. package/dist/v1/utils/component-renderer.d.ts.map +1 -1
  174. package/dist/v1/utils/component-renderer.js +16 -7
  175. package/dist/v1/utils/component-renderer.js.map +1 -1
  176. package/dist/v1/utils/component-renderer.test.js +7 -7
  177. package/dist/v1/utils/component-renderer.test.js.map +1 -1
  178. package/dist/v1/utils/event-accumulator.d.ts +34 -8
  179. package/dist/v1/utils/event-accumulator.d.ts.map +1 -1
  180. package/dist/v1/utils/event-accumulator.js +90 -27
  181. package/dist/v1/utils/event-accumulator.js.map +1 -1
  182. package/dist/v1/utils/event-accumulator.test.js +149 -8
  183. package/dist/v1/utils/event-accumulator.test.js.map +1 -1
  184. package/dist/v1/utils/keyed-throttle.d.ts +42 -0
  185. package/dist/v1/utils/keyed-throttle.d.ts.map +1 -0
  186. package/dist/v1/utils/keyed-throttle.js +86 -0
  187. package/dist/v1/utils/keyed-throttle.js.map +1 -0
  188. package/dist/v1/utils/keyed-throttle.test.d.ts +2 -0
  189. package/dist/v1/utils/keyed-throttle.test.d.ts.map +1 -0
  190. package/dist/v1/utils/keyed-throttle.test.js +147 -0
  191. package/dist/v1/utils/keyed-throttle.test.js.map +1 -0
  192. package/dist/v1/utils/registry-conversion.d.ts +18 -18
  193. package/dist/v1/utils/registry-conversion.d.ts.map +1 -1
  194. package/dist/v1/utils/registry-conversion.js +25 -23
  195. package/dist/v1/utils/registry-conversion.js.map +1 -1
  196. package/dist/v1/utils/registry-conversion.test.js +23 -0
  197. package/dist/v1/utils/registry-conversion.test.js.map +1 -1
  198. package/dist/v1/utils/stream-handler.d.ts +1 -1
  199. package/dist/v1/utils/stream-handler.js +1 -1
  200. package/dist/v1/utils/stream-handler.js.map +1 -1
  201. package/dist/v1/utils/thread-utils.d.ts +2 -2
  202. package/dist/v1/utils/thread-utils.d.ts.map +1 -1
  203. package/dist/v1/utils/thread-utils.js.map +1 -1
  204. package/dist/v1/utils/tool-call-tracker.d.ts +11 -1
  205. package/dist/v1/utils/tool-call-tracker.d.ts.map +1 -1
  206. package/dist/v1/utils/tool-call-tracker.js +14 -1
  207. package/dist/v1/utils/tool-call-tracker.js.map +1 -1
  208. package/dist/v1/utils/tool-call-tracker.test.d.ts +2 -0
  209. package/dist/v1/utils/tool-call-tracker.test.d.ts.map +1 -0
  210. package/dist/v1/utils/tool-call-tracker.test.js +67 -0
  211. package/dist/v1/utils/tool-call-tracker.test.js.map +1 -0
  212. package/dist/v1/utils/tool-executor.d.ts +35 -1
  213. package/dist/v1/utils/tool-executor.d.ts.map +1 -1
  214. package/dist/v1/utils/tool-executor.js +57 -2
  215. package/dist/v1/utils/tool-executor.js.map +1 -1
  216. package/dist/v1/utils/tool-executor.test.js +211 -0
  217. package/dist/v1/utils/tool-executor.test.js.map +1 -1
  218. package/esm/hoc/with-tambo-interactable.d.ts +8 -0
  219. package/esm/hoc/with-tambo-interactable.d.ts.map +1 -1
  220. package/esm/hoc/with-tambo-interactable.js +15 -12
  221. package/esm/hoc/with-tambo-interactable.js.map +1 -1
  222. package/esm/hoc/with-tambo-interactable.test.js +13 -1
  223. package/esm/hoc/with-tambo-interactable.test.js.map +1 -1
  224. package/esm/hooks/use-tambo-voice.test.js +3 -0
  225. package/esm/hooks/use-tambo-voice.test.js.map +1 -1
  226. package/esm/index.d.ts +7 -25
  227. package/esm/index.d.ts.map +1 -1
  228. package/esm/index.js +7 -21
  229. package/esm/index.js.map +1 -1
  230. package/esm/mcp/mcp-hooks.js +1 -1
  231. package/esm/mcp/mcp-hooks.js.map +1 -1
  232. package/esm/mcp/mcp-hooks.test.js +69 -0
  233. package/esm/mcp/mcp-hooks.test.js.map +1 -1
  234. package/esm/mcp/tambo-mcp-provider.test.js +24 -0
  235. package/esm/mcp/tambo-mcp-provider.test.js.map +1 -1
  236. package/esm/mcp/use-mcp-servers.test.js +9 -0
  237. package/esm/mcp/use-mcp-servers.test.js.map +1 -1
  238. package/esm/model/component-metadata.d.ts +4 -4
  239. package/esm/model/component-metadata.js.map +1 -1
  240. package/esm/providers/tambo-client-provider.d.ts +12 -0
  241. package/esm/providers/tambo-client-provider.d.ts.map +1 -1
  242. package/esm/providers/tambo-client-provider.js +8 -3
  243. package/esm/providers/tambo-client-provider.js.map +1 -1
  244. package/esm/providers/tambo-interactable-provider.d.ts +1 -1
  245. package/esm/providers/tambo-interactable-provider.d.ts.map +1 -1
  246. package/esm/providers/tambo-interactable-provider.js +8 -0
  247. package/esm/providers/tambo-interactable-provider.js.map +1 -1
  248. package/esm/providers/tambo-interactable-provider.test.js +47 -0
  249. package/esm/providers/tambo-interactable-provider.test.js.map +1 -1
  250. package/esm/providers/tambo-interactables-additional-context-edge-cases.test.js +2 -10
  251. package/esm/providers/tambo-interactables-additional-context-edge-cases.test.js.map +1 -1
  252. package/esm/providers/tambo-interactables-additional-context.test.js +3 -19
  253. package/esm/providers/tambo-interactables-additional-context.test.js.map +1 -1
  254. package/esm/providers/tambo-mcp-token-provider.d.ts +8 -17
  255. package/esm/providers/tambo-mcp-token-provider.d.ts.map +1 -1
  256. package/esm/providers/tambo-mcp-token-provider.js +20 -97
  257. package/esm/providers/tambo-mcp-token-provider.js.map +1 -1
  258. package/esm/testing/tools.d.ts +3 -3
  259. package/esm/testing/tools.d.ts.map +1 -1
  260. package/esm/testing/tools.js.map +1 -1
  261. package/esm/util/registry-validators.js +1 -1
  262. package/esm/util/registry-validators.js.map +1 -1
  263. package/esm/util/resource-content-resolver.test.js +1 -1
  264. package/esm/util/resource-content-resolver.test.js.map +1 -1
  265. package/esm/v1/__tests__/v1-interactables.test.js +1 -1
  266. package/esm/v1/__tests__/v1-interactables.test.js.map +1 -1
  267. package/esm/v1/components/v1-component-renderer.d.ts +9 -9
  268. package/esm/v1/components/v1-component-renderer.d.ts.map +1 -1
  269. package/esm/v1/components/v1-component-renderer.js +12 -12
  270. package/esm/v1/components/v1-component-renderer.js.map +1 -1
  271. package/esm/v1/components/v1-component-renderer.test.js +16 -16
  272. package/esm/v1/components/v1-component-renderer.test.js.map +1 -1
  273. package/{dist/hooks/use-current-message.d.ts → esm/v1/hooks/use-tambo-current-message.d.ts} +30 -9
  274. package/esm/v1/hooks/use-tambo-current-message.d.ts.map +1 -0
  275. package/esm/{hooks/use-current-message.js → v1/hooks/use-tambo-current-message.js} +13 -8
  276. package/esm/v1/hooks/use-tambo-current-message.js.map +1 -0
  277. package/esm/v1/hooks/use-tambo-v1-auth-state.d.ts +11 -0
  278. package/esm/v1/hooks/use-tambo-v1-auth-state.d.ts.map +1 -0
  279. package/esm/v1/hooks/use-tambo-v1-auth-state.js +45 -0
  280. package/esm/v1/hooks/use-tambo-v1-auth-state.js.map +1 -0
  281. package/esm/v1/hooks/use-tambo-v1-auth-state.test.d.ts +2 -0
  282. package/esm/v1/hooks/use-tambo-v1-auth-state.test.d.ts.map +1 -0
  283. package/esm/v1/hooks/use-tambo-v1-auth-state.test.js +100 -0
  284. package/esm/v1/hooks/use-tambo-v1-auth-state.test.js.map +1 -0
  285. package/esm/v1/hooks/use-tambo-v1-component-state.d.ts +7 -6
  286. package/esm/v1/hooks/use-tambo-v1-component-state.d.ts.map +1 -1
  287. package/esm/v1/hooks/use-tambo-v1-component-state.js +101 -28
  288. package/esm/v1/hooks/use-tambo-v1-component-state.js.map +1 -1
  289. package/esm/v1/hooks/use-tambo-v1-component-state.test.js +152 -27
  290. package/esm/v1/hooks/use-tambo-v1-component-state.test.js.map +1 -1
  291. package/esm/v1/hooks/use-tambo-v1-messages.d.ts +9 -9
  292. package/esm/v1/hooks/use-tambo-v1-messages.d.ts.map +1 -1
  293. package/esm/v1/hooks/use-tambo-v1-messages.js +3 -3
  294. package/esm/v1/hooks/use-tambo-v1-messages.js.map +1 -1
  295. package/esm/v1/hooks/use-tambo-v1-messages.test.js +16 -8
  296. package/esm/v1/hooks/use-tambo-v1-messages.test.js.map +1 -1
  297. package/esm/v1/hooks/use-tambo-v1-send-message.d.ts +21 -3
  298. package/esm/v1/hooks/use-tambo-v1-send-message.d.ts.map +1 -1
  299. package/esm/v1/hooks/use-tambo-v1-send-message.js +93 -18
  300. package/esm/v1/hooks/use-tambo-v1-send-message.js.map +1 -1
  301. package/esm/v1/hooks/use-tambo-v1-send-message.test.js +318 -45
  302. package/esm/v1/hooks/use-tambo-v1-send-message.test.js.map +1 -1
  303. package/esm/v1/hooks/use-tambo-v1-stream-status.d.ts +7 -7
  304. package/esm/v1/hooks/use-tambo-v1-stream-status.d.ts.map +1 -1
  305. package/esm/v1/hooks/use-tambo-v1-stream-status.js +14 -16
  306. package/esm/v1/hooks/use-tambo-v1-stream-status.js.map +1 -1
  307. package/esm/v1/hooks/use-tambo-v1-stream-status.test.js +32 -32
  308. package/esm/v1/hooks/use-tambo-v1-stream-status.test.js.map +1 -1
  309. package/esm/v1/hooks/use-tambo-v1-suggestions.d.ts +7 -7
  310. package/esm/v1/hooks/use-tambo-v1-suggestions.d.ts.map +1 -1
  311. package/esm/v1/hooks/use-tambo-v1-suggestions.js +11 -11
  312. package/esm/v1/hooks/use-tambo-v1-suggestions.js.map +1 -1
  313. package/esm/v1/hooks/use-tambo-v1-suggestions.test.js +48 -48
  314. package/esm/v1/hooks/use-tambo-v1-suggestions.test.js.map +1 -1
  315. package/esm/v1/hooks/use-tambo-v1-thread-input.d.ts +3 -3
  316. package/esm/v1/hooks/use-tambo-v1-thread-input.d.ts.map +1 -1
  317. package/esm/v1/hooks/use-tambo-v1-thread-input.js +3 -3
  318. package/esm/v1/hooks/use-tambo-v1-thread-input.js.map +1 -1
  319. package/esm/v1/hooks/use-tambo-v1-thread-input.test.js +43 -30
  320. package/esm/v1/hooks/use-tambo-v1-thread-input.test.js.map +1 -1
  321. package/esm/v1/hooks/use-tambo-v1-thread-list.d.ts +4 -4
  322. package/esm/v1/hooks/use-tambo-v1-thread-list.d.ts.map +1 -1
  323. package/esm/v1/hooks/use-tambo-v1-thread-list.js +8 -4
  324. package/esm/v1/hooks/use-tambo-v1-thread-list.js.map +1 -1
  325. package/esm/v1/hooks/use-tambo-v1-thread-list.test.js +20 -18
  326. package/esm/v1/hooks/use-tambo-v1-thread-list.test.js.map +1 -1
  327. package/esm/v1/hooks/use-tambo-v1-thread.d.ts +3 -3
  328. package/esm/v1/hooks/use-tambo-v1-thread.d.ts.map +1 -1
  329. package/esm/v1/hooks/use-tambo-v1-thread.js +6 -2
  330. package/esm/v1/hooks/use-tambo-v1-thread.js.map +1 -1
  331. package/esm/v1/hooks/use-tambo-v1-thread.test.js +11 -5
  332. package/esm/v1/hooks/use-tambo-v1-thread.test.js.map +1 -1
  333. package/esm/v1/hooks/use-tambo-v1.d.ts +16 -5
  334. package/esm/v1/hooks/use-tambo-v1.d.ts.map +1 -1
  335. package/esm/v1/hooks/use-tambo-v1.js +14 -6
  336. package/esm/v1/hooks/use-tambo-v1.js.map +1 -1
  337. package/esm/v1/hooks/use-tambo-v1.test.js +67 -45
  338. package/esm/v1/hooks/use-tambo-v1.test.js.map +1 -1
  339. package/esm/v1/index.d.ts +34 -27
  340. package/esm/v1/index.d.ts.map +1 -1
  341. package/esm/v1/index.js +40 -33
  342. package/esm/v1/index.js.map +1 -1
  343. package/esm/v1/providers/tambo-v1-provider.d.ts +35 -20
  344. package/esm/v1/providers/tambo-v1-provider.d.ts.map +1 -1
  345. package/esm/v1/providers/tambo-v1-provider.js +63 -26
  346. package/esm/v1/providers/tambo-v1-provider.js.map +1 -1
  347. package/esm/v1/providers/tambo-v1-provider.test.js +41 -24
  348. package/esm/v1/providers/tambo-v1-provider.test.js.map +1 -1
  349. package/esm/v1/providers/tambo-v1-stream-context.d.ts +21 -15
  350. package/esm/v1/providers/tambo-v1-stream-context.d.ts.map +1 -1
  351. package/esm/v1/providers/tambo-v1-stream-context.js +66 -27
  352. package/esm/v1/providers/tambo-v1-stream-context.js.map +1 -1
  353. package/esm/v1/providers/tambo-v1-stream-context.test.js +15 -6
  354. package/esm/v1/providers/tambo-v1-stream-context.test.js.map +1 -1
  355. package/esm/v1/providers/tambo-v1-stub-provider.d.ts +9 -9
  356. package/esm/v1/providers/tambo-v1-stub-provider.d.ts.map +1 -1
  357. package/esm/v1/providers/tambo-v1-stub-provider.js +13 -9
  358. package/esm/v1/providers/tambo-v1-stub-provider.js.map +1 -1
  359. package/esm/v1/providers/tambo-v1-stub-provider.test.js +28 -28
  360. package/esm/v1/providers/tambo-v1-stub-provider.test.js.map +1 -1
  361. package/esm/v1/providers/tambo-v1-thread-input-provider.d.ts +20 -9
  362. package/esm/v1/providers/tambo-v1-thread-input-provider.d.ts.map +1 -1
  363. package/esm/v1/providers/tambo-v1-thread-input-provider.js +23 -14
  364. package/esm/v1/providers/tambo-v1-thread-input-provider.js.map +1 -1
  365. package/esm/v1/types/auth.d.ts +24 -0
  366. package/esm/v1/types/auth.d.ts.map +1 -0
  367. package/esm/v1/types/auth.js +2 -0
  368. package/esm/v1/types/auth.js.map +1 -0
  369. package/esm/v1/types/component.d.ts +3 -3
  370. package/esm/v1/types/component.d.ts.map +1 -1
  371. package/esm/v1/types/component.js +2 -2
  372. package/esm/v1/types/component.js.map +1 -1
  373. package/esm/v1/types/event.d.ts +1 -1
  374. package/esm/v1/types/event.js +1 -1
  375. package/esm/v1/types/event.js.map +1 -1
  376. package/esm/v1/types/message.d.ts +19 -12
  377. package/esm/v1/types/message.d.ts.map +1 -1
  378. package/esm/v1/types/message.js +1 -1
  379. package/esm/v1/types/message.js.map +1 -1
  380. package/esm/v1/types/thread.d.ts +8 -6
  381. package/esm/v1/types/thread.d.ts.map +1 -1
  382. package/esm/v1/types/thread.js +1 -1
  383. package/esm/v1/types/thread.js.map +1 -1
  384. package/esm/v1/types/tool-choice.d.ts +8 -0
  385. package/esm/v1/types/tool-choice.d.ts.map +1 -0
  386. package/esm/v1/types/tool-choice.js +2 -0
  387. package/esm/v1/types/tool-choice.js.map +1 -0
  388. package/esm/v1/utils/component-renderer.d.ts +11 -5
  389. package/esm/v1/utils/component-renderer.d.ts.map +1 -1
  390. package/esm/v1/utils/component-renderer.js +13 -5
  391. package/esm/v1/utils/component-renderer.js.map +1 -1
  392. package/esm/v1/utils/component-renderer.test.js +8 -8
  393. package/esm/v1/utils/component-renderer.test.js.map +1 -1
  394. package/esm/v1/utils/event-accumulator.d.ts +34 -8
  395. package/esm/v1/utils/event-accumulator.d.ts.map +1 -1
  396. package/esm/v1/utils/event-accumulator.js +89 -27
  397. package/esm/v1/utils/event-accumulator.js.map +1 -1
  398. package/esm/v1/utils/event-accumulator.test.js +149 -8
  399. package/esm/v1/utils/event-accumulator.test.js.map +1 -1
  400. package/esm/v1/utils/keyed-throttle.d.ts +42 -0
  401. package/esm/v1/utils/keyed-throttle.d.ts.map +1 -0
  402. package/esm/v1/utils/keyed-throttle.js +83 -0
  403. package/esm/v1/utils/keyed-throttle.js.map +1 -0
  404. package/esm/v1/utils/keyed-throttle.test.d.ts +2 -0
  405. package/esm/v1/utils/keyed-throttle.test.d.ts.map +1 -0
  406. package/esm/v1/utils/keyed-throttle.test.js +145 -0
  407. package/esm/v1/utils/keyed-throttle.test.js.map +1 -0
  408. package/esm/v1/utils/registry-conversion.d.ts +18 -18
  409. package/esm/v1/utils/registry-conversion.d.ts.map +1 -1
  410. package/esm/v1/utils/registry-conversion.js +25 -23
  411. package/esm/v1/utils/registry-conversion.js.map +1 -1
  412. package/esm/v1/utils/registry-conversion.test.js +23 -0
  413. package/esm/v1/utils/registry-conversion.test.js.map +1 -1
  414. package/esm/v1/utils/stream-handler.d.ts +1 -1
  415. package/esm/v1/utils/stream-handler.js +1 -1
  416. package/esm/v1/utils/stream-handler.js.map +1 -1
  417. package/esm/v1/utils/thread-utils.d.ts +2 -2
  418. package/esm/v1/utils/thread-utils.d.ts.map +1 -1
  419. package/esm/v1/utils/thread-utils.js.map +1 -1
  420. package/esm/v1/utils/tool-call-tracker.d.ts +11 -1
  421. package/esm/v1/utils/tool-call-tracker.d.ts.map +1 -1
  422. package/esm/v1/utils/tool-call-tracker.js +14 -1
  423. package/esm/v1/utils/tool-call-tracker.js.map +1 -1
  424. package/esm/v1/utils/tool-call-tracker.test.d.ts +2 -0
  425. package/esm/v1/utils/tool-call-tracker.test.d.ts.map +1 -0
  426. package/esm/v1/utils/tool-call-tracker.test.js +65 -0
  427. package/esm/v1/utils/tool-call-tracker.test.js.map +1 -0
  428. package/esm/v1/utils/tool-executor.d.ts +35 -1
  429. package/esm/v1/utils/tool-executor.d.ts.map +1 -1
  430. package/esm/v1/utils/tool-executor.js +55 -2
  431. package/esm/v1/utils/tool-executor.js.map +1 -1
  432. package/esm/v1/utils/tool-executor.test.js +212 -1
  433. package/esm/v1/utils/tool-executor.test.js.map +1 -1
  434. package/package.json +5 -10
  435. package/dist/hooks/index.d.ts +0 -9
  436. package/dist/hooks/index.d.ts.map +0 -1
  437. package/dist/hooks/index.js +0 -34
  438. package/dist/hooks/index.js.map +0 -1
  439. package/dist/hooks/use-component-state.d.ts +0 -30
  440. package/dist/hooks/use-component-state.d.ts.map +0 -1
  441. package/dist/hooks/use-component-state.js +0 -139
  442. package/dist/hooks/use-component-state.js.map +0 -1
  443. package/dist/hooks/use-component-state.test.d.ts +0 -2
  444. package/dist/hooks/use-component-state.test.d.ts.map +0 -1
  445. package/dist/hooks/use-component-state.test.js +0 -406
  446. package/dist/hooks/use-component-state.test.js.map +0 -1
  447. package/dist/hooks/use-current-message.d.ts.map +0 -1
  448. package/dist/hooks/use-current-message.js.map +0 -1
  449. package/dist/hooks/use-current-message.test.d.ts +0 -2
  450. package/dist/hooks/use-current-message.test.d.ts.map +0 -1
  451. package/dist/hooks/use-current-message.test.js +0 -269
  452. package/dist/hooks/use-current-message.test.js.map +0 -1
  453. package/dist/hooks/use-streaming-props.d.ts +0 -11
  454. package/dist/hooks/use-streaming-props.d.ts.map +0 -1
  455. package/dist/hooks/use-streaming-props.js +0 -37
  456. package/dist/hooks/use-streaming-props.js.map +0 -1
  457. package/dist/hooks/use-suggestions.d.ts +0 -46
  458. package/dist/hooks/use-suggestions.d.ts.map +0 -1
  459. package/dist/hooks/use-suggestions.js +0 -118
  460. package/dist/hooks/use-suggestions.js.map +0 -1
  461. package/dist/hooks/use-suggestions.test.d.ts +0 -2
  462. package/dist/hooks/use-suggestions.test.d.ts.map +0 -1
  463. package/dist/hooks/use-suggestions.test.js +0 -247
  464. package/dist/hooks/use-suggestions.test.js.map +0 -1
  465. package/dist/hooks/use-tambo-stream-status.d.ts +0 -90
  466. package/dist/hooks/use-tambo-stream-status.d.ts.map +0 -1
  467. package/dist/hooks/use-tambo-stream-status.js +0 -213
  468. package/dist/hooks/use-tambo-stream-status.js.map +0 -1
  469. package/dist/hooks/use-tambo-stream-status.test.d.ts +0 -2
  470. package/dist/hooks/use-tambo-stream-status.test.d.ts.map +0 -1
  471. package/dist/hooks/use-tambo-stream-status.test.js +0 -378
  472. package/dist/hooks/use-tambo-stream-status.test.js.map +0 -1
  473. package/dist/hooks/use-tambo-threads.d.ts +0 -158
  474. package/dist/hooks/use-tambo-threads.d.ts.map +0 -1
  475. package/dist/hooks/use-tambo-threads.js +0 -45
  476. package/dist/hooks/use-tambo-threads.js.map +0 -1
  477. package/dist/hooks/use-tambo-threads.test.d.ts +0 -2
  478. package/dist/hooks/use-tambo-threads.test.d.ts.map +0 -1
  479. package/dist/hooks/use-tambo-threads.test.js +0 -214
  480. package/dist/hooks/use-tambo-threads.test.js.map +0 -1
  481. package/dist/model/generate-component-response.d.ts +0 -37
  482. package/dist/model/generate-component-response.d.ts.map +0 -1
  483. package/dist/model/generate-component-response.js +0 -29
  484. package/dist/model/generate-component-response.js.map +0 -1
  485. package/dist/model/tambo-thread.d.ts +0 -15
  486. package/dist/model/tambo-thread.d.ts.map +0 -1
  487. package/dist/model/tambo-thread.js.map +0 -1
  488. package/dist/providers/__tests__/thread-input-resource-resolution.test.d.ts +0 -2
  489. package/dist/providers/__tests__/thread-input-resource-resolution.test.d.ts.map +0 -1
  490. package/dist/providers/__tests__/thread-input-resource-resolution.test.js +0 -592
  491. package/dist/providers/__tests__/thread-input-resource-resolution.test.js.map +0 -1
  492. package/dist/providers/index.d.ts +0 -13
  493. package/dist/providers/index.d.ts.map +0 -1
  494. package/dist/providers/index.js +0 -41
  495. package/dist/providers/index.js.map +0 -1
  496. package/dist/providers/tambo-component-provider.d.ts +0 -23
  497. package/dist/providers/tambo-component-provider.d.ts.map +0 -1
  498. package/dist/providers/tambo-component-provider.js +0 -88
  499. package/dist/providers/tambo-component-provider.js.map +0 -1
  500. package/dist/providers/tambo-prop-stream-provider/index.d.ts +0 -19
  501. package/dist/providers/tambo-prop-stream-provider/index.d.ts.map +0 -1
  502. package/dist/providers/tambo-prop-stream-provider/index.js +0 -43
  503. package/dist/providers/tambo-prop-stream-provider/index.js.map +0 -1
  504. package/dist/providers/tambo-prop-stream-provider/pending.d.ts +0 -12
  505. package/dist/providers/tambo-prop-stream-provider/pending.d.ts.map +0 -1
  506. package/dist/providers/tambo-prop-stream-provider/pending.js +0 -31
  507. package/dist/providers/tambo-prop-stream-provider/pending.js.map +0 -1
  508. package/dist/providers/tambo-prop-stream-provider/provider.d.ts +0 -17
  509. package/dist/providers/tambo-prop-stream-provider/provider.d.ts.map +0 -1
  510. package/dist/providers/tambo-prop-stream-provider/provider.js +0 -107
  511. package/dist/providers/tambo-prop-stream-provider/provider.js.map +0 -1
  512. package/dist/providers/tambo-prop-stream-provider/streaming.d.ts +0 -12
  513. package/dist/providers/tambo-prop-stream-provider/streaming.d.ts.map +0 -1
  514. package/dist/providers/tambo-prop-stream-provider/streaming.js +0 -28
  515. package/dist/providers/tambo-prop-stream-provider/streaming.js.map +0 -1
  516. package/dist/providers/tambo-prop-stream-provider/success.d.ts +0 -12
  517. package/dist/providers/tambo-prop-stream-provider/success.d.ts.map +0 -1
  518. package/dist/providers/tambo-prop-stream-provider/success.js +0 -28
  519. package/dist/providers/tambo-prop-stream-provider/success.js.map +0 -1
  520. package/dist/providers/tambo-prop-stream-provider/types.d.ts +0 -25
  521. package/dist/providers/tambo-prop-stream-provider/types.d.ts.map +0 -1
  522. package/dist/providers/tambo-prop-stream-provider/types.js +0 -6
  523. package/dist/providers/tambo-prop-stream-provider/types.js.map +0 -1
  524. package/dist/providers/tambo-prop-stream-provider.test.d.ts +0 -2
  525. package/dist/providers/tambo-prop-stream-provider.test.d.ts.map +0 -1
  526. package/dist/providers/tambo-prop-stream-provider.test.js +0 -275
  527. package/dist/providers/tambo-prop-stream-provider.test.js.map +0 -1
  528. package/dist/providers/tambo-provider.d.ts +0 -53
  529. package/dist/providers/tambo-provider.d.ts.map +0 -1
  530. package/dist/providers/tambo-provider.js +0 -130
  531. package/dist/providers/tambo-provider.js.map +0 -1
  532. package/dist/providers/tambo-stubs.d.ts +0 -89
  533. package/dist/providers/tambo-stubs.d.ts.map +0 -1
  534. package/dist/providers/tambo-stubs.js +0 -276
  535. package/dist/providers/tambo-stubs.js.map +0 -1
  536. package/dist/providers/tambo-stubs.test.d.ts +0 -2
  537. package/dist/providers/tambo-stubs.test.d.ts.map +0 -1
  538. package/dist/providers/tambo-stubs.test.js +0 -97
  539. package/dist/providers/tambo-stubs.test.js.map +0 -1
  540. package/dist/providers/tambo-thread-input-provider.d.ts +0 -65
  541. package/dist/providers/tambo-thread-input-provider.d.ts.map +0 -1
  542. package/dist/providers/tambo-thread-input-provider.js +0 -179
  543. package/dist/providers/tambo-thread-input-provider.js.map +0 -1
  544. package/dist/providers/tambo-thread-provider-initial-messages.test.d.ts +0 -2
  545. package/dist/providers/tambo-thread-provider-initial-messages.test.d.ts.map +0 -1
  546. package/dist/providers/tambo-thread-provider-initial-messages.test.js +0 -275
  547. package/dist/providers/tambo-thread-provider-initial-messages.test.js.map +0 -1
  548. package/dist/providers/tambo-thread-provider.d.ts +0 -126
  549. package/dist/providers/tambo-thread-provider.d.ts.map +0 -1
  550. package/dist/providers/tambo-thread-provider.js +0 -931
  551. package/dist/providers/tambo-thread-provider.js.map +0 -1
  552. package/dist/providers/tambo-thread-provider.test.d.ts +0 -2
  553. package/dist/providers/tambo-thread-provider.test.d.ts.map +0 -1
  554. package/dist/providers/tambo-thread-provider.test.js +0 -1588
  555. package/dist/providers/tambo-thread-provider.test.js.map +0 -1
  556. package/dist/util/generate-component.d.ts +0 -12
  557. package/dist/util/generate-component.d.ts.map +0 -1
  558. package/dist/util/generate-component.js +0 -58
  559. package/dist/util/generate-component.js.map +0 -1
  560. package/dist/util/generate-component.test.d.ts +0 -2
  561. package/dist/util/generate-component.test.d.ts.map +0 -1
  562. package/dist/util/generate-component.test.js +0 -340
  563. package/dist/util/generate-component.test.js.map +0 -1
  564. package/esm/hooks/index.d.ts +0 -9
  565. package/esm/hooks/index.d.ts.map +0 -1
  566. package/esm/hooks/index.js +0 -10
  567. package/esm/hooks/index.js.map +0 -1
  568. package/esm/hooks/use-component-state.d.ts +0 -30
  569. package/esm/hooks/use-component-state.d.ts.map +0 -1
  570. package/esm/hooks/use-component-state.js +0 -136
  571. package/esm/hooks/use-component-state.js.map +0 -1
  572. package/esm/hooks/use-component-state.test.d.ts +0 -2
  573. package/esm/hooks/use-component-state.test.d.ts.map +0 -1
  574. package/esm/hooks/use-component-state.test.js +0 -401
  575. package/esm/hooks/use-component-state.test.js.map +0 -1
  576. package/esm/hooks/use-current-message.d.ts.map +0 -1
  577. package/esm/hooks/use-current-message.js.map +0 -1
  578. package/esm/hooks/use-current-message.test.d.ts +0 -2
  579. package/esm/hooks/use-current-message.test.d.ts.map +0 -1
  580. package/esm/hooks/use-current-message.test.js +0 -264
  581. package/esm/hooks/use-current-message.test.js.map +0 -1
  582. package/esm/hooks/use-streaming-props.d.ts +0 -11
  583. package/esm/hooks/use-streaming-props.d.ts.map +0 -1
  584. package/esm/hooks/use-streaming-props.js +0 -34
  585. package/esm/hooks/use-streaming-props.js.map +0 -1
  586. package/esm/hooks/use-suggestions.d.ts +0 -46
  587. package/esm/hooks/use-suggestions.d.ts.map +0 -1
  588. package/esm/hooks/use-suggestions.js +0 -115
  589. package/esm/hooks/use-suggestions.js.map +0 -1
  590. package/esm/hooks/use-suggestions.test.d.ts +0 -2
  591. package/esm/hooks/use-suggestions.test.d.ts.map +0 -1
  592. package/esm/hooks/use-suggestions.test.js +0 -245
  593. package/esm/hooks/use-suggestions.test.js.map +0 -1
  594. package/esm/hooks/use-tambo-stream-status.d.ts +0 -90
  595. package/esm/hooks/use-tambo-stream-status.d.ts.map +0 -1
  596. package/esm/hooks/use-tambo-stream-status.js +0 -210
  597. package/esm/hooks/use-tambo-stream-status.js.map +0 -1
  598. package/esm/hooks/use-tambo-stream-status.test.d.ts +0 -2
  599. package/esm/hooks/use-tambo-stream-status.test.d.ts.map +0 -1
  600. package/esm/hooks/use-tambo-stream-status.test.js +0 -376
  601. package/esm/hooks/use-tambo-stream-status.test.js.map +0 -1
  602. package/esm/hooks/use-tambo-threads.d.ts +0 -158
  603. package/esm/hooks/use-tambo-threads.d.ts.map +0 -1
  604. package/esm/hooks/use-tambo-threads.js +0 -42
  605. package/esm/hooks/use-tambo-threads.js.map +0 -1
  606. package/esm/hooks/use-tambo-threads.test.d.ts +0 -2
  607. package/esm/hooks/use-tambo-threads.test.d.ts.map +0 -1
  608. package/esm/hooks/use-tambo-threads.test.js +0 -212
  609. package/esm/hooks/use-tambo-threads.test.js.map +0 -1
  610. package/esm/model/generate-component-response.d.ts +0 -37
  611. package/esm/model/generate-component-response.d.ts.map +0 -1
  612. package/esm/model/generate-component-response.js +0 -25
  613. package/esm/model/generate-component-response.js.map +0 -1
  614. package/esm/model/tambo-thread.d.ts +0 -15
  615. package/esm/model/tambo-thread.d.ts.map +0 -1
  616. package/esm/model/tambo-thread.js +0 -2
  617. package/esm/model/tambo-thread.js.map +0 -1
  618. package/esm/providers/__tests__/thread-input-resource-resolution.test.d.ts +0 -2
  619. package/esm/providers/__tests__/thread-input-resource-resolution.test.d.ts.map +0 -1
  620. package/esm/providers/__tests__/thread-input-resource-resolution.test.js +0 -587
  621. package/esm/providers/__tests__/thread-input-resource-resolution.test.js.map +0 -1
  622. package/esm/providers/index.d.ts +0 -13
  623. package/esm/providers/index.d.ts.map +0 -1
  624. package/esm/providers/index.js +0 -11
  625. package/esm/providers/index.js.map +0 -1
  626. package/esm/providers/tambo-component-provider.d.ts +0 -23
  627. package/esm/providers/tambo-component-provider.d.ts.map +0 -1
  628. package/esm/providers/tambo-component-provider.js +0 -50
  629. package/esm/providers/tambo-component-provider.js.map +0 -1
  630. package/esm/providers/tambo-prop-stream-provider/index.d.ts +0 -19
  631. package/esm/providers/tambo-prop-stream-provider/index.d.ts.map +0 -1
  632. package/esm/providers/tambo-prop-stream-provider/index.js +0 -22
  633. package/esm/providers/tambo-prop-stream-provider/index.js.map +0 -1
  634. package/esm/providers/tambo-prop-stream-provider/pending.d.ts +0 -12
  635. package/esm/providers/tambo-prop-stream-provider/pending.d.ts.map +0 -1
  636. package/esm/providers/tambo-prop-stream-provider/pending.js +0 -24
  637. package/esm/providers/tambo-prop-stream-provider/pending.js.map +0 -1
  638. package/esm/providers/tambo-prop-stream-provider/provider.d.ts +0 -17
  639. package/esm/providers/tambo-prop-stream-provider/provider.d.ts.map +0 -1
  640. package/esm/providers/tambo-prop-stream-provider/provider.js +0 -70
  641. package/esm/providers/tambo-prop-stream-provider/provider.js.map +0 -1
  642. package/esm/providers/tambo-prop-stream-provider/streaming.d.ts +0 -12
  643. package/esm/providers/tambo-prop-stream-provider/streaming.d.ts.map +0 -1
  644. package/esm/providers/tambo-prop-stream-provider/streaming.js +0 -21
  645. package/esm/providers/tambo-prop-stream-provider/streaming.js.map +0 -1
  646. package/esm/providers/tambo-prop-stream-provider/success.d.ts +0 -12
  647. package/esm/providers/tambo-prop-stream-provider/success.d.ts.map +0 -1
  648. package/esm/providers/tambo-prop-stream-provider/success.js +0 -21
  649. package/esm/providers/tambo-prop-stream-provider/success.js.map +0 -1
  650. package/esm/providers/tambo-prop-stream-provider/types.d.ts +0 -25
  651. package/esm/providers/tambo-prop-stream-provider/types.d.ts.map +0 -1
  652. package/esm/providers/tambo-prop-stream-provider/types.js +0 -3
  653. package/esm/providers/tambo-prop-stream-provider/types.js.map +0 -1
  654. package/esm/providers/tambo-prop-stream-provider.test.d.ts +0 -2
  655. package/esm/providers/tambo-prop-stream-provider.test.d.ts.map +0 -1
  656. package/esm/providers/tambo-prop-stream-provider.test.js +0 -270
  657. package/esm/providers/tambo-prop-stream-provider.test.js.map +0 -1
  658. package/esm/providers/tambo-provider.d.ts +0 -53
  659. package/esm/providers/tambo-provider.d.ts.map +0 -1
  660. package/esm/providers/tambo-provider.js +0 -91
  661. package/esm/providers/tambo-provider.js.map +0 -1
  662. package/esm/providers/tambo-stubs.d.ts +0 -89
  663. package/esm/providers/tambo-stubs.d.ts.map +0 -1
  664. package/esm/providers/tambo-stubs.js +0 -239
  665. package/esm/providers/tambo-stubs.js.map +0 -1
  666. package/esm/providers/tambo-stubs.test.d.ts +0 -2
  667. package/esm/providers/tambo-stubs.test.d.ts.map +0 -1
  668. package/esm/providers/tambo-stubs.test.js +0 -62
  669. package/esm/providers/tambo-stubs.test.js.map +0 -1
  670. package/esm/providers/tambo-thread-input-provider.d.ts +0 -65
  671. package/esm/providers/tambo-thread-input-provider.d.ts.map +0 -1
  672. package/esm/providers/tambo-thread-input-provider.js +0 -141
  673. package/esm/providers/tambo-thread-input-provider.js.map +0 -1
  674. package/esm/providers/tambo-thread-provider-initial-messages.test.d.ts +0 -2
  675. package/esm/providers/tambo-thread-provider-initial-messages.test.d.ts.map +0 -1
  676. package/esm/providers/tambo-thread-provider-initial-messages.test.js +0 -270
  677. package/esm/providers/tambo-thread-provider-initial-messages.test.js.map +0 -1
  678. package/esm/providers/tambo-thread-provider.d.ts +0 -126
  679. package/esm/providers/tambo-thread-provider.d.ts.map +0 -1
  680. package/esm/providers/tambo-thread-provider.js +0 -891
  681. package/esm/providers/tambo-thread-provider.js.map +0 -1
  682. package/esm/providers/tambo-thread-provider.test.d.ts +0 -2
  683. package/esm/providers/tambo-thread-provider.test.d.ts.map +0 -1
  684. package/esm/providers/tambo-thread-provider.test.js +0 -1550
  685. package/esm/providers/tambo-thread-provider.test.js.map +0 -1
  686. package/esm/util/generate-component.d.ts +0 -12
  687. package/esm/util/generate-component.d.ts.map +0 -1
  688. package/esm/util/generate-component.js +0 -52
  689. package/esm/util/generate-component.js.map +0 -1
  690. package/esm/util/generate-component.test.d.ts +0 -2
  691. package/esm/util/generate-component.test.d.ts.map +0 -1
  692. package/esm/util/generate-component.test.js +0 -302
  693. package/esm/util/generate-component.test.js.map +0 -1
@@ -2,9 +2,9 @@
2
2
  "use client";
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.createRunStream = createRunStream;
5
- exports.useTamboV1SendMessage = useTamboV1SendMessage;
5
+ exports.useTamboSendMessage = useTamboSendMessage;
6
6
  /**
7
- * Send Message Hook for v1 API
7
+ * Send Message Hook
8
8
  *
9
9
  * React Query mutation hook for sending messages and handling streaming responses.
10
10
  */
@@ -16,12 +16,14 @@ const react_query_hooks_1 = require("../../hooks/react-query-hooks");
16
16
  const tambo_registry_provider_1 = require("../../providers/tambo-registry-provider");
17
17
  const tambo_v1_stream_context_1 = require("../providers/tambo-v1-stream-context");
18
18
  const tambo_v1_provider_1 = require("../providers/tambo-v1-provider");
19
+ const use_tambo_v1_auth_state_1 = require("./use-tambo-v1-auth-state");
19
20
  const tambo_context_helpers_provider_1 = require("../../providers/tambo-context-helpers-provider");
20
21
  const event_accumulator_1 = require("../utils/event-accumulator");
21
22
  const registry_conversion_1 = require("../utils/registry-conversion");
22
23
  const stream_handler_1 = require("../utils/stream-handler");
23
24
  const tool_executor_1 = require("../utils/tool-executor");
24
25
  const tool_call_tracker_1 = require("../utils/tool-call-tracker");
26
+ const partial_json_1 = require("partial-json");
25
27
  /**
26
28
  * Dispatches synthetic AG-UI events to show a user message in the thread.
27
29
  * @param dispatch - Stream state dispatcher
@@ -117,6 +119,33 @@ function shouldGenerateThreadName(threadId, threadAlreadyHasTitle, preMutationMe
117
119
  // +2 accounts for the user message and assistant response just added
118
120
  preMutationMessageCount + 2 >= autoGenerateNameThreshold);
119
121
  }
122
+ /**
123
+ * Attempts to parse partial JSON from accumulated tool call args.
124
+ *
125
+ * Returns a parsed object if the accumulated args are parseable as
126
+ * a JSON object, or undefined if parsing fails or the result is not
127
+ * a plain object (e.g. array or primitive).
128
+ * @param toolTracker - Tracker holding pending tool call state
129
+ * @param toolCallId - The tool call ID to parse args for
130
+ * @returns Parsed args object, or undefined if not parseable yet
131
+ */
132
+ function parseToolCallArgs(toolTracker, toolCallId) {
133
+ const accToolCall = toolTracker.getAccumulatingToolCall(toolCallId);
134
+ if (!accToolCall)
135
+ return undefined;
136
+ try {
137
+ const parsed = (0, partial_json_1.parse)(accToolCall.accumulatedArgs);
138
+ if (typeof parsed === "object" &&
139
+ parsed !== null &&
140
+ !Array.isArray(parsed)) {
141
+ return parsed;
142
+ }
143
+ }
144
+ catch {
145
+ /* not parseable yet */
146
+ }
147
+ return undefined;
148
+ }
120
149
  /**
121
150
  * Generates a thread name via the beta API, dispatches the title update,
122
151
  * and invalidates the thread list cache. Errors are logged, never thrown.
@@ -140,7 +169,7 @@ async function generateThreadName(client, dispatch, queryClient, threadId) {
140
169
  }
141
170
  }
142
171
  catch (error) {
143
- console.error("[useTamboV1SendMessage] Failed to auto-generate thread name:", error);
172
+ console.error("[useTamboSendMessage] Failed to auto-generate thread name:", error);
144
173
  }
145
174
  }
146
175
  /**
@@ -153,7 +182,7 @@ async function generateThreadName(client, dispatch, queryClient, threadId) {
153
182
  * @returns The continuation stream and tool results for optimistic local state updates
154
183
  */
155
184
  async function executeToolsAndContinue(params) {
156
- const { event, toolTracker, registry, client, threadId, runId, userKey, additionalContext, } = params;
185
+ const { event, toolTracker, registry, client, threadId, runId, userKey, additionalContext, toolChoice, } = params;
157
186
  const pendingToolCallIds = event.value.pendingToolCalls.map((tc) => tc.toolCallId);
158
187
  const toolCallsToExecute = toolTracker.getToolCallsById(pendingToolCallIds);
159
188
  // Execute tools
@@ -171,6 +200,7 @@ async function executeToolsAndContinue(params) {
171
200
  availableComponents: (0, registry_conversion_1.toAvailableComponents)(registry.componentList),
172
201
  tools: (0, registry_conversion_1.toAvailableTools)(registry.toolRegistry),
173
202
  userKey,
203
+ toolChoice,
174
204
  });
175
205
  return { stream, toolResults };
176
206
  }
@@ -183,7 +213,7 @@ async function executeToolsAndContinue(params) {
183
213
  * @returns The stream and initial thread ID (undefined if creating new thread)
184
214
  */
185
215
  async function createRunStream(params) {
186
- const { client, threadId, message, registry, userKey, previousRunId, additionalContext, } = params;
216
+ const { client, threadId, message, registry, userKey, previousRunId, additionalContext, toolChoice, initialMessages, } = params;
187
217
  // Merge helper context with any caller-provided additionalContext on the message
188
218
  const mergedContext = additionalContext || message.additionalContext
189
219
  ? {
@@ -194,7 +224,7 @@ async function createRunStream(params) {
194
224
  const messageWithContext = mergedContext
195
225
  ? { ...message, additionalContext: mergedContext }
196
226
  : message;
197
- // Convert registry components/tools to v1 API format
227
+ // Convert registry components/tools to API format
198
228
  const availableComponents = (0, registry_conversion_1.toAvailableComponents)(registry.componentList);
199
229
  const availableTools = (0, registry_conversion_1.toAvailableTools)(registry.toolRegistry);
200
230
  if (threadId) {
@@ -205,16 +235,25 @@ async function createRunStream(params) {
205
235
  tools: availableTools,
206
236
  userKey,
207
237
  previousRunId,
238
+ toolChoice,
208
239
  });
209
240
  return { stream, initialThreadId: threadId };
210
241
  }
211
242
  else {
212
- // Create new thread
243
+ // Create new thread - include initialMessages if provided
244
+ const threadConfig = {};
245
+ if (userKey) {
246
+ threadConfig.userKey = userKey;
247
+ }
248
+ if (initialMessages?.length) {
249
+ threadConfig.initialMessages = initialMessages;
250
+ }
213
251
  const stream = await client.threads.runs.create({
214
252
  message: messageWithContext,
215
253
  availableComponents,
216
254
  tools: availableTools,
217
- thread: userKey ? { userKey } : undefined,
255
+ thread: Object.keys(threadConfig).length > 0 ? threadConfig : undefined,
256
+ toolChoice,
218
257
  });
219
258
  // threadId will be extracted from first event (RUN_STARTED)
220
259
  return { stream, initialThreadId: undefined };
@@ -239,7 +278,7 @@ async function createRunStream(params) {
239
278
  * @example
240
279
  * ```tsx
241
280
  * function ChatInput({ threadId }: { threadId?: string }) {
242
- * const sendMessage = useTamboV1SendMessage(threadId);
281
+ * const sendMessage = useTamboSendMessage(threadId);
243
282
  *
244
283
  * const handleSubmit = async (text: string) => {
245
284
  * const result = await sendMessage.mutateAsync({
@@ -264,33 +303,50 @@ async function createRunStream(params) {
264
303
  * }
265
304
  * ```
266
305
  */
267
- function useTamboV1SendMessage(threadId) {
306
+ function useTamboSendMessage(threadId) {
268
307
  const client = (0, tambo_client_provider_1.useTamboClient)();
269
308
  const dispatch = (0, tambo_v1_stream_context_1.useStreamDispatch)();
270
309
  const streamState = (0, tambo_v1_stream_context_1.useStreamState)();
271
- const { userKey, autoGenerateThreadName = true, autoGenerateNameThreshold = 3, } = (0, tambo_v1_provider_1.useTamboV1Config)();
310
+ const { userKey, autoGenerateThreadName = true, autoGenerateNameThreshold = 3, initialMessages, } = (0, tambo_v1_provider_1.useTamboConfig)();
272
311
  const registry = (0, react_1.useContext)(tambo_registry_provider_1.TamboRegistryContext);
273
312
  const queryClient = (0, tambo_client_provider_1.useTamboQueryClient)();
274
313
  const { getAdditionalContext } = (0, tambo_context_helpers_provider_1.useTamboContextHelpers)();
314
+ const authState = (0, use_tambo_v1_auth_state_1.useTamboAuthState)();
275
315
  if (!registry) {
276
- throw new Error("useTamboV1SendMessage must be used within TamboRegistryProvider");
316
+ throw new Error("useTamboSendMessage must be used within TamboRegistryProvider");
277
317
  }
278
318
  // Placeholder ID isn't a valid API thread ID - treat as new thread creation
279
319
  const isNewThread = (0, event_accumulator_1.isPlaceholderThreadId)(threadId);
280
320
  const apiThreadId = isNewThread ? undefined : threadId;
281
- // Get previousRunId from the thread's streaming state (if thread exists and has messages)
321
+ // Get previousRunId from the thread's streaming state (active run) or
322
+ // lastCompletedRunId (persisted after run finishes / loaded from API).
323
+ // The latter is essential after page reload when streaming state is gone.
282
324
  const threadState = apiThreadId
283
325
  ? streamState.threadMap[apiThreadId]
284
326
  : undefined;
285
- const previousRunId = threadState?.streaming.runId;
327
+ const previousRunId = threadState?.streaming.runId ?? threadState?.lastCompletedRunId;
286
328
  return (0, react_query_hooks_1.useTamboMutation)({
287
329
  mutationFn: async (options) => {
288
- const { message, userMessageText, debug = false } = options;
330
+ if (authState.status !== "identified") {
331
+ const messages = {
332
+ unauthenticated: "Cannot send message: no userKey or userToken provided. " +
333
+ "Configure authentication in TamboProvider.",
334
+ exchanging: "Cannot send message: token exchange is still in progress. " +
335
+ "Wait for authentication to complete.",
336
+ error: "Cannot send message: token exchange failed. " +
337
+ "Check your userToken configuration.",
338
+ invalid: "Cannot send message: both userKey and userToken were provided. " +
339
+ "You must provide one or the other, not both.",
340
+ };
341
+ throw new Error(messages[authState.status]);
342
+ }
343
+ const { message, userMessageText, debug = false, toolChoice } = options;
289
344
  // Capture pre-mutation state for auto thread name generation
290
345
  const existingThread = streamState.threadMap[apiThreadId ?? ""];
291
346
  const preMutationMessageCount = existingThread?.thread.messages.length ?? 0;
292
347
  const threadAlreadyHasTitle = !!existingThread?.thread.title;
293
348
  const toolTracker = new tool_call_tracker_1.ToolCallTracker();
349
+ const throttledStreamable = (0, tool_executor_1.createThrottledStreamableExecutor)(toolTracker, registry.toolRegistry);
294
350
  // Generate a stable message ID for the user message
295
351
  const userMessageId = userMessageText
296
352
  ? `user_msg_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`
@@ -311,6 +367,7 @@ function useTamboV1SendMessage(threadId) {
311
367
  additionalContext[helperContext.name] = helperContext.context;
312
368
  }
313
369
  // Create the run stream
370
+ // Include initialMessages only on first send (new thread creation)
314
371
  const { stream, initialThreadId } = await createRunStream({
315
372
  client,
316
373
  threadId: apiThreadId,
@@ -319,6 +376,8 @@ function useTamboV1SendMessage(threadId) {
319
376
  userKey,
320
377
  previousRunId,
321
378
  additionalContext,
379
+ toolChoice,
380
+ initialMessages: isNewThread ? initialMessages : undefined,
322
381
  });
323
382
  let actualThreadId = initialThreadId;
324
383
  let runId;
@@ -348,7 +407,20 @@ function useTamboV1SendMessage(threadId) {
348
407
  throw new Error(`Expected first event to be RUN_STARTED with threadId, got: ${event.type}`);
349
408
  }
350
409
  toolTracker.handleEvent(event);
351
- dispatch({ type: "EVENT", event, threadId: actualThreadId });
410
+ // Parse partial JSON once for TOOL_CALL_ARGS — reused by both dispatch and streamable execution
411
+ const parsedToolArgs = event.type === core_1.EventType.TOOL_CALL_ARGS
412
+ ? parseToolCallArgs(toolTracker, event.toolCallId)
413
+ : undefined;
414
+ dispatch({
415
+ type: "EVENT",
416
+ event,
417
+ threadId: actualThreadId,
418
+ parsedToolArgs,
419
+ });
420
+ // Schedule debounced streamable tool execution with the same pre-parsed args
421
+ if (parsedToolArgs && event.type === core_1.EventType.TOOL_CALL_ARGS) {
422
+ throttledStreamable.schedule(event.toolCallId, parsedToolArgs);
423
+ }
352
424
  // Check for awaiting_input - if found, break to execute tools
353
425
  if (event.type === core_1.EventType.CUSTOM) {
354
426
  const customEvent = (0, event_1.asTamboCustomEvent)(event);
@@ -358,6 +430,8 @@ function useTamboV1SendMessage(threadId) {
358
430
  }
359
431
  }
360
432
  }
433
+ // Flush any pending debounced streamable calls before continuing
434
+ throttledStreamable.flush();
361
435
  // If stream finished without awaiting_input, we're done
362
436
  if (!pendingAwaitingInput) {
363
437
  break;
@@ -376,6 +450,7 @@ function useTamboV1SendMessage(threadId) {
376
450
  runId,
377
451
  userKey,
378
452
  additionalContext,
453
+ toolChoice,
379
454
  });
380
455
  dispatchToolResults(dispatch, actualThreadId, toolResults);
381
456
  currentStream = continuationStream;
@@ -414,7 +489,7 @@ function useTamboV1SendMessage(threadId) {
414
489
  }
415
490
  },
416
491
  onError: (error) => {
417
- console.error("[useTamboV1SendMessage] Mutation failed:", error);
492
+ console.error("[useTamboSendMessage] Mutation failed:", error);
418
493
  },
419
494
  });
420
495
  }
@@ -1 +1 @@
1
- {"version":3,"file":"use-tambo-v1-send-message.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-send-message.ts"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\n/**\n * Send Message Hook for v1 API\n *\n * React Query mutation hook for sending messages and handling streaming responses.\n */\n\nimport React, { useContext } from \"react\";\nimport { EventType, type RunErrorEvent } from \"@ag-ui/core\";\nimport { asTamboCustomEvent, type RunAwaitingInputEvent } from \"../types/event\";\nimport type TamboAI from \"@tambo-ai/typescript-sdk\";\nimport type { Stream } from \"@tambo-ai/typescript-sdk/core/streaming\";\nimport {\n useTamboClient,\n useTamboQueryClient,\n} from \"../../providers/tambo-client-provider\";\nimport { useTamboMutation } from \"../../hooks/react-query-hooks\";\nimport {\n TamboRegistryContext,\n type TamboRegistryContext as TamboRegistry,\n} from \"../../providers/tambo-registry-provider\";\nimport {\n useStreamDispatch,\n useStreamState,\n} from \"../providers/tambo-v1-stream-context\";\nimport { useTamboV1Config } from \"../providers/tambo-v1-provider\";\nimport { useTamboContextHelpers } from \"../../providers/tambo-context-helpers-provider\";\nimport type { InputMessage } from \"../types/message\";\nimport {\n isPlaceholderThreadId,\n type StreamAction,\n} from \"../utils/event-accumulator\";\nimport {\n toAvailableComponents,\n toAvailableTools,\n} from \"../utils/registry-conversion\";\nimport { handleEventStream } from \"../utils/stream-handler\";\nimport { executeAllPendingTools } from \"../utils/tool-executor\";\nimport type { ToolResultContent } from \"@tambo-ai/typescript-sdk/resources/threads/threads\";\nimport { ToolCallTracker } from \"../utils/tool-call-tracker\";\n\n/**\n * Dispatches synthetic AG-UI events to show a user message in the thread.\n * @param dispatch - Stream state dispatcher\n * @param targetThreadId - Thread to add the message to\n * @param messageId - Stable ID for the user message\n * @param messageText - Text content of the message\n */\nfunction dispatchUserMessage(\n dispatch: React.Dispatch<StreamAction>,\n targetThreadId: string,\n messageId: string,\n messageText: string,\n): void {\n dispatch({\n type: \"EVENT\",\n threadId: targetThreadId,\n event: {\n type: EventType.TEXT_MESSAGE_START,\n messageId,\n role: \"user\" as const,\n },\n });\n\n dispatch({\n type: \"EVENT\",\n threadId: targetThreadId,\n event: {\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId,\n delta: messageText,\n },\n });\n\n dispatch({\n type: \"EVENT\",\n threadId: targetThreadId,\n event: {\n type: EventType.TEXT_MESSAGE_END,\n messageId,\n },\n });\n}\n\n/**\n * Dispatches synthetic events for tool results as optimistic local state.\n * The server doesn't echo these back for client-side tools.\n * @param dispatch - Stream state dispatcher\n * @param targetThreadId - Thread to add results to\n * @param toolResults - Tool execution results to dispatch\n */\nfunction dispatchToolResults(\n dispatch: React.Dispatch<StreamAction>,\n targetThreadId: string,\n toolResults: ToolResultContent[],\n): void {\n if (toolResults.length === 0) return;\n\n const toolResultMessageId = `msg_tool_result_${Date.now()}`;\n\n dispatch({\n type: \"EVENT\",\n threadId: targetThreadId,\n event: {\n type: EventType.TEXT_MESSAGE_START,\n messageId: toolResultMessageId,\n role: \"user\" as const,\n },\n });\n\n for (const result of toolResults) {\n dispatch({\n type: \"EVENT\",\n threadId: targetThreadId,\n event: {\n type: EventType.TOOL_CALL_RESULT,\n toolCallId: result.toolUseId,\n messageId: toolResultMessageId,\n content:\n result.content\n .filter((c) => c.type === \"text\")\n .map((c) => (c as { type: \"text\"; text: string }).text)\n .join(\"\") || JSON.stringify(result.content),\n },\n });\n }\n\n dispatch({\n type: \"EVENT\",\n threadId: targetThreadId,\n event: {\n type: EventType.TEXT_MESSAGE_END,\n messageId: toolResultMessageId,\n },\n });\n}\n\n/**\n * Checks whether a thread name should be auto-generated based on config\n * and the current thread state.\n * @param threadId - The thread ID (undefined or placeholder means no)\n * @param threadAlreadyHasTitle - Whether the thread already has a title\n * @param preMutationMessageCount - Message count before the current mutation\n * @param autoGenerateNameThreshold - Minimum message count to trigger generation\n * @returns Whether to generate a thread name\n */\nfunction shouldGenerateThreadName(\n threadId: string | undefined,\n threadAlreadyHasTitle: boolean,\n preMutationMessageCount: number,\n autoGenerateNameThreshold: number,\n): threadId is string {\n return (\n !threadAlreadyHasTitle &&\n !!threadId &&\n !isPlaceholderThreadId(threadId) &&\n // +2 accounts for the user message and assistant response just added\n preMutationMessageCount + 2 >= autoGenerateNameThreshold\n );\n}\n\n/**\n * Generates a thread name via the beta API, dispatches the title update,\n * and invalidates the thread list cache. Errors are logged, never thrown.\n * @param client - The Tambo API client\n * @param dispatch - Stream state dispatcher\n * @param queryClient - React Query client for cache invalidation\n * @param threadId - The thread to generate a name for\n */\nasync function generateThreadName(\n client: TamboAI,\n dispatch: React.Dispatch<StreamAction>,\n queryClient: ReturnType<typeof useTamboQueryClient>,\n threadId: string,\n): Promise<void> {\n try {\n const threadWithName = await client.beta.threads.generateName(threadId);\n if (threadWithName.name) {\n dispatch({\n type: \"UPDATE_THREAD_TITLE\",\n threadId,\n title: threadWithName.name,\n });\n await queryClient.invalidateQueries({\n queryKey: [\"v1-threads\", \"list\"],\n });\n }\n } catch (error) {\n console.error(\n \"[useTamboV1SendMessage] Failed to auto-generate thread name:\",\n error,\n );\n }\n}\n\n/**\n * Options for sending a message\n */\nexport interface SendMessageOptions {\n /**\n * The message to send\n */\n message: InputMessage;\n\n /**\n * User message text for optimistic display.\n * If provided, synthetic AG-UI events will be dispatched to show\n * the user message in the thread immediately after getting the threadId.\n */\n userMessageText?: string;\n\n /**\n * Enable debug logging for the stream\n */\n debug?: boolean;\n}\n\n/**\n * Parameters for creating a run stream\n */\nexport interface CreateRunStreamParams {\n client: TamboAI;\n threadId: string | undefined;\n message: InputMessage;\n registry: TamboRegistry;\n userKey: string | undefined;\n /**\n * Previous run ID for continuing a thread with existing messages.\n * Required when threadId is provided and the thread has previous runs.\n */\n previousRunId: string | undefined;\n /**\n * Additional context gathered from context helpers (including interactables).\n * Merged into the message's additionalContext before sending.\n */\n additionalContext?: Record<string, unknown>;\n}\n\n/**\n * Stream types from the SDK\n */\ntype RunStream = Stream<TamboAI.Threads.Runs.RunRunResponse>;\ntype CreateStream = Stream<TamboAI.Threads.Runs.RunCreateResponse>;\n\n/**\n * Result from creating a run stream\n */\nexport interface CreateRunStreamResult {\n stream: RunStream | CreateStream;\n initialThreadId: string | undefined;\n}\n\n/**\n * Parameters for executing tools and continuing the run\n */\ninterface ExecuteToolsParams {\n event: RunAwaitingInputEvent;\n toolTracker: ToolCallTracker;\n registry: TamboRegistry;\n client: TamboAI;\n threadId: string;\n runId: string;\n userKey: string | undefined;\n additionalContext?: Record<string, unknown>;\n}\n\n/**\n * Result from executing tools and continuing the run\n */\ninterface ExecuteToolsResult {\n stream: RunStream;\n toolResults: ToolResultContent[];\n}\n\n/**\n * Executes pending tools and returns a continuation stream.\n *\n * This function does NOT process the continuation stream - it just executes\n * the tools and returns the new stream for the caller to process. This enables\n * the flat loop pattern that correctly handles multi-round tool execution.\n * @param params - The parameters for tool execution\n * @returns The continuation stream and tool results for optimistic local state updates\n */\nasync function executeToolsAndContinue(\n params: ExecuteToolsParams,\n): Promise<ExecuteToolsResult> {\n const {\n event,\n toolTracker,\n registry,\n client,\n threadId,\n runId,\n userKey,\n additionalContext,\n } = params;\n\n const pendingToolCallIds = event.value.pendingToolCalls.map(\n (tc) => tc.toolCallId,\n );\n const toolCallsToExecute = toolTracker.getToolCallsById(pendingToolCallIds);\n\n // Execute tools\n const toolResults = await executeAllPendingTools(\n toolCallsToExecute,\n registry.toolRegistry,\n );\n\n // Clear executed tool calls before continuing\n toolTracker.clearToolCalls(pendingToolCallIds);\n\n // Return the continuation stream and tool results\n const stream = await client.threads.runs.run(threadId, {\n message: {\n role: \"user\",\n content: toolResults,\n additionalContext,\n },\n previousRunId: runId,\n availableComponents: toAvailableComponents(registry.componentList),\n tools: toAvailableTools(registry.toolRegistry),\n userKey,\n });\n\n return { stream, toolResults };\n}\n\n/**\n * Creates a run stream by calling the appropriate API method.\n *\n * If threadId is provided, runs on existing thread via client.threads.runs.run().\n * If no threadId, creates new thread via client.threads.runs.create().\n * @param params - The parameters for creating the run stream\n * @returns The stream and initial thread ID (undefined if creating new thread)\n */\nexport async function createRunStream(\n params: CreateRunStreamParams,\n): Promise<CreateRunStreamResult> {\n const {\n client,\n threadId,\n message,\n registry,\n userKey,\n previousRunId,\n additionalContext,\n } = params;\n\n // Merge helper context with any caller-provided additionalContext on the message\n const mergedContext =\n additionalContext || message.additionalContext\n ? {\n ...((message.additionalContext as Record<string, unknown>) ?? {}),\n ...additionalContext,\n }\n : undefined;\n const messageWithContext: InputMessage = mergedContext\n ? { ...message, additionalContext: mergedContext }\n : message;\n\n // Convert registry components/tools to v1 API format\n const availableComponents = toAvailableComponents(registry.componentList);\n const availableTools = toAvailableTools(registry.toolRegistry);\n\n if (threadId) {\n // Run on existing thread\n const stream = await client.threads.runs.run(threadId, {\n message: messageWithContext,\n availableComponents,\n tools: availableTools,\n userKey,\n previousRunId,\n });\n return { stream, initialThreadId: threadId };\n } else {\n // Create new thread\n const stream = await client.threads.runs.create({\n message: messageWithContext,\n availableComponents,\n tools: availableTools,\n thread: userKey ? { userKey } : undefined,\n });\n // threadId will be extracted from first event (RUN_STARTED)\n return { stream, initialThreadId: undefined };\n }\n}\n\n/**\n * Hook to send a message and handle streaming responses.\n *\n * This hook handles two scenarios:\n * - If threadId provided: runs on existing thread via client.threads.runs.run()\n * - If no threadId: creates new thread via client.threads.runs.create()\n *\n * The hook:\n * - Sends a user message to the API\n * - Streams AG-UI events in real-time\n * - Dispatches events to the stream reducer\n * - Extracts threadId from events when creating new thread\n * - Handles tool execution (Phase 6)\n * - Invalidates thread queries on completion\n * @param threadId - Optional thread ID to send message to. If not provided, creates new thread\n * @returns React Query mutation object with threadId in mutation result\n * @example\n * ```tsx\n * function ChatInput({ threadId }: { threadId?: string }) {\n * const sendMessage = useTamboV1SendMessage(threadId);\n *\n * const handleSubmit = async (text: string) => {\n * const result = await sendMessage.mutateAsync({\n * message: {\n * role: \"user\",\n * content: [{ type: \"text\", text }],\n * },\n * });\n *\n * // If threadId wasn't provided, a new thread was created\n * if (!threadId) {\n * console.log(\"Created thread:\", result.threadId);\n * }\n * };\n *\n * return (\n * <div>\n * <input onSubmit={handleSubmit} />\n * {sendMessage.isPending && <Spinner />}\n * </div>\n * );\n * }\n * ```\n */\nexport function useTamboV1SendMessage(threadId?: string) {\n const client = useTamboClient();\n const dispatch = useStreamDispatch();\n const streamState = useStreamState();\n const {\n userKey,\n autoGenerateThreadName = true,\n autoGenerateNameThreshold = 3,\n } = useTamboV1Config();\n const registry = useContext(TamboRegistryContext);\n const queryClient = useTamboQueryClient();\n const { getAdditionalContext } = useTamboContextHelpers();\n\n if (!registry) {\n throw new Error(\n \"useTamboV1SendMessage must be used within TamboRegistryProvider\",\n );\n }\n\n // Placeholder ID isn't a valid API thread ID - treat as new thread creation\n const isNewThread = isPlaceholderThreadId(threadId);\n const apiThreadId = isNewThread ? undefined : threadId;\n\n // Get previousRunId from the thread's streaming state (if thread exists and has messages)\n const threadState = apiThreadId\n ? streamState.threadMap[apiThreadId]\n : undefined;\n const previousRunId = threadState?.streaming.runId;\n\n return useTamboMutation({\n mutationFn: async (options: SendMessageOptions) => {\n const { message, userMessageText, debug = false } = options;\n\n // Capture pre-mutation state for auto thread name generation\n const existingThread = streamState.threadMap[apiThreadId ?? \"\"];\n const preMutationMessageCount =\n existingThread?.thread.messages.length ?? 0;\n const threadAlreadyHasTitle = !!existingThread?.thread.title;\n\n const toolTracker = new ToolCallTracker();\n\n // Generate a stable message ID for the user message\n const userMessageId = userMessageText\n ? `user_msg_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`\n : undefined;\n\n // Add user message immediately for instant feedback\n // Use threadId (which could be temp_xxx for new threads) for display\n if (threadId && userMessageText && userMessageId) {\n dispatchUserMessage(dispatch, threadId, userMessageId, userMessageText);\n }\n\n // Gather additional context from all registered context helpers.\n // TODO: This snapshot is captured once and reused for the entire multi-round\n // tool loop. If interactables change during streaming (e.g. user interactions),\n // continuations will send stale context. Re-gather before each continuation\n // if freshness matters.\n const helperContexts = await getAdditionalContext();\n const additionalContext: Record<string, unknown> = {};\n for (const helperContext of helperContexts) {\n additionalContext[helperContext.name] = helperContext.context;\n }\n\n // Create the run stream\n const { stream, initialThreadId } = await createRunStream({\n client,\n threadId: apiThreadId,\n message,\n registry,\n userKey,\n previousRunId,\n additionalContext,\n });\n\n let actualThreadId = initialThreadId;\n let runId: string | undefined;\n let currentStream: CreateRunStreamResult[\"stream\"] = stream;\n\n try {\n // Outer loop handles stream replacement for multi-round tool execution.\n // When we hit awaiting_input, we execute tools, get a new stream, and continue.\n // This flat loop pattern correctly handles tool→AI→tool→AI chains.\n while (true) {\n let pendingAwaitingInput: RunAwaitingInputEvent | undefined;\n\n // Process current stream until completion or awaiting_input\n for await (const event of handleEventStream(currentStream, {\n debug,\n })) {\n // Extract threadId and runId from RUN_STARTED event\n if (event.type === EventType.RUN_STARTED) {\n runId = event.runId;\n actualThreadId ??= event.threadId;\n\n // For threads with no ID at all: add user message now that we have the real threadId\n // Note: temp thread migration (temp_xxx -> real ID) is handled automatically\n // by the reducer when it sees RUN_STARTED with a different threadId\n if (!threadId && userMessageText && userMessageId) {\n dispatchUserMessage(\n dispatch,\n actualThreadId,\n userMessageId,\n userMessageText,\n );\n }\n } else if (!actualThreadId) {\n throw new Error(\n `Expected first event to be RUN_STARTED with threadId, got: ${event.type}`,\n );\n }\n\n toolTracker.handleEvent(event);\n dispatch({ type: \"EVENT\", event, threadId: actualThreadId });\n\n // Check for awaiting_input - if found, break to execute tools\n if (event.type === EventType.CUSTOM) {\n const customEvent = asTamboCustomEvent(event);\n if (customEvent?.name === \"tambo.run.awaiting_input\") {\n pendingAwaitingInput = customEvent;\n break; // Exit stream loop to handle tool execution\n }\n }\n }\n\n // If stream finished without awaiting_input, we're done\n if (!pendingAwaitingInput) {\n break;\n }\n\n // Execute tools and get continuation stream\n // These checks should never fail since awaiting_input comes after RUN_STARTED\n if (!runId || !actualThreadId) {\n throw new Error(\n \"Cannot continue run after awaiting_input: missing runId or threadId\",\n );\n }\n\n const { stream: continuationStream, toolResults } =\n await executeToolsAndContinue({\n event: pendingAwaitingInput,\n toolTracker,\n registry,\n client,\n threadId: actualThreadId,\n runId,\n userKey,\n additionalContext,\n });\n\n dispatchToolResults(dispatch, actualThreadId, toolResults);\n\n currentStream = continuationStream;\n }\n\n return {\n threadId: actualThreadId,\n preMutationMessageCount,\n threadAlreadyHasTitle,\n };\n } catch (error) {\n // Dispatch a synthetic RUN_ERROR event to clean up thread state\n // This ensures the thread doesn't stay stuck in \"streaming\" status\n if (actualThreadId) {\n const errorMessage =\n error instanceof Error ? error.message : \"Unknown streaming error\";\n const errorEvent: RunErrorEvent = {\n type: EventType.RUN_ERROR,\n message: errorMessage,\n };\n dispatch({\n type: \"EVENT\",\n event: errorEvent,\n threadId: actualThreadId,\n });\n }\n throw error;\n }\n },\n onSuccess: async (result) => {\n await queryClient.invalidateQueries({\n queryKey: [\"v1-threads\", result.threadId],\n });\n\n if (\n autoGenerateThreadName &&\n shouldGenerateThreadName(\n result.threadId,\n result.threadAlreadyHasTitle,\n result.preMutationMessageCount,\n autoGenerateNameThreshold,\n )\n ) {\n await generateThreadName(\n client,\n dispatch,\n queryClient,\n result.threadId,\n );\n }\n },\n onError: (error) => {\n console.error(\"[useTamboV1SendMessage] Mutation failed:\", error);\n },\n });\n}\n"]}
1
+ {"version":3,"file":"use-tambo-v1-send-message.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-send-message.ts"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\n/**\n * Send Message Hook\n *\n * React Query mutation hook for sending messages and handling streaming responses.\n */\n\nimport React, { useContext } from \"react\";\nimport { EventType, type RunErrorEvent } from \"@ag-ui/core\";\nimport { asTamboCustomEvent, type RunAwaitingInputEvent } from \"../types/event\";\nimport type TamboAI from \"@tambo-ai/typescript-sdk\";\nimport type { Stream } from \"@tambo-ai/typescript-sdk/core/streaming\";\nimport {\n useTamboClient,\n useTamboQueryClient,\n} from \"../../providers/tambo-client-provider\";\nimport { useTamboMutation } from \"../../hooks/react-query-hooks\";\nimport {\n TamboRegistryContext,\n type TamboRegistryContext as TamboRegistry,\n} from \"../../providers/tambo-registry-provider\";\nimport {\n useStreamDispatch,\n useStreamState,\n} from \"../providers/tambo-v1-stream-context\";\nimport { useTamboConfig } from \"../providers/tambo-v1-provider\";\nimport { useTamboAuthState } from \"./use-tambo-v1-auth-state\";\nimport { useTamboContextHelpers } from \"../../providers/tambo-context-helpers-provider\";\nimport type { InitialInputMessage, InputMessage } from \"../types/message\";\nimport type { ToolChoice } from \"../types/tool-choice\";\nimport {\n isPlaceholderThreadId,\n type StreamAction,\n} from \"../utils/event-accumulator\";\nimport {\n toAvailableComponents,\n toAvailableTools,\n} from \"../utils/registry-conversion\";\nimport { handleEventStream } from \"../utils/stream-handler\";\nimport {\n executeAllPendingTools,\n createThrottledStreamableExecutor,\n} from \"../utils/tool-executor\";\nimport type { ToolResultContent } from \"@tambo-ai/typescript-sdk/resources/threads/threads\";\nimport type { RunCreateParams } from \"@tambo-ai/typescript-sdk/resources/threads/runs\";\nimport { ToolCallTracker } from \"../utils/tool-call-tracker\";\nimport { parse as parsePartialJson } from \"partial-json\";\n\n/**\n * Dispatches synthetic AG-UI events to show a user message in the thread.\n * @param dispatch - Stream state dispatcher\n * @param targetThreadId - Thread to add the message to\n * @param messageId - Stable ID for the user message\n * @param messageText - Text content of the message\n */\nfunction dispatchUserMessage(\n dispatch: React.Dispatch<StreamAction>,\n targetThreadId: string,\n messageId: string,\n messageText: string,\n): void {\n dispatch({\n type: \"EVENT\",\n threadId: targetThreadId,\n event: {\n type: EventType.TEXT_MESSAGE_START,\n messageId,\n role: \"user\" as const,\n },\n });\n\n dispatch({\n type: \"EVENT\",\n threadId: targetThreadId,\n event: {\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId,\n delta: messageText,\n },\n });\n\n dispatch({\n type: \"EVENT\",\n threadId: targetThreadId,\n event: {\n type: EventType.TEXT_MESSAGE_END,\n messageId,\n },\n });\n}\n\n/**\n * Dispatches synthetic events for tool results as optimistic local state.\n * The server doesn't echo these back for client-side tools.\n * @param dispatch - Stream state dispatcher\n * @param targetThreadId - Thread to add results to\n * @param toolResults - Tool execution results to dispatch\n */\nfunction dispatchToolResults(\n dispatch: React.Dispatch<StreamAction>,\n targetThreadId: string,\n toolResults: ToolResultContent[],\n): void {\n if (toolResults.length === 0) return;\n\n const toolResultMessageId = `msg_tool_result_${Date.now()}`;\n\n dispatch({\n type: \"EVENT\",\n threadId: targetThreadId,\n event: {\n type: EventType.TEXT_MESSAGE_START,\n messageId: toolResultMessageId,\n role: \"user\" as const,\n },\n });\n\n for (const result of toolResults) {\n dispatch({\n type: \"EVENT\",\n threadId: targetThreadId,\n event: {\n type: EventType.TOOL_CALL_RESULT,\n toolCallId: result.toolUseId,\n messageId: toolResultMessageId,\n content:\n result.content\n .filter((c) => c.type === \"text\")\n .map((c) => (c as { type: \"text\"; text: string }).text)\n .join(\"\") || JSON.stringify(result.content),\n },\n });\n }\n\n dispatch({\n type: \"EVENT\",\n threadId: targetThreadId,\n event: {\n type: EventType.TEXT_MESSAGE_END,\n messageId: toolResultMessageId,\n },\n });\n}\n\n/**\n * Checks whether a thread name should be auto-generated based on config\n * and the current thread state.\n * @param threadId - The thread ID (undefined or placeholder means no)\n * @param threadAlreadyHasTitle - Whether the thread already has a title\n * @param preMutationMessageCount - Message count before the current mutation\n * @param autoGenerateNameThreshold - Minimum message count to trigger generation\n * @returns Whether to generate a thread name\n */\nfunction shouldGenerateThreadName(\n threadId: string | undefined,\n threadAlreadyHasTitle: boolean,\n preMutationMessageCount: number,\n autoGenerateNameThreshold: number,\n): threadId is string {\n return (\n !threadAlreadyHasTitle &&\n !!threadId &&\n !isPlaceholderThreadId(threadId) &&\n // +2 accounts for the user message and assistant response just added\n preMutationMessageCount + 2 >= autoGenerateNameThreshold\n );\n}\n\n/**\n * Attempts to parse partial JSON from accumulated tool call args.\n *\n * Returns a parsed object if the accumulated args are parseable as\n * a JSON object, or undefined if parsing fails or the result is not\n * a plain object (e.g. array or primitive).\n * @param toolTracker - Tracker holding pending tool call state\n * @param toolCallId - The tool call ID to parse args for\n * @returns Parsed args object, or undefined if not parseable yet\n */\nfunction parseToolCallArgs(\n toolTracker: ToolCallTracker,\n toolCallId: string,\n): Record<string, unknown> | undefined {\n const accToolCall = toolTracker.getAccumulatingToolCall(toolCallId);\n if (!accToolCall) return undefined;\n\n try {\n const parsed: unknown = parsePartialJson(accToolCall.accumulatedArgs);\n if (\n typeof parsed === \"object\" &&\n parsed !== null &&\n !Array.isArray(parsed)\n ) {\n return parsed as Record<string, unknown>;\n }\n } catch {\n /* not parseable yet */\n }\n return undefined;\n}\n\n/**\n * Generates a thread name via the beta API, dispatches the title update,\n * and invalidates the thread list cache. Errors are logged, never thrown.\n * @param client - The Tambo API client\n * @param dispatch - Stream state dispatcher\n * @param queryClient - React Query client for cache invalidation\n * @param threadId - The thread to generate a name for\n */\nasync function generateThreadName(\n client: TamboAI,\n dispatch: React.Dispatch<StreamAction>,\n queryClient: ReturnType<typeof useTamboQueryClient>,\n threadId: string,\n): Promise<void> {\n try {\n const threadWithName = await client.beta.threads.generateName(threadId);\n if (threadWithName.name) {\n dispatch({\n type: \"UPDATE_THREAD_TITLE\",\n threadId,\n title: threadWithName.name,\n });\n await queryClient.invalidateQueries({\n queryKey: [\"v1-threads\", \"list\"],\n });\n }\n } catch (error) {\n console.error(\n \"[useTamboSendMessage] Failed to auto-generate thread name:\",\n error,\n );\n }\n}\n\n/**\n * Options for sending a message\n */\nexport interface SendMessageOptions {\n /**\n * The message to send\n */\n message: InputMessage;\n\n /**\n * User message text for optimistic display.\n * If provided, synthetic AG-UI events will be dispatched to show\n * the user message in the thread immediately after getting the threadId.\n */\n userMessageText?: string;\n\n /**\n * Enable debug logging for the stream\n */\n debug?: boolean;\n\n /**\n * How the model should use tools. Defaults to \"auto\".\n * - \"auto\": Model decides whether to use tools\n * - \"required\": Model must use at least one tool\n * - \"none\": Model cannot use tools\n * - { name: \"toolName\" }: Model must use the specified tool\n */\n toolChoice?: ToolChoice;\n}\n\n/**\n * Parameters for creating a run stream\n */\nexport interface CreateRunStreamParams {\n client: TamboAI;\n threadId: string | undefined;\n message: InputMessage;\n registry: TamboRegistry;\n userKey: string | undefined;\n /**\n * Previous run ID for continuing a thread with existing messages.\n * Required when threadId is provided and the thread has previous runs.\n */\n previousRunId: string | undefined;\n /**\n * Additional context gathered from context helpers (including interactables).\n * Merged into the message's additionalContext before sending.\n */\n additionalContext?: Record<string, unknown>;\n /**\n * How the model should use tools.\n */\n toolChoice?: ToolChoice;\n /**\n * Initial messages to seed the thread with when creating a new thread.\n * Only used when threadId is undefined (new thread creation).\n */\n initialMessages?: InitialInputMessage[];\n}\n\n/**\n * Stream types from the SDK\n */\ntype RunStream = Stream<TamboAI.Threads.Runs.RunRunResponse>;\ntype CreateStream = Stream<TamboAI.Threads.Runs.RunCreateResponse>;\n\n/**\n * Result from creating a run stream\n */\nexport interface CreateRunStreamResult {\n stream: RunStream | CreateStream;\n initialThreadId: string | undefined;\n}\n\n/**\n * Parameters for executing tools and continuing the run\n */\ninterface ExecuteToolsParams {\n event: RunAwaitingInputEvent;\n toolTracker: ToolCallTracker;\n registry: TamboRegistry;\n client: TamboAI;\n threadId: string;\n runId: string;\n userKey: string | undefined;\n additionalContext?: Record<string, unknown>;\n toolChoice?: ToolChoice;\n}\n\n/**\n * Result from executing tools and continuing the run\n */\ninterface ExecuteToolsResult {\n stream: RunStream;\n toolResults: ToolResultContent[];\n}\n\n/**\n * Executes pending tools and returns a continuation stream.\n *\n * This function does NOT process the continuation stream - it just executes\n * the tools and returns the new stream for the caller to process. This enables\n * the flat loop pattern that correctly handles multi-round tool execution.\n * @param params - The parameters for tool execution\n * @returns The continuation stream and tool results for optimistic local state updates\n */\nasync function executeToolsAndContinue(\n params: ExecuteToolsParams,\n): Promise<ExecuteToolsResult> {\n const {\n event,\n toolTracker,\n registry,\n client,\n threadId,\n runId,\n userKey,\n additionalContext,\n toolChoice,\n } = params;\n\n const pendingToolCallIds = event.value.pendingToolCalls.map(\n (tc) => tc.toolCallId,\n );\n const toolCallsToExecute = toolTracker.getToolCallsById(pendingToolCallIds);\n\n // Execute tools\n const toolResults = await executeAllPendingTools(\n toolCallsToExecute,\n registry.toolRegistry,\n );\n\n // Clear executed tool calls before continuing\n toolTracker.clearToolCalls(pendingToolCallIds);\n\n // Return the continuation stream and tool results\n const stream = await client.threads.runs.run(threadId, {\n message: {\n role: \"user\",\n content: toolResults,\n additionalContext,\n },\n previousRunId: runId,\n availableComponents: toAvailableComponents(registry.componentList),\n tools: toAvailableTools(registry.toolRegistry),\n userKey,\n toolChoice,\n });\n\n return { stream, toolResults };\n}\n\n/**\n * Creates a run stream by calling the appropriate API method.\n *\n * If threadId is provided, runs on existing thread via client.threads.runs.run().\n * If no threadId, creates new thread via client.threads.runs.create().\n * @param params - The parameters for creating the run stream\n * @returns The stream and initial thread ID (undefined if creating new thread)\n */\nexport async function createRunStream(\n params: CreateRunStreamParams,\n): Promise<CreateRunStreamResult> {\n const {\n client,\n threadId,\n message,\n registry,\n userKey,\n previousRunId,\n additionalContext,\n toolChoice,\n initialMessages,\n } = params;\n\n // Merge helper context with any caller-provided additionalContext on the message\n const mergedContext =\n additionalContext || message.additionalContext\n ? {\n ...((message.additionalContext as Record<string, unknown>) ?? {}),\n ...additionalContext,\n }\n : undefined;\n const messageWithContext: InputMessage = mergedContext\n ? { ...message, additionalContext: mergedContext }\n : message;\n\n // Convert registry components/tools to API format\n const availableComponents = toAvailableComponents(registry.componentList);\n const availableTools = toAvailableTools(registry.toolRegistry);\n\n if (threadId) {\n // Run on existing thread\n const stream = await client.threads.runs.run(threadId, {\n message: messageWithContext,\n availableComponents,\n tools: availableTools,\n userKey,\n previousRunId,\n toolChoice,\n });\n return { stream, initialThreadId: threadId };\n } else {\n // Create new thread - include initialMessages if provided\n const threadConfig: RunCreateParams.Thread = {};\n if (userKey) {\n threadConfig.userKey = userKey;\n }\n if (initialMessages?.length) {\n threadConfig.initialMessages = initialMessages;\n }\n\n const stream = await client.threads.runs.create({\n message: messageWithContext,\n availableComponents,\n tools: availableTools,\n thread: Object.keys(threadConfig).length > 0 ? threadConfig : undefined,\n toolChoice,\n });\n // threadId will be extracted from first event (RUN_STARTED)\n return { stream, initialThreadId: undefined };\n }\n}\n\n/**\n * Hook to send a message and handle streaming responses.\n *\n * This hook handles two scenarios:\n * - If threadId provided: runs on existing thread via client.threads.runs.run()\n * - If no threadId: creates new thread via client.threads.runs.create()\n *\n * The hook:\n * - Sends a user message to the API\n * - Streams AG-UI events in real-time\n * - Dispatches events to the stream reducer\n * - Extracts threadId from events when creating new thread\n * - Handles tool execution (Phase 6)\n * - Invalidates thread queries on completion\n * @param threadId - Optional thread ID to send message to. If not provided, creates new thread\n * @returns React Query mutation object with threadId in mutation result\n * @example\n * ```tsx\n * function ChatInput({ threadId }: { threadId?: string }) {\n * const sendMessage = useTamboSendMessage(threadId);\n *\n * const handleSubmit = async (text: string) => {\n * const result = await sendMessage.mutateAsync({\n * message: {\n * role: \"user\",\n * content: [{ type: \"text\", text }],\n * },\n * });\n *\n * // If threadId wasn't provided, a new thread was created\n * if (!threadId) {\n * console.log(\"Created thread:\", result.threadId);\n * }\n * };\n *\n * return (\n * <div>\n * <input onSubmit={handleSubmit} />\n * {sendMessage.isPending && <Spinner />}\n * </div>\n * );\n * }\n * ```\n */\nexport function useTamboSendMessage(threadId?: string) {\n const client = useTamboClient();\n const dispatch = useStreamDispatch();\n const streamState = useStreamState();\n const {\n userKey,\n autoGenerateThreadName = true,\n autoGenerateNameThreshold = 3,\n initialMessages,\n } = useTamboConfig();\n const registry = useContext(TamboRegistryContext);\n const queryClient = useTamboQueryClient();\n const { getAdditionalContext } = useTamboContextHelpers();\n const authState = useTamboAuthState();\n\n if (!registry) {\n throw new Error(\n \"useTamboSendMessage must be used within TamboRegistryProvider\",\n );\n }\n\n // Placeholder ID isn't a valid API thread ID - treat as new thread creation\n const isNewThread = isPlaceholderThreadId(threadId);\n const apiThreadId = isNewThread ? undefined : threadId;\n\n // Get previousRunId from the thread's streaming state (active run) or\n // lastCompletedRunId (persisted after run finishes / loaded from API).\n // The latter is essential after page reload when streaming state is gone.\n const threadState = apiThreadId\n ? streamState.threadMap[apiThreadId]\n : undefined;\n const previousRunId =\n threadState?.streaming.runId ?? threadState?.lastCompletedRunId;\n\n return useTamboMutation({\n mutationFn: async (options: SendMessageOptions) => {\n if (authState.status !== \"identified\") {\n const messages: Record<string, string> = {\n unauthenticated:\n \"Cannot send message: no userKey or userToken provided. \" +\n \"Configure authentication in TamboProvider.\",\n exchanging:\n \"Cannot send message: token exchange is still in progress. \" +\n \"Wait for authentication to complete.\",\n error:\n \"Cannot send message: token exchange failed. \" +\n \"Check your userToken configuration.\",\n invalid:\n \"Cannot send message: both userKey and userToken were provided. \" +\n \"You must provide one or the other, not both.\",\n };\n throw new Error(messages[authState.status]);\n }\n\n const { message, userMessageText, debug = false, toolChoice } = options;\n\n // Capture pre-mutation state for auto thread name generation\n const existingThread = streamState.threadMap[apiThreadId ?? \"\"];\n const preMutationMessageCount =\n existingThread?.thread.messages.length ?? 0;\n const threadAlreadyHasTitle = !!existingThread?.thread.title;\n\n const toolTracker = new ToolCallTracker();\n const throttledStreamable = createThrottledStreamableExecutor(\n toolTracker,\n registry.toolRegistry,\n );\n\n // Generate a stable message ID for the user message\n const userMessageId = userMessageText\n ? `user_msg_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`\n : undefined;\n\n // Add user message immediately for instant feedback\n // Use threadId (which could be temp_xxx for new threads) for display\n if (threadId && userMessageText && userMessageId) {\n dispatchUserMessage(dispatch, threadId, userMessageId, userMessageText);\n }\n\n // Gather additional context from all registered context helpers.\n // TODO: This snapshot is captured once and reused for the entire multi-round\n // tool loop. If interactables change during streaming (e.g. user interactions),\n // continuations will send stale context. Re-gather before each continuation\n // if freshness matters.\n const helperContexts = await getAdditionalContext();\n const additionalContext: Record<string, unknown> = {};\n for (const helperContext of helperContexts) {\n additionalContext[helperContext.name] = helperContext.context;\n }\n\n // Create the run stream\n // Include initialMessages only on first send (new thread creation)\n const { stream, initialThreadId } = await createRunStream({\n client,\n threadId: apiThreadId,\n message,\n registry,\n userKey,\n previousRunId,\n additionalContext,\n toolChoice,\n initialMessages: isNewThread ? initialMessages : undefined,\n });\n\n let actualThreadId = initialThreadId;\n let runId: string | undefined;\n let currentStream: CreateRunStreamResult[\"stream\"] = stream;\n\n try {\n // Outer loop handles stream replacement for multi-round tool execution.\n // When we hit awaiting_input, we execute tools, get a new stream, and continue.\n // This flat loop pattern correctly handles tool→AI→tool→AI chains.\n while (true) {\n let pendingAwaitingInput: RunAwaitingInputEvent | undefined;\n\n // Process current stream until completion or awaiting_input\n for await (const event of handleEventStream(currentStream, {\n debug,\n })) {\n // Extract threadId and runId from RUN_STARTED event\n if (event.type === EventType.RUN_STARTED) {\n runId = event.runId;\n actualThreadId ??= event.threadId;\n\n // For threads with no ID at all: add user message now that we have the real threadId\n // Note: temp thread migration (temp_xxx -> real ID) is handled automatically\n // by the reducer when it sees RUN_STARTED with a different threadId\n if (!threadId && userMessageText && userMessageId) {\n dispatchUserMessage(\n dispatch,\n actualThreadId,\n userMessageId,\n userMessageText,\n );\n }\n } else if (!actualThreadId) {\n throw new Error(\n `Expected first event to be RUN_STARTED with threadId, got: ${event.type}`,\n );\n }\n\n toolTracker.handleEvent(event);\n\n // Parse partial JSON once for TOOL_CALL_ARGS — reused by both dispatch and streamable execution\n const parsedToolArgs =\n event.type === EventType.TOOL_CALL_ARGS\n ? parseToolCallArgs(toolTracker, event.toolCallId)\n : undefined;\n\n dispatch({\n type: \"EVENT\",\n event,\n threadId: actualThreadId,\n parsedToolArgs,\n });\n\n // Schedule debounced streamable tool execution with the same pre-parsed args\n if (parsedToolArgs && event.type === EventType.TOOL_CALL_ARGS) {\n throttledStreamable.schedule(event.toolCallId, parsedToolArgs);\n }\n\n // Check for awaiting_input - if found, break to execute tools\n if (event.type === EventType.CUSTOM) {\n const customEvent = asTamboCustomEvent(event);\n if (customEvent?.name === \"tambo.run.awaiting_input\") {\n pendingAwaitingInput = customEvent;\n break; // Exit stream loop to handle tool execution\n }\n }\n }\n\n // Flush any pending debounced streamable calls before continuing\n throttledStreamable.flush();\n\n // If stream finished without awaiting_input, we're done\n if (!pendingAwaitingInput) {\n break;\n }\n\n // Execute tools and get continuation stream\n // These checks should never fail since awaiting_input comes after RUN_STARTED\n if (!runId || !actualThreadId) {\n throw new Error(\n \"Cannot continue run after awaiting_input: missing runId or threadId\",\n );\n }\n\n const { stream: continuationStream, toolResults } =\n await executeToolsAndContinue({\n event: pendingAwaitingInput,\n toolTracker,\n registry,\n client,\n threadId: actualThreadId,\n runId,\n userKey,\n additionalContext,\n toolChoice,\n });\n\n dispatchToolResults(dispatch, actualThreadId, toolResults);\n\n currentStream = continuationStream;\n }\n\n return {\n threadId: actualThreadId,\n preMutationMessageCount,\n threadAlreadyHasTitle,\n };\n } catch (error) {\n // Dispatch a synthetic RUN_ERROR event to clean up thread state\n // This ensures the thread doesn't stay stuck in \"streaming\" status\n if (actualThreadId) {\n const errorMessage =\n error instanceof Error ? error.message : \"Unknown streaming error\";\n const errorEvent: RunErrorEvent = {\n type: EventType.RUN_ERROR,\n message: errorMessage,\n };\n dispatch({\n type: \"EVENT\",\n event: errorEvent,\n threadId: actualThreadId,\n });\n }\n throw error;\n }\n },\n onSuccess: async (result) => {\n await queryClient.invalidateQueries({\n queryKey: [\"v1-threads\", result.threadId],\n });\n\n if (\n autoGenerateThreadName &&\n shouldGenerateThreadName(\n result.threadId,\n result.threadAlreadyHasTitle,\n result.preMutationMessageCount,\n autoGenerateNameThreshold,\n )\n ) {\n await generateThreadName(\n client,\n dispatch,\n queryClient,\n result.threadId,\n );\n }\n },\n onError: (error) => {\n console.error(\"[useTamboSendMessage] Mutation failed:\", error);\n },\n });\n}\n"]}