@tambo-ai/react 0.68.0 → 0.69.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (326) hide show
  1. package/README.md +1 -1
  2. package/dist/context-helpers/context-helpers.test.js +16 -4
  3. package/dist/context-helpers/context-helpers.test.js.map +1 -1
  4. package/dist/context-helpers/current-interactables-context-helper.d.ts +2 -2
  5. package/dist/context-helpers/current-interactables-context-helper.d.ts.map +1 -1
  6. package/dist/context-helpers/current-interactables-context-helper.js +31 -15
  7. package/dist/context-helpers/current-interactables-context-helper.js.map +1 -1
  8. package/dist/context-helpers/registry.d.ts +2 -2
  9. package/dist/context-helpers/registry.d.ts.map +1 -1
  10. package/dist/context-helpers/registry.js.map +1 -1
  11. package/dist/context-helpers/types.d.ts +2 -2
  12. package/dist/context-helpers/types.d.ts.map +1 -1
  13. package/dist/context-helpers/types.js.map +1 -1
  14. package/dist/hooks/use-message-images.test.js +174 -37
  15. package/dist/hooks/use-message-images.test.js.map +1 -1
  16. package/dist/hooks/use-tambo-voice.d.ts +1 -1
  17. package/dist/hooks/use-tambo-voice.js +1 -1
  18. package/dist/hooks/use-tambo-voice.js.map +1 -1
  19. package/dist/hooks/use-tambo-voice.test.d.ts +2 -0
  20. package/dist/hooks/use-tambo-voice.test.d.ts.map +1 -0
  21. package/dist/hooks/use-tambo-voice.test.js +239 -0
  22. package/dist/hooks/use-tambo-voice.test.js.map +1 -0
  23. package/dist/index.d.ts +2 -2
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js.map +1 -1
  26. package/dist/mcp/elicitation.d.ts.map +1 -1
  27. package/dist/mcp/elicitation.js +12 -0
  28. package/dist/mcp/elicitation.js.map +1 -1
  29. package/dist/mcp/elicitation.test.js +8 -1
  30. package/dist/mcp/elicitation.test.js.map +1 -1
  31. package/dist/mcp/mcp-client.d.ts +6 -10
  32. package/dist/mcp/mcp-client.d.ts.map +1 -1
  33. package/dist/mcp/mcp-client.js.map +1 -1
  34. package/dist/mcp/mcp-hooks.d.ts +12 -60
  35. package/dist/mcp/mcp-hooks.d.ts.map +1 -1
  36. package/dist/mcp/mcp-hooks.js +90 -10
  37. package/dist/mcp/mcp-hooks.js.map +1 -1
  38. package/dist/mcp/mcp-hooks.test.js +423 -0
  39. package/dist/mcp/mcp-hooks.test.js.map +1 -1
  40. package/dist/mcp/tambo-mcp-provider.d.ts.map +1 -1
  41. package/dist/mcp/tambo-mcp-provider.js +3 -0
  42. package/dist/mcp/tambo-mcp-provider.js.map +1 -1
  43. package/dist/mcp/tambo-mcp-provider.test.js +37 -0
  44. package/dist/mcp/tambo-mcp-provider.test.js.map +1 -1
  45. package/dist/model/component-metadata.d.ts +53 -20
  46. package/dist/model/component-metadata.d.ts.map +1 -1
  47. package/dist/model/component-metadata.js.map +1 -1
  48. package/dist/model/tambo-interactable.d.ts +6 -0
  49. package/dist/model/tambo-interactable.d.ts.map +1 -1
  50. package/dist/model/tambo-interactable.js.map +1 -1
  51. package/dist/providers/index.d.ts +1 -1
  52. package/dist/providers/index.d.ts.map +1 -1
  53. package/dist/providers/index.js.map +1 -1
  54. package/dist/providers/tambo-client-provider.d.ts +8 -0
  55. package/dist/providers/tambo-client-provider.d.ts.map +1 -1
  56. package/dist/providers/tambo-client-provider.js +10 -11
  57. package/dist/providers/tambo-client-provider.js.map +1 -1
  58. package/dist/providers/tambo-client-provider.test.d.ts +2 -0
  59. package/dist/providers/tambo-client-provider.test.d.ts.map +1 -0
  60. package/dist/providers/tambo-client-provider.test.js +208 -0
  61. package/dist/providers/tambo-client-provider.test.js.map +1 -0
  62. package/dist/providers/tambo-context-attachment-provider.d.ts +34 -92
  63. package/dist/providers/tambo-context-attachment-provider.d.ts.map +1 -1
  64. package/dist/providers/tambo-context-attachment-provider.js +62 -105
  65. package/dist/providers/tambo-context-attachment-provider.js.map +1 -1
  66. package/dist/providers/tambo-context-attachment-provider.test.js +229 -463
  67. package/dist/providers/tambo-context-attachment-provider.test.js.map +1 -1
  68. package/dist/providers/tambo-interactable-provider.d.ts +2 -0
  69. package/dist/providers/tambo-interactable-provider.d.ts.map +1 -1
  70. package/dist/providers/tambo-interactable-provider.js +29 -4
  71. package/dist/providers/tambo-interactable-provider.js.map +1 -1
  72. package/dist/providers/tambo-interactable-provider.test.js +1 -1
  73. package/dist/providers/tambo-interactable-provider.test.js.map +1 -1
  74. package/dist/providers/tambo-interactables-additional-context.test.js +2 -5
  75. package/dist/providers/tambo-interactables-additional-context.test.js.map +1 -1
  76. package/dist/providers/tambo-provider.d.ts +2 -3
  77. package/dist/providers/tambo-provider.d.ts.map +1 -1
  78. package/dist/providers/tambo-provider.js +5 -6
  79. package/dist/providers/tambo-provider.js.map +1 -1
  80. package/dist/providers/tambo-registry-provider.test.js +16 -0
  81. package/dist/providers/tambo-registry-provider.test.js.map +1 -1
  82. package/dist/providers/tambo-registry-schema-compat.test.js +31 -0
  83. package/dist/providers/tambo-registry-schema-compat.test.js.map +1 -1
  84. package/dist/providers/tambo-thread-input-provider.d.ts +1 -1
  85. package/dist/providers/tambo-thread-input-provider.d.ts.map +1 -1
  86. package/dist/providers/tambo-thread-input-provider.js +5 -1
  87. package/dist/providers/tambo-thread-input-provider.js.map +1 -1
  88. package/dist/providers/tambo-thread-provider-initial-messages.test.js +84 -2
  89. package/dist/providers/tambo-thread-provider-initial-messages.test.js.map +1 -1
  90. package/dist/providers/tambo-thread-provider.d.ts.map +1 -1
  91. package/dist/providers/tambo-thread-provider.js +53 -42
  92. package/dist/providers/tambo-thread-provider.js.map +1 -1
  93. package/dist/providers/tambo-thread-provider.test.js +368 -262
  94. package/dist/providers/tambo-thread-provider.test.js.map +1 -1
  95. package/dist/schema/json-schema.js +29 -29
  96. package/dist/schema/json-schema.js.map +1 -1
  97. package/dist/schema/schema.test.js +237 -0
  98. package/dist/schema/schema.test.js.map +1 -1
  99. package/dist/schema/standard-schema.d.ts +1 -0
  100. package/dist/schema/standard-schema.d.ts.map +1 -1
  101. package/dist/schema/standard-schema.js +18 -13
  102. package/dist/schema/standard-schema.js.map +1 -1
  103. package/dist/schema/standard-schema.test.d.ts +2 -0
  104. package/dist/schema/standard-schema.test.d.ts.map +1 -0
  105. package/dist/schema/standard-schema.test.js +165 -0
  106. package/dist/schema/standard-schema.test.js.map +1 -0
  107. package/dist/schema/validate.test.js +149 -0
  108. package/dist/schema/validate.test.js.map +1 -1
  109. package/dist/schema/zod.d.ts +7 -4
  110. package/dist/schema/zod.d.ts.map +1 -1
  111. package/dist/schema/zod.js +65 -22
  112. package/dist/schema/zod.js.map +1 -1
  113. package/dist/schema/zod.test.js +112 -0
  114. package/dist/schema/zod.test.js.map +1 -1
  115. package/dist/testing/tools.d.ts +4 -1
  116. package/dist/testing/tools.d.ts.map +1 -1
  117. package/dist/testing/tools.js +6 -1
  118. package/dist/testing/tools.js.map +1 -1
  119. package/dist/util/generate-component.d.ts.map +1 -1
  120. package/dist/util/generate-component.js +18 -3
  121. package/dist/util/generate-component.js.map +1 -1
  122. package/dist/util/generate-component.test.d.ts +2 -0
  123. package/dist/util/generate-component.test.d.ts.map +1 -0
  124. package/dist/util/generate-component.test.js +340 -0
  125. package/dist/util/generate-component.test.js.map +1 -0
  126. package/dist/util/is-promise.d.ts +9 -0
  127. package/dist/util/is-promise.d.ts.map +1 -0
  128. package/dist/util/is-promise.js +20 -0
  129. package/dist/util/is-promise.js.map +1 -0
  130. package/dist/util/is-promise.test.d.ts +2 -0
  131. package/dist/util/is-promise.test.d.ts.map +1 -0
  132. package/dist/util/is-promise.test.js +48 -0
  133. package/dist/util/is-promise.test.js.map +1 -0
  134. package/dist/util/query-utils.test.d.ts +2 -0
  135. package/dist/util/query-utils.test.d.ts.map +1 -0
  136. package/dist/util/query-utils.test.js +382 -0
  137. package/dist/util/query-utils.test.js.map +1 -0
  138. package/dist/util/registry-validators.d.ts.map +1 -1
  139. package/dist/util/registry-validators.js +7 -0
  140. package/dist/util/registry-validators.js.map +1 -1
  141. package/dist/util/registry-validators.test.js +57 -0
  142. package/dist/util/registry-validators.test.js.map +1 -1
  143. package/dist/util/registry.d.ts.map +1 -1
  144. package/dist/util/registry.js +9 -0
  145. package/dist/util/registry.js.map +1 -1
  146. package/dist/util/registry.test.js +323 -1
  147. package/dist/util/registry.test.js.map +1 -1
  148. package/dist/util/resource-validators.test.d.ts +2 -0
  149. package/dist/util/resource-validators.test.d.ts.map +1 -0
  150. package/dist/util/resource-validators.test.js +90 -0
  151. package/dist/util/resource-validators.test.js.map +1 -0
  152. package/dist/util/tool-caller.d.ts +2 -2
  153. package/dist/util/tool-caller.d.ts.map +1 -1
  154. package/dist/util/tool-caller.js +8 -8
  155. package/dist/util/tool-caller.js.map +1 -1
  156. package/dist/util/validate-component-name.test.d.ts +2 -0
  157. package/dist/util/validate-component-name.test.d.ts.map +1 -0
  158. package/dist/util/validate-component-name.test.js +35 -0
  159. package/dist/util/validate-component-name.test.js.map +1 -0
  160. package/esm/context-helpers/context-helpers.test.js +16 -4
  161. package/esm/context-helpers/context-helpers.test.js.map +1 -1
  162. package/esm/context-helpers/current-interactables-context-helper.d.ts +2 -2
  163. package/esm/context-helpers/current-interactables-context-helper.d.ts.map +1 -1
  164. package/esm/context-helpers/current-interactables-context-helper.js +31 -15
  165. package/esm/context-helpers/current-interactables-context-helper.js.map +1 -1
  166. package/esm/context-helpers/registry.d.ts +2 -2
  167. package/esm/context-helpers/registry.d.ts.map +1 -1
  168. package/esm/context-helpers/registry.js.map +1 -1
  169. package/esm/context-helpers/types.d.ts +2 -2
  170. package/esm/context-helpers/types.d.ts.map +1 -1
  171. package/esm/context-helpers/types.js.map +1 -1
  172. package/esm/hooks/use-message-images.test.js +174 -37
  173. package/esm/hooks/use-message-images.test.js.map +1 -1
  174. package/esm/hooks/use-tambo-voice.d.ts +1 -1
  175. package/esm/hooks/use-tambo-voice.js +1 -1
  176. package/esm/hooks/use-tambo-voice.js.map +1 -1
  177. package/esm/hooks/use-tambo-voice.test.d.ts +2 -0
  178. package/esm/hooks/use-tambo-voice.test.d.ts.map +1 -0
  179. package/esm/hooks/use-tambo-voice.test.js +234 -0
  180. package/esm/hooks/use-tambo-voice.test.js.map +1 -0
  181. package/esm/index.d.ts +2 -2
  182. package/esm/index.d.ts.map +1 -1
  183. package/esm/index.js.map +1 -1
  184. package/esm/mcp/elicitation.d.ts.map +1 -1
  185. package/esm/mcp/elicitation.js +12 -0
  186. package/esm/mcp/elicitation.js.map +1 -1
  187. package/esm/mcp/elicitation.test.js +8 -1
  188. package/esm/mcp/elicitation.test.js.map +1 -1
  189. package/esm/mcp/mcp-client.d.ts +6 -10
  190. package/esm/mcp/mcp-client.d.ts.map +1 -1
  191. package/esm/mcp/mcp-client.js.map +1 -1
  192. package/esm/mcp/mcp-hooks.d.ts +12 -60
  193. package/esm/mcp/mcp-hooks.d.ts.map +1 -1
  194. package/esm/mcp/mcp-hooks.js +57 -10
  195. package/esm/mcp/mcp-hooks.js.map +1 -1
  196. package/esm/mcp/mcp-hooks.test.js +423 -0
  197. package/esm/mcp/mcp-hooks.test.js.map +1 -1
  198. package/esm/mcp/tambo-mcp-provider.d.ts.map +1 -1
  199. package/esm/mcp/tambo-mcp-provider.js +3 -0
  200. package/esm/mcp/tambo-mcp-provider.js.map +1 -1
  201. package/esm/mcp/tambo-mcp-provider.test.js +37 -0
  202. package/esm/mcp/tambo-mcp-provider.test.js.map +1 -1
  203. package/esm/model/component-metadata.d.ts +53 -20
  204. package/esm/model/component-metadata.d.ts.map +1 -1
  205. package/esm/model/component-metadata.js.map +1 -1
  206. package/esm/model/tambo-interactable.d.ts +6 -0
  207. package/esm/model/tambo-interactable.d.ts.map +1 -1
  208. package/esm/model/tambo-interactable.js.map +1 -1
  209. package/esm/providers/index.d.ts +1 -1
  210. package/esm/providers/index.d.ts.map +1 -1
  211. package/esm/providers/index.js.map +1 -1
  212. package/esm/providers/tambo-client-provider.d.ts +8 -0
  213. package/esm/providers/tambo-client-provider.d.ts.map +1 -1
  214. package/esm/providers/tambo-client-provider.js +11 -12
  215. package/esm/providers/tambo-client-provider.js.map +1 -1
  216. package/esm/providers/tambo-client-provider.test.d.ts +2 -0
  217. package/esm/providers/tambo-client-provider.test.d.ts.map +1 -0
  218. package/esm/providers/tambo-client-provider.test.js +203 -0
  219. package/esm/providers/tambo-client-provider.test.js.map +1 -0
  220. package/esm/providers/tambo-context-attachment-provider.d.ts +34 -92
  221. package/esm/providers/tambo-context-attachment-provider.d.ts.map +1 -1
  222. package/esm/providers/tambo-context-attachment-provider.js +63 -106
  223. package/esm/providers/tambo-context-attachment-provider.js.map +1 -1
  224. package/esm/providers/tambo-context-attachment-provider.test.js +230 -464
  225. package/esm/providers/tambo-context-attachment-provider.test.js.map +1 -1
  226. package/esm/providers/tambo-interactable-provider.d.ts +2 -0
  227. package/esm/providers/tambo-interactable-provider.d.ts.map +1 -1
  228. package/esm/providers/tambo-interactable-provider.js +29 -4
  229. package/esm/providers/tambo-interactable-provider.js.map +1 -1
  230. package/esm/providers/tambo-interactable-provider.test.js +1 -1
  231. package/esm/providers/tambo-interactable-provider.test.js.map +1 -1
  232. package/esm/providers/tambo-interactables-additional-context.test.js +2 -5
  233. package/esm/providers/tambo-interactables-additional-context.test.js.map +1 -1
  234. package/esm/providers/tambo-provider.d.ts +2 -3
  235. package/esm/providers/tambo-provider.d.ts.map +1 -1
  236. package/esm/providers/tambo-provider.js +5 -6
  237. package/esm/providers/tambo-provider.js.map +1 -1
  238. package/esm/providers/tambo-registry-provider.test.js +16 -0
  239. package/esm/providers/tambo-registry-provider.test.js.map +1 -1
  240. package/esm/providers/tambo-registry-schema-compat.test.js +31 -0
  241. package/esm/providers/tambo-registry-schema-compat.test.js.map +1 -1
  242. package/esm/providers/tambo-thread-input-provider.d.ts +1 -1
  243. package/esm/providers/tambo-thread-input-provider.d.ts.map +1 -1
  244. package/esm/providers/tambo-thread-input-provider.js +5 -1
  245. package/esm/providers/tambo-thread-input-provider.js.map +1 -1
  246. package/esm/providers/tambo-thread-provider-initial-messages.test.js +84 -2
  247. package/esm/providers/tambo-thread-provider-initial-messages.test.js.map +1 -1
  248. package/esm/providers/tambo-thread-provider.d.ts.map +1 -1
  249. package/esm/providers/tambo-thread-provider.js +53 -42
  250. package/esm/providers/tambo-thread-provider.js.map +1 -1
  251. package/esm/providers/tambo-thread-provider.test.js +368 -262
  252. package/esm/providers/tambo-thread-provider.test.js.map +1 -1
  253. package/esm/schema/json-schema.js +1 -1
  254. package/esm/schema/json-schema.js.map +1 -1
  255. package/esm/schema/schema.test.js +238 -1
  256. package/esm/schema/schema.test.js.map +1 -1
  257. package/esm/schema/standard-schema.d.ts +1 -0
  258. package/esm/schema/standard-schema.d.ts.map +1 -1
  259. package/esm/schema/standard-schema.js +18 -13
  260. package/esm/schema/standard-schema.js.map +1 -1
  261. package/esm/schema/standard-schema.test.d.ts +2 -0
  262. package/esm/schema/standard-schema.test.d.ts.map +1 -0
  263. package/esm/schema/standard-schema.test.js +130 -0
  264. package/esm/schema/standard-schema.test.js.map +1 -0
  265. package/esm/schema/validate.test.js +149 -0
  266. package/esm/schema/validate.test.js.map +1 -1
  267. package/esm/schema/zod.d.ts +7 -4
  268. package/esm/schema/zod.d.ts.map +1 -1
  269. package/esm/schema/zod.js +65 -22
  270. package/esm/schema/zod.js.map +1 -1
  271. package/esm/schema/zod.test.js +113 -1
  272. package/esm/schema/zod.test.js.map +1 -1
  273. package/esm/testing/tools.d.ts +4 -1
  274. package/esm/testing/tools.d.ts.map +1 -1
  275. package/esm/testing/tools.js +6 -1
  276. package/esm/testing/tools.js.map +1 -1
  277. package/esm/util/generate-component.d.ts.map +1 -1
  278. package/esm/util/generate-component.js +18 -3
  279. package/esm/util/generate-component.js.map +1 -1
  280. package/esm/util/generate-component.test.d.ts +2 -0
  281. package/esm/util/generate-component.test.d.ts.map +1 -0
  282. package/esm/util/generate-component.test.js +302 -0
  283. package/esm/util/generate-component.test.js.map +1 -0
  284. package/esm/util/is-promise.d.ts +9 -0
  285. package/esm/util/is-promise.d.ts.map +1 -0
  286. package/esm/util/is-promise.js +17 -0
  287. package/esm/util/is-promise.js.map +1 -0
  288. package/esm/util/is-promise.test.d.ts +2 -0
  289. package/esm/util/is-promise.test.d.ts.map +1 -0
  290. package/esm/util/is-promise.test.js +46 -0
  291. package/esm/util/is-promise.test.js.map +1 -0
  292. package/esm/util/query-utils.test.d.ts +2 -0
  293. package/esm/util/query-utils.test.d.ts.map +1 -0
  294. package/esm/util/query-utils.test.js +380 -0
  295. package/esm/util/query-utils.test.js.map +1 -0
  296. package/esm/util/registry-validators.d.ts.map +1 -1
  297. package/esm/util/registry-validators.js +7 -0
  298. package/esm/util/registry-validators.js.map +1 -1
  299. package/esm/util/registry-validators.test.js +57 -0
  300. package/esm/util/registry-validators.test.js.map +1 -1
  301. package/esm/util/registry.d.ts.map +1 -1
  302. package/esm/util/registry.js +9 -0
  303. package/esm/util/registry.js.map +1 -1
  304. package/esm/util/registry.test.js +324 -2
  305. package/esm/util/registry.test.js.map +1 -1
  306. package/esm/util/resource-validators.test.d.ts +2 -0
  307. package/esm/util/resource-validators.test.d.ts.map +1 -0
  308. package/esm/util/resource-validators.test.js +88 -0
  309. package/esm/util/resource-validators.test.js.map +1 -0
  310. package/esm/util/tool-caller.d.ts +2 -2
  311. package/esm/util/tool-caller.d.ts.map +1 -1
  312. package/esm/util/tool-caller.js +8 -8
  313. package/esm/util/tool-caller.js.map +1 -1
  314. package/esm/util/validate-component-name.test.d.ts +2 -0
  315. package/esm/util/validate-component-name.test.d.ts.map +1 -0
  316. package/esm/util/validate-component-name.test.js +33 -0
  317. package/esm/util/validate-component-name.test.js.map +1 -0
  318. package/package.json +15 -23
  319. package/dist/schema/alias.d.ts +0 -3
  320. package/dist/schema/alias.d.ts.map +0 -1
  321. package/dist/schema/alias.js +0 -6
  322. package/dist/schema/alias.js.map +0 -1
  323. package/esm/schema/alias.d.ts +0 -3
  324. package/esm/schema/alias.d.ts.map +0 -1
  325. package/esm/schema/alias.js +0 -13
  326. package/esm/schema/alias.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"registry.test.js","sourceRoot":"","sources":["../../src/util/registry.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBA,2CAA6B;AAC7B,2CAA6B;AAC7B,4CAAgF;AAChF,yCAAuD;AAEvD,QAAQ,CAAC,6DAA6D,EAAE,GAAG,EAAE;IAC3E,QAAQ,CAAC,wDAAwD,EAAE,GAAG,EAAE;QACtE,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,IAAI,GAAG,IAAA,oCAA4B,EACvC,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CACxE,CAAC;YACF,MAAM,MAAM,GAAG,IAAA,oCAAyB,EAAC,IAAI,CAAC,CAAC;YAC/C,mEAAmE;YACnE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;YAC3D,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,MAAM,IAAI,GAAG,IAAA,oCAA4B,EACvC,EAAE;iBACC,QAAQ,EAAE;iBACV,IAAI,CACH,EAAE,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,EAClC,EAAE,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,EAC3B,EAAE,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CACnC;iBACA,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CACtB,CAAC;YACF,MAAM,MAAM,GAAG,IAAA,oCAAyB,EAAC,IAAI,CAAC,CAAC;YAC/C,wEAAwE;YACxE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,4CAA4C,EAAE,GAAG,EAAE;QAC1D,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;YACpC,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;gBACjE,MAAM,IAAI,GAAG,IAAA,sBAAc,EAAC;oBAC1B,WAAW,EAAE,EAAE,CAAC,MAAM,CAAC;wBACrB,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;wBACvC,GAAG,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;qBACtC,CAAC;oBACF,YAAY,EAAE,EAAE,CAAC,OAAO,EAAE;iBAC3B,CAAC,CAAC;gBACH,MAAM,MAAM,GAAG,IAAA,oCAAyB,EAAC,IAAI,CAAC,CAAC;gBAC/C,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBAE1C,wDAAwD;gBACxD,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;gBACnE,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;gBAEjE,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;gBAChC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACvC,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACjD,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEzC,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;gBAC/B,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACtC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBAC/C,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAExC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,eAAe,EAAE,CAAC;YAC9C,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;gBAC9C,MAAM,IAAI,GAAG,IAAA,sBAAc,EAAC;oBAC1B,WAAW,EAAE,EAAE,CAAC,MAAM,CAAC;wBACrB,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC;wBACpD,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;wBAC3B,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;qBACzC,CAAC;oBACF,YAAY,EAAE,EAAE,CAAC,IAAI,EAAE;iBACxB,CAAC,CAAC;gBACH,MAAM,MAAM,GAAG,IAAA,oCAAyB,EAAC,IAAI,CAAC,CAAC;gBAC/C,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBAE1C,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;gBACrE,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;gBACnE,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;gBAErE,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;gBACjC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAExC,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;gBAChC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAEtC,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;gBACjC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAExC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,eAAe,EAAE,CAAC;YAC9C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;YACpC,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;gBACjE,MAAM,IAAI,GAAG,IAAA,sBAAc,EAAC;oBAC1B,WAAW,EAAE,EAAE,CAAC,MAAM,CAAC;wBACrB,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;wBACvC,GAAG,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;qBACtC,CAAC;oBACF,YAAY,EAAE,EAAE,CAAC,OAAO,EAAE;iBAC3B,CAAC,CAAC;gBACH,MAAM,MAAM,GAAG,IAAA,oCAAyB,EAAC,IAAI,CAAC,CAAC;gBAC/C,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBAE1C,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;gBACnE,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;gBAEjE,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;gBAChC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACvC,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEzC,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;gBAC/B,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACtC,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAExC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,eAAe,EAAE,CAAC;YAC9C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;YAC1C,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;gBACjE,MAAM,MAAM,GAAgB;oBAC1B,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE;wBAClD,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE;qBACjD;oBACD,QAAQ,EAAE,CAAC,MAAM,CAAC;oBAClB,WAAW,EAAE,WAAW;iBACzB,CAAC;gBACF,MAAM,IAAI,GAAG,IAAA,sBAAc,EAAC,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;gBACvE,MAAM,MAAM,GAAG,IAAA,oCAAyB,EAAC,IAAI,CAAC,CAAC;gBAC/C,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBAE1C,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;gBACnE,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;gBAEjE,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;gBAChC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACvC,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACjD,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEzC,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;gBAC/B,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACtC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBAC/C,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAEzC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,eAAe,EAAE,CAAC;YAC9C,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;gBAC3C,MAAM,MAAM,GAAgB;oBAC1B,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE,EAAE;iBACf,CAAC;gBACF,MAAM,IAAI,GAAG,IAAA,sBAAc,EAAC,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;gBACvE,MAAM,MAAM,GAAG,IAAA,oCAAyB,EAAC,IAAI,CAAC,CAAC;gBAC/C,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC5C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACzD,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;YAC3E,MAAM,IAAI,GAAG,IAAA,sBAAc,EACzB,EAAE,CAAC,MAAM,CAAC;gBACR,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE;gBACjB,GAAG,EAAE,EAAE,CAAC,MAAM,EAAE;aACjB,CAAC,CACH,CAAC;YACF,MAAM,MAAM,GAAG,IAAA,oCAAyB,EAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAE1C,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;YACnE,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;YAEjE,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;YAChC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAEvC,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;YAC/B,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAEtC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,eAAe,EAAE,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;YAC3E,MAAM,IAAI,GAAG,IAAA,sBAAc,EACzB,EAAE,CAAC,MAAM,CAAC;gBACR,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE;gBACjB,GAAG,EAAE,EAAE,CAAC,MAAM,EAAE;aACjB,CAAC,CACH,CAAC;YACF,MAAM,MAAM,GAAG,IAAA,oCAAyB,EAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAE1C,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;YACnE,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;YAEjE,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;YAChC,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;YAE/B,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,eAAe,EAAE,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;YAC1E,MAAM,MAAM,GAAgB;gBAC1B,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACxB,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBACxB;aACF,CAAC;YACF,MAAM,IAAI,GAAG,IAAA,sBAAc,EAAC,MAAM,CAAC,CAAC;YACpC,MAAM,MAAM,GAAG,IAAA,oCAAyB,EAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAE1C,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;YACnE,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;YAEjE,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;YAChC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAEvC,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;YAC/B,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAEtC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,eAAe,EAAE,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["/**\n * Tests for getParametersFromToolSchema via mapTamboToolToContextTool.\n *\n * These tests verify that tool schemas are correctly converted to parameter specifications:\n *\n * **New interface (inputSchema)**:\n * - inputSchema should be an object schema (Zod object, Valibot object, JSON Schema object)\n * - Returns an array of parameters extracted from the object's properties\n * - Tool function receives single object argument: tool({ name: \"...\", age: 30 })\n *\n * **Deprecated interface (toolSchema)**:\n * - toolSchema uses z.function().args(...) pattern\n * - Returns positional parameters: param1, param2, etc.\n * - Tool function receives spread arguments: tool(value1, value2)\n */\nimport type { JSONSchema7 } from \"json-schema\";\nimport * as z3 from \"zod/v3\";\nimport * as z4 from \"zod/v4\";\nimport { createMockTool, createMockToolWithToolSchema } from \"../testing/tools\";\nimport { mapTamboToolToContextTool } from \"./registry\";\n\ndescribe(\"getParametersFromToolSchema (via mapTamboToolToContextTool)\", () => {\n describe(\"Deprecated toolSchema interface (Zod function schemas)\", () => {\n it(\"should handle tool with toolSchema\", () => {\n const tool = createMockToolWithToolSchema(\n z3.function().args(z3.string().describe(\"The name\")).returns(z3.void()),\n );\n const result = mapTamboToolToContextTool(tool);\n // Should have at least one parameter (either extracted or wrapped)\n expect(result.parameters.length).toBeGreaterThanOrEqual(1);\n expect(result.name).toBe(\"testTool\");\n expect(result.description).toBe(\"A test tool\");\n });\n\n it(\"should handle toolSchema with multiple args\", () => {\n const tool = createMockToolWithToolSchema(\n z3\n .function()\n .args(\n z3.string().describe(\"First name\"),\n z3.number().describe(\"Age\"),\n z3.boolean().describe(\"Is active\"),\n )\n .returns(z3.void()),\n );\n const result = mapTamboToolToContextTool(tool);\n // Should have parameters (extraction depends on JSON Schema conversion)\n expect(result.parameters.length).toBeGreaterThanOrEqual(1);\n });\n });\n\n describe(\"New inputSchema interface (object schemas)\", () => {\n describe(\"Zod 4 object schemas\", () => {\n it(\"should extract parameters from object schema properties\", () => {\n const tool = createMockTool({\n inputSchema: z4.object({\n name: z4.string().describe(\"User name\"),\n age: z4.number().describe(\"User age\"),\n }),\n outputSchema: z4.boolean(),\n });\n const result = mapTamboToolToContextTool(tool);\n expect(result.parameters).toHaveLength(2);\n\n // Parameters should be extracted from object properties\n const nameParam = result.parameters.find((p) => p.name === \"name\");\n const ageParam = result.parameters.find((p) => p.name === \"age\");\n\n expect(nameParam).toBeDefined();\n expect(nameParam?.type).toBe(\"string\");\n expect(nameParam?.description).toBe(\"User name\");\n expect(nameParam?.isRequired).toBe(true);\n\n expect(ageParam).toBeDefined();\n expect(ageParam?.type).toBe(\"number\");\n expect(ageParam?.description).toBe(\"User age\");\n expect(ageParam?.isRequired).toBe(true);\n\n expect(result.parameters).toMatchSnapshot();\n });\n\n it(\"should handle complex nested objects\", () => {\n const tool = createMockTool({\n inputSchema: z4.object({\n point: z4.object({ x: z4.number(), y: z4.number() }),\n tags: z4.array(z4.string()),\n color: z4.enum([\"red\", \"green\", \"blue\"]),\n }),\n outputSchema: z4.void(),\n });\n const result = mapTamboToolToContextTool(tool);\n expect(result.parameters).toHaveLength(3);\n\n const pointParam = result.parameters.find((p) => p.name === \"point\");\n const tagsParam = result.parameters.find((p) => p.name === \"tags\");\n const colorParam = result.parameters.find((p) => p.name === \"color\");\n\n expect(pointParam).toBeDefined();\n expect(pointParam?.type).toBe(\"object\");\n\n expect(tagsParam).toBeDefined();\n expect(tagsParam?.type).toBe(\"array\");\n\n expect(colorParam).toBeDefined();\n expect(colorParam?.type).toBe(\"string\");\n\n expect(result.parameters).toMatchSnapshot();\n });\n });\n\n describe(\"Zod 3 object schemas\", () => {\n it(\"should extract parameters from object schema properties\", () => {\n const tool = createMockTool({\n inputSchema: z3.object({\n name: z3.string().describe(\"User name\"),\n age: z3.number().describe(\"User age\"),\n }),\n outputSchema: z3.boolean(),\n });\n const result = mapTamboToolToContextTool(tool);\n expect(result.parameters).toHaveLength(2);\n\n const nameParam = result.parameters.find((p) => p.name === \"name\");\n const ageParam = result.parameters.find((p) => p.name === \"age\");\n\n expect(nameParam).toBeDefined();\n expect(nameParam?.type).toBe(\"string\");\n expect(nameParam?.isRequired).toBe(true);\n\n expect(ageParam).toBeDefined();\n expect(ageParam?.type).toBe(\"number\");\n expect(ageParam?.isRequired).toBe(true);\n\n expect(result.parameters).toMatchSnapshot();\n });\n });\n\n describe(\"JSON Schema object schemas\", () => {\n it(\"should extract parameters from object schema properties\", () => {\n const schema: JSONSchema7 = {\n type: \"object\",\n properties: {\n name: { type: \"string\", description: \"User name\" },\n age: { type: \"number\", description: \"User age\" },\n },\n required: [\"name\"],\n description: \"User data\",\n };\n const tool = createMockTool({ inputSchema: schema, outputSchema: {} });\n const result = mapTamboToolToContextTool(tool);\n expect(result.parameters).toHaveLength(2);\n\n const nameParam = result.parameters.find((p) => p.name === \"name\");\n const ageParam = result.parameters.find((p) => p.name === \"age\");\n\n expect(nameParam).toBeDefined();\n expect(nameParam?.type).toBe(\"string\");\n expect(nameParam?.description).toBe(\"User name\");\n expect(nameParam?.isRequired).toBe(true);\n\n expect(ageParam).toBeDefined();\n expect(ageParam?.type).toBe(\"number\");\n expect(ageParam?.description).toBe(\"User age\");\n expect(ageParam?.isRequired).toBe(false);\n\n expect(result.parameters).toMatchSnapshot();\n });\n\n it(\"should handle empty object schema\", () => {\n const schema: JSONSchema7 = {\n type: \"object\",\n properties: {},\n };\n const tool = createMockTool({ inputSchema: schema, outputSchema: {} });\n const result = mapTamboToolToContextTool(tool);\n expect(result.parameters).toHaveLength(0);\n });\n });\n });\n\n describe(\"Direct schema (shorthand for inputSchema)\", () => {\n it(\"should accept Zod 4 object schema directly and extract parameters\", () => {\n const tool = createMockTool(\n z4.object({\n name: z4.string(),\n age: z4.number(),\n }),\n );\n const result = mapTamboToolToContextTool(tool);\n expect(result.parameters).toHaveLength(2);\n\n const nameParam = result.parameters.find((p) => p.name === \"name\");\n const ageParam = result.parameters.find((p) => p.name === \"age\");\n\n expect(nameParam).toBeDefined();\n expect(nameParam?.type).toBe(\"string\");\n\n expect(ageParam).toBeDefined();\n expect(ageParam?.type).toBe(\"number\");\n\n expect(result.parameters).toMatchSnapshot();\n });\n\n it(\"should accept Zod 3 object schema directly and extract parameters\", () => {\n const tool = createMockTool(\n z3.object({\n name: z3.string(),\n age: z3.number(),\n }),\n );\n const result = mapTamboToolToContextTool(tool);\n expect(result.parameters).toHaveLength(2);\n\n const nameParam = result.parameters.find((p) => p.name === \"name\");\n const ageParam = result.parameters.find((p) => p.name === \"age\");\n\n expect(nameParam).toBeDefined();\n expect(ageParam).toBeDefined();\n\n expect(result.parameters).toMatchSnapshot();\n });\n\n it(\"should accept JSON Schema object directly and extract parameters\", () => {\n const schema: JSONSchema7 = {\n type: \"object\",\n properties: {\n name: { type: \"string\" },\n age: { type: \"number\" },\n },\n };\n const tool = createMockTool(schema);\n const result = mapTamboToolToContextTool(tool);\n expect(result.parameters).toHaveLength(2);\n\n const nameParam = result.parameters.find((p) => p.name === \"name\");\n const ageParam = result.parameters.find((p) => p.name === \"age\");\n\n expect(nameParam).toBeDefined();\n expect(nameParam?.type).toBe(\"string\");\n\n expect(ageParam).toBeDefined();\n expect(ageParam?.type).toBe(\"number\");\n\n expect(result.parameters).toMatchSnapshot();\n });\n });\n});\n"]}
