@tambo-ai/react 1.1.0 → 1.2.1

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 (491) hide show
  1. package/dist/context-helpers/current-interactables-context-helper.d.ts +16 -2
  2. package/dist/context-helpers/current-interactables-context-helper.d.ts.map +1 -1
  3. package/dist/context-helpers/current-interactables-context-helper.js.map +1 -1
  4. package/dist/context-helpers/current-interactables-context-helper.test.d.ts +2 -0
  5. package/dist/context-helpers/current-interactables-context-helper.test.d.ts.map +1 -0
  6. package/dist/context-helpers/current-interactables-context-helper.test.js +70 -0
  7. package/dist/context-helpers/current-interactables-context-helper.test.js.map +1 -0
  8. package/dist/hoc/with-tambo-interactable.d.ts.map +1 -1
  9. package/dist/hoc/with-tambo-interactable.js +11 -2
  10. package/dist/hoc/with-tambo-interactable.js.map +1 -1
  11. package/dist/hoc/with-tambo-interactable.test.js +14 -0
  12. package/dist/hoc/with-tambo-interactable.test.js.map +1 -1
  13. package/dist/mcp/elicitation.d.ts +3 -37
  14. package/dist/mcp/elicitation.d.ts.map +1 -1
  15. package/dist/mcp/elicitation.js +7 -24
  16. package/dist/mcp/elicitation.js.map +1 -1
  17. package/dist/mcp/index.d.ts +4 -4
  18. package/dist/mcp/index.d.ts.map +1 -1
  19. package/dist/mcp/index.js +2 -2
  20. package/dist/mcp/index.js.map +1 -1
  21. package/dist/mcp/mcp-client.test.js +17 -17
  22. package/dist/mcp/mcp-client.test.js.map +1 -1
  23. package/dist/mcp/mcp-hooks.d.ts.map +1 -1
  24. package/dist/mcp/mcp-hooks.js +8 -5
  25. package/dist/mcp/mcp-hooks.js.map +1 -1
  26. package/dist/mcp/mcp-hooks.test.js +30 -29
  27. package/dist/mcp/mcp-hooks.test.js.map +1 -1
  28. package/dist/mcp/tambo-mcp-provider.d.ts +6 -9
  29. package/dist/mcp/tambo-mcp-provider.d.ts.map +1 -1
  30. package/dist/mcp/tambo-mcp-provider.js +9 -13
  31. package/dist/mcp/tambo-mcp-provider.js.map +1 -1
  32. package/dist/mcp/tambo-mcp-provider.test.js +26 -25
  33. package/dist/mcp/tambo-mcp-provider.test.js.map +1 -1
  34. package/dist/mcp/use-mcp-servers.test.js +2 -1
  35. package/dist/mcp/use-mcp-servers.test.js.map +1 -1
  36. package/dist/model/component-metadata.d.ts +7 -372
  37. package/dist/model/component-metadata.d.ts.map +1 -1
  38. package/dist/model/component-metadata.js.map +1 -1
  39. package/dist/model/validate-input.test.d.ts +2 -0
  40. package/dist/model/validate-input.test.d.ts.map +1 -0
  41. package/dist/model/validate-input.test.js +38 -0
  42. package/dist/model/validate-input.test.js.map +1 -0
  43. package/dist/providers/tambo-interactable-provider-partial-updates.test.js +2 -0
  44. package/dist/providers/tambo-interactable-provider-partial-updates.test.js.map +1 -1
  45. package/dist/providers/tambo-interactable-provider.d.ts +7 -7
  46. package/dist/providers/tambo-interactable-provider.d.ts.map +1 -1
  47. package/dist/providers/tambo-interactable-provider.js +26 -4
  48. package/dist/providers/tambo-interactable-provider.js.map +1 -1
  49. package/dist/providers/tambo-interactable-provider.test.js +78 -0
  50. package/dist/providers/tambo-interactable-provider.test.js.map +1 -1
  51. package/dist/providers/tambo-registry-provider.d.ts +2 -1
  52. package/dist/providers/tambo-registry-provider.d.ts.map +1 -1
  53. package/dist/providers/tambo-registry-provider.js +19 -0
  54. package/dist/providers/tambo-registry-provider.js.map +1 -1
  55. package/dist/providers/tambo-registry-provider.test.js +36 -0
  56. package/dist/providers/tambo-registry-provider.test.js.map +1 -1
  57. package/dist/providers/tambo-registry-schema-compat.test.js +4 -4
  58. package/dist/providers/tambo-registry-schema-compat.test.js.map +1 -1
  59. package/dist/schema/index.d.ts +2 -4
  60. package/dist/schema/index.d.ts.map +1 -1
  61. package/dist/schema/index.js +9 -11
  62. package/dist/schema/index.js.map +1 -1
  63. package/dist/schema/json-schema.d.ts +1 -17
  64. package/dist/schema/json-schema.d.ts.map +1 -1
  65. package/dist/schema/json-schema.js +5 -69
  66. package/dist/schema/json-schema.js.map +1 -1
  67. package/dist/schema/schema.test.js +24 -25
  68. package/dist/schema/schema.test.js.map +1 -1
  69. package/dist/schema/standard-schema.test.js +25 -25
  70. package/dist/schema/standard-schema.test.js.map +1 -1
  71. package/dist/schema/validate.test.js +33 -33
  72. package/dist/schema/validate.test.js.map +1 -1
  73. package/dist/testing/tools.d.ts +4 -4
  74. package/dist/testing/tools.test.d.ts +2 -0
  75. package/dist/testing/tools.test.d.ts.map +1 -0
  76. package/dist/testing/tools.test.js +60 -0
  77. package/dist/testing/tools.test.js.map +1 -0
  78. package/dist/util/mcp-server-utils.d.ts +1 -1
  79. package/dist/util/mcp-server-utils.d.ts.map +1 -1
  80. package/dist/util/mcp-server-utils.js +4 -4
  81. package/dist/util/mcp-server-utils.js.map +1 -1
  82. package/dist/util/mcp-server-utils.test.js +27 -27
  83. package/dist/util/mcp-server-utils.test.js.map +1 -1
  84. package/dist/util/registry.js +1 -1
  85. package/dist/util/registry.js.map +1 -1
  86. package/dist/util/resource-content-resolver.js +5 -5
  87. package/dist/util/resource-content-resolver.js.map +1 -1
  88. package/dist/util/resource-content-resolver.test.js +6 -6
  89. package/dist/util/resource-content-resolver.test.js.map +1 -1
  90. package/dist/util/tool-caller.test.d.ts +2 -0
  91. package/dist/util/tool-caller.test.d.ts.map +1 -0
  92. package/dist/util/tool-caller.test.js +71 -0
  93. package/dist/util/tool-caller.test.js.map +1 -0
  94. package/dist/v1/__tests__/v1-interactables.test.js +6 -0
  95. package/dist/v1/__tests__/v1-interactables.test.js.map +1 -1
  96. package/dist/v1/components/v1-component-renderer.test.js +1 -0
  97. package/dist/v1/components/v1-component-renderer.test.js.map +1 -1
  98. package/dist/v1/hooks/use-tambo-v1-auth-state.d.ts +1 -1
  99. package/dist/v1/hooks/use-tambo-v1-auth-state.d.ts.map +1 -1
  100. package/dist/v1/hooks/use-tambo-v1-auth-state.js.map +1 -1
  101. package/dist/v1/hooks/use-tambo-v1-component-state.js +2 -2
  102. package/dist/v1/hooks/use-tambo-v1-component-state.js.map +1 -1
  103. package/dist/v1/hooks/use-tambo-v1-component-state.test.js +1 -1
  104. package/dist/v1/hooks/use-tambo-v1-component-state.test.js.map +1 -1
  105. package/dist/v1/hooks/use-tambo-v1-send-message.d.ts +1 -1
  106. package/dist/v1/hooks/use-tambo-v1-send-message.d.ts.map +1 -1
  107. package/dist/v1/hooks/use-tambo-v1-send-message.js +17 -17
  108. package/dist/v1/hooks/use-tambo-v1-send-message.js.map +1 -1
  109. package/dist/v1/hooks/use-tambo-v1-send-message.test.js +1 -1
  110. package/dist/v1/hooks/use-tambo-v1-send-message.test.js.map +1 -1
  111. package/dist/v1/hooks/use-tambo-v1-stream-status.js +2 -2
  112. package/dist/v1/hooks/use-tambo-v1-stream-status.js.map +1 -1
  113. package/dist/v1/hooks/use-tambo-v1-stream-status.test.js +9 -5
  114. package/dist/v1/hooks/use-tambo-v1-stream-status.test.js.map +1 -1
  115. package/dist/v1/hooks/use-tambo-v1-suggestions.js +2 -2
  116. package/dist/v1/hooks/use-tambo-v1-suggestions.js.map +1 -1
  117. package/dist/v1/hooks/use-tambo-v1-thread-input.test.js +1 -0
  118. package/dist/v1/hooks/use-tambo-v1-thread-input.test.js.map +1 -1
  119. package/dist/v1/hooks/use-tambo-v1.d.ts +7 -6
  120. package/dist/v1/hooks/use-tambo-v1.d.ts.map +1 -1
  121. package/dist/v1/hooks/use-tambo-v1.js +2 -2
  122. package/dist/v1/hooks/use-tambo-v1.js.map +1 -1
  123. package/dist/v1/hooks/use-tambo-v1.test.js +24 -23
  124. package/dist/v1/hooks/use-tambo-v1.test.js.map +1 -1
  125. package/dist/v1/index.d.ts +6 -6
  126. package/dist/v1/index.d.ts.map +1 -1
  127. package/dist/v1/index.js +2 -2
  128. package/dist/v1/index.js.map +1 -1
  129. package/dist/v1/providers/tambo-v1-provider.d.ts +2 -1
  130. package/dist/v1/providers/tambo-v1-provider.d.ts.map +1 -1
  131. package/dist/v1/providers/tambo-v1-provider.js +2 -0
  132. package/dist/v1/providers/tambo-v1-provider.js.map +1 -1
  133. package/dist/v1/providers/tambo-v1-stream-context.d.ts +2 -2
  134. package/dist/v1/providers/tambo-v1-stream-context.d.ts.map +1 -1
  135. package/dist/v1/providers/tambo-v1-stream-context.js +9 -9
  136. package/dist/v1/providers/tambo-v1-stream-context.js.map +1 -1
  137. package/dist/v1/providers/tambo-v1-stream-context.test.js +35 -0
  138. package/dist/v1/providers/tambo-v1-stream-context.test.js.map +1 -1
  139. package/dist/v1/providers/tambo-v1-stub-provider.d.ts +1 -1
  140. package/dist/v1/providers/tambo-v1-stub-provider.d.ts.map +1 -1
  141. package/dist/v1/providers/tambo-v1-stub-provider.js +2 -1
  142. package/dist/v1/providers/tambo-v1-stub-provider.js.map +1 -1
  143. package/dist/v1/providers/tambo-v1-stub-provider.test.js.map +1 -1
  144. package/dist/v1/providers/tambo-v1-thread-input-provider.d.ts +1 -1
  145. package/dist/v1/providers/tambo-v1-thread-input-provider.d.ts.map +1 -1
  146. package/dist/v1/providers/tambo-v1-thread-input-provider.js +2 -2
  147. package/dist/v1/providers/tambo-v1-thread-input-provider.js.map +1 -1
  148. package/dist/v1/types/event.test.js +13 -13
  149. package/dist/v1/types/event.test.js.map +1 -1
  150. package/dist/v1/types/message.d.ts +12 -109
  151. package/dist/v1/types/message.d.ts.map +1 -1
  152. package/dist/v1/types/message.js +0 -7
  153. package/dist/v1/types/message.js.map +1 -1
  154. package/dist/v1/utils/event-accumulator.test.js +183 -184
  155. package/dist/v1/utils/event-accumulator.test.js.map +1 -1
  156. package/dist/v1/utils/json-patch.test.js +4 -4
  157. package/dist/v1/utils/json-patch.test.js.map +1 -1
  158. package/dist/v1/utils/keyed-throttle.test.js +12 -12
  159. package/dist/v1/utils/keyed-throttle.test.js.map +1 -1
  160. package/dist/v1/utils/registry-conversion.test.js +13 -13
  161. package/dist/v1/utils/registry-conversion.test.js.map +1 -1
  162. package/dist/v1/utils/stream-handler.test.js +5 -5
  163. package/dist/v1/utils/stream-handler.test.js.map +1 -1
  164. package/dist/v1/utils/tool-call-tracker.test.js +15 -9
  165. package/dist/v1/utils/tool-call-tracker.test.js.map +1 -1
  166. package/dist/v1/utils/tool-executor.test.js +25 -26
  167. package/dist/v1/utils/tool-executor.test.js.map +1 -1
  168. package/dist/v1/utils/unstrictify.test.js +16 -16
  169. package/dist/v1/utils/unstrictify.test.js.map +1 -1
  170. package/esm/context-helpers/current-interactables-context-helper.d.ts +16 -2
  171. package/esm/context-helpers/current-interactables-context-helper.d.ts.map +1 -1
  172. package/esm/context-helpers/current-interactables-context-helper.js.map +1 -1
  173. package/esm/context-helpers/current-interactables-context-helper.test.d.ts +2 -0
  174. package/esm/context-helpers/current-interactables-context-helper.test.d.ts.map +1 -0
  175. package/esm/context-helpers/current-interactables-context-helper.test.js +68 -0
  176. package/esm/context-helpers/current-interactables-context-helper.test.js.map +1 -0
  177. package/esm/hoc/with-tambo-interactable.d.ts.map +1 -1
  178. package/esm/hoc/with-tambo-interactable.js +11 -2
  179. package/esm/hoc/with-tambo-interactable.js.map +1 -1
  180. package/esm/hoc/with-tambo-interactable.test.js +14 -0
  181. package/esm/hoc/with-tambo-interactable.test.js.map +1 -1
  182. package/esm/mcp/elicitation.d.ts +3 -37
  183. package/esm/mcp/elicitation.d.ts.map +1 -1
  184. package/esm/mcp/elicitation.js +4 -24
  185. package/esm/mcp/elicitation.js.map +1 -1
  186. package/esm/mcp/index.d.ts +4 -4
  187. package/esm/mcp/index.d.ts.map +1 -1
  188. package/esm/mcp/index.js +1 -1
  189. package/esm/mcp/index.js.map +1 -1
  190. package/esm/mcp/mcp-client.test.js +1 -1
  191. package/esm/mcp/mcp-client.test.js.map +1 -1
  192. package/esm/mcp/mcp-hooks.d.ts.map +1 -1
  193. package/esm/mcp/mcp-hooks.js +4 -1
  194. package/esm/mcp/mcp-hooks.js.map +1 -1
  195. package/esm/mcp/mcp-hooks.test.js +3 -2
  196. package/esm/mcp/mcp-hooks.test.js.map +1 -1
  197. package/esm/mcp/tambo-mcp-provider.d.ts +6 -9
  198. package/esm/mcp/tambo-mcp-provider.d.ts.map +1 -1
  199. package/esm/mcp/tambo-mcp-provider.js +4 -8
  200. package/esm/mcp/tambo-mcp-provider.js.map +1 -1
  201. package/esm/mcp/tambo-mcp-provider.test.js +3 -2
  202. package/esm/mcp/tambo-mcp-provider.test.js.map +1 -1
  203. package/esm/mcp/use-mcp-servers.test.js +2 -1
  204. package/esm/mcp/use-mcp-servers.test.js.map +1 -1
  205. package/esm/model/component-metadata.d.ts +7 -372
  206. package/esm/model/component-metadata.d.ts.map +1 -1
  207. package/esm/model/component-metadata.js.map +1 -1
  208. package/esm/model/validate-input.test.d.ts +2 -0
  209. package/esm/model/validate-input.test.d.ts.map +1 -0
  210. package/esm/model/validate-input.test.js +36 -0
  211. package/esm/model/validate-input.test.js.map +1 -0
  212. package/esm/providers/tambo-interactable-provider-partial-updates.test.js +2 -0
  213. package/esm/providers/tambo-interactable-provider-partial-updates.test.js.map +1 -1
  214. package/esm/providers/tambo-interactable-provider.d.ts +7 -7
  215. package/esm/providers/tambo-interactable-provider.d.ts.map +1 -1
  216. package/esm/providers/tambo-interactable-provider.js +26 -4
  217. package/esm/providers/tambo-interactable-provider.js.map +1 -1
  218. package/esm/providers/tambo-interactable-provider.test.js +78 -0
  219. package/esm/providers/tambo-interactable-provider.test.js.map +1 -1
  220. package/esm/providers/tambo-registry-provider.d.ts +2 -1
  221. package/esm/providers/tambo-registry-provider.d.ts.map +1 -1
  222. package/esm/providers/tambo-registry-provider.js +19 -0
  223. package/esm/providers/tambo-registry-provider.js.map +1 -1
  224. package/esm/providers/tambo-registry-provider.test.js +36 -0
  225. package/esm/providers/tambo-registry-provider.test.js.map +1 -1
  226. package/esm/providers/tambo-registry-schema-compat.test.js +4 -4
  227. package/esm/providers/tambo-registry-schema-compat.test.js.map +1 -1
  228. package/esm/schema/index.d.ts +2 -4
  229. package/esm/schema/index.d.ts.map +1 -1
  230. package/esm/schema/index.js +2 -4
  231. package/esm/schema/index.js.map +1 -1
  232. package/esm/schema/json-schema.d.ts +1 -17
  233. package/esm/schema/json-schema.d.ts.map +1 -1
  234. package/esm/schema/json-schema.js +2 -67
  235. package/esm/schema/json-schema.js.map +1 -1
  236. package/esm/schema/schema.test.js +1 -2
  237. package/esm/schema/schema.test.js.map +1 -1
  238. package/esm/schema/standard-schema.test.js +1 -1
  239. package/esm/schema/standard-schema.test.js.map +1 -1
  240. package/esm/schema/validate.test.js +1 -1
  241. package/esm/schema/validate.test.js.map +1 -1
  242. package/esm/testing/tools.d.ts +4 -4
  243. package/esm/testing/tools.test.d.ts +2 -0
  244. package/esm/testing/tools.test.d.ts.map +1 -0
  245. package/esm/testing/tools.test.js +58 -0
  246. package/esm/testing/tools.test.js.map +1 -0
  247. package/esm/util/mcp-server-utils.d.ts +1 -1
  248. package/esm/util/mcp-server-utils.d.ts.map +1 -1
  249. package/esm/util/mcp-server-utils.js +1 -1
  250. package/esm/util/mcp-server-utils.js.map +1 -1
  251. package/esm/util/mcp-server-utils.test.js +1 -1
  252. package/esm/util/mcp-server-utils.test.js.map +1 -1
  253. package/esm/util/registry.js +1 -1
  254. package/esm/util/registry.js.map +1 -1
  255. package/esm/util/resource-content-resolver.js +1 -1
  256. package/esm/util/resource-content-resolver.js.map +1 -1
  257. package/esm/util/resource-content-resolver.test.js +2 -2
  258. package/esm/util/resource-content-resolver.test.js.map +1 -1
  259. package/esm/util/tool-caller.test.d.ts +2 -0
  260. package/esm/util/tool-caller.test.d.ts.map +1 -0
  261. package/esm/util/tool-caller.test.js +69 -0
  262. package/esm/util/tool-caller.test.js.map +1 -0
  263. package/esm/v1/__tests__/v1-interactables.test.js +6 -0
  264. package/esm/v1/__tests__/v1-interactables.test.js.map +1 -1
  265. package/esm/v1/components/v1-component-renderer.test.js +1 -0
  266. package/esm/v1/components/v1-component-renderer.test.js.map +1 -1
  267. package/esm/v1/hooks/use-tambo-v1-auth-state.d.ts +1 -1
  268. package/esm/v1/hooks/use-tambo-v1-auth-state.d.ts.map +1 -1
  269. package/esm/v1/hooks/use-tambo-v1-auth-state.js.map +1 -1
  270. package/esm/v1/hooks/use-tambo-v1-component-state.js +1 -1
  271. package/esm/v1/hooks/use-tambo-v1-component-state.js.map +1 -1
  272. package/esm/v1/hooks/use-tambo-v1-component-state.test.js +1 -1
  273. package/esm/v1/hooks/use-tambo-v1-component-state.test.js.map +1 -1
  274. package/esm/v1/hooks/use-tambo-v1-send-message.d.ts +1 -1
  275. package/esm/v1/hooks/use-tambo-v1-send-message.d.ts.map +1 -1
  276. package/esm/v1/hooks/use-tambo-v1-send-message.js +6 -6
  277. package/esm/v1/hooks/use-tambo-v1-send-message.js.map +1 -1
  278. package/esm/v1/hooks/use-tambo-v1-send-message.test.js +1 -1
  279. package/esm/v1/hooks/use-tambo-v1-send-message.test.js.map +1 -1
  280. package/esm/v1/hooks/use-tambo-v1-stream-status.js +1 -1
  281. package/esm/v1/hooks/use-tambo-v1-stream-status.js.map +1 -1
  282. package/esm/v1/hooks/use-tambo-v1-stream-status.test.js +9 -5
  283. package/esm/v1/hooks/use-tambo-v1-stream-status.test.js.map +1 -1
  284. package/esm/v1/hooks/use-tambo-v1-suggestions.js +1 -1
  285. package/esm/v1/hooks/use-tambo-v1-suggestions.js.map +1 -1
  286. package/esm/v1/hooks/use-tambo-v1-thread-input.test.js +1 -0
  287. package/esm/v1/hooks/use-tambo-v1-thread-input.test.js.map +1 -1
  288. package/esm/v1/hooks/use-tambo-v1.d.ts +7 -6
  289. package/esm/v1/hooks/use-tambo-v1.d.ts.map +1 -1
  290. package/esm/v1/hooks/use-tambo-v1.js +1 -1
  291. package/esm/v1/hooks/use-tambo-v1.js.map +1 -1
  292. package/esm/v1/hooks/use-tambo-v1.test.js +23 -22
  293. package/esm/v1/hooks/use-tambo-v1.test.js.map +1 -1
  294. package/esm/v1/index.d.ts +6 -6
  295. package/esm/v1/index.d.ts.map +1 -1
  296. package/esm/v1/index.js +1 -1
  297. package/esm/v1/index.js.map +1 -1
  298. package/esm/v1/providers/tambo-v1-provider.d.ts +2 -1
  299. package/esm/v1/providers/tambo-v1-provider.d.ts.map +1 -1
  300. package/esm/v1/providers/tambo-v1-provider.js +2 -0
  301. package/esm/v1/providers/tambo-v1-provider.js.map +1 -1
  302. package/esm/v1/providers/tambo-v1-stream-context.d.ts +2 -2
  303. package/esm/v1/providers/tambo-v1-stream-context.d.ts.map +1 -1
  304. package/esm/v1/providers/tambo-v1-stream-context.js +1 -1
  305. package/esm/v1/providers/tambo-v1-stream-context.js.map +1 -1
  306. package/esm/v1/providers/tambo-v1-stream-context.test.js +35 -0
  307. package/esm/v1/providers/tambo-v1-stream-context.test.js.map +1 -1
  308. package/esm/v1/providers/tambo-v1-stub-provider.d.ts +1 -1
  309. package/esm/v1/providers/tambo-v1-stub-provider.d.ts.map +1 -1
  310. package/esm/v1/providers/tambo-v1-stub-provider.js +2 -1
  311. package/esm/v1/providers/tambo-v1-stub-provider.js.map +1 -1
  312. package/esm/v1/providers/tambo-v1-stub-provider.test.js.map +1 -1
  313. package/esm/v1/providers/tambo-v1-thread-input-provider.d.ts +1 -1
  314. package/esm/v1/providers/tambo-v1-thread-input-provider.d.ts.map +1 -1
  315. package/esm/v1/providers/tambo-v1-thread-input-provider.js +1 -1
  316. package/esm/v1/providers/tambo-v1-thread-input-provider.js.map +1 -1
  317. package/esm/v1/types/event.test.js +1 -1
  318. package/esm/v1/types/event.test.js.map +1 -1
  319. package/esm/v1/types/message.d.ts +12 -109
  320. package/esm/v1/types/message.d.ts.map +1 -1
  321. package/esm/v1/types/message.js +0 -7
  322. package/esm/v1/types/message.js.map +1 -1
  323. package/esm/v1/utils/event-accumulator.test.js +2 -3
  324. package/esm/v1/utils/event-accumulator.test.js.map +1 -1
  325. package/esm/v1/utils/json-patch.test.js +1 -1
  326. package/esm/v1/utils/json-patch.test.js.map +1 -1
  327. package/esm/v1/utils/keyed-throttle.test.js +1 -1
  328. package/esm/v1/utils/keyed-throttle.test.js.map +1 -1
  329. package/esm/v1/utils/registry-conversion.test.js +1 -1
  330. package/esm/v1/utils/registry-conversion.test.js.map +1 -1
  331. package/esm/v1/utils/stream-handler.test.js +1 -1
  332. package/esm/v1/utils/stream-handler.test.js.map +1 -1
  333. package/esm/v1/utils/tool-call-tracker.test.js +9 -3
  334. package/esm/v1/utils/tool-call-tracker.test.js.map +1 -1
  335. package/esm/v1/utils/tool-executor.test.js +1 -2
  336. package/esm/v1/utils/tool-executor.test.js.map +1 -1
  337. package/esm/v1/utils/unstrictify.test.js +1 -1
  338. package/esm/v1/utils/unstrictify.test.js.map +1 -1
  339. package/package.json +10 -11
  340. package/dist/mcp/mcp-client.d.ts +0 -185
  341. package/dist/mcp/mcp-client.d.ts.map +0 -1
  342. package/dist/mcp/mcp-client.js +0 -219
  343. package/dist/mcp/mcp-client.js.map +0 -1
  344. package/dist/mcp/mcp-constants.d.ts +0 -19
  345. package/dist/mcp/mcp-constants.d.ts.map +0 -1
  346. package/dist/mcp/mcp-constants.js +0 -21
  347. package/dist/mcp/mcp-constants.js.map +0 -1
  348. package/dist/model/mcp-server-info.d.ts +0 -76
  349. package/dist/model/mcp-server-info.d.ts.map +0 -1
  350. package/dist/model/mcp-server-info.js +0 -29
  351. package/dist/model/mcp-server-info.js.map +0 -1
  352. package/dist/schema/schema.d.ts +0 -49
  353. package/dist/schema/schema.d.ts.map +0 -1
  354. package/dist/schema/schema.js +0 -129
  355. package/dist/schema/schema.js.map +0 -1
  356. package/dist/schema/standard-schema.d.ts +0 -22
  357. package/dist/schema/standard-schema.d.ts.map +0 -1
  358. package/dist/schema/standard-schema.js +0 -42
  359. package/dist/schema/standard-schema.js.map +0 -1
  360. package/dist/schema/validate.d.ts +0 -14
  361. package/dist/schema/validate.d.ts.map +0 -1
  362. package/dist/schema/validate.js +0 -148
  363. package/dist/schema/validate.js.map +0 -1
  364. package/dist/v1/types/auth.d.ts +0 -24
  365. package/dist/v1/types/auth.d.ts.map +0 -1
  366. package/dist/v1/types/auth.js +0 -3
  367. package/dist/v1/types/auth.js.map +0 -1
  368. package/dist/v1/types/event.d.ts +0 -89
  369. package/dist/v1/types/event.d.ts.map +0 -1
  370. package/dist/v1/types/event.js +0 -57
  371. package/dist/v1/types/event.js.map +0 -1
  372. package/dist/v1/types/thread.d.ts +0 -58
  373. package/dist/v1/types/thread.d.ts.map +0 -1
  374. package/dist/v1/types/thread.js +0 -9
  375. package/dist/v1/types/thread.js.map +0 -1
  376. package/dist/v1/types/tool-choice.d.ts +0 -8
  377. package/dist/v1/types/tool-choice.d.ts.map +0 -1
  378. package/dist/v1/types/tool-choice.js +0 -3
  379. package/dist/v1/types/tool-choice.js.map +0 -1
  380. package/dist/v1/utils/event-accumulator.d.ts +0 -165
  381. package/dist/v1/utils/event-accumulator.d.ts.map +0 -1
  382. package/dist/v1/utils/event-accumulator.js +0 -1277
  383. package/dist/v1/utils/event-accumulator.js.map +0 -1
  384. package/dist/v1/utils/json-patch.d.ts +0 -18
  385. package/dist/v1/utils/json-patch.d.ts.map +0 -1
  386. package/dist/v1/utils/json-patch.js +0 -35
  387. package/dist/v1/utils/json-patch.js.map +0 -1
  388. package/dist/v1/utils/keyed-throttle.d.ts +0 -42
  389. package/dist/v1/utils/keyed-throttle.d.ts.map +0 -1
  390. package/dist/v1/utils/keyed-throttle.js +0 -86
  391. package/dist/v1/utils/keyed-throttle.js.map +0 -1
  392. package/dist/v1/utils/registry-conversion.d.ts +0 -53
  393. package/dist/v1/utils/registry-conversion.d.ts.map +0 -1
  394. package/dist/v1/utils/registry-conversion.js +0 -115
  395. package/dist/v1/utils/registry-conversion.js.map +0 -1
  396. package/dist/v1/utils/stream-handler.d.ts +0 -45
  397. package/dist/v1/utils/stream-handler.d.ts.map +0 -1
  398. package/dist/v1/utils/stream-handler.js +0 -47
  399. package/dist/v1/utils/stream-handler.js.map +0 -1
  400. package/dist/v1/utils/thread-utils.d.ts +0 -16
  401. package/dist/v1/utils/thread-utils.d.ts.map +0 -1
  402. package/dist/v1/utils/thread-utils.js +0 -34
  403. package/dist/v1/utils/thread-utils.js.map +0 -1
  404. package/dist/v1/utils/tool-call-tracker.d.ts +0 -73
  405. package/dist/v1/utils/tool-call-tracker.d.ts.map +0 -1
  406. package/dist/v1/utils/tool-call-tracker.js +0 -180
  407. package/dist/v1/utils/tool-call-tracker.js.map +0 -1
  408. package/dist/v1/utils/tool-executor.d.ts +0 -67
  409. package/dist/v1/utils/tool-executor.d.ts.map +0 -1
  410. package/dist/v1/utils/tool-executor.js +0 -160
  411. package/dist/v1/utils/tool-executor.js.map +0 -1
  412. package/dist/v1/utils/unstrictify.d.ts +0 -32
  413. package/dist/v1/utils/unstrictify.d.ts.map +0 -1
  414. package/dist/v1/utils/unstrictify.js +0 -159
  415. package/dist/v1/utils/unstrictify.js.map +0 -1
  416. package/esm/mcp/mcp-client.d.ts +0 -185
  417. package/esm/mcp/mcp-client.d.ts.map +0 -1
  418. package/esm/mcp/mcp-client.js +0 -216
  419. package/esm/mcp/mcp-client.js.map +0 -1
  420. package/esm/mcp/mcp-constants.d.ts +0 -19
  421. package/esm/mcp/mcp-constants.d.ts.map +0 -1
  422. package/esm/mcp/mcp-constants.js +0 -18
  423. package/esm/mcp/mcp-constants.js.map +0 -1
  424. package/esm/model/mcp-server-info.d.ts +0 -76
  425. package/esm/model/mcp-server-info.d.ts.map +0 -1
  426. package/esm/model/mcp-server-info.js +0 -25
  427. package/esm/model/mcp-server-info.js.map +0 -1
  428. package/esm/schema/schema.d.ts +0 -49
  429. package/esm/schema/schema.d.ts.map +0 -1
  430. package/esm/schema/schema.js +0 -124
  431. package/esm/schema/schema.js.map +0 -1
  432. package/esm/schema/standard-schema.d.ts +0 -22
  433. package/esm/schema/standard-schema.d.ts.map +0 -1
  434. package/esm/schema/standard-schema.js +0 -39
  435. package/esm/schema/standard-schema.js.map +0 -1
  436. package/esm/schema/validate.d.ts +0 -14
  437. package/esm/schema/validate.d.ts.map +0 -1
  438. package/esm/schema/validate.js +0 -145
  439. package/esm/schema/validate.js.map +0 -1
  440. package/esm/v1/types/auth.d.ts +0 -24
  441. package/esm/v1/types/auth.d.ts.map +0 -1
  442. package/esm/v1/types/auth.js +0 -2
  443. package/esm/v1/types/auth.js.map +0 -1
  444. package/esm/v1/types/event.d.ts +0 -89
  445. package/esm/v1/types/event.d.ts.map +0 -1
  446. package/esm/v1/types/event.js +0 -53
  447. package/esm/v1/types/event.js.map +0 -1
  448. package/esm/v1/types/thread.d.ts +0 -58
  449. package/esm/v1/types/thread.d.ts.map +0 -1
  450. package/esm/v1/types/thread.js +0 -8
  451. package/esm/v1/types/thread.js.map +0 -1
  452. package/esm/v1/types/tool-choice.d.ts +0 -8
  453. package/esm/v1/types/tool-choice.d.ts.map +0 -1
  454. package/esm/v1/types/tool-choice.js +0 -2
  455. package/esm/v1/types/tool-choice.js.map +0 -1
  456. package/esm/v1/utils/event-accumulator.d.ts +0 -165
  457. package/esm/v1/utils/event-accumulator.d.ts.map +0 -1
  458. package/esm/v1/utils/event-accumulator.js +0 -1268
  459. package/esm/v1/utils/event-accumulator.js.map +0 -1
  460. package/esm/v1/utils/json-patch.d.ts +0 -18
  461. package/esm/v1/utils/json-patch.d.ts.map +0 -1
  462. package/esm/v1/utils/json-patch.js +0 -32
  463. package/esm/v1/utils/json-patch.js.map +0 -1
  464. package/esm/v1/utils/keyed-throttle.d.ts +0 -42
  465. package/esm/v1/utils/keyed-throttle.d.ts.map +0 -1
  466. package/esm/v1/utils/keyed-throttle.js +0 -83
  467. package/esm/v1/utils/keyed-throttle.js.map +0 -1
  468. package/esm/v1/utils/registry-conversion.d.ts +0 -53
  469. package/esm/v1/utils/registry-conversion.d.ts.map +0 -1
  470. package/esm/v1/utils/registry-conversion.js +0 -109
  471. package/esm/v1/utils/registry-conversion.js.map +0 -1
  472. package/esm/v1/utils/stream-handler.d.ts +0 -45
  473. package/esm/v1/utils/stream-handler.d.ts.map +0 -1
  474. package/esm/v1/utils/stream-handler.js +0 -44
  475. package/esm/v1/utils/stream-handler.js.map +0 -1
  476. package/esm/v1/utils/thread-utils.d.ts +0 -16
  477. package/esm/v1/utils/thread-utils.d.ts.map +0 -1
  478. package/esm/v1/utils/thread-utils.js +0 -31
  479. package/esm/v1/utils/thread-utils.js.map +0 -1
  480. package/esm/v1/utils/tool-call-tracker.d.ts +0 -73
  481. package/esm/v1/utils/tool-call-tracker.d.ts.map +0 -1
  482. package/esm/v1/utils/tool-call-tracker.js +0 -176
  483. package/esm/v1/utils/tool-call-tracker.js.map +0 -1
  484. package/esm/v1/utils/tool-executor.d.ts +0 -67
  485. package/esm/v1/utils/tool-executor.d.ts.map +0 -1
  486. package/esm/v1/utils/tool-executor.js +0 -154
  487. package/esm/v1/utils/tool-executor.js.map +0 -1
  488. package/esm/v1/utils/unstrictify.d.ts +0 -32
  489. package/esm/v1/utils/unstrictify.d.ts.map +0 -1
  490. package/esm/v1/utils/unstrictify.js +0 -155
  491. package/esm/v1/utils/unstrictify.js.map +0 -1
