@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 +1 @@
1
- {"version":3,"file":"tool-call-tracker.test.js","sourceRoot":"","sources":["../../../src/v1/utils/tool-call-tracker.test.ts"],"names":[],"mappings":";;AAAA,sCAAwC;AAGxC,2DAAsD;AAEtD,8EAA8E;AAC9E,SAAS,QAAQ,CAAC,IAAY,EAAE,WAAwB;IACtD,OAAO;QACL,IAAI;QACJ,WAAW,EAAE,EAAE;QACf,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI;QAChB,WAAW;QACX,YAAY,EAAE,EAAE;KACJ,CAAC;AACjB,CAAC;AAED,2DAA2D;AAC3D,SAAS,yBAAyB,CAChC,UAAU,GAAG,QAAQ,EACrB,YAAY,GAAG,aAAa,EAC5B,YAAwC;IAExC,MAAM,OAAO,GAAG,IAAI,mCAAe,CAAC,YAAY,CAAC,CAAC;IAClD,OAAO,CAAC,WAAW,CAAC;QAClB,IAAI,EAAE,gBAAS,CAAC,eAAe;QAC/B,UAAU;QACV,YAAY;QACZ,eAAe,EAAE,OAAO;KACzB,CAAC,CAAC;IACH,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACvC,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,OAAO,GAAG,IAAI,mCAAe,EAAE,CAAC;YACtC,MAAM,CAAC,OAAO,CAAC,uBAAuB,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QACzE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;YACvE,MAAM,OAAO,GAAG,IAAI,mCAAe,EAAE,CAAC;YACtC,OAAO,CAAC,WAAW,CAAC;gBAClB,IAAI,EAAE,gBAAS,CAAC,eAAe;gBAC/B,UAAU,EAAE,QAAQ;gBACpB,YAAY,EAAE,aAAa;gBAC3B,eAAe,EAAE,OAAO;aACzB,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;YACzD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;YACrE,MAAM,OAAO,GAAG,IAAI,mCAAe,EAAE,CAAC;YACtC,OAAO,CAAC,WAAW,CAAC;gBAClB,IAAI,EAAE,gBAAS,CAAC,eAAe;gBAC/B,UAAU,EAAE,QAAQ;gBACpB,YAAY,EAAE,aAAa;gBAC3B,eAAe,EAAE,OAAO;aACzB,CAAC,CAAC;YACH,OAAO,CAAC,WAAW,CAAC;gBAClB,IAAI,EAAE,gBAAS,CAAC,cAAc;gBAC9B,UAAU,EAAE,QAAQ;gBACpB,KAAK,EAAE,gBAAgB;aACxB,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;YACzD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;gBACrB,IAAI,EAAE,aAAa;gBACnB,eAAe,EAAE,gBAAgB;aAClC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,OAAO,GAAG,IAAI,mCAAe,EAAE,CAAC;YACtC,OAAO,CAAC,WAAW,CAAC;gBAClB,IAAI,EAAE,gBAAS,CAAC,eAAe;gBAC/B,UAAU,EAAE,QAAQ;gBACpB,YAAY,EAAE,aAAa;gBAC3B,eAAe,EAAE,OAAO;aACzB,CAAC,CAAC;YACH,OAAO,CAAC,WAAW,CAAC;gBAClB,IAAI,EAAE,gBAAS,CAAC,cAAc;gBAC9B,UAAU,EAAE,QAAQ;gBACpB,KAAK,EAAE,WAAW;aACnB,CAAC,CAAC;YACH,OAAO,CAAC,WAAW,CAAC;gBAClB,IAAI,EAAE,gBAAS,CAAC,cAAc;gBAC9B,UAAU,EAAE,QAAQ;gBACpB,KAAK,EAAE,UAAU;aAClB,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;YACzD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;gBACrB,IAAI,EAAE,aAAa;gBACnB,eAAe,EAAE,mBAAmB;aACrC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;QAC3C,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,OAAO,GAAG,yBAAyB,EAAE,CAAC;YAC5C,OAAO,CAAC,WAAW,CAAC;gBAClB,IAAI,EAAE,gBAAS,CAAC,cAAc;gBAC9B,UAAU,EAAE,QAAQ;gBACpB,KAAK,EAAE,gBAAgB;aACxB,CAAC,CAAC;YACH,OAAO,CAAC,WAAW,CAAC;gBAClB,IAAI,EAAE,gBAAS,CAAC,aAAa;gBAC7B,UAAU,EAAE,QAAQ;aACrB,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;YACpD,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,OAAO,GAAG,yBAAyB,EAAE,CAAC;YAC5C,OAAO,CAAC,WAAW,CAAC;gBAClB,IAAI,EAAE,gBAAS,CAAC,cAAc;gBAC9B,UAAU,EAAE,QAAQ;gBACpB,KAAK,EAAE,iBAAiB;aACzB,CAAC,CAAC;YAEH,MAAM,CAAC,GAAG,EAAE,CACV,OAAO,CAAC,WAAW,CAAC;gBAClB,IAAI,EAAE,gBAAS,CAAC,aAAa;gBAC7B,UAAU,EAAE,QAAQ;aACrB,CAAC,CACH,CAAC,OAAO,CAAC,gDAAgD,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sCAAsC,EAAE,GAAG,EAAE;QACpD,MAAM,MAAM,GAAgB;YAC1B,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACxB,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aAC1B;YACD,QAAQ,EAAE,CAAC,MAAM,CAAC;SACnB,CAAC;QAEF,MAAM,QAAQ,GAA8B;YAC1C,WAAW,EAAE,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;SAC7C,CAAC;QAEF,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;YAC/D,MAAM,OAAO,GAAG,yBAAyB,CACvC,QAAQ,EACR,aAAa,EACb,QAAQ,CACT,CAAC;YACF,OAAO,CAAC,WAAW,CAAC;gBAClB,IAAI,EAAE,gBAAS,CAAC,cAAc;gBAC9B,UAAU,EAAE,QAAQ;gBACpB,KAAK,EAAE,iCAAiC;aACzC,CAAC,CAAC;YACH,OAAO,CAAC,WAAW,CAAC;gBAClB,IAAI,EAAE,gBAAS,CAAC,aAAa;gBAC7B,UAAU,EAAE,QAAQ;aACrB,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;YACpD,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,OAAO,GAAG,yBAAyB,CACvC,QAAQ,EACR,aAAa,EACb,QAAQ,CACT,CAAC;YACF,OAAO,CAAC,WAAW,CAAC;gBAClB,IAAI,EAAE,gBAAS,CAAC,cAAc;gBAC9B,UAAU,EAAE,QAAQ;gBACpB,KAAK,EAAE,4BAA4B;aACpC,CAAC,CAAC;YACH,OAAO,CAAC,WAAW,CAAC;gBAClB,IAAI,EAAE,gBAAS,CAAC,aAAa;gBAC7B,UAAU,EAAE,QAAQ;aACrB,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;YACpD,iFAAiF;YACjF,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,OAAO,GAAG,yBAAyB,EAAE,CAAC;YAC5C,OAAO,CAAC,WAAW,CAAC;gBAClB,IAAI,EAAE,gBAAS,CAAC,cAAc;gBAC9B,UAAU,EAAE,QAAQ;gBACpB,KAAK,EAAE,iCAAiC;aACzC,CAAC,CAAC;YACH,OAAO,CAAC,WAAW,CAAC;gBAClB,IAAI,EAAE,gBAAS,CAAC,aAAa;gBAC7B,UAAU,EAAE,QAAQ;aACrB,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;YACpD,wCAAwC;YACxC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC;gBAC1C,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,IAAI;aACZ,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,OAAO,GAAG,yBAAyB,CACvC,QAAQ,EACR,aAAa,EACb,QAAQ,CACT,CAAC;YACF,OAAO,CAAC,WAAW,CAAC;gBAClB,IAAI,EAAE,gBAAS,CAAC,cAAc;gBAC9B,UAAU,EAAE,QAAQ;gBACpB,KAAK,EACH,kEAAkE;aACrE,CAAC,CAAC;YACH,OAAO,CAAC,WAAW,CAAC;gBAClB,IAAI,EAAE,gBAAS,CAAC,aAAa;gBAC7B,UAAU,EAAE,QAAQ;aACrB,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;YACpD,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC;gBAC1C,IAAI,EAAE,SAAS;gBACf,oBAAoB,EAAE,SAAS;aAChC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,MAAM,MAAM,GAAgB;YAC1B,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,eAAe,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACnC,eAAe,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aACpC;YACD,QAAQ,EAAE,CAAC,iBAAiB,CAAC;SAC9B,CAAC;QAEF,MAAM,QAAQ,GAA8B;YAC1C,OAAO,EAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;SACrC,CAAC;QAEF,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,OAAO,GAAG,IAAI,mCAAe,CAAC,QAAQ,CAAC,CAAC;YAC9C,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,MAAM,OAAO,GAAG,yBAAyB,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;YACzE,OAAO,CAAC,WAAW,CAAC;gBAClB,IAAI,EAAE,gBAAS,CAAC,cAAc;gBAC9B,UAAU,EAAE,QAAQ;gBACpB,KAAK,EAAE,OAAO;aACf,CAAC,CAAC;YAEH,sEAAsE;YACtE,+BAA+B;YAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YAClD,wEAAwE;YACxE,0BAA0B;YAC1B,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,MAAM,OAAO,GAAG,yBAAyB,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;YAEzE,+CAA+C;YAC/C,MAAM,QAAQ,GAAG,uDAAuD,CAAC;YACzE,MAAM,SAAS,GAAG,CAAC,CAAC;YACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;gBACpD,OAAO,CAAC,WAAW,CAAC;oBAClB,IAAI,EAAE,gBAAS,CAAC,cAAc;oBAC9B,UAAU,EAAE,QAAQ;oBACpB,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC;iBACxC,CAAC,CAAC;gBAEH,MAAM,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;gBACnD,IAAI,OAAO,EAAE,CAAC;oBACZ,qCAAqC;oBACrC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;gBACxD,CAAC;YACH,CAAC;YAED,mDAAmD;YACnD,MAAM,KAAK,GAAG,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YACjD,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,eAAe,EAAE,UAAU,EAAE,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { EventType } from \"@ag-ui/core\";\nimport type { JSONSchema7 } from \"json-schema\";\nimport type { TamboTool } from \"../../model/component-metadata\";\nimport { ToolCallTracker } from \"./tool-call-tracker\";\n\n/** Minimal tool definition for tests — only name + inputSchema are needed. */\nfunction fakeTool(name: string, inputSchema: JSONSchema7): TamboTool {\n return {\n name,\n description: \"\",\n tool: () => null,\n inputSchema,\n outputSchema: {},\n } as TamboTool;\n}\n\n/** Helper to create a tracker with a started tool call. */\nfunction createTrackerWithToolCall(\n toolCallId = \"call_1\",\n toolCallName = \"get_weather\",\n toolRegistry?: Record<string, TamboTool>,\n): ToolCallTracker {\n const tracker = new ToolCallTracker(toolRegistry);\n tracker.handleEvent({\n type: EventType.TOOL_CALL_START,\n toolCallId,\n toolCallName,\n parentMessageId: \"msg_1\",\n });\n return tracker;\n}\n\ndescribe(\"ToolCallTracker\", () => {\n describe(\"getAccumulatingToolCall\", () => {\n it(\"returns undefined for unknown tool call ID\", () => {\n const tracker = new ToolCallTracker();\n expect(tracker.getAccumulatingToolCall(\"nonexistent\")).toBeUndefined();\n });\n\n it(\"returns name and empty accumulated args after TOOL_CALL_START\", () => {\n const tracker = new ToolCallTracker();\n tracker.handleEvent({\n type: EventType.TOOL_CALL_START,\n toolCallId: \"call_1\",\n toolCallName: \"write_story\",\n parentMessageId: \"msg_1\",\n });\n\n const result = tracker.getAccumulatingToolCall(\"call_1\");\n expect(result).toEqual({ name: \"write_story\", accumulatedArgs: \"\" });\n });\n\n it(\"returns name and accumulated args after START + ARGS events\", () => {\n const tracker = new ToolCallTracker();\n tracker.handleEvent({\n type: EventType.TOOL_CALL_START,\n toolCallId: \"call_1\",\n toolCallName: \"write_story\",\n parentMessageId: \"msg_1\",\n });\n tracker.handleEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: '{\"title\":\"Once',\n });\n\n const result = tracker.getAccumulatingToolCall(\"call_1\");\n expect(result).toEqual({\n name: \"write_story\",\n accumulatedArgs: '{\"title\":\"Once',\n });\n });\n\n it(\"accumulates multiple ARGS deltas\", () => {\n const tracker = new ToolCallTracker();\n tracker.handleEvent({\n type: EventType.TOOL_CALL_START,\n toolCallId: \"call_1\",\n toolCallName: \"write_story\",\n parentMessageId: \"msg_1\",\n });\n tracker.handleEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: '{\"title\":',\n });\n tracker.handleEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: '\"Hello\"}',\n });\n\n const result = tracker.getAccumulatingToolCall(\"call_1\");\n expect(result).toEqual({\n name: \"write_story\",\n accumulatedArgs: '{\"title\":\"Hello\"}',\n });\n });\n });\n\n describe(\"handleEvent - TOOL_CALL_END\", () => {\n it(\"parses accumulated JSON on TOOL_CALL_END\", () => {\n const tracker = createTrackerWithToolCall();\n tracker.handleEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: '{\"city\":\"NYC\"}',\n });\n tracker.handleEvent({\n type: EventType.TOOL_CALL_END,\n toolCallId: \"call_1\",\n });\n\n const result = tracker.getToolCallsById([\"call_1\"]);\n expect(result.get(\"call_1\")?.input).toEqual({ city: \"NYC\" });\n });\n\n it(\"throws on invalid JSON at TOOL_CALL_END\", () => {\n const tracker = createTrackerWithToolCall();\n tracker.handleEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: \"{not valid json\",\n });\n\n expect(() =>\n tracker.handleEvent({\n type: EventType.TOOL_CALL_END,\n toolCallId: \"call_1\",\n }),\n ).toThrow(\"Failed to parse tool call arguments for call_1\");\n });\n });\n\n describe(\"TOOL_CALL_END with unstrictification\", () => {\n const schema: JSONSchema7 = {\n type: \"object\",\n properties: {\n city: { type: \"string\" },\n units: { type: \"string\" },\n },\n required: [\"city\"],\n };\n\n const registry: Record<string, TamboTool> = {\n get_weather: fakeTool(\"get_weather\", schema),\n };\n\n it(\"strips null optional params when registry is provided\", () => {\n const tracker = createTrackerWithToolCall(\n \"call_1\",\n \"get_weather\",\n registry,\n );\n tracker.handleEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: '{\"city\":\"Seattle\",\"units\":null}',\n });\n tracker.handleEvent({\n type: EventType.TOOL_CALL_END,\n toolCallId: \"call_1\",\n });\n\n const result = tracker.getToolCallsById([\"call_1\"]);\n expect(result.get(\"call_1\")?.input).toEqual({ city: \"Seattle\" });\n });\n\n it(\"preserves required null params\", () => {\n const tracker = createTrackerWithToolCall(\n \"call_1\",\n \"get_weather\",\n registry,\n );\n tracker.handleEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: '{\"city\":null,\"units\":null}',\n });\n tracker.handleEvent({\n type: EventType.TOOL_CALL_END,\n toolCallId: \"call_1\",\n });\n\n const result = tracker.getToolCallsById([\"call_1\"]);\n // city is required, so null is preserved; units is optional, so null is stripped\n expect(result.get(\"call_1\")?.input).toEqual({ city: null });\n });\n\n it(\"does not unstrictify when no registry is provided\", () => {\n const tracker = createTrackerWithToolCall();\n tracker.handleEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: '{\"city\":\"Seattle\",\"units\":null}',\n });\n tracker.handleEvent({\n type: EventType.TOOL_CALL_END,\n toolCallId: \"call_1\",\n });\n\n const result = tracker.getToolCallsById([\"call_1\"]);\n // Without registry, nulls are preserved\n expect(result.get(\"call_1\")?.input).toEqual({\n city: \"Seattle\",\n units: null,\n });\n });\n\n it(\"preserves _tambo_* pass-through params\", () => {\n const tracker = createTrackerWithToolCall(\n \"call_1\",\n \"get_weather\",\n registry,\n );\n tracker.handleEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta:\n '{\"city\":\"Seattle\",\"units\":null,\"_tambo_statusMessage\":\"Loading\"}',\n });\n tracker.handleEvent({\n type: EventType.TOOL_CALL_END,\n toolCallId: \"call_1\",\n });\n\n const result = tracker.getToolCallsById([\"call_1\"]);\n expect(result.get(\"call_1\")?.input).toEqual({\n city: \"Seattle\",\n _tambo_statusMessage: \"Loading\",\n });\n });\n });\n\n describe(\"parsePartialArgs\", () => {\n const schema: JSONSchema7 = {\n type: \"object\",\n properties: {\n required_string: { type: \"string\" },\n optional_string: { type: \"string\" },\n },\n required: [\"required_string\"],\n };\n\n const registry: Record<string, TamboTool> = {\n my_tool: fakeTool(\"my_tool\", schema),\n };\n\n it(\"returns undefined for unknown tool call ID\", () => {\n const tracker = new ToolCallTracker(registry);\n expect(tracker.parsePartialArgs(\"nonexistent\")).toBeUndefined();\n });\n\n it(\"returns undefined when partial JSON is not parseable\", () => {\n const tracker = createTrackerWithToolCall(\"call_1\", \"my_tool\", registry);\n tracker.handleEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: '{\"req',\n });\n\n // partial-json should handle this, but if it can't parse to an object\n // the method returns undefined\n const result = tracker.parsePartialArgs(\"call_1\");\n // partial-json can parse this to { req: undefined } or similar — either\n // way it should not throw\n expect(result === undefined || typeof result === \"object\").toBe(true);\n });\n\n it(\"unstrictifies partial args during streaming\", () => {\n const tracker = createTrackerWithToolCall(\"call_1\", \"my_tool\", registry);\n\n // Stream the full strict JSON in 3-char chunks\n const fullJson = '{\"required_string\":\"required\",\"optional_string\":null}';\n const chunkSize = 3;\n for (let i = 0; i < fullJson.length; i += chunkSize) {\n tracker.handleEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: fullJson.slice(i, i + chunkSize),\n });\n\n const partial = tracker.parsePartialArgs(\"call_1\");\n if (partial) {\n // Must never contain optional_string\n expect(partial).not.toHaveProperty(\"optional_string\");\n }\n }\n\n // After all chunks, should have the required param\n const final = tracker.parsePartialArgs(\"call_1\");\n expect(final).toEqual({ required_string: \"required\" });\n });\n });\n});\n"]}
1
+ {"version":3,"file":"tool-call-tracker.test.js","sourceRoot":"","sources":["../../../src/v1/utils/tool-call-tracker.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventType } from \"@ag-ui/core\";\nimport type { JSONSchema7 } from \"json-schema\";\nimport type { TamboTool } from \"../../model/component-metadata\";\nimport { ToolCallTracker } from \"@tambo-ai/client\";\n\n/**\n * Minimal tool definition for tests — only name + inputSchema are needed.\n * @returns A TamboTool with test defaults.\n */\nfunction fakeTool(name: string, inputSchema: JSONSchema7): TamboTool {\n return {\n name,\n description: \"\",\n tool: () => null,\n inputSchema,\n outputSchema: {},\n } as TamboTool;\n}\n\n/**\n * Helper to create a tracker with a started tool call.\n * @returns A ToolCallTracker with a pending tool call.\n */\nfunction createTrackerWithToolCall(\n toolCallId = \"call_1\",\n toolCallName = \"get_weather\",\n toolRegistry?: Record<string, TamboTool>,\n): ToolCallTracker {\n const tracker = new ToolCallTracker(toolRegistry);\n tracker.handleEvent({\n type: EventType.TOOL_CALL_START,\n toolCallId,\n toolCallName,\n parentMessageId: \"msg_1\",\n });\n return tracker;\n}\n\ndescribe(\"ToolCallTracker\", () => {\n describe(\"getAccumulatingToolCall\", () => {\n it(\"returns undefined for unknown tool call ID\", () => {\n const tracker = new ToolCallTracker();\n expect(tracker.getAccumulatingToolCall(\"nonexistent\")).toBeUndefined();\n });\n\n it(\"returns name and empty accumulated args after TOOL_CALL_START\", () => {\n const tracker = new ToolCallTracker();\n tracker.handleEvent({\n type: EventType.TOOL_CALL_START,\n toolCallId: \"call_1\",\n toolCallName: \"write_story\",\n parentMessageId: \"msg_1\",\n });\n\n const result = tracker.getAccumulatingToolCall(\"call_1\");\n expect(result).toEqual({ name: \"write_story\", accumulatedArgs: \"\" });\n });\n\n it(\"returns name and accumulated args after START + ARGS events\", () => {\n const tracker = new ToolCallTracker();\n tracker.handleEvent({\n type: EventType.TOOL_CALL_START,\n toolCallId: \"call_1\",\n toolCallName: \"write_story\",\n parentMessageId: \"msg_1\",\n });\n tracker.handleEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: '{\"title\":\"Once',\n });\n\n const result = tracker.getAccumulatingToolCall(\"call_1\");\n expect(result).toEqual({\n name: \"write_story\",\n accumulatedArgs: '{\"title\":\"Once',\n });\n });\n\n it(\"accumulates multiple ARGS deltas\", () => {\n const tracker = new ToolCallTracker();\n tracker.handleEvent({\n type: EventType.TOOL_CALL_START,\n toolCallId: \"call_1\",\n toolCallName: \"write_story\",\n parentMessageId: \"msg_1\",\n });\n tracker.handleEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: '{\"title\":',\n });\n tracker.handleEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: '\"Hello\"}',\n });\n\n const result = tracker.getAccumulatingToolCall(\"call_1\");\n expect(result).toEqual({\n name: \"write_story\",\n accumulatedArgs: '{\"title\":\"Hello\"}',\n });\n });\n });\n\n describe(\"handleEvent - TOOL_CALL_END\", () => {\n it(\"parses accumulated JSON on TOOL_CALL_END\", () => {\n const tracker = createTrackerWithToolCall();\n tracker.handleEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: '{\"city\":\"NYC\"}',\n });\n tracker.handleEvent({\n type: EventType.TOOL_CALL_END,\n toolCallId: \"call_1\",\n });\n\n const result = tracker.getToolCallsById([\"call_1\"]);\n expect(result.get(\"call_1\")?.input).toEqual({ city: \"NYC\" });\n });\n\n it(\"throws on invalid JSON at TOOL_CALL_END\", () => {\n const tracker = createTrackerWithToolCall();\n tracker.handleEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: \"{not valid json\",\n });\n\n expect(() =>\n tracker.handleEvent({\n type: EventType.TOOL_CALL_END,\n toolCallId: \"call_1\",\n }),\n ).toThrow(\"Failed to parse tool call arguments for call_1\");\n });\n });\n\n describe(\"TOOL_CALL_END with unstrictification\", () => {\n const schema: JSONSchema7 = {\n type: \"object\",\n properties: {\n city: { type: \"string\" },\n units: { type: \"string\" },\n },\n required: [\"city\"],\n };\n\n const registry: Record<string, TamboTool> = {\n get_weather: fakeTool(\"get_weather\", schema),\n };\n\n it(\"strips null optional params when registry is provided\", () => {\n const tracker = createTrackerWithToolCall(\n \"call_1\",\n \"get_weather\",\n registry,\n );\n tracker.handleEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: '{\"city\":\"Seattle\",\"units\":null}',\n });\n tracker.handleEvent({\n type: EventType.TOOL_CALL_END,\n toolCallId: \"call_1\",\n });\n\n const result = tracker.getToolCallsById([\"call_1\"]);\n expect(result.get(\"call_1\")?.input).toEqual({ city: \"Seattle\" });\n });\n\n it(\"preserves required null params\", () => {\n const tracker = createTrackerWithToolCall(\n \"call_1\",\n \"get_weather\",\n registry,\n );\n tracker.handleEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: '{\"city\":null,\"units\":null}',\n });\n tracker.handleEvent({\n type: EventType.TOOL_CALL_END,\n toolCallId: \"call_1\",\n });\n\n const result = tracker.getToolCallsById([\"call_1\"]);\n // city is required, so null is preserved; units is optional, so null is stripped\n expect(result.get(\"call_1\")?.input).toEqual({ city: null });\n });\n\n it(\"does not unstrictify when no registry is provided\", () => {\n const tracker = createTrackerWithToolCall();\n tracker.handleEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: '{\"city\":\"Seattle\",\"units\":null}',\n });\n tracker.handleEvent({\n type: EventType.TOOL_CALL_END,\n toolCallId: \"call_1\",\n });\n\n const result = tracker.getToolCallsById([\"call_1\"]);\n // Without registry, nulls are preserved\n expect(result.get(\"call_1\")?.input).toEqual({\n city: \"Seattle\",\n units: null,\n });\n });\n\n it(\"preserves _tambo_* pass-through params\", () => {\n const tracker = createTrackerWithToolCall(\n \"call_1\",\n \"get_weather\",\n registry,\n );\n tracker.handleEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta:\n '{\"city\":\"Seattle\",\"units\":null,\"_tambo_statusMessage\":\"Loading\"}',\n });\n tracker.handleEvent({\n type: EventType.TOOL_CALL_END,\n toolCallId: \"call_1\",\n });\n\n const result = tracker.getToolCallsById([\"call_1\"]);\n expect(result.get(\"call_1\")?.input).toEqual({\n city: \"Seattle\",\n _tambo_statusMessage: \"Loading\",\n });\n });\n });\n\n describe(\"parsePartialArgs\", () => {\n const schema: JSONSchema7 = {\n type: \"object\",\n properties: {\n required_string: { type: \"string\" },\n optional_string: { type: \"string\" },\n },\n required: [\"required_string\"],\n };\n\n const registry: Record<string, TamboTool> = {\n my_tool: fakeTool(\"my_tool\", schema),\n };\n\n it(\"returns undefined for unknown tool call ID\", () => {\n const tracker = new ToolCallTracker(registry);\n expect(tracker.parsePartialArgs(\"nonexistent\")).toBeUndefined();\n });\n\n it(\"returns undefined when partial JSON is not parseable\", () => {\n const tracker = createTrackerWithToolCall(\"call_1\", \"my_tool\", registry);\n tracker.handleEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: '{\"req',\n });\n\n // partial-json should handle this, but if it can't parse to an object\n // the method returns undefined\n const result = tracker.parsePartialArgs(\"call_1\");\n // partial-json can parse this to { req: undefined } or similar — either\n // way it should not throw\n expect(result === undefined || typeof result === \"object\").toBe(true);\n });\n\n it(\"unstrictifies partial args during streaming\", () => {\n const tracker = createTrackerWithToolCall(\"call_1\", \"my_tool\", registry);\n\n // Stream the full strict JSON in 3-char chunks\n const fullJson = '{\"required_string\":\"required\",\"optional_string\":null}';\n const chunkSize = 3;\n for (let i = 0; i < fullJson.length; i += chunkSize) {\n tracker.handleEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: fullJson.slice(i, i + chunkSize),\n });\n\n const partial = tracker.parsePartialArgs(\"call_1\");\n if (partial) {\n // Must never contain optional_string\n expect(partial).not.toHaveProperty(\"optional_string\");\n }\n }\n\n // After all chunks, should have the required param\n const final = tracker.parsePartialArgs(\"call_1\");\n expect(final).toEqual({ required_string: \"required\" });\n });\n });\n});\n"]}
@@ -2,8 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const core_1 = require("@ag-ui/core");
4
4
  const zod_1 = require("zod");
