@tambo-ai/react 0.74.0 → 0.75.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (314) 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 +5 -2
  5. package/dist/hoc/with-tambo-interactable.js.map +1 -1
  6. package/dist/hoc/with-tambo-interactable.test.js +12 -0
  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/mcp/mcp-hooks.d.ts.map +1 -1
  11. package/dist/mcp/mcp-hooks.js +70 -16
  12. package/dist/mcp/mcp-hooks.js.map +1 -1
  13. package/dist/mcp/mcp-hooks.test.js +69 -0
  14. package/dist/mcp/mcp-hooks.test.js.map +1 -1
  15. package/dist/mcp/tambo-mcp-provider.test.js +24 -0
  16. package/dist/mcp/tambo-mcp-provider.test.js.map +1 -1
  17. package/dist/mcp/use-mcp-servers.test.js +9 -0
  18. package/dist/mcp/use-mcp-servers.test.js.map +1 -1
  19. package/dist/model/component-metadata.d.ts +4 -4
  20. package/dist/model/component-metadata.js.map +1 -1
  21. package/dist/providers/__tests__/thread-input-resource-resolution.test.js +2 -2
  22. package/dist/providers/__tests__/thread-input-resource-resolution.test.js.map +1 -1
  23. package/dist/providers/tambo-client-provider.d.ts +6 -0
  24. package/dist/providers/tambo-client-provider.d.ts.map +1 -1
  25. package/dist/providers/tambo-client-provider.js +4 -1
  26. package/dist/providers/tambo-client-provider.js.map +1 -1
  27. package/dist/providers/tambo-interactable-provider.d.ts.map +1 -1
  28. package/dist/providers/tambo-interactable-provider.js +8 -0
  29. package/dist/providers/tambo-interactable-provider.js.map +1 -1
  30. package/dist/providers/tambo-interactable-provider.test.js +47 -0
  31. package/dist/providers/tambo-interactable-provider.test.js.map +1 -1
  32. package/dist/providers/tambo-provider.d.ts.map +1 -1
  33. package/dist/providers/tambo-provider.js +4 -1
  34. package/dist/providers/tambo-provider.js.map +1 -1
  35. package/dist/providers/tambo-stubs.d.ts.map +1 -1
  36. package/dist/providers/tambo-stubs.js +3 -0
  37. package/dist/providers/tambo-stubs.js.map +1 -1
  38. package/dist/providers/tambo-thread-provider-initial-messages.test.js +3 -0
  39. package/dist/providers/tambo-thread-provider-initial-messages.test.js.map +1 -1
  40. package/dist/providers/tambo-thread-provider.test.js +3 -0
  41. package/dist/providers/tambo-thread-provider.test.js.map +1 -1
  42. package/dist/util/registry-validators.js +1 -1
  43. package/dist/util/registry-validators.js.map +1 -1
  44. package/dist/util/resource-content-resolver.test.js +1 -1
  45. package/dist/util/resource-content-resolver.test.js.map +1 -1
  46. package/dist/v1/hooks/use-tambo-v1-auth-state.d.ts +11 -0
  47. package/dist/v1/hooks/use-tambo-v1-auth-state.d.ts.map +1 -0
  48. package/dist/v1/hooks/use-tambo-v1-auth-state.js +48 -0
  49. package/dist/v1/hooks/use-tambo-v1-auth-state.js.map +1 -0
  50. package/dist/v1/hooks/use-tambo-v1-auth-state.test.d.ts +2 -0
  51. package/dist/v1/hooks/use-tambo-v1-auth-state.test.d.ts.map +1 -0
  52. package/dist/v1/hooks/use-tambo-v1-auth-state.test.js +105 -0
  53. package/dist/v1/hooks/use-tambo-v1-auth-state.test.js.map +1 -0
  54. package/dist/v1/hooks/use-tambo-v1-component-state.d.ts.map +1 -1
  55. package/dist/v1/hooks/use-tambo-v1-component-state.js +68 -21
  56. package/dist/v1/hooks/use-tambo-v1-component-state.js.map +1 -1
  57. package/dist/v1/hooks/use-tambo-v1-component-state.test.js +100 -0
  58. package/dist/v1/hooks/use-tambo-v1-component-state.test.js.map +1 -1
  59. package/dist/v1/hooks/use-tambo-v1-messages.test.js +8 -0
  60. package/dist/v1/hooks/use-tambo-v1-messages.test.js.map +1 -1
  61. package/dist/v1/hooks/use-tambo-v1-send-message.d.ts +19 -1
  62. package/dist/v1/hooks/use-tambo-v1-send-message.d.ts.map +1 -1
  63. package/dist/v1/hooks/use-tambo-v1-send-message.js +86 -9
  64. package/dist/v1/hooks/use-tambo-v1-send-message.js.map +1 -1
  65. package/dist/v1/hooks/use-tambo-v1-send-message.test.js +273 -0
  66. package/dist/v1/hooks/use-tambo-v1-send-message.test.js.map +1 -1
  67. package/dist/v1/hooks/use-tambo-v1-stream-status.d.ts +2 -2
  68. package/dist/v1/hooks/use-tambo-v1-stream-status.d.ts.map +1 -1
  69. package/dist/v1/hooks/use-tambo-v1-stream-status.js +2 -2
  70. package/dist/v1/hooks/use-tambo-v1-stream-status.js.map +1 -1
  71. package/dist/v1/hooks/use-tambo-v1-stream-status.test.js +11 -11
  72. package/dist/v1/hooks/use-tambo-v1-stream-status.test.js.map +1 -1
  73. package/dist/v1/hooks/use-tambo-v1-thread-input.test.js +13 -0
  74. package/dist/v1/hooks/use-tambo-v1-thread-input.test.js.map +1 -1
  75. package/dist/v1/hooks/use-tambo-v1-thread-list.d.ts.map +1 -1
  76. package/dist/v1/hooks/use-tambo-v1-thread-list.js +4 -0
  77. package/dist/v1/hooks/use-tambo-v1-thread-list.js.map +1 -1
  78. package/dist/v1/hooks/use-tambo-v1-thread-list.test.js +6 -0
  79. package/dist/v1/hooks/use-tambo-v1-thread-list.test.js.map +1 -1
  80. package/dist/v1/hooks/use-tambo-v1-thread.d.ts.map +1 -1
  81. package/dist/v1/hooks/use-tambo-v1-thread.js +4 -0
  82. package/dist/v1/hooks/use-tambo-v1-thread.js.map +1 -1
  83. package/dist/v1/hooks/use-tambo-v1-thread.test.js +6 -0
  84. package/dist/v1/hooks/use-tambo-v1-thread.test.js.map +1 -1
  85. package/dist/v1/hooks/use-tambo-v1.d.ts +11 -0
  86. package/dist/v1/hooks/use-tambo-v1.d.ts.map +1 -1
  87. package/dist/v1/hooks/use-tambo-v1.js +5 -0
  88. package/dist/v1/hooks/use-tambo-v1.js.map +1 -1
  89. package/dist/v1/hooks/use-tambo-v1.test.js +13 -0
  90. package/dist/v1/hooks/use-tambo-v1.test.js.map +1 -1
  91. package/dist/v1/index.d.ts +4 -1
  92. package/dist/v1/index.d.ts.map +1 -1
  93. package/dist/v1/index.js +5 -2
  94. package/dist/v1/index.js.map +1 -1
  95. package/dist/v1/providers/tambo-v1-provider.d.ts +16 -1
  96. package/dist/v1/providers/tambo-v1-provider.d.ts.map +1 -1
  97. package/dist/v1/providers/tambo-v1-provider.js +42 -5
  98. package/dist/v1/providers/tambo-v1-provider.js.map +1 -1
  99. package/dist/v1/providers/tambo-v1-provider.test.js +19 -2
  100. package/dist/v1/providers/tambo-v1-provider.test.js.map +1 -1
  101. package/dist/v1/providers/tambo-v1-stream-context.d.ts +6 -0
  102. package/dist/v1/providers/tambo-v1-stream-context.d.ts.map +1 -1
  103. package/dist/v1/providers/tambo-v1-stream-context.js +50 -11
  104. package/dist/v1/providers/tambo-v1-stream-context.js.map +1 -1
  105. package/dist/v1/providers/tambo-v1-stream-context.test.js +9 -0
  106. package/dist/v1/providers/tambo-v1-stream-context.test.js.map +1 -1
  107. package/dist/v1/providers/tambo-v1-stub-provider.d.ts.map +1 -1
  108. package/dist/v1/providers/tambo-v1-stub-provider.js +4 -0
  109. package/dist/v1/providers/tambo-v1-stub-provider.js.map +1 -1
  110. package/dist/v1/providers/tambo-v1-thread-input-provider.d.ts +11 -0
  111. package/dist/v1/providers/tambo-v1-thread-input-provider.d.ts.map +1 -1
  112. package/dist/v1/providers/tambo-v1-thread-input-provider.js +10 -1
  113. package/dist/v1/providers/tambo-v1-thread-input-provider.js.map +1 -1
  114. package/dist/v1/types/auth.d.ts +24 -0
  115. package/dist/v1/types/auth.d.ts.map +1 -0
  116. package/dist/v1/types/auth.js +3 -0
  117. package/dist/v1/types/auth.js.map +1 -0
  118. package/dist/v1/types/message.d.ts +12 -0
  119. package/dist/v1/types/message.d.ts.map +1 -1
  120. package/dist/v1/types/message.js.map +1 -1
  121. package/dist/v1/types/tool-choice.d.ts +8 -0
  122. package/dist/v1/types/tool-choice.d.ts.map +1 -0
  123. package/dist/v1/types/tool-choice.js +3 -0
  124. package/dist/v1/types/tool-choice.js.map +1 -0
  125. package/dist/v1/utils/event-accumulator.d.ts +28 -2
  126. package/dist/v1/utils/event-accumulator.d.ts.map +1 -1
  127. package/dist/v1/utils/event-accumulator.js +67 -15
  128. package/dist/v1/utils/event-accumulator.js.map +1 -1
  129. package/dist/v1/utils/event-accumulator.test.js +106 -0
  130. package/dist/v1/utils/event-accumulator.test.js.map +1 -1
  131. package/dist/v1/utils/keyed-throttle.d.ts +42 -0
  132. package/dist/v1/utils/keyed-throttle.d.ts.map +1 -0
  133. package/dist/v1/utils/keyed-throttle.js +86 -0
  134. package/dist/v1/utils/keyed-throttle.js.map +1 -0
  135. package/dist/v1/utils/keyed-throttle.test.d.ts +2 -0
  136. package/dist/v1/utils/keyed-throttle.test.d.ts.map +1 -0
  137. package/dist/v1/utils/keyed-throttle.test.js +147 -0
  138. package/dist/v1/utils/keyed-throttle.test.js.map +1 -0
  139. package/dist/v1/utils/registry-conversion.d.ts.map +1 -1
  140. package/dist/v1/utils/registry-conversion.js +2 -0
  141. package/dist/v1/utils/registry-conversion.js.map +1 -1
  142. package/dist/v1/utils/registry-conversion.test.js +23 -0
  143. package/dist/v1/utils/registry-conversion.test.js.map +1 -1
  144. package/dist/v1/utils/tool-call-tracker.d.ts +10 -0
  145. package/dist/v1/utils/tool-call-tracker.d.ts.map +1 -1
  146. package/dist/v1/utils/tool-call-tracker.js +13 -0
  147. package/dist/v1/utils/tool-call-tracker.js.map +1 -1
  148. package/dist/v1/utils/tool-call-tracker.test.d.ts +2 -0
  149. package/dist/v1/utils/tool-call-tracker.test.d.ts.map +1 -0
  150. package/dist/v1/utils/tool-call-tracker.test.js +67 -0
  151. package/dist/v1/utils/tool-call-tracker.test.js.map +1 -0
  152. package/dist/v1/utils/tool-executor.d.ts +34 -0
  153. package/dist/v1/utils/tool-executor.d.ts.map +1 -1
  154. package/dist/v1/utils/tool-executor.js +55 -0
  155. package/dist/v1/utils/tool-executor.js.map +1 -1
  156. package/dist/v1/utils/tool-executor.test.js +211 -0
  157. package/dist/v1/utils/tool-executor.test.js.map +1 -1
  158. package/esm/hoc/with-tambo-interactable.d.ts +8 -0
  159. package/esm/hoc/with-tambo-interactable.d.ts.map +1 -1
  160. package/esm/hoc/with-tambo-interactable.js +5 -2
  161. package/esm/hoc/with-tambo-interactable.js.map +1 -1
  162. package/esm/hoc/with-tambo-interactable.test.js +12 -0
  163. package/esm/hoc/with-tambo-interactable.test.js.map +1 -1
  164. package/esm/hooks/use-tambo-voice.test.js +3 -0
  165. package/esm/hooks/use-tambo-voice.test.js.map +1 -1
  166. package/esm/mcp/mcp-hooks.d.ts.map +1 -1
  167. package/esm/mcp/mcp-hooks.js +70 -16
  168. package/esm/mcp/mcp-hooks.js.map +1 -1
  169. package/esm/mcp/mcp-hooks.test.js +69 -0
  170. package/esm/mcp/mcp-hooks.test.js.map +1 -1
  171. package/esm/mcp/tambo-mcp-provider.test.js +24 -0
  172. package/esm/mcp/tambo-mcp-provider.test.js.map +1 -1
  173. package/esm/mcp/use-mcp-servers.test.js +9 -0
  174. package/esm/mcp/use-mcp-servers.test.js.map +1 -1
  175. package/esm/model/component-metadata.d.ts +4 -4
  176. package/esm/model/component-metadata.js.map +1 -1
  177. package/esm/providers/__tests__/thread-input-resource-resolution.test.js +2 -2
  178. package/esm/providers/__tests__/thread-input-resource-resolution.test.js.map +1 -1
  179. package/esm/providers/tambo-client-provider.d.ts +6 -0
  180. package/esm/providers/tambo-client-provider.d.ts.map +1 -1
  181. package/esm/providers/tambo-client-provider.js +4 -1
  182. package/esm/providers/tambo-client-provider.js.map +1 -1
  183. package/esm/providers/tambo-interactable-provider.d.ts.map +1 -1
  184. package/esm/providers/tambo-interactable-provider.js +8 -0
  185. package/esm/providers/tambo-interactable-provider.js.map +1 -1
  186. package/esm/providers/tambo-interactable-provider.test.js +47 -0
  187. package/esm/providers/tambo-interactable-provider.test.js.map +1 -1
  188. package/esm/providers/tambo-provider.d.ts.map +1 -1
  189. package/esm/providers/tambo-provider.js +4 -1
  190. package/esm/providers/tambo-provider.js.map +1 -1
  191. package/esm/providers/tambo-stubs.d.ts.map +1 -1
  192. package/esm/providers/tambo-stubs.js +3 -0
  193. package/esm/providers/tambo-stubs.js.map +1 -1
  194. package/esm/providers/tambo-thread-provider-initial-messages.test.js +3 -0
  195. package/esm/providers/tambo-thread-provider-initial-messages.test.js.map +1 -1
  196. package/esm/providers/tambo-thread-provider.test.js +3 -0
  197. package/esm/providers/tambo-thread-provider.test.js.map +1 -1
  198. package/esm/util/registry-validators.js +1 -1
  199. package/esm/util/registry-validators.js.map +1 -1
  200. package/esm/util/resource-content-resolver.test.js +1 -1
  201. package/esm/util/resource-content-resolver.test.js.map +1 -1
  202. package/esm/v1/hooks/use-tambo-v1-auth-state.d.ts +11 -0
  203. package/esm/v1/hooks/use-tambo-v1-auth-state.d.ts.map +1 -0
  204. package/esm/v1/hooks/use-tambo-v1-auth-state.js +45 -0
  205. package/esm/v1/hooks/use-tambo-v1-auth-state.js.map +1 -0
  206. package/esm/v1/hooks/use-tambo-v1-auth-state.test.d.ts +2 -0
  207. package/esm/v1/hooks/use-tambo-v1-auth-state.test.d.ts.map +1 -0
  208. package/esm/v1/hooks/use-tambo-v1-auth-state.test.js +100 -0
  209. package/esm/v1/hooks/use-tambo-v1-auth-state.test.js.map +1 -0
  210. package/esm/v1/hooks/use-tambo-v1-component-state.d.ts.map +1 -1
  211. package/esm/v1/hooks/use-tambo-v1-component-state.js +68 -21
  212. package/esm/v1/hooks/use-tambo-v1-component-state.js.map +1 -1
  213. package/esm/v1/hooks/use-tambo-v1-component-state.test.js +100 -0
  214. package/esm/v1/hooks/use-tambo-v1-component-state.test.js.map +1 -1
  215. package/esm/v1/hooks/use-tambo-v1-messages.test.js +8 -0
  216. package/esm/v1/hooks/use-tambo-v1-messages.test.js.map +1 -1
  217. package/esm/v1/hooks/use-tambo-v1-send-message.d.ts +19 -1
  218. package/esm/v1/hooks/use-tambo-v1-send-message.d.ts.map +1 -1
  219. package/esm/v1/hooks/use-tambo-v1-send-message.js +87 -10
  220. package/esm/v1/hooks/use-tambo-v1-send-message.js.map +1 -1
  221. package/esm/v1/hooks/use-tambo-v1-send-message.test.js +273 -0
  222. package/esm/v1/hooks/use-tambo-v1-send-message.test.js.map +1 -1
  223. package/esm/v1/hooks/use-tambo-v1-stream-status.d.ts +2 -2
  224. package/esm/v1/hooks/use-tambo-v1-stream-status.d.ts.map +1 -1
  225. package/esm/v1/hooks/use-tambo-v1-stream-status.js +2 -2
  226. package/esm/v1/hooks/use-tambo-v1-stream-status.js.map +1 -1
  227. package/esm/v1/hooks/use-tambo-v1-stream-status.test.js +11 -11
  228. package/esm/v1/hooks/use-tambo-v1-stream-status.test.js.map +1 -1
  229. package/esm/v1/hooks/use-tambo-v1-thread-input.test.js +13 -0
  230. package/esm/v1/hooks/use-tambo-v1-thread-input.test.js.map +1 -1
  231. package/esm/v1/hooks/use-tambo-v1-thread-list.d.ts.map +1 -1
  232. package/esm/v1/hooks/use-tambo-v1-thread-list.js +4 -0
  233. package/esm/v1/hooks/use-tambo-v1-thread-list.js.map +1 -1
  234. package/esm/v1/hooks/use-tambo-v1-thread-list.test.js +6 -0
  235. package/esm/v1/hooks/use-tambo-v1-thread-list.test.js.map +1 -1
  236. package/esm/v1/hooks/use-tambo-v1-thread.d.ts.map +1 -1
  237. package/esm/v1/hooks/use-tambo-v1-thread.js +4 -0
  238. package/esm/v1/hooks/use-tambo-v1-thread.js.map +1 -1
  239. package/esm/v1/hooks/use-tambo-v1-thread.test.js +6 -0
  240. package/esm/v1/hooks/use-tambo-v1-thread.test.js.map +1 -1
  241. package/esm/v1/hooks/use-tambo-v1.d.ts +11 -0
  242. package/esm/v1/hooks/use-tambo-v1.d.ts.map +1 -1
  243. package/esm/v1/hooks/use-tambo-v1.js +5 -0
  244. package/esm/v1/hooks/use-tambo-v1.js.map +1 -1
  245. package/esm/v1/hooks/use-tambo-v1.test.js +13 -0
  246. package/esm/v1/hooks/use-tambo-v1.test.js.map +1 -1
  247. package/esm/v1/index.d.ts +4 -1
  248. package/esm/v1/index.d.ts.map +1 -1
  249. package/esm/v1/index.js +3 -1
  250. package/esm/v1/index.js.map +1 -1
  251. package/esm/v1/providers/tambo-v1-provider.d.ts +16 -1
  252. package/esm/v1/providers/tambo-v1-provider.d.ts.map +1 -1
  253. package/esm/v1/providers/tambo-v1-provider.js +43 -6
  254. package/esm/v1/providers/tambo-v1-provider.js.map +1 -1
  255. package/esm/v1/providers/tambo-v1-provider.test.js +19 -2
  256. package/esm/v1/providers/tambo-v1-provider.test.js.map +1 -1
  257. package/esm/v1/providers/tambo-v1-stream-context.d.ts +6 -0
  258. package/esm/v1/providers/tambo-v1-stream-context.d.ts.map +1 -1
  259. package/esm/v1/providers/tambo-v1-stream-context.js +51 -12
  260. package/esm/v1/providers/tambo-v1-stream-context.js.map +1 -1
  261. package/esm/v1/providers/tambo-v1-stream-context.test.js +9 -0
  262. package/esm/v1/providers/tambo-v1-stream-context.test.js.map +1 -1
  263. package/esm/v1/providers/tambo-v1-stub-provider.d.ts.map +1 -1
  264. package/esm/v1/providers/tambo-v1-stub-provider.js +4 -0
  265. package/esm/v1/providers/tambo-v1-stub-provider.js.map +1 -1
  266. package/esm/v1/providers/tambo-v1-thread-input-provider.d.ts +11 -0
  267. package/esm/v1/providers/tambo-v1-thread-input-provider.d.ts.map +1 -1
  268. package/esm/v1/providers/tambo-v1-thread-input-provider.js +10 -1
  269. package/esm/v1/providers/tambo-v1-thread-input-provider.js.map +1 -1
  270. package/esm/v1/types/auth.d.ts +24 -0
  271. package/esm/v1/types/auth.d.ts.map +1 -0
  272. package/esm/v1/types/auth.js +2 -0
  273. package/esm/v1/types/auth.js.map +1 -0
  274. package/esm/v1/types/message.d.ts +12 -0
  275. package/esm/v1/types/message.d.ts.map +1 -1
  276. package/esm/v1/types/message.js.map +1 -1
  277. package/esm/v1/types/tool-choice.d.ts +8 -0
  278. package/esm/v1/types/tool-choice.d.ts.map +1 -0
  279. package/esm/v1/types/tool-choice.js +2 -0
  280. package/esm/v1/types/tool-choice.js.map +1 -0
  281. package/esm/v1/utils/event-accumulator.d.ts +28 -2
  282. package/esm/v1/utils/event-accumulator.d.ts.map +1 -1
  283. package/esm/v1/utils/event-accumulator.js +66 -15
  284. package/esm/v1/utils/event-accumulator.js.map +1 -1
  285. package/esm/v1/utils/event-accumulator.test.js +106 -0
  286. package/esm/v1/utils/event-accumulator.test.js.map +1 -1
  287. package/esm/v1/utils/keyed-throttle.d.ts +42 -0
  288. package/esm/v1/utils/keyed-throttle.d.ts.map +1 -0
  289. package/esm/v1/utils/keyed-throttle.js +83 -0
  290. package/esm/v1/utils/keyed-throttle.js.map +1 -0
  291. package/esm/v1/utils/keyed-throttle.test.d.ts +2 -0
  292. package/esm/v1/utils/keyed-throttle.test.d.ts.map +1 -0
  293. package/esm/v1/utils/keyed-throttle.test.js +145 -0
  294. package/esm/v1/utils/keyed-throttle.test.js.map +1 -0
  295. package/esm/v1/utils/registry-conversion.d.ts.map +1 -1
  296. package/esm/v1/utils/registry-conversion.js +2 -0
  297. package/esm/v1/utils/registry-conversion.js.map +1 -1
  298. package/esm/v1/utils/registry-conversion.test.js +23 -0
  299. package/esm/v1/utils/registry-conversion.test.js.map +1 -1
  300. package/esm/v1/utils/tool-call-tracker.d.ts +10 -0
  301. package/esm/v1/utils/tool-call-tracker.d.ts.map +1 -1
  302. package/esm/v1/utils/tool-call-tracker.js +13 -0
  303. package/esm/v1/utils/tool-call-tracker.js.map +1 -1
  304. package/esm/v1/utils/tool-call-tracker.test.d.ts +2 -0
  305. package/esm/v1/utils/tool-call-tracker.test.d.ts.map +1 -0
  306. package/esm/v1/utils/tool-call-tracker.test.js +65 -0
  307. package/esm/v1/utils/tool-call-tracker.test.js.map +1 -0
  308. package/esm/v1/utils/tool-executor.d.ts +34 -0
  309. package/esm/v1/utils/tool-executor.d.ts.map +1 -1
  310. package/esm/v1/utils/tool-executor.js +53 -0
  311. package/esm/v1/utils/tool-executor.js.map +1 -1
  312. package/esm/v1/utils/tool-executor.test.js +212 -1
  313. package/esm/v1/utils/tool-executor.test.js.map +1 -1
  314. package/package.json +4 -4