@@ -1,20 +1,20 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- const json_patch_1 = require("./json-patch");
3
+ const client_1 = require("@tambo-ai/client");
4
4
  describe("applyJsonPatch error handling", () => {
5
5
  it("includes operation summary in error message", () => {
6
6
  const target = { existing: "value" };
7
7
  const operations = [
8
8
  { op: "replace", path: "/nonexistent", value: "fail" },
9
9
  ];
10
- expect(() => (0, json_patch_1.applyJsonPatch)(target, operations)).toThrow(/Failed to apply JSON patch operations \[replace \/nonexistent\]/);
10
+ expect(() => (0, client_1.applyJsonPatch)(target, operations)).toThrow(/Failed to apply JSON patch operations \[replace \/nonexistent\]/);
11
11
  });
12
12
  it("includes target keys in error message", () => {
13
13
  const target = { foo: 1, bar: 2 };
14
14
  const operations = [
15
15
  { op: "replace", path: "/missing", value: "x" },
16
16
  ];
17
- expect(() => (0, json_patch_1.applyJsonPatch)(target, operations)).toThrow(/Target had keys: \[foo, bar\]/);
17
+ expect(() => (0, client_1.applyJsonPatch)(target, operations)).toThrow(/Target had keys: \[foo, bar\]/);
18
18
  });
19
19
  it("shows all operations in error summary", () => {
20
20
  const target = {};
@@ -22,7 +22,7 @@ describe("applyJsonPatch error handling", () => {
22
22
  { op: "add", path: "/a", value: 1 },
23
23
  { op: "replace", path: "/missing", value: 2 },
24
24
  ];
25
- expect(() => (0, json_patch_1.applyJsonPatch)(target, operations)).toThrow(/add \/a, replace \/missing/);
25
+ expect(() => (0, client_1.applyJsonPatch)(target, operations)).toThrow(/add \/a, replace \/missing/);
26
26
  });
27
27
  });
28
28
  //# sourceMappingURL=json-patch.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"json-patch.test.js","sourceRoot":"","sources":["../../../src/v1/utils/json-patch.test.ts"],"names":[],"mappings":";;AACA,6CAA8C;AAE9C,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,MAAM,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;QACrC,MAAM,UAAU,GAAgB;YAC9B,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE;SACvD,CAAC;QAEF,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,2BAAc,EAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CACtD,iEAAiE,CAClE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;QAClC,MAAM,UAAU,GAAgB;YAC9B,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE;SAChD,CAAC;QAEF,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,2BAAc,EAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CACtD,+BAA+B,CAChC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,MAAM,UAAU,GAAgB;YAC9B,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE;YACnC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE;SAC9C,CAAC;QAEF,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,2BAAc,EAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CACtD,4BAA4B,CAC7B,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import type { Operation } from \"fast-json-patch\";\nimport { applyJsonPatch } from \"./json-patch\";\n\ndescribe(\"applyJsonPatch error handling\", () => {\n it(\"includes operation summary in error message\", () => {\n const target = { existing: \"value\" };\n const operations: Operation[] = [\n { op: \"replace\", path: \"/nonexistent\", value: \"fail\" },\n ];\n\n expect(() => applyJsonPatch(target, operations)).toThrow(\n /Failed to apply JSON patch operations \\[replace \\/nonexistent\\]/,\n );\n });\n\n it(\"includes target keys in error message\", () => {\n const target = { foo: 1, bar: 2 };\n const operations: Operation[] = [\n { op: \"replace\", path: \"/missing\", value: \"x\" },\n ];\n\n expect(() => applyJsonPatch(target, operations)).toThrow(\n /Target had keys: \\[foo, bar\\]/,\n );\n });\n\n it(\"shows all operations in error summary\", () => {\n const target = {};\n const operations: Operation[] = [\n { op: \"add\", path: \"/a\", value: 1 },\n { op: \"replace\", path: \"/missing\", value: 2 },\n ];\n\n expect(() => applyJsonPatch(target, operations)).toThrow(\n /add \\/a, replace \\/missing/,\n );\n });\n});\n"]}
1
+ {"version":3,"file":"json-patch.test.js","sourceRoot":"","sources":["../../../src/v1/utils/json-patch.test.ts"],"names":[],"mappings":";;AACA,6CAAkD;AAElD,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,MAAM,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;QACrC,MAAM,UAAU,GAAgB;YAC9B,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE;SACvD,CAAC;QAEF,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,uBAAc,EAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CACtD,iEAAiE,CAClE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;QAClC,MAAM,UAAU,GAAgB;YAC9B,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE;SAChD,CAAC;QAEF,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,uBAAc,EAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CACtD,+BAA+B,CAChC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,MAAM,UAAU,GAAgB;YAC9B,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE;YACnC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE;SAC9C,CAAC;QAEF,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,uBAAc,EAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CACtD,4BAA4B,CAC7B,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import type { Operation } from \"fast-json-patch\";\nimport { applyJsonPatch } from \"@tambo-ai/client\";\n\ndescribe(\"applyJsonPatch error handling\", () => {\n it(\"includes operation summary in error message\", () => {\n const target = { existing: \"value\" };\n const operations: Operation[] = [\n { op: \"replace\", path: \"/nonexistent\", value: \"fail\" },\n ];\n\n expect(() => applyJsonPatch(target, operations)).toThrow(\n /Failed to apply JSON patch operations \\[replace \\/nonexistent\\]/,\n );\n });\n\n it(\"includes target keys in error message\", () => {\n const target = { foo: 1, bar: 2 };\n const operations: Operation[] = [\n { op: \"replace\", path: \"/missing\", value: \"x\" },\n ];\n\n expect(() => applyJsonPatch(target, operations)).toThrow(\n /Target had keys: \\[foo, bar\\]/,\n );\n });\n\n it(\"shows all operations in error summary\", () => {\n const target = {};\n const operations: Operation[] = [\n { op: \"add\", path: \"/a\", value: 1 },\n { op: \"replace\", path: \"/missing\", value: 2 },\n ];\n\n expect(() => applyJsonPatch(target, operations)).toThrow(\n /add \\/a, replace \\/missing/,\n );\n });\n});\n"]}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- const keyed_throttle_1 = require("./keyed-throttle");
3
+ const client_1 = require("@tambo-ai/client");
4
4
  describe("createKeyedThrottle", () => {
5
5
  beforeEach(() => {
6
6
  jest.useFakeTimers();
@@ -10,14 +10,14 @@ describe("createKeyedThrottle", () => {
10
10
  });
11
11
  it("fires immediately on first call (leading edge)", () => {
12
12
  const fn = jest.fn();
13
- const throttle = (0, keyed_throttle_1.createKeyedThrottle)(fn, 100);
13
+ const throttle = (0, client_1.createKeyedThrottle)(fn, 100);
14
14
  throttle.schedule("a", 1);
15
15
  expect(fn).toHaveBeenCalledTimes(1);
16
16
  expect(fn).toHaveBeenCalledWith("a", 1);
17
17
  });
18
18
  it("does not fire again during cooldown window", () => {
19
19
  const fn = jest.fn();
20
- const throttle = (0, keyed_throttle_1.createKeyedThrottle)(fn, 100);
20
+ const throttle = (0, client_1.createKeyedThrottle)(fn, 100);
21
21
  throttle.schedule("a", 1);
22
22
  throttle.schedule("a", 2);
23
23
  throttle.schedule("a", 3);
@@ -27,7 +27,7 @@ describe("createKeyedThrottle", () => {
27
27
  });
28
28
  it("fires trailing call with latest value after cooldown", () => {
29
29
  const fn = jest.fn();
30
- const throttle = (0, keyed_throttle_1.createKeyedThrottle)(fn, 100);
30
+ const throttle = (0, client_1.createKeyedThrottle)(fn, 100);
31
31
  throttle.schedule("a", 1); // leading fire
32
32
  throttle.schedule("a", 2);
33
33
  throttle.schedule("a", 3);
@@ -38,7 +38,7 @@ describe("createKeyedThrottle", () => {
38
38
  });
39
39
  it("does not fire trailing call if no new values arrived", () => {
40
40
  const fn = jest.fn();
41
- const throttle = (0, keyed_throttle_1.createKeyedThrottle)(fn, 100);
41
+ const throttle = (0, client_1.createKeyedThrottle)(fn, 100);
42
42
  throttle.schedule("a", 1); // leading fire
43
43
  jest.advanceTimersByTime(100);
44
44
  // No trailing fire — only the leading call
@@ -46,7 +46,7 @@ describe("createKeyedThrottle", () => {
46
46
  });
47
47
  it("fires periodically during continuous rapid calls", () => {
48
48
  const fn = jest.fn();
49
- const throttle = (0, keyed_throttle_1.createKeyedThrottle)(fn, 100);
49
+ const throttle = (0, client_1.createKeyedThrottle)(fn, 100);
50
50
  // Simulate rapid streaming chunks every 30ms for 350ms
51
51
  throttle.schedule("a", 1); // t=0, leading fire
52
52
  jest.advanceTimersByTime(30);
@@ -72,7 +72,7 @@ describe("createKeyedThrottle", () => {
72
72
  });
73
73
  it("tracks keys independently", () => {
74
74
  const fn = jest.fn();
75
- const throttle = (0, keyed_throttle_1.createKeyedThrottle)(fn, 100);
75
+ const throttle = (0, client_1.createKeyedThrottle)(fn, 100);
76
76
  throttle.schedule("a", 1); // leading fire for "a"
77
77
  jest.advanceTimersByTime(50);
78
78
  throttle.schedule("b", 2); // leading fire for "b"
@@ -82,7 +82,7 @@ describe("createKeyedThrottle", () => {
82
82
  });
83
83
  it("tracks keys independently with trailing calls", () => {
84
84
  const fn = jest.fn();
85
- const throttle = (0, keyed_throttle_1.createKeyedThrottle)(fn, 100);
85
+ const throttle = (0, client_1.createKeyedThrottle)(fn, 100);
86
86
  throttle.schedule("a", 1); // leading fire for "a"
87
87
  throttle.schedule("a", 2); // queued trailing for "a"
88
88
  jest.advanceTimersByTime(50);
@@ -100,7 +100,7 @@ describe("createKeyedThrottle", () => {
100
100
  });
101
101
  it("flush() fires all pending trailing calls immediately", () => {
102
102
  const fn = jest.fn();
103
- const throttle = (0, keyed_throttle_1.createKeyedThrottle)(fn, 100);
103
+ const throttle = (0, client_1.createKeyedThrottle)(fn, 100);
104
104
  throttle.schedule("a", 1); // leading fire
105
105
  throttle.schedule("a", 2); // queued trailing
106
106
  throttle.schedule("b", 3); // leading fire
@@ -116,13 +116,13 @@ describe("createKeyedThrottle", () => {
116
116
  });
117
117
  it("flush() is a no-op when nothing is pending", () => {
118
118
  const fn = jest.fn();
119
- const throttle = (0, keyed_throttle_1.createKeyedThrottle)(fn, 100);
119
+ const throttle = (0, client_1.createKeyedThrottle)(fn, 100);
120
120
  throttle.flush();
121
121
  expect(fn).not.toHaveBeenCalled();
122
122
  });
123
123
  it("flush() skips keys with no trailing value", () => {
124
124
  const fn = jest.fn();
125
- const throttle = (0, keyed_throttle_1.createKeyedThrottle)(fn, 100);
125
+ const throttle = (0, client_1.createKeyedThrottle)(fn, 100);
126
126
  throttle.schedule("a", 1); // leading fire, no trailing queued
127
127
  expect(fn).toHaveBeenCalledTimes(1);
128
128
  throttle.flush();
@@ -131,7 +131,7 @@ describe("createKeyedThrottle", () => {
131
131
  });
132
132
  it("becomes idle after trailing fire with no new calls", () => {
133
133
  const fn = jest.fn();
134
- const throttle = (0, keyed_throttle_1.createKeyedThrottle)(fn, 100);
134
+ const throttle = (0, client_1.createKeyedThrottle)(fn, 100);
135
135
  throttle.schedule("a", 1); // leading
136
136
  throttle.schedule("a", 2); // trailing queued
137
137
  jest.advanceTimersByTime(100); // trailing fires
@@ -1 +1 @@
1
- {"version":3,"file":"keyed-throttle.test.js","sourceRoot":"","sources":["../../../src/v1/utils/keyed-throttle.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { createKeyedThrottle } from \"./keyed-throttle\";\n\ndescribe(\"createKeyedThrottle\", () => {\n beforeEach(() => {\n jest.useFakeTimers();\n });\n\n afterEach(() => {\n jest.useRealTimers();\n });\n\n it(\"fires immediately on first call (leading edge)\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n throttle.schedule(\"a\", 1);\n expect(fn).toHaveBeenCalledTimes(1);\n expect(fn).toHaveBeenCalledWith(\"a\", 1);\n });\n\n it(\"does not fire again during cooldown window\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n throttle.schedule(\"a\", 1);\n throttle.schedule(\"a\", 2);\n throttle.schedule(\"a\", 3);\n\n // Only the leading call should have fired\n expect(fn).toHaveBeenCalledTimes(1);\n expect(fn).toHaveBeenCalledWith(\"a\", 1);\n });\n\n it(\"fires trailing call with latest value after cooldown\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n throttle.schedule(\"a\", 1); // leading fire\n throttle.schedule(\"a\", 2);\n throttle.schedule(\"a\", 3);\n\n jest.advanceTimersByTime(100);\n\n // Trailing fire with latest value\n expect(fn).toHaveBeenCalledTimes(2);\n expect(fn).toHaveBeenLastCalledWith(\"a\", 3);\n });\n\n it(\"does not fire trailing call if no new values arrived\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n throttle.schedule(\"a\", 1); // leading fire\n\n jest.advanceTimersByTime(100);\n\n // No trailing fire — only the leading call\n expect(fn).toHaveBeenCalledTimes(1);\n });\n\n it(\"fires periodically during continuous rapid calls\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n // Simulate rapid streaming chunks every 30ms for 350ms\n throttle.schedule(\"a\", 1); // t=0, leading fire\n jest.advanceTimersByTime(30);\n throttle.schedule(\"a\", 2); // t=30\n jest.advanceTimersByTime(30);\n throttle.schedule(\"a\", 3); // t=60\n jest.advanceTimersByTime(30);\n throttle.schedule(\"a\", 4); // t=90\n jest.advanceTimersByTime(10);\n // t=100: cooldown expires, trailing fires with value 4\n expect(fn).toHaveBeenCalledTimes(2);\n expect(fn).toHaveBeenLastCalledWith(\"a\", 4);\n\n jest.advanceTimersByTime(20);\n throttle.schedule(\"a\", 5); // t=120\n jest.advanceTimersByTime(30);\n throttle.schedule(\"a\", 6); // t=150\n jest.advanceTimersByTime(30);\n throttle.schedule(\"a\", 7); // t=180\n jest.advanceTimersByTime(20);\n // t=200: second cooldown expires, trailing fires with value 7\n expect(fn).toHaveBeenCalledTimes(3);\n expect(fn).toHaveBeenLastCalledWith(\"a\", 7);\n });\n\n it(\"tracks keys independently\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n throttle.schedule(\"a\", 1); // leading fire for \"a\"\n jest.advanceTimersByTime(50);\n throttle.schedule(\"b\", 2); // leading fire for \"b\"\n\n expect(fn).toHaveBeenCalledTimes(2);\n expect(fn).toHaveBeenCalledWith(\"a\", 1);\n expect(fn).toHaveBeenCalledWith(\"b\", 2);\n });\n\n it(\"tracks keys independently with trailing calls\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n throttle.schedule(\"a\", 1); // leading fire for \"a\"\n throttle.schedule(\"a\", 2); // queued trailing for \"a\"\n jest.advanceTimersByTime(50);\n throttle.schedule(\"b\", 3); // leading fire for \"b\"\n throttle.schedule(\"b\", 4); // queued trailing for \"b\"\n\n expect(fn).toHaveBeenCalledTimes(2);\n\n jest.advanceTimersByTime(50);\n // t=100: \"a\" trailing fires\n expect(fn).toHaveBeenCalledTimes(3);\n expect(fn).toHaveBeenCalledWith(\"a\", 2);\n\n jest.advanceTimersByTime(50);\n // t=150: \"b\" trailing fires\n expect(fn).toHaveBeenCalledTimes(4);\n expect(fn).toHaveBeenCalledWith(\"b\", 4);\n });\n\n it(\"flush() fires all pending trailing calls immediately\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n throttle.schedule(\"a\", 1); // leading fire\n throttle.schedule(\"a\", 2); // queued trailing\n throttle.schedule(\"b\", 3); // leading fire\n throttle.schedule(\"b\", 4); // queued trailing\n\n expect(fn).toHaveBeenCalledTimes(2); // two leading fires\n\n throttle.flush();\n\n expect(fn).toHaveBeenCalledTimes(4); // two trailing fires\n expect(fn).toHaveBeenCalledWith(\"a\", 2);\n expect(fn).toHaveBeenCalledWith(\"b\", 4);\n\n // Timers should be cancelled — no double-fire\n jest.advanceTimersByTime(200);\n expect(fn).toHaveBeenCalledTimes(4);\n });\n\n it(\"flush() is a no-op when nothing is pending\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n throttle.flush();\n expect(fn).not.toHaveBeenCalled();\n });\n\n it(\"flush() skips keys with no trailing value\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n throttle.schedule(\"a\", 1); // leading fire, no trailing queued\n\n expect(fn).toHaveBeenCalledTimes(1);\n\n throttle.flush();\n\n // No trailing to fire — still just the one leading call\n expect(fn).toHaveBeenCalledTimes(1);\n });\n\n it(\"becomes idle after trailing fire with no new calls\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n throttle.schedule(\"a\", 1); // leading\n throttle.schedule(\"a\", 2); // trailing queued\n\n jest.advanceTimersByTime(100); // trailing fires\n expect(fn).toHaveBeenCalledTimes(2);\n\n jest.advanceTimersByTime(100); // cooldown after trailing — no new calls\n expect(fn).toHaveBeenCalledTimes(2); // no extra fires\n\n // New call should fire immediately (leading again)\n throttle.schedule(\"a\", 3);\n expect(fn).toHaveBeenCalledTimes(3);\n expect(fn).toHaveBeenLastCalledWith(\"a\", 3);\n });\n});\n"]}
1
+ {"version":3,"file":"keyed-throttle.test.js","sourceRoot":"","sources":["../../../src/v1/utils/keyed-throttle.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { createKeyedThrottle } from \"@tambo-ai/client\";\n\ndescribe(\"createKeyedThrottle\", () => {\n beforeEach(() => {\n jest.useFakeTimers();\n });\n\n afterEach(() => {\n jest.useRealTimers();\n });\n\n it(\"fires immediately on first call (leading edge)\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n throttle.schedule(\"a\", 1);\n expect(fn).toHaveBeenCalledTimes(1);\n expect(fn).toHaveBeenCalledWith(\"a\", 1);\n });\n\n it(\"does not fire again during cooldown window\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n throttle.schedule(\"a\", 1);\n throttle.schedule(\"a\", 2);\n throttle.schedule(\"a\", 3);\n\n // Only the leading call should have fired\n expect(fn).toHaveBeenCalledTimes(1);\n expect(fn).toHaveBeenCalledWith(\"a\", 1);\n });\n\n it(\"fires trailing call with latest value after cooldown\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n throttle.schedule(\"a\", 1); // leading fire\n throttle.schedule(\"a\", 2);\n throttle.schedule(\"a\", 3);\n\n jest.advanceTimersByTime(100);\n\n // Trailing fire with latest value\n expect(fn).toHaveBeenCalledTimes(2);\n expect(fn).toHaveBeenLastCalledWith(\"a\", 3);\n });\n\n it(\"does not fire trailing call if no new values arrived\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n throttle.schedule(\"a\", 1); // leading fire\n\n jest.advanceTimersByTime(100);\n\n // No trailing fire — only the leading call\n expect(fn).toHaveBeenCalledTimes(1);\n });\n\n it(\"fires periodically during continuous rapid calls\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n // Simulate rapid streaming chunks every 30ms for 350ms\n throttle.schedule(\"a\", 1); // t=0, leading fire\n jest.advanceTimersByTime(30);\n throttle.schedule(\"a\", 2); // t=30\n jest.advanceTimersByTime(30);\n throttle.schedule(\"a\", 3); // t=60\n jest.advanceTimersByTime(30);\n throttle.schedule(\"a\", 4); // t=90\n jest.advanceTimersByTime(10);\n // t=100: cooldown expires, trailing fires with value 4\n expect(fn).toHaveBeenCalledTimes(2);\n expect(fn).toHaveBeenLastCalledWith(\"a\", 4);\n\n jest.advanceTimersByTime(20);\n throttle.schedule(\"a\", 5); // t=120\n jest.advanceTimersByTime(30);\n throttle.schedule(\"a\", 6); // t=150\n jest.advanceTimersByTime(30);\n throttle.schedule(\"a\", 7); // t=180\n jest.advanceTimersByTime(20);\n // t=200: second cooldown expires, trailing fires with value 7\n expect(fn).toHaveBeenCalledTimes(3);\n expect(fn).toHaveBeenLastCalledWith(\"a\", 7);\n });\n\n it(\"tracks keys independently\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n throttle.schedule(\"a\", 1); // leading fire for \"a\"\n jest.advanceTimersByTime(50);\n throttle.schedule(\"b\", 2); // leading fire for \"b\"\n\n expect(fn).toHaveBeenCalledTimes(2);\n expect(fn).toHaveBeenCalledWith(\"a\", 1);\n expect(fn).toHaveBeenCalledWith(\"b\", 2);\n });\n\n it(\"tracks keys independently with trailing calls\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n throttle.schedule(\"a\", 1); // leading fire for \"a\"\n throttle.schedule(\"a\", 2); // queued trailing for \"a\"\n jest.advanceTimersByTime(50);\n throttle.schedule(\"b\", 3); // leading fire for \"b\"\n throttle.schedule(\"b\", 4); // queued trailing for \"b\"\n\n expect(fn).toHaveBeenCalledTimes(2);\n\n jest.advanceTimersByTime(50);\n // t=100: \"a\" trailing fires\n expect(fn).toHaveBeenCalledTimes(3);\n expect(fn).toHaveBeenCalledWith(\"a\", 2);\n\n jest.advanceTimersByTime(50);\n // t=150: \"b\" trailing fires\n expect(fn).toHaveBeenCalledTimes(4);\n expect(fn).toHaveBeenCalledWith(\"b\", 4);\n });\n\n it(\"flush() fires all pending trailing calls immediately\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n throttle.schedule(\"a\", 1); // leading fire\n throttle.schedule(\"a\", 2); // queued trailing\n throttle.schedule(\"b\", 3); // leading fire\n throttle.schedule(\"b\", 4); // queued trailing\n\n expect(fn).toHaveBeenCalledTimes(2); // two leading fires\n\n throttle.flush();\n\n expect(fn).toHaveBeenCalledTimes(4); // two trailing fires\n expect(fn).toHaveBeenCalledWith(\"a\", 2);\n expect(fn).toHaveBeenCalledWith(\"b\", 4);\n\n // Timers should be cancelled — no double-fire\n jest.advanceTimersByTime(200);\n expect(fn).toHaveBeenCalledTimes(4);\n });\n\n it(\"flush() is a no-op when nothing is pending\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n throttle.flush();\n expect(fn).not.toHaveBeenCalled();\n });\n\n it(\"flush() skips keys with no trailing value\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n throttle.schedule(\"a\", 1); // leading fire, no trailing queued\n\n expect(fn).toHaveBeenCalledTimes(1);\n\n throttle.flush();\n\n // No trailing to fire — still just the one leading call\n expect(fn).toHaveBeenCalledTimes(1);\n });\n\n it(\"becomes idle after trailing fire with no new calls\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n throttle.schedule(\"a\", 1); // leading\n throttle.schedule(\"a\", 2); // trailing queued\n\n jest.advanceTimersByTime(100); // trailing fires\n expect(fn).toHaveBeenCalledTimes(2);\n\n jest.advanceTimersByTime(100); // cooldown after trailing — no new calls\n expect(fn).toHaveBeenCalledTimes(2); // no extra fires\n\n // New call should fire immediately (leading again)\n throttle.schedule(\"a\", 3);\n expect(fn).toHaveBeenCalledTimes(3);\n expect(fn).toHaveBeenLastCalledWith(\"a\", 3);\n });\n});\n"]}
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const zod_1 = require("zod");
4
- const registry_conversion_1 = require("./registry-conversion");
4
+ const client_1 = require("@tambo-ai/client");
5
5
  describe("registry-conversion", () => {
6
6
  describe("toAvailableComponent", () => {
7
7
  it("converts a component with props (JSON Schema)", () => {
@@ -20,7 +20,7 @@ describe("registry-conversion", () => {
20
20
  },
21
21
  contextTools: [],
22
22
  };
23
- const result = (0, registry_conversion_1.toAvailableComponent)(component);
23
+ const result = (0, client_1.toAvailableComponent)(component);
24
24
  expect(result.name).toBe("WeatherCard");
25
25
  expect(result.description).toBe("Displays weather information");
26
26
  expect(result.propsSchema).toBeDefined();
@@ -33,7 +33,7 @@ describe("registry-conversion", () => {
33
33
  component: () => null,
34
34
  contextTools: [],
35
35
  };
36
- expect(() => (0, registry_conversion_1.toAvailableComponent)(component)).toThrow('Component "BadComponent" missing props');
36
+ expect(() => (0, client_1.toAvailableComponent)(component)).toThrow('Component "BadComponent" missing props');
37
37
  });
38
38
  });
39
39
  describe("toAvailableComponents", () => {
@@ -62,7 +62,7 @@ describe("registry-conversion", () => {
62
62
  contextTools: [],
63
63
  },
64
64
  };
65
- const result = (0, registry_conversion_1.toAvailableComponents)(components);
65
+ const result = (0, client_1.toAvailableComponents)(components);
66
66
  expect(result).toHaveLength(2);
67
67
  expect(result.map((c) => c.name)).toContain("Card");
68
68
  expect(result.map((c) => c.name)).toContain("Button");
@@ -84,7 +84,7 @@ describe("registry-conversion", () => {
84
84
  },
85
85
  ],
86
86
  ]);
87
- const result = (0, registry_conversion_1.toAvailableComponents)(components);
87
+ const result = (0, client_1.toAvailableComponents)(components);
88
88
  expect(result).toHaveLength(1);
89
89
  expect(result[0].name).toBe("Card");
90
90
  });
@@ -109,7 +109,7 @@ describe("registry-conversion", () => {
109
109
  contextTools: [],
110
110
  },
111
111
  };
112
- const result = (0, registry_conversion_1.toAvailableComponents)(components);
112
+ const result = (0, client_1.toAvailableComponents)(components);
113
113
  expect(result).toHaveLength(1);
114
114
  expect(result[0].name).toBe("Valid");
115
115
  expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining('Skipping component "Invalid"'));
@@ -125,7 +125,7 @@ describe("registry-conversion", () => {
125
125
  inputSchema: zod_1.z.object({ city: zod_1.z.string() }),
126
126
  outputSchema: zod_1.z.any(),
127
127
  };
128
- const result = (0, registry_conversion_1.toAvailableTool)(tool);
128
+ const result = (0, client_1.toAvailableTool)(tool);
129
129
  expect(result.name).toBe("get_weather");
130
130
  expect(result.description).toBe("Gets weather for a city");
131
131
  expect(result.inputSchema).toBeDefined();
@@ -140,7 +140,7 @@ describe("registry-conversion", () => {
140
140
  outputSchema: zod_1.z.any(),
141
141
  maxCalls: 3,
142
142
  };
143
- const result = (0, registry_conversion_1.toAvailableTool)(tool);
143
+ const result = (0, client_1.toAvailableTool)(tool);
144
144
  expect(result.maxCalls).toBe(3);
145
145
  });
146
146
  it("omits maxCalls when not set", () => {
@@ -151,7 +151,7 @@ describe("registry-conversion", () => {
151
151
  inputSchema: zod_1.z.object({ x: zod_1.z.string() }),
152
152
  outputSchema: zod_1.z.any(),
153
153
  };
154
- const result = (0, registry_conversion_1.toAvailableTool)(tool);
154
+ const result = (0, client_1.toAvailableTool)(tool);
155
155
  expect(result).not.toHaveProperty("maxCalls");
156
156
  });
157
157
  it("throws when schema is missing", () => {
@@ -160,7 +160,7 @@ describe("registry-conversion", () => {
160
160
  description: "Missing schema",
161
161
  tool: async () => ({}),
162
162
  };
163
- expect(() => (0, registry_conversion_1.toAvailableTool)(tool)).toThrow('Tool "bad_tool" missing inputSchema or toolSchema');
163
+ expect(() => (0, client_1.toAvailableTool)(tool)).toThrow('Tool "bad_tool" missing inputSchema or toolSchema');
164
164
  });
165
165
  });
166
166
  describe("toAvailableTools", () => {
@@ -181,7 +181,7 @@ describe("registry-conversion", () => {
181
181
  outputSchema: zod_1.z.any(),
182
182
  },
183
183
  };
184
- const result = (0, registry_conversion_1.toAvailableTools)(tools);
184
+ const result = (0, client_1.toAvailableTools)(tools);
185
185
  expect(result).toHaveLength(2);
186
186
  expect(result.map((t) => t.name)).toContain("search");
187
187
  expect(result.map((t) => t.name)).toContain("calculate");
@@ -199,7 +199,7 @@ describe("registry-conversion", () => {
199
199
  },
200
200
  ],
201
201
  ]);
202
- const result = (0, registry_conversion_1.toAvailableTools)(tools);
202
+ const result = (0, client_1.toAvailableTools)(tools);
203
203
  expect(result).toHaveLength(1);
204
204
  expect(result[0].name).toBe("fetch");
205
205
  });
@@ -219,7 +219,7 @@ describe("registry-conversion", () => {
219
219
  tool: async () => null,
220
220
  },
221
221
  };
222
- const result = (0, registry_conversion_1.toAvailableTools)(tools);
222
+ const result = (0, client_1.toAvailableTools)(tools);
223
223
  expect(result).toHaveLength(1);
224
224
  expect(result[0].name).toBe("valid");
225
225
  expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining('Skipping tool "invalid"'));
@@ -1 +1 @@
1
- {"version":3,"file":"registry-conversion.test.js","sourceRoot":"","sources":["../../../src/v1/utils/registry-conversion.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from \"zod\";\nimport type {\n RegisteredComponent,\n TamboTool,\n} from \"../../model/component-metadata\";\nimport {\n toAvailableComponent,\n toAvailableComponents,\n toAvailableTool,\n toAvailableTools,\n} from \"./registry-conversion\";\n\ndescribe(\"registry-conversion\", () => {\n describe(\"toAvailableComponent\", () => {\n it(\"converts a component with props (JSON Schema)\", () => {\n // RegisteredComponent has props already converted to JSON Schema\n const component: RegisteredComponent = {\n name: \"WeatherCard\",\n description: \"Displays weather information\",\n component: () => null,\n props: {\n type: \"object\",\n properties: {\n city: { type: \"string\" },\n temperature: { type: \"number\" },\n },\n required: [\"city\", \"temperature\"],\n },\n contextTools: [],\n };\n\n const result = toAvailableComponent(component);\n\n expect(result.name).toBe(\"WeatherCard\");\n expect(result.description).toBe(\"Displays weather information\");\n expect(result.propsSchema).toBeDefined();\n expect((result.propsSchema as Record<string, unknown>).type).toBe(\n \"object\",\n );\n });\n\n it(\"throws when props is missing\", () => {\n const component = {\n name: \"BadComponent\",\n description: \"Missing schema\",\n component: () => null,\n contextTools: [],\n } as unknown as RegisteredComponent;\n\n expect(() => toAvailableComponent(component)).toThrow(\n 'Component \"BadComponent\" missing props',\n );\n });\n });\n\n describe(\"toAvailableComponents\", () => {\n it(\"converts a Record of components\", () => {\n const components: Record<string, RegisteredComponent> = {\n Card: {\n name: \"Card\",\n description: \"A card component\",\n component: () => null,\n props: {\n type: \"object\",\n properties: { title: { type: \"string\" } },\n required: [\"title\"],\n },\n contextTools: [],\n },\n Button: {\n name: \"Button\",\n description: \"A button component\",\n component: () => null,\n props: {\n type: \"object\",\n properties: { label: { type: \"string\" } },\n required: [\"label\"],\n },\n contextTools: [],\n },\n };\n\n const result = toAvailableComponents(components);\n\n expect(result).toHaveLength(2);\n expect(result.map((c) => c.name)).toContain(\"Card\");\n expect(result.map((c) => c.name)).toContain(\"Button\");\n });\n\n it(\"converts a Map of components\", () => {\n const components = new Map<string, RegisteredComponent>([\n [\n \"Card\",\n {\n name: \"Card\",\n description: \"A card\",\n component: () => null,\n props: {\n type: \"object\",\n properties: { title: { type: \"string\" } },\n required: [\"title\"],\n },\n contextTools: [],\n },\n ],\n ]);\n\n const result = toAvailableComponents(components);\n\n expect(result).toHaveLength(1);\n expect(result[0].name).toBe(\"Card\");\n });\n\n it(\"skips invalid components and logs warning\", () => {\n const warnSpy = jest.spyOn(console, \"warn\").mockImplementation(() => {});\n\n const components: Record<string, RegisteredComponent> = {\n Valid: {\n name: \"Valid\",\n description: \"Valid component\",\n component: () => null,\n props: {\n type: \"object\",\n properties: { x: { type: \"string\" } },\n required: [\"x\"],\n },\n contextTools: [],\n },\n Invalid: {\n name: \"Invalid\",\n description: \"Missing schema\",\n component: () => null,\n contextTools: [],\n } as unknown as RegisteredComponent,\n };\n\n const result = toAvailableComponents(components);\n\n expect(result).toHaveLength(1);\n expect(result[0].name).toBe(\"Valid\");\n expect(warnSpy).toHaveBeenCalledWith(\n expect.stringContaining('Skipping component \"Invalid\"'),\n );\n\n warnSpy.mockRestore();\n });\n });\n\n describe(\"toAvailableTool\", () => {\n it(\"converts a tool with inputSchema\", () => {\n const tool: TamboTool = {\n name: \"get_weather\",\n description: \"Gets weather for a city\",\n tool: async () => ({ temp: 72 }),\n inputSchema: z.object({ city: z.string() }),\n outputSchema: z.any(),\n };\n\n const result = toAvailableTool(tool);\n\n expect(result.name).toBe(\"get_weather\");\n expect(result.description).toBe(\"Gets weather for a city\");\n expect(result.inputSchema).toBeDefined();\n expect((result.inputSchema as Record<string, unknown>).type).toBe(\n \"object\",\n );\n });\n\n it(\"includes maxCalls when set\", () => {\n const tool: TamboTool = {\n name: \"limited_tool\",\n description: \"Tool with call limit\",\n tool: async () => ({}),\n inputSchema: z.object({ x: z.string() }),\n outputSchema: z.any(),\n maxCalls: 3,\n };\n\n const result = toAvailableTool(tool);\n\n expect(result.maxCalls).toBe(3);\n });\n\n it(\"omits maxCalls when not set\", () => {\n const tool: TamboTool = {\n name: \"unlimited_tool\",\n description: \"Tool without call limit\",\n tool: async () => ({}),\n inputSchema: z.object({ x: z.string() }),\n outputSchema: z.any(),\n };\n\n const result = toAvailableTool(tool);\n\n expect(result).not.toHaveProperty(\"maxCalls\");\n });\n\n it(\"throws when schema is missing\", () => {\n const tool = {\n name: \"bad_tool\",\n description: \"Missing schema\",\n tool: async () => ({}),\n } as unknown as TamboTool;\n\n expect(() => toAvailableTool(tool)).toThrow(\n 'Tool \"bad_tool\" missing inputSchema or toolSchema',\n );\n });\n });\n\n describe(\"toAvailableTools\", () => {\n it(\"converts a Record of tools\", () => {\n const tools: Record<string, TamboTool> = {\n search: {\n name: \"search\",\n description: \"Search the web\",\n tool: async () => [],\n inputSchema: z.object({ query: z.string() }),\n outputSchema: z.any(),\n },\n calculate: {\n name: \"calculate\",\n description: \"Calculate expression\",\n tool: async () => 0,\n inputSchema: z.object({ expr: z.string() }),\n outputSchema: z.any(),\n },\n };\n\n const result = toAvailableTools(tools);\n\n expect(result).toHaveLength(2);\n expect(result.map((t) => t.name)).toContain(\"search\");\n expect(result.map((t) => t.name)).toContain(\"calculate\");\n });\n\n it(\"converts a Map of tools\", () => {\n const tools = new Map<string, TamboTool>([\n [\n \"fetch\",\n {\n name: \"fetch\",\n description: \"Fetch data\",\n tool: async () => null,\n inputSchema: z.object({ url: z.string() }),\n outputSchema: z.any(),\n },\n ],\n ]);\n\n const result = toAvailableTools(tools);\n\n expect(result).toHaveLength(1);\n expect(result[0].name).toBe(\"fetch\");\n });\n\n it(\"skips invalid tools and logs warning\", () => {\n const warnSpy = jest.spyOn(console, \"warn\").mockImplementation(() => {});\n\n const tools: Record<string, TamboTool> = {\n valid: {\n name: \"valid\",\n description: \"Valid tool\",\n tool: async () => null,\n inputSchema: z.object({ x: z.number() }),\n outputSchema: z.any(),\n },\n invalid: {\n name: \"invalid\",\n description: \"Missing schema\",\n tool: async () => null,\n } as unknown as TamboTool,\n };\n\n const result = toAvailableTools(tools);\n\n expect(result).toHaveLength(1);\n expect(result[0].name).toBe(\"valid\");\n expect(warnSpy).toHaveBeenCalledWith(\n expect.stringContaining('Skipping tool \"invalid\"'),\n );\n\n warnSpy.mockRestore();\n });\n });\n});\n"]}
1
+ {"version":3,"file":"registry-conversion.test.js","sourceRoot":"","sources":["../../../src/v1/utils/registry-conversion.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from \"zod\";\nimport type {\n RegisteredComponent,\n TamboTool,\n} from \"../../model/component-metadata\";\nimport {\n toAvailableComponent,\n toAvailableComponents,\n toAvailableTool,\n toAvailableTools,\n} from \"@tambo-ai/client\";\n\ndescribe(\"registry-conversion\", () => {\n describe(\"toAvailableComponent\", () => {\n it(\"converts a component with props (JSON Schema)\", () => {\n // RegisteredComponent has props already converted to JSON Schema\n const component: RegisteredComponent = {\n name: \"WeatherCard\",\n description: \"Displays weather information\",\n component: () => null,\n props: {\n type: \"object\",\n properties: {\n city: { type: \"string\" },\n temperature: { type: \"number\" },\n },\n required: [\"city\", \"temperature\"],\n },\n contextTools: [],\n };\n\n const result = toAvailableComponent(component);\n\n expect(result.name).toBe(\"WeatherCard\");\n expect(result.description).toBe(\"Displays weather information\");\n expect(result.propsSchema).toBeDefined();\n expect((result.propsSchema as Record<string, unknown>).type).toBe(\n \"object\",\n );\n });\n\n it(\"throws when props is missing\", () => {\n const component = {\n name: \"BadComponent\",\n description: \"Missing schema\",\n component: () => null,\n contextTools: [],\n } as unknown as RegisteredComponent;\n\n expect(() => toAvailableComponent(component)).toThrow(\n 'Component \"BadComponent\" missing props',\n );\n });\n });\n\n describe(\"toAvailableComponents\", () => {\n it(\"converts a Record of components\", () => {\n const components: Record<string, RegisteredComponent> = {\n Card: {\n name: \"Card\",\n description: \"A card component\",\n component: () => null,\n props: {\n type: \"object\",\n properties: { title: { type: \"string\" } },\n required: [\"title\"],\n },\n contextTools: [],\n },\n Button: {\n name: \"Button\",\n description: \"A button component\",\n component: () => null,\n props: {\n type: \"object\",\n properties: { label: { type: \"string\" } },\n required: [\"label\"],\n },\n contextTools: [],\n },\n };\n\n const result = toAvailableComponents(components);\n\n expect(result).toHaveLength(2);\n expect(result.map((c) => c.name)).toContain(\"Card\");\n expect(result.map((c) => c.name)).toContain(\"Button\");\n });\n\n it(\"converts a Map of components\", () => {\n const components = new Map<string, RegisteredComponent>([\n [\n \"Card\",\n {\n name: \"Card\",\n description: \"A card\",\n component: () => null,\n props: {\n type: \"object\",\n properties: { title: { type: \"string\" } },\n required: [\"title\"],\n },\n contextTools: [],\n },\n ],\n ]);\n\n const result = toAvailableComponents(components);\n\n expect(result).toHaveLength(1);\n expect(result[0].name).toBe(\"Card\");\n });\n\n it(\"skips invalid components and logs warning\", () => {\n const warnSpy = jest.spyOn(console, \"warn\").mockImplementation(() => {});\n\n const components: Record<string, RegisteredComponent> = {\n Valid: {\n name: \"Valid\",\n description: \"Valid component\",\n component: () => null,\n props: {\n type: \"object\",\n properties: { x: { type: \"string\" } },\n required: [\"x\"],\n },\n contextTools: [],\n },\n Invalid: {\n name: \"Invalid\",\n description: \"Missing schema\",\n component: () => null,\n contextTools: [],\n } as unknown as RegisteredComponent,\n };\n\n const result = toAvailableComponents(components);\n\n expect(result).toHaveLength(1);\n expect(result[0].name).toBe(\"Valid\");\n expect(warnSpy).toHaveBeenCalledWith(\n expect.stringContaining('Skipping component \"Invalid\"'),\n );\n\n warnSpy.mockRestore();\n });\n });\n\n describe(\"toAvailableTool\", () => {\n it(\"converts a tool with inputSchema\", () => {\n const tool: TamboTool = {\n name: \"get_weather\",\n description: \"Gets weather for a city\",\n tool: async () => ({ temp: 72 }),\n inputSchema: z.object({ city: z.string() }),\n outputSchema: z.any(),\n };\n\n const result = toAvailableTool(tool);\n\n expect(result.name).toBe(\"get_weather\");\n expect(result.description).toBe(\"Gets weather for a city\");\n expect(result.inputSchema).toBeDefined();\n expect((result.inputSchema as Record<string, unknown>).type).toBe(\n \"object\",\n );\n });\n\n it(\"includes maxCalls when set\", () => {\n const tool: TamboTool = {\n name: \"limited_tool\",\n description: \"Tool with call limit\",\n tool: async () => ({}),\n inputSchema: z.object({ x: z.string() }),\n outputSchema: z.any(),\n maxCalls: 3,\n };\n\n const result = toAvailableTool(tool);\n\n expect(result.maxCalls).toBe(3);\n });\n\n it(\"omits maxCalls when not set\", () => {\n const tool: TamboTool = {\n name: \"unlimited_tool\",\n description: \"Tool without call limit\",\n tool: async () => ({}),\n inputSchema: z.object({ x: z.string() }),\n outputSchema: z.any(),\n };\n\n const result = toAvailableTool(tool);\n\n expect(result).not.toHaveProperty(\"maxCalls\");\n });\n\n it(\"throws when schema is missing\", () => {\n const tool = {\n name: \"bad_tool\",\n description: \"Missing schema\",\n tool: async () => ({}),\n } as unknown as TamboTool;\n\n expect(() => toAvailableTool(tool)).toThrow(\n 'Tool \"bad_tool\" missing inputSchema or toolSchema',\n );\n });\n });\n\n describe(\"toAvailableTools\", () => {\n it(\"converts a Record of tools\", () => {\n const tools: Record<string, TamboTool> = {\n search: {\n name: \"search\",\n description: \"Search the web\",\n tool: async () => [],\n inputSchema: z.object({ query: z.string() }),\n outputSchema: z.any(),\n },\n calculate: {\n name: \"calculate\",\n description: \"Calculate expression\",\n tool: async () => 0,\n inputSchema: z.object({ expr: z.string() }),\n outputSchema: z.any(),\n },\n };\n\n const result = toAvailableTools(tools);\n\n expect(result).toHaveLength(2);\n expect(result.map((t) => t.name)).toContain(\"search\");\n expect(result.map((t) => t.name)).toContain(\"calculate\");\n });\n\n it(\"converts a Map of tools\", () => {\n const tools = new Map<string, TamboTool>([\n [\n \"fetch\",\n {\n name: \"fetch\",\n description: \"Fetch data\",\n tool: async () => null,\n inputSchema: z.object({ url: z.string() }),\n outputSchema: z.any(),\n },\n ],\n ]);\n\n const result = toAvailableTools(tools);\n\n expect(result).toHaveLength(1);\n expect(result[0].name).toBe(\"fetch\");\n });\n\n it(\"skips invalid tools and logs warning\", () => {\n const warnSpy = jest.spyOn(console, \"warn\").mockImplementation(() => {});\n\n const tools: Record<string, TamboTool> = {\n valid: {\n name: \"valid\",\n description: \"Valid tool\",\n tool: async () => null,\n inputSchema: z.object({ x: z.number() }),\n outputSchema: z.any(),\n },\n invalid: {\n name: \"invalid\",\n description: \"Missing schema\",\n tool: async () => null,\n } as unknown as TamboTool,\n };\n\n const result = toAvailableTools(tools);\n\n expect(result).toHaveLength(1);\n expect(result[0].name).toBe(\"valid\");\n expect(warnSpy).toHaveBeenCalledWith(\n expect.stringContaining('Skipping tool \"invalid\"'),\n );\n\n warnSpy.mockRestore();\n });\n });\n});\n"]}
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const core_1 = require("@ag-ui/core");
4
- const stream_handler_1 = require("./stream-handler");
4
+ const client_1 = require("@tambo-ai/client");
5
5
  describe("handleEventStream", () => {
6
6
  it("yields events from the stream", async () => {
7
7
  const mockEvents = [
@@ -19,7 +19,7 @@ describe("handleEventStream", () => {
19
19
  }
20
20
  }
21
21
  const result = [];
22
- for await (const event of (0, stream_handler_1.handleEventStream)(mockStream())) {
22
+ for await (const event of (0, client_1.handleEventStream)(mockStream())) {
23
23
  result.push(event);
24
24
  }
25
25
  expect(result).toHaveLength(3);
@@ -32,7 +32,7 @@ describe("handleEventStream", () => {
32
32
  // yields nothing
33
33
  }
34
34
  const result = [];
35
- for await (const event of (0, stream_handler_1.handleEventStream)(emptyStream())) {
35
+ for await (const event of (0, client_1.handleEventStream)(emptyStream())) {
36
36
  result.push(event);
37
37
  }
38
38
  expect(result).toHaveLength(0);
@@ -48,7 +48,7 @@ describe("handleEventStream", () => {
48
48
  }
49
49
  }
50
50
  const result = [];
51
- for await (const event of (0, stream_handler_1.handleEventStream)(mockStream(), {
51
+ for await (const event of (0, client_1.handleEventStream)(mockStream(), {
52
52
  debug: true,
53
53
  })) {
54
54
  result.push(event);
@@ -62,7 +62,7 @@ describe("handleEventStream", () => {
62
62
  async function* mockStream() {
63
63
  yield { type: core_1.EventType.RUN_STARTED };
64
64
  }
65
- for await (const _event of (0, stream_handler_1.handleEventStream)(mockStream(), {
65
+ for await (const _event of (0, client_1.handleEventStream)(mockStream(), {
66
66
  debug: false,
67
67
  })) {
68
68
  // consume stream
@@ -1 +1 @@
1
- {"version":3,"file":"stream-handler.test.js","sourceRoot":"","sources":["../../../src/v1/utils/stream-handler.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventType } from \"@ag-ui/core\";\nimport { handleEventStream } from \"./stream-handler\";\n\ndescribe(\"handleEventStream\", () => {\n it(\"yields events from the stream\", async () => {\n const mockEvents = [\n { type: EventType.RUN_STARTED, runId: \"run_1\", threadId: \"thread_1\" },\n {\n type: EventType.TEXT_MESSAGE_START,\n messageId: \"msg_1\",\n role: \"assistant\",\n },\n { type: EventType.RUN_FINISHED, runId: \"run_1\", threadId: \"thread_1\" },\n ];\n\n async function* mockStream() {\n for (const event of mockEvents) {\n yield event;\n }\n }\n\n const result: unknown[] = [];\n for await (const event of handleEventStream(mockStream())) {\n result.push(event);\n }\n\n expect(result).toHaveLength(3);\n expect(result[0]).toEqual(mockEvents[0]);\n expect(result[1]).toEqual(mockEvents[1]);\n expect(result[2]).toEqual(mockEvents[2]);\n });\n\n it(\"handles empty stream\", async () => {\n async function* emptyStream() {\n // yields nothing\n }\n\n const result: unknown[] = [];\n for await (const event of handleEventStream(emptyStream())) {\n result.push(event);\n }\n\n expect(result).toHaveLength(0);\n });\n\n it(\"logs events when debug is enabled in non-production\", async () => {\n const originalEnv = process.env.NODE_ENV;\n process.env.NODE_ENV = \"development\";\n const logSpy = jest.spyOn(console, \"log\").mockImplementation(() => {});\n\n const mockEvents = [{ type: EventType.RUN_STARTED, runId: \"run_1\" }];\n\n async function* mockStream() {\n for (const event of mockEvents) {\n yield event;\n }\n }\n\n const result: unknown[] = [];\n for await (const event of handleEventStream(mockStream(), {\n debug: true,\n })) {\n result.push(event);\n }\n\n expect(logSpy).toHaveBeenCalledWith(\n \"[StreamHandler] Event:\",\n expect.objectContaining({ type: EventType.RUN_STARTED }),\n );\n\n logSpy.mockRestore();\n process.env.NODE_ENV = originalEnv;\n });\n\n it(\"does not log when debug is false\", async () => {\n const logSpy = jest.spyOn(console, \"log\").mockImplementation(() => {});\n\n async function* mockStream() {\n yield { type: EventType.RUN_STARTED };\n }\n\n for await (const _event of handleEventStream(mockStream(), {\n debug: false,\n })) {\n // consume stream\n }\n\n expect(logSpy).not.toHaveBeenCalled();\n logSpy.mockRestore();\n });\n});\n"]}
1
+ {"version":3,"file":"stream-handler.test.js","sourceRoot":"","sources":["../../../src/v1/utils/stream-handler.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventType } from \"@ag-ui/core\";\nimport { handleEventStream } from \"@tambo-ai/client\";\n\ndescribe(\"handleEventStream\", () => {\n it(\"yields events from the stream\", async () => {\n const mockEvents = [\n { type: EventType.RUN_STARTED, runId: \"run_1\", threadId: \"thread_1\" },\n {\n type: EventType.TEXT_MESSAGE_START,\n messageId: \"msg_1\",\n role: \"assistant\",\n },\n { type: EventType.RUN_FINISHED, runId: \"run_1\", threadId: \"thread_1\" },\n ];\n\n async function* mockStream() {\n for (const event of mockEvents) {\n yield event;\n }\n }\n\n const result: unknown[] = [];\n for await (const event of handleEventStream(mockStream())) {\n result.push(event);\n }\n\n expect(result).toHaveLength(3);\n expect(result[0]).toEqual(mockEvents[0]);\n expect(result[1]).toEqual(mockEvents[1]);\n expect(result[2]).toEqual(mockEvents[2]);\n });\n\n it(\"handles empty stream\", async () => {\n async function* emptyStream() {\n // yields nothing\n }\n\n const result: unknown[] = [];\n for await (const event of handleEventStream(emptyStream())) {\n result.push(event);\n }\n\n expect(result).toHaveLength(0);\n });\n\n it(\"logs events when debug is enabled in non-production\", async () => {\n const originalEnv = process.env.NODE_ENV;\n process.env.NODE_ENV = \"development\";\n const logSpy = jest.spyOn(console, \"log\").mockImplementation(() => {});\n\n const mockEvents = [{ type: EventType.RUN_STARTED, runId: \"run_1\" }];\n\n async function* mockStream() {\n for (const event of mockEvents) {\n yield event;\n }\n }\n\n const result: unknown[] = [];\n for await (const event of handleEventStream(mockStream(), {\n debug: true,\n })) {\n result.push(event);\n }\n\n expect(logSpy).toHaveBeenCalledWith(\n \"[StreamHandler] Event:\",\n expect.objectContaining({ type: EventType.RUN_STARTED }),\n );\n\n logSpy.mockRestore();\n process.env.NODE_ENV = originalEnv;\n });\n\n it(\"does not log when debug is false\", async () => {\n const logSpy = jest.spyOn(console, \"log\").mockImplementation(() => {});\n\n async function* mockStream() {\n yield { type: EventType.RUN_STARTED };\n }\n\n for await (const _event of handleEventStream(mockStream(), {\n debug: false,\n })) {\n // consume stream\n }\n\n expect(logSpy).not.toHaveBeenCalled();\n logSpy.mockRestore();\n });\n});\n"]}
@@ -1,8 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const core_1 = require("@ag-ui/core");
4
- const tool_call_tracker_1 = require("./tool-call-tracker");
5
- /** Minimal tool definition for tests — only name + inputSchema are needed. */
4
+ const client_1 = require("@tambo-ai/client");
5
+ /**
6
+ * Minimal tool definition for tests — only name + inputSchema are needed.
7
+ * @returns A TamboTool with test defaults.
8
+ */
6
9
  function fakeTool(name, inputSchema) {
7
10
  return {
8
11
  name,
@@ -12,9 +15,12 @@ function fakeTool(name, inputSchema) {
12
15
  outputSchema: {},
13
16
  };
14
17
  }
15
- /** Helper to create a tracker with a started tool call. */
18
+ /**
19
+ * Helper to create a tracker with a started tool call.
20
+ * @returns A ToolCallTracker with a pending tool call.
21
+ */
16
22
  function createTrackerWithToolCall(toolCallId = "call_1", toolCallName = "get_weather", toolRegistry) {
17
- const tracker = new tool_call_tracker_1.ToolCallTracker(toolRegistry);
23
+ const tracker = new client_1.ToolCallTracker(toolRegistry);
18
24
  tracker.handleEvent({
19
25
  type: core_1.EventType.TOOL_CALL_START,
20
26
  toolCallId,
@@ -26,11 +32,11 @@ function createTrackerWithToolCall(toolCallId = "call_1", toolCallName = "get_we
26
32
  describe("ToolCallTracker", () => {
27
33
  describe("getAccumulatingToolCall", () => {
28
34
  it("returns undefined for unknown tool call ID", () => {
29
- const tracker = new tool_call_tracker_1.ToolCallTracker();
35
+ const tracker = new client_1.ToolCallTracker();
30
36
  expect(tracker.getAccumulatingToolCall("nonexistent")).toBeUndefined();
31
37
  });
32
38
  it("returns name and empty accumulated args after TOOL_CALL_START", () => {
33
- const tracker = new tool_call_tracker_1.ToolCallTracker();
39
+ const tracker = new client_1.ToolCallTracker();
34
40
  tracker.handleEvent({
35
41
  type: core_1.EventType.TOOL_CALL_START,
36
42
  toolCallId: "call_1",
@@ -41,7 +47,7 @@ describe("ToolCallTracker", () => {
41
47
  expect(result).toEqual({ name: "write_story", accumulatedArgs: "" });
42
48
  });
43
49
  it("returns name and accumulated args after START + ARGS events", () => {
44
- const tracker = new tool_call_tracker_1.ToolCallTracker();
50
+ const tracker = new client_1.ToolCallTracker();
45
51
  tracker.handleEvent({
46
52
  type: core_1.EventType.TOOL_CALL_START,
47
53
  toolCallId: "call_1",
@@ -60,7 +66,7 @@ describe("ToolCallTracker", () => {
60
66
  });
61
67
  });
62
68
  it("accumulates multiple ARGS deltas", () => {
63
- const tracker = new tool_call_tracker_1.ToolCallTracker();
69
+ const tracker = new client_1.ToolCallTracker();
64
70
  tracker.handleEvent({
65
71
  type: core_1.EventType.TOOL_CALL_START,
66
72
  toolCallId: "call_1",
@@ -202,7 +208,7 @@ describe("ToolCallTracker", () => {
202
208
  my_tool: fakeTool("my_tool", schema),
203
209
  };
204
210
  it("returns undefined for unknown tool call ID", () => {
205
- const tracker = new tool_call_tracker_1.ToolCallTracker(registry);
211
+ const tracker = new client_1.ToolCallTracker(registry);
206
212
  expect(tracker.parsePartialArgs("nonexistent")).toBeUndefined();
207
213
  });
208
214
  it("returns undefined when partial JSON is not parseable", () => {