5
- const tool_executor_1 = require("./tool-executor");
6
- const tool_call_tracker_1 = require("./tool-call-tracker");
5
+ const client_1 = require("@tambo-ai/client");
7
6
  describe("tool-executor", () => {
8
7
  describe("executeClientTool", () => {
9
8
  it("executes a tool and returns text result", async () => {
@@ -14,7 +13,7 @@ describe("tool-executor", () => {
14
13
  inputSchema: zod_1.z.object({ city: zod_1.z.string() }),
15
14
  outputSchema: zod_1.z.string(),
16
15
  };
17
- const result = await (0, tool_executor_1.executeClientTool)(tool, "call-1", {
16
+ const result = await (0, client_1.executeClientTool)(tool, "call-1", {
18
17
  city: "Seattle",
19
18
  });
20
19
  expect(result).toEqual({
@@ -31,7 +30,7 @@ describe("tool-executor", () => {
31
30
  inputSchema: zod_1.z.object({}),
32
31
  outputSchema: zod_1.z.object({ value: zod_1.z.number() }),
33
32
  };
34
- const result = await (0, tool_executor_1.executeClientTool)(tool, "call-2", {});
33
+ const result = await (0, client_1.executeClientTool)(tool, "call-2", {});
35
34
  expect(result).toEqual({
36
35
  type: "tool_result",
37
36
  toolUseId: "call-2",
@@ -49,7 +48,7 @@ describe("tool-executor", () => {
49
48
  { type: "text", text: `Transformed: ${result}` },
50
49
  ],
51
50
  };
52
- const result = await (0, tool_executor_1.executeClientTool)(tool, "call-3", {});
51
+ const result = await (0, client_1.executeClientTool)(tool, "call-3", {});
53
52
  expect(result).toEqual({
54
53
  type: "tool_result",
55
54
  toolUseId: "call-3",
@@ -70,7 +69,7 @@ describe("tool-executor", () => {
70
69
  },
71
70
  ],
72
71
  };
73
- const result = await (0, tool_executor_1.executeClientTool)(tool, "call-4", {});
72
+ const result = await (0, client_1.executeClientTool)(tool, "call-4", {});
74
73
  expect(result).toEqual({
75
74
  type: "tool_result",
76
75
  toolUseId: "call-4",
@@ -92,7 +91,7 @@ describe("tool-executor", () => {
92
91
  inputSchema: zod_1.z.object({}),
93
92
  outputSchema: zod_1.z.void(),
94
93
  };
95
- const result = await (0, tool_executor_1.executeClientTool)(tool, "call-5", {});
94
+ const result = await (0, client_1.executeClientTool)(tool, "call-5", {});
96
95
  expect(result).toEqual({
97
96
  type: "tool_result",
98
97
  toolUseId: "call-5",
@@ -110,7 +109,7 @@ describe("tool-executor", () => {
110
109
  inputSchema: zod_1.z.object({}),
111
110
  outputSchema: zod_1.z.void(),
112
111
  };
113
- const result = await (0, tool_executor_1.executeClientTool)(tool, "call-6", {});
112
+ const result = await (0, client_1.executeClientTool)(tool, "call-6", {});
114
113
  expect(result).toEqual({
115
114
  type: "tool_result",
116
115
  toolUseId: "call-6",
@@ -147,7 +146,7 @@ describe("tool-executor", () => {
147
146
  ["call-1", { name: "add", input: { a: 2, b: 3 } }],
148
147
  ["call-2", { name: "multiply", input: { a: 4, b: 5 } }],
149
148
  ]);
150
- const results = await (0, tool_executor_1.executeAllPendingTools)(toolCalls, registry);
149
+ const results = await (0, client_1.executeAllPendingTools)(toolCalls, registry);
151
150
  expect(results).toHaveLength(2);
152
151
  expect(results[0]).toEqual({
153
152
  type: "tool_result",
@@ -173,7 +172,7 @@ describe("tool-executor", () => {
173
172
  const toolCalls = new Map([
174
173
  ["call-1", { name: "greet", input: { name: "World" } }],
175
174
  ]);
176
- const results = await (0, tool_executor_1.executeAllPendingTools)(toolCalls, registry);
175
+ const results = await (0, client_1.executeAllPendingTools)(toolCalls, registry);
177
176
  expect(results).toHaveLength(1);
178
177
  expect(results[0]).toEqual({
179
178
  type: "tool_result",
@@ -186,7 +185,7 @@ describe("tool-executor", () => {
186
185
  const toolCalls = new Map([
187
186
  ["call-1", { name: "unknown_tool", input: {} }],
188
187
  ]);
189
- const results = await (0, tool_executor_1.executeAllPendingTools)(toolCalls, registry);
188
+ const results = await (0, client_1.executeAllPendingTools)(toolCalls, registry);
190
189
  expect(results).toHaveLength(1);
191
190
  expect(results[0]).toEqual({
192
191
  type: "tool_result",
@@ -214,7 +213,7 @@ describe("tool-executor", () => {
214
213
  ["call-1", { name: "known", input: {} }],
215
214
  ["call-2", { name: "unknown", input: {} }],
216
215
  ]);
217
- const results = await (0, tool_executor_1.executeAllPendingTools)(toolCalls, registry);
216
+ const results = await (0, client_1.executeAllPendingTools)(toolCalls, registry);
218
217
  expect(results).toHaveLength(2);
219
218
  expect(results[0].isError).toBeUndefined();
220
219
  expect(results[0].content[0]).toEqual({ type: "text", text: "success" });
@@ -227,7 +226,7 @@ describe("tool-executor", () => {
227
226
  });
228
227
  describe("executeStreamableToolCall", () => {
229
228
  function createTrackerWithToolCall(toolCallId, toolName) {
230
- const tracker = new tool_call_tracker_1.ToolCallTracker();
229
+ const tracker = new client_1.ToolCallTracker();
231
230
  tracker.handleEvent({
232
231
  type: core_1.EventType.TOOL_CALL_START,
233
232
  toolCallId,
@@ -254,7 +253,7 @@ describe("tool-executor", () => {
254
253
  },
255
254
  };
256
255
  const tracker = createTrackerWithToolCall("call_1", "write_story");
257
- await (0, tool_executor_1.executeStreamableToolCall)("call_1", { text: "hello" }, tracker, registry);
256
+ await (0, client_1.executeStreamableToolCall)("call_1", { text: "hello" }, tracker, registry);
258
257
  expect(toolFn).toHaveBeenCalledWith({ text: "hello" });
259
258
  });
260
259
  it("does NOT call tool when tamboStreamableHint is false", async () => {
@@ -270,7 +269,7 @@ describe("tool-executor", () => {
270
269
  },
271
270
  };
272
271
  const tracker = createTrackerWithToolCall("call_1", "write_story");
273
- await (0, tool_executor_1.executeStreamableToolCall)("call_1", { text: "hello" }, tracker, registry);
272
+ await (0, client_1.executeStreamableToolCall)("call_1", { text: "hello" }, tracker, registry);
274
273
  expect(toolFn).not.toHaveBeenCalled();
275
274
  });
276
275
  it("does NOT call tool when tamboStreamableHint is undefined", async () => {
@@ -285,14 +284,14 @@ describe("tool-executor", () => {
285
284
  },
286
285
  };
287
286
  const tracker = createTrackerWithToolCall("call_1", "write_story");
288
- await (0, tool_executor_1.executeStreamableToolCall)("call_1", { text: "hello" }, tracker, registry);
287
+ await (0, client_1.executeStreamableToolCall)("call_1", { text: "hello" }, tracker, registry);
289
288
  expect(toolFn).not.toHaveBeenCalled();
290
289
  });
291
290
  it("does NOT call tool when tool is not in registry", async () => {
292
291
  const registry = {};
293
292
  const tracker = createTrackerWithToolCall("call_1", "missing_tool");
294
293
  // Should not throw
295
- await (0, tool_executor_1.executeStreamableToolCall)("call_1", { text: "hello" }, tracker, registry);
294
+ await (0, client_1.executeStreamableToolCall)("call_1", { text: "hello" }, tracker, registry);
296
295
  });
297
296
  it("logs and swallows tool execution errors during streaming", async () => {
298
297
  const warnSpy = jest.spyOn(console, "warn").mockImplementation(() => { });
@@ -308,7 +307,7 @@ describe("tool-executor", () => {
308
307
  };
309
308
  const tracker = createTrackerWithToolCall("call_1", "write_story");
310
309
  // Should not throw
311
- await (0, tool_executor_1.executeStreamableToolCall)("call_1", { text: "hello" }, tracker, registry);
310
+ await (0, client_1.executeStreamableToolCall)("call_1", { text: "hello" }, tracker, registry);
312
311
  expect(warnSpy).toHaveBeenCalledTimes(1);
313
312
  const warningMessage = String(warnSpy.mock.calls[0]?.[0]);
314
313
  expect(warningMessage).toContain("write_story");
@@ -327,8 +326,8 @@ describe("tool-executor", () => {
327
326
  annotations: { tamboStreamableHint: true },
328
327
  },
329
328
  };
330
- const tracker = new tool_call_tracker_1.ToolCallTracker();
331
- await (0, tool_executor_1.executeStreamableToolCall)("nonexistent", { text: "hello" }, tracker, registry);
329
+ const tracker = new client_1.ToolCallTracker();
330
+ await (0, client_1.executeStreamableToolCall)("nonexistent", { text: "hello" }, tracker, registry);
332
331
  expect(toolFn).not.toHaveBeenCalled();
333
332
  });
334
333
  });
@@ -340,7 +339,7 @@ describe("tool-executor", () => {
340
339
  jest.useRealTimers();
341
340
  });
342
341
  function createTrackerWithToolCall(toolCallId, toolName) {
343
- const tracker = new tool_call_tracker_1.ToolCallTracker();
342
+ const tracker = new client_1.ToolCallTracker();
344
343
  tracker.handleEvent({
345
344
  type: core_1.EventType.TOOL_CALL_START,
346
345
  toolCallId,
@@ -367,7 +366,7 @@ describe("tool-executor", () => {
367
366
  },
368
367
  };
369
368
  const tracker = createTrackerWithToolCall("call_1", "write_story");
370
- const executor = (0, tool_executor_1.createThrottledStreamableExecutor)(tracker, registry, 100);
369
+ const executor = (0, client_1.createThrottledStreamableExecutor)(tracker, registry, 100);
371
370
  executor.schedule("call_1", { text: "hello" });
372
371
  // Leading edge: fires immediately
373
372
  expect(toolFn).toHaveBeenCalledTimes(1);
@@ -386,7 +385,7 @@ describe("tool-executor", () => {
386
385
  },
387
386
  };
388
387
  const tracker = createTrackerWithToolCall("call_1", "write_story");
389
- const executor = (0, tool_executor_1.createThrottledStreamableExecutor)(tracker, registry, 100);
388
+ const executor = (0, client_1.createThrottledStreamableExecutor)(tracker, registry, 100);
390
389
  executor.schedule("call_1", { text: "h" });
391
390
  // Leading edge fires immediately with first value
392
391
  expect(toolFn).toHaveBeenCalledTimes(1);
@@ -413,7 +412,7 @@ describe("tool-executor", () => {
413
412
  },
414
413
  };
415
414
  const tracker = createTrackerWithToolCall("call_1", "write_story");
416
- const executor = (0, tool_executor_1.createThrottledStreamableExecutor)(tracker, registry, 100);
415
+ const executor = (0, client_1.createThrottledStreamableExecutor)(tracker, registry, 100);
417
416
  executor.schedule("call_1", { text: "hello" });
418
417
  // Leading edge fires immediately
419
418
  expect(toolFn).toHaveBeenCalledTimes(1);
@@ -428,8 +427,8 @@ describe("tool-executor", () => {
428
427
  });
429
428
  it("flush() is a no-op when nothing is pending", () => {
430
429
  const registry = {};
431
- const tracker = new tool_call_tracker_1.ToolCallTracker();
432
- const executor = (0, tool_executor_1.createThrottledStreamableExecutor)(tracker, registry, 100);
430
+ const tracker = new client_1.ToolCallTracker();
431
+ const executor = (0, client_1.createThrottledStreamableExecutor)(tracker, registry, 100);
433
432
  // Should not throw
434
433
  executor.flush();
435
434
  });
@@ -1 +1 @@
1
- {"version":3,"file":"tool-executor.test.js","sourceRoot":"","sources":["../../../src/v1/utils/tool-executor.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventType } from \"@ag-ui/core\";\nimport { z } from \"zod\";\nimport type { TamboTool } from \"../../model/component-metadata\";\nimport {\n executeClientTool,\n executeAllPendingTools,\n executeStreamableToolCall,\n createThrottledStreamableExecutor,\n type PendingToolCall,\n} from \"./tool-executor\";\nimport { ToolCallTracker } from \"./tool-call-tracker\";\n\ndescribe(\"tool-executor\", () => {\n describe(\"executeClientTool\", () => {\n it(\"executes a tool and returns text result\", async () => {\n const tool: TamboTool = {\n name: \"get_weather\",\n description: \"Gets weather\",\n tool: async ({ city }: { city: string }) =>\n `Weather in ${city} is sunny`,\n inputSchema: z.object({ city: z.string() }),\n outputSchema: z.string(),\n };\n\n const result = await executeClientTool(tool, \"call-1\", {\n city: \"Seattle\",\n });\n\n expect(result).toEqual({\n type: \"tool_result\",\n toolUseId: \"call-1\",\n content: [{ type: \"text\", text: \"Weather in Seattle is sunny\" }],\n });\n });\n\n it(\"stringifies non-string results\", async () => {\n const tool: TamboTool = {\n name: \"get_data\",\n description: \"Gets data\",\n tool: async () => ({ value: 42 }),\n inputSchema: z.object({}),\n outputSchema: z.object({ value: z.number() }),\n };\n\n const result = await executeClientTool(tool, \"call-2\", {});\n\n expect(result).toEqual({\n type: \"tool_result\",\n toolUseId: \"call-2\",\n content: [{ type: \"text\", text: '{\"value\":42}' }],\n });\n });\n\n it(\"uses transformToContent when provided\", async () => {\n const tool: TamboTool = {\n name: \"custom_tool\",\n description: \"Custom tool\",\n tool: async () => \"custom result\",\n inputSchema: z.object({}),\n outputSchema: z.string(),\n transformToContent: (result) => [\n { type: \"text\", text: `Transformed: ${result}` },\n ],\n };\n\n const result = await executeClientTool(tool, \"call-3\", {});\n\n expect(result).toEqual({\n type: \"tool_result\",\n toolUseId: \"call-3\",\n content: [{ type: \"text\", text: \"Transformed: custom result\" }],\n });\n });\n\n it(\"handles transformToContent with non-text types by stringifying\", async () => {\n const tool: TamboTool = {\n name: \"image_tool\",\n description: \"Image tool\",\n tool: async () => \"image data\",\n inputSchema: z.object({}),\n outputSchema: z.string(),\n transformToContent: () => [\n {\n type: \"image_url\",\n image_url: { url: \"https://example.com/image.png\" },\n },\n ],\n };\n\n const result = await executeClientTool(tool, \"call-4\", {});\n\n expect(result).toEqual({\n type: \"tool_result\",\n toolUseId: \"call-4\",\n content: [\n {\n type: \"text\",\n text: '{\"type\":\"image_url\",\"image_url\":{\"url\":\"https://example.com/image.png\"}}',\n },\n ],\n });\n });\n\n it(\"handles tool execution errors gracefully\", async () => {\n const tool: TamboTool = {\n name: \"failing_tool\",\n description: \"A tool that fails\",\n tool: async () => {\n throw new Error(\"Tool failed!\");\n },\n inputSchema: z.object({}),\n outputSchema: z.void(),\n };\n\n const result = await executeClientTool(tool, \"call-5\", {});\n\n expect(result).toEqual({\n type: \"tool_result\",\n toolUseId: \"call-5\",\n isError: true,\n content: [{ type: \"text\", text: \"Tool failed!\" }],\n });\n });\n\n it(\"handles non-Error throws gracefully\", async () => {\n const tool: TamboTool = {\n name: \"throwing_tool\",\n description: \"A tool that throws a string\",\n tool: async () => {\n throw \"string error\";\n },\n inputSchema: z.object({}),\n outputSchema: z.void(),\n };\n\n const result = await executeClientTool(tool, \"call-6\", {});\n\n expect(result).toEqual({\n type: \"tool_result\",\n toolUseId: \"call-6\",\n isError: true,\n content: [{ type: \"text\", text: \"Tool execution failed\" }],\n });\n });\n });\n\n describe(\"executeAllPendingTools\", () => {\n it(\"executes multiple tools with Map registry\", async () => {\n const registry = new Map<string, TamboTool>([\n [\n \"add\",\n {\n name: \"add\",\n description: \"Adds numbers\",\n tool: async ({ a, b }: { a: number; b: number }) => a + b,\n inputSchema: z.object({ a: z.number(), b: z.number() }),\n outputSchema: z.number(),\n },\n ],\n [\n \"multiply\",\n {\n name: \"multiply\",\n description: \"Multiplies numbers\",\n tool: async ({ a, b }: { a: number; b: number }) => a * b,\n inputSchema: z.object({ a: z.number(), b: z.number() }),\n outputSchema: z.number(),\n },\n ],\n ]);\n\n const toolCalls = new Map<string, PendingToolCall>([\n [\"call-1\", { name: \"add\", input: { a: 2, b: 3 } }],\n [\"call-2\", { name: \"multiply\", input: { a: 4, b: 5 } }],\n ]);\n\n const results = await executeAllPendingTools(toolCalls, registry);\n\n expect(results).toHaveLength(2);\n expect(results[0]).toEqual({\n type: \"tool_result\",\n toolUseId: \"call-1\",\n content: [{ type: \"text\", text: \"5\" }],\n });\n expect(results[1]).toEqual({\n type: \"tool_result\",\n toolUseId: \"call-2\",\n content: [{ type: \"text\", text: \"20\" }],\n });\n });\n\n it(\"executes tools with Record registry\", async () => {\n const registry: Record<string, TamboTool> = {\n greet: {\n name: \"greet\",\n description: \"Greets user\",\n tool: async ({ name }: { name: string }) => `Hello, ${name}!`,\n inputSchema: z.object({ name: z.string() }),\n outputSchema: z.string(),\n },\n };\n\n const toolCalls = new Map<string, PendingToolCall>([\n [\"call-1\", { name: \"greet\", input: { name: \"World\" } }],\n ]);\n\n const results = await executeAllPendingTools(toolCalls, registry);\n\n expect(results).toHaveLength(1);\n expect(results[0]).toEqual({\n type: \"tool_result\",\n toolUseId: \"call-1\",\n content: [{ type: \"text\", text: \"Hello, World!\" }],\n });\n });\n\n it(\"returns error result for unknown tools\", async () => {\n const registry = new Map<string, TamboTool>();\n\n const toolCalls = new Map<string, PendingToolCall>([\n [\"call-1\", { name: \"unknown_tool\", input: {} }],\n ]);\n\n const results = await executeAllPendingTools(toolCalls, registry);\n\n expect(results).toHaveLength(1);\n expect(results[0]).toEqual({\n type: \"tool_result\",\n toolUseId: \"call-1\",\n isError: true,\n content: [\n { type: \"text\", text: 'Tool \"unknown_tool\" not found in registry' },\n ],\n });\n });\n\n it(\"handles mixed known and unknown tools\", async () => {\n const registry = new Map<string, TamboTool>([\n [\n \"known\",\n {\n name: \"known\",\n description: \"Known tool\",\n tool: async () => \"success\",\n inputSchema: z.object({}),\n outputSchema: z.string(),\n },\n ],\n ]);\n\n const toolCalls = new Map<string, PendingToolCall>([\n [\"call-1\", { name: \"known\", input: {} }],\n [\"call-2\", { name: \"unknown\", input: {} }],\n ]);\n\n const results = await executeAllPendingTools(toolCalls, registry);\n\n expect(results).toHaveLength(2);\n expect(results[0].isError).toBeUndefined();\n expect(results[0].content[0]).toEqual({ type: \"text\", text: \"success\" });\n expect(results[1].isError).toBe(true);\n expect(results[1].content[0]).toEqual({\n type: \"text\",\n text: 'Tool \"unknown\" not found in registry',\n });\n });\n });\n\n describe(\"executeStreamableToolCall\", () => {\n function createTrackerWithToolCall(\n toolCallId: string,\n toolName: string,\n ): ToolCallTracker {\n const tracker = new ToolCallTracker();\n tracker.handleEvent({\n type: EventType.TOOL_CALL_START,\n toolCallId,\n toolCallName: toolName,\n parentMessageId: \"msg_1\",\n });\n tracker.handleEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId,\n delta: '{\"text\":\"hello\"}',\n });\n return tracker;\n }\n\n it(\"calls tool when tamboStreamableHint is true\", async () => {\n const toolFn = jest.fn().mockResolvedValue(undefined);\n const registry: Record<string, TamboTool> = {\n write_story: {\n name: \"write_story\",\n description: \"Writes a story\",\n tool: toolFn,\n inputSchema: z.object({ text: z.string() }),\n outputSchema: z.void(),\n annotations: { tamboStreamableHint: true },\n },\n };\n\n const tracker = createTrackerWithToolCall(\"call_1\", \"write_story\");\n await executeStreamableToolCall(\n \"call_1\",\n { text: \"hello\" },\n tracker,\n registry,\n );\n\n expect(toolFn).toHaveBeenCalledWith({ text: \"hello\" });\n });\n\n it(\"does NOT call tool when tamboStreamableHint is false\", async () => {\n const toolFn = jest.fn().mockResolvedValue(undefined);\n const registry: Record<string, TamboTool> = {\n write_story: {\n name: \"write_story\",\n description: \"Writes a story\",\n tool: toolFn,\n inputSchema: z.object({ text: z.string() }),\n outputSchema: z.void(),\n annotations: { tamboStreamableHint: false },\n },\n };\n\n const tracker = createTrackerWithToolCall(\"call_1\", \"write_story\");\n await executeStreamableToolCall(\n \"call_1\",\n { text: \"hello\" },\n tracker,\n registry,\n );\n\n expect(toolFn).not.toHaveBeenCalled();\n });\n\n it(\"does NOT call tool when tamboStreamableHint is undefined\", async () => {\n const toolFn = jest.fn().mockResolvedValue(undefined);\n const registry: Record<string, TamboTool> = {\n write_story: {\n name: \"write_story\",\n description: \"Writes a story\",\n tool: toolFn,\n inputSchema: z.object({ text: z.string() }),\n outputSchema: z.void(),\n },\n };\n\n const tracker = createTrackerWithToolCall(\"call_1\", \"write_story\");\n await executeStreamableToolCall(\n \"call_1\",\n { text: \"hello\" },\n tracker,\n registry,\n );\n\n expect(toolFn).not.toHaveBeenCalled();\n });\n\n it(\"does NOT call tool when tool is not in registry\", async () => {\n const registry: Record<string, TamboTool> = {};\n const tracker = createTrackerWithToolCall(\"call_1\", \"missing_tool\");\n\n // Should not throw\n await executeStreamableToolCall(\n \"call_1\",\n { text: \"hello\" },\n tracker,\n registry,\n );\n });\n\n it(\"logs and swallows tool execution errors during streaming\", async () => {\n const warnSpy = jest.spyOn(console, \"warn\").mockImplementation(() => {});\n const registry: Record<string, TamboTool> = {\n write_story: {\n name: \"write_story\",\n description: \"Writes a story\",\n tool: jest.fn().mockRejectedValue(new Error(\"tool error\")),\n inputSchema: z.object({ text: z.string() }),\n outputSchema: z.void(),\n annotations: { tamboStreamableHint: true },\n },\n };\n\n const tracker = createTrackerWithToolCall(\"call_1\", \"write_story\");\n\n // Should not throw\n await executeStreamableToolCall(\n \"call_1\",\n { text: \"hello\" },\n tracker,\n registry,\n );\n\n expect(warnSpy).toHaveBeenCalledTimes(1);\n const warningMessage = String(warnSpy.mock.calls[0]?.[0]);\n expect(warningMessage).toContain(\"write_story\");\n expect(warningMessage).toContain(\"call_1\");\n warnSpy.mockRestore();\n });\n\n it(\"returns early when tool call ID is not being tracked\", async () => {\n const toolFn = jest.fn();\n const registry: Record<string, TamboTool> = {\n write_story: {\n name: \"write_story\",\n description: \"Writes a story\",\n tool: toolFn,\n inputSchema: z.object({ text: z.string() }),\n outputSchema: z.void(),\n annotations: { tamboStreamableHint: true },\n },\n };\n\n const tracker = new ToolCallTracker();\n await executeStreamableToolCall(\n \"nonexistent\",\n { text: \"hello\" },\n tracker,\n registry,\n );\n\n expect(toolFn).not.toHaveBeenCalled();\n });\n });\n\n describe(\"createThrottledStreamableExecutor\", () => {\n beforeEach(() => {\n jest.useFakeTimers();\n });\n\n afterEach(() => {\n jest.useRealTimers();\n });\n\n function createTrackerWithToolCall(\n toolCallId: string,\n toolName: string,\n ): ToolCallTracker {\n const tracker = new ToolCallTracker();\n tracker.handleEvent({\n type: EventType.TOOL_CALL_START,\n toolCallId,\n toolCallName: toolName,\n parentMessageId: \"msg_1\",\n });\n tracker.handleEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId,\n delta: '{\"text\":\"hello\"}',\n });\n return tracker;\n }\n\n it(\"fires immediately on the leading edge\", () => {\n const toolFn = jest.fn().mockResolvedValue(undefined);\n const registry: Record<string, TamboTool> = {\n write_story: {\n name: \"write_story\",\n description: \"Writes a story\",\n tool: toolFn,\n inputSchema: z.object({ text: z.string() }),\n outputSchema: z.void(),\n annotations: { tamboStreamableHint: true },\n },\n };\n\n const tracker = createTrackerWithToolCall(\"call_1\", \"write_story\");\n const executor = createThrottledStreamableExecutor(\n tracker,\n registry,\n 100,\n );\n\n executor.schedule(\"call_1\", { text: \"hello\" });\n // Leading edge: fires immediately\n expect(toolFn).toHaveBeenCalledTimes(1);\n expect(toolFn).toHaveBeenCalledWith({ text: \"hello\" });\n });\n\n it(\"collapses rapid calls, fires leading then trailing with latest args\", () => {\n const toolFn = jest.fn().mockResolvedValue(undefined);\n const registry: Record<string, TamboTool> = {\n write_story: {\n name: \"write_story\",\n description: \"Writes a story\",\n tool: toolFn,\n inputSchema: z.object({ text: z.string() }),\n outputSchema: z.void(),\n annotations: { tamboStreamableHint: true },\n },\n };\n\n const tracker = createTrackerWithToolCall(\"call_1\", \"write_story\");\n const executor = createThrottledStreamableExecutor(\n tracker,\n registry,\n 100,\n );\n\n executor.schedule(\"call_1\", { text: \"h\" });\n // Leading edge fires immediately with first value\n expect(toolFn).toHaveBeenCalledTimes(1);\n expect(toolFn).toHaveBeenCalledWith({ text: \"h\" });\n\n jest.advanceTimersByTime(50);\n executor.schedule(\"call_1\", { text: \"he\" });\n jest.advanceTimersByTime(50);\n executor.schedule(\"call_1\", { text: \"hel\" });\n jest.advanceTimersByTime(100);\n\n // Trailing edge fires with latest value after cooldown\n expect(toolFn).toHaveBeenCalledTimes(3);\n expect(toolFn).toHaveBeenLastCalledWith({ text: \"hel\" });\n });\n\n it(\"flush() executes pending trailing calls immediately\", () => {\n const toolFn = jest.fn().mockResolvedValue(undefined);\n const registry: Record<string, TamboTool> = {\n write_story: {\n name: \"write_story\",\n description: \"Writes a story\",\n tool: toolFn,\n inputSchema: z.object({ text: z.string() }),\n outputSchema: z.void(),\n annotations: { tamboStreamableHint: true },\n },\n };\n\n const tracker = createTrackerWithToolCall(\"call_1\", \"write_story\");\n const executor = createThrottledStreamableExecutor(\n tracker,\n registry,\n 100,\n );\n\n executor.schedule(\"call_1\", { text: \"hello\" });\n // Leading edge fires immediately\n expect(toolFn).toHaveBeenCalledTimes(1);\n\n executor.schedule(\"call_1\", { text: \"hello world\" });\n executor.flush();\n // Trailing fires with latest value\n expect(toolFn).toHaveBeenCalledTimes(2);\n expect(toolFn).toHaveBeenLastCalledWith({ text: \"hello world\" });\n\n // Timer should be cancelled — advancing should not fire again\n jest.advanceTimersByTime(200);\n expect(toolFn).toHaveBeenCalledTimes(2);\n });\n\n it(\"flush() is a no-op when nothing is pending\", () => {\n const registry: Record<string, TamboTool> = {};\n const tracker = new ToolCallTracker();\n const executor = createThrottledStreamableExecutor(\n tracker,\n registry,\n 100,\n );\n\n // Should not throw\n executor.flush();\n });\n });\n});\n"]}
1
+ {"version":3,"file":"tool-executor.test.js","sourceRoot":"","sources":["../../../src/v1/utils/tool-executor.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventType } from \"@ag-ui/core\";\nimport { z } from \"zod\";\nimport type { TamboTool } from \"../../model/component-metadata\";\nimport {\n executeClientTool,\n executeAllPendingTools,\n executeStreamableToolCall,\n createThrottledStreamableExecutor,\n type PendingToolCall,\n ToolCallTracker,\n} from \"@tambo-ai/client\";\n\ndescribe(\"tool-executor\", () => {\n describe(\"executeClientTool\", () => {\n it(\"executes a tool and returns text result\", async () => {\n const tool: TamboTool = {\n name: \"get_weather\",\n description: \"Gets weather\",\n tool: async ({ city }: { city: string }) =>\n `Weather in ${city} is sunny`,\n inputSchema: z.object({ city: z.string() }),\n outputSchema: z.string(),\n };\n\n const result = await executeClientTool(tool, \"call-1\", {\n city: \"Seattle\",\n });\n\n expect(result).toEqual({\n type: \"tool_result\",\n toolUseId: \"call-1\",\n content: [{ type: \"text\", text: \"Weather in Seattle is sunny\" }],\n });\n });\n\n it(\"stringifies non-string results\", async () => {\n const tool: TamboTool = {\n name: \"get_data\",\n description: \"Gets data\",\n tool: async () => ({ value: 42 }),\n inputSchema: z.object({}),\n outputSchema: z.object({ value: z.number() }),\n };\n\n const result = await executeClientTool(tool, \"call-2\", {});\n\n expect(result).toEqual({\n type: \"tool_result\",\n toolUseId: \"call-2\",\n content: [{ type: \"text\", text: '{\"value\":42}' }],\n });\n });\n\n it(\"uses transformToContent when provided\", async () => {\n const tool: TamboTool = {\n name: \"custom_tool\",\n description: \"Custom tool\",\n tool: async () => \"custom result\",\n inputSchema: z.object({}),\n outputSchema: z.string(),\n transformToContent: (result) => [\n { type: \"text\", text: `Transformed: ${result}` },\n ],\n };\n\n const result = await executeClientTool(tool, \"call-3\", {});\n\n expect(result).toEqual({\n type: \"tool_result\",\n toolUseId: \"call-3\",\n content: [{ type: \"text\", text: \"Transformed: custom result\" }],\n });\n });\n\n it(\"handles transformToContent with non-text types by stringifying\", async () => {\n const tool: TamboTool = {\n name: \"image_tool\",\n description: \"Image tool\",\n tool: async () => \"image data\",\n inputSchema: z.object({}),\n outputSchema: z.string(),\n transformToContent: () => [\n {\n type: \"image_url\",\n image_url: { url: \"https://example.com/image.png\" },\n },\n ],\n };\n\n const result = await executeClientTool(tool, \"call-4\", {});\n\n expect(result).toEqual({\n type: \"tool_result\",\n toolUseId: \"call-4\",\n content: [\n {\n type: \"text\",\n text: '{\"type\":\"image_url\",\"image_url\":{\"url\":\"https://example.com/image.png\"}}',\n },\n ],\n });\n });\n\n it(\"handles tool execution errors gracefully\", async () => {\n const tool: TamboTool = {\n name: \"failing_tool\",\n description: \"A tool that fails\",\n tool: async () => {\n throw new Error(\"Tool failed!\");\n },\n inputSchema: z.object({}),\n outputSchema: z.void(),\n };\n\n const result = await executeClientTool(tool, \"call-5\", {});\n\n expect(result).toEqual({\n type: \"tool_result\",\n toolUseId: \"call-5\",\n isError: true,\n content: [{ type: \"text\", text: \"Tool failed!\" }],\n });\n });\n\n it(\"handles non-Error throws gracefully\", async () => {\n const tool: TamboTool = {\n name: \"throwing_tool\",\n description: \"A tool that throws a string\",\n tool: async () => {\n throw \"string error\";\n },\n inputSchema: z.object({}),\n outputSchema: z.void(),\n };\n\n const result = await executeClientTool(tool, \"call-6\", {});\n\n expect(result).toEqual({\n type: \"tool_result\",\n toolUseId: \"call-6\",\n isError: true,\n content: [{ type: \"text\", text: \"Tool execution failed\" }],\n });\n });\n });\n\n describe(\"executeAllPendingTools\", () => {\n it(\"executes multiple tools with Map registry\", async () => {\n const registry = new Map<string, TamboTool>([\n [\n \"add\",\n {\n name: \"add\",\n description: \"Adds numbers\",\n tool: async ({ a, b }: { a: number; b: number }) => a + b,\n inputSchema: z.object({ a: z.number(), b: z.number() }),\n outputSchema: z.number(),\n },\n ],\n [\n \"multiply\",\n {\n name: \"multiply\",\n description: \"Multiplies numbers\",\n tool: async ({ a, b }: { a: number; b: number }) => a * b,\n inputSchema: z.object({ a: z.number(), b: z.number() }),\n outputSchema: z.number(),\n },\n ],\n ]);\n\n const toolCalls = new Map<string, PendingToolCall>([\n [\"call-1\", { name: \"add\", input: { a: 2, b: 3 } }],\n [\"call-2\", { name: \"multiply\", input: { a: 4, b: 5 } }],\n ]);\n\n const results = await executeAllPendingTools(toolCalls, registry);\n\n expect(results).toHaveLength(2);\n expect(results[0]).toEqual({\n type: \"tool_result\",\n toolUseId: \"call-1\",\n content: [{ type: \"text\", text: \"5\" }],\n });\n expect(results[1]).toEqual({\n type: \"tool_result\",\n toolUseId: \"call-2\",\n content: [{ type: \"text\", text: \"20\" }],\n });\n });\n\n it(\"executes tools with Record registry\", async () => {\n const registry: Record<string, TamboTool> = {\n greet: {\n name: \"greet\",\n description: \"Greets user\",\n tool: async ({ name }: { name: string }) => `Hello, ${name}!`,\n inputSchema: z.object({ name: z.string() }),\n outputSchema: z.string(),\n },\n };\n\n const toolCalls = new Map<string, PendingToolCall>([\n [\"call-1\", { name: \"greet\", input: { name: \"World\" } }],\n ]);\n\n const results = await executeAllPendingTools(toolCalls, registry);\n\n expect(results).toHaveLength(1);\n expect(results[0]).toEqual({\n type: \"tool_result\",\n toolUseId: \"call-1\",\n content: [{ type: \"text\", text: \"Hello, World!\" }],\n });\n });\n\n it(\"returns error result for unknown tools\", async () => {\n const registry = new Map<string, TamboTool>();\n\n const toolCalls = new Map<string, PendingToolCall>([\n [\"call-1\", { name: \"unknown_tool\", input: {} }],\n ]);\n\n const results = await executeAllPendingTools(toolCalls, registry);\n\n expect(results).toHaveLength(1);\n expect(results[0]).toEqual({\n type: \"tool_result\",\n toolUseId: \"call-1\",\n isError: true,\n content: [\n { type: \"text\", text: 'Tool \"unknown_tool\" not found in registry' },\n ],\n });\n });\n\n it(\"handles mixed known and unknown tools\", async () => {\n const registry = new Map<string, TamboTool>([\n [\n \"known\",\n {\n name: \"known\",\n description: \"Known tool\",\n tool: async () => \"success\",\n inputSchema: z.object({}),\n outputSchema: z.string(),\n },\n ],\n ]);\n\n const toolCalls = new Map<string, PendingToolCall>([\n [\"call-1\", { name: \"known\", input: {} }],\n [\"call-2\", { name: \"unknown\", input: {} }],\n ]);\n\n const results = await executeAllPendingTools(toolCalls, registry);\n\n expect(results).toHaveLength(2);\n expect(results[0].isError).toBeUndefined();\n expect(results[0].content[0]).toEqual({ type: \"text\", text: \"success\" });\n expect(results[1].isError).toBe(true);\n expect(results[1].content[0]).toEqual({\n type: \"text\",\n text: 'Tool \"unknown\" not found in registry',\n });\n });\n });\n\n describe(\"executeStreamableToolCall\", () => {\n function createTrackerWithToolCall(\n toolCallId: string,\n toolName: string,\n ): ToolCallTracker {\n const tracker = new ToolCallTracker();\n tracker.handleEvent({\n type: EventType.TOOL_CALL_START,\n toolCallId,\n toolCallName: toolName,\n parentMessageId: \"msg_1\",\n });\n tracker.handleEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId,\n delta: '{\"text\":\"hello\"}',\n });\n return tracker;\n }\n\n it(\"calls tool when tamboStreamableHint is true\", async () => {\n const toolFn = jest.fn().mockResolvedValue(undefined);\n const registry: Record<string, TamboTool> = {\n write_story: {\n name: \"write_story\",\n description: \"Writes a story\",\n tool: toolFn,\n inputSchema: z.object({ text: z.string() }),\n outputSchema: z.void(),\n annotations: { tamboStreamableHint: true },\n },\n };\n\n const tracker = createTrackerWithToolCall(\"call_1\", \"write_story\");\n await executeStreamableToolCall(\n \"call_1\",\n { text: \"hello\" },\n tracker,\n registry,\n );\n\n expect(toolFn).toHaveBeenCalledWith({ text: \"hello\" });\n });\n\n it(\"does NOT call tool when tamboStreamableHint is false\", async () => {\n const toolFn = jest.fn().mockResolvedValue(undefined);\n const registry: Record<string, TamboTool> = {\n write_story: {\n name: \"write_story\",\n description: \"Writes a story\",\n tool: toolFn,\n inputSchema: z.object({ text: z.string() }),\n outputSchema: z.void(),\n annotations: { tamboStreamableHint: false },\n },\n };\n\n const tracker = createTrackerWithToolCall(\"call_1\", \"write_story\");\n await executeStreamableToolCall(\n \"call_1\",\n { text: \"hello\" },\n tracker,\n registry,\n );\n\n expect(toolFn).not.toHaveBeenCalled();\n });\n\n it(\"does NOT call tool when tamboStreamableHint is undefined\", async () => {\n const toolFn = jest.fn().mockResolvedValue(undefined);\n const registry: Record<string, TamboTool> = {\n write_story: {\n name: \"write_story\",\n description: \"Writes a story\",\n tool: toolFn,\n inputSchema: z.object({ text: z.string() }),\n outputSchema: z.void(),\n },\n };\n\n const tracker = createTrackerWithToolCall(\"call_1\", \"write_story\");\n await executeStreamableToolCall(\n \"call_1\",\n { text: \"hello\" },\n tracker,\n registry,\n );\n\n expect(toolFn).not.toHaveBeenCalled();\n });\n\n it(\"does NOT call tool when tool is not in registry\", async () => {\n const registry: Record<string, TamboTool> = {};\n const tracker = createTrackerWithToolCall(\"call_1\", \"missing_tool\");\n\n // Should not throw\n await executeStreamableToolCall(\n \"call_1\",\n { text: \"hello\" },\n tracker,\n registry,\n );\n });\n\n it(\"logs and swallows tool execution errors during streaming\", async () => {\n const warnSpy = jest.spyOn(console, \"warn\").mockImplementation(() => {});\n const registry: Record<string, TamboTool> = {\n write_story: {\n name: \"write_story\",\n description: \"Writes a story\",\n tool: jest.fn().mockRejectedValue(new Error(\"tool error\")),\n inputSchema: z.object({ text: z.string() }),\n outputSchema: z.void(),\n annotations: { tamboStreamableHint: true },\n },\n };\n\n const tracker = createTrackerWithToolCall(\"call_1\", \"write_story\");\n\n // Should not throw\n await executeStreamableToolCall(\n \"call_1\",\n { text: \"hello\" },\n tracker,\n registry,\n );\n\n expect(warnSpy).toHaveBeenCalledTimes(1);\n const warningMessage = String(warnSpy.mock.calls[0]?.[0]);\n expect(warningMessage).toContain(\"write_story\");\n expect(warningMessage).toContain(\"call_1\");\n warnSpy.mockRestore();\n });\n\n it(\"returns early when tool call ID is not being tracked\", async () => {\n const toolFn = jest.fn();\n const registry: Record<string, TamboTool> = {\n write_story: {\n name: \"write_story\",\n description: \"Writes a story\",\n tool: toolFn,\n inputSchema: z.object({ text: z.string() }),\n outputSchema: z.void(),\n annotations: { tamboStreamableHint: true },\n },\n };\n\n const tracker = new ToolCallTracker();\n await executeStreamableToolCall(\n \"nonexistent\",\n { text: \"hello\" },\n tracker,\n registry,\n );\n\n expect(toolFn).not.toHaveBeenCalled();\n });\n });\n\n describe(\"createThrottledStreamableExecutor\", () => {\n beforeEach(() => {\n jest.useFakeTimers();\n });\n\n afterEach(() => {\n jest.useRealTimers();\n });\n\n function createTrackerWithToolCall(\n toolCallId: string,\n toolName: string,\n ): ToolCallTracker {\n const tracker = new ToolCallTracker();\n tracker.handleEvent({\n type: EventType.TOOL_CALL_START,\n toolCallId,\n toolCallName: toolName,\n parentMessageId: \"msg_1\",\n });\n tracker.handleEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId,\n delta: '{\"text\":\"hello\"}',\n });\n return tracker;\n }\n\n it(\"fires immediately on the leading edge\", () => {\n const toolFn = jest.fn().mockResolvedValue(undefined);\n const registry: Record<string, TamboTool> = {\n write_story: {\n name: \"write_story\",\n description: \"Writes a story\",\n tool: toolFn,\n inputSchema: z.object({ text: z.string() }),\n outputSchema: z.void(),\n annotations: { tamboStreamableHint: true },\n },\n };\n\n const tracker = createTrackerWithToolCall(\"call_1\", \"write_story\");\n const executor = createThrottledStreamableExecutor(\n tracker,\n registry,\n 100,\n );\n\n executor.schedule(\"call_1\", { text: \"hello\" });\n // Leading edge: fires immediately\n expect(toolFn).toHaveBeenCalledTimes(1);\n expect(toolFn).toHaveBeenCalledWith({ text: \"hello\" });\n });\n\n it(\"collapses rapid calls, fires leading then trailing with latest args\", () => {\n const toolFn = jest.fn().mockResolvedValue(undefined);\n const registry: Record<string, TamboTool> = {\n write_story: {\n name: \"write_story\",\n description: \"Writes a story\",\n tool: toolFn,\n inputSchema: z.object({ text: z.string() }),\n outputSchema: z.void(),\n annotations: { tamboStreamableHint: true },\n },\n };\n\n const tracker = createTrackerWithToolCall(\"call_1\", \"write_story\");\n const executor = createThrottledStreamableExecutor(\n tracker,\n registry,\n 100,\n );\n\n executor.schedule(\"call_1\", { text: \"h\" });\n // Leading edge fires immediately with first value\n expect(toolFn).toHaveBeenCalledTimes(1);\n expect(toolFn).toHaveBeenCalledWith({ text: \"h\" });\n\n jest.advanceTimersByTime(50);\n executor.schedule(\"call_1\", { text: \"he\" });\n jest.advanceTimersByTime(50);\n executor.schedule(\"call_1\", { text: \"hel\" });\n jest.advanceTimersByTime(100);\n\n // Trailing edge fires with latest value after cooldown\n expect(toolFn).toHaveBeenCalledTimes(3);\n expect(toolFn).toHaveBeenLastCalledWith({ text: \"hel\" });\n });\n\n it(\"flush() executes pending trailing calls immediately\", () => {\n const toolFn = jest.fn().mockResolvedValue(undefined);\n const registry: Record<string, TamboTool> = {\n write_story: {\n name: \"write_story\",\n description: \"Writes a story\",\n tool: toolFn,\n inputSchema: z.object({ text: z.string() }),\n outputSchema: z.void(),\n annotations: { tamboStreamableHint: true },\n },\n };\n\n const tracker = createTrackerWithToolCall(\"call_1\", \"write_story\");\n const executor = createThrottledStreamableExecutor(\n tracker,\n registry,\n 100,\n );\n\n executor.schedule(\"call_1\", { text: \"hello\" });\n // Leading edge fires immediately\n expect(toolFn).toHaveBeenCalledTimes(1);\n\n executor.schedule(\"call_1\", { text: \"hello world\" });\n executor.flush();\n // Trailing fires with latest value\n expect(toolFn).toHaveBeenCalledTimes(2);\n expect(toolFn).toHaveBeenLastCalledWith({ text: \"hello world\" });\n\n // Timer should be cancelled — advancing should not fire again\n jest.advanceTimersByTime(200);\n expect(toolFn).toHaveBeenCalledTimes(2);\n });\n\n it(\"flush() is a no-op when nothing is pending\", () => {\n const registry: Record<string, TamboTool> = {};\n const tracker = new ToolCallTracker();\n const executor = createThrottledStreamableExecutor(\n tracker,\n registry,\n 100,\n );\n\n // Should not throw\n executor.flush();\n });\n });\n});\n"]}
@@ -1,16 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- const unstrictify_1 = require("./unstrictify");
3
+ const client_1 = require("@tambo-ai/client");
4
4
  describe("canBeNull", () => {
5
5
  it("should return true for schema with type null", () => {
6
6
  const schema = { type: "null" };
7
- expect((0, unstrictify_1.canBeNull)(schema)).toBe(true);
7
+ expect((0, client_1.canBeNull)(schema)).toBe(true);
8
8
  });
9
9
  it("should return true for schema with anyOf containing type null", () => {
10
10
  const schema = {
11
11
  anyOf: [{ type: "string" }, { type: "null" }],
12
12
  };
13
- expect((0, unstrictify_1.canBeNull)(schema)).toBe(true);
13
+ expect((0, client_1.canBeNull)(schema)).toBe(true);
14
14
  });
15
15
  it("should return true for deeply nested anyOf containing type null", () => {
16
16
  const schema = {
@@ -21,21 +21,21 @@ describe("canBeNull", () => {
21
21
  },
22
22
  ],
23
23
  };
24
- expect((0, unstrictify_1.canBeNull)(schema)).toBe(true);
24
+ expect((0, client_1.canBeNull)(schema)).toBe(true);
25
25
  });
26
26
  it("should return false for non-object schema", () => {
27
- expect((0, unstrictify_1.canBeNull)(true)).toBe(false);
28
- expect((0, unstrictify_1.canBeNull)("string")).toBe(false);
27
+ expect((0, client_1.canBeNull)(true)).toBe(false);
28
+ expect((0, client_1.canBeNull)("string")).toBe(false);
29
29
  });
30
30
  it("should return false for schema without null type", () => {
31
31
  const schema = { type: "string" };
32
- expect((0, unstrictify_1.canBeNull)(schema)).toBe(false);
32
+ expect((0, client_1.canBeNull)(schema)).toBe(false);
33
33
  });
34
34
  it("should return false for schema with anyOf not containing null type", () => {
35
35
  const schema = {
36
36
  anyOf: [{ type: "string" }, { type: "number" }],
37
37
  };
38
- expect((0, unstrictify_1.canBeNull)(schema)).toBe(false);
38
+ expect((0, client_1.canBeNull)(schema)).toBe(false);
39
39
  });
40
40
  });
41
41
  describe("unstrictifyToolCallParamsFromSchema", () => {
@@ -48,7 +48,7 @@ describe("unstrictifyToolCallParamsFromSchema", () => {
48
48
  },
49
49
  required: ["name"],
50
50
  };
51
- const result = (0, unstrictify_1.unstrictifyToolCallParamsFromSchema)(schema, {
51
+ const result = (0, client_1.unstrictifyToolCallParamsFromSchema)(schema, {
52
52
  name: "John",
53
53
  age: null,
54
54
  });
@@ -62,7 +62,7 @@ describe("unstrictifyToolCallParamsFromSchema", () => {
62
62
  },
63
63
  required: ["name"],
64
64
  };
65
- const result = (0, unstrictify_1.unstrictifyToolCallParamsFromSchema)(schema, {
65
+ const result = (0, client_1.unstrictifyToolCallParamsFromSchema)(schema, {
66
66
  name: "John",
67
67
  _tambo_statusMessage: "Processing...",
68
68
  _tambo_displayMessage: "Hello",
@@ -88,7 +88,7 @@ describe("unstrictifyToolCallParamsFromSchema", () => {
88
88
  },
89
89
  required: ["user"],
90
90
  };
91
- const result = (0, unstrictify_1.unstrictifyToolCallParamsFromSchema)(schema, {
91
+ const result = (0, client_1.unstrictifyToolCallParamsFromSchema)(schema, {
92
92
  user: { name: "John", email: null },
93
93
  _tambo_statusMessage: "Updating user",
94
94
  });
@@ -100,7 +100,7 @@ describe("unstrictifyToolCallParamsFromSchema", () => {
100
100
  it("should return params as-is for non-object schemas", () => {
101
101
  const schema = { type: "string" };
102
102
  const params = { name: "John", _tambo_foo: "bar" };
103
- const result = (0, unstrictify_1.unstrictifyToolCallParamsFromSchema)(schema, params);
103
+ const result = (0, client_1.unstrictifyToolCallParamsFromSchema)(schema, params);
104
104
  expect(result).toEqual(params);
105
105
  });
106
106
  it("should handle empty params", () => {
@@ -111,14 +111,14 @@ describe("unstrictifyToolCallParamsFromSchema", () => {
111
111
  },
112
112
  required: [],
113
113
  };
114
- const result = (0, unstrictify_1.unstrictifyToolCallParamsFromSchema)(schema, {});
114
+ const result = (0, client_1.unstrictifyToolCallParamsFromSchema)(schema, {});
115
115
  expect(result).toEqual({});
116
116
  });
117
117
  it("should handle schema with no properties defined", () => {
118
118
  const schema = {
119
119
  type: "object",
120
120
  };
121
- const result = (0, unstrictify_1.unstrictifyToolCallParamsFromSchema)(schema, {
121
+ const result = (0, client_1.unstrictifyToolCallParamsFromSchema)(schema, {
122
122
  anything: "value",
123
123
  _tambo_status: "ok",
124
124
  });
@@ -135,7 +135,7 @@ describe("unstrictifyToolCallParamsFromSchema", () => {
135
135
  },
136
136
  required: ["city"],
137
137
  };
138
- const result = (0, unstrictify_1.unstrictifyToolCallParamsFromSchema)(schema, {
138
+ const result = (0, client_1.unstrictifyToolCallParamsFromSchema)(schema, {
139
139
  city: "NYC",
140
140
  temperatur: "celsius",
141
141
  _tambo_statusMessage: "Fetching",
@@ -170,7 +170,7 @@ describe("unstrictifyToolCallParamsFromSchema", () => {
170
170
  },
171
171
  required: ["targets"],
172
172
  };
173
- const result = (0, unstrictify_1.unstrictifyToolCallParamsFromSchema)(schema, {
173
+ const result = (0, client_1.unstrictifyToolCallParamsFromSchema)(schema, {
174
174
  targets: [
175
175
  { range: "A1:B1", style: { bold: true, fontFamily: null } },
176
176
  { range: "A2:A6", style: { bold: false, fontFamily: null } },