@tambo-ai/react 0.70.0 → 0.71.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 (257) hide show
  1. package/dist/v1/hooks/use-tambo-v1-messages.d.ts +58 -0
  2. package/dist/v1/hooks/use-tambo-v1-messages.d.ts.map +1 -0
  3. package/dist/v1/hooks/use-tambo-v1-messages.js +54 -0
  4. package/dist/v1/hooks/use-tambo-v1-messages.js.map +1 -0
  5. package/dist/v1/hooks/use-tambo-v1-messages.test.d.ts +2 -0
  6. package/dist/v1/hooks/use-tambo-v1-messages.test.d.ts.map +1 -0
  7. package/dist/v1/hooks/use-tambo-v1-messages.test.js +137 -0
  8. package/dist/v1/hooks/use-tambo-v1-messages.test.js.map +1 -0
  9. package/dist/v1/hooks/use-tambo-v1-send-message.d.ts +96 -0
  10. package/dist/v1/hooks/use-tambo-v1-send-message.d.ts.map +1 -0
  11. package/dist/v1/hooks/use-tambo-v1-send-message.js +227 -0
  12. package/dist/v1/hooks/use-tambo-v1-send-message.js.map +1 -0
  13. package/dist/v1/hooks/use-tambo-v1-send-message.test.d.ts +2 -0
  14. package/dist/v1/hooks/use-tambo-v1-send-message.test.d.ts.map +1 -0
  15. package/dist/v1/hooks/use-tambo-v1-send-message.test.js +827 -0
  16. package/dist/v1/hooks/use-tambo-v1-send-message.test.js.map +1 -0
  17. package/dist/v1/hooks/use-tambo-v1-thread-list.d.ts +61 -0
  18. package/dist/v1/hooks/use-tambo-v1-thread-list.d.ts.map +1 -0
  19. package/dist/v1/hooks/use-tambo-v1-thread-list.js +56 -0
  20. package/dist/v1/hooks/use-tambo-v1-thread-list.js.map +1 -0
  21. package/dist/v1/hooks/use-tambo-v1-thread-list.test.d.ts +2 -0
  22. package/dist/v1/hooks/use-tambo-v1-thread-list.test.d.ts.map +1 -0
  23. package/dist/v1/hooks/use-tambo-v1-thread-list.test.js +98 -0
  24. package/dist/v1/hooks/use-tambo-v1-thread-list.test.js.map +1 -0
  25. package/dist/v1/hooks/use-tambo-v1-thread.d.ts +37 -0
  26. package/dist/v1/hooks/use-tambo-v1-thread.d.ts.map +1 -0
  27. package/dist/v1/hooks/use-tambo-v1-thread.js +49 -0
  28. package/dist/v1/hooks/use-tambo-v1-thread.js.map +1 -0
  29. package/dist/v1/hooks/use-tambo-v1-thread.test.d.ts +2 -0
  30. package/dist/v1/hooks/use-tambo-v1-thread.test.d.ts.map +1 -0
  31. package/dist/v1/hooks/use-tambo-v1-thread.test.js +83 -0
  32. package/dist/v1/hooks/use-tambo-v1-thread.test.js.map +1 -0
  33. package/dist/v1/hooks/use-tambo-v1.d.ts +107 -0
  34. package/dist/v1/hooks/use-tambo-v1.d.ts.map +1 -0
  35. package/dist/v1/hooks/use-tambo-v1.js +87 -0
  36. package/dist/v1/hooks/use-tambo-v1.js.map +1 -0
  37. package/dist/v1/hooks/use-tambo-v1.test.d.ts +2 -0
  38. package/dist/v1/hooks/use-tambo-v1.test.d.ts.map +1 -0
  39. package/dist/v1/hooks/use-tambo-v1.test.js +150 -0
  40. package/dist/v1/hooks/use-tambo-v1.test.js.map +1 -0
  41. package/dist/v1/index.d.ts +54 -16
  42. package/dist/v1/index.d.ts.map +1 -1
  43. package/dist/v1/index.js +85 -26
  44. package/dist/v1/index.js.map +1 -1
  45. package/dist/v1/providers/tambo-v1-provider.d.ts +91 -0
  46. package/dist/v1/providers/tambo-v1-provider.d.ts.map +1 -0
  47. package/dist/v1/providers/tambo-v1-provider.js +110 -0
  48. package/dist/v1/providers/tambo-v1-provider.js.map +1 -0
  49. package/dist/v1/providers/tambo-v1-provider.test.d.ts +2 -0
  50. package/dist/v1/providers/tambo-v1-provider.test.d.ts.map +1 -0
  51. package/dist/v1/providers/tambo-v1-provider.test.js +123 -0
  52. package/dist/v1/providers/tambo-v1-provider.test.js.map +1 -0
  53. package/dist/v1/providers/tambo-v1-stream-context.d.ts +136 -0
  54. package/dist/v1/providers/tambo-v1-stream-context.d.ts.map +1 -0
  55. package/dist/v1/providers/tambo-v1-stream-context.js +230 -0
  56. package/dist/v1/providers/tambo-v1-stream-context.js.map +1 -0
  57. package/dist/v1/providers/tambo-v1-stream-context.test.d.ts +2 -0
  58. package/dist/v1/providers/tambo-v1-stream-context.test.d.ts.map +1 -0
  59. package/dist/v1/providers/tambo-v1-stream-context.test.js +85 -0
  60. package/dist/v1/providers/tambo-v1-stream-context.test.js.map +1 -0
  61. package/dist/v1/types/component.d.ts +5 -2
  62. package/dist/v1/types/component.d.ts.map +1 -1
  63. package/dist/v1/types/component.js +5 -2
  64. package/dist/v1/types/component.js.map +1 -1
  65. package/dist/v1/types/event.d.ts +21 -12
  66. package/dist/v1/types/event.d.ts.map +1 -1
  67. package/dist/v1/types/event.js +46 -1
  68. package/dist/v1/types/event.js.map +1 -1
  69. package/dist/v1/types/event.test.d.ts +2 -0
  70. package/dist/v1/types/event.test.d.ts.map +1 -0
  71. package/dist/v1/types/event.test.js +70 -0
  72. package/dist/v1/types/event.test.js.map +1 -0
  73. package/dist/v1/types/message.d.ts +4 -8
  74. package/dist/v1/types/message.d.ts.map +1 -1
  75. package/dist/v1/types/message.js +1 -1
  76. package/dist/v1/types/message.js.map +1 -1
  77. package/dist/v1/types/thread.d.ts +1 -3
  78. package/dist/v1/types/thread.d.ts.map +1 -1
  79. package/dist/v1/types/thread.js +1 -1
  80. package/dist/v1/types/thread.js.map +1 -1
  81. package/dist/v1/utils/event-accumulator.d.ts +100 -0
  82. package/dist/v1/utils/event-accumulator.d.ts.map +1 -0
  83. package/dist/v1/utils/event-accumulator.js +715 -0
  84. package/dist/v1/utils/event-accumulator.js.map +1 -0
  85. package/dist/v1/utils/event-accumulator.test.d.ts +2 -0
  86. package/dist/v1/utils/event-accumulator.test.d.ts.map +1 -0
  87. package/dist/v1/utils/event-accumulator.test.js +1010 -0
  88. package/dist/v1/utils/event-accumulator.test.js.map +1 -0
  89. package/dist/v1/utils/json-patch.d.ts +18 -0
  90. package/dist/v1/utils/json-patch.d.ts.map +1 -0
  91. package/dist/v1/utils/json-patch.js +35 -0
  92. package/dist/v1/utils/json-patch.js.map +1 -0
  93. package/dist/v1/utils/json-patch.test.d.ts +2 -0
  94. package/dist/v1/utils/json-patch.test.d.ts.map +1 -0
  95. package/dist/v1/utils/json-patch.test.js +28 -0
  96. package/dist/v1/utils/json-patch.test.js.map +1 -0
  97. package/dist/v1/utils/registry-conversion.d.ts +53 -0
  98. package/dist/v1/utils/registry-conversion.d.ts.map +1 -0
  99. package/dist/v1/utils/registry-conversion.js +114 -0
  100. package/dist/v1/utils/registry-conversion.js.map +1 -0
  101. package/dist/v1/utils/registry-conversion.test.d.ts +2 -0
  102. package/dist/v1/utils/registry-conversion.test.d.ts.map +1 -0
  103. package/dist/v1/utils/registry-conversion.test.js +179 -0
  104. package/dist/v1/utils/registry-conversion.test.js.map +1 -0
  105. package/dist/v1/utils/stream-handler.d.ts +45 -0
  106. package/dist/v1/utils/stream-handler.d.ts.map +1 -0
  107. package/dist/v1/utils/stream-handler.js +47 -0
  108. package/dist/v1/utils/stream-handler.js.map +1 -0
  109. package/dist/v1/utils/stream-handler.test.d.ts +2 -0
  110. package/dist/v1/utils/stream-handler.test.d.ts.map +1 -0
  111. package/dist/v1/utils/stream-handler.test.js +74 -0
  112. package/dist/v1/utils/stream-handler.test.js.map +1 -0
  113. package/dist/v1/utils/tool-call-tracker.d.ts +41 -0
  114. package/dist/v1/utils/tool-call-tracker.d.ts.map +1 -0
  115. package/dist/v1/utils/tool-call-tracker.js +90 -0
  116. package/dist/v1/utils/tool-call-tracker.js.map +1 -0
  117. package/dist/v1/utils/tool-executor.d.ts +33 -0
  118. package/dist/v1/utils/tool-executor.d.ts.map +1 -0
  119. package/dist/v1/utils/tool-executor.js +103 -0
  120. package/dist/v1/utils/tool-executor.js.map +1 -0
  121. package/dist/v1/utils/tool-executor.test.d.ts +2 -0
  122. package/dist/v1/utils/tool-executor.test.d.ts.map +1 -0
  123. package/dist/v1/utils/tool-executor.test.js +222 -0
  124. package/dist/v1/utils/tool-executor.test.js.map +1 -0
  125. package/esm/v1/hooks/use-tambo-v1-messages.d.ts +58 -0
  126. package/esm/v1/hooks/use-tambo-v1-messages.d.ts.map +1 -0
  127. package/esm/v1/hooks/use-tambo-v1-messages.js +51 -0
  128. package/esm/v1/hooks/use-tambo-v1-messages.js.map +1 -0
  129. package/esm/v1/hooks/use-tambo-v1-messages.test.d.ts +2 -0
  130. package/esm/v1/hooks/use-tambo-v1-messages.test.d.ts.map +1 -0
  131. package/esm/v1/hooks/use-tambo-v1-messages.test.js +132 -0
  132. package/esm/v1/hooks/use-tambo-v1-messages.test.js.map +1 -0
  133. package/esm/v1/hooks/use-tambo-v1-send-message.d.ts +96 -0
  134. package/esm/v1/hooks/use-tambo-v1-send-message.d.ts.map +1 -0
  135. package/esm/v1/hooks/use-tambo-v1-send-message.js +223 -0
  136. package/esm/v1/hooks/use-tambo-v1-send-message.js.map +1 -0
  137. package/esm/v1/hooks/use-tambo-v1-send-message.test.d.ts +2 -0
  138. package/esm/v1/hooks/use-tambo-v1-send-message.test.d.ts.map +1 -0
  139. package/esm/v1/hooks/use-tambo-v1-send-message.test.js +822 -0
  140. package/esm/v1/hooks/use-tambo-v1-send-message.test.js.map +1 -0
  141. package/esm/v1/hooks/use-tambo-v1-thread-list.d.ts +61 -0
  142. package/esm/v1/hooks/use-tambo-v1-thread-list.d.ts.map +1 -0
  143. package/esm/v1/hooks/use-tambo-v1-thread-list.js +53 -0
  144. package/esm/v1/hooks/use-tambo-v1-thread-list.js.map +1 -0
  145. package/esm/v1/hooks/use-tambo-v1-thread-list.test.d.ts +2 -0
  146. package/esm/v1/hooks/use-tambo-v1-thread-list.test.d.ts.map +1 -0
  147. package/esm/v1/hooks/use-tambo-v1-thread-list.test.js +93 -0
  148. package/esm/v1/hooks/use-tambo-v1-thread-list.test.js.map +1 -0
  149. package/esm/v1/hooks/use-tambo-v1-thread.d.ts +37 -0
  150. package/esm/v1/hooks/use-tambo-v1-thread.d.ts.map +1 -0
  151. package/esm/v1/hooks/use-tambo-v1-thread.js +46 -0
  152. package/esm/v1/hooks/use-tambo-v1-thread.js.map +1 -0
  153. package/esm/v1/hooks/use-tambo-v1-thread.test.d.ts +2 -0
  154. package/esm/v1/hooks/use-tambo-v1-thread.test.d.ts.map +1 -0
  155. package/esm/v1/hooks/use-tambo-v1-thread.test.js +78 -0
  156. package/esm/v1/hooks/use-tambo-v1-thread.test.js.map +1 -0
  157. package/esm/v1/hooks/use-tambo-v1.d.ts +107 -0
  158. package/esm/v1/hooks/use-tambo-v1.d.ts.map +1 -0
  159. package/esm/v1/hooks/use-tambo-v1.js +84 -0
  160. package/esm/v1/hooks/use-tambo-v1.js.map +1 -0
  161. package/esm/v1/hooks/use-tambo-v1.test.d.ts +2 -0
  162. package/esm/v1/hooks/use-tambo-v1.test.d.ts.map +1 -0
  163. package/esm/v1/hooks/use-tambo-v1.test.js +145 -0
  164. package/esm/v1/hooks/use-tambo-v1.test.js.map +1 -0
  165. package/esm/v1/index.d.ts +54 -16
  166. package/esm/v1/index.d.ts.map +1 -1
  167. package/esm/v1/index.js +64 -27
  168. package/esm/v1/index.js.map +1 -1
  169. package/esm/v1/providers/tambo-v1-provider.d.ts +91 -0
  170. package/esm/v1/providers/tambo-v1-provider.d.ts.map +1 -0
  171. package/esm/v1/providers/tambo-v1-provider.js +74 -0
  172. package/esm/v1/providers/tambo-v1-provider.js.map +1 -0
  173. package/esm/v1/providers/tambo-v1-provider.test.d.ts +2 -0
  174. package/esm/v1/providers/tambo-v1-provider.test.d.ts.map +1 -0
  175. package/esm/v1/providers/tambo-v1-provider.test.js +118 -0
  176. package/esm/v1/providers/tambo-v1-provider.test.js.map +1 -0
  177. package/esm/v1/providers/tambo-v1-stream-context.d.ts +136 -0
  178. package/esm/v1/providers/tambo-v1-stream-context.d.ts.map +1 -0
  179. package/esm/v1/providers/tambo-v1-stream-context.js +191 -0
  180. package/esm/v1/providers/tambo-v1-stream-context.js.map +1 -0
  181. package/esm/v1/providers/tambo-v1-stream-context.test.d.ts +2 -0
  182. package/esm/v1/providers/tambo-v1-stream-context.test.d.ts.map +1 -0
  183. package/esm/v1/providers/tambo-v1-stream-context.test.js +80 -0
  184. package/esm/v1/providers/tambo-v1-stream-context.test.js.map +1 -0
  185. package/esm/v1/types/component.d.ts +5 -2
  186. package/esm/v1/types/component.d.ts.map +1 -1
  187. package/esm/v1/types/component.js +5 -2
  188. package/esm/v1/types/component.js.map +1 -1
  189. package/esm/v1/types/event.d.ts +21 -12
  190. package/esm/v1/types/event.d.ts.map +1 -1
  191. package/esm/v1/types/event.js +44 -2
  192. package/esm/v1/types/event.js.map +1 -1
  193. package/esm/v1/types/event.test.d.ts +2 -0
  194. package/esm/v1/types/event.test.d.ts.map +1 -0
  195. package/esm/v1/types/event.test.js +68 -0
  196. package/esm/v1/types/event.test.js.map +1 -0
  197. package/esm/v1/types/message.d.ts +4 -8
  198. package/esm/v1/types/message.d.ts.map +1 -1
  199. package/esm/v1/types/message.js +1 -1
  200. package/esm/v1/types/message.js.map +1 -1
  201. package/esm/v1/types/thread.d.ts +1 -3
  202. package/esm/v1/types/thread.d.ts.map +1 -1
  203. package/esm/v1/types/thread.js +1 -1
  204. package/esm/v1/types/thread.js.map +1 -1
  205. package/esm/v1/utils/event-accumulator.d.ts +100 -0
  206. package/esm/v1/utils/event-accumulator.d.ts.map +1 -0
  207. package/esm/v1/utils/event-accumulator.js +708 -0
  208. package/esm/v1/utils/event-accumulator.js.map +1 -0
  209. package/esm/v1/utils/event-accumulator.test.d.ts +2 -0
  210. package/esm/v1/utils/event-accumulator.test.d.ts.map +1 -0
  211. package/esm/v1/utils/event-accumulator.test.js +1008 -0
  212. package/esm/v1/utils/event-accumulator.test.js.map +1 -0
  213. package/esm/v1/utils/json-patch.d.ts +18 -0
  214. package/esm/v1/utils/json-patch.d.ts.map +1 -0
  215. package/esm/v1/utils/json-patch.js +32 -0
  216. package/esm/v1/utils/json-patch.js.map +1 -0
  217. package/esm/v1/utils/json-patch.test.d.ts +2 -0
  218. package/esm/v1/utils/json-patch.test.d.ts.map +1 -0
  219. package/esm/v1/utils/json-patch.test.js +26 -0
  220. package/esm/v1/utils/json-patch.test.js.map +1 -0
  221. package/esm/v1/utils/registry-conversion.d.ts +53 -0
  222. package/esm/v1/utils/registry-conversion.d.ts.map +1 -0
  223. package/esm/v1/utils/registry-conversion.js +108 -0
  224. package/esm/v1/utils/registry-conversion.js.map +1 -0
  225. package/esm/v1/utils/registry-conversion.test.d.ts +2 -0
  226. package/esm/v1/utils/registry-conversion.test.d.ts.map +1 -0
  227. package/esm/v1/utils/registry-conversion.test.js +177 -0
  228. package/esm/v1/utils/registry-conversion.test.js.map +1 -0
  229. package/esm/v1/utils/stream-handler.d.ts +45 -0
  230. package/esm/v1/utils/stream-handler.d.ts.map +1 -0
  231. package/esm/v1/utils/stream-handler.js +44 -0
  232. package/esm/v1/utils/stream-handler.js.map +1 -0
  233. package/esm/v1/utils/stream-handler.test.d.ts +2 -0
  234. package/esm/v1/utils/stream-handler.test.d.ts.map +1 -0
  235. package/esm/v1/utils/stream-handler.test.js +72 -0
  236. package/esm/v1/utils/stream-handler.test.js.map +1 -0
  237. package/esm/v1/utils/tool-call-tracker.d.ts +41 -0
  238. package/esm/v1/utils/tool-call-tracker.d.ts.map +1 -0
  239. package/esm/v1/utils/tool-call-tracker.js +86 -0
  240. package/esm/v1/utils/tool-call-tracker.js.map +1 -0
  241. package/esm/v1/utils/tool-executor.d.ts +33 -0
  242. package/esm/v1/utils/tool-executor.d.ts.map +1 -0
  243. package/esm/v1/utils/tool-executor.js +99 -0
  244. package/esm/v1/utils/tool-executor.js.map +1 -0
  245. package/esm/v1/utils/tool-executor.test.d.ts +2 -0
  246. package/esm/v1/utils/tool-executor.test.d.ts.map +1 -0
  247. package/esm/v1/utils/tool-executor.test.js +220 -0
  248. package/esm/v1/utils/tool-executor.test.js.map +1 -0
  249. package/package.json +7 -6
  250. package/dist/v1/types/tool.d.ts +0 -52
  251. package/dist/v1/types/tool.d.ts.map +0 -1
  252. package/dist/v1/types/tool.js +0 -11
  253. package/dist/v1/types/tool.js.map +0 -1
  254. package/esm/v1/types/tool.d.ts +0 -52
  255. package/esm/v1/types/tool.d.ts.map +0 -1
  256. package/esm/v1/types/tool.js +0 -10
  257. package/esm/v1/types/tool.js.map +0 -1