1
+ {"version":3,"file":"registry.test.js","sourceRoot":"","sources":["../../src/util/registry.test.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Tests for registry utilities:\n * - getParametersFromToolSchema via mapTamboToolToContextTool\n * - convertPropsToJsonSchema\n * - adaptToolFromFnSchema\n * - getComponentFromRegistry\n * - getAvailableComponents\n * - getUnassociatedTools\n */\nimport type { JSONSchema7 } from \"json-schema\";\nimport * as z3 from \"zod/v3\";\nimport * as z4 from \"zod/v4\";\nimport {\n ComponentRegistry,\n RegisteredComponent,\n TamboTool,\n TamboToolAssociations,\n TamboToolRegistry,\n} from \"../model/component-metadata\";\nimport { createMockTool, createMockToolWithToolSchema } from \"../testing/tools\";\nimport {\n adaptToolFromFnSchema,\n convertPropsToJsonSchema,\n getAvailableComponents,\n getComponentFromRegistry,\n getUnassociatedTools,\n mapTamboToolToContextTool,\n} from \"./registry\";\n\ndescribe(\"getParametersFromToolSchema (via mapTamboToolToContextTool)\", () => {\n describe(\"Deprecated toolSchema interface (Zod function schemas)\", () => {\n it(\"should handle tool with toolSchema\", () => {\n const tool = createMockToolWithToolSchema(\n z3.function().args(z3.string().describe(\"The name\")).returns(z3.void()),\n 3,\n );\n const result = mapTamboToolToContextTool(tool);\n // Should have at least one parameter (either extracted or wrapped)\n expect(result.parameters.length).toBeGreaterThanOrEqual(1);\n expect(result.name).toBe(\"testTool\");\n expect(result.description).toBe(\"A test tool\");\n expect(result.maxCalls).toBe(3);\n });\n\n it(\"should handle toolSchema with multiple args\", () => {\n const tool = createMockToolWithToolSchema(\n z3\n .function()\n .args(\n z3.string().describe(\"First name\"),\n z3.number().describe(\"Age\"),\n z3.boolean().describe(\"Is active\"),\n )\n .returns(z3.void()),\n );\n const result = mapTamboToolToContextTool(tool);\n // Should have parameters (extraction depends on JSON Schema conversion)\n expect(result.parameters.length).toBeGreaterThanOrEqual(1);\n });\n });\n\n describe(\"New inputSchema interface (object schemas)\", () => {\n describe(\"Zod 4 object schemas\", () => {\n it(\"should extract parameters from object schema properties\", () => {\n const tool = createMockTool({\n inputSchema: z4.object({\n name: z4.string().describe(\"User name\"),\n age: z4.number().describe(\"User age\"),\n }),\n outputSchema: z4.boolean(),\n maxCalls: 10,\n });\n const result = mapTamboToolToContextTool(tool);\n expect(result.maxCalls).toBe(10);\n expect(result.parameters).toHaveLength(2);\n\n // Parameters should be extracted from object properties\n const nameParam = result.parameters.find((p) => p.name === \"name\");\n const ageParam = result.parameters.find((p) => p.name === \"age\");\n\n expect(nameParam).toBeDefined();\n expect(nameParam?.type).toBe(\"string\");\n expect(nameParam?.description).toBe(\"User name\");\n expect(nameParam?.isRequired).toBe(true);\n\n expect(ageParam).toBeDefined();\n expect(ageParam?.type).toBe(\"number\");\n expect(ageParam?.description).toBe(\"User age\");\n expect(ageParam?.isRequired).toBe(true);\n\n expect(result.parameters).toMatchSnapshot();\n });\n\n it(\"should handle complex nested objects\", () => {\n const tool = createMockTool({\n inputSchema: z4.object({\n point: z4.object({ x: z4.number(), y: z4.number() }),\n tags: z4.array(z4.string()),\n color: z4.enum([\"red\", \"green\", \"blue\"]),\n }),\n outputSchema: z4.void(),\n });\n const result = mapTamboToolToContextTool(tool);\n expect(result.parameters).toHaveLength(3);\n\n const pointParam = result.parameters.find((p) => p.name === \"point\");\n const tagsParam = result.parameters.find((p) => p.name === \"tags\");\n const colorParam = result.parameters.find((p) => p.name === \"color\");\n\n expect(pointParam).toBeDefined();\n expect(pointParam?.type).toBe(\"object\");\n\n expect(tagsParam).toBeDefined();\n expect(tagsParam?.type).toBe(\"array\");\n\n expect(colorParam).toBeDefined();\n expect(colorParam?.type).toBe(\"string\");\n\n expect(result.parameters).toMatchSnapshot();\n });\n });\n\n describe(\"Zod 3 object schemas\", () => {\n it(\"should extract parameters from object schema properties\", () => {\n const tool = createMockTool({\n inputSchema: z3.object({\n name: z3.string().describe(\"User name\"),\n age: z3.number().describe(\"User age\"),\n }),\n outputSchema: z3.boolean(),\n });\n const result = mapTamboToolToContextTool(tool);\n expect(result.parameters).toHaveLength(2);\n\n const nameParam = result.parameters.find((p) => p.name === \"name\");\n const ageParam = result.parameters.find((p) => p.name === \"age\");\n\n expect(nameParam).toBeDefined();\n expect(nameParam?.type).toBe(\"string\");\n expect(nameParam?.isRequired).toBe(true);\n\n expect(ageParam).toBeDefined();\n expect(ageParam?.type).toBe(\"number\");\n expect(ageParam?.isRequired).toBe(true);\n\n expect(result.parameters).toMatchSnapshot();\n });\n });\n\n describe(\"JSON Schema object schemas\", () => {\n it(\"should extract parameters from object schema properties\", () => {\n const schema: JSONSchema7 = {\n type: \"object\",\n properties: {\n name: { type: \"string\", description: \"User name\" },\n age: { type: \"number\", description: \"User age\" },\n },\n required: [\"name\"],\n description: \"User data\",\n };\n const tool = createMockTool({ inputSchema: schema, outputSchema: {} });\n const result = mapTamboToolToContextTool(tool);\n expect(result.parameters).toHaveLength(2);\n\n const nameParam = result.parameters.find((p) => p.name === \"name\");\n const ageParam = result.parameters.find((p) => p.name === \"age\");\n\n expect(nameParam).toBeDefined();\n expect(nameParam?.type).toBe(\"string\");\n expect(nameParam?.description).toBe(\"User name\");\n expect(nameParam?.isRequired).toBe(true);\n\n expect(ageParam).toBeDefined();\n expect(ageParam?.type).toBe(\"number\");\n expect(ageParam?.description).toBe(\"User age\");\n expect(ageParam?.isRequired).toBe(false);\n\n expect(result.parameters).toMatchSnapshot();\n });\n\n it(\"should handle empty object schema\", () => {\n const schema: JSONSchema7 = {\n type: \"object\",\n properties: {},\n };\n const tool = createMockTool({ inputSchema: schema, outputSchema: {} });\n const result = mapTamboToolToContextTool(tool);\n expect(result.parameters).toHaveLength(0);\n });\n });\n });\n\n describe(\"Direct schema (shorthand for inputSchema)\", () => {\n it(\"should accept Zod 4 object schema directly and extract parameters\", () => {\n const tool = createMockTool(\n z4.object({\n name: z4.string(),\n age: z4.number(),\n }),\n );\n const result = mapTamboToolToContextTool(tool);\n expect(result.parameters).toHaveLength(2);\n\n const nameParam = result.parameters.find((p) => p.name === \"name\");\n const ageParam = result.parameters.find((p) => p.name === \"age\");\n\n expect(nameParam).toBeDefined();\n expect(nameParam?.type).toBe(\"string\");\n\n expect(ageParam).toBeDefined();\n expect(ageParam?.type).toBe(\"number\");\n\n expect(result.parameters).toMatchSnapshot();\n });\n\n it(\"should accept Zod 3 object schema directly and extract parameters\", () => {\n const tool = createMockTool(\n z3.object({\n name: z3.string(),\n age: z3.number(),\n }),\n );\n const result = mapTamboToolToContextTool(tool);\n expect(result.parameters).toHaveLength(2);\n\n const nameParam = result.parameters.find((p) => p.name === \"name\");\n const ageParam = result.parameters.find((p) => p.name === \"age\");\n\n expect(nameParam).toBeDefined();\n expect(ageParam).toBeDefined();\n\n expect(result.parameters).toMatchSnapshot();\n });\n\n it(\"should accept JSON Schema object directly and extract parameters\", () => {\n const schema: JSONSchema7 = {\n type: \"object\",\n properties: {\n name: { type: \"string\" },\n age: { type: \"number\" },\n },\n };\n const tool = createMockTool(schema);\n const result = mapTamboToolToContextTool(tool);\n expect(result.parameters).toHaveLength(2);\n\n const nameParam = result.parameters.find((p) => p.name === \"name\");\n const ageParam = result.parameters.find((p) => p.name === \"age\");\n\n expect(nameParam).toBeDefined();\n expect(nameParam?.type).toBe(\"string\");\n\n expect(ageParam).toBeDefined();\n expect(ageParam?.type).toBe(\"number\");\n\n expect(result.parameters).toMatchSnapshot();\n });\n });\n});\n\ndescribe(\"registry util: maxCalls\", () => {\n it(\"adaptToolFromFnSchema preserves maxCalls for legacy toolSchema\", () => {\n const legacy = createMockToolWithToolSchema(\n z3.function().args(z3.string()).returns(z3.string()),\n 2,\n );\n const adapted = adaptToolFromFnSchema(legacy);\n expect(adapted.maxCalls).toBe(2);\n });\n\n it(\"mapTamboToolToContextTool includes maxCalls when present\", () => {\n const tool = createMockTool({\n inputSchema: z3.object({ q: z3.string() }),\n maxCalls: 5,\n });\n const meta = mapTamboToolToContextTool(tool);\n expect(meta.maxCalls).toBe(5);\n });\n\n it(\"getUnassociatedTools does not drop unassociated tools and preserves maxCalls\", () => {\n const t1: TamboTool = {\n name: \"a\",\n description: \"a\",\n tool: () => {},\n inputSchema: {},\n outputSchema: {},\n maxCalls: 3,\n };\n const registry = { a: t1 };\n const associations = { SomeComponent: [] as string[] };\n const out = getUnassociatedTools(registry, associations);\n expect(out.find((t) => t.name === \"a\")?.maxCalls).toBe(3);\n });\n});\n\ndescribe(\"registry util: annotations\", () => {\n it(\"mapTamboToolToContextTool includes annotations when present\", () => {\n const tool: TamboTool = {\n name: \"read-only-tool\",\n description: \"A tool that can be called with partial args\",\n tool: () => {},\n inputSchema: z3.object({ text: z3.string() }),\n outputSchema: z3.string(),\n annotations: { readOnlyHint: true },\n };\n const meta = mapTamboToolToContextTool(tool);\n expect(meta.annotations).toEqual({ readOnlyHint: true });\n });\n\n it(\"mapTamboToolToContextTool does not include annotations when undefined\", () => {\n const tool: TamboTool = {\n name: \"regular-tool\",\n description: \"A regular tool\",\n tool: () => {},\n inputSchema: z3.object({ text: z3.string() }),\n outputSchema: z3.string(),\n };\n const meta = mapTamboToolToContextTool(tool);\n expect(meta.annotations).toBeUndefined();\n });\n\n it(\"mapTamboToolToContextTool includes annotations with readOnlyHint: false when explicitly set\", () => {\n const tool: TamboTool = {\n name: \"explicit-non-read-only-tool\",\n description: \"A tool explicitly marked as non-read-only\",\n tool: () => {},\n inputSchema: z3.object({ text: z3.string() }),\n outputSchema: z3.string(),\n annotations: { readOnlyHint: false },\n };\n const meta = mapTamboToolToContextTool(tool);\n expect(meta.annotations).toEqual({ readOnlyHint: false });\n });\n\n it(\"getUnassociatedTools preserves annotations\", () => {\n const tool: TamboTool = {\n name: \"streaming-tool\",\n description: \"A streaming tool\",\n tool: () => {},\n inputSchema: {},\n outputSchema: {},\n annotations: { readOnlyHint: true },\n };\n const registry = { \"streaming-tool\": tool };\n const associations = { SomeComponent: [] as string[] };\n const out = getUnassociatedTools(registry, associations);\n expect(out.find((t) => t.name === \"streaming-tool\")?.annotations).toEqual({\n readOnlyHint: true,\n });\n });\n\n it(\"mapTamboToolToContextTool includes tamboStreamableHint annotation\", () => {\n const tool: TamboTool = {\n name: \"streamable-tool\",\n description: \"A tool safe to call during streaming\",\n tool: () => {},\n inputSchema: z3.object({ text: z3.string() }),\n outputSchema: z3.string(),\n annotations: { tamboStreamableHint: true },\n };\n const meta = mapTamboToolToContextTool(tool);\n expect(meta.annotations).toEqual({ tamboStreamableHint: true });\n });\n\n it(\"mapTamboToolToContextTool preserves multiple combined annotations\", () => {\n const tool: TamboTool = {\n name: \"combined-annotations-tool\",\n description: \"A tool with multiple annotations\",\n tool: () => {},\n inputSchema: z3.object({ text: z3.string() }),\n outputSchema: z3.string(),\n annotations: { readOnlyHint: true, tamboStreamableHint: true },\n };\n const meta = mapTamboToolToContextTool(tool);\n expect(meta.annotations).toEqual({\n readOnlyHint: true,\n tamboStreamableHint: true,\n });\n });\n});\n\ndescribe(\"convertPropsToJsonSchema\", () => {\n it(\"should return undefined when component has no props\", () => {\n const component = {\n name: \"TestComponent\",\n description: \"A test component\",\n component: () => null,\n props: undefined,\n contextTools: [],\n } as unknown as RegisteredComponent;\n expect(convertPropsToJsonSchema(component)).toBeUndefined();\n });\n\n it(\"should convert Standard Schema (Zod) props to JSON Schema\", () => {\n const zodSchema = z4.object({\n title: z4.string(),\n count: z4.number(),\n });\n const component = {\n name: \"TestComponent\",\n description: \"A test component\",\n component: () => null,\n props: zodSchema,\n contextTools: [],\n } as unknown as RegisteredComponent;\n const result = convertPropsToJsonSchema(component);\n expect(result).toEqual(\n expect.objectContaining({\n type: \"object\",\n properties: expect.objectContaining({\n title: expect.objectContaining({ type: \"string\" }),\n count: expect.objectContaining({ type: \"number\" }),\n }),\n }),\n );\n });\n\n it(\"should pass through JSON Schema props as-is\", () => {\n const jsonSchema: JSONSchema7 = {\n type: \"object\",\n properties: {\n title: { type: \"string\" },\n count: { type: \"number\" },\n },\n };\n const component = {\n name: \"TestComponent\",\n description: \"A test component\",\n component: () => null,\n props: jsonSchema,\n contextTools: [],\n } as unknown as RegisteredComponent;\n const result = convertPropsToJsonSchema(component);\n expect(result).toBe(jsonSchema); // Should be the same reference\n });\n\n it(\"should pass through unknown format as-is\", () => {\n const unknownFormat = { custom: \"format\", notStandard: true };\n const component = {\n name: \"TestComponent\",\n description: \"A test component\",\n component: () => null,\n props: unknownFormat as unknown,\n contextTools: [],\n } as RegisteredComponent;\n const result = convertPropsToJsonSchema(component);\n expect(result).toBe(unknownFormat);\n });\n});\n\ndescribe(\"adaptToolFromFnSchema\", () => {\n it(\"should return tool unchanged when it has inputSchema (new interface)\", () => {\n const tool = createMockTool({\n inputSchema: z4.object({ name: z4.string() }),\n outputSchema: z4.string(),\n });\n const result = adaptToolFromFnSchema(tool);\n expect(result).toBe(tool); // Same reference\n expect(result.inputSchema).toBeDefined();\n });\n\n it(\"should adapt toolSchema to inputSchema/outputSchema\", () => {\n const tool = createMockToolWithToolSchema(\n z3\n .function()\n .args(z3.string().describe(\"Name\"), z3.number().describe(\"Age\"))\n .returns(z3.boolean()),\n );\n const result = adaptToolFromFnSchema(tool);\n expect(result.inputSchema).toBeDefined();\n expect(result.outputSchema).toBeDefined();\n expect(\"toolSchema\" in result).toBe(false);\n });\n});\n\ndescribe(\"getComponentFromRegistry\", () => {\n const mockRegistry: ComponentRegistry = {\n TestComponent: {\n name: \"TestComponent\",\n description: \"A test component\",\n component: () => null,\n props: { type: \"object\" },\n contextTools: [],\n },\n AnotherComponent: {\n name: \"AnotherComponent\",\n description: \"Another component\",\n component: () => null,\n props: { type: \"object\" },\n contextTools: [],\n },\n };\n\n it(\"should return component when found in registry\", () => {\n const result = getComponentFromRegistry(\"TestComponent\", mockRegistry);\n expect(result.name).toBe(\"TestComponent\");\n expect(result.description).toBe(\"A test component\");\n });\n\n it(\"should throw error when component not found\", () => {\n expect(() => getComponentFromRegistry(\"NonExistent\", mockRegistry)).toThrow(\n \"Tambo tried to use Component NonExistent, but it was not found\",\n );\n });\n\n it(\"should be case-sensitive for component names\", () => {\n expect(() =>\n getComponentFromRegistry(\"testcomponent\", mockRegistry),\n ).toThrow(\n \"Tambo tried to use Component testcomponent, but it was not found\",\n );\n });\n});\n\ndescribe(\"getAvailableComponents\", () => {\n const mockComponent = () => null;\n\n const mockRegistry: ComponentRegistry = {\n TestComponent: {\n name: \"TestComponent\",\n description: \"A test component\",\n component: mockComponent,\n props: { type: \"object\", properties: { title: { type: \"string\" } } },\n contextTools: [],\n },\n };\n\n const mockTool = createMockTool({\n inputSchema: z4.object({ query: z4.string() }),\n outputSchema: z4.string(),\n });\n mockTool.name = \"testTool\";\n\n const mockToolRegistry: TamboToolRegistry = {\n testTool: mockTool,\n };\n\n it(\"should return available components with no tools when no associations\", () => {\n const associations: TamboToolAssociations = {};\n const result = getAvailableComponents(\n mockRegistry,\n mockToolRegistry,\n associations,\n );\n\n expect(result).toHaveLength(1);\n expect(result[0].name).toBe(\"TestComponent\");\n expect(result[0].description).toBe(\"A test component\");\n expect(result[0].contextTools).toHaveLength(0);\n });\n\n it(\"should include associated tools with components\", () => {\n const associations: TamboToolAssociations = {\n TestComponent: [\"testTool\"],\n };\n const result = getAvailableComponents(\n mockRegistry,\n mockToolRegistry,\n associations,\n );\n\n expect(result).toHaveLength(1);\n expect(result[0].contextTools).toHaveLength(1);\n expect(result[0].contextTools?.[0].name).toBe(\"testTool\");\n });\n\n it(\"should skip tools not found in registry\", () => {\n const associations: TamboToolAssociations = {\n TestComponent: [\"testTool\", \"nonExistentTool\"],\n };\n const result = getAvailableComponents(\n mockRegistry,\n mockToolRegistry,\n associations,\n );\n\n expect(result[0].contextTools).toHaveLength(1);\n expect(result[0].contextTools?.[0].name).toBe(\"testTool\");\n });\n\n it(\"should handle empty registries\", () => {\n const result = getAvailableComponents({}, {}, {});\n expect(result).toHaveLength(0);\n });\n});\n\ndescribe(\"getUnassociatedTools\", () => {\n const mockTool1 = createMockTool({\n inputSchema: z4.object({ a: z4.string() }),\n outputSchema: z4.void(),\n });\n mockTool1.name = \"tool1\";\n\n const mockTool2 = createMockTool({\n inputSchema: z4.object({ b: z4.string() }),\n outputSchema: z4.void(),\n });\n mockTool2.name = \"tool2\";\n\n const mockTool3 = createMockTool({\n inputSchema: z4.object({ c: z4.string() }),\n outputSchema: z4.void(),\n });\n mockTool3.name = \"tool3\";\n\n const mockToolRegistry: TamboToolRegistry = {\n tool1: mockTool1,\n tool2: mockTool2,\n tool3: mockTool3,\n };\n\n it(\"should return all tools when no associations exist\", () => {\n const associations: TamboToolAssociations = {};\n const result = getUnassociatedTools(mockToolRegistry, associations);\n\n expect(result).toHaveLength(3);\n expect(result.map((t) => t.name)).toEqual(\n expect.arrayContaining([\"tool1\", \"tool2\", \"tool3\"]),\n );\n });\n\n it(\"should exclude tools that are associated with components\", () => {\n const associations: TamboToolAssociations = {\n ComponentA: [\"tool1\"],\n ComponentB: [\"tool2\"],\n };\n const result = getUnassociatedTools(mockToolRegistry, associations);\n\n expect(result).toHaveLength(1);\n expect(result[0].name).toBe(\"tool3\");\n });\n\n it(\"should return empty array when all tools are associated\", () => {\n const associations: TamboToolAssociations = {\n ComponentA: [\"tool1\", \"tool2\", \"tool3\"],\n };\n const result = getUnassociatedTools(mockToolRegistry, associations);\n\n expect(result).toHaveLength(0);\n });\n\n it(\"should handle empty tool registry\", () => {\n const result = getUnassociatedTools({}, { ComponentA: [\"tool1\"] });\n expect(result).toHaveLength(0);\n });\n});\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=resource-validators.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-validators.test.d.ts","sourceRoot":"","sources":["../../src/util/resource-validators.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const resource_validators_1 = require("./resource-validators");
4
+ describe("validateResourceSource", () => {
5
+ it("should throw when has listResources but not getResource", () => {
6
+ const listResources = async () => [];
7
+ const getResource = undefined;
8
+ expect(() => {
9
+ (0, resource_validators_1.validateResourceSource)(listResources, getResource);
10
+ }).toThrow("Both listResources and getResource must be provided together, or neither should be provided. " +
11
+ "Got: listResources=defined, getResource=undefined");
12
+ });
13
+ it("should throw when has getResource but not listResources", () => {
14
+ const listResources = undefined;
15
+ const getResource = async () => ({
16
+ contents: [
17
+ {
18
+ uri: "https://resource",
19
+ mimeType: "text/plain",
20
+ text: "test",
21
+ },
22
+ ],
23
+ });
24
+ expect(() => {
25
+ (0, resource_validators_1.validateResourceSource)(listResources, getResource);
26
+ }).toThrow("Both listResources and getResource must be provided together, or neither should be provided. " +
27
+ "Got: listResources=undefined, getResource=defined");
28
+ });
29
+ it("should not throw when both listResources and getResource are provided", () => {
30
+ const listResources = async () => [];
31
+ const getResource = async () => ({
32
+ contents: [
33
+ {
34
+ uri: "https://resource",
35
+ mimeType: "text/plain",
36
+ text: "test",
37
+ },
38
+ ],
39
+ });
40
+ expect(() => {
41
+ (0, resource_validators_1.validateResourceSource)(listResources, getResource);
42
+ }).not.toThrow();
43
+ });
44
+ it("should not throw when neither listResources nor getResource are provided", () => {
45
+ const listResources = undefined;
46
+ const getResource = undefined;
47
+ expect(() => {
48
+ (0, resource_validators_1.validateResourceSource)(listResources, getResource);
49
+ }).not.toThrow();
50
+ });
51
+ });
52
+ describe("validateResource", () => {
53
+ it("should throw when resource is missing uri field", () => {
54
+ const resource = {
55
+ name: "Test Resource",
56
+ };
57
+ expect(() => {
58
+ (0, resource_validators_1.validateResource)(resource);
59
+ }).toThrow("Resource must have a 'uri' field");
60
+ });
61
+ it("should throw when resource is missing name field", () => {
62
+ const resource = {
63
+ uri: "https://resource",
64
+ };
65
+ expect(() => {
66
+ (0, resource_validators_1.validateResource)(resource);
67
+ }).toThrow("Resource with URI 'https://resource' must have a 'name' field");
68
+ });
69
+ it("should not throw when resource has both uri and name fields", () => {
70
+ const resource = {
71
+ uri: "https://resource",
72
+ name: "Test Resource",
73
+ };
74
+ expect(() => {
75
+ (0, resource_validators_1.validateResource)(resource);
76
+ }).not.toThrow();
77
+ });
78
+ it("should not throw when resource has uri, name, and optional fields", () => {
79
+ const resource = {
80
+ uri: "https://resource",
81
+ name: "Test Resource",
82
+ description: "A test resource",
83
+ mimeType: "text/plain",
84
+ };
85
+ expect(() => {
86
+ (0, resource_validators_1.validateResource)(resource);
87
+ }).not.toThrow();
88
+ });
89
+ });
90
+ //# sourceMappingURL=resource-validators.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-validators.test.js","sourceRoot":"","sources":["../../src/util/resource-validators.test.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ListResourceItem } from \"../model/resource-info\";\nimport {\n validateResource,\n validateResourceSource,\n} from \"./resource-validators\";\n\ndescribe(\"validateResourceSource\", () => {\n it(\"should throw when has listResources but not getResource\", () => {\n const listResources = async () => [];\n const getResource = undefined;\n\n expect(() => {\n validateResourceSource(listResources, getResource);\n }).toThrow(\n \"Both listResources and getResource must be provided together, or neither should be provided. \" +\n \"Got: listResources=defined, getResource=undefined\",\n );\n });\n\n it(\"should throw when has getResource but not listResources\", () => {\n const listResources = undefined;\n const getResource = async () => ({\n contents: [\n {\n uri: \"https://resource\",\n mimeType: \"text/plain\",\n text: \"test\",\n },\n ],\n });\n\n expect(() => {\n validateResourceSource(listResources, getResource);\n }).toThrow(\n \"Both listResources and getResource must be provided together, or neither should be provided. \" +\n \"Got: listResources=undefined, getResource=defined\",\n );\n });\n\n it(\"should not throw when both listResources and getResource are provided\", () => {\n const listResources = async () => [];\n const getResource = async () => ({\n contents: [\n {\n uri: \"https://resource\",\n mimeType: \"text/plain\",\n text: \"test\",\n },\n ],\n });\n\n expect(() => {\n validateResourceSource(listResources, getResource);\n }).not.toThrow();\n });\n\n it(\"should not throw when neither listResources nor getResource are provided\", () => {\n const listResources = undefined;\n const getResource = undefined;\n\n expect(() => {\n validateResourceSource(listResources, getResource);\n }).not.toThrow();\n });\n});\n\ndescribe(\"validateResource\", () => {\n it(\"should throw when resource is missing uri field\", () => {\n const resource = {\n name: \"Test Resource\",\n } as ListResourceItem;\n\n expect(() => {\n validateResource(resource);\n }).toThrow(\"Resource must have a 'uri' field\");\n });\n\n it(\"should throw when resource is missing name field\", () => {\n const resource = {\n uri: \"https://resource\",\n } as ListResourceItem;\n\n expect(() => {\n validateResource(resource);\n }).toThrow(\"Resource with URI 'https://resource' must have a 'name' field\");\n });\n\n it(\"should not throw when resource has both uri and name fields\", () => {\n const resource: ListResourceItem = {\n uri: \"https://resource\",\n name: \"Test Resource\",\n };\n\n expect(() => {\n validateResource(resource);\n }).not.toThrow();\n });\n\n it(\"should not throw when resource has uri, name, and optional fields\", () => {\n const resource: ListResourceItem = {\n uri: \"https://resource\",\n name: \"Test Resource\",\n description: \"A test resource\",\n mimeType: \"text/plain\",\n };\n\n expect(() => {\n validateResource(resource);\n }).not.toThrow();\n });\n});\n"]}
@@ -2,11 +2,11 @@ import TamboAI from "@tambo-ai/typescript-sdk";
2
2
  import { TamboTool, TamboToolRegistry, TamboToolWithToolSchema } from "../model/component-metadata";
3
3
  /**
4
4
  * Process a message from the thread, invoking the appropriate tool and returning the result.
5
- * @param message - The message to handle
5
+ * @param toolCallRequest - The message to handle
6
6
  * @param toolRegistry - The tool registry
7
7
  * @returns The result of the tool call along with the tool definition
8
8
  */
9
- export declare const handleToolCall: (message: TamboAI.Beta.Threads.ThreadMessage, toolRegistry: TamboToolRegistry, onCallUnregisteredTool?: (toolName: string, args: TamboAI.ToolCallParameter[]) => Promise<string>) => Promise<{
9
+ export declare const handleToolCall: (toolCallRequest: TamboAI.ToolCallRequest, toolRegistry: TamboToolRegistry, onCallUnregisteredTool?: (toolName: string, args: TamboAI.ToolCallParameter[]) => Promise<string>) => Promise<{
10
10
  result: unknown;
11
11
  error?: string;
12
12
  tamboTool?: TamboTool | TamboToolWithToolSchema;
@@ -1 +1 @@
1
- {"version":3,"file":"tool-caller.d.ts","sourceRoot":"","sources":["../../src/util/tool-caller.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,0BAA0B,CAAC;AAC/C,OAAO,EAEL,SAAS,EACT,iBAAiB,EACjB,uBAAuB,EACxB,MAAM,6BAA6B,CAAC;AAIrC;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GACzB,SAAS,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAC3C,cAAc,iBAAiB,EAC/B,yBAAyB,CACvB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,OAAO,CAAC,iBAAiB,EAAE,KAC9B,OAAO,CAAC,MAAM,CAAC,KACnB,OAAO,CAAC;IACT,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,SAAS,GAAG,uBAAuB,CAAC;CACjD,CAmCA,CAAC"}
1
+ {"version":3,"file":"tool-caller.d.ts","sourceRoot":"","sources":["../../src/util/tool-caller.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,0BAA0B,CAAC;AAC/C,OAAO,EAEL,SAAS,EACT,iBAAiB,EACjB,uBAAuB,EACxB,MAAM,6BAA6B,CAAC;AAIrC;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GACzB,iBAAiB,OAAO,CAAC,eAAe,EACxC,cAAc,iBAAiB,EAC/B,yBAAyB,CACvB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,OAAO,CAAC,iBAAiB,EAAE,KAC9B,OAAO,CAAC,MAAM,CAAC,KACnB,OAAO,CAAC;IACT,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,SAAS,GAAG,uBAAuB,CAAC;CACjD,CAiCA,CAAC"}
@@ -5,34 +5,34 @@ const schema_1 = require("../schema");
5
5
  const registry_1 = require("./registry");
6
6
  /**
7
7
  * Process a message from the thread, invoking the appropriate tool and returning the result.
8
- * @param message - The message to handle
8
+ * @param toolCallRequest - The message to handle
9
9
  * @param toolRegistry - The tool registry
10
10
  * @returns The result of the tool call along with the tool definition
11
11
  */
12
- const handleToolCall = async (message, toolRegistry, onCallUnregisteredTool) => {
13
- if (!message?.toolCallRequest?.toolName) {
12
+ const handleToolCall = async (toolCallRequest, toolRegistry, onCallUnregisteredTool) => {
13
+ if (!toolCallRequest?.toolName) {
14
14
  throw new Error("Tool name is required");
15
15
  }
16
16
  try {
17
- const { tool, tamboTool } = findTool(message.toolCallRequest.toolName, toolRegistry);
17
+ const { tool, tamboTool } = findTool(toolCallRequest.toolName, toolRegistry);
18
18
  if (!tool) {
19
19
  if (onCallUnregisteredTool) {
20
- const result = await onCallUnregisteredTool(message.toolCallRequest.toolName, message.toolCallRequest.parameters);
20
+ const result = await onCallUnregisteredTool(toolCallRequest.toolName, toolCallRequest.parameters);
21
21
  return {
22
22
  result,
23
23
  };
24
24
  }
25
- throw new Error(`Tool ${message.toolCallRequest.toolName} not found in registry`);
25
+ throw new Error(`Tool ${toolCallRequest.toolName} not found in registry`);
26
26
  }
27
27
  return {
28
- result: await runToolChoice(message.toolCallRequest, tool, tamboTool),
28
+ result: await runToolChoice(toolCallRequest, tool, tamboTool),
29
29
  tamboTool,
30
30
  };
31
31
  }
32
32
  catch (error) {
33
33
  console.error("Error in calling tool: ", error);
34
34
  return {
35
- result: `When attempting to call tool ${message.toolCallRequest.toolName} the following error occurred: ${error}. Explain to the user that the tool call failed and try again if needed.`,
35
+ result: `When attempting to call tool ${toolCallRequest.toolName} the following error occurred: ${error}. Explain to the user that the tool call failed and try again if needed.`,
36
36
  error: error instanceof Error ? error.message : "Unknown error",
37
37
  };
38
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"tool-caller.js","sourceRoot":"","sources":["../../src/util/tool-caller.ts"],"names":[],"mappings":";;;AAOA,sCAA2C;AAC3C,yCAAuD;AAEvD;;;;;GAKG;AACI,MAAM,cAAc,GAAG,KAAK,EACjC,OAA2C,EAC3C,YAA+B,EAC/B,sBAGoB,EAKnB,EAAE;IACH,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,QAAQ,CAClC,OAAO,CAAC,eAAe,CAAC,QAAQ,EAChC,YAAY,CACb,CAAC;QACF,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,sBAAsB,EAAE,CAAC;gBAC3B,MAAM,MAAM,GAAG,MAAM,sBAAsB,CACzC,OAAO,CAAC,eAAe,CAAC,QAAQ,EAChC,OAAO,CAAC,eAAe,CAAC,UAAU,CACnC,CAAC;gBACF,OAAO;oBACL,MAAM;iBACP,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,KAAK,CACb,QAAQ,OAAO,CAAC,eAAe,CAAC,QAAQ,wBAAwB,CACjE,CAAC;QACJ,CAAC;QACD,OAAO;YACL,MAAM,EAAE,MAAM,aAAa,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,EAAE,SAAS,CAAC;YACrE,SAAS;SACV,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;QAChD,OAAO;YACL,MAAM,EAAE,gCAAgC,OAAO,CAAC,eAAe,CAAC,QAAQ,kCAAkC,KAAK,0EAA0E;YACzL,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;SAChE,CAAC;IACJ,CAAC;AACH,CAAC,CAAC;AA9CW,QAAA,cAAc,kBA8CzB;AAEF,MAAM,QAAQ,GAAG,CACf,QAAgB,EAChB,YAA+B,EAMG,EAAE;IACpC,MAAM,YAAY,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IAE5C,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACzC,CAAC;IAED,MAAM,WAAW,GAAG,IAAA,oCAAyB,EAAC,YAAY,CAAC,CAAC;IAC5D,OAAO;QACL,IAAI,EAAE;YACJ,mBAAmB,EAAE,YAAY,CAAC,IAAI;YACtC,UAAU,EAAE,WAAW;SACxB;QACD,SAAS,EAAE,YAAY;KACxB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,KAAK,EACzB,eAAwC,EACxC,IAA0B,EAC1B,SAA8C,EAC5B,EAAE;IACpB,MAAM,UAAU,GAAG,eAAe,CAAC,UAAU,IAAI,EAAE,CAAC;IAEpD,2DAA2D;IAC3D,IAAI,IAAA,uBAAc,EAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,yDAAyD;QACzD,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CACpC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC,CACvE,CAAC;QACF,OAAO,MAAM,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;IACrD,CAAC;IAED,iEAAiE;IACjE,MAAM,eAAe,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IACxE,OAAO,MAAM,IAAI,CAAC,mBAAmB,CAAC,GAAG,eAAe,CAAC,CAAC;AAC5D,CAAC,CAAC","sourcesContent":["import TamboAI from \"@tambo-ai/typescript-sdk\";\nimport {\n ComponentContextTool,\n TamboTool,\n TamboToolRegistry,\n TamboToolWithToolSchema,\n} from \"../model/component-metadata\";\nimport { hasInputSchema } from \"../schema\";\nimport { mapTamboToolToContextTool } from \"./registry\";\n\n/**\n * Process a message from the thread, invoking the appropriate tool and returning the result.\n * @param message - The message to handle\n * @param toolRegistry - The tool registry\n * @returns The result of the tool call along with the tool definition\n */\nexport const handleToolCall = async (\n message: TamboAI.Beta.Threads.ThreadMessage,\n toolRegistry: TamboToolRegistry,\n onCallUnregisteredTool?: (\n toolName: string,\n args: TamboAI.ToolCallParameter[],\n ) => Promise<string>,\n): Promise<{\n result: unknown;\n error?: string;\n tamboTool?: TamboTool | TamboToolWithToolSchema;\n}> => {\n if (!message?.toolCallRequest?.toolName) {\n throw new Error(\"Tool name is required\");\n }\n\n try {\n const { tool, tamboTool } = findTool(\n message.toolCallRequest.toolName,\n toolRegistry,\n );\n if (!tool) {\n if (onCallUnregisteredTool) {\n const result = await onCallUnregisteredTool(\n message.toolCallRequest.toolName,\n message.toolCallRequest.parameters,\n );\n return {\n result,\n };\n }\n throw new Error(\n `Tool ${message.toolCallRequest.toolName} not found in registry`,\n );\n }\n return {\n result: await runToolChoice(message.toolCallRequest, tool, tamboTool),\n tamboTool,\n };\n } catch (error) {\n console.error(\"Error in calling tool: \", error);\n return {\n result: `When attempting to call tool ${message.toolCallRequest.toolName} the following error occurred: ${error}. Explain to the user that the tool call failed and try again if needed.`,\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n};\n\nconst findTool = (\n toolName: string,\n toolRegistry: TamboToolRegistry,\n):\n | {\n tool: ComponentContextTool;\n tamboTool: TamboTool | TamboToolWithToolSchema;\n }\n | { tool: null; tamboTool: null } => {\n const registryTool = toolRegistry[toolName];\n\n if (!registryTool) {\n return { tool: null, tamboTool: null };\n }\n\n const contextTool = mapTamboToolToContextTool(registryTool);\n return {\n tool: {\n getComponentContext: registryTool.tool,\n definition: contextTool,\n },\n tamboTool: registryTool,\n };\n};\n\nconst runToolChoice = async (\n toolCallRequest: TamboAI.ToolCallRequest,\n tool: ComponentContextTool,\n tamboTool: TamboTool | TamboToolWithToolSchema,\n): Promise<unknown> => {\n const parameters = toolCallRequest.parameters ?? [];\n\n // New interface (inputSchema): pass single object argument\n if (hasInputSchema(tamboTool)) {\n // Reconstruct the object from parameter name-value pairs\n const inputObject = Object.fromEntries(\n parameters.map((param) => [param.parameterName, param.parameterValue]),\n );\n return await tool.getComponentContext(inputObject);\n }\n\n // Deprecated interface (toolSchema): spread positional arguments\n const parameterValues = parameters.map((param) => param.parameterValue);\n return await tool.getComponentContext(...parameterValues);\n};\n"]}
1
+ {"version":3,"file":"tool-caller.js","sourceRoot":"","sources":["../../src/util/tool-caller.ts"],"names":[],"mappings":";;;AAOA,sCAA2C;AAC3C,yCAAuD;AAEvD;;;;;GAKG;AACI,MAAM,cAAc,GAAG,KAAK,EACjC,eAAwC,EACxC,YAA+B,EAC/B,sBAGoB,EAKnB,EAAE;IACH,IAAI,CAAC,eAAe,EAAE,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,QAAQ,CAClC,eAAe,CAAC,QAAQ,EACxB,YAAY,CACb,CAAC;QACF,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,sBAAsB,EAAE,CAAC;gBAC3B,MAAM,MAAM,GAAG,MAAM,sBAAsB,CACzC,eAAe,CAAC,QAAQ,EACxB,eAAe,CAAC,UAAU,CAC3B,CAAC;gBACF,OAAO;oBACL,MAAM;iBACP,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,QAAQ,eAAe,CAAC,QAAQ,wBAAwB,CAAC,CAAC;QAC5E,CAAC;QACD,OAAO;YACL,MAAM,EAAE,MAAM,aAAa,CAAC,eAAe,EAAE,IAAI,EAAE,SAAS,CAAC;YAC7D,SAAS;SACV,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;QAChD,OAAO;YACL,MAAM,EAAE,gCAAgC,eAAe,CAAC,QAAQ,kCAAkC,KAAK,0EAA0E;YACjL,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;SAChE,CAAC;IACJ,CAAC;AACH,CAAC,CAAC;AA5CW,QAAA,cAAc,kBA4CzB;AAEF,MAAM,QAAQ,GAAG,CACf,QAAgB,EAChB,YAA+B,EAMG,EAAE;IACpC,MAAM,YAAY,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IAE5C,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACzC,CAAC;IAED,MAAM,WAAW,GAAG,IAAA,oCAAyB,EAAC,YAAY,CAAC,CAAC;IAC5D,OAAO;QACL,IAAI,EAAE;YACJ,mBAAmB,EAAE,YAAY,CAAC,IAAI;YACtC,UAAU,EAAE,WAAW;SACxB;QACD,SAAS,EAAE,YAAY;KACxB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,KAAK,EACzB,eAAwC,EACxC,IAA0B,EAC1B,SAA8C,EAC5B,EAAE;IACpB,MAAM,UAAU,GAAG,eAAe,CAAC,UAAU,IAAI,EAAE,CAAC;IAEpD,2DAA2D;IAC3D,IAAI,IAAA,uBAAc,EAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,yDAAyD;QACzD,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CACpC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC,CACvE,CAAC;QACF,OAAO,MAAM,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;IACrD,CAAC;IAED,iEAAiE;IACjE,MAAM,eAAe,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IACxE,OAAO,MAAM,IAAI,CAAC,mBAAmB,CAAC,GAAG,eAAe,CAAC,CAAC;AAC5D,CAAC,CAAC","sourcesContent":["import TamboAI from \"@tambo-ai/typescript-sdk\";\nimport {\n ComponentContextTool,\n TamboTool,\n TamboToolRegistry,\n TamboToolWithToolSchema,\n} from \"../model/component-metadata\";\nimport { hasInputSchema } from \"../schema\";\nimport { mapTamboToolToContextTool } from \"./registry\";\n\n/**\n * Process a message from the thread, invoking the appropriate tool and returning the result.\n * @param toolCallRequest - The message to handle\n * @param toolRegistry - The tool registry\n * @returns The result of the tool call along with the tool definition\n */\nexport const handleToolCall = async (\n toolCallRequest: TamboAI.ToolCallRequest,\n toolRegistry: TamboToolRegistry,\n onCallUnregisteredTool?: (\n toolName: string,\n args: TamboAI.ToolCallParameter[],\n ) => Promise<string>,\n): Promise<{\n result: unknown;\n error?: string;\n tamboTool?: TamboTool | TamboToolWithToolSchema;\n}> => {\n if (!toolCallRequest?.toolName) {\n throw new Error(\"Tool name is required\");\n }\n\n try {\n const { tool, tamboTool } = findTool(\n toolCallRequest.toolName,\n toolRegistry,\n );\n if (!tool) {\n if (onCallUnregisteredTool) {\n const result = await onCallUnregisteredTool(\n toolCallRequest.toolName,\n toolCallRequest.parameters,\n );\n return {\n result,\n };\n }\n throw new Error(`Tool ${toolCallRequest.toolName} not found in registry`);\n }\n return {\n result: await runToolChoice(toolCallRequest, tool, tamboTool),\n tamboTool,\n };\n } catch (error) {\n console.error(\"Error in calling tool: \", error);\n return {\n result: `When attempting to call tool ${toolCallRequest.toolName} the following error occurred: ${error}. Explain to the user that the tool call failed and try again if needed.`,\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n};\n\nconst findTool = (\n toolName: string,\n toolRegistry: TamboToolRegistry,\n):\n | {\n tool: ComponentContextTool;\n tamboTool: TamboTool | TamboToolWithToolSchema;\n }\n | { tool: null; tamboTool: null } => {\n const registryTool = toolRegistry[toolName];\n\n if (!registryTool) {\n return { tool: null, tamboTool: null };\n }\n\n const contextTool = mapTamboToolToContextTool(registryTool);\n return {\n tool: {\n getComponentContext: registryTool.tool,\n definition: contextTool,\n },\n tamboTool: registryTool,\n };\n};\n\nconst runToolChoice = async (\n toolCallRequest: TamboAI.ToolCallRequest,\n tool: ComponentContextTool,\n tamboTool: TamboTool | TamboToolWithToolSchema,\n): Promise<unknown> => {\n const parameters = toolCallRequest.parameters ?? [];\n\n // New interface (inputSchema): pass single object argument\n if (hasInputSchema(tamboTool)) {\n // Reconstruct the object from parameter name-value pairs\n const inputObject = Object.fromEntries(\n parameters.map((param) => [param.parameterName, param.parameterValue]),\n );\n return await tool.getComponentContext(inputObject);\n }\n\n // Deprecated interface (toolSchema): spread positional arguments\n const parameterValues = parameters.map((param) => param.parameterValue);\n return await tool.getComponentContext(...parameterValues);\n};\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=validate-component-name.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-component-name.test.d.ts","sourceRoot":"","sources":["../../src/util/validate-component-name.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const validate_component_name_1 = require("./validate-component-name");
4
+ describe("assertValidName", () => {
5
+ // Valid names
6
+ it("should not throw an error for a valid name with letters only", () => {
7
+ expect(() => (0, validate_component_name_1.assertValidName)("MyComponent", "component")).not.toThrow();
8
+ });
9
+ it("should not throw an error for letters, numbers, underscore", () => {
10
+ expect(() => (0, validate_component_name_1.assertValidName)("component_123", "component")).not.toThrow();
11
+ });
12
+ it("should not throw an error for letters, numbers, hyphen", () => {
13
+ expect(() => (0, validate_component_name_1.assertValidName)("tool-456", "tool")).not.toThrow();
14
+ });
15
+ it("should not throw an error for mix of letters, numbers, underscores, hyphens", () => {
16
+ expect(() => (0, validate_component_name_1.assertValidName)("A1_b-2C", "component")).not.toThrow();
17
+ });
18
+ it("should not throw an error with single underscore, and hyphen", () => {
19
+ expect(() => (0, validate_component_name_1.assertValidName)("_", "tool")).not.toThrow();
20
+ expect(() => (0, validate_component_name_1.assertValidName)("-", "tool")).not.toThrow();
21
+ });
22
+ // Invalid names
23
+ it("should throw an error for name with space", () => {
24
+ expect(() => (0, validate_component_name_1.assertValidName)("My Component", "component")).toThrow(`component "My Component" must only contain letters, numbers, underscores, and hyphens.`);
25
+ });
26
+ it("should throw an error for name with special characters", () => {
27
+ expect(() => (0, validate_component_name_1.assertValidName)("tool@123", "tool")).toThrow(`tool "tool@123" must only contain letters, numbers, underscores, and hyphens.`);
28
+ expect(() => (0, validate_component_name_1.assertValidName)("component!$", "component")).toThrow(`component "component!$" must only contain letters, numbers, underscores, and hyphens.`);
29
+ });
30
+ // Edge Cases
31
+ it("should throw an error for name with empty string", () => {
32
+ expect(() => (0, validate_component_name_1.assertValidName)("", "component")).toThrow(`component "" must only contain letters, numbers, underscores, and hyphens.`);
33
+ });
34
+ });
35
+ //# sourceMappingURL=validate-component-name.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-component-name.test.js","sourceRoot":"","sources":["../../src/util/validate-component-name.test.ts"],"names":[],"mappings":";;AAAA,uEAA4D;AAC5D,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,cAAc;IACd,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,yCAAe,EAAC,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IAC1E,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,yCAAe,EAAC,eAAe,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IAC5E,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,yCAAe,EAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IAClE,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,6EAA6E,EAAE,GAAG,EAAE;QACrF,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,yCAAe,EAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACtE,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,yCAAe,EAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACzD,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,yCAAe,EAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IAC3D,CAAC,CAAC,CAAC;IACH,gBAAgB;IAChB,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,yCAAe,EAAC,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CAChE,wFAAwF,CACzF,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,yCAAe,EAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CACvD,+EAA+E,CAChF,CAAC;QACF,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,yCAAe,EAAC,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CAC/D,uFAAuF,CACxF,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,aAAa;IACb,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,yCAAe,EAAC,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CACpD,4EAA4E,CAC7E,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { assertValidName } from \"./validate-component-name\";\ndescribe(\"assertValidName\", () => {\n // Valid names\n it(\"should not throw an error for a valid name with letters only\", () => {\n expect(() => assertValidName(\"MyComponent\", \"component\")).not.toThrow();\n });\n it(\"should not throw an error for letters, numbers, underscore\", () => {\n expect(() => assertValidName(\"component_123\", \"component\")).not.toThrow();\n });\n it(\"should not throw an error for letters, numbers, hyphen\", () => {\n expect(() => assertValidName(\"tool-456\", \"tool\")).not.toThrow();\n });\n it(\"should not throw an error for mix of letters, numbers, underscores, hyphens\", () => {\n expect(() => assertValidName(\"A1_b-2C\", \"component\")).not.toThrow();\n });\n it(\"should not throw an error with single underscore, and hyphen\", () => {\n expect(() => assertValidName(\"_\", \"tool\")).not.toThrow();\n expect(() => assertValidName(\"-\", \"tool\")).not.toThrow();\n });\n // Invalid names\n it(\"should throw an error for name with space\", () => {\n expect(() => assertValidName(\"My Component\", \"component\")).toThrow(\n `component \"My Component\" must only contain letters, numbers, underscores, and hyphens.`,\n );\n });\n it(\"should throw an error for name with special characters\", () => {\n expect(() => assertValidName(\"tool@123\", \"tool\")).toThrow(\n `tool \"tool@123\" must only contain letters, numbers, underscores, and hyphens.`,\n );\n expect(() => assertValidName(\"component!$\", \"component\")).toThrow(\n `component \"component!$\" must only contain letters, numbers, underscores, and hyphens.`,\n );\n });\n // Edge Cases\n it(\"should throw an error for name with empty string\", () => {\n expect(() => assertValidName(\"\", \"component\")).toThrow(\n `component \"\" must only contain letters, numbers, underscores, and hyphens.`,\n );\n });\n});\n"]}
@@ -11,11 +11,17 @@ describe("Context Helpers (prebuilt functions)", () => {
11
11
  const context = currentTimeContextHelper();
12
12
  // Should not be null (error case)
13
13
  expect(context).not.toBeNull();
14
+ // Type guard: ensure context is an object
15
+ expect(typeof context).toBe("object");
16
+ if (typeof context !== "object" || context === null) {
17
+ throw new Error("Expected context to be a non-null object");
18
+ }
14
19
  // Shape: { timestamp: string }
15
20
  expect(context).toHaveProperty("timestamp");
16
- expect(typeof context.timestamp).toBe("string");
21
+ const contextObj = context;
22
+ expect(typeof contextObj.timestamp).toBe("string");
17
23
  // Verify timestamp string parses
18
- expect(() => new Date(context.timestamp)).not.toThrow();
24
+ expect(() => new Date(contextObj.timestamp)).not.toThrow();
19
25
  });
20
26
  });
21
27
  describe("currentPageContextHelper", () => {
@@ -26,11 +32,17 @@ describe("Context Helpers (prebuilt functions)", () => {
26
32
  expect(context).toBeNull();
27
33
  return;
28
34
  }
35
+ // Type guard: ensure context is an object
36
+ expect(typeof context).toBe("object");
37
+ if (typeof context !== "object") {
38
+ throw new Error("Expected context to be an object");
39
+ }
29
40
  // Shape: { url: string, title: string }
30
41
  expect(context).toHaveProperty("url");
31
42
  expect(context).toHaveProperty("title");
32
- expect(typeof context.url).toBe("string");
33
- expect(typeof context.title).toBe("string");
43
+ const contextObj = context;
44
+ expect(typeof contextObj.url).toBe("string");
45
+ expect(typeof contextObj.title).toBe("string");
34
46
  });
35
47
  });
36
48
  });
@@ -1 +1 @@
1
- {"version":3,"file":"context-helpers.test.js","sourceRoot":"","sources":["../../src/context-helpers/context-helpers.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAE7E;;;;;GAKG;AACH,QAAQ,CAAC,sCAAsC,EAAE,GAAG,EAAE;IACpD,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACxC,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,MAAM,OAAO,GAAG,wBAAwB,EAAE,CAAC;YAE3C,kCAAkC;YAClC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YAE/B,+BAA+B;YAC/B,MAAM,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;YAC5C,MAAM,CAAC,OAAO,OAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAEjD,iCAAiC;YACjC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,CAAC,OAAQ,CAAC,SAAmB,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACrE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACxC,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;YAClE,MAAM,OAAO,GAAG,wBAAwB,EAAE,CAAC;YAE3C,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACrB,sDAAsD;gBACtD,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;gBAC3B,OAAO;YACT,CAAC;YAED,wCAAwC;YACxC,MAAM,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YACtC,MAAM,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YAExC,MAAM,CAAC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC1C,MAAM,CAAC,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { currentPageContextHelper, currentTimeContextHelper } from \"./index\";\n\n/**\n * Tests for prebuilt context helper functions.\n *\n * These helpers now return raw values (or null) instead of { name, context }.\n * The provider is responsible for wrapping values as { name, context }.\n */\ndescribe(\"Context Helpers (prebuilt functions)\", () => {\n describe(\"currentTimeContextHelper\", () => {\n it(\"should return user time context with required fields\", () => {\n const context = currentTimeContextHelper();\n\n // Should not be null (error case)\n expect(context).not.toBeNull();\n\n // Shape: { timestamp: string }\n expect(context).toHaveProperty(\"timestamp\");\n expect(typeof context!.timestamp).toBe(\"string\");\n\n // Verify timestamp string parses\n expect(() => new Date(context!.timestamp as string)).not.toThrow();\n });\n });\n\n describe(\"currentPageContextHelper\", () => {\n it(\"should return page context in browser, or null otherwise\", () => {\n const context = currentPageContextHelper();\n\n if (context === null) {\n // Non-browser environments should return null to skip\n expect(context).toBeNull();\n return;\n }\n\n // Shape: { url: string, title: string }\n expect(context).toHaveProperty(\"url\");\n expect(context).toHaveProperty(\"title\");\n\n expect(typeof context.url).toBe(\"string\");\n expect(typeof context.title).toBe(\"string\");\n });\n });\n});\n"]}
1
+ {"version":3,"file":"context-helpers.test.js","sourceRoot":"","sources":["../../src/context-helpers/context-helpers.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAE7E;;;;;GAKG;AACH,QAAQ,CAAC,sCAAsC,EAAE,GAAG,EAAE;IACpD,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACxC,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,MAAM,OAAO,GAAG,wBAAwB,EAAE,CAAC;YAE3C,kCAAkC;YAClC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YAE/B,0CAA0C;YAC1C,MAAM,CAAC,OAAO,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACtC,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACpD,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;YAC9D,CAAC;YAED,+BAA+B;YAC/B,MAAM,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;YAC5C,MAAM,UAAU,GAAG,OAAkC,CAAC;YACtD,MAAM,CAAC,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAEnD,iCAAiC;YACjC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,SAAmB,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACvE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACxC,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;YAClE,MAAM,OAAO,GAAG,wBAAwB,EAAE,CAAC;YAE3C,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACrB,sDAAsD;gBACtD,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;gBAC3B,OAAO;YACT,CAAC;YAED,0CAA0C;YAC1C,MAAM,CAAC,OAAO,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACtC,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAChC,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;YACtD,CAAC;YAED,wCAAwC;YACxC,MAAM,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YACtC,MAAM,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YAExC,MAAM,UAAU,GAAG,OAAkC,CAAC;YACtD,MAAM,CAAC,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC7C,MAAM,CAAC,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { currentPageContextHelper, currentTimeContextHelper } from \"./index\";\n\n/**\n * Tests for prebuilt context helper functions.\n *\n * These helpers now return raw values (or null) instead of { name, context }.\n * The provider is responsible for wrapping values as { name, context }.\n */\ndescribe(\"Context Helpers (prebuilt functions)\", () => {\n describe(\"currentTimeContextHelper\", () => {\n it(\"should return user time context with required fields\", () => {\n const context = currentTimeContextHelper();\n\n // Should not be null (error case)\n expect(context).not.toBeNull();\n\n // Type guard: ensure context is an object\n expect(typeof context).toBe(\"object\");\n if (typeof context !== \"object\" || context === null) {\n throw new Error(\"Expected context to be a non-null object\");\n }\n\n // Shape: { timestamp: string }\n expect(context).toHaveProperty(\"timestamp\");\n const contextObj = context as Record<string, unknown>;\n expect(typeof contextObj.timestamp).toBe(\"string\");\n\n // Verify timestamp string parses\n expect(() => new Date(contextObj.timestamp as string)).not.toThrow();\n });\n });\n\n describe(\"currentPageContextHelper\", () => {\n it(\"should return page context in browser, or null otherwise\", () => {\n const context = currentPageContextHelper();\n\n if (context === null) {\n // Non-browser environments should return null to skip\n expect(context).toBeNull();\n return;\n }\n\n // Type guard: ensure context is an object\n expect(typeof context).toBe(\"object\");\n if (typeof context !== \"object\") {\n throw new Error(\"Expected context to be an object\");\n }\n\n // Shape: { url: string, title: string }\n expect(context).toHaveProperty(\"url\");\n expect(context).toHaveProperty(\"title\");\n\n const contextObj = context as Record<string, unknown>;\n expect(typeof contextObj.url).toBe(\"string\");\n expect(typeof contextObj.title).toBe(\"string\");\n });\n });\n});\n"]}
@@ -22,7 +22,7 @@ export declare const currentInteractablesContextHelper: ContextHelperFn;
22
22
  * Creates an interactables context helper with access to the current components.
23
23
  * This is used internally by TamboInteractableProvider.
24
24
  * @param components Array of interactable components
25
- * @returns Context helper function
25
+ * @returns A context helper function that returns component metadata or null if no components exist
26
26
  */
27
- export declare const createInteractablesContextHelper: (components: any[]) => ContextHelperFn;
27
+ export declare const createInteractablesContextHelper: (components: unknown[]) => ContextHelperFn;
28
28
  //# sourceMappingURL=current-interactables-context-helper.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"current-interactables-context-helper.d.ts","sourceRoot":"","sources":["../../src/context-helpers/current-interactables-context-helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE1C;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,iCAAiC,EAAE,eAI/C,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,gCAAgC,GAC3C,YAAY,GAAG,EAAE,KAChB,eAwBF,CAAC"}
1
+ {"version":3,"file":"current-interactables-context-helper.d.ts","sourceRoot":"","sources":["../../src/context-helpers/current-interactables-context-helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE1C;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,iCAAiC,EAAE,eAI/C,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,gCAAgC,GAC3C,YAAY,OAAO,EAAE,KACpB,eAyCF,CAAC"}
@@ -25,7 +25,7 @@ export const currentInteractablesContextHelper = () => {
25
25
  * Creates an interactables context helper with access to the current components.
26
26
  * This is used internally by TamboInteractableProvider.
27
27
  * @param components Array of interactable components
28
- * @returns Context helper function
28
+ * @returns A context helper function that returns component metadata or null if no components exist
29
29
  */
30
30
  export const createInteractablesContextHelper = (components) => {
31
31
  return () => {
@@ -33,20 +33,36 @@ export const createInteractablesContextHelper = (components) => {
33
33
  return null; // No interactable components on the page
34
34
  }
35
35
  return {
36
- description: "These are the interactable components currently visible on the page that you can read and modify. Each component has an id, componentName, current props, current state, and optional schemas. You can use tools to update these components' props and state on behalf of the user. Don't tell the user the ID of the components, only the name, unless they ask for it.",
37
- components: components.map((component) => ({
38
- id: component.id,
39
- componentName: component.name,
40
- description: component.description,
41
- props: component.props,
42
- propsSchema: component.propsSchema
43
- ? "Available - use component-specific update tools"
44
- : "Not specified",
45
- state: component.state,
46
- stateSchema: component.stateSchema
47
- ? "Available - use component-specific update tools"
48
- : "Not specified",
49
- })),
36
+ components: components.map((component) => {
37
+ // Type guard: ensure component is an object with the expected properties
38
+ if (typeof component !== "object" || component === null) {
39
+ return {
40
+ id: "unknown",
41
+ componentName: "unknown",
42
+ description: "invalid component",
43
+ props: undefined,
44
+ propsSchema: "Not specified",
45
+ state: undefined,
46
+ isSelectedForInteraction: false,
47
+ stateSchema: "Not specified",
48
+ };
49
+ }
50
+ const comp = component;
51
+ return {
52
+ id: String(comp.id ?? "unknown"),
53
+ componentName: String(comp.name ?? "unknown"),
54
+ description: String(comp.description ?? ""),
55
+ props: comp.props,
56
+ propsSchema: comp.propsSchema
57
+ ? "Available - use component-specific update tools"
58
+ : "Not specified",
59
+ state: comp.state,
60
+ isSelectedForInteraction: comp.isSelectedForInteraction ?? false,
61
+ stateSchema: comp.stateSchema
62
+ ? "Available - use component-specific update tools"
63
+ : "Not specified",
64
+ };
65
+ }),
50
66
  };
51
67
  };
52
68
  };
@@ -1 +1 @@
1
- {"version":3,"file":"current-interactables-context-helper.js","sourceRoot":"","sources":["../../src/context-helpers/current-interactables-context-helper.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,iCAAiC,GAAoB,GAAG,EAAE;IACrE,mFAAmF;IACnF,wEAAwE;IACxE,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAC9C,UAAiB,EACA,EAAE;IACnB,OAAO,GAAG,EAAE;QACV,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1D,OAAO,IAAI,CAAC,CAAC,yCAAyC;QACxD,CAAC;QAED,OAAO;YACL,WAAW,EACT,0WAA0W;YAC5W,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;gBACzC,EAAE,EAAE,SAAS,CAAC,EAAE;gBAChB,aAAa,EAAE,SAAS,CAAC,IAAI;gBAC7B,WAAW,EAAE,SAAS,CAAC,WAAW;gBAClC,KAAK,EAAE,SAAS,CAAC,KAAK;gBACtB,WAAW,EAAE,SAAS,CAAC,WAAW;oBAChC,CAAC,CAAC,iDAAiD;oBACnD,CAAC,CAAC,eAAe;gBACnB,KAAK,EAAE,SAAS,CAAC,KAAK;gBACtB,WAAW,EAAE,SAAS,CAAC,WAAW;oBAChC,CAAC,CAAC,iDAAiD;oBACnD,CAAC,CAAC,eAAe;aACpB,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { ContextHelperFn } from \"./types\";\n\n/**\n * Prebuilt context helper that provides information about all interactable components currently on the page.\n * This gives the AI awareness of what components it can interact with and their current state.\n * @returns an object with description and components, or null to skip including this context.\n * To disable this helper, override it with a function that returns null:\n * @example\n * ```tsx\n * // To disable the default interactables context\n * const { addContextHelper } = useTamboContextHelpers();\n * addContextHelper(\"interactables\", () => null);\n *\n * // To customize the context\n * addContextHelper(\"interactables\", () => ({\n * description: \"Custom description\",\n * components: getCustomComponentsSubset()\n * }));\n * ```\n */\nexport const currentInteractablesContextHelper: ContextHelperFn = () => {\n // This will be provided by the interactable provider when it registers this helper\n // Since we're provider-only now, this function gets replaced at runtime\n return null;\n};\n\n/**\n * Creates an interactables context helper with access to the current components.\n * This is used internally by TamboInteractableProvider.\n * @param components Array of interactable components\n * @returns Context helper function\n */\nexport const createInteractablesContextHelper = (\n components: any[],\n): ContextHelperFn => {\n return () => {\n if (!Array.isArray(components) || components.length === 0) {\n return null; // No interactable components on the page\n }\n\n return {\n description:\n \"These are the interactable components currently visible on the page that you can read and modify. Each component has an id, componentName, current props, current state, and optional schemas. You can use tools to update these components' props and state on behalf of the user. Don't tell the user the ID of the components, only the name, unless they ask for it.\",\n components: components.map((component) => ({\n id: component.id,\n componentName: component.name,\n description: component.description,\n props: component.props,\n propsSchema: component.propsSchema\n ? \"Available - use component-specific update tools\"\n : \"Not specified\",\n state: component.state,\n stateSchema: component.stateSchema\n ? \"Available - use component-specific update tools\"\n : \"Not specified\",\n })),\n };\n };\n};\n"]}
1
+ {"version":3,"file":"current-interactables-context-helper.js","sourceRoot":"","sources":["../../src/context-helpers/current-interactables-context-helper.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,iCAAiC,GAAoB,GAAG,EAAE;IACrE,mFAAmF;IACnF,wEAAwE;IACxE,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAC9C,UAAqB,EACJ,EAAE;IACnB,OAAO,GAAG,EAAE;QACV,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1D,OAAO,IAAI,CAAC,CAAC,yCAAyC;QACxD,CAAC;QAED,OAAO;YACL,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;gBACvC,yEAAyE;gBACzE,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;oBACxD,OAAO;wBACL,EAAE,EAAE,SAAS;wBACb,aAAa,EAAE,SAAS;wBACxB,WAAW,EAAE,mBAAmB;wBAChC,KAAK,EAAE,SAAS;wBAChB,WAAW,EAAE,eAAe;wBAC5B,KAAK,EAAE,SAAS;wBAChB,wBAAwB,EAAE,KAAK;wBAC/B,WAAW,EAAE,eAAe;qBAC7B,CAAC;gBACJ,CAAC;gBAED,MAAM,IAAI,GAAG,SAAoC,CAAC;gBAClD,OAAO;oBACL,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,SAAS,CAAC;oBAChC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC;oBAC7C,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;oBAC3C,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,WAAW,EAAE,IAAI,CAAC,WAAW;wBAC3B,CAAC,CAAC,iDAAiD;wBACnD,CAAC,CAAC,eAAe;oBACnB,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,wBAAwB,EACrB,IAAI,CAAC,wBAAgD,IAAI,KAAK;oBACjE,WAAW,EAAE,IAAI,CAAC,WAAW;wBAC3B,CAAC,CAAC,iDAAiD;wBACnD,CAAC,CAAC,eAAe;iBACpB,CAAC;YACJ,CAAC,CAAC;SACH,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { ContextHelperFn } from \"./types\";\n\n/**\n * Prebuilt context helper that provides information about all interactable components currently on the page.\n * This gives the AI awareness of what components it can interact with and their current state.\n * @returns an object with description and components, or null to skip including this context.\n * To disable this helper, override it with a function that returns null:\n * @example\n * ```tsx\n * // To disable the default interactables context\n * const { addContextHelper } = useTamboContextHelpers();\n * addContextHelper(\"interactables\", () => null);\n *\n * // To customize the context\n * addContextHelper(\"interactables\", () => ({\n * description: \"Custom description\",\n * components: getCustomComponentsSubset()\n * }));\n * ```\n */\nexport const currentInteractablesContextHelper: ContextHelperFn = () => {\n // This will be provided by the interactable provider when it registers this helper\n // Since we're provider-only now, this function gets replaced at runtime\n return null;\n};\n\n/**\n * Creates an interactables context helper with access to the current components.\n * This is used internally by TamboInteractableProvider.\n * @param components Array of interactable components\n * @returns A context helper function that returns component metadata or null if no components exist\n */\nexport const createInteractablesContextHelper = (\n components: unknown[],\n): ContextHelperFn => {\n return () => {\n if (!Array.isArray(components) || components.length === 0) {\n return null; // No interactable components on the page\n }\n\n return {\n components: components.map((component) => {\n // Type guard: ensure component is an object with the expected properties\n if (typeof component !== \"object\" || component === null) {\n return {\n id: \"unknown\",\n componentName: \"unknown\",\n description: \"invalid component\",\n props: undefined,\n propsSchema: \"Not specified\",\n state: undefined,\n isSelectedForInteraction: false,\n stateSchema: \"Not specified\",\n };\n }\n\n const comp = component as Record<string, unknown>;\n return {\n id: String(comp.id ?? \"unknown\"),\n componentName: String(comp.name ?? \"unknown\"),\n description: String(comp.description ?? \"\"),\n props: comp.props,\n propsSchema: comp.propsSchema\n ? \"Available - use component-specific update tools\"\n : \"Not specified\",\n state: comp.state,\n isSelectedForInteraction:\n (comp.isSelectedForInteraction as boolean | undefined) ?? false,\n stateSchema: comp.stateSchema\n ? \"Available - use component-specific update tools\"\n : \"Not specified\",\n };\n }),\n };\n };\n};\n"]}
@@ -2,13 +2,13 @@
2
2
  * Global context helpers registry.
3
3
  * Consumers can add/remove helpers and resolve additional context anywhere.
4
4
  */
5
- export type HelperFn = () => any | null | undefined | Promise<any | null | undefined>;
5
+ export type HelperFn = () => unknown | null | undefined | Promise<unknown | null | undefined>;
6
6
  /**
7
7
  * Resolve all helpers to AdditionalContext entries, skipping null/undefined and errors.
8
8
  * @returns The resolved additional context.
9
9
  */
10
10
  export declare function resolveAdditionalContext(helpers: Record<string, HelperFn>): Promise<{
11
11
  name: string;
12
- context: any;
12
+ context: unknown;
13
13
  }[]>;
14
14
  //# sourceMappingURL=registry.d.ts.map