@@ -10,10 +10,19 @@ jest.mock("../../providers/tambo-client-provider", () => ({
10
10
  messages: {
11
11
  list: jest.fn().mockResolvedValue({ messages: [], hasMore: false }),
12
12
  },
13
+ retrieve: jest.fn().mockResolvedValue({}),
13
14
  },
14
15
  })),
15
16
  useTamboQueryClient: jest.fn(),
16
17
  }));
18
+ // Mock useTamboV1Config to avoid TamboV1Provider dependency
19
+ jest.mock("./tambo-v1-provider", () => {
20
+ const actual = jest.requireActual("./tambo-v1-provider");
21
+ return {
22
+ ...actual,
23
+ useTamboV1Config: () => ({ userKey: undefined }),
24
+ };
25
+ });
17
26
  // Import for mocking
18
27
  import { useTamboQueryClient } from "../../providers/tambo-client-provider.js";
19
28
  describe("TamboV1StreamProvider", () => {
@@ -1 +1 @@
1
- {"version":3,"file":"tambo-v1-stream-context.test.js","sourceRoot":"","sources":["../../../src/v1/providers/tambo-v1-stream-context.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import { EventType, type RunStartedEvent } from \"@ag-ui/core\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { renderHook, act } from \"@testing-library/react\";\nimport React from \"react\";\nimport {\n TamboV1StreamProvider,\n useStreamState,\n useStreamDispatch,\n useThreadManagement,\n} from \"./tambo-v1-stream-context\";\n\n// Mock useTamboClient and useTamboQueryClient to avoid TamboClientProvider dependency\njest.mock(\"../../providers/tambo-client-provider\", () => ({\n useTamboClient: jest.fn(() => ({\n threads: {\n messages: {\n list: jest.fn().mockResolvedValue({ messages: [], hasMore: false }),\n },\n },\n })),\n useTamboQueryClient: jest.fn(),\n}));\n\n// Import for mocking\nimport { useTamboQueryClient } from \"../../providers/tambo-client-provider\";\n\ndescribe(\"TamboV1StreamProvider\", () => {\n let queryClient: QueryClient;\n\n beforeEach(() => {\n queryClient = new QueryClient({\n defaultOptions: {\n queries: { retry: false },\n },\n });\n // Configure mock to return the test's queryClient\n jest.mocked(useTamboQueryClient).mockReturnValue(queryClient);\n });\n\n const createWrapper = () => {\n return function Wrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n </QueryClientProvider>\n );\n };\n };\n describe(\"useStreamState\", () => {\n it(\"throws when used outside provider\", () => {\n // Suppress console.error for expected error\n const consoleSpy = jest\n .spyOn(console, \"error\")\n .mockImplementation(() => {});\n\n expect(() => {\n renderHook(() => useStreamState());\n }).toThrow(\"useStreamState must be used within TamboV1StreamProvider\");\n\n consoleSpy.mockRestore();\n });\n\n it(\"returns initial state with placeholder thread ready for new messages\", () => {\n const { result } = renderHook(() => useStreamState(), {\n wrapper: createWrapper(),\n });\n\n // Initial state should have placeholder thread ready for optimistic UI\n expect(result.current.currentThreadId).toBe(\"placeholder\");\n expect(result.current.threadMap.placeholder).toBeDefined();\n expect(result.current.threadMap.placeholder.thread.id).toBe(\n \"placeholder\",\n );\n expect(result.current.threadMap.placeholder.thread.messages).toEqual([]);\n expect(result.current.threadMap.placeholder.streaming.status).toBe(\n \"idle\",\n );\n });\n\n it(\"initializes thread via dispatch\", () => {\n const { result } = renderHook(\n () => ({\n state: useStreamState(),\n dispatch: useStreamDispatch(),\n }),\n { wrapper: createWrapper() },\n );\n\n act(() => {\n result.current.dispatch({\n type: \"INIT_THREAD\",\n threadId: \"thread_123\",\n });\n });\n\n expect(result.current.state.threadMap.thread_123).toBeDefined();\n expect(result.current.state.threadMap.thread_123.thread.id).toBe(\n \"thread_123\",\n );\n expect(result.current.state.threadMap.thread_123.thread.status).toBe(\n \"idle\",\n );\n expect(result.current.state.threadMap.thread_123.thread.messages).toEqual(\n [],\n );\n });\n\n it(\"initializes thread with initial data via dispatch\", () => {\n const { result } = renderHook(\n () => ({\n state: useStreamState(),\n dispatch: useStreamDispatch(),\n }),\n { wrapper: createWrapper() },\n );\n\n act(() => {\n result.current.dispatch({\n type: \"INIT_THREAD\",\n threadId: \"thread_123\",\n initialThread: {\n title: \"Test Thread\",\n metadata: { key: \"value\" },\n },\n });\n });\n\n expect(result.current.state.threadMap.thread_123.thread.title).toBe(\n \"Test Thread\",\n );\n expect(result.current.state.threadMap.thread_123.thread.metadata).toEqual(\n {\n key: \"value\",\n },\n );\n // Default values should still be set\n expect(result.current.state.threadMap.thread_123.thread.status).toBe(\n \"idle\",\n );\n });\n });\n\n describe(\"useStreamDispatch\", () => {\n it(\"throws when used outside provider\", () => {\n const consoleSpy = jest\n .spyOn(console, \"error\")\n .mockImplementation(() => {});\n\n expect(() => {\n renderHook(() => useStreamDispatch());\n }).toThrow(\"useStreamDispatch must be used within TamboV1StreamProvider\");\n\n consoleSpy.mockRestore();\n });\n\n it(\"dispatches events to update state\", () => {\n const { result } = renderHook(\n () => ({\n state: useStreamState(),\n dispatch: useStreamDispatch(),\n }),\n { wrapper: createWrapper() },\n );\n\n // Initialize the thread first\n act(() => {\n result.current.dispatch({\n type: \"INIT_THREAD\",\n threadId: \"thread_123\",\n });\n });\n\n const runStartedEvent: RunStartedEvent = {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId: \"thread_123\",\n };\n\n act(() => {\n result.current.dispatch({\n type: \"EVENT\",\n event: runStartedEvent,\n threadId: \"thread_123\",\n });\n });\n\n expect(result.current.state.threadMap.thread_123.thread.status).toBe(\n \"streaming\",\n );\n expect(result.current.state.threadMap.thread_123.streaming.status).toBe(\n \"streaming\",\n );\n expect(result.current.state.threadMap.thread_123.streaming.runId).toBe(\n \"run_1\",\n );\n });\n });\n\n describe(\"useThreadManagement\", () => {\n it(\"throws when used outside provider\", () => {\n const consoleSpy = jest\n .spyOn(console, \"error\")\n .mockImplementation(() => {});\n\n expect(() => {\n renderHook(() => useThreadManagement());\n }).toThrow(\n \"useThreadManagement must be used within TamboV1StreamProvider\",\n );\n\n consoleSpy.mockRestore();\n });\n\n it(\"initThread creates a new thread\", () => {\n const { result } = renderHook(\n () => ({\n state: useStreamState(),\n management: useThreadManagement(),\n }),\n { wrapper: createWrapper() },\n );\n\n act(() => {\n result.current.management.initThread(\"thread_456\");\n });\n\n expect(result.current.state.threadMap.thread_456).toBeDefined();\n expect(result.current.state.threadMap.thread_456.thread.id).toBe(\n \"thread_456\",\n );\n });\n\n it(\"switchThread changes currentThreadId\", () => {\n const { result } = renderHook(\n () => ({\n state: useStreamState(),\n management: useThreadManagement(),\n }),\n { wrapper: createWrapper() },\n );\n\n // Initialize and switch to a thread\n act(() => {\n result.current.management.initThread(\"thread_789\");\n result.current.management.switchThread(\"thread_789\");\n });\n\n expect(result.current.state.currentThreadId).toBe(\"thread_789\");\n });\n\n it(\"startNewThread creates temp thread and switches to it\", () => {\n const { result } = renderHook(\n () => ({\n state: useStreamState(),\n management: useThreadManagement(),\n }),\n { wrapper: createWrapper() },\n );\n\n let tempId: string;\n act(() => {\n tempId = result.current.management.startNewThread();\n });\n\n expect(tempId!).toBe(\"placeholder\");\n expect(result.current.state.currentThreadId).toBe(\"placeholder\");\n expect(result.current.state.threadMap.placeholder).toBeDefined();\n });\n });\n});\n"]}
1
+ {"version":3,"file":"tambo-v1-stream-context.test.js","sourceRoot":"","sources":["../../../src/v1/providers/tambo-v1-stream-context.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import { EventType, type RunStartedEvent } from \"@ag-ui/core\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { renderHook, act } from \"@testing-library/react\";\nimport React from \"react\";\nimport {\n TamboV1StreamProvider,\n useStreamState,\n useStreamDispatch,\n useThreadManagement,\n} from \"./tambo-v1-stream-context\";\n\n// Mock useTamboClient and useTamboQueryClient to avoid TamboClientProvider dependency\njest.mock(\"../../providers/tambo-client-provider\", () => ({\n useTamboClient: jest.fn(() => ({\n threads: {\n messages: {\n list: jest.fn().mockResolvedValue({ messages: [], hasMore: false }),\n },\n retrieve: jest.fn().mockResolvedValue({}),\n },\n })),\n useTamboQueryClient: jest.fn(),\n}));\n\n// Mock useTamboV1Config to avoid TamboV1Provider dependency\njest.mock(\"./tambo-v1-provider\", () => {\n const actual = jest.requireActual(\"./tambo-v1-provider\");\n return {\n ...actual,\n useTamboV1Config: () => ({ userKey: undefined }),\n };\n});\n\n// Import for mocking\nimport { useTamboQueryClient } from \"../../providers/tambo-client-provider\";\n\ndescribe(\"TamboV1StreamProvider\", () => {\n let queryClient: QueryClient;\n\n beforeEach(() => {\n queryClient = new QueryClient({\n defaultOptions: {\n queries: { retry: false },\n },\n });\n // Configure mock to return the test's queryClient\n jest.mocked(useTamboQueryClient).mockReturnValue(queryClient);\n });\n\n const createWrapper = () => {\n return function Wrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n </QueryClientProvider>\n );\n };\n };\n describe(\"useStreamState\", () => {\n it(\"throws when used outside provider\", () => {\n // Suppress console.error for expected error\n const consoleSpy = jest\n .spyOn(console, \"error\")\n .mockImplementation(() => {});\n\n expect(() => {\n renderHook(() => useStreamState());\n }).toThrow(\"useStreamState must be used within TamboV1StreamProvider\");\n\n consoleSpy.mockRestore();\n });\n\n it(\"returns initial state with placeholder thread ready for new messages\", () => {\n const { result } = renderHook(() => useStreamState(), {\n wrapper: createWrapper(),\n });\n\n // Initial state should have placeholder thread ready for optimistic UI\n expect(result.current.currentThreadId).toBe(\"placeholder\");\n expect(result.current.threadMap.placeholder).toBeDefined();\n expect(result.current.threadMap.placeholder.thread.id).toBe(\n \"placeholder\",\n );\n expect(result.current.threadMap.placeholder.thread.messages).toEqual([]);\n expect(result.current.threadMap.placeholder.streaming.status).toBe(\n \"idle\",\n );\n });\n\n it(\"initializes thread via dispatch\", () => {\n const { result } = renderHook(\n () => ({\n state: useStreamState(),\n dispatch: useStreamDispatch(),\n }),\n { wrapper: createWrapper() },\n );\n\n act(() => {\n result.current.dispatch({\n type: \"INIT_THREAD\",\n threadId: \"thread_123\",\n });\n });\n\n expect(result.current.state.threadMap.thread_123).toBeDefined();\n expect(result.current.state.threadMap.thread_123.thread.id).toBe(\n \"thread_123\",\n );\n expect(result.current.state.threadMap.thread_123.thread.status).toBe(\n \"idle\",\n );\n expect(result.current.state.threadMap.thread_123.thread.messages).toEqual(\n [],\n );\n });\n\n it(\"initializes thread with initial data via dispatch\", () => {\n const { result } = renderHook(\n () => ({\n state: useStreamState(),\n dispatch: useStreamDispatch(),\n }),\n { wrapper: createWrapper() },\n );\n\n act(() => {\n result.current.dispatch({\n type: \"INIT_THREAD\",\n threadId: \"thread_123\",\n initialThread: {\n title: \"Test Thread\",\n metadata: { key: \"value\" },\n },\n });\n });\n\n expect(result.current.state.threadMap.thread_123.thread.title).toBe(\n \"Test Thread\",\n );\n expect(result.current.state.threadMap.thread_123.thread.metadata).toEqual(\n {\n key: \"value\",\n },\n );\n // Default values should still be set\n expect(result.current.state.threadMap.thread_123.thread.status).toBe(\n \"idle\",\n );\n });\n });\n\n describe(\"useStreamDispatch\", () => {\n it(\"throws when used outside provider\", () => {\n const consoleSpy = jest\n .spyOn(console, \"error\")\n .mockImplementation(() => {});\n\n expect(() => {\n renderHook(() => useStreamDispatch());\n }).toThrow(\"useStreamDispatch must be used within TamboV1StreamProvider\");\n\n consoleSpy.mockRestore();\n });\n\n it(\"dispatches events to update state\", () => {\n const { result } = renderHook(\n () => ({\n state: useStreamState(),\n dispatch: useStreamDispatch(),\n }),\n { wrapper: createWrapper() },\n );\n\n // Initialize the thread first\n act(() => {\n result.current.dispatch({\n type: \"INIT_THREAD\",\n threadId: \"thread_123\",\n });\n });\n\n const runStartedEvent: RunStartedEvent = {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId: \"thread_123\",\n };\n\n act(() => {\n result.current.dispatch({\n type: \"EVENT\",\n event: runStartedEvent,\n threadId: \"thread_123\",\n });\n });\n\n expect(result.current.state.threadMap.thread_123.thread.status).toBe(\n \"streaming\",\n );\n expect(result.current.state.threadMap.thread_123.streaming.status).toBe(\n \"streaming\",\n );\n expect(result.current.state.threadMap.thread_123.streaming.runId).toBe(\n \"run_1\",\n );\n });\n });\n\n describe(\"useThreadManagement\", () => {\n it(\"throws when used outside provider\", () => {\n const consoleSpy = jest\n .spyOn(console, \"error\")\n .mockImplementation(() => {});\n\n expect(() => {\n renderHook(() => useThreadManagement());\n }).toThrow(\n \"useThreadManagement must be used within TamboV1StreamProvider\",\n );\n\n consoleSpy.mockRestore();\n });\n\n it(\"initThread creates a new thread\", () => {\n const { result } = renderHook(\n () => ({\n state: useStreamState(),\n management: useThreadManagement(),\n }),\n { wrapper: createWrapper() },\n );\n\n act(() => {\n result.current.management.initThread(\"thread_456\");\n });\n\n expect(result.current.state.threadMap.thread_456).toBeDefined();\n expect(result.current.state.threadMap.thread_456.thread.id).toBe(\n \"thread_456\",\n );\n });\n\n it(\"switchThread changes currentThreadId\", () => {\n const { result } = renderHook(\n () => ({\n state: useStreamState(),\n management: useThreadManagement(),\n }),\n { wrapper: createWrapper() },\n );\n\n // Initialize and switch to a thread\n act(() => {\n result.current.management.initThread(\"thread_789\");\n result.current.management.switchThread(\"thread_789\");\n });\n\n expect(result.current.state.currentThreadId).toBe(\"thread_789\");\n });\n\n it(\"startNewThread creates temp thread and switches to it\", () => {\n const { result } = renderHook(\n () => ({\n state: useStreamState(),\n management: useThreadManagement(),\n }),\n { wrapper: createWrapper() },\n );\n\n let tempId: string;\n act(() => {\n tempId = result.current.management.startNewThread();\n });\n\n expect(tempId!).toBe(\"placeholder\");\n expect(result.current.state.currentThreadId).toBe(\"placeholder\");\n expect(result.current.state.threadMap.placeholder).toBeDefined();\n });\n });\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"tambo-v1-stub-provider.d.ts","sourceRoot":"","sources":["../../../src/v1/providers/tambo-v1-stub-provider.tsx"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAE,EAAW,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAC/D,OAAO,KAAK,EACV,cAAc,EACd,SAAS,EAEV,MAAM,gCAAgC,CAAC;AAGxC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAgBrD;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC;;;OAGG;IACH,MAAM,CAAC,EAAE,aAAa,GAAG;QAAE,QAAQ,EAAE,cAAc,EAAE,CAAA;KAAE,CAAC;IAExD;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC;IAE9B;;OAEG;IACH,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;IAEpB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAE/C;;OAEG;IACH,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC,KAAK,IAAI,CAAC;IAElE;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,MAAM,CAAC;IAEhC;;OAEG;IACH,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAEnD;;OAEG;IACH,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3C;AAmCD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,QAAQ,EACR,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,gBAAgB,EAC1B,UAAe,EACf,KAAU,EACV,OAAO,EACP,UAAU,EAAE,iBAAsB,EAClC,WAAmB,EACnB,QAAQ,EACR,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,YAAY,GACb,EAAE,iBAAiB,CAAC,wBAAwB,CAAC,qBAwL7C"}
1
+ {"version":3,"file":"tambo-v1-stub-provider.d.ts","sourceRoot":"","sources":["../../../src/v1/providers/tambo-v1-stub-provider.tsx"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAE,EAAW,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAC/D,OAAO,KAAK,EACV,cAAc,EACd,SAAS,EAEV,MAAM,gCAAgC,CAAC;AAGxC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAgBrD;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC;;;OAGG;IACH,MAAM,CAAC,EAAE,aAAa,GAAG;QAAE,QAAQ,EAAE,cAAc,EAAE,CAAA;KAAE,CAAC;IAExD;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC;IAE9B;;OAEG;IACH,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;IAEpB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAE/C;;OAEG;IACH,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC,KAAK,IAAI,CAAC;IAElE;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,MAAM,CAAC;IAEhC;;OAEG;IACH,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAEnD;;OAEG;IACH,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3C;AAmCD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,QAAQ,EACR,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,gBAAgB,EAC1B,UAAe,EACf,KAAU,EACV,OAAO,EACP,UAAU,EAAE,iBAAsB,EAClC,WAAmB,EACnB,QAAQ,EACR,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,YAAY,GACb,EAAE,iBAAiB,CAAC,wBAAwB,CAAC,qBA4L7C"}
@@ -141,6 +141,7 @@ export function TamboV1StubProvider({ children, thread: threadData, threadId: pr
141
141
  context: undefined,
142
142
  submittedAt: 0,
143
143
  isPaused: false,
144
+ isDisabled: false,
144
145
  };
145
146
  }, [inputValue, threadId, onSubmit, onSetValue, setInputValueInternal]);
146
147
  // Registry context
@@ -167,6 +168,9 @@ export function TamboV1StubProvider({ children, thread: threadData, threadId: pr
167
168
  client: stubClient,
168
169
  queryClient,
169
170
  isUpdatingToken: false,
171
+ tokenExchangeError: null,
172
+ userToken: undefined,
173
+ hasValidToken: false,
170
174
  }), [stubClient, queryClient]);
171
175
  return (React.createElement(QueryClientProvider, { client: queryClient },
172
176
  React.createElement(TamboClientContext.Provider, { value: clientContext },
@@ -1 +1 @@
1
- {"version":3,"file":"tambo-v1-stub-provider.js","sourceRoot":"","sources":["../../../src/v1/providers/tambo-v1-stub-provider.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\n/**\n * TamboV1StubProvider - Mock Provider for Testing\n *\n * Provides stubbed versions of all v1 contexts for testing components\n * that use Tambo hooks without making real API calls.\n * @example\n * ```tsx\n * const mockThread = {\n * id: \"thread_123\",\n * messages: [\n * { id: \"msg_1\", role: \"user\", content: [{ type: \"text\", text: \"Hello\" }], createdAt: \"...\" },\n * { id: \"msg_2\", role: \"assistant\", content: [{ type: \"text\", text: \"Hi!\" }], createdAt: \"...\" },\n * ],\n * status: \"idle\",\n * createdAt: \"2024-01-01T00:00:00Z\",\n * updatedAt: \"2024-01-01T00:00:00Z\",\n * };\n *\n * function TestComponent() {\n * return (\n * <TamboV1StubProvider thread={mockThread}>\n * <MyComponent />\n * </TamboV1StubProvider>\n * );\n * }\n * ```\n */\n\nimport TamboAI from \"@tambo-ai/typescript-sdk\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport React, { useMemo, type PropsWithChildren } from \"react\";\nimport type {\n TamboComponent,\n TamboTool,\n TamboToolRegistry,\n} from \"../../model/component-metadata\";\nimport { TamboClientContext } from \"../../providers/tambo-client-provider\";\nimport { TamboRegistryContext } from \"../../providers/tambo-registry-provider\";\nimport type { TamboV1Message } from \"../types/message\";\nimport type { TamboV1Thread } from \"../types/thread\";\nimport type {\n StreamAction,\n StreamState,\n ThreadState,\n} from \"../utils/event-accumulator\";\nimport { TamboV1ConfigContext, type TamboV1Config } from \"./tambo-v1-provider\";\nimport {\n TamboV1StreamProvider,\n type ThreadManagement,\n} from \"./tambo-v1-stream-context\";\nimport {\n TamboV1ThreadInputContext,\n type TamboV1ThreadInputContextProps,\n} from \"./tambo-v1-thread-input-provider\";\n\n/**\n * Props for TamboV1StubProvider\n */\nexport interface TamboV1StubProviderProps {\n /**\n * Thread data to display.\n * Can be a full TamboV1Thread or just an array of messages.\n */\n thread?: TamboV1Thread | { messages: TamboV1Message[] };\n\n /**\n * Optional thread ID. Defaults to \"stub_thread\" or thread.id if provided.\n */\n threadId?: string;\n\n /**\n * Components to register with the registry.\n */\n components?: TamboComponent[];\n\n /**\n * Tools to register with the registry.\n */\n tools?: TamboTool[];\n\n /**\n * User key for the config context.\n */\n userKey?: string;\n\n /**\n * Initial input value for the thread input context.\n */\n inputValue?: string;\n\n /**\n * Whether the thread is currently streaming.\n */\n isStreaming?: boolean;\n\n /**\n * Override for the submit function.\n * If not provided, submit will be a no-op that returns the threadId.\n */\n onSubmit?: () => Promise<{ threadId: string }>;\n\n /**\n * Override for the setValue function.\n */\n onSetValue?: (value: string | ((prev: string) => string)) => void;\n\n /**\n * Override for startNewThread.\n */\n onStartNewThread?: () => string;\n\n /**\n * Override for switchThread.\n */\n onSwitchThread?: (threadId: string | null) => void;\n\n /**\n * Override for initThread.\n */\n onInitThread?: (threadId: string) => void;\n}\n\n/**\n * Creates a default TamboV1Thread from messages or returns the full thread.\n * @returns A normalized thread object\n */\nfunction normalizeThread(\n threadData: TamboV1Thread | { messages: TamboV1Message[] } | undefined,\n threadId: string,\n): TamboV1Thread {\n if (!threadData) {\n return {\n id: threadId,\n messages: [],\n status: \"idle\",\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n lastRunCancelled: false,\n };\n }\n\n if (\"id\" in threadData && \"status\" in threadData) {\n return threadData;\n }\n\n return {\n id: threadId,\n messages: threadData.messages,\n status: \"idle\",\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n lastRunCancelled: false,\n };\n}\n\n/**\n * TamboV1StubProvider provides mock implementations of all v1 contexts\n * for testing components that use Tambo hooks.\n *\n * All operations are no-ops by default, returning stub data.\n * Override specific behaviors via props as needed for testing.\n * Stream state is derived once from props and is not updated by thread management.\n * @returns A provider wrapper suitable for tests\n */\nexport function TamboV1StubProvider({\n children,\n thread: threadData,\n threadId: providedThreadId,\n components = [],\n tools = [],\n userKey,\n inputValue: initialInputValue = \"\",\n isStreaming = false,\n onSubmit,\n onSetValue,\n onStartNewThread,\n onSwitchThread,\n onInitThread,\n}: PropsWithChildren<TamboV1StubProviderProps>) {\n // Determine thread ID\n const threadId =\n providedThreadId ??\n (threadData && \"id\" in threadData ? threadData.id : \"stub_thread\");\n\n // Normalize thread data\n const thread = normalizeThread(threadData, threadId);\n\n // Create stub QueryClient\n const queryClient = useMemo(\n () =>\n new QueryClient({\n defaultOptions: {\n queries: { retry: false },\n mutations: { retry: false },\n },\n }),\n [],\n );\n\n // Create stub client\n const stubClient = useMemo(() => ({}) as TamboAI, []);\n\n // Build component registry\n const componentList = useMemo(() => {\n const list: TamboRegistryContext[\"componentList\"] = {};\n\n for (const component of components) {\n list[component.name] = {\n component: component.component,\n loadingComponent: component.loadingComponent,\n name: component.name,\n description: component.description,\n props: component.propsDefinition ?? {},\n contextTools: [],\n };\n }\n\n return list;\n }, [components]);\n\n // Build tool registry\n const toolRegistry = useMemo(() => {\n return tools.reduce((acc, tool) => {\n acc[tool.name] = tool;\n return acc;\n }, {} as TamboToolRegistry);\n }, [tools]);\n\n // Stream state\n const streamState = useMemo<StreamState>(() => {\n const threadState: ThreadState = {\n thread,\n streaming: {\n status: isStreaming ? \"streaming\" : \"idle\",\n },\n accumulatingToolArgs: new Map(),\n };\n\n return {\n threadMap: { [threadId]: threadState },\n currentThreadId: threadId,\n };\n }, [thread, threadId, isStreaming]);\n\n // Stream dispatch (no-op)\n const streamDispatch = useMemo<React.Dispatch<StreamAction>>(\n () => () => {},\n [],\n );\n\n // Thread management\n const threadManagement = useMemo<ThreadManagement>(\n () => ({\n initThread: onInitThread ?? (() => {}),\n switchThread: onSwitchThread ?? (() => {}),\n startNewThread:\n onStartNewThread ??\n (() => {\n const newId = `stub_${crypto.randomUUID()}`;\n return newId;\n }),\n }),\n [onInitThread, onSwitchThread, onStartNewThread],\n );\n\n // Config context\n const config = useMemo<TamboV1Config>(() => ({ userKey }), [userKey]);\n\n // Input state (managed internally for stub)\n const [inputValue, setInputValueInternal] = React.useState(initialInputValue);\n\n // Thread input context\n const threadInputContext = useMemo<TamboV1ThreadInputContextProps>(() => {\n const setValue: React.Dispatch<React.SetStateAction<string>> =\n onSetValue ?? setInputValueInternal;\n\n const submit: TamboV1ThreadInputContextProps[\"submit\"] =\n onSubmit ??\n (async () => {\n return { threadId };\n });\n\n return {\n value: inputValue,\n setValue,\n submit,\n threadId,\n setThreadId: () => {},\n images: [],\n addImage: async () => {},\n addImages: async () => {},\n removeImage: () => {},\n clearImages: () => {},\n isPending: false,\n isError: false,\n error: null,\n isIdle: true,\n isSuccess: false,\n status: \"idle\",\n data: undefined,\n variables: undefined,\n failureCount: 0,\n failureReason: null,\n reset: () => {},\n context: undefined,\n submittedAt: 0,\n isPaused: false,\n };\n }, [inputValue, threadId, onSubmit, onSetValue, setInputValueInternal]);\n\n // Registry context\n const registryContext = useMemo<TamboRegistryContext>(\n () => ({\n componentList,\n toolRegistry,\n componentToolAssociations: {},\n mcpServerInfos: [],\n resources: [],\n resourceSource: null,\n onCallUnregisteredTool: undefined,\n registerComponent: () => {},\n registerTool: () => {},\n registerTools: () => {},\n addToolAssociation: () => {},\n registerMcpServer: () => {},\n registerMcpServers: () => {},\n registerResource: () => {},\n registerResources: () => {},\n registerResourceSource: () => {},\n }),\n [componentList, toolRegistry],\n );\n\n // Client context\n const clientContext = useMemo(\n () => ({\n client: stubClient,\n queryClient,\n isUpdatingToken: false,\n }),\n [stubClient, queryClient],\n );\n\n return (\n <QueryClientProvider client={queryClient}>\n <TamboClientContext.Provider value={clientContext}>\n <TamboRegistryContext.Provider value={registryContext}>\n <TamboV1ConfigContext.Provider value={config}>\n <TamboV1StreamProvider\n state={streamState}\n dispatch={streamDispatch}\n threadManagement={threadManagement}\n >\n <TamboV1ThreadInputContext.Provider value={threadInputContext}>\n {children}\n </TamboV1ThreadInputContext.Provider>\n </TamboV1StreamProvider>\n </TamboV1ConfigContext.Provider>\n </TamboRegistryContext.Provider>\n </TamboClientContext.Provider>\n </QueryClientProvider>\n );\n}\n"]}
1
+ {"version":3,"file":"tambo-v1-stub-provider.js","sourceRoot":"","sources":["../../../src/v1/providers/tambo-v1-stub-provider.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\n/**\n * TamboV1StubProvider - Mock Provider for Testing\n *\n * Provides stubbed versions of all v1 contexts for testing components\n * that use Tambo hooks without making real API calls.\n * @example\n * ```tsx\n * const mockThread = {\n * id: \"thread_123\",\n * messages: [\n * { id: \"msg_1\", role: \"user\", content: [{ type: \"text\", text: \"Hello\" }], createdAt: \"...\" },\n * { id: \"msg_2\", role: \"assistant\", content: [{ type: \"text\", text: \"Hi!\" }], createdAt: \"...\" },\n * ],\n * status: \"idle\",\n * createdAt: \"2024-01-01T00:00:00Z\",\n * updatedAt: \"2024-01-01T00:00:00Z\",\n * };\n *\n * function TestComponent() {\n * return (\n * <TamboV1StubProvider thread={mockThread}>\n * <MyComponent />\n * </TamboV1StubProvider>\n * );\n * }\n * ```\n */\n\nimport TamboAI from \"@tambo-ai/typescript-sdk\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport React, { useMemo, type PropsWithChildren } from \"react\";\nimport type {\n TamboComponent,\n TamboTool,\n TamboToolRegistry,\n} from \"../../model/component-metadata\";\nimport { TamboClientContext } from \"../../providers/tambo-client-provider\";\nimport { TamboRegistryContext } from \"../../providers/tambo-registry-provider\";\nimport type { TamboV1Message } from \"../types/message\";\nimport type { TamboV1Thread } from \"../types/thread\";\nimport type {\n StreamAction,\n StreamState,\n ThreadState,\n} from \"../utils/event-accumulator\";\nimport { TamboV1ConfigContext, type TamboV1Config } from \"./tambo-v1-provider\";\nimport {\n TamboV1StreamProvider,\n type ThreadManagement,\n} from \"./tambo-v1-stream-context\";\nimport {\n TamboV1ThreadInputContext,\n type TamboV1ThreadInputContextProps,\n} from \"./tambo-v1-thread-input-provider\";\n\n/**\n * Props for TamboV1StubProvider\n */\nexport interface TamboV1StubProviderProps {\n /**\n * Thread data to display.\n * Can be a full TamboV1Thread or just an array of messages.\n */\n thread?: TamboV1Thread | { messages: TamboV1Message[] };\n\n /**\n * Optional thread ID. Defaults to \"stub_thread\" or thread.id if provided.\n */\n threadId?: string;\n\n /**\n * Components to register with the registry.\n */\n components?: TamboComponent[];\n\n /**\n * Tools to register with the registry.\n */\n tools?: TamboTool[];\n\n /**\n * User key for the config context.\n */\n userKey?: string;\n\n /**\n * Initial input value for the thread input context.\n */\n inputValue?: string;\n\n /**\n * Whether the thread is currently streaming.\n */\n isStreaming?: boolean;\n\n /**\n * Override for the submit function.\n * If not provided, submit will be a no-op that returns the threadId.\n */\n onSubmit?: () => Promise<{ threadId: string }>;\n\n /**\n * Override for the setValue function.\n */\n onSetValue?: (value: string | ((prev: string) => string)) => void;\n\n /**\n * Override for startNewThread.\n */\n onStartNewThread?: () => string;\n\n /**\n * Override for switchThread.\n */\n onSwitchThread?: (threadId: string | null) => void;\n\n /**\n * Override for initThread.\n */\n onInitThread?: (threadId: string) => void;\n}\n\n/**\n * Creates a default TamboV1Thread from messages or returns the full thread.\n * @returns A normalized thread object\n */\nfunction normalizeThread(\n threadData: TamboV1Thread | { messages: TamboV1Message[] } | undefined,\n threadId: string,\n): TamboV1Thread {\n if (!threadData) {\n return {\n id: threadId,\n messages: [],\n status: \"idle\",\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n lastRunCancelled: false,\n };\n }\n\n if (\"id\" in threadData && \"status\" in threadData) {\n return threadData;\n }\n\n return {\n id: threadId,\n messages: threadData.messages,\n status: \"idle\",\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n lastRunCancelled: false,\n };\n}\n\n/**\n * TamboV1StubProvider provides mock implementations of all v1 contexts\n * for testing components that use Tambo hooks.\n *\n * All operations are no-ops by default, returning stub data.\n * Override specific behaviors via props as needed for testing.\n * Stream state is derived once from props and is not updated by thread management.\n * @returns A provider wrapper suitable for tests\n */\nexport function TamboV1StubProvider({\n children,\n thread: threadData,\n threadId: providedThreadId,\n components = [],\n tools = [],\n userKey,\n inputValue: initialInputValue = \"\",\n isStreaming = false,\n onSubmit,\n onSetValue,\n onStartNewThread,\n onSwitchThread,\n onInitThread,\n}: PropsWithChildren<TamboV1StubProviderProps>) {\n // Determine thread ID\n const threadId =\n providedThreadId ??\n (threadData && \"id\" in threadData ? threadData.id : \"stub_thread\");\n\n // Normalize thread data\n const thread = normalizeThread(threadData, threadId);\n\n // Create stub QueryClient\n const queryClient = useMemo(\n () =>\n new QueryClient({\n defaultOptions: {\n queries: { retry: false },\n mutations: { retry: false },\n },\n }),\n [],\n );\n\n // Create stub client\n const stubClient = useMemo(() => ({}) as TamboAI, []);\n\n // Build component registry\n const componentList = useMemo(() => {\n const list: TamboRegistryContext[\"componentList\"] = {};\n\n for (const component of components) {\n list[component.name] = {\n component: component.component,\n loadingComponent: component.loadingComponent,\n name: component.name,\n description: component.description,\n props: component.propsDefinition ?? {},\n contextTools: [],\n };\n }\n\n return list;\n }, [components]);\n\n // Build tool registry\n const toolRegistry = useMemo(() => {\n return tools.reduce((acc, tool) => {\n acc[tool.name] = tool;\n return acc;\n }, {} as TamboToolRegistry);\n }, [tools]);\n\n // Stream state\n const streamState = useMemo<StreamState>(() => {\n const threadState: ThreadState = {\n thread,\n streaming: {\n status: isStreaming ? \"streaming\" : \"idle\",\n },\n accumulatingToolArgs: new Map(),\n };\n\n return {\n threadMap: { [threadId]: threadState },\n currentThreadId: threadId,\n };\n }, [thread, threadId, isStreaming]);\n\n // Stream dispatch (no-op)\n const streamDispatch = useMemo<React.Dispatch<StreamAction>>(\n () => () => {},\n [],\n );\n\n // Thread management\n const threadManagement = useMemo<ThreadManagement>(\n () => ({\n initThread: onInitThread ?? (() => {}),\n switchThread: onSwitchThread ?? (() => {}),\n startNewThread:\n onStartNewThread ??\n (() => {\n const newId = `stub_${crypto.randomUUID()}`;\n return newId;\n }),\n }),\n [onInitThread, onSwitchThread, onStartNewThread],\n );\n\n // Config context\n const config = useMemo<TamboV1Config>(() => ({ userKey }), [userKey]);\n\n // Input state (managed internally for stub)\n const [inputValue, setInputValueInternal] = React.useState(initialInputValue);\n\n // Thread input context\n const threadInputContext = useMemo<TamboV1ThreadInputContextProps>(() => {\n const setValue: React.Dispatch<React.SetStateAction<string>> =\n onSetValue ?? setInputValueInternal;\n\n const submit: TamboV1ThreadInputContextProps[\"submit\"] =\n onSubmit ??\n (async () => {\n return { threadId };\n });\n\n return {\n value: inputValue,\n setValue,\n submit,\n threadId,\n setThreadId: () => {},\n images: [],\n addImage: async () => {},\n addImages: async () => {},\n removeImage: () => {},\n clearImages: () => {},\n isPending: false,\n isError: false,\n error: null,\n isIdle: true,\n isSuccess: false,\n status: \"idle\",\n data: undefined,\n variables: undefined,\n failureCount: 0,\n failureReason: null,\n reset: () => {},\n context: undefined,\n submittedAt: 0,\n isPaused: false,\n isDisabled: false,\n };\n }, [inputValue, threadId, onSubmit, onSetValue, setInputValueInternal]);\n\n // Registry context\n const registryContext = useMemo<TamboRegistryContext>(\n () => ({\n componentList,\n toolRegistry,\n componentToolAssociations: {},\n mcpServerInfos: [],\n resources: [],\n resourceSource: null,\n onCallUnregisteredTool: undefined,\n registerComponent: () => {},\n registerTool: () => {},\n registerTools: () => {},\n addToolAssociation: () => {},\n registerMcpServer: () => {},\n registerMcpServers: () => {},\n registerResource: () => {},\n registerResources: () => {},\n registerResourceSource: () => {},\n }),\n [componentList, toolRegistry],\n );\n\n // Client context\n const clientContext = useMemo(\n () => ({\n client: stubClient,\n queryClient,\n isUpdatingToken: false,\n tokenExchangeError: null,\n userToken: undefined,\n hasValidToken: false,\n }),\n [stubClient, queryClient],\n );\n\n return (\n <QueryClientProvider client={queryClient}>\n <TamboClientContext.Provider value={clientContext}>\n <TamboRegistryContext.Provider value={registryContext}>\n <TamboV1ConfigContext.Provider value={config}>\n <TamboV1StreamProvider\n state={streamState}\n dispatch={streamDispatch}\n threadManagement={threadManagement}\n >\n <TamboV1ThreadInputContext.Provider value={threadInputContext}>\n {children}\n </TamboV1ThreadInputContext.Provider>\n </TamboV1StreamProvider>\n </TamboV1ConfigContext.Provider>\n </TamboRegistryContext.Provider>\n </TamboClientContext.Provider>\n </QueryClientProvider>\n );\n}\n"]}
@@ -9,6 +9,7 @@
9
9
  import React, { type PropsWithChildren } from "react";
10
10
  import { type StagedImage } from "../../hooks/use-message-images.js";
11
11
  import { type UseTamboMutationResult } from "../../hooks/react-query-hooks.js";
12
+ import type { ToolChoice } from "../types/tool-choice.js";
12
13
  export declare const INPUT_ERROR_MESSAGES: {
13
14
  readonly EMPTY: "Message cannot be empty";
14
15
  readonly VALIDATION: "Invalid message format";
@@ -21,6 +22,14 @@ export interface SubmitOptions {
21
22
  * Enable debug logging for the stream
22
23
  */
23
24
  debug?: boolean;
25
+ /**
26
+ * How the model should use tools. Defaults to "auto".
27
+ * - "auto": Model decides whether to use tools
28
+ * - "required": Model must use at least one tool
29
+ * - "none": Model cannot use tools
30
+ * - { name: "toolName" }: Model must use the specified tool
31
+ */
32
+ toolChoice?: ToolChoice;
24
33
  }
25
34
  /**
26
35
  * Context props for thread input state
@@ -55,6 +64,8 @@ export interface TamboV1ThreadInputContextProps extends Omit<UseTamboMutationRes
55
64
  clearImages: () => void;
56
65
  /** Current thread ID being used for input (from stream state) */
57
66
  threadId: string | undefined;
67
+ /** Whether the input should be disabled (pending submission or not authenticated) */
68
+ isDisabled: boolean;
58
69
  }
59
70
  /**
60
71
  * Context for thread input state.
@@ -1 +1 @@
1
- {"version":3,"file":"tambo-v1-thread-input-provider.d.ts","sourceRoot":"","sources":["../../../src/v1/providers/tambo-v1-thread-input-provider.tsx"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,EAKZ,KAAK,iBAAiB,EACvB,MAAM,OAAO,CAAC;AACf,OAAO,EAEL,KAAK,WAAW,EACjB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,+BAA+B,CAAC;AAUvC,eAAO,MAAM,oBAAoB;;;CAGvB,CAAC;AAkCX;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,8BAA+B,SAAQ,IAAI,CAC1D,sBAAsB,CACpB;IAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,EAChC,KAAK,EACL,aAAa,GAAG,SAAS,CAC1B,EACD,QAAQ,GAAG,aAAa,CACzB;IACC,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;IAEvD;;;;OAIG;IACH,MAAM,EAAE,CACN,OAAO,CAAC,EAAE,aAAa,KACpB,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC,CAAC;IAE/C,8BAA8B;IAC9B,MAAM,EAAE,WAAW,EAAE,CAAC;IAEtB,yBAAyB;IACzB,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAExC,0BAA0B;IAC1B,SAAS,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5C,4BAA4B;IAC5B,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAElC,8BAA8B;IAC9B,WAAW,EAAE,MAAM,IAAI,CAAC;IAExB,iEAAiE;IACjE,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B;AAED;;;GAGG;AACH,eAAO,MAAM,yBAAyB,2DAE1B,CAAC;AAEb;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CAAC,EAAE,QAAQ,EAAE,EAAE,iBAAiB,qBAoFzE;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,qBAAqB,IAAI,8BAA8B,CAQtE"}
1
+ {"version":3,"file":"tambo-v1-thread-input-provider.d.ts","sourceRoot":"","sources":["../../../src/v1/providers/tambo-v1-thread-input-provider.tsx"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,EAKZ,KAAK,iBAAiB,EACvB,MAAM,OAAO,CAAC;AACf,OAAO,EAEL,KAAK,WAAW,EACjB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,+BAA+B,CAAC;AAGvC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AASvD,eAAO,MAAM,oBAAoB;;;CAGvB,CAAC;AAkCX;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,8BAA+B,SAAQ,IAAI,CAC1D,sBAAsB,CACpB;IAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,EAChC,KAAK,EACL,aAAa,GAAG,SAAS,CAC1B,EACD,QAAQ,GAAG,aAAa,CACzB;IACC,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;IAEvD;;;;OAIG;IACH,MAAM,EAAE,CACN,OAAO,CAAC,EAAE,aAAa,KACpB,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC,CAAC;IAE/C,8BAA8B;IAC9B,MAAM,EAAE,WAAW,EAAE,CAAC;IAEtB,yBAAyB;IACzB,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAExC,0BAA0B;IAC1B,SAAS,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5C,4BAA4B;IAC5B,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAElC,8BAA8B;IAC9B,WAAW,EAAE,MAAM,IAAI,CAAC;IAExB,iEAAiE;IACjE,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAE7B,qFAAqF;IACrF,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;;GAGG;AACH,eAAO,MAAM,yBAAyB,2DAE1B,CAAC;AAEb;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CAAC,EAAE,QAAQ,EAAE,EAAE,iBAAiB,qBAgGzE;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,qBAAqB,IAAI,8BAA8B,CAQtE"}
@@ -12,6 +12,7 @@ import { useMessageImages, } from "../../hooks/use-message-images.js";
12
12
  import { useTamboMutation, } from "../../hooks/react-query-hooks.js";
13
13
  import { useTamboV1SendMessage } from "../hooks/use-tambo-v1-send-message.js";
14
14
  import { isPlaceholderThreadId } from "../utils/event-accumulator.js";
15
+ import { useTamboV1AuthState } from "../hooks/use-tambo-v1-auth-state.js";
15
16
  import { useStreamDispatch, useStreamState } from "./tambo-v1-stream-context.js";
16
17
  // Error messages for various input-related error scenarios.
17
18
  // TODO: Reintroduce explicit `NETWORK` and `SERVER` keys once `submit()` maps
@@ -65,12 +66,18 @@ export function TamboV1ThreadInputProvider({ children }) {
65
66
  const imageState = useMessageImages();
66
67
  const streamState = useStreamState();
67
68
  const dispatch = useStreamDispatch();
69
+ const authState = useTamboV1AuthState();
68
70
  // Use the current thread from stream state directly
69
71
  // Placeholder ID indicates a new thread should be created
70
72
  const currentThreadId = streamState.currentThreadId ?? undefined;
71
73
  const isNewThread = isPlaceholderThreadId(currentThreadId);
72
74
  const sendMessage = useTamboV1SendMessage(currentThreadId);
75
+ const isIdentified = authState.status === "identified";
73
76
  const submitFn = useCallback(async (options) => {
77
+ if (!isIdentified) {
78
+ throw new Error("Cannot submit: authentication is not ready. " +
79
+ "Ensure a valid userKey or userToken is provided.");
80
+ }
74
81
  const trimmedValue = inputValue.trim();
75
82
  // Check if we have content to send
76
83
  if (!trimmedValue && imageState.images.length === 0) {
@@ -90,6 +97,7 @@ export function TamboV1ThreadInputProvider({ children }) {
90
97
  },
91
98
  userMessageText: trimmedValue, // Pass text for optimistic display
92
99
  debug: options?.debug,
100
+ toolChoice: options?.toolChoice,
93
101
  });
94
102
  // Clear input and images after successful submission
95
103
  setInputValue("");
@@ -101,7 +109,7 @@ export function TamboV1ThreadInputProvider({ children }) {
101
109
  return result;
102
110
  },
103
111
  // `stagedImageToResourceContent` is a pure module-level helper (not a hook value).
104
- [inputValue, imageState, sendMessage, isNewThread, dispatch]);
112
+ [inputValue, imageState, sendMessage, isNewThread, dispatch, isIdentified]);
105
113
  const { mutateAsync: submitAsync, mutate: _unusedSubmit, ...mutationState } = useTamboMutation({
106
114
  mutationKey: ["v1-thread-input", currentThreadId],
107
115
  mutationFn: submitFn,
@@ -117,6 +125,7 @@ export function TamboV1ThreadInputProvider({ children }) {
117
125
  removeImage: imageState.removeImage,
118
126
  clearImages: imageState.clearImages,
119
127
  threadId: currentThreadId,
128
+ isDisabled: mutationState.isPending || !isIdentified,
120
129
  };
121
130
  return (React.createElement(TamboV1ThreadInputContext.Provider, { value: contextValue }, children));
122
131
  }
@@ -1 +1 @@
1
- {"version":3,"file":"tambo-v1-thread-input-provider.js","sourceRoot":"","sources":["../../../src/v1/providers/tambo-v1-thread-input-provider.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\n/**\n * TamboV1ThreadInputProvider - Shared Thread Input Context for v1 API\n *\n * Provides shared input state across all components, enabling features like\n * suggestions to update the input field directly.\n *\n * This mirrors the beta SDK's TamboThreadInputProvider pattern.\n */\n\nimport React, {\n createContext,\n useCallback,\n useContext,\n useState,\n type PropsWithChildren,\n} from \"react\";\nimport {\n useMessageImages,\n type StagedImage,\n} from \"../../hooks/use-message-images\";\nimport {\n useTamboMutation,\n type UseTamboMutationResult,\n} from \"../../hooks/react-query-hooks\";\nimport { useTamboV1SendMessage } from \"../hooks/use-tambo-v1-send-message\";\nimport type { InputMessage } from \"../types/message\";\nimport { isPlaceholderThreadId } from \"../utils/event-accumulator\";\nimport { useStreamDispatch, useStreamState } from \"./tambo-v1-stream-context\";\n\n// Error messages for various input-related error scenarios.\n// TODO: Reintroduce explicit `NETWORK` and `SERVER` keys once `submit()` maps\n// failures into a small, stable set of user-facing error codes (at minimum:\n// connectivity failures vs non-2xx responses).\nexport const INPUT_ERROR_MESSAGES = {\n EMPTY: \"Message cannot be empty\",\n VALIDATION: \"Invalid message format\",\n} as const;\n\nfunction stagedImageToResourceContent(\n image: StagedImage,\n): InputMessage[\"content\"][number] {\n if (!image.dataUrl.startsWith(\"data:\")) {\n throw new Error(INPUT_ERROR_MESSAGES.VALIDATION);\n }\n\n const commaIndex = image.dataUrl.indexOf(\",\");\n if (commaIndex === -1) {\n throw new Error(INPUT_ERROR_MESSAGES.VALIDATION);\n }\n\n const header = image.dataUrl.slice(\"data:\".length, commaIndex);\n const [mimeType, ...params] = header.split(\";\");\n const isBase64 = params.includes(\"base64\");\n\n if (mimeType !== image.type || !isBase64) {\n throw new Error(INPUT_ERROR_MESSAGES.VALIDATION);\n }\n\n return {\n type: \"resource\",\n resource: {\n name: image.name,\n mimeType: image.type,\n // Shared.Resource.blob expects base64-encoded data; this is the base64\n // payload from the `data:` URL.\n blob: image.dataUrl.slice(commaIndex + 1),\n },\n };\n}\n\n/**\n * Options for submitting a message\n */\nexport interface SubmitOptions {\n /**\n * Enable debug logging for the stream\n */\n debug?: boolean;\n}\n\n/**\n * Context props for thread input state\n */\nexport interface TamboV1ThreadInputContextProps extends Omit<\n UseTamboMutationResult<\n { threadId: string | undefined },\n Error,\n SubmitOptions | undefined\n >,\n \"mutate\" | \"mutateAsync\"\n> {\n /** Current value of the input field */\n value: string;\n\n /**\n * Function to update the input value\n * @param value - New value for the input field\n */\n setValue: React.Dispatch<React.SetStateAction<string>>;\n\n /**\n * Function to submit the current input value\n * @param options - Submission options\n * @returns Promise with the threadId\n */\n submit: (\n options?: SubmitOptions,\n ) => Promise<{ threadId: string | undefined }>;\n\n /** Currently staged images */\n images: StagedImage[];\n\n /** Add a single image */\n addImage: (file: File) => Promise<void>;\n\n /** Add multiple images */\n addImages: (files: File[]) => Promise<void>;\n\n /** Remove an image by id */\n removeImage: (id: string) => void;\n\n /** Clear all staged images */\n clearImages: () => void;\n\n /** Current thread ID being used for input (from stream state) */\n threadId: string | undefined;\n}\n\n/**\n * Context for thread input state.\n * @internal\n */\nexport const TamboV1ThreadInputContext = createContext<\n TamboV1ThreadInputContextProps | undefined\n>(undefined);\n\n/**\n * Provider that manages shared thread input state across all components.\n *\n * This ensures that useTamboV1ThreadInput, useTamboV1Suggestions, and other components\n * all share the same input state.\n * @param props - Provider props\n * @param props.children - Child components\n * @returns Thread input context provider\n */\nexport function TamboV1ThreadInputProvider({ children }: PropsWithChildren) {\n const [inputValue, setInputValue] = useState(\"\");\n const imageState = useMessageImages();\n const streamState = useStreamState();\n const dispatch = useStreamDispatch();\n\n // Use the current thread from stream state directly\n // Placeholder ID indicates a new thread should be created\n const currentThreadId = streamState.currentThreadId ?? undefined;\n const isNewThread = isPlaceholderThreadId(currentThreadId);\n const sendMessage = useTamboV1SendMessage(currentThreadId);\n\n const submitFn = useCallback(\n async (\n options?: SubmitOptions,\n ): Promise<{ threadId: string | undefined }> => {\n const trimmedValue = inputValue.trim();\n\n // Check if we have content to send\n if (!trimmedValue && imageState.images.length === 0) {\n throw new Error(INPUT_ERROR_MESSAGES.EMPTY);\n }\n\n const content: InputMessage[\"content\"] = [];\n\n if (trimmedValue) {\n content.push({ type: \"text\", text: trimmedValue });\n }\n\n for (const image of imageState.images) {\n content.push(stagedImageToResourceContent(image));\n }\n\n const result = await sendMessage.mutateAsync({\n message: {\n role: \"user\",\n content,\n },\n userMessageText: trimmedValue, // Pass text for optimistic display\n debug: options?.debug,\n });\n\n // Clear input and images after successful submission\n setInputValue(\"\");\n imageState.clearImages();\n\n // Update stream context's currentThreadId if a new thread was created\n if (result.threadId && isNewThread) {\n dispatch({ type: \"SET_CURRENT_THREAD\", threadId: result.threadId });\n }\n\n return result;\n },\n // `stagedImageToResourceContent` is a pure module-level helper (not a hook value).\n [inputValue, imageState, sendMessage, isNewThread, dispatch],\n );\n\n const {\n mutateAsync: submitAsync,\n mutate: _unusedSubmit,\n ...mutationState\n } = useTamboMutation({\n mutationKey: [\"v1-thread-input\", currentThreadId],\n mutationFn: submitFn,\n });\n\n const contextValue: TamboV1ThreadInputContextProps = {\n ...mutationState,\n value: inputValue,\n setValue: setInputValue,\n submit: submitAsync,\n images: imageState.images,\n addImage: imageState.addImage,\n addImages: imageState.addImages,\n removeImage: imageState.removeImage,\n clearImages: imageState.clearImages,\n threadId: currentThreadId,\n };\n\n return (\n <TamboV1ThreadInputContext.Provider value={contextValue}>\n {children}\n </TamboV1ThreadInputContext.Provider>\n );\n}\n\n/**\n * Hook to access the shared thread input state.\n *\n * All components using this hook share the same input state, enabling\n * features like suggestions to update the input field directly.\n * @returns The shared thread input context\n * @throws {Error} If used outside TamboV1ThreadInputProvider\n * @example\n * ```tsx\n * function ChatInput() {\n * const { value, setValue, submit, isPending } = useTamboV1ThreadInput();\n *\n * return (\n * <form onSubmit={(e) => { e.preventDefault(); submit(); }}>\n * <input\n * value={value}\n * onChange={(e) => setValue(e.target.value)}\n * disabled={isPending}\n * />\n * <button type=\"submit\" disabled={isPending}>Send</button>\n * </form>\n * );\n * }\n * ```\n */\nexport function useTamboV1ThreadInput(): TamboV1ThreadInputContextProps {\n const context = useContext(TamboV1ThreadInputContext);\n if (!context) {\n throw new Error(\n \"useTamboV1ThreadInput must be used within TamboV1ThreadInputProvider\",\n );\n }\n return context;\n}\n"]}
1
+ {"version":3,"file":"tambo-v1-thread-input-provider.js","sourceRoot":"","sources":["../../../src/v1/providers/tambo-v1-thread-input-provider.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\n/**\n * TamboV1ThreadInputProvider - Shared Thread Input Context for v1 API\n *\n * Provides shared input state across all components, enabling features like\n * suggestions to update the input field directly.\n *\n * This mirrors the beta SDK's TamboThreadInputProvider pattern.\n */\n\nimport React, {\n createContext,\n useCallback,\n useContext,\n useState,\n type PropsWithChildren,\n} from \"react\";\nimport {\n useMessageImages,\n type StagedImage,\n} from \"../../hooks/use-message-images\";\nimport {\n useTamboMutation,\n type UseTamboMutationResult,\n} from \"../../hooks/react-query-hooks\";\nimport { useTamboV1SendMessage } from \"../hooks/use-tambo-v1-send-message\";\nimport type { InputMessage } from \"../types/message\";\nimport type { ToolChoice } from \"../types/tool-choice\";\nimport { isPlaceholderThreadId } from \"../utils/event-accumulator\";\nimport { useTamboV1AuthState } from \"../hooks/use-tambo-v1-auth-state\";\nimport { useStreamDispatch, useStreamState } from \"./tambo-v1-stream-context\";\n\n// Error messages for various input-related error scenarios.\n// TODO: Reintroduce explicit `NETWORK` and `SERVER` keys once `submit()` maps\n// failures into a small, stable set of user-facing error codes (at minimum:\n// connectivity failures vs non-2xx responses).\nexport const INPUT_ERROR_MESSAGES = {\n EMPTY: \"Message cannot be empty\",\n VALIDATION: \"Invalid message format\",\n} as const;\n\nfunction stagedImageToResourceContent(\n image: StagedImage,\n): InputMessage[\"content\"][number] {\n if (!image.dataUrl.startsWith(\"data:\")) {\n throw new Error(INPUT_ERROR_MESSAGES.VALIDATION);\n }\n\n const commaIndex = image.dataUrl.indexOf(\",\");\n if (commaIndex === -1) {\n throw new Error(INPUT_ERROR_MESSAGES.VALIDATION);\n }\n\n const header = image.dataUrl.slice(\"data:\".length, commaIndex);\n const [mimeType, ...params] = header.split(\";\");\n const isBase64 = params.includes(\"base64\");\n\n if (mimeType !== image.type || !isBase64) {\n throw new Error(INPUT_ERROR_MESSAGES.VALIDATION);\n }\n\n return {\n type: \"resource\",\n resource: {\n name: image.name,\n mimeType: image.type,\n // Shared.Resource.blob expects base64-encoded data; this is the base64\n // payload from the `data:` URL.\n blob: image.dataUrl.slice(commaIndex + 1),\n },\n };\n}\n\n/**\n * Options for submitting a message\n */\nexport interface SubmitOptions {\n /**\n * Enable debug logging for the stream\n */\n debug?: boolean;\n\n /**\n * How the model should use tools. Defaults to \"auto\".\n * - \"auto\": Model decides whether to use tools\n * - \"required\": Model must use at least one tool\n * - \"none\": Model cannot use tools\n * - { name: \"toolName\" }: Model must use the specified tool\n */\n toolChoice?: ToolChoice;\n}\n\n/**\n * Context props for thread input state\n */\nexport interface TamboV1ThreadInputContextProps extends Omit<\n UseTamboMutationResult<\n { threadId: string | undefined },\n Error,\n SubmitOptions | undefined\n >,\n \"mutate\" | \"mutateAsync\"\n> {\n /** Current value of the input field */\n value: string;\n\n /**\n * Function to update the input value\n * @param value - New value for the input field\n */\n setValue: React.Dispatch<React.SetStateAction<string>>;\n\n /**\n * Function to submit the current input value\n * @param options - Submission options\n * @returns Promise with the threadId\n */\n submit: (\n options?: SubmitOptions,\n ) => Promise<{ threadId: string | undefined }>;\n\n /** Currently staged images */\n images: StagedImage[];\n\n /** Add a single image */\n addImage: (file: File) => Promise<void>;\n\n /** Add multiple images */\n addImages: (files: File[]) => Promise<void>;\n\n /** Remove an image by id */\n removeImage: (id: string) => void;\n\n /** Clear all staged images */\n clearImages: () => void;\n\n /** Current thread ID being used for input (from stream state) */\n threadId: string | undefined;\n\n /** Whether the input should be disabled (pending submission or not authenticated) */\n isDisabled: boolean;\n}\n\n/**\n * Context for thread input state.\n * @internal\n */\nexport const TamboV1ThreadInputContext = createContext<\n TamboV1ThreadInputContextProps | undefined\n>(undefined);\n\n/**\n * Provider that manages shared thread input state across all components.\n *\n * This ensures that useTamboV1ThreadInput, useTamboV1Suggestions, and other components\n * all share the same input state.\n * @param props - Provider props\n * @param props.children - Child components\n * @returns Thread input context provider\n */\nexport function TamboV1ThreadInputProvider({ children }: PropsWithChildren) {\n const [inputValue, setInputValue] = useState(\"\");\n const imageState = useMessageImages();\n const streamState = useStreamState();\n const dispatch = useStreamDispatch();\n const authState = useTamboV1AuthState();\n\n // Use the current thread from stream state directly\n // Placeholder ID indicates a new thread should be created\n const currentThreadId = streamState.currentThreadId ?? undefined;\n const isNewThread = isPlaceholderThreadId(currentThreadId);\n const sendMessage = useTamboV1SendMessage(currentThreadId);\n\n const isIdentified = authState.status === \"identified\";\n\n const submitFn = useCallback(\n async (\n options?: SubmitOptions,\n ): Promise<{ threadId: string | undefined }> => {\n if (!isIdentified) {\n throw new Error(\n \"Cannot submit: authentication is not ready. \" +\n \"Ensure a valid userKey or userToken is provided.\",\n );\n }\n\n const trimmedValue = inputValue.trim();\n\n // Check if we have content to send\n if (!trimmedValue && imageState.images.length === 0) {\n throw new Error(INPUT_ERROR_MESSAGES.EMPTY);\n }\n\n const content: InputMessage[\"content\"] = [];\n\n if (trimmedValue) {\n content.push({ type: \"text\", text: trimmedValue });\n }\n\n for (const image of imageState.images) {\n content.push(stagedImageToResourceContent(image));\n }\n\n const result = await sendMessage.mutateAsync({\n message: {\n role: \"user\",\n content,\n },\n userMessageText: trimmedValue, // Pass text for optimistic display\n debug: options?.debug,\n toolChoice: options?.toolChoice,\n });\n\n // Clear input and images after successful submission\n setInputValue(\"\");\n imageState.clearImages();\n\n // Update stream context's currentThreadId if a new thread was created\n if (result.threadId && isNewThread) {\n dispatch({ type: \"SET_CURRENT_THREAD\", threadId: result.threadId });\n }\n\n return result;\n },\n // `stagedImageToResourceContent` is a pure module-level helper (not a hook value).\n [inputValue, imageState, sendMessage, isNewThread, dispatch, isIdentified],\n );\n\n const {\n mutateAsync: submitAsync,\n mutate: _unusedSubmit,\n ...mutationState\n } = useTamboMutation({\n mutationKey: [\"v1-thread-input\", currentThreadId],\n mutationFn: submitFn,\n });\n\n const contextValue: TamboV1ThreadInputContextProps = {\n ...mutationState,\n value: inputValue,\n setValue: setInputValue,\n submit: submitAsync,\n images: imageState.images,\n addImage: imageState.addImage,\n addImages: imageState.addImages,\n removeImage: imageState.removeImage,\n clearImages: imageState.clearImages,\n threadId: currentThreadId,\n isDisabled: mutationState.isPending || !isIdentified,\n };\n\n return (\n <TamboV1ThreadInputContext.Provider value={contextValue}>\n {children}\n </TamboV1ThreadInputContext.Provider>\n );\n}\n\n/**\n * Hook to access the shared thread input state.\n *\n * All components using this hook share the same input state, enabling\n * features like suggestions to update the input field directly.\n * @returns The shared thread input context\n * @throws {Error} If used outside TamboV1ThreadInputProvider\n * @example\n * ```tsx\n * function ChatInput() {\n * const { value, setValue, submit, isPending } = useTamboV1ThreadInput();\n *\n * return (\n * <form onSubmit={(e) => { e.preventDefault(); submit(); }}>\n * <input\n * value={value}\n * onChange={(e) => setValue(e.target.value)}\n * disabled={isPending}\n * />\n * <button type=\"submit\" disabled={isPending}>Send</button>\n * </form>\n * );\n * }\n * ```\n */\nexport function useTamboV1ThreadInput(): TamboV1ThreadInputContextProps {\n const context = useContext(TamboV1ThreadInputContext);\n if (!context) {\n throw new Error(\n \"useTamboV1ThreadInput must be used within TamboV1ThreadInputProvider\",\n );\n }\n return context;\n}\n"]}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Authentication state for the v1 SDK.
3
+ *
4
+ * Discriminated union tracking the current auth lifecycle:
5
+ * - `identified`: ready to make API calls (via userKey or successful token exchange)
6
+ * - `exchanging`: userToken provided, exchange in-flight
7
+ * - `error`: token exchange failed
8
+ * - `invalid`: both userKey AND userToken provided (must choose one)
9
+ * - `unauthenticated`: neither userKey nor userToken provided
10
+ */
11
+ export type TamboV1AuthState = {
12
+ status: "identified";
13
+ source: "userKey" | "tokenExchange";
14
+ } | {
15
+ status: "exchanging";
16
+ } | {
17
+ status: "error";
18
+ error: Error;
19
+ } | {
20
+ status: "invalid";
21
+ } | {
22
+ status: "unauthenticated";
23
+ };
24
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/v1/types/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,MAAM,gBAAgB,GACxB;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,eAAe,CAAA;CAAE,GAC7D;IAAE,MAAM,EAAE,YAAY,CAAA;CAAE,GACxB;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,GACjC;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GACrB;IAAE,MAAM,EAAE,iBAAiB,CAAA;CAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/v1/types/auth.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * Authentication state for the v1 SDK.\n *\n * Discriminated union tracking the current auth lifecycle:\n * - `identified`: ready to make API calls (via userKey or successful token exchange)\n * - `exchanging`: userToken provided, exchange in-flight\n * - `error`: token exchange failed\n * - `invalid`: both userKey AND userToken provided (must choose one)\n * - `unauthenticated`: neither userKey nor userToken provided\n */\nexport type TamboV1AuthState =\n | { status: \"identified\"; source: \"userKey\" | \"tokenExchange\" }\n | { status: \"exchanging\" }\n | { status: \"error\"; error: Error }\n | { status: \"invalid\" }\n | { status: \"unauthenticated\" };\n"]}
@@ -7,7 +7,19 @@
7
7
  */
8
8
  import type { ReactElement } from "react";
9
9
  export type { TextContent, ToolResultContent, ResourceContent, } from "@tambo-ai/typescript-sdk/resources/threads/threads";
10
+ import type { InputMessage } from "@tambo-ai/typescript-sdk/resources/threads/runs";
10
11
  export type { InputMessage } from "@tambo-ai/typescript-sdk/resources/threads/runs";
12
+ /**
13
+ * Widened InputMessage type for initial messages that supports system and assistant roles
14
+ * in addition to the user role.
15
+ *
16
+ * The TS SDK `InputMessage` type constrains `role` to `'user'`, but the V1 API
17
+ * accepts `'user' | 'system' | 'assistant'` for `initialMessages`. This type
18
+ * widens the role field until the TS SDK type is regenerated.
19
+ */
20
+ export type InitialInputMessage = Omit<InputMessage, "role"> & {
21
+ role: "user" | "system" | "assistant";
22
+ };
11
23
  export type { MessageListResponse, MessageGetResponse, } from "@tambo-ai/typescript-sdk/resources/threads/messages";
12
24
  import type { TextContent, ToolUseContent, ToolResultContent, ComponentContent, ResourceContent } from "@tambo-ai/typescript-sdk/resources/threads/threads";
13
25
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../../src/v1/types/message.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAK1C,YAAY,EACV,WAAW,EACX,iBAAiB,EACjB,eAAe,GAChB,MAAM,oDAAoD,CAAC;AAG5D,YAAY,EAAE,YAAY,EAAE,MAAM,iDAAiD,CAAC;AAEpF,YAAY,EACV,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,qDAAqD,CAAC;AAG7D,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EAChB,MAAM,oDAAoD,CAAC;AAE5D;;;GAGG;AACH,MAAM,MAAM,uBAAuB,GAAG,SAAS,GAAG,WAAW,GAAG,MAAM,CAAC;AAEvE;;;GAGG;AACH,MAAM,WAAW,kBAAmB,SAAQ,gBAAgB;IAC1D;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,uBAAuB,CAAC;IAEzC;;;OAGG;IACH,iBAAiB,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;CACzC;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,2CAA2C;IAC3C,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,gDAAgD;IAChD,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,6CAA6C;IAC7C,8BAA8B,CAAC,EAAE,MAAM,CAAC;CACzC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC;IACrE;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE/B;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,qBAAqB,CAAC;CAC3C;AAED;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE1D;;;GAGG;AACH,MAAM,MAAM,OAAO,GACf,WAAW,GACX,gBAAgB,GAChB,iBAAiB,GACjB,kBAAkB,GAClB,eAAe,CAAC;AAEpB;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,gCAAgC;IAChC,EAAE,EAAE,MAAM,CAAC;IAEX,uCAAuC;IACvC,IAAI,EAAE,WAAW,CAAC;IAElB,oCAAoC;IACpC,OAAO,EAAE,OAAO,EAAE,CAAC;IAEnB,sFAAsF;IACtF,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,uBAAuB;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEnC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IAErB;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B"}
1
+ {"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../../src/v1/types/message.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAK1C,YAAY,EACV,WAAW,EACX,iBAAiB,EACjB,eAAe,GAChB,MAAM,oDAAoD,CAAC;AAG5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iDAAiD,CAAC;AACpF,YAAY,EAAE,YAAY,EAAE,MAAM,iDAAiD,CAAC;AAEpF;;;;;;;GAOG;AACH,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,GAAG;IAC7D,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,WAAW,CAAC;CACvC,CAAC;AAEF,YAAY,EACV,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,qDAAqD,CAAC;AAG7D,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EAChB,MAAM,oDAAoD,CAAC;AAE5D;;;GAGG;AACH,MAAM,MAAM,uBAAuB,GAAG,SAAS,GAAG,WAAW,GAAG,MAAM,CAAC;AAEvE;;;GAGG;AACH,MAAM,WAAW,kBAAmB,SAAQ,gBAAgB;IAC1D;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,uBAAuB,CAAC;IAEzC;;;OAGG;IACH,iBAAiB,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;CACzC;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,2CAA2C;IAC3C,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,gDAAgD;IAChD,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,6CAA6C;IAC7C,8BAA8B,CAAC,EAAE,MAAM,CAAC;CACzC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC;IACrE;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE/B;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,qBAAqB,CAAC;CAC3C;AAED;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE1D;;;GAGG;AACH,MAAM,MAAM,OAAO,GACf,WAAW,GACX,gBAAgB,GAChB,iBAAiB,GACjB,kBAAkB,GAClB,eAAe,CAAC;AAEpB;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,gCAAgC;IAChC,EAAE,EAAE,MAAM,CAAC;IAEX,uCAAuC;IACvC,IAAI,EAAE,WAAW,CAAC;IAElB,oCAAoC;IACpC,OAAO,EAAE,OAAO,EAAE,CAAC;IAEnB,sFAAsF;IACtF,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,uBAAuB;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEnC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IAErB;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B"}
@@ -1 +1 @@
1
- {"version":3,"file":"message.js","sourceRoot":"","sources":["../../../src/v1/types/message.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG","sourcesContent":["/**\n * Message and Content Types for v1 API\n *\n * Re-exports message and content types from `@tambo-ai/typescript-sdk`.\n * Messages use Anthropic-style content blocks pattern where a message\n * contains an array of content blocks (text, tool calls, tool results, components).\n */\n\nimport type { ReactElement } from \"react\";\n\n// Re-export content block types from TypeScript SDK\n// Note: ToolUseContent and ComponentContent are NOT re-exported - use V1ToolUseContent\n// and V1ComponentContent instead, which include computed state properties.\nexport type {\n TextContent,\n ToolResultContent,\n ResourceContent,\n} from \"@tambo-ai/typescript-sdk/resources/threads/threads\";\n\n// Re-export message types from TypeScript SDK\nexport type { InputMessage } from \"@tambo-ai/typescript-sdk/resources/threads/runs\";\n\nexport type {\n MessageListResponse,\n MessageGetResponse,\n} from \"@tambo-ai/typescript-sdk/resources/threads/messages\";\n\n// Import for Content union type\nimport type {\n TextContent,\n ToolUseContent,\n ToolResultContent,\n ComponentContent,\n ResourceContent,\n} from \"@tambo-ai/typescript-sdk/resources/threads/threads\";\n\n/**\n * Streaming state for component content blocks.\n * Tracks the lifecycle of component prop/state streaming.\n */\nexport type ComponentStreamingState = \"started\" | \"streaming\" | \"done\";\n\n/**\n * Extended ComponentContent with streaming state and rendered element.\n * Used by the v1 SDK to track component rendering lifecycle.\n */\nexport interface V1ComponentContent extends ComponentContent {\n /**\n * Current streaming state of this component's props.\n * - 'started': Component block created, awaiting props\n * - 'streaming': Props are being streamed\n * - 'done': Props streaming complete\n *\n * Optional for historical messages loaded from API (defaults to \"done\").\n */\n streamingState?: ComponentStreamingState;\n\n /**\n * The rendered React element for this component.\n * undefined if not yet rendered, null if the component couldn't be found in the registry.\n */\n renderedComponent?: ReactElement | null;\n}\n\n/**\n * Special display properties that can be included in tool input.\n * These are used to customize tool status messages shown in the UI.\n */\nexport interface TamboToolDisplayProps {\n /** Generic display message for the tool */\n _tambo_displayMessage?: string;\n /** Message shown while the tool is executing */\n _tambo_statusMessage?: string;\n /** Message shown after the tool completes */\n _tambo_completionStatusMessage?: string;\n}\n\n/**\n * Extended ToolUseContent with computed state properties.\n * Used by the v1 SDK to provide pre-computed tool state to consumers.\n *\n * Note: The computed properties are populated by `useTamboV1()` hook.\n * When accessed via lower-level APIs, they may be undefined.\n */\nexport interface V1ToolUseContent extends Omit<ToolUseContent, \"input\"> {\n /**\n * Tool input parameters with internal `_tambo_*` properties removed.\n * Consumers see only the actual tool parameters.\n */\n input: Record<string, unknown>;\n\n /**\n * Whether this tool call has completed (has a matching tool_result).\n * Computed by `useTamboV1()` based on presence of matching tool_result.\n */\n hasCompleted?: boolean;\n\n /**\n * The status message to display, resolved based on tool execution state.\n * Automatically updates as tool progresses through execution lifecycle.\n * Computed by `useTamboV1()`.\n */\n statusMessage?: string;\n\n /**\n * Extracted Tambo display properties from the tool input.\n * Consumers can use these for custom rendering if needed.\n * Computed by `useTamboV1()`.\n */\n tamboDisplayProps?: TamboToolDisplayProps;\n}\n\n/**\n * Message role (from SDK)\n * Includes 'system' to accommodate messages loaded from API.\n */\nexport type MessageRole = \"user\" | \"assistant\" | \"system\";\n\n/**\n * Union type of all content block types.\n * Uses V1ComponentContent and V1ToolUseContent which include computed state.\n */\nexport type Content =\n | TextContent\n | V1ToolUseContent\n | ToolResultContent\n | V1ComponentContent\n | ResourceContent;\n\n/**\n * Message in a thread (simplified from SDK's MessageGetResponse)\n */\nexport interface TamboV1Message {\n /** Unique message identifier */\n id: string;\n\n /** Message role (user or assistant) */\n role: MessageRole;\n\n /** Content blocks in the message */\n content: Content[];\n\n /** When the message was created (optional for historical messages loaded from API) */\n createdAt?: string;\n\n /** Message metadata */\n metadata?: Record<string, unknown>;\n\n /**\n * Reasoning content from the model (transient - only during streaming).\n * Each element is a reasoning \"chunk\" - models may emit multiple reasoning blocks.\n * This data is not persisted to the database and will not be present in\n * messages loaded from the API.\n */\n reasoning?: string[];\n\n /**\n * Duration of the reasoning phase in milliseconds (for display purposes).\n * Populated when reasoning completes.\n */\n reasoningDurationMS?: number;\n}\n"]}
1
+ {"version":3,"file":"message.js","sourceRoot":"","sources":["../../../src/v1/types/message.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG","sourcesContent":["/**\n * Message and Content Types for v1 API\n *\n * Re-exports message and content types from `@tambo-ai/typescript-sdk`.\n * Messages use Anthropic-style content blocks pattern where a message\n * contains an array of content blocks (text, tool calls, tool results, components).\n */\n\nimport type { ReactElement } from \"react\";\n\n// Re-export content block types from TypeScript SDK\n// Note: ToolUseContent and ComponentContent are NOT re-exported - use V1ToolUseContent\n// and V1ComponentContent instead, which include computed state properties.\nexport type {\n TextContent,\n ToolResultContent,\n ResourceContent,\n} from \"@tambo-ai/typescript-sdk/resources/threads/threads\";\n\n// Re-export message types from TypeScript SDK\nimport type { InputMessage } from \"@tambo-ai/typescript-sdk/resources/threads/runs\";\nexport type { InputMessage } from \"@tambo-ai/typescript-sdk/resources/threads/runs\";\n\n/**\n * Widened InputMessage type for initial messages that supports system and assistant roles\n * in addition to the user role.\n *\n * The TS SDK `InputMessage` type constrains `role` to `'user'`, but the V1 API\n * accepts `'user' | 'system' | 'assistant'` for `initialMessages`. This type\n * widens the role field until the TS SDK type is regenerated.\n */\nexport type InitialInputMessage = Omit<InputMessage, \"role\"> & {\n role: \"user\" | \"system\" | \"assistant\";\n};\n\nexport type {\n MessageListResponse,\n MessageGetResponse,\n} from \"@tambo-ai/typescript-sdk/resources/threads/messages\";\n\n// Import for Content union type\nimport type {\n TextContent,\n ToolUseContent,\n ToolResultContent,\n ComponentContent,\n ResourceContent,\n} from \"@tambo-ai/typescript-sdk/resources/threads/threads\";\n\n/**\n * Streaming state for component content blocks.\n * Tracks the lifecycle of component prop/state streaming.\n */\nexport type ComponentStreamingState = \"started\" | \"streaming\" | \"done\";\n\n/**\n * Extended ComponentContent with streaming state and rendered element.\n * Used by the v1 SDK to track component rendering lifecycle.\n */\nexport interface V1ComponentContent extends ComponentContent {\n /**\n * Current streaming state of this component's props.\n * - 'started': Component block created, awaiting props\n * - 'streaming': Props are being streamed\n * - 'done': Props streaming complete\n *\n * Optional for historical messages loaded from API (defaults to \"done\").\n */\n streamingState?: ComponentStreamingState;\n\n /**\n * The rendered React element for this component.\n * undefined if not yet rendered, null if the component couldn't be found in the registry.\n */\n renderedComponent?: ReactElement | null;\n}\n\n/**\n * Special display properties that can be included in tool input.\n * These are used to customize tool status messages shown in the UI.\n */\nexport interface TamboToolDisplayProps {\n /** Generic display message for the tool */\n _tambo_displayMessage?: string;\n /** Message shown while the tool is executing */\n _tambo_statusMessage?: string;\n /** Message shown after the tool completes */\n _tambo_completionStatusMessage?: string;\n}\n\n/**\n * Extended ToolUseContent with computed state properties.\n * Used by the v1 SDK to provide pre-computed tool state to consumers.\n *\n * Note: The computed properties are populated by `useTamboV1()` hook.\n * When accessed via lower-level APIs, they may be undefined.\n */\nexport interface V1ToolUseContent extends Omit<ToolUseContent, \"input\"> {\n /**\n * Tool input parameters with internal `_tambo_*` properties removed.\n * Consumers see only the actual tool parameters.\n */\n input: Record<string, unknown>;\n\n /**\n * Whether this tool call has completed (has a matching tool_result).\n * Computed by `useTamboV1()` based on presence of matching tool_result.\n */\n hasCompleted?: boolean;\n\n /**\n * The status message to display, resolved based on tool execution state.\n * Automatically updates as tool progresses through execution lifecycle.\n * Computed by `useTamboV1()`.\n */\n statusMessage?: string;\n\n /**\n * Extracted Tambo display properties from the tool input.\n * Consumers can use these for custom rendering if needed.\n * Computed by `useTamboV1()`.\n */\n tamboDisplayProps?: TamboToolDisplayProps;\n}\n\n/**\n * Message role (from SDK)\n * Includes 'system' to accommodate messages loaded from API.\n */\nexport type MessageRole = \"user\" | \"assistant\" | \"system\";\n\n/**\n * Union type of all content block types.\n * Uses V1ComponentContent and V1ToolUseContent which include computed state.\n */\nexport type Content =\n | TextContent\n | V1ToolUseContent\n | ToolResultContent\n | V1ComponentContent\n | ResourceContent;\n\n/**\n * Message in a thread (simplified from SDK's MessageGetResponse)\n */\nexport interface TamboV1Message {\n /** Unique message identifier */\n id: string;\n\n /** Message role (user or assistant) */\n role: MessageRole;\n\n /** Content blocks in the message */\n content: Content[];\n\n /** When the message was created (optional for historical messages loaded from API) */\n createdAt?: string;\n\n /** Message metadata */\n metadata?: Record<string, unknown>;\n\n /**\n * Reasoning content from the model (transient - only during streaming).\n * Each element is a reasoning \"chunk\" - models may emit multiple reasoning blocks.\n * This data is not persisted to the database and will not be present in\n * messages loaded from the API.\n */\n reasoning?: string[];\n\n /**\n * Duration of the reasoning phase in milliseconds (for display purposes).\n * Populated when reasoning completes.\n */\n reasoningDurationMS?: number;\n}\n"]}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Tool choice type matching the V1 API format.
3
+ * Controls how the model selects tools during generation.
4
+ */
5
+ export type ToolChoice = "auto" | "required" | "none" | {
6
+ name: string;
7
+ };
8
+ //# sourceMappingURL=tool-choice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-choice.d.ts","sourceRoot":"","sources":["../../../src/v1/types/tool-choice.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,MAAM,UAAU,GAClB,MAAM,GACN,UAAU,GACV,MAAM,GACN;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tool-choice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-choice.js","sourceRoot":"","sources":["../../../src/v1/types/tool-choice.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * Tool choice type matching the V1 API format.\n * Controls how the model selects tools during generation.\n */\nexport type ToolChoice =\n | \"auto\" // Model decides (default)\n | \"required\" // Must use at least one tool\n | \"none\" // Cannot use tools\n | { name: string }; // Must use specific tool\n"]}
@@ -5,7 +5,7 @@
5
5
  * Used with useReducer to accumulate events into thread state.
6
6
  */
7
7
  import type { AGUIEvent } from "@ag-ui/core";
8
- import type { TamboV1Message } from "../types/message.js";
8
+ import type { InitialInputMessage, TamboV1Message } from "../types/message.js";
9
9
  import type { StreamingState, TamboV1Thread } from "../types/thread.js";
10
10
  /**
11
11
  * Error thrown when an unreachable case is reached in a switch statement.
@@ -26,6 +26,13 @@ export interface ThreadState {
26
26
  * Maps tool call ID to accumulated JSON string.
27
27
  */
28
28
  accumulatingToolArgs: Map<string, string>;
29
+ /**
30
+ * ID of the last completed run. Persists across the session so it's
31
+ * available as `previousRunId` when sending follow-up messages, even
32
+ * after the streaming state has been cleared (e.g., after page reload
33
+ * and thread re-fetch).
34
+ */
35
+ lastCompletedRunId?: string;
29
36
  }
30
37
  /**
31
38
  * State managed by the stream reducer.
@@ -48,6 +55,8 @@ export interface EventAction {
48
55
  type: "EVENT";
49
56
  event: AGUIEvent;
50
57
  threadId: string;
58
+ /** Pre-parsed partial JSON args for TOOL_CALL_ARGS events. Avoids double-parsing. */
59
+ parsedToolArgs?: Record<string, unknown>;
51
60
  }
52
61
  /**
53
62
  * Initialize thread action - creates a new thread in the threadMap.
@@ -87,6 +96,15 @@ export interface LoadThreadMessagesAction {
87
96
  */
88
97
  skipIfStreaming?: boolean;
89
98
  }
99
+ /**
100
+ * Set last completed run ID action - stores metadata from the API
101
+ * so it can be used as `previousRunId` for follow-up messages.
102
+ */
103
+ export interface SetLastCompletedRunIdAction {
104
+ type: "SET_LAST_COMPLETED_RUN_ID";
105
+ threadId: string;
106
+ lastCompletedRunId: string;
107
+ }
90
108
  /**
91
109
  * Update thread title action - sets the title on a thread.
92
110
  * Used after auto-generating a thread name via the API.
@@ -99,7 +117,7 @@ export interface UpdateThreadTitleAction {
99
117
  /**
100
118
  * Action type for the stream reducer.
101
119
  */
102
- export type StreamAction = EventAction | InitThreadAction | SetCurrentThreadAction | StartNewThreadAction | LoadThreadMessagesAction | UpdateThreadTitleAction;
120
+ export type StreamAction = EventAction | InitThreadAction | SetCurrentThreadAction | StartNewThreadAction | LoadThreadMessagesAction | SetLastCompletedRunIdAction | UpdateThreadTitleAction;
103
121
  /**
104
122
  * Create initial thread state for a new thread.
105
123
  * @param threadId - Unique thread identifier
@@ -123,6 +141,14 @@ export declare function isPlaceholderThreadId(threadId: string | null | undefine
123
141
  * @returns Initial stream state
124
142
  */
125
143
  export declare function createInitialState(): StreamState;
144
+ /**
145
+ * Create initial stream state with placeholder thread seeded with initial messages.
146
+ * The messages are converted from InputMessage format to TamboV1Message format
147
+ * for immediate UI display before any API call.
148
+ * @param initialMessages - Messages to seed the placeholder thread with
149
+ * @returns Initial stream state with messages in the placeholder thread
150
+ */
151
+ export declare function createInitialStateWithMessages(initialMessages: InitialInputMessage[]): StreamState;
126
152
  /**
127
153
  * Stream reducer that accumulates events into thread state.
128
154
  *
@@ -1 +1 @@
1
- {"version":3,"file":"event-accumulator.d.ts","sourceRoot":"","sources":["../../../src/v1/utils/event-accumulator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,SAAS,EAeV,MAAM,aAAa,CAAC;AAUrB,OAAO,KAAK,EAAW,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIrE;;;GAGG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,KAAK,EAAE,KAAK;CAIzB;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,EAAE,cAAc,CAAC;IAC1B;;;OAGG;IACH,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3C;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAEvC;;OAEG;IACH,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,aAAa,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;CACxC;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,kBAAkB,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;CACxC;AAED;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,sBAAsB,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,qBAAqB,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GACpB,WAAW,GACX,gBAAgB,GAChB,sBAAsB,GACtB,oBAAoB,GACpB,wBAAwB,GACxB,uBAAuB,CAAC;AAS5B;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CActE;AAED;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,gBAAgB,CAAC;AAEnD;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAClC,OAAO,CAET;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,WAAW,CAOhD;AAuGD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,YAAY,GACnB,WAAW,CAiQb"}
1
+ {"version":3,"file":"event-accumulator.d.ts","sourceRoot":"","sources":["../../../src/v1/utils/event-accumulator.ts"],"names":[],"mappings":"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"}