@@ -0,0 +1,230 @@
1
+ "use strict";
2
+ "use client";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.TamboV1StreamProvider = TamboV1StreamProvider;
38
+ exports.useStreamState = useStreamState;
39
+ exports.useStreamDispatch = useStreamDispatch;
40
+ exports.useThreadManagement = useThreadManagement;
41
+ /**
42
+ * Stream Context Provider for v1 API
43
+ *
44
+ * Manages streaming state using React Context and useReducer.
45
+ * Provides state and dispatch to child components via separate contexts
46
+ * following the split-context pattern for optimal re-render performance.
47
+ */
48
+ // React is used implicitly for JSX transformation (jsx: "react" in tsconfig)
49
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
50
+ const react_1 = __importStar(require("react"));
51
+ const event_accumulator_1 = require("../utils/event-accumulator");
52
+ /**
53
+ * Context for accessing stream state (read-only).
54
+ * Separated from dispatch context to prevent unnecessary re-renders.
55
+ */
56
+ const StreamStateContext = (0, react_1.createContext)(null);
57
+ /**
58
+ * Context for dispatching events to the stream reducer.
59
+ * Separated from state context to prevent unnecessary re-renders.
60
+ */
61
+ const StreamDispatchContext = (0, react_1.createContext)(null);
62
+ /**
63
+ * Context for thread management functions.
64
+ * Separated from state to prevent unnecessary re-renders.
65
+ */
66
+ const ThreadManagementContext = (0, react_1.createContext)(null);
67
+ /**
68
+ * Creates initial stream state from props.
69
+ * @param props - Provider props
70
+ * @returns Initial stream state
71
+ */
72
+ function createInitialState(props) {
73
+ const { initialThread, threadId } = props;
74
+ // Initialize with empty threadMap
75
+ const threadMap = {};
76
+ // If threadId is provided, initialize that thread
77
+ if (threadId) {
78
+ // Create initial thread state (immutably)
79
+ const baseState = (0, event_accumulator_1.createInitialThreadState)(threadId);
80
+ // If initial thread data provided, merge it immutably
81
+ const threadState = initialThread
82
+ ? {
83
+ ...baseState,
84
+ thread: {
85
+ ...baseState.thread,
86
+ ...initialThread,
87
+ id: threadId, // Always use the provided threadId
88
+ },
89
+ }
90
+ : baseState;
91
+ threadMap[threadId] = threadState;
92
+ }
93
+ return {
94
+ threadMap,
95
+ currentThreadId: threadId ?? null,
96
+ };
97
+ }
98
+ /**
99
+ * Provider component for stream state management.
100
+ *
101
+ * Uses useReducer with streamReducer to accumulate AG-UI events into
102
+ * thread state. Provides state, dispatch, and thread management via separate contexts.
103
+ * @returns JSX element wrapping children with stream contexts
104
+ * @example
105
+ * ```tsx
106
+ * <TamboV1StreamProvider threadId="thread_123">
107
+ * <ChatInterface />
108
+ * </TamboV1StreamProvider>
109
+ * ```
110
+ */
111
+ function TamboV1StreamProvider(props) {
112
+ const { children } = props;
113
+ const initialState = (0, react_1.useMemo)(() => createInitialState(props),
114
+ // Only recompute if threadId changes
115
+ // eslint-disable-next-line react-hooks/exhaustive-deps
116
+ [props.threadId]);
117
+ const [state, dispatch] = (0, react_1.useReducer)(event_accumulator_1.streamReducer, initialState);
118
+ // Thread management functions
119
+ const initThread = (0, react_1.useCallback)((threadId, initialThread) => {
120
+ dispatch({ type: "INIT_THREAD", threadId, initialThread });
121
+ }, []);
122
+ const switchThread = (0, react_1.useCallback)((threadId) => {
123
+ dispatch({ type: "SET_CURRENT_THREAD", threadId });
124
+ }, []);
125
+ const startNewThread = (0, react_1.useCallback)(() => {
126
+ const tempId = `temp_${crypto.randomUUID()}`;
127
+ // Use atomic START_NEW_THREAD action to prevent race conditions
128
+ // when multiple calls happen concurrently (e.g., double-click)
129
+ dispatch({ type: "START_NEW_THREAD", threadId: tempId });
130
+ return tempId;
131
+ }, []);
132
+ const threadManagement = (0, react_1.useMemo)(() => ({
133
+ initThread,
134
+ switchThread,
135
+ startNewThread,
136
+ }), [initThread, switchThread, startNewThread]);
137
+ return (react_1.default.createElement(StreamStateContext.Provider, { value: state },
138
+ react_1.default.createElement(StreamDispatchContext.Provider, { value: dispatch },
139
+ react_1.default.createElement(ThreadManagementContext.Provider, { value: threadManagement }, children))));
140
+ }
141
+ /**
142
+ * Hook to access stream state.
143
+ *
144
+ * Must be used within TamboV1StreamProvider.
145
+ * @returns Current stream state
146
+ * @throws {Error} if used outside TamboV1StreamProvider
147
+ * @example
148
+ * ```tsx
149
+ * function ChatMessages() {
150
+ * const { thread, streaming } = useStreamState();
151
+ *
152
+ * return (
153
+ * <div>
154
+ * {thread.messages.map(msg => <Message key={msg.id} message={msg} />)}
155
+ * {streaming.status === 'streaming' && <LoadingIndicator />}
156
+ * </div>
157
+ * );
158
+ * }
159
+ * ```
160
+ */
161
+ function useStreamState() {
162
+ const context = (0, react_1.useContext)(StreamStateContext);
163
+ if (!context) {
164
+ throw new Error("useStreamState must be used within TamboV1StreamProvider");
165
+ }
166
+ return context;
167
+ }
168
+ /**
169
+ * Hook to access stream dispatch function.
170
+ *
171
+ * Must be used within TamboV1StreamProvider.
172
+ * @returns Dispatch function for sending events to reducer
173
+ * @throws {Error} if used outside TamboV1StreamProvider
174
+ * @example
175
+ * ```tsx
176
+ * function StreamHandler() {
177
+ * const dispatch = useStreamDispatch();
178
+ *
179
+ * useEffect(() => {
180
+ * async function handleStream() {
181
+ * for await (const event of streamEvents) {
182
+ * dispatch({ type: 'EVENT', event });
183
+ * }
184
+ * }
185
+ * handleStream();
186
+ * }, [dispatch]);
187
+ *
188
+ * return null;
189
+ * }
190
+ * ```
191
+ */
192
+ function useStreamDispatch() {
193
+ const context = (0, react_1.useContext)(StreamDispatchContext);
194
+ if (!context) {
195
+ throw new Error("useStreamDispatch must be used within TamboV1StreamProvider");
196
+ }
197
+ return context;
198
+ }
199
+ /**
200
+ * Hook to access thread management functions.
201
+ *
202
+ * Must be used within TamboV1StreamProvider.
203
+ * @returns Thread management functions
204
+ * @throws {Error} if used outside TamboV1StreamProvider
205
+ * @example
206
+ * ```tsx
207
+ * function ThreadSwitcher() {
208
+ * const { switchThread, startNewThread } = useThreadManagement();
209
+ *
210
+ * return (
211
+ * <div>
212
+ * <button onClick={() => switchThread('thread_123')}>
213
+ * Load Thread
214
+ * </button>
215
+ * <button onClick={startNewThread}>
216
+ * New Chat
217
+ * </button>
218
+ * </div>
219
+ * );
220
+ * }
221
+ * ```
222
+ */
223
+ function useThreadManagement() {
224
+ const context = (0, react_1.useContext)(ThreadManagementContext);
225
+ if (!context) {
226
+ throw new Error("useThreadManagement must be used within TamboV1StreamProvider");
227
+ }
228
+ return context;
229
+ }
230
+ //# sourceMappingURL=tambo-v1-stream-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tambo-v1-stream-context.js","sourceRoot":"","sources":["../../../src/v1/providers/tambo-v1-stream-context.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\n/**\n * Stream Context Provider for v1 API\n *\n * Manages streaming state using React Context and useReducer.\n * Provides state and dispatch to child components via separate contexts\n * following the split-context pattern for optimal re-render performance.\n */\n\n// React is used implicitly for JSX transformation (jsx: \"react\" in tsconfig)\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport React, {\n createContext,\n useReducer,\n useContext,\n useMemo,\n useCallback,\n type ReactNode,\n type Dispatch,\n} from \"react\";\nimport {\n streamReducer,\n createInitialThreadState,\n type StreamState,\n type StreamAction,\n} from \"../utils/event-accumulator\";\nimport type { TamboV1Thread } from \"../types/thread\";\n\n/**\n * Thread management functions exposed by the stream context.\n */\nexport interface ThreadManagement {\n /**\n * Initialize a new thread in the stream context.\n * Use this before sending messages to a new thread.\n * @param threadId - The thread ID to initialize\n * @param initialThread - Optional initial thread data\n */\n initThread: (\n threadId: string,\n initialThread?: Partial<TamboV1Thread>,\n ) => void;\n\n /**\n * Switch the current active thread.\n * Does not fetch thread data - use useTamboV1Thread for that.\n * @param threadId - The thread ID to switch to, or null to clear\n */\n switchThread: (threadId: string | null) => void;\n\n /**\n * Start a new thread (generates a temporary ID).\n * The actual thread ID will be assigned when the first message is sent.\n * @returns The temporary thread ID\n */\n startNewThread: () => string;\n}\n\n/**\n * Context for accessing stream state (read-only).\n * Separated from dispatch context to prevent unnecessary re-renders.\n */\nconst StreamStateContext = createContext<StreamState | null>(null);\n\n/**\n * Context for dispatching events to the stream reducer.\n * Separated from state context to prevent unnecessary re-renders.\n */\nconst StreamDispatchContext = createContext<Dispatch<StreamAction> | null>(\n null,\n);\n\n/**\n * Context for thread management functions.\n * Separated from state to prevent unnecessary re-renders.\n */\nconst ThreadManagementContext = createContext<ThreadManagement | null>(null);\n\n/**\n * Props for TamboV1StreamProvider\n */\nexport interface TamboV1StreamProviderProps {\n children: ReactNode;\n\n /**\n * Initial thread state (optional).\n * If not provided, an empty thread will be created.\n */\n initialThread?: Partial<TamboV1Thread>;\n\n /**\n * Thread ID for the stream context.\n * Used to initialize the thread if initialThread is not provided.\n */\n threadId?: string;\n}\n\n/**\n * Creates initial stream state from props.\n * @param props - Provider props\n * @returns Initial stream state\n */\nfunction createInitialState(props: TamboV1StreamProviderProps): StreamState {\n const { initialThread, threadId } = props;\n\n // Initialize with empty threadMap\n const threadMap: Record<\n string,\n ReturnType<typeof createInitialThreadState>\n > = {};\n\n // If threadId is provided, initialize that thread\n if (threadId) {\n // Create initial thread state (immutably)\n const baseState = createInitialThreadState(threadId);\n\n // If initial thread data provided, merge it immutably\n const threadState = initialThread\n ? {\n ...baseState,\n thread: {\n ...baseState.thread,\n ...initialThread,\n id: threadId, // Always use the provided threadId\n },\n }\n : baseState;\n\n threadMap[threadId] = threadState;\n }\n\n return {\n threadMap,\n currentThreadId: threadId ?? null,\n };\n}\n\n/**\n * Provider component for stream state management.\n *\n * Uses useReducer with streamReducer to accumulate AG-UI events into\n * thread state. Provides state, dispatch, and thread management via separate contexts.\n * @returns JSX element wrapping children with stream contexts\n * @example\n * ```tsx\n * <TamboV1StreamProvider threadId=\"thread_123\">\n * <ChatInterface />\n * </TamboV1StreamProvider>\n * ```\n */\nexport function TamboV1StreamProvider(props: TamboV1StreamProviderProps) {\n const { children } = props;\n\n const initialState = useMemo(\n () => createInitialState(props),\n // Only recompute if threadId changes\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [props.threadId],\n );\n\n const [state, dispatch] = useReducer(streamReducer, initialState);\n\n // Thread management functions\n const initThread = useCallback(\n (threadId: string, initialThread?: Partial<TamboV1Thread>) => {\n dispatch({ type: \"INIT_THREAD\", threadId, initialThread });\n },\n [],\n );\n\n const switchThread = useCallback((threadId: string | null) => {\n dispatch({ type: \"SET_CURRENT_THREAD\", threadId });\n }, []);\n\n const startNewThread = useCallback(() => {\n const tempId = `temp_${crypto.randomUUID()}`;\n // Use atomic START_NEW_THREAD action to prevent race conditions\n // when multiple calls happen concurrently (e.g., double-click)\n dispatch({ type: \"START_NEW_THREAD\", threadId: tempId });\n return tempId;\n }, []);\n\n const threadManagement = useMemo<ThreadManagement>(\n () => ({\n initThread,\n switchThread,\n startNewThread,\n }),\n [initThread, switchThread, startNewThread],\n );\n\n return (\n <StreamStateContext.Provider value={state}>\n <StreamDispatchContext.Provider value={dispatch}>\n <ThreadManagementContext.Provider value={threadManagement}>\n {children}\n </ThreadManagementContext.Provider>\n </StreamDispatchContext.Provider>\n </StreamStateContext.Provider>\n );\n}\n\n/**\n * Hook to access stream state.\n *\n * Must be used within TamboV1StreamProvider.\n * @returns Current stream state\n * @throws {Error} if used outside TamboV1StreamProvider\n * @example\n * ```tsx\n * function ChatMessages() {\n * const { thread, streaming } = useStreamState();\n *\n * return (\n * <div>\n * {thread.messages.map(msg => <Message key={msg.id} message={msg} />)}\n * {streaming.status === 'streaming' && <LoadingIndicator />}\n * </div>\n * );\n * }\n * ```\n */\nexport function useStreamState(): StreamState {\n const context = useContext(StreamStateContext);\n\n if (!context) {\n throw new Error(\"useStreamState must be used within TamboV1StreamProvider\");\n }\n\n return context;\n}\n\n/**\n * Hook to access stream dispatch function.\n *\n * Must be used within TamboV1StreamProvider.\n * @returns Dispatch function for sending events to reducer\n * @throws {Error} if used outside TamboV1StreamProvider\n * @example\n * ```tsx\n * function StreamHandler() {\n * const dispatch = useStreamDispatch();\n *\n * useEffect(() => {\n * async function handleStream() {\n * for await (const event of streamEvents) {\n * dispatch({ type: 'EVENT', event });\n * }\n * }\n * handleStream();\n * }, [dispatch]);\n *\n * return null;\n * }\n * ```\n */\nexport function useStreamDispatch(): Dispatch<StreamAction> {\n const context = useContext(StreamDispatchContext);\n\n if (!context) {\n throw new Error(\n \"useStreamDispatch must be used within TamboV1StreamProvider\",\n );\n }\n\n return context;\n}\n\n/**\n * Hook to access thread management functions.\n *\n * Must be used within TamboV1StreamProvider.\n * @returns Thread management functions\n * @throws {Error} if used outside TamboV1StreamProvider\n * @example\n * ```tsx\n * function ThreadSwitcher() {\n * const { switchThread, startNewThread } = useThreadManagement();\n *\n * return (\n * <div>\n * <button onClick={() => switchThread('thread_123')}>\n * Load Thread\n * </button>\n * <button onClick={startNewThread}>\n * New Chat\n * </button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useThreadManagement(): ThreadManagement {\n const context = useContext(ThreadManagementContext);\n\n if (!context) {\n throw new Error(\n \"useThreadManagement must be used within TamboV1StreamProvider\",\n );\n }\n\n return context;\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tambo-v1-stream-context.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tambo-v1-stream-context.test.d.ts","sourceRoot":"","sources":["../../../src/v1/providers/tambo-v1-stream-context.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const core_1 = require("@ag-ui/core");
7
+ const react_1 = require("@testing-library/react");
8
+ const react_2 = __importDefault(require("react"));
9
+ const tambo_v1_stream_context_1 = require("./tambo-v1-stream-context");
10
+ describe("TamboV1StreamProvider", () => {
11
+ describe("useStreamState", () => {
12
+ it("throws when used outside provider", () => {
13
+ // Suppress console.error for expected error
14
+ const consoleSpy = jest
15
+ .spyOn(console, "error")
16
+ .mockImplementation(() => { });
17
+ expect(() => {
18
+ (0, react_1.renderHook)(() => (0, tambo_v1_stream_context_1.useStreamState)());
19
+ }).toThrow("useStreamState must be used within TamboV1StreamProvider");
20
+ consoleSpy.mockRestore();
21
+ });
22
+ it("returns initial state with empty threadMap when no threadId", () => {
23
+ const wrapper = ({ children }) => (react_2.default.createElement(tambo_v1_stream_context_1.TamboV1StreamProvider, null, children));
24
+ const { result } = (0, react_1.renderHook)(() => (0, tambo_v1_stream_context_1.useStreamState)(), { wrapper });
25
+ expect(result.current.threadMap).toEqual({});
26
+ expect(result.current.currentThreadId).toBeNull();
27
+ });
28
+ it("initializes thread when threadId is provided", () => {
29
+ const wrapper = ({ children }) => (react_2.default.createElement(tambo_v1_stream_context_1.TamboV1StreamProvider, { threadId: "thread_123" }, children));
30
+ const { result } = (0, react_1.renderHook)(() => (0, tambo_v1_stream_context_1.useStreamState)(), { wrapper });
31
+ expect(result.current.currentThreadId).toBe("thread_123");
32
+ expect(result.current.threadMap.thread_123).toBeDefined();
33
+ expect(result.current.threadMap.thread_123.thread.id).toBe("thread_123");
34
+ expect(result.current.threadMap.thread_123.thread.status).toBe("idle");
35
+ expect(result.current.threadMap.thread_123.thread.messages).toEqual([]);
36
+ });
37
+ it("merges initialThread with default state", () => {
38
+ const wrapper = ({ children }) => (react_2.default.createElement(tambo_v1_stream_context_1.TamboV1StreamProvider, { threadId: "thread_123", initialThread: {
39
+ title: "Test Thread",
40
+ metadata: { key: "value" },
41
+ } }, children));
42
+ const { result } = (0, react_1.renderHook)(() => (0, tambo_v1_stream_context_1.useStreamState)(), { wrapper });
43
+ expect(result.current.threadMap.thread_123.thread.title).toBe("Test Thread");
44
+ expect(result.current.threadMap.thread_123.thread.metadata).toEqual({
45
+ key: "value",
46
+ });
47
+ // Default values should still be set
48
+ expect(result.current.threadMap.thread_123.thread.status).toBe("idle");
49
+ });
50
+ });
51
+ describe("useStreamDispatch", () => {
52
+ it("throws when used outside provider", () => {
53
+ const consoleSpy = jest
54
+ .spyOn(console, "error")
55
+ .mockImplementation(() => { });
56
+ expect(() => {
57
+ (0, react_1.renderHook)(() => (0, tambo_v1_stream_context_1.useStreamDispatch)());
58
+ }).toThrow("useStreamDispatch must be used within TamboV1StreamProvider");
59
+ consoleSpy.mockRestore();
60
+ });
61
+ it("dispatches events to update state", () => {
62
+ const wrapper = ({ children }) => (react_2.default.createElement(tambo_v1_stream_context_1.TamboV1StreamProvider, { threadId: "thread_123" }, children));
63
+ const { result } = (0, react_1.renderHook)(() => ({
64
+ state: (0, tambo_v1_stream_context_1.useStreamState)(),
65
+ dispatch: (0, tambo_v1_stream_context_1.useStreamDispatch)(),
66
+ }), { wrapper });
67
+ const runStartedEvent = {
68
+ type: core_1.EventType.RUN_STARTED,
69
+ runId: "run_1",
70
+ threadId: "thread_123",
71
+ };
72
+ (0, react_1.act)(() => {
73
+ result.current.dispatch({
74
+ type: "EVENT",
75
+ event: runStartedEvent,
76
+ threadId: "thread_123",
77
+ });
78
+ });
79
+ expect(result.current.state.threadMap.thread_123.thread.status).toBe("streaming");
80
+ expect(result.current.state.threadMap.thread_123.streaming.status).toBe("streaming");
81
+ expect(result.current.state.threadMap.thread_123.streaming.runId).toBe("run_1");
82
+ });
83
+ });
84
+ });
85
+ //# sourceMappingURL=tambo-v1-stream-context.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tambo-v1-stream-context.test.js","sourceRoot":"","sources":["../../../src/v1/providers/tambo-v1-stream-context.test.tsx"],"names":[],"mappings":";;;;;AAAA,sCAA8D;AAC9D,kDAAyD;AACzD,kDAA0B;AAC1B,uEAImC;AAEnC,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,4CAA4C;YAC5C,MAAM,UAAU,GAAG,IAAI;iBACpB,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC;iBACvB,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAEhC,MAAM,CAAC,GAAG,EAAE;gBACV,IAAA,kBAAU,EAAC,GAAG,EAAE,CAAC,IAAA,wCAAc,GAAE,CAAC,CAAC;YACrC,CAAC,CAAC,CAAC,OAAO,CAAC,0DAA0D,CAAC,CAAC;YAEvE,UAAU,CAAC,WAAW,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;YACrE,MAAM,OAAO,GAAG,CAAC,EAAE,QAAQ,EAAiC,EAAE,EAAE,CAAC,CAC/D,8BAAC,+CAAqB,QAAE,QAAQ,CAAyB,CAC1D,CAAC;YAEF,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,kBAAU,EAAC,GAAG,EAAE,CAAC,IAAA,wCAAc,GAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YAEnE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC7C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,QAAQ,EAAE,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,OAAO,GAAG,CAAC,EAAE,QAAQ,EAAiC,EAAE,EAAE,CAAC,CAC/D,8BAAC,+CAAqB,IAAC,QAAQ,EAAC,YAAY,IACzC,QAAQ,CACa,CACzB,CAAC;YAEF,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,kBAAU,EAAC,GAAG,EAAE,CAAC,IAAA,wCAAc,GAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YAEnE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC1D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;YAC1D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACzE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,OAAO,GAAG,CAAC,EAAE,QAAQ,EAAiC,EAAE,EAAE,CAAC,CAC/D,8BAAC,+CAAqB,IACpB,QAAQ,EAAC,YAAY,EACrB,aAAa,EAAE;oBACb,KAAK,EAAE,aAAa;oBACpB,QAAQ,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE;iBAC3B,IAEA,QAAQ,CACa,CACzB,CAAC;YAEF,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,kBAAU,EAAC,GAAG,EAAE,CAAC,IAAA,wCAAc,GAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YAEnE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAC3D,aAAa,CACd,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC;gBAClE,GAAG,EAAE,OAAO;aACb,CAAC,CAAC;YACH,qCAAqC;YACrC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,UAAU,GAAG,IAAI;iBACpB,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC;iBACvB,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAEhC,MAAM,CAAC,GAAG,EAAE;gBACV,IAAA,kBAAU,EAAC,GAAG,EAAE,CAAC,IAAA,2CAAiB,GAAE,CAAC,CAAC;YACxC,CAAC,CAAC,CAAC,OAAO,CAAC,6DAA6D,CAAC,CAAC;YAE1E,UAAU,CAAC,WAAW,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,OAAO,GAAG,CAAC,EAAE,QAAQ,EAAiC,EAAE,EAAE,CAAC,CAC/D,8BAAC,+CAAqB,IAAC,QAAQ,EAAC,YAAY,IACzC,QAAQ,CACa,CACzB,CAAC;YAEF,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,kBAAU,EAC3B,GAAG,EAAE,CAAC,CAAC;gBACL,KAAK,EAAE,IAAA,wCAAc,GAAE;gBACvB,QAAQ,EAAE,IAAA,2CAAiB,GAAE;aAC9B,CAAC,EACF,EAAE,OAAO,EAAE,CACZ,CAAC;YAEF,MAAM,eAAe,GAAoB;gBACvC,IAAI,EAAE,gBAAS,CAAC,WAAW;gBAC3B,KAAK,EAAE,OAAO;gBACd,QAAQ,EAAE,YAAY;aACvB,CAAC;YAEF,IAAA,WAAG,EAAC,GAAG,EAAE;gBACP,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;oBACtB,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,eAAe;oBACtB,QAAQ,EAAE,YAAY;iBACvB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAClE,WAAW,CACZ,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CACrE,WAAW,CACZ,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CACpE,OAAO,CACR,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { EventType, type RunStartedEvent } from \"@ag-ui/core\";\nimport { renderHook, act } from \"@testing-library/react\";\nimport React from \"react\";\nimport {\n TamboV1StreamProvider,\n useStreamState,\n useStreamDispatch,\n} from \"./tambo-v1-stream-context\";\n\ndescribe(\"TamboV1StreamProvider\", () => {\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 empty threadMap when no threadId\", () => {\n const wrapper = ({ children }: { children: React.ReactNode }) => (\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n );\n\n const { result } = renderHook(() => useStreamState(), { wrapper });\n\n expect(result.current.threadMap).toEqual({});\n expect(result.current.currentThreadId).toBeNull();\n });\n\n it(\"initializes thread when threadId is provided\", () => {\n const wrapper = ({ children }: { children: React.ReactNode }) => (\n <TamboV1StreamProvider threadId=\"thread_123\">\n {children}\n </TamboV1StreamProvider>\n );\n\n const { result } = renderHook(() => useStreamState(), { wrapper });\n\n expect(result.current.currentThreadId).toBe(\"thread_123\");\n expect(result.current.threadMap.thread_123).toBeDefined();\n expect(result.current.threadMap.thread_123.thread.id).toBe(\"thread_123\");\n expect(result.current.threadMap.thread_123.thread.status).toBe(\"idle\");\n expect(result.current.threadMap.thread_123.thread.messages).toEqual([]);\n });\n\n it(\"merges initialThread with default state\", () => {\n const wrapper = ({ children }: { children: React.ReactNode }) => (\n <TamboV1StreamProvider\n threadId=\"thread_123\"\n initialThread={{\n title: \"Test Thread\",\n metadata: { key: \"value\" },\n }}\n >\n {children}\n </TamboV1StreamProvider>\n );\n\n const { result } = renderHook(() => useStreamState(), { wrapper });\n\n expect(result.current.threadMap.thread_123.thread.title).toBe(\n \"Test Thread\",\n );\n expect(result.current.threadMap.thread_123.thread.metadata).toEqual({\n key: \"value\",\n });\n // Default values should still be set\n expect(result.current.threadMap.thread_123.thread.status).toBe(\"idle\");\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 wrapper = ({ children }: { children: React.ReactNode }) => (\n <TamboV1StreamProvider threadId=\"thread_123\">\n {children}\n </TamboV1StreamProvider>\n );\n\n const { result } = renderHook(\n () => ({\n state: useStreamState(),\n dispatch: useStreamDispatch(),\n }),\n { wrapper },\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"]}
@@ -3,8 +3,11 @@
3
3
  *
4
4
  * Defines how React components are registered and made available to the AI.
5
5
  *
6
- * TODO: Once @tambo-ai/typescript-sdk/v1 is released, import AvailableComponent
7
- * from the SDK package.
6
+ * Note: AvailableComponent is defined locally to match RunCreateParams.AvailableComponent
7
+ * from the SDK. The SDK exports two different AvailableComponent types:
8
+ * - `shared.AvailableComponent` has `props` and `contextTools` fields
9
+ * - `RunCreateParams.AvailableComponent` has `propsSchema` and `stateSchema` fields
10
+ * We need the latter for v1 API calls, so we define it locally to avoid confusion.
8
11
  */
9
12
  import type { ComponentType } from "react";
10
13
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../../../src/v1/types/component.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE3C;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IAEb,4CAA4C;IAC5C,WAAW,EAAE,MAAM,CAAC;IAEpB,6CAA6C;IAC7C,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAErC,wDAAwD;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAiB,SAAQ,kBAAkB;IAC1D,oCAAoC;IACpC,SAAS,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC;IAE9B,uCAAuC;IACvC,YAAY,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC9C;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB,CAClC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAEhE,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IAEd,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,mCAAmC;IACnC,WAAW,EAAE,MAAM,CAAC;IAEpB,oDAAoD;IACpD,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB"}
1
+ {"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../../../src/v1/types/component.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE3C;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IAEb,4CAA4C;IAC5C,WAAW,EAAE,MAAM,CAAC;IAEpB,6CAA6C;IAC7C,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAErC,wDAAwD;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAiB,SAAQ,kBAAkB;IAC1D,oCAAoC;IACpC,SAAS,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC;IAE9B,uCAAuC;IACvC,YAAY,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC9C;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB,CAClC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAEhE,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IAEd,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,mCAAmC;IACnC,WAAW,EAAE,MAAM,CAAC;IAEpB,oDAAoD;IACpD,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB"}
@@ -4,8 +4,11 @@
4
4
  *
5
5
  * Defines how React components are registered and made available to the AI.
6
6
  *
7
- * TODO: Once @tambo-ai/typescript-sdk/v1 is released, import AvailableComponent
8
- * from the SDK package.
7
+ * Note: AvailableComponent is defined locally to match RunCreateParams.AvailableComponent
8
+ * from the SDK. The SDK exports two different AvailableComponent types:
9
+ * - `shared.AvailableComponent` has `props` and `contextTools` fields
10
+ * - `RunCreateParams.AvailableComponent` has `propsSchema` and `stateSchema` fields
11
+ * We need the latter for v1 API calls, so we define it locally to avoid confusion.
9
12
  */
10
13
  Object.defineProperty(exports, "__esModule", { value: true });
11
14
  //# sourceMappingURL=component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"component.js","sourceRoot":"","sources":["../../../src/v1/types/component.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG","sourcesContent":["/**\n * Component Types for v1 API\n *\n * Defines how React components are registered and made available to the AI.\n *\n * TODO: Once @tambo-ai/typescript-sdk/v1 is released, import AvailableComponent\n * from the SDK package.\n */\n\nimport type { ComponentType } from \"react\";\n\n/**\n * Component registration metadata for the AI\n * This is what gets sent to the API in the `available_components` field\n */\nexport interface AvailableComponent {\n /** Component name (must be unique) */\n name: string;\n\n /** Human-readable description for the AI */\n description: string;\n\n /** JSON Schema describing component props */\n propsSchema: Record<string, unknown>;\n\n /** JSON Schema describing component state (optional) */\n stateSchema?: Record<string, unknown>;\n}\n\n/**\n * Component registration for React SDK\n * Extends AvailableComponent with the actual React component\n */\nexport interface TamboV1Component extends AvailableComponent {\n /** The React component to render */\n component: ComponentType<any>;\n\n /** Initial state factory (optional) */\n initialState?: () => Record<string, unknown>;\n}\n\n/**\n * Props passed to components when rendered\n */\nexport interface TamboComponentProps<\n TProps extends Record<string, unknown> = Record<string, unknown>,\n TState extends Record<string, unknown> = Record<string, unknown>,\n> {\n /** Component props from AI */\n props: TProps;\n\n /** Component state (can be updated by AI or client) */\n state?: TState;\n\n /** Unique component instance ID */\n componentId: string;\n\n /** Whether this component is currently streaming */\n isStreaming?: boolean;\n}\n"]}
1
+ {"version":3,"file":"component.js","sourceRoot":"","sources":["../../../src/v1/types/component.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG","sourcesContent":["/**\n * Component Types for v1 API\n *\n * Defines how React components are registered and made available to the AI.\n *\n * Note: AvailableComponent is defined locally to match RunCreateParams.AvailableComponent\n * from the SDK. The SDK exports two different AvailableComponent types:\n * - `shared.AvailableComponent` has `props` and `contextTools` fields\n * - `RunCreateParams.AvailableComponent` has `propsSchema` and `stateSchema` fields\n * We need the latter for v1 API calls, so we define it locally to avoid confusion.\n */\n\nimport type { ComponentType } from \"react\";\n\n/**\n * Component registration metadata for the AI\n * This is what gets sent to the API in the `available_components` field\n */\nexport interface AvailableComponent {\n /** Component name (must be unique) */\n name: string;\n\n /** Human-readable description for the AI */\n description: string;\n\n /** JSON Schema describing component props */\n propsSchema: Record<string, unknown>;\n\n /** JSON Schema describing component state (optional) */\n stateSchema?: Record<string, unknown>;\n}\n\n/**\n * Component registration for React SDK\n * Extends AvailableComponent with the actual React component\n */\nexport interface TamboV1Component extends AvailableComponent {\n /** The React component to render */\n component: ComponentType<any>;\n\n /** Initial state factory (optional) */\n initialState?: () => Record<string, unknown>;\n}\n\n/**\n * Props passed to components when rendered\n */\nexport interface TamboComponentProps<\n TProps extends Record<string, unknown> = Record<string, unknown>,\n TState extends Record<string, unknown> = Record<string, unknown>,\n> {\n /** Component props from AI */\n props: TProps;\n\n /** Component state (can be updated by AI or client) */\n state?: TState;\n\n /** Unique component instance ID */\n componentId: string;\n\n /** Whether this component is currently streaming */\n isStreaming?: boolean;\n}\n"]}
@@ -2,9 +2,10 @@
2
2
  * Tambo-specific Custom Event Types for v1 Streaming API
3
3
  *
4
4
  * Defines custom events specific to Tambo functionality.
5
- * For standard AG-UI events, import directly from @ag-ui/core.
5
+ * For standard AG-UI events, import directly from `@ag-ui/core`.
6
6
  */
7
7
  import type { CustomEvent } from "@ag-ui/core";
8
+ import type { Operation } from "fast-json-patch";
8
9
  type TamboCustomEventEnvelope<TName extends string, TValue> = Omit<CustomEvent, "name" | "value"> & {
9
10
  name: TName;
10
11
  value: TValue;
@@ -23,7 +24,7 @@ export type ComponentStartEvent = TamboCustomEventEnvelope<"tambo.component.star
23
24
  */
24
25
  export type ComponentPropsDeltaEvent = TamboCustomEventEnvelope<"tambo.component.props_delta", {
25
26
  componentId: string;
26
- operations: JsonPatchOperation[];
27
+ operations: Operation[];
27
28
  }>;
28
29
  /**
29
30
  * Component state delta event (custom: tambo.component.state_delta)
@@ -31,7 +32,7 @@ export type ComponentPropsDeltaEvent = TamboCustomEventEnvelope<"tambo.component
31
32
  */
32
33
  export type ComponentStateDeltaEvent = TamboCustomEventEnvelope<"tambo.component.state_delta", {
33
34
  componentId: string;
34
- operations: JsonPatchOperation[];
35
+ operations: Operation[];
35
36
  }>;
36
37
  /**
37
38
  * Component end event (custom: tambo.component.end)
@@ -46,18 +47,26 @@ export type ComponentEndEvent = TamboCustomEventEnvelope<"tambo.component.end",
46
47
  export type RunAwaitingInputEvent = TamboCustomEventEnvelope<"tambo.run.awaiting_input", {
47
48
  pendingToolCallIds: string[];
48
49
  }>;
49
- /**
50
- * JSON Patch operation (RFC 6902)
51
- */
52
- export interface JsonPatchOperation {
53
- op: "add" | "remove" | "replace" | "move" | "copy" | "test";
54
- path: string;
55
- value?: unknown;
56
- from?: string;
57
- }
58
50
  /**
59
51
  * Union type of Tambo-specific custom events
60
52
  */
61
53
  export type TamboCustomEvent = ComponentStartEvent | ComponentPropsDeltaEvent | ComponentStateDeltaEvent | ComponentEndEvent | RunAwaitingInputEvent;
54
+ /**
55
+ * Type guard to check if an event is a Tambo custom event.
56
+ * Validates that the event has a name matching known Tambo custom event types.
57
+ * @param event - Event object to check
58
+ * @param event.name - Event name to match against known Tambo event types
59
+ * @returns True if event is a TamboCustomEvent
60
+ */
61
+ export declare function isTamboCustomEvent(event: {
62
+ name?: string;
63
+ }): event is TamboCustomEvent;
64
+ /**
65
+ * Casts a CustomEvent to the specific TamboCustomEvent type based on its name.
66
+ * Uses exhaustive type checking to ensure all event types are handled.
67
+ * @param event - The CustomEvent to cast
68
+ * @returns The properly typed TamboCustomEvent, or undefined if not a known Tambo event
69
+ */
70
+ export declare function asTamboCustomEvent(event: CustomEvent): TamboCustomEvent | undefined;
62
71
  export {};
63
72
  //# sourceMappingURL=event.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"event.d.ts","sourceRoot":"","sources":["../../../src/v1/types/event.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,KAAK,wBAAwB,CAAC,KAAK,SAAS,MAAM,EAAE,MAAM,IAAI,IAAI,CAChE,WAAW,EACX,MAAM,GAAG,OAAO,CACjB,GAAG;IACF,IAAI,EAAE,KAAK,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,wBAAwB,CACxD,uBAAuB,EACvB;IACE,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB,CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,wBAAwB,GAAG,wBAAwB,CAC7D,6BAA6B,EAC7B;IACE,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,kBAAkB,EAAE,CAAC;CAClC,CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,wBAAwB,GAAG,wBAAwB,CAC7D,6BAA6B,EAC7B;IACE,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,kBAAkB,EAAE,CAAC;CAClC,CACF,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,wBAAwB,CACtD,qBAAqB,EACrB;IACE,WAAW,EAAE,MAAM,CAAC;CACrB,CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,qBAAqB,GAAG,wBAAwB,CAC1D,0BAA0B,EAC1B;IACE,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B,CACF,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,KAAK,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,MAAM,gBAAgB,GACxB,mBAAmB,GACnB,wBAAwB,GACxB,wBAAwB,GACxB,iBAAiB,GACjB,qBAAqB,CAAC"}
1
+ {"version":3,"file":"event.d.ts","sourceRoot":"","sources":["../../../src/v1/types/event.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,KAAK,wBAAwB,CAAC,KAAK,SAAS,MAAM,EAAE,MAAM,IAAI,IAAI,CAChE,WAAW,EACX,MAAM,GAAG,OAAO,CACjB,GAAG;IACF,IAAI,EAAE,KAAK,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,wBAAwB,CACxD,uBAAuB,EACvB;IACE,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB,CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,wBAAwB,GAAG,wBAAwB,CAC7D,6BAA6B,EAC7B;IACE,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,SAAS,EAAE,CAAC;CACzB,CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,wBAAwB,GAAG,wBAAwB,CAC7D,6BAA6B,EAC7B;IACE,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,SAAS,EAAE,CAAC;CACzB,CACF,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,wBAAwB,CACtD,qBAAqB,EACrB;IACE,WAAW,EAAE,MAAM,CAAC;CACrB,CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,qBAAqB,GAAG,wBAAwB,CAC1D,0BAA0B,EAC1B;IACE,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B,CACF,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,gBAAgB,GACxB,mBAAmB,GACnB,wBAAwB,GACxB,wBAAwB,GACxB,iBAAiB,GACjB,qBAAqB,CAAC;AAa1B;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,KAAK,IAAI,gBAAgB,CAK5B;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,WAAW,GACjB,gBAAgB,GAAG,SAAS,CAe9B"}
@@ -3,7 +3,52 @@
3
3
  * Tambo-specific Custom Event Types for v1 Streaming API
4
4
  *
5
5
  * Defines custom events specific to Tambo functionality.
6
- * For standard AG-UI events, import directly from @ag-ui/core.
6
+ * For standard AG-UI events, import directly from `@ag-ui/core`.
7
7
  */
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.isTamboCustomEvent = isTamboCustomEvent;
10
+ exports.asTamboCustomEvent = asTamboCustomEvent;
11
+ /**
12
+ * Known Tambo custom event names for type narrowing
13
+ */
14
+ const TAMBO_CUSTOM_EVENT_NAMES = [
15
+ "tambo.component.start",
16
+ "tambo.component.props_delta",
17
+ "tambo.component.state_delta",
18
+ "tambo.component.end",
19
+ "tambo.run.awaiting_input",
20
+ ];
21
+ /**
22
+ * Type guard to check if an event is a Tambo custom event.
23
+ * Validates that the event has a name matching known Tambo custom event types.
24
+ * @param event - Event object to check
25
+ * @param event.name - Event name to match against known Tambo event types
26
+ * @returns True if event is a TamboCustomEvent
27
+ */
28
+ function isTamboCustomEvent(event) {
29
+ return (typeof event.name === "string" &&
30
+ TAMBO_CUSTOM_EVENT_NAMES.includes(event.name));
31
+ }
32
+ /**
33
+ * Casts a CustomEvent to the specific TamboCustomEvent type based on its name.
34
+ * Uses exhaustive type checking to ensure all event types are handled.
35
+ * @param event - The CustomEvent to cast
36
+ * @returns The properly typed TamboCustomEvent, or undefined if not a known Tambo event
37
+ */
38
+ function asTamboCustomEvent(event) {
39
+ switch (event.name) {
40
+ case "tambo.component.start":
41
+ return event;
42
+ case "tambo.component.props_delta":
43
+ return event;
44
+ case "tambo.component.state_delta":
45
+ return event;
46
+ case "tambo.component.end":
47
+ return event;
48
+ case "tambo.run.awaiting_input":
49
+ return event;
50
+ default:
51
+ return undefined;
52
+ }
53
+ }
9
54
  //# sourceMappingURL=event.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"event.js","sourceRoot":"","sources":["../../../src/v1/types/event.ts"],"names":[],"mappings":";AAAA;;;;;GAKG","sourcesContent":["/**\n * Tambo-specific Custom Event Types for v1 Streaming API\n *\n * Defines custom events specific to Tambo functionality.\n * For standard AG-UI events, import directly from @ag-ui/core.\n */\n\nimport type { CustomEvent } from \"@ag-ui/core\";\n\ntype TamboCustomEventEnvelope<TName extends string, TValue> = Omit<\n CustomEvent,\n \"name\" | \"value\"\n> & {\n name: TName;\n value: TValue;\n};\n\n/**\n * Component start event (custom: tambo.component.start)\n */\nexport type ComponentStartEvent = TamboCustomEventEnvelope<\n \"tambo.component.start\",\n {\n messageId: string;\n componentId: string;\n componentName: string;\n }\n>;\n\n/**\n * Component props delta event (custom: tambo.component.props_delta)\n * Uses JSON Patch (RFC 6902) to update component props\n */\nexport type ComponentPropsDeltaEvent = TamboCustomEventEnvelope<\n \"tambo.component.props_delta\",\n {\n componentId: string;\n operations: JsonPatchOperation[];\n }\n>;\n\n/**\n * Component state delta event (custom: tambo.component.state_delta)\n * Uses JSON Patch (RFC 6902) to update component state\n */\nexport type ComponentStateDeltaEvent = TamboCustomEventEnvelope<\n \"tambo.component.state_delta\",\n {\n componentId: string;\n operations: JsonPatchOperation[];\n }\n>;\n\n/**\n * Component end event (custom: tambo.component.end)\n */\nexport type ComponentEndEvent = TamboCustomEventEnvelope<\n \"tambo.component.end\",\n {\n componentId: string;\n }\n>;\n\n/**\n * Run awaiting input event (custom: tambo.run.awaiting_input)\n * Signals that the run is paused waiting for client-side tool execution\n */\nexport type RunAwaitingInputEvent = TamboCustomEventEnvelope<\n \"tambo.run.awaiting_input\",\n {\n pendingToolCallIds: string[];\n }\n>;\n\n/**\n * JSON Patch operation (RFC 6902)\n */\nexport interface JsonPatchOperation {\n op: \"add\" | \"remove\" | \"replace\" | \"move\" | \"copy\" | \"test\";\n path: string;\n value?: unknown;\n from?: string; // For 'move' and 'copy' operations\n}\n\n/**\n * Union type of Tambo-specific custom events\n */\nexport type TamboCustomEvent =\n | ComponentStartEvent\n | ComponentPropsDeltaEvent\n | ComponentStateDeltaEvent\n | ComponentEndEvent\n | RunAwaitingInputEvent;\n"]}
1
+ {"version":3,"file":"event.js","sourceRoot":"","sources":["../../../src/v1/types/event.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAkGH,gDAOC;AAQD,gDAiBC;AAlDD;;GAEG;AACH,MAAM,wBAAwB,GAAG;IAC/B,uBAAuB;IACvB,6BAA6B;IAC7B,6BAA6B;IAC7B,qBAAqB;IACrB,0BAA0B;CAClB,CAAC;AAEX;;;;;;GAMG;AACH,SAAgB,kBAAkB,CAAC,KAElC;IACC,OAAO,CACL,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAC7B,wBAA8C,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CACrE,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAgB,kBAAkB,CAChC,KAAkB;IAElB,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,uBAAuB;YAC1B,OAAO,KAA4B,CAAC;QACtC,KAAK,6BAA6B;YAChC,OAAO,KAAiC,CAAC;QAC3C,KAAK,6BAA6B;YAChC,OAAO,KAAiC,CAAC;QAC3C,KAAK,qBAAqB;YACxB,OAAO,KAA0B,CAAC;QACpC,KAAK,0BAA0B;YAC7B,OAAO,KAA8B,CAAC;QACxC;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC","sourcesContent":["/**\n * Tambo-specific Custom Event Types for v1 Streaming API\n *\n * Defines custom events specific to Tambo functionality.\n * For standard AG-UI events, import directly from `@ag-ui/core`.\n */\n\nimport type { CustomEvent } from \"@ag-ui/core\";\nimport type { Operation } from \"fast-json-patch\";\n\ntype TamboCustomEventEnvelope<TName extends string, TValue> = Omit<\n CustomEvent,\n \"name\" | \"value\"\n> & {\n name: TName;\n value: TValue;\n};\n\n/**\n * Component start event (custom: tambo.component.start)\n */\nexport type ComponentStartEvent = TamboCustomEventEnvelope<\n \"tambo.component.start\",\n {\n messageId: string;\n componentId: string;\n componentName: string;\n }\n>;\n\n/**\n * Component props delta event (custom: tambo.component.props_delta)\n * Uses JSON Patch (RFC 6902) to update component props\n */\nexport type ComponentPropsDeltaEvent = TamboCustomEventEnvelope<\n \"tambo.component.props_delta\",\n {\n componentId: string;\n operations: Operation[];\n }\n>;\n\n/**\n * Component state delta event (custom: tambo.component.state_delta)\n * Uses JSON Patch (RFC 6902) to update component state\n */\nexport type ComponentStateDeltaEvent = TamboCustomEventEnvelope<\n \"tambo.component.state_delta\",\n {\n componentId: string;\n operations: Operation[];\n }\n>;\n\n/**\n * Component end event (custom: tambo.component.end)\n */\nexport type ComponentEndEvent = TamboCustomEventEnvelope<\n \"tambo.component.end\",\n {\n componentId: string;\n }\n>;\n\n/**\n * Run awaiting input event (custom: tambo.run.awaiting_input)\n * Signals that the run is paused waiting for client-side tool execution\n */\nexport type RunAwaitingInputEvent = TamboCustomEventEnvelope<\n \"tambo.run.awaiting_input\",\n {\n pendingToolCallIds: string[];\n }\n>;\n\n/**\n * Union type of Tambo-specific custom events\n */\nexport type TamboCustomEvent =\n | ComponentStartEvent\n | ComponentPropsDeltaEvent\n | ComponentStateDeltaEvent\n | ComponentEndEvent\n | RunAwaitingInputEvent;\n\n/**\n * Known Tambo custom event names for type narrowing\n */\nconst TAMBO_CUSTOM_EVENT_NAMES = [\n \"tambo.component.start\",\n \"tambo.component.props_delta\",\n \"tambo.component.state_delta\",\n \"tambo.component.end\",\n \"tambo.run.awaiting_input\",\n] as const;\n\n/**\n * Type guard to check if an event is a Tambo custom event.\n * Validates that the event has a name matching known Tambo custom event types.\n * @param event - Event object to check\n * @param event.name - Event name to match against known Tambo event types\n * @returns True if event is a TamboCustomEvent\n */\nexport function isTamboCustomEvent(event: {\n name?: string;\n}): event is TamboCustomEvent {\n return (\n typeof event.name === \"string\" &&\n (TAMBO_CUSTOM_EVENT_NAMES as readonly string[]).includes(event.name)\n );\n}\n\n/**\n * Casts a CustomEvent to the specific TamboCustomEvent type based on its name.\n * Uses exhaustive type checking to ensure all event types are handled.\n * @param event - The CustomEvent to cast\n * @returns The properly typed TamboCustomEvent, or undefined if not a known Tambo event\n */\nexport function asTamboCustomEvent(\n event: CustomEvent,\n): TamboCustomEvent | undefined {\n switch (event.name) {\n case \"tambo.component.start\":\n return event as ComponentStartEvent;\n case \"tambo.component.props_delta\":\n return event as ComponentPropsDeltaEvent;\n case \"tambo.component.state_delta\":\n return event as ComponentStateDeltaEvent;\n case \"tambo.component.end\":\n return event as ComponentEndEvent;\n case \"tambo.run.awaiting_input\":\n return event as RunAwaitingInputEvent;\n default:\n return undefined;\n }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=event.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event.test.d.ts","sourceRoot":"","sources":["../../../src/v1/types/event.test.ts"],"names":[],"mappings":""}