@tambo-ai/react 1.1.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (491) hide show
  1. package/dist/context-helpers/current-interactables-context-helper.d.ts +16 -2
  2. package/dist/context-helpers/current-interactables-context-helper.d.ts.map +1 -1
  3. package/dist/context-helpers/current-interactables-context-helper.js.map +1 -1
  4. package/dist/context-helpers/current-interactables-context-helper.test.d.ts +2 -0
  5. package/dist/context-helpers/current-interactables-context-helper.test.d.ts.map +1 -0
  6. package/dist/context-helpers/current-interactables-context-helper.test.js +70 -0
  7. package/dist/context-helpers/current-interactables-context-helper.test.js.map +1 -0
  8. package/dist/hoc/with-tambo-interactable.d.ts.map +1 -1
  9. package/dist/hoc/with-tambo-interactable.js +11 -2
  10. package/dist/hoc/with-tambo-interactable.js.map +1 -1
  11. package/dist/hoc/with-tambo-interactable.test.js +14 -0
  12. package/dist/hoc/with-tambo-interactable.test.js.map +1 -1
  13. package/dist/mcp/elicitation.d.ts +3 -37
  14. package/dist/mcp/elicitation.d.ts.map +1 -1
  15. package/dist/mcp/elicitation.js +7 -24
  16. package/dist/mcp/elicitation.js.map +1 -1
  17. package/dist/mcp/index.d.ts +4 -4
  18. package/dist/mcp/index.d.ts.map +1 -1
  19. package/dist/mcp/index.js +2 -2
  20. package/dist/mcp/index.js.map +1 -1
  21. package/dist/mcp/mcp-client.test.js +17 -17
  22. package/dist/mcp/mcp-client.test.js.map +1 -1
  23. package/dist/mcp/mcp-hooks.d.ts.map +1 -1
  24. package/dist/mcp/mcp-hooks.js +8 -5
  25. package/dist/mcp/mcp-hooks.js.map +1 -1
  26. package/dist/mcp/mcp-hooks.test.js +30 -29
  27. package/dist/mcp/mcp-hooks.test.js.map +1 -1
  28. package/dist/mcp/tambo-mcp-provider.d.ts +6 -9
  29. package/dist/mcp/tambo-mcp-provider.d.ts.map +1 -1
  30. package/dist/mcp/tambo-mcp-provider.js +9 -13
  31. package/dist/mcp/tambo-mcp-provider.js.map +1 -1
  32. package/dist/mcp/tambo-mcp-provider.test.js +26 -25
  33. package/dist/mcp/tambo-mcp-provider.test.js.map +1 -1
  34. package/dist/mcp/use-mcp-servers.test.js +2 -1
  35. package/dist/mcp/use-mcp-servers.test.js.map +1 -1
  36. package/dist/model/component-metadata.d.ts +7 -372
  37. package/dist/model/component-metadata.d.ts.map +1 -1
  38. package/dist/model/component-metadata.js.map +1 -1
  39. package/dist/model/validate-input.test.d.ts +2 -0
  40. package/dist/model/validate-input.test.d.ts.map +1 -0
  41. package/dist/model/validate-input.test.js +38 -0
  42. package/dist/model/validate-input.test.js.map +1 -0
  43. package/dist/providers/tambo-interactable-provider-partial-updates.test.js +2 -0
  44. package/dist/providers/tambo-interactable-provider-partial-updates.test.js.map +1 -1
  45. package/dist/providers/tambo-interactable-provider.d.ts +7 -7
  46. package/dist/providers/tambo-interactable-provider.d.ts.map +1 -1
  47. package/dist/providers/tambo-interactable-provider.js +26 -4
  48. package/dist/providers/tambo-interactable-provider.js.map +1 -1
  49. package/dist/providers/tambo-interactable-provider.test.js +78 -0
  50. package/dist/providers/tambo-interactable-provider.test.js.map +1 -1
  51. package/dist/providers/tambo-registry-provider.d.ts +2 -1
  52. package/dist/providers/tambo-registry-provider.d.ts.map +1 -1
  53. package/dist/providers/tambo-registry-provider.js +19 -0
  54. package/dist/providers/tambo-registry-provider.js.map +1 -1
  55. package/dist/providers/tambo-registry-provider.test.js +36 -0
  56. package/dist/providers/tambo-registry-provider.test.js.map +1 -1
  57. package/dist/providers/tambo-registry-schema-compat.test.js +4 -4
  58. package/dist/providers/tambo-registry-schema-compat.test.js.map +1 -1
  59. package/dist/schema/index.d.ts +2 -4
  60. package/dist/schema/index.d.ts.map +1 -1
  61. package/dist/schema/index.js +9 -11
  62. package/dist/schema/index.js.map +1 -1
  63. package/dist/schema/json-schema.d.ts +1 -17
  64. package/dist/schema/json-schema.d.ts.map +1 -1
  65. package/dist/schema/json-schema.js +5 -69
  66. package/dist/schema/json-schema.js.map +1 -1
  67. package/dist/schema/schema.test.js +24 -25
  68. package/dist/schema/schema.test.js.map +1 -1
  69. package/dist/schema/standard-schema.test.js +25 -25
  70. package/dist/schema/standard-schema.test.js.map +1 -1
  71. package/dist/schema/validate.test.js +33 -33
  72. package/dist/schema/validate.test.js.map +1 -1
  73. package/dist/testing/tools.d.ts +4 -4
  74. package/dist/testing/tools.test.d.ts +2 -0
  75. package/dist/testing/tools.test.d.ts.map +1 -0
  76. package/dist/testing/tools.test.js +60 -0
  77. package/dist/testing/tools.test.js.map +1 -0
  78. package/dist/util/mcp-server-utils.d.ts +1 -1
  79. package/dist/util/mcp-server-utils.d.ts.map +1 -1
  80. package/dist/util/mcp-server-utils.js +4 -4
  81. package/dist/util/mcp-server-utils.js.map +1 -1
  82. package/dist/util/mcp-server-utils.test.js +27 -27
  83. package/dist/util/mcp-server-utils.test.js.map +1 -1
  84. package/dist/util/registry.js +1 -1
  85. package/dist/util/registry.js.map +1 -1
  86. package/dist/util/resource-content-resolver.js +5 -5
  87. package/dist/util/resource-content-resolver.js.map +1 -1
  88. package/dist/util/resource-content-resolver.test.js +6 -6
  89. package/dist/util/resource-content-resolver.test.js.map +1 -1
  90. package/dist/util/tool-caller.test.d.ts +2 -0
  91. package/dist/util/tool-caller.test.d.ts.map +1 -0
  92. package/dist/util/tool-caller.test.js +71 -0
  93. package/dist/util/tool-caller.test.js.map +1 -0
  94. package/dist/v1/__tests__/v1-interactables.test.js +6 -0
  95. package/dist/v1/__tests__/v1-interactables.test.js.map +1 -1
  96. package/dist/v1/components/v1-component-renderer.test.js +1 -0
  97. package/dist/v1/components/v1-component-renderer.test.js.map +1 -1
  98. package/dist/v1/hooks/use-tambo-v1-auth-state.d.ts +1 -1
  99. package/dist/v1/hooks/use-tambo-v1-auth-state.d.ts.map +1 -1
  100. package/dist/v1/hooks/use-tambo-v1-auth-state.js.map +1 -1
  101. package/dist/v1/hooks/use-tambo-v1-component-state.js +2 -2
  102. package/dist/v1/hooks/use-tambo-v1-component-state.js.map +1 -1
  103. package/dist/v1/hooks/use-tambo-v1-component-state.test.js +1 -1
  104. package/dist/v1/hooks/use-tambo-v1-component-state.test.js.map +1 -1
  105. package/dist/v1/hooks/use-tambo-v1-send-message.d.ts +1 -1
  106. package/dist/v1/hooks/use-tambo-v1-send-message.d.ts.map +1 -1
  107. package/dist/v1/hooks/use-tambo-v1-send-message.js +17 -17
  108. package/dist/v1/hooks/use-tambo-v1-send-message.js.map +1 -1
  109. package/dist/v1/hooks/use-tambo-v1-send-message.test.js +1 -1
  110. package/dist/v1/hooks/use-tambo-v1-send-message.test.js.map +1 -1
  111. package/dist/v1/hooks/use-tambo-v1-stream-status.js +2 -2
  112. package/dist/v1/hooks/use-tambo-v1-stream-status.js.map +1 -1
  113. package/dist/v1/hooks/use-tambo-v1-stream-status.test.js +9 -5
  114. package/dist/v1/hooks/use-tambo-v1-stream-status.test.js.map +1 -1
  115. package/dist/v1/hooks/use-tambo-v1-suggestions.js +2 -2
  116. package/dist/v1/hooks/use-tambo-v1-suggestions.js.map +1 -1
  117. package/dist/v1/hooks/use-tambo-v1-thread-input.test.js +1 -0
  118. package/dist/v1/hooks/use-tambo-v1-thread-input.test.js.map +1 -1
  119. package/dist/v1/hooks/use-tambo-v1.d.ts +7 -6
  120. package/dist/v1/hooks/use-tambo-v1.d.ts.map +1 -1
  121. package/dist/v1/hooks/use-tambo-v1.js +2 -2
  122. package/dist/v1/hooks/use-tambo-v1.js.map +1 -1
  123. package/dist/v1/hooks/use-tambo-v1.test.js +24 -23
  124. package/dist/v1/hooks/use-tambo-v1.test.js.map +1 -1
  125. package/dist/v1/index.d.ts +6 -6
  126. package/dist/v1/index.d.ts.map +1 -1
  127. package/dist/v1/index.js +2 -2
  128. package/dist/v1/index.js.map +1 -1
  129. package/dist/v1/providers/tambo-v1-provider.d.ts +2 -1
  130. package/dist/v1/providers/tambo-v1-provider.d.ts.map +1 -1
  131. package/dist/v1/providers/tambo-v1-provider.js +2 -0
  132. package/dist/v1/providers/tambo-v1-provider.js.map +1 -1
  133. package/dist/v1/providers/tambo-v1-stream-context.d.ts +2 -2
  134. package/dist/v1/providers/tambo-v1-stream-context.d.ts.map +1 -1
  135. package/dist/v1/providers/tambo-v1-stream-context.js +9 -9
  136. package/dist/v1/providers/tambo-v1-stream-context.js.map +1 -1
  137. package/dist/v1/providers/tambo-v1-stream-context.test.js +35 -0
  138. package/dist/v1/providers/tambo-v1-stream-context.test.js.map +1 -1
  139. package/dist/v1/providers/tambo-v1-stub-provider.d.ts +1 -1
  140. package/dist/v1/providers/tambo-v1-stub-provider.d.ts.map +1 -1
  141. package/dist/v1/providers/tambo-v1-stub-provider.js +2 -1
  142. package/dist/v1/providers/tambo-v1-stub-provider.js.map +1 -1
  143. package/dist/v1/providers/tambo-v1-stub-provider.test.js.map +1 -1
  144. package/dist/v1/providers/tambo-v1-thread-input-provider.d.ts +1 -1
  145. package/dist/v1/providers/tambo-v1-thread-input-provider.d.ts.map +1 -1
  146. package/dist/v1/providers/tambo-v1-thread-input-provider.js +2 -2
  147. package/dist/v1/providers/tambo-v1-thread-input-provider.js.map +1 -1
  148. package/dist/v1/types/event.test.js +13 -13
  149. package/dist/v1/types/event.test.js.map +1 -1
  150. package/dist/v1/types/message.d.ts +12 -109
  151. package/dist/v1/types/message.d.ts.map +1 -1
  152. package/dist/v1/types/message.js +0 -7
  153. package/dist/v1/types/message.js.map +1 -1
  154. package/dist/v1/utils/event-accumulator.test.js +183 -184
  155. package/dist/v1/utils/event-accumulator.test.js.map +1 -1
  156. package/dist/v1/utils/json-patch.test.js +4 -4
  157. package/dist/v1/utils/json-patch.test.js.map +1 -1
  158. package/dist/v1/utils/keyed-throttle.test.js +12 -12
  159. package/dist/v1/utils/keyed-throttle.test.js.map +1 -1
  160. package/dist/v1/utils/registry-conversion.test.js +13 -13
  161. package/dist/v1/utils/registry-conversion.test.js.map +1 -1
  162. package/dist/v1/utils/stream-handler.test.js +5 -5
  163. package/dist/v1/utils/stream-handler.test.js.map +1 -1
  164. package/dist/v1/utils/tool-call-tracker.test.js +15 -9
  165. package/dist/v1/utils/tool-call-tracker.test.js.map +1 -1
  166. package/dist/v1/utils/tool-executor.test.js +25 -26
  167. package/dist/v1/utils/tool-executor.test.js.map +1 -1
  168. package/dist/v1/utils/unstrictify.test.js +16 -16
  169. package/dist/v1/utils/unstrictify.test.js.map +1 -1
  170. package/esm/context-helpers/current-interactables-context-helper.d.ts +16 -2
  171. package/esm/context-helpers/current-interactables-context-helper.d.ts.map +1 -1
  172. package/esm/context-helpers/current-interactables-context-helper.js.map +1 -1
  173. package/esm/context-helpers/current-interactables-context-helper.test.d.ts +2 -0
  174. package/esm/context-helpers/current-interactables-context-helper.test.d.ts.map +1 -0
  175. package/esm/context-helpers/current-interactables-context-helper.test.js +68 -0
  176. package/esm/context-helpers/current-interactables-context-helper.test.js.map +1 -0
  177. package/esm/hoc/with-tambo-interactable.d.ts.map +1 -1
  178. package/esm/hoc/with-tambo-interactable.js +11 -2
  179. package/esm/hoc/with-tambo-interactable.js.map +1 -1
  180. package/esm/hoc/with-tambo-interactable.test.js +14 -0
  181. package/esm/hoc/with-tambo-interactable.test.js.map +1 -1
  182. package/esm/mcp/elicitation.d.ts +3 -37
  183. package/esm/mcp/elicitation.d.ts.map +1 -1
  184. package/esm/mcp/elicitation.js +4 -24
  185. package/esm/mcp/elicitation.js.map +1 -1
  186. package/esm/mcp/index.d.ts +4 -4
  187. package/esm/mcp/index.d.ts.map +1 -1
  188. package/esm/mcp/index.js +1 -1
  189. package/esm/mcp/index.js.map +1 -1
  190. package/esm/mcp/mcp-client.test.js +1 -1
  191. package/esm/mcp/mcp-client.test.js.map +1 -1
  192. package/esm/mcp/mcp-hooks.d.ts.map +1 -1
  193. package/esm/mcp/mcp-hooks.js +4 -1
  194. package/esm/mcp/mcp-hooks.js.map +1 -1
  195. package/esm/mcp/mcp-hooks.test.js +3 -2
  196. package/esm/mcp/mcp-hooks.test.js.map +1 -1
  197. package/esm/mcp/tambo-mcp-provider.d.ts +6 -9
  198. package/esm/mcp/tambo-mcp-provider.d.ts.map +1 -1
  199. package/esm/mcp/tambo-mcp-provider.js +4 -8
  200. package/esm/mcp/tambo-mcp-provider.js.map +1 -1
  201. package/esm/mcp/tambo-mcp-provider.test.js +3 -2
  202. package/esm/mcp/tambo-mcp-provider.test.js.map +1 -1
  203. package/esm/mcp/use-mcp-servers.test.js +2 -1
  204. package/esm/mcp/use-mcp-servers.test.js.map +1 -1
  205. package/esm/model/component-metadata.d.ts +7 -372
  206. package/esm/model/component-metadata.d.ts.map +1 -1
  207. package/esm/model/component-metadata.js.map +1 -1
  208. package/esm/model/validate-input.test.d.ts +2 -0
  209. package/esm/model/validate-input.test.d.ts.map +1 -0
  210. package/esm/model/validate-input.test.js +36 -0
  211. package/esm/model/validate-input.test.js.map +1 -0
  212. package/esm/providers/tambo-interactable-provider-partial-updates.test.js +2 -0
  213. package/esm/providers/tambo-interactable-provider-partial-updates.test.js.map +1 -1
  214. package/esm/providers/tambo-interactable-provider.d.ts +7 -7
  215. package/esm/providers/tambo-interactable-provider.d.ts.map +1 -1
  216. package/esm/providers/tambo-interactable-provider.js +26 -4
  217. package/esm/providers/tambo-interactable-provider.js.map +1 -1
  218. package/esm/providers/tambo-interactable-provider.test.js +78 -0
  219. package/esm/providers/tambo-interactable-provider.test.js.map +1 -1
  220. package/esm/providers/tambo-registry-provider.d.ts +2 -1
  221. package/esm/providers/tambo-registry-provider.d.ts.map +1 -1
  222. package/esm/providers/tambo-registry-provider.js +19 -0
  223. package/esm/providers/tambo-registry-provider.js.map +1 -1
  224. package/esm/providers/tambo-registry-provider.test.js +36 -0
  225. package/esm/providers/tambo-registry-provider.test.js.map +1 -1
  226. package/esm/providers/tambo-registry-schema-compat.test.js +4 -4
  227. package/esm/providers/tambo-registry-schema-compat.test.js.map +1 -1
  228. package/esm/schema/index.d.ts +2 -4
  229. package/esm/schema/index.d.ts.map +1 -1
  230. package/esm/schema/index.js +2 -4
  231. package/esm/schema/index.js.map +1 -1
  232. package/esm/schema/json-schema.d.ts +1 -17
  233. package/esm/schema/json-schema.d.ts.map +1 -1
  234. package/esm/schema/json-schema.js +2 -67
  235. package/esm/schema/json-schema.js.map +1 -1
  236. package/esm/schema/schema.test.js +1 -2
  237. package/esm/schema/schema.test.js.map +1 -1
  238. package/esm/schema/standard-schema.test.js +1 -1
  239. package/esm/schema/standard-schema.test.js.map +1 -1
  240. package/esm/schema/validate.test.js +1 -1
  241. package/esm/schema/validate.test.js.map +1 -1
  242. package/esm/testing/tools.d.ts +4 -4
  243. package/esm/testing/tools.test.d.ts +2 -0
  244. package/esm/testing/tools.test.d.ts.map +1 -0
  245. package/esm/testing/tools.test.js +58 -0
  246. package/esm/testing/tools.test.js.map +1 -0
  247. package/esm/util/mcp-server-utils.d.ts +1 -1
  248. package/esm/util/mcp-server-utils.d.ts.map +1 -1
  249. package/esm/util/mcp-server-utils.js +1 -1
  250. package/esm/util/mcp-server-utils.js.map +1 -1
  251. package/esm/util/mcp-server-utils.test.js +1 -1
  252. package/esm/util/mcp-server-utils.test.js.map +1 -1
  253. package/esm/util/registry.js +1 -1
  254. package/esm/util/registry.js.map +1 -1
  255. package/esm/util/resource-content-resolver.js +1 -1
  256. package/esm/util/resource-content-resolver.js.map +1 -1
  257. package/esm/util/resource-content-resolver.test.js +2 -2
  258. package/esm/util/resource-content-resolver.test.js.map +1 -1
  259. package/esm/util/tool-caller.test.d.ts +2 -0
  260. package/esm/util/tool-caller.test.d.ts.map +1 -0
  261. package/esm/util/tool-caller.test.js +69 -0
  262. package/esm/util/tool-caller.test.js.map +1 -0
  263. package/esm/v1/__tests__/v1-interactables.test.js +6 -0
  264. package/esm/v1/__tests__/v1-interactables.test.js.map +1 -1
  265. package/esm/v1/components/v1-component-renderer.test.js +1 -0
  266. package/esm/v1/components/v1-component-renderer.test.js.map +1 -1
  267. package/esm/v1/hooks/use-tambo-v1-auth-state.d.ts +1 -1
  268. package/esm/v1/hooks/use-tambo-v1-auth-state.d.ts.map +1 -1
  269. package/esm/v1/hooks/use-tambo-v1-auth-state.js.map +1 -1
  270. package/esm/v1/hooks/use-tambo-v1-component-state.js +1 -1
  271. package/esm/v1/hooks/use-tambo-v1-component-state.js.map +1 -1
  272. package/esm/v1/hooks/use-tambo-v1-component-state.test.js +1 -1
  273. package/esm/v1/hooks/use-tambo-v1-component-state.test.js.map +1 -1
  274. package/esm/v1/hooks/use-tambo-v1-send-message.d.ts +1 -1
  275. package/esm/v1/hooks/use-tambo-v1-send-message.d.ts.map +1 -1
  276. package/esm/v1/hooks/use-tambo-v1-send-message.js +6 -6
  277. package/esm/v1/hooks/use-tambo-v1-send-message.js.map +1 -1
  278. package/esm/v1/hooks/use-tambo-v1-send-message.test.js +1 -1
  279. package/esm/v1/hooks/use-tambo-v1-send-message.test.js.map +1 -1
  280. package/esm/v1/hooks/use-tambo-v1-stream-status.js +1 -1
  281. package/esm/v1/hooks/use-tambo-v1-stream-status.js.map +1 -1
  282. package/esm/v1/hooks/use-tambo-v1-stream-status.test.js +9 -5
  283. package/esm/v1/hooks/use-tambo-v1-stream-status.test.js.map +1 -1
  284. package/esm/v1/hooks/use-tambo-v1-suggestions.js +1 -1
  285. package/esm/v1/hooks/use-tambo-v1-suggestions.js.map +1 -1
  286. package/esm/v1/hooks/use-tambo-v1-thread-input.test.js +1 -0
  287. package/esm/v1/hooks/use-tambo-v1-thread-input.test.js.map +1 -1
  288. package/esm/v1/hooks/use-tambo-v1.d.ts +7 -6
  289. package/esm/v1/hooks/use-tambo-v1.d.ts.map +1 -1
  290. package/esm/v1/hooks/use-tambo-v1.js +1 -1
  291. package/esm/v1/hooks/use-tambo-v1.js.map +1 -1
  292. package/esm/v1/hooks/use-tambo-v1.test.js +23 -22
  293. package/esm/v1/hooks/use-tambo-v1.test.js.map +1 -1
  294. package/esm/v1/index.d.ts +6 -6
  295. package/esm/v1/index.d.ts.map +1 -1
  296. package/esm/v1/index.js +1 -1
  297. package/esm/v1/index.js.map +1 -1
  298. package/esm/v1/providers/tambo-v1-provider.d.ts +2 -1
  299. package/esm/v1/providers/tambo-v1-provider.d.ts.map +1 -1
  300. package/esm/v1/providers/tambo-v1-provider.js +2 -0
  301. package/esm/v1/providers/tambo-v1-provider.js.map +1 -1
  302. package/esm/v1/providers/tambo-v1-stream-context.d.ts +2 -2
  303. package/esm/v1/providers/tambo-v1-stream-context.d.ts.map +1 -1
  304. package/esm/v1/providers/tambo-v1-stream-context.js +1 -1
  305. package/esm/v1/providers/tambo-v1-stream-context.js.map +1 -1
  306. package/esm/v1/providers/tambo-v1-stream-context.test.js +35 -0
  307. package/esm/v1/providers/tambo-v1-stream-context.test.js.map +1 -1
  308. package/esm/v1/providers/tambo-v1-stub-provider.d.ts +1 -1
  309. package/esm/v1/providers/tambo-v1-stub-provider.d.ts.map +1 -1
  310. package/esm/v1/providers/tambo-v1-stub-provider.js +2 -1
  311. package/esm/v1/providers/tambo-v1-stub-provider.js.map +1 -1
  312. package/esm/v1/providers/tambo-v1-stub-provider.test.js.map +1 -1
  313. package/esm/v1/providers/tambo-v1-thread-input-provider.d.ts +1 -1
  314. package/esm/v1/providers/tambo-v1-thread-input-provider.d.ts.map +1 -1
  315. package/esm/v1/providers/tambo-v1-thread-input-provider.js +1 -1
  316. package/esm/v1/providers/tambo-v1-thread-input-provider.js.map +1 -1
  317. package/esm/v1/types/event.test.js +1 -1
  318. package/esm/v1/types/event.test.js.map +1 -1
  319. package/esm/v1/types/message.d.ts +12 -109
  320. package/esm/v1/types/message.d.ts.map +1 -1
  321. package/esm/v1/types/message.js +0 -7
  322. package/esm/v1/types/message.js.map +1 -1
  323. package/esm/v1/utils/event-accumulator.test.js +2 -3
  324. package/esm/v1/utils/event-accumulator.test.js.map +1 -1
  325. package/esm/v1/utils/json-patch.test.js +1 -1
  326. package/esm/v1/utils/json-patch.test.js.map +1 -1
  327. package/esm/v1/utils/keyed-throttle.test.js +1 -1
  328. package/esm/v1/utils/keyed-throttle.test.js.map +1 -1
  329. package/esm/v1/utils/registry-conversion.test.js +1 -1
  330. package/esm/v1/utils/registry-conversion.test.js.map +1 -1
  331. package/esm/v1/utils/stream-handler.test.js +1 -1
  332. package/esm/v1/utils/stream-handler.test.js.map +1 -1
  333. package/esm/v1/utils/tool-call-tracker.test.js +9 -3
  334. package/esm/v1/utils/tool-call-tracker.test.js.map +1 -1
  335. package/esm/v1/utils/tool-executor.test.js +1 -2
  336. package/esm/v1/utils/tool-executor.test.js.map +1 -1
  337. package/esm/v1/utils/unstrictify.test.js +1 -1
  338. package/esm/v1/utils/unstrictify.test.js.map +1 -1
  339. package/package.json +10 -11
  340. package/dist/mcp/mcp-client.d.ts +0 -185
  341. package/dist/mcp/mcp-client.d.ts.map +0 -1
  342. package/dist/mcp/mcp-client.js +0 -219
  343. package/dist/mcp/mcp-client.js.map +0 -1
  344. package/dist/mcp/mcp-constants.d.ts +0 -19
  345. package/dist/mcp/mcp-constants.d.ts.map +0 -1
  346. package/dist/mcp/mcp-constants.js +0 -21
  347. package/dist/mcp/mcp-constants.js.map +0 -1
  348. package/dist/model/mcp-server-info.d.ts +0 -76
  349. package/dist/model/mcp-server-info.d.ts.map +0 -1
  350. package/dist/model/mcp-server-info.js +0 -29
  351. package/dist/model/mcp-server-info.js.map +0 -1
  352. package/dist/schema/schema.d.ts +0 -49
  353. package/dist/schema/schema.d.ts.map +0 -1
  354. package/dist/schema/schema.js +0 -129
  355. package/dist/schema/schema.js.map +0 -1
  356. package/dist/schema/standard-schema.d.ts +0 -22
  357. package/dist/schema/standard-schema.d.ts.map +0 -1
  358. package/dist/schema/standard-schema.js +0 -42
  359. package/dist/schema/standard-schema.js.map +0 -1
  360. package/dist/schema/validate.d.ts +0 -14
  361. package/dist/schema/validate.d.ts.map +0 -1
  362. package/dist/schema/validate.js +0 -148
  363. package/dist/schema/validate.js.map +0 -1
  364. package/dist/v1/types/auth.d.ts +0 -24
  365. package/dist/v1/types/auth.d.ts.map +0 -1
  366. package/dist/v1/types/auth.js +0 -3
  367. package/dist/v1/types/auth.js.map +0 -1
  368. package/dist/v1/types/event.d.ts +0 -89
  369. package/dist/v1/types/event.d.ts.map +0 -1
  370. package/dist/v1/types/event.js +0 -57
  371. package/dist/v1/types/event.js.map +0 -1
  372. package/dist/v1/types/thread.d.ts +0 -58
  373. package/dist/v1/types/thread.d.ts.map +0 -1
  374. package/dist/v1/types/thread.js +0 -9
  375. package/dist/v1/types/thread.js.map +0 -1
  376. package/dist/v1/types/tool-choice.d.ts +0 -8
  377. package/dist/v1/types/tool-choice.d.ts.map +0 -1
  378. package/dist/v1/types/tool-choice.js +0 -3
  379. package/dist/v1/types/tool-choice.js.map +0 -1
  380. package/dist/v1/utils/event-accumulator.d.ts +0 -165
  381. package/dist/v1/utils/event-accumulator.d.ts.map +0 -1
  382. package/dist/v1/utils/event-accumulator.js +0 -1277
  383. package/dist/v1/utils/event-accumulator.js.map +0 -1
  384. package/dist/v1/utils/json-patch.d.ts +0 -18
  385. package/dist/v1/utils/json-patch.d.ts.map +0 -1
  386. package/dist/v1/utils/json-patch.js +0 -35
  387. package/dist/v1/utils/json-patch.js.map +0 -1
  388. package/dist/v1/utils/keyed-throttle.d.ts +0 -42
  389. package/dist/v1/utils/keyed-throttle.d.ts.map +0 -1
  390. package/dist/v1/utils/keyed-throttle.js +0 -86
  391. package/dist/v1/utils/keyed-throttle.js.map +0 -1
  392. package/dist/v1/utils/registry-conversion.d.ts +0 -53
  393. package/dist/v1/utils/registry-conversion.d.ts.map +0 -1
  394. package/dist/v1/utils/registry-conversion.js +0 -115
  395. package/dist/v1/utils/registry-conversion.js.map +0 -1
  396. package/dist/v1/utils/stream-handler.d.ts +0 -45
  397. package/dist/v1/utils/stream-handler.d.ts.map +0 -1
  398. package/dist/v1/utils/stream-handler.js +0 -47
  399. package/dist/v1/utils/stream-handler.js.map +0 -1
  400. package/dist/v1/utils/thread-utils.d.ts +0 -16
  401. package/dist/v1/utils/thread-utils.d.ts.map +0 -1
  402. package/dist/v1/utils/thread-utils.js +0 -34
  403. package/dist/v1/utils/thread-utils.js.map +0 -1
  404. package/dist/v1/utils/tool-call-tracker.d.ts +0 -73
  405. package/dist/v1/utils/tool-call-tracker.d.ts.map +0 -1
  406. package/dist/v1/utils/tool-call-tracker.js +0 -180
  407. package/dist/v1/utils/tool-call-tracker.js.map +0 -1
  408. package/dist/v1/utils/tool-executor.d.ts +0 -67
  409. package/dist/v1/utils/tool-executor.d.ts.map +0 -1
  410. package/dist/v1/utils/tool-executor.js +0 -160
  411. package/dist/v1/utils/tool-executor.js.map +0 -1
  412. package/dist/v1/utils/unstrictify.d.ts +0 -32
  413. package/dist/v1/utils/unstrictify.d.ts.map +0 -1
  414. package/dist/v1/utils/unstrictify.js +0 -159
  415. package/dist/v1/utils/unstrictify.js.map +0 -1
  416. package/esm/mcp/mcp-client.d.ts +0 -185
  417. package/esm/mcp/mcp-client.d.ts.map +0 -1
  418. package/esm/mcp/mcp-client.js +0 -216
  419. package/esm/mcp/mcp-client.js.map +0 -1
  420. package/esm/mcp/mcp-constants.d.ts +0 -19
  421. package/esm/mcp/mcp-constants.d.ts.map +0 -1
  422. package/esm/mcp/mcp-constants.js +0 -18
  423. package/esm/mcp/mcp-constants.js.map +0 -1
  424. package/esm/model/mcp-server-info.d.ts +0 -76
  425. package/esm/model/mcp-server-info.d.ts.map +0 -1
  426. package/esm/model/mcp-server-info.js +0 -25
  427. package/esm/model/mcp-server-info.js.map +0 -1
  428. package/esm/schema/schema.d.ts +0 -49
  429. package/esm/schema/schema.d.ts.map +0 -1
  430. package/esm/schema/schema.js +0 -124
  431. package/esm/schema/schema.js.map +0 -1
  432. package/esm/schema/standard-schema.d.ts +0 -22
  433. package/esm/schema/standard-schema.d.ts.map +0 -1
  434. package/esm/schema/standard-schema.js +0 -39
  435. package/esm/schema/standard-schema.js.map +0 -1
  436. package/esm/schema/validate.d.ts +0 -14
  437. package/esm/schema/validate.d.ts.map +0 -1
  438. package/esm/schema/validate.js +0 -145
  439. package/esm/schema/validate.js.map +0 -1
  440. package/esm/v1/types/auth.d.ts +0 -24
  441. package/esm/v1/types/auth.d.ts.map +0 -1
  442. package/esm/v1/types/auth.js +0 -2
  443. package/esm/v1/types/auth.js.map +0 -1
  444. package/esm/v1/types/event.d.ts +0 -89
  445. package/esm/v1/types/event.d.ts.map +0 -1
  446. package/esm/v1/types/event.js +0 -53
  447. package/esm/v1/types/event.js.map +0 -1
  448. package/esm/v1/types/thread.d.ts +0 -58
  449. package/esm/v1/types/thread.d.ts.map +0 -1
  450. package/esm/v1/types/thread.js +0 -8
  451. package/esm/v1/types/thread.js.map +0 -1
  452. package/esm/v1/types/tool-choice.d.ts +0 -8
  453. package/esm/v1/types/tool-choice.d.ts.map +0 -1
  454. package/esm/v1/types/tool-choice.js +0 -2
  455. package/esm/v1/types/tool-choice.js.map +0 -1
  456. package/esm/v1/utils/event-accumulator.d.ts +0 -165
  457. package/esm/v1/utils/event-accumulator.d.ts.map +0 -1
  458. package/esm/v1/utils/event-accumulator.js +0 -1268
  459. package/esm/v1/utils/event-accumulator.js.map +0 -1
  460. package/esm/v1/utils/json-patch.d.ts +0 -18
  461. package/esm/v1/utils/json-patch.d.ts.map +0 -1
  462. package/esm/v1/utils/json-patch.js +0 -32
  463. package/esm/v1/utils/json-patch.js.map +0 -1
  464. package/esm/v1/utils/keyed-throttle.d.ts +0 -42
  465. package/esm/v1/utils/keyed-throttle.d.ts.map +0 -1
  466. package/esm/v1/utils/keyed-throttle.js +0 -83
  467. package/esm/v1/utils/keyed-throttle.js.map +0 -1
  468. package/esm/v1/utils/registry-conversion.d.ts +0 -53
  469. package/esm/v1/utils/registry-conversion.d.ts.map +0 -1
  470. package/esm/v1/utils/registry-conversion.js +0 -109
  471. package/esm/v1/utils/registry-conversion.js.map +0 -1
  472. package/esm/v1/utils/stream-handler.d.ts +0 -45
  473. package/esm/v1/utils/stream-handler.d.ts.map +0 -1
  474. package/esm/v1/utils/stream-handler.js +0 -44
  475. package/esm/v1/utils/stream-handler.js.map +0 -1
  476. package/esm/v1/utils/thread-utils.d.ts +0 -16
  477. package/esm/v1/utils/thread-utils.d.ts.map +0 -1
  478. package/esm/v1/utils/thread-utils.js +0 -31
  479. package/esm/v1/utils/thread-utils.js.map +0 -1
  480. package/esm/v1/utils/tool-call-tracker.d.ts +0 -73
  481. package/esm/v1/utils/tool-call-tracker.d.ts.map +0 -1
  482. package/esm/v1/utils/tool-call-tracker.js +0 -176
  483. package/esm/v1/utils/tool-call-tracker.js.map +0 -1
  484. package/esm/v1/utils/tool-executor.d.ts +0 -67
  485. package/esm/v1/utils/tool-executor.d.ts.map +0 -1
  486. package/esm/v1/utils/tool-executor.js +0 -154
  487. package/esm/v1/utils/tool-executor.js.map +0 -1
  488. package/esm/v1/utils/unstrictify.d.ts +0 -32
  489. package/esm/v1/utils/unstrictify.d.ts.map +0 -1
  490. package/esm/v1/utils/unstrictify.js +0 -155
  491. package/esm/v1/utils/unstrictify.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"tambo-interactable-provider-partial-updates.test.js","sourceRoot":"","sources":["../../src/providers/tambo-interactable-provider-partial-updates.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import { act, renderHook } from \"@testing-library/react\";\nimport React from \"react\";\nimport { z } from \"zod/v4\";\nimport { TamboInteractableComponent } from \"../model/tambo-interactable\";\nimport {\n TamboInteractableProvider,\n useTamboInteractable,\n} from \"./tambo-interactable-provider\";\n\n// Mock the context helpers\nconst mockAddContextHelper = jest.fn();\nconst mockRemoveContextHelper = jest.fn();\n\njest.mock(\"./tambo-context-helpers-provider\", () => ({\n TamboContextHelpersProvider: ({\n children,\n }: {\n children: React.ReactNode;\n }) => <>{children}</>,\n useTamboContextHelpers: () => ({\n addContextHelper: mockAddContextHelper,\n removeContextHelper: mockRemoveContextHelper,\n }),\n}));\n\n// Mock the registry provider\nconst mockRegisterTool = jest.fn();\n\njest.mock(\"./tambo-registry-provider\", () => ({\n useTamboRegistry: () => ({\n registerTool: mockRegisterTool,\n }),\n}));\n\n// Mock the context helper creation\njest.mock(\"../context-helpers/current-interactables-context-helper\", () => ({\n createInteractablesContextHelper: () =>\n jest.fn(() => ({\n name: \"interactables\",\n context: {\n description: \"Test interactables context\",\n components: [],\n },\n })),\n}));\n\ndescribe(\"updateInteractableComponentProps - Partial Updates\", () => {\n beforeEach(() => {\n jest.clearAllMocks();\n });\n\n const wrapper = ({ children }: { children: React.ReactNode }) => (\n <TamboInteractableProvider>{children}</TamboInteractableProvider>\n );\n\n describe(\"Partial Updates Functionality\", () => {\n it(\"should apply partial updates to existing props\", () => {\n const { result } = renderHook(() => useTamboInteractable(), { wrapper });\n\n const component: Omit<TamboInteractableComponent, \"id\" | \"createdAt\"> = {\n name: \"TestComponent\",\n description: \"A test component\",\n component: () => <div>Test</div>,\n props: {\n title: \"Original Title\",\n count: 0,\n active: true,\n metadata: { type: \"test\", version: \"1.0\" },\n },\n propsSchema: z.object({\n title: z.string(),\n count: z.number(),\n active: z.boolean(),\n metadata: z.object({\n type: z.string(),\n version: z.string(),\n }),\n }),\n };\n\n let componentId = \"\";\n act(() => {\n componentId = result.current.addInteractableComponent(component);\n });\n\n // Verify initial state\n expect(result.current.interactableComponents[0].props).toEqual({\n title: \"Original Title\",\n count: 0,\n active: true,\n metadata: { type: \"test\", version: \"1.0\" },\n });\n\n // Apply partial update - only change count\n let updateResult = \"\";\n act(() => {\n updateResult = result.current.updateInteractableComponentProps(\n componentId,\n {\n count: 5,\n },\n );\n });\n\n expect(updateResult).toBe(\"Updated successfully\");\n expect(result.current.interactableComponents[0].props).toEqual({\n title: \"Original Title\", // unchanged\n count: 5, // updated\n active: true, // unchanged\n metadata: { type: \"test\", version: \"1.0\" }, // unchanged\n });\n });\n\n it(\"should apply multiple partial updates in sequence\", () => {\n const { result } = renderHook(() => useTamboInteractable(), { wrapper });\n\n const component: Omit<TamboInteractableComponent, \"id\" | \"createdAt\"> = {\n name: \"TestComponent\",\n description: \"A test component\",\n component: () => <div>Test</div>,\n props: {\n title: \"Original Title\",\n count: 0,\n active: true,\n description: \"Original description\",\n },\n propsSchema: z.object({\n title: z.string(),\n count: z.number(),\n active: z.boolean(),\n description: z.string(),\n }),\n };\n\n let componentId = \"\";\n act(() => {\n componentId = result.current.addInteractableComponent(component);\n });\n\n // First partial update - change title and count\n act(() => {\n result.current.updateInteractableComponentProps(componentId, {\n title: \"Updated Title\",\n count: 10,\n });\n });\n\n expect(result.current.interactableComponents[0].props).toEqual({\n title: \"Updated Title\",\n count: 10,\n active: true,\n description: \"Original description\",\n });\n\n // Second partial update - change active and description\n act(() => {\n result.current.updateInteractableComponentProps(componentId, {\n active: false,\n description: \"Updated description\",\n });\n });\n\n expect(result.current.interactableComponents[0].props).toEqual({\n title: \"Updated Title\", // from previous update\n count: 10, // from previous update\n active: false, // new update\n description: \"Updated description\", // new update\n });\n });\n\n it(\"should handle nested object partial updates (shallow merge behavior)\", () => {\n const { result } = renderHook(() => useTamboInteractable(), { wrapper });\n\n const component: Omit<TamboInteractableComponent, \"id\" | \"createdAt\"> = {\n name: \"TestComponent\",\n description: \"A test component\",\n component: () => <div>Test</div>,\n props: {\n title: \"Original Title\",\n config: {\n theme: \"light\",\n language: \"en\",\n features: {\n notifications: true,\n analytics: false,\n },\n },\n },\n propsSchema: z.object({\n title: z.string(),\n config: z.object({\n theme: z.string(),\n language: z.string(),\n features: z.object({\n notifications: z.boolean(),\n analytics: z.boolean(),\n }),\n }),\n }),\n };\n\n let componentId = \"\";\n act(() => {\n componentId = result.current.addInteractableComponent(component);\n });\n\n // Partial update - replace entire config object (shallow merge behavior)\n act(() => {\n result.current.updateInteractableComponentProps(componentId, {\n config: {\n theme: \"dark\",\n // Note: language and features are not provided, so they will be undefined\n // This demonstrates the shallow merge behavior\n },\n });\n });\n\n expect(result.current.interactableComponents[0].props).toEqual({\n title: \"Original Title\",\n config: {\n theme: \"dark\", // updated\n // language and features are now undefined due to shallow merge\n },\n });\n });\n\n it(\"should handle array partial updates\", () => {\n const { result } = renderHook(() => useTamboInteractable(), { wrapper });\n\n const component: Omit<TamboInteractableComponent, \"id\" | \"createdAt\"> = {\n name: \"TestComponent\",\n description: \"A test component\",\n component: () => <div>Test</div>,\n props: {\n title: \"Original Title\",\n items: [\"item1\", \"item2\", \"item3\"],\n tags: [\"tag1\", \"tag2\"],\n },\n propsSchema: z.object({\n title: z.string(),\n items: z.array(z.string()),\n tags: z.array(z.string()),\n }),\n };\n\n let componentId = \"\";\n act(() => {\n componentId = result.current.addInteractableComponent(component);\n });\n\n // Partial update - only change items array\n act(() => {\n result.current.updateInteractableComponentProps(componentId, {\n items: [\"newItem1\", \"newItem2\"],\n });\n });\n\n expect(result.current.interactableComponents[0].props).toEqual({\n title: \"Original Title\", // unchanged\n items: [\"newItem1\", \"newItem2\"], // updated\n tags: [\"tag1\", \"tag2\"], // unchanged\n });\n });\n\n it(\"should handle null and undefined values in partial updates\", () => {\n const { result } = renderHook(() => useTamboInteractable(), { wrapper });\n\n const component: Omit<TamboInteractableComponent, \"id\" | \"createdAt\"> = {\n name: \"TestComponent\",\n description: \"A test component\",\n component: () => <div>Test</div>,\n props: {\n title: \"Original Title\",\n count: 5,\n description: \"Original description\",\n },\n propsSchema: z.object({\n title: z.string(),\n count: z.number(),\n description: z.string(),\n }),\n };\n\n let componentId = \"\";\n act(() => {\n componentId = result.current.addInteractableComponent(component);\n });\n\n // Partial update with null value\n act(() => {\n result.current.updateInteractableComponentProps(componentId, {\n description: null as any,\n });\n });\n\n expect(result.current.interactableComponents[0].props).toEqual({\n title: \"Original Title\",\n count: 5,\n description: null,\n });\n\n // Partial update with undefined value\n act(() => {\n result.current.updateInteractableComponentProps(componentId, {\n count: undefined as any,\n });\n });\n\n expect(result.current.interactableComponents[0].props).toEqual({\n title: \"Original Title\",\n count: undefined,\n description: null,\n });\n });\n });\n\n describe(\"Error Handling\", () => {\n it(\"should return error for non-existent component\", () => {\n const { result } = renderHook(() => useTamboInteractable(), { wrapper });\n\n let updateResult = \"\";\n act(() => {\n updateResult = result.current.updateInteractableComponentProps(\n \"non-existent\",\n {\n title: \"New Title\",\n },\n );\n });\n\n expect(updateResult).toBe(\"Updated successfully\");\n });\n\n it(\"should throw error when component name contains spaces\", () => {\n const { result } = renderHook(() => useTamboInteractable(), { wrapper });\n\n const invalidComponent: Omit<\n TamboInteractableComponent,\n \"id\" | \"createdAt\"\n > = {\n name: \"Invalid Component Name\", // Contains spaces\n description: \"A component with spaces in name\",\n component: () => <div>Invalid</div>,\n props: { title: \"Test\" },\n propsSchema: z.object({ title: z.string() }),\n };\n\n expect(() => {\n act(() => {\n result.current.addInteractableComponent(invalidComponent);\n });\n }).toThrow(\n 'component \"Invalid Component Name\" must only contain letters, numbers, underscores, and hyphens.',\n );\n });\n\n it(\"should return warning for empty props object\", () => {\n const { result } = renderHook(() => useTamboInteractable(), { wrapper });\n\n const component: Omit<TamboInteractableComponent, \"id\" | \"createdAt\"> = {\n name: \"TestComponent\",\n description: \"A test component\",\n component: () => <div>Test</div>,\n props: { title: \"Original Title\" },\n propsSchema: z.object({ title: z.string() }),\n };\n\n let componentId = \"\";\n act(() => {\n componentId = result.current.addInteractableComponent(component);\n });\n\n let updateResult = \"\";\n act(() => {\n updateResult = result.current.updateInteractableComponentProps(\n componentId,\n {},\n );\n });\n\n expect(updateResult).toBe(\n `Warning: No props provided for component with ID ${componentId}.`,\n );\n });\n\n it(\"should return warning for null props\", () => {\n const { result } = renderHook(() => useTamboInteractable(), { wrapper });\n\n const component: Omit<TamboInteractableComponent, \"id\" | \"createdAt\"> = {\n name: \"TestComponent\",\n description: \"A test component\",\n component: () => <div>Test</div>,\n props: { title: \"Original Title\" },\n propsSchema: z.object({ title: z.string() }),\n };\n\n let componentId = \"\";\n act(() => {\n componentId = result.current.addInteractableComponent(component);\n });\n\n let updateResult = \"\";\n act(() => {\n updateResult = result.current.updateInteractableComponentProps(\n componentId,\n null as any,\n );\n });\n\n expect(updateResult).toBe(\n `Warning: No props provided for component with ID ${componentId}.`,\n );\n });\n\n it(\"should return warning for undefined props\", () => {\n const { result } = renderHook(() => useTamboInteractable(), { wrapper });\n\n const component: Omit<TamboInteractableComponent, \"id\" | \"createdAt\"> = {\n name: \"TestComponent\",\n description: \"A test component\",\n component: () => <div>Test</div>,\n props: { title: \"Original Title\" },\n propsSchema: z.object({ title: z.string() }),\n };\n\n let componentId = \"\";\n act(() => {\n componentId = result.current.addInteractableComponent(component);\n });\n\n let updateResult = \"\";\n act(() => {\n updateResult = result.current.updateInteractableComponentProps(\n componentId,\n undefined as any,\n );\n });\n\n expect(updateResult).toBe(\n `Warning: No props provided for component with ID ${componentId}.`,\n );\n });\n });\n\n describe(\"Performance and Efficiency\", () => {\n it(\"should only update changed properties without affecting others\", () => {\n const { result } = renderHook(() => useTamboInteractable(), { wrapper });\n\n const component: Omit<TamboInteractableComponent, \"id\" | \"createdAt\"> = {\n name: \"TestComponent\",\n description: \"A test component\",\n component: () => <div>Test</div>,\n props: {\n title: \"Original Title\",\n count: 0,\n active: true,\n metadata: { type: \"test\", version: \"1.0\" },\n items: [\"item1\", \"item2\"],\n },\n propsSchema: z.object({\n title: z.string(),\n count: z.number(),\n active: z.boolean(),\n metadata: z.object({\n type: z.string(),\n version: z.string(),\n }),\n items: z.array(z.string()),\n }),\n };\n\n let componentId = \"\";\n act(() => {\n componentId = result.current.addInteractableComponent(component);\n });\n\n const originalProps = result.current.interactableComponents[0].props;\n const originalMetadata = originalProps.metadata;\n const originalItems = originalProps.items;\n\n // Apply minimal partial update - only change count\n act(() => {\n result.current.updateInteractableComponentProps(componentId, {\n count: 1,\n });\n });\n\n const updatedProps = result.current.interactableComponents[0].props;\n\n // Verify that only count changed\n expect(updatedProps.count).toBe(1);\n expect(updatedProps.title).toBe(\"Original Title\");\n expect(updatedProps.active).toBe(true);\n\n // Verify that nested objects are preserved (same reference for efficiency)\n expect(updatedProps.metadata).toBe(originalMetadata);\n expect(updatedProps.items).toBe(originalItems);\n });\n\n it(\"should handle large objects efficiently with partial updates\", () => {\n const { result } = renderHook(() => useTamboInteractable(), { wrapper });\n\n // Create a component with a large initial state\n const largeData = {\n users: Array.from({ length: 1000 }, (_, i) => ({\n id: i,\n name: `User ${i}`,\n })),\n settings: {\n theme: \"light\",\n language: \"en\",\n notifications: true,\n privacy: {\n shareData: false,\n analytics: true,\n marketing: false,\n },\n },\n metadata: {\n version: \"1.0.0\",\n build: \"12345\",\n timestamp: Date.now(),\n },\n };\n\n const propsSchema = z.object({\n users: z.array(\n z.object({\n id: z.number(),\n name: z.string(),\n }),\n ),\n settings: z.object({\n theme: z.string(),\n language: z.string(),\n notifications: z.boolean(),\n privacy: z.object({\n shareData: z.boolean(),\n analytics: z.boolean(),\n marketing: z.boolean(),\n }),\n }),\n metadata: z.object({\n version: z.string(),\n build: z.string(),\n timestamp: z.number(),\n }),\n });\n\n const component: Omit<\n TamboInteractableComponent<z.infer<typeof propsSchema>>,\n \"id\" | \"createdAt\"\n > = {\n name: \"TestComponent\",\n description: \"A test component with large data\",\n component: () => <div>Test</div>,\n props: largeData,\n propsSchema,\n };\n\n let componentId = \"\";\n act(() => {\n componentId = result.current.addInteractableComponent(component);\n });\n\n const originalProps = (\n result.current.interactableComponents[0] as TamboInteractableComponent<\n z.infer<typeof propsSchema>\n >\n ).props;\n const originalUsers = originalProps.users;\n\n // Apply a small partial update - only change theme (shallow merge behavior)\n act(() => {\n result.current.updateInteractableComponentProps(componentId, {\n settings: {\n theme: \"dark\",\n // Note: other settings properties are not provided, so they will be undefined\n // This demonstrates the shallow merge behavior\n },\n });\n });\n\n const updatedProps = (\n result.current.interactableComponents[0] as TamboInteractableComponent<\n z.infer<typeof propsSchema>\n >\n ).props;\n\n // Verify the update worked\n expect(updatedProps.settings.theme).toBe(\"dark\");\n // Due to shallow merge, other properties are now undefined\n expect(updatedProps.settings.language).toBeUndefined();\n expect(updatedProps.settings.notifications).toBeUndefined();\n\n // Verify that large arrays are preserved (same reference for efficiency)\n expect(updatedProps.users).toBe(originalUsers);\n\n // Verify that metadata is preserved (not updated)\n expect(updatedProps.metadata).toBe(originalProps.metadata);\n });\n });\n\n describe(\"Edge Cases\", () => {\n it(\"should handle updating a property that doesn't exist in original props\", () => {\n const { result } = renderHook(() => useTamboInteractable(), { wrapper });\n\n const component: Omit<TamboInteractableComponent, \"id\" | \"createdAt\"> = {\n name: \"TestComponent\",\n description: \"A test component\",\n component: () => <div>Test</div>,\n props: {\n title: \"Original Title\",\n count: 0,\n },\n propsSchema: z.object({\n title: z.string(),\n count: z.number(),\n newProperty: z.string().optional(),\n }),\n };\n\n let componentId = \"\";\n act(() => {\n componentId = result.current.addInteractableComponent(component);\n });\n\n // Add a new property that wasn't in the original props\n act(() => {\n result.current.updateInteractableComponentProps(componentId, {\n newProperty: \"New Value\",\n });\n });\n\n expect(result.current.interactableComponents[0].props).toEqual({\n title: \"Original Title\",\n count: 0,\n newProperty: \"New Value\",\n });\n });\n\n it(\"should handle updating with same values (no-op updates)\", () => {\n const { result } = renderHook(() => useTamboInteractable(), { wrapper });\n\n const component: Omit<TamboInteractableComponent, \"id\" | \"createdAt\"> = {\n name: \"TestComponent\",\n description: \"A test component\",\n component: () => <div>Test</div>,\n props: {\n title: \"Original Title\",\n count: 5,\n active: true,\n },\n propsSchema: z.object({\n title: z.string(),\n count: z.number(),\n active: z.boolean(),\n }),\n };\n\n let componentId = \"\";\n act(() => {\n componentId = result.current.addInteractableComponent(component);\n });\n\n const originalProps = result.current.interactableComponents[0].props;\n\n // Update with the same values\n let updateResult = \"\";\n act(() => {\n updateResult = result.current.updateInteractableComponentProps(\n componentId,\n {\n title: \"Original Title\",\n count: 5,\n active: true,\n },\n );\n });\n\n expect(updateResult).toBe(\"Updated successfully\");\n expect(result.current.interactableComponents[0].props).toEqual(\n originalProps,\n );\n });\n\n it(\"should handle proper nested partial updates by providing complete nested structure\", () => {\n const { result } = renderHook(() => useTamboInteractable(), { wrapper });\n\n const component: Omit<TamboInteractableComponent, \"id\" | \"createdAt\"> = {\n name: \"TestComponent\",\n description: \"A test component\",\n component: () => <div>Test</div>,\n props: {\n title: \"Original Title\",\n config: {\n theme: \"light\",\n language: \"en\",\n features: {\n notifications: true,\n analytics: false,\n experimental: {\n beta: false,\n alpha: true,\n },\n },\n },\n },\n propsSchema: z.object({\n title: z.string(),\n config: z.object({\n theme: z.string(),\n language: z.string(),\n features: z.object({\n notifications: z.boolean(),\n analytics: z.boolean(),\n experimental: z.object({\n beta: z.boolean(),\n alpha: z.boolean(),\n }),\n }),\n }),\n }),\n };\n\n let componentId = \"\";\n act(() => {\n componentId = result.current.addInteractableComponent(component);\n });\n\n // Proper nested partial update - provide complete nested structure\n act(() => {\n result.current.updateInteractableComponentProps(componentId, {\n config: {\n theme: \"light\", // keep original\n language: \"en\", // keep original\n features: {\n notifications: true, // keep original\n analytics: false, // keep original\n experimental: {\n beta: true, // update this\n alpha: true, // keep original\n },\n },\n },\n });\n });\n\n expect(result.current.interactableComponents[0].props).toEqual({\n title: \"Original Title\",\n config: {\n theme: \"light\", // unchanged\n language: \"en\", // unchanged\n features: {\n notifications: true, // unchanged\n analytics: false, // unchanged\n experimental: {\n beta: true, // updated\n alpha: true, // unchanged\n },\n },\n },\n });\n });\n\n it(\"should handle complex nested partial updates (shallow merge behavior)\", () => {\n const { result } = renderHook(() => useTamboInteractable(), { wrapper });\n\n const component: Omit<TamboInteractableComponent, \"id\" | \"createdAt\"> = {\n name: \"TestComponent\",\n description: \"A test component\",\n component: () => <div>Test</div>,\n props: {\n title: \"Original Title\",\n config: {\n theme: \"light\",\n language: \"en\",\n features: {\n notifications: true,\n analytics: false,\n experimental: {\n beta: false,\n alpha: true,\n },\n },\n },\n },\n propsSchema: z.object({\n title: z.string(),\n config: z.object({\n theme: z.string(),\n language: z.string(),\n features: z.object({\n notifications: z.boolean(),\n analytics: z.boolean(),\n experimental: z.object({\n beta: z.boolean(),\n alpha: z.boolean(),\n }),\n }),\n }),\n }),\n };\n\n let componentId = \"\";\n act(() => {\n componentId = result.current.addInteractableComponent(component);\n });\n\n // Deep nested partial update - only change beta flag (shallow merge behavior)\n act(() => {\n result.current.updateInteractableComponentProps(componentId, {\n config: {\n features: {\n experimental: {\n beta: true,\n // Note: alpha is not provided, so it will be undefined\n // This demonstrates the shallow merge behavior\n },\n },\n },\n });\n });\n\n expect(result.current.interactableComponents[0].props).toEqual({\n title: \"Original Title\",\n config: {\n // theme and language are now undefined due to shallow merge\n features: {\n // notifications and analytics are now undefined due to shallow merge\n experimental: {\n beta: true, // updated\n // alpha is now undefined due to shallow merge\n },\n },\n },\n });\n });\n });\n});\n"]}
1
+ {"version":3,"file":"tambo-interactable-provider-partial-updates.test.js","sourceRoot":"","sources":["../../src/providers/tambo-interactable-provider-partial-updates.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import { act, renderHook } from \"@testing-library/react\";\nimport React from \"react\";\nimport { z } from \"zod/v4\";\nimport { TamboInteractableComponent } from \"../model/tambo-interactable\";\nimport {\n TamboInteractableProvider,\n useTamboInteractable,\n} from \"./tambo-interactable-provider\";\n\n// Mock the context helpers\nconst mockAddContextHelper = jest.fn();\nconst mockRemoveContextHelper = jest.fn();\n\njest.mock(\"./tambo-context-helpers-provider\", () => ({\n TamboContextHelpersProvider: ({\n children,\n }: {\n children: React.ReactNode;\n }) => <>{children}</>,\n useTamboContextHelpers: () => ({\n addContextHelper: mockAddContextHelper,\n removeContextHelper: mockRemoveContextHelper,\n }),\n}));\n\n// Mock the registry provider\nconst mockRegisterTool = jest.fn();\nconst mockUnregisterTools = jest.fn();\n\njest.mock(\"./tambo-registry-provider\", () => ({\n useTamboRegistry: () => ({\n registerTool: mockRegisterTool,\n unregisterTools: mockUnregisterTools,\n }),\n}));\n\n// Mock the context helper creation\njest.mock(\"../context-helpers/current-interactables-context-helper\", () => ({\n createInteractablesContextHelper: () =>\n jest.fn(() => ({\n name: \"interactables\",\n context: {\n description: \"Test interactables context\",\n components: [],\n },\n })),\n}));\n\ndescribe(\"updateInteractableComponentProps - Partial Updates\", () => {\n beforeEach(() => {\n jest.clearAllMocks();\n });\n\n const wrapper = ({ children }: { children: React.ReactNode }) => (\n <TamboInteractableProvider>{children}</TamboInteractableProvider>\n );\n\n describe(\"Partial Updates Functionality\", () => {\n it(\"should apply partial updates to existing props\", () => {\n const { result } = renderHook(() => useTamboInteractable(), { wrapper });\n\n const component: Omit<TamboInteractableComponent, \"id\" | \"createdAt\"> = {\n name: \"TestComponent\",\n description: \"A test component\",\n component: () => <div>Test</div>,\n props: {\n title: \"Original Title\",\n count: 0,\n active: true,\n metadata: { type: \"test\", version: \"1.0\" },\n },\n propsSchema: z.object({\n title: z.string(),\n count: z.number(),\n active: z.boolean(),\n metadata: z.object({\n type: z.string(),\n version: z.string(),\n }),\n }),\n };\n\n let componentId = \"\";\n act(() => {\n componentId = result.current.addInteractableComponent(component);\n });\n\n // Verify initial state\n expect(result.current.interactableComponents[0].props).toEqual({\n title: \"Original Title\",\n count: 0,\n active: true,\n metadata: { type: \"test\", version: \"1.0\" },\n });\n\n // Apply partial update - only change count\n let updateResult = \"\";\n act(() => {\n updateResult = result.current.updateInteractableComponentProps(\n componentId,\n {\n count: 5,\n },\n );\n });\n\n expect(updateResult).toBe(\"Updated successfully\");\n expect(result.current.interactableComponents[0].props).toEqual({\n title: \"Original Title\", // unchanged\n count: 5, // updated\n active: true, // unchanged\n metadata: { type: \"test\", version: \"1.0\" }, // unchanged\n });\n });\n\n it(\"should apply multiple partial updates in sequence\", () => {\n const { result } = renderHook(() => useTamboInteractable(), { wrapper });\n\n const component: Omit<TamboInteractableComponent, \"id\" | \"createdAt\"> = {\n name: \"TestComponent\",\n description: \"A test component\",\n component: () => <div>Test</div>,\n props: {\n title: \"Original Title\",\n count: 0,\n active: true,\n description: \"Original description\",\n },\n propsSchema: z.object({\n title: z.string(),\n count: z.number(),\n active: z.boolean(),\n description: z.string(),\n }),\n };\n\n let componentId = \"\";\n act(() => {\n componentId = result.current.addInteractableComponent(component);\n });\n\n // First partial update - change title and count\n act(() => {\n result.current.updateInteractableComponentProps(componentId, {\n title: \"Updated Title\",\n count: 10,\n });\n });\n\n expect(result.current.interactableComponents[0].props).toEqual({\n title: \"Updated Title\",\n count: 10,\n active: true,\n description: \"Original description\",\n });\n\n // Second partial update - change active and description\n act(() => {\n result.current.updateInteractableComponentProps(componentId, {\n active: false,\n description: \"Updated description\",\n });\n });\n\n expect(result.current.interactableComponents[0].props).toEqual({\n title: \"Updated Title\", // from previous update\n count: 10, // from previous update\n active: false, // new update\n description: \"Updated description\", // new update\n });\n });\n\n it(\"should handle nested object partial updates (shallow merge behavior)\", () => {\n const { result } = renderHook(() => useTamboInteractable(), { wrapper });\n\n const component: Omit<TamboInteractableComponent, \"id\" | \"createdAt\"> = {\n name: \"TestComponent\",\n description: \"A test component\",\n component: () => <div>Test</div>,\n props: {\n title: \"Original Title\",\n config: {\n theme: \"light\",\n language: \"en\",\n features: {\n notifications: true,\n analytics: false,\n },\n },\n },\n propsSchema: z.object({\n title: z.string(),\n config: z.object({\n theme: z.string(),\n language: z.string(),\n features: z.object({\n notifications: z.boolean(),\n analytics: z.boolean(),\n }),\n }),\n }),\n };\n\n let componentId = \"\";\n act(() => {\n componentId = result.current.addInteractableComponent(component);\n });\n\n // Partial update - replace entire config object (shallow merge behavior)\n act(() => {\n result.current.updateInteractableComponentProps(componentId, {\n config: {\n theme: \"dark\",\n // Note: language and features are not provided, so they will be undefined\n // This demonstrates the shallow merge behavior\n },\n });\n });\n\n expect(result.current.interactableComponents[0].props).toEqual({\n title: \"Original Title\",\n config: {\n theme: \"dark\", // updated\n // language and features are now undefined due to shallow merge\n },\n });\n });\n\n it(\"should handle array partial updates\", () => {\n const { result } = renderHook(() => useTamboInteractable(), { wrapper });\n\n const component: Omit<TamboInteractableComponent, \"id\" | \"createdAt\"> = {\n name: \"TestComponent\",\n description: \"A test component\",\n component: () => <div>Test</div>,\n props: {\n title: \"Original Title\",\n items: [\"item1\", \"item2\", \"item3\"],\n tags: [\"tag1\", \"tag2\"],\n },\n propsSchema: z.object({\n title: z.string(),\n items: z.array(z.string()),\n tags: z.array(z.string()),\n }),\n };\n\n let componentId = \"\";\n act(() => {\n componentId = result.current.addInteractableComponent(component);\n });\n\n // Partial update - only change items array\n act(() => {\n result.current.updateInteractableComponentProps(componentId, {\n items: [\"newItem1\", \"newItem2\"],\n });\n });\n\n expect(result.current.interactableComponents[0].props).toEqual({\n title: \"Original Title\", // unchanged\n items: [\"newItem1\", \"newItem2\"], // updated\n tags: [\"tag1\", \"tag2\"], // unchanged\n });\n });\n\n it(\"should handle null and undefined values in partial updates\", () => {\n const { result } = renderHook(() => useTamboInteractable(), { wrapper });\n\n const component: Omit<TamboInteractableComponent, \"id\" | \"createdAt\"> = {\n name: \"TestComponent\",\n description: \"A test component\",\n component: () => <div>Test</div>,\n props: {\n title: \"Original Title\",\n count: 5,\n description: \"Original description\",\n },\n propsSchema: z.object({\n title: z.string(),\n count: z.number(),\n description: z.string(),\n }),\n };\n\n let componentId = \"\";\n act(() => {\n componentId = result.current.addInteractableComponent(component);\n });\n\n // Partial update with null value\n act(() => {\n result.current.updateInteractableComponentProps(componentId, {\n description: null as any,\n });\n });\n\n expect(result.current.interactableComponents[0].props).toEqual({\n title: \"Original Title\",\n count: 5,\n description: null,\n });\n\n // Partial update with undefined value\n act(() => {\n result.current.updateInteractableComponentProps(componentId, {\n count: undefined as any,\n });\n });\n\n expect(result.current.interactableComponents[0].props).toEqual({\n title: \"Original Title\",\n count: undefined,\n description: null,\n });\n });\n });\n\n describe(\"Error Handling\", () => {\n it(\"should return error for non-existent component\", () => {\n const { result } = renderHook(() => useTamboInteractable(), { wrapper });\n\n let updateResult = \"\";\n act(() => {\n updateResult = result.current.updateInteractableComponentProps(\n \"non-existent\",\n {\n title: \"New Title\",\n },\n );\n });\n\n expect(updateResult).toBe(\"Updated successfully\");\n });\n\n it(\"should throw error when component name contains spaces\", () => {\n const { result } = renderHook(() => useTamboInteractable(), { wrapper });\n\n const invalidComponent: Omit<\n TamboInteractableComponent,\n \"id\" | \"createdAt\"\n > = {\n name: \"Invalid Component Name\", // Contains spaces\n description: \"A component with spaces in name\",\n component: () => <div>Invalid</div>,\n props: { title: \"Test\" },\n propsSchema: z.object({ title: z.string() }),\n };\n\n expect(() => {\n act(() => {\n result.current.addInteractableComponent(invalidComponent);\n });\n }).toThrow(\n 'component \"Invalid Component Name\" must only contain letters, numbers, underscores, and hyphens.',\n );\n });\n\n it(\"should return warning for empty props object\", () => {\n const { result } = renderHook(() => useTamboInteractable(), { wrapper });\n\n const component: Omit<TamboInteractableComponent, \"id\" | \"createdAt\"> = {\n name: \"TestComponent\",\n description: \"A test component\",\n component: () => <div>Test</div>,\n props: { title: \"Original Title\" },\n propsSchema: z.object({ title: z.string() }),\n };\n\n let componentId = \"\";\n act(() => {\n componentId = result.current.addInteractableComponent(component);\n });\n\n let updateResult = \"\";\n act(() => {\n updateResult = result.current.updateInteractableComponentProps(\n componentId,\n {},\n );\n });\n\n expect(updateResult).toBe(\n `Warning: No props provided for component with ID ${componentId}.`,\n );\n });\n\n it(\"should return warning for null props\", () => {\n const { result } = renderHook(() => useTamboInteractable(), { wrapper });\n\n const component: Omit<TamboInteractableComponent, \"id\" | \"createdAt\"> = {\n name: \"TestComponent\",\n description: \"A test component\",\n component: () => <div>Test</div>,\n props: { title: \"Original Title\" },\n propsSchema: z.object({ title: z.string() }),\n };\n\n let componentId = \"\";\n act(() => {\n componentId = result.current.addInteractableComponent(component);\n });\n\n let updateResult = \"\";\n act(() => {\n updateResult = result.current.updateInteractableComponentProps(\n componentId,\n null as any,\n );\n });\n\n expect(updateResult).toBe(\n `Warning: No props provided for component with ID ${componentId}.`,\n );\n });\n\n it(\"should return warning for undefined props\", () => {\n const { result } = renderHook(() => useTamboInteractable(), { wrapper });\n\n const component: Omit<TamboInteractableComponent, \"id\" | \"createdAt\"> = {\n name: \"TestComponent\",\n description: \"A test component\",\n component: () => <div>Test</div>,\n props: { title: \"Original Title\" },\n propsSchema: z.object({ title: z.string() }),\n };\n\n let componentId = \"\";\n act(() => {\n componentId = result.current.addInteractableComponent(component);\n });\n\n let updateResult = \"\";\n act(() => {\n updateResult = result.current.updateInteractableComponentProps(\n componentId,\n undefined as any,\n );\n });\n\n expect(updateResult).toBe(\n `Warning: No props provided for component with ID ${componentId}.`,\n );\n });\n });\n\n describe(\"Performance and Efficiency\", () => {\n it(\"should only update changed properties without affecting others\", () => {\n const { result } = renderHook(() => useTamboInteractable(), { wrapper });\n\n const component: Omit<TamboInteractableComponent, \"id\" | \"createdAt\"> = {\n name: \"TestComponent\",\n description: \"A test component\",\n component: () => <div>Test</div>,\n props: {\n title: \"Original Title\",\n count: 0,\n active: true,\n metadata: { type: \"test\", version: \"1.0\" },\n items: [\"item1\", \"item2\"],\n },\n propsSchema: z.object({\n title: z.string(),\n count: z.number(),\n active: z.boolean(),\n metadata: z.object({\n type: z.string(),\n version: z.string(),\n }),\n items: z.array(z.string()),\n }),\n };\n\n let componentId = \"\";\n act(() => {\n componentId = result.current.addInteractableComponent(component);\n });\n\n const originalProps = result.current.interactableComponents[0].props;\n const originalMetadata = originalProps.metadata;\n const originalItems = originalProps.items;\n\n // Apply minimal partial update - only change count\n act(() => {\n result.current.updateInteractableComponentProps(componentId, {\n count: 1,\n });\n });\n\n const updatedProps = result.current.interactableComponents[0].props;\n\n // Verify that only count changed\n expect(updatedProps.count).toBe(1);\n expect(updatedProps.title).toBe(\"Original Title\");\n expect(updatedProps.active).toBe(true);\n\n // Verify that nested objects are preserved (same reference for efficiency)\n expect(updatedProps.metadata).toBe(originalMetadata);\n expect(updatedProps.items).toBe(originalItems);\n });\n\n it(\"should handle large objects efficiently with partial updates\", () => {\n const { result } = renderHook(() => useTamboInteractable(), { wrapper });\n\n // Create a component with a large initial state\n const largeData = {\n users: Array.from({ length: 1000 }, (_, i) => ({\n id: i,\n name: `User ${i}`,\n })),\n settings: {\n theme: \"light\",\n language: \"en\",\n notifications: true,\n privacy: {\n shareData: false,\n analytics: true,\n marketing: false,\n },\n },\n metadata: {\n version: \"1.0.0\",\n build: \"12345\",\n timestamp: Date.now(),\n },\n };\n\n const propsSchema = z.object({\n users: z.array(\n z.object({\n id: z.number(),\n name: z.string(),\n }),\n ),\n settings: z.object({\n theme: z.string(),\n language: z.string(),\n notifications: z.boolean(),\n privacy: z.object({\n shareData: z.boolean(),\n analytics: z.boolean(),\n marketing: z.boolean(),\n }),\n }),\n metadata: z.object({\n version: z.string(),\n build: z.string(),\n timestamp: z.number(),\n }),\n });\n\n const component: Omit<\n TamboInteractableComponent<z.infer<typeof propsSchema>>,\n \"id\" | \"createdAt\"\n > = {\n name: \"TestComponent\",\n description: \"A test component with large data\",\n component: () => <div>Test</div>,\n props: largeData,\n propsSchema,\n };\n\n let componentId = \"\";\n act(() => {\n componentId = result.current.addInteractableComponent(component);\n });\n\n const originalProps = (\n result.current.interactableComponents[0] as TamboInteractableComponent<\n z.infer<typeof propsSchema>\n >\n ).props;\n const originalUsers = originalProps.users;\n\n // Apply a small partial update - only change theme (shallow merge behavior)\n act(() => {\n result.current.updateInteractableComponentProps(componentId, {\n settings: {\n theme: \"dark\",\n // Note: other settings properties are not provided, so they will be undefined\n // This demonstrates the shallow merge behavior\n },\n });\n });\n\n const updatedProps = (\n result.current.interactableComponents[0] as TamboInteractableComponent<\n z.infer<typeof propsSchema>\n >\n ).props;\n\n // Verify the update worked\n expect(updatedProps.settings.theme).toBe(\"dark\");\n // Due to shallow merge, other properties are now undefined\n expect(updatedProps.settings.language).toBeUndefined();\n expect(updatedProps.settings.notifications).toBeUndefined();\n\n // Verify that large arrays are preserved (same reference for efficiency)\n expect(updatedProps.users).toBe(originalUsers);\n\n // Verify that metadata is preserved (not updated)\n expect(updatedProps.metadata).toBe(originalProps.metadata);\n });\n });\n\n describe(\"Edge Cases\", () => {\n it(\"should handle updating a property that doesn't exist in original props\", () => {\n const { result } = renderHook(() => useTamboInteractable(), { wrapper });\n\n const component: Omit<TamboInteractableComponent, \"id\" | \"createdAt\"> = {\n name: \"TestComponent\",\n description: \"A test component\",\n component: () => <div>Test</div>,\n props: {\n title: \"Original Title\",\n count: 0,\n },\n propsSchema: z.object({\n title: z.string(),\n count: z.number(),\n newProperty: z.string().optional(),\n }),\n };\n\n let componentId = \"\";\n act(() => {\n componentId = result.current.addInteractableComponent(component);\n });\n\n // Add a new property that wasn't in the original props\n act(() => {\n result.current.updateInteractableComponentProps(componentId, {\n newProperty: \"New Value\",\n });\n });\n\n expect(result.current.interactableComponents[0].props).toEqual({\n title: \"Original Title\",\n count: 0,\n newProperty: \"New Value\",\n });\n });\n\n it(\"should handle updating with same values (no-op updates)\", () => {\n const { result } = renderHook(() => useTamboInteractable(), { wrapper });\n\n const component: Omit<TamboInteractableComponent, \"id\" | \"createdAt\"> = {\n name: \"TestComponent\",\n description: \"A test component\",\n component: () => <div>Test</div>,\n props: {\n title: \"Original Title\",\n count: 5,\n active: true,\n },\n propsSchema: z.object({\n title: z.string(),\n count: z.number(),\n active: z.boolean(),\n }),\n };\n\n let componentId = \"\";\n act(() => {\n componentId = result.current.addInteractableComponent(component);\n });\n\n const originalProps = result.current.interactableComponents[0].props;\n\n // Update with the same values\n let updateResult = \"\";\n act(() => {\n updateResult = result.current.updateInteractableComponentProps(\n componentId,\n {\n title: \"Original Title\",\n count: 5,\n active: true,\n },\n );\n });\n\n expect(updateResult).toBe(\"Updated successfully\");\n expect(result.current.interactableComponents[0].props).toEqual(\n originalProps,\n );\n });\n\n it(\"should handle proper nested partial updates by providing complete nested structure\", () => {\n const { result } = renderHook(() => useTamboInteractable(), { wrapper });\n\n const component: Omit<TamboInteractableComponent, \"id\" | \"createdAt\"> = {\n name: \"TestComponent\",\n description: \"A test component\",\n component: () => <div>Test</div>,\n props: {\n title: \"Original Title\",\n config: {\n theme: \"light\",\n language: \"en\",\n features: {\n notifications: true,\n analytics: false,\n experimental: {\n beta: false,\n alpha: true,\n },\n },\n },\n },\n propsSchema: z.object({\n title: z.string(),\n config: z.object({\n theme: z.string(),\n language: z.string(),\n features: z.object({\n notifications: z.boolean(),\n analytics: z.boolean(),\n experimental: z.object({\n beta: z.boolean(),\n alpha: z.boolean(),\n }),\n }),\n }),\n }),\n };\n\n let componentId = \"\";\n act(() => {\n componentId = result.current.addInteractableComponent(component);\n });\n\n // Proper nested partial update - provide complete nested structure\n act(() => {\n result.current.updateInteractableComponentProps(componentId, {\n config: {\n theme: \"light\", // keep original\n language: \"en\", // keep original\n features: {\n notifications: true, // keep original\n analytics: false, // keep original\n experimental: {\n beta: true, // update this\n alpha: true, // keep original\n },\n },\n },\n });\n });\n\n expect(result.current.interactableComponents[0].props).toEqual({\n title: \"Original Title\",\n config: {\n theme: \"light\", // unchanged\n language: \"en\", // unchanged\n features: {\n notifications: true, // unchanged\n analytics: false, // unchanged\n experimental: {\n beta: true, // updated\n alpha: true, // unchanged\n },\n },\n },\n });\n });\n\n it(\"should handle complex nested partial updates (shallow merge behavior)\", () => {\n const { result } = renderHook(() => useTamboInteractable(), { wrapper });\n\n const component: Omit<TamboInteractableComponent, \"id\" | \"createdAt\"> = {\n name: \"TestComponent\",\n description: \"A test component\",\n component: () => <div>Test</div>,\n props: {\n title: \"Original Title\",\n config: {\n theme: \"light\",\n language: \"en\",\n features: {\n notifications: true,\n analytics: false,\n experimental: {\n beta: false,\n alpha: true,\n },\n },\n },\n },\n propsSchema: z.object({\n title: z.string(),\n config: z.object({\n theme: z.string(),\n language: z.string(),\n features: z.object({\n notifications: z.boolean(),\n analytics: z.boolean(),\n experimental: z.object({\n beta: z.boolean(),\n alpha: z.boolean(),\n }),\n }),\n }),\n }),\n };\n\n let componentId = \"\";\n act(() => {\n componentId = result.current.addInteractableComponent(component);\n });\n\n // Deep nested partial update - only change beta flag (shallow merge behavior)\n act(() => {\n result.current.updateInteractableComponentProps(componentId, {\n config: {\n features: {\n experimental: {\n beta: true,\n // Note: alpha is not provided, so it will be undefined\n // This demonstrates the shallow merge behavior\n },\n },\n },\n });\n });\n\n expect(result.current.interactableComponents[0].props).toEqual({\n title: \"Original Title\",\n config: {\n // theme and language are now undefined due to shallow merge\n features: {\n // notifications and analytics are now undefined due to shallow merge\n experimental: {\n beta: true, // updated\n // alpha is now undefined due to shallow merge\n },\n },\n },\n });\n });\n });\n});\n"]}
@@ -29,15 +29,15 @@ export declare const useCurrentInteractablesSnapshot: () => {
29
29
  id: string;
30
30
  isSelected?: boolean;
31
31
  state?: Record<string, unknown> | undefined;
32
- stateSchema?: import("../schema").SupportedSchema<Record<string, unknown>> | undefined;
33
- name: string;
34
- description: string;
32
+ stateSchema?: import("@tambo-ai/client/dist/model/component-metadata").SupportedSchema<Record<string, unknown>> | undefined;
35
33
  component: React.ComponentType<any>;
36
- propsSchema?: import("../schema").SupportedSchema;
37
- propsDefinition?: any;
38
34
  loadingComponent?: React.ComponentType<any>;
39
- associatedTools?: import("..").TamboTool[];
40
- annotations?: import("..").ToolAnnotations;
35
+ description: string;
36
+ name: string;
37
+ propsSchema?: import("@tambo-ai/client/dist/model/component-metadata").SupportedSchema | undefined;
38
+ propsDefinition?: any;
39
+ associatedTools?: import("@tambo-ai/client").TamboTool[] | undefined;
40
+ annotations?: import("@tambo-ai/client").ToolAnnotations | undefined;
41
41
  }[];
42
42
  export {};
43
43
  //# sourceMappingURL=tambo-interactable-provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tambo-interactable-provider.d.ts","sourceRoot":"","sources":["../../src/providers/tambo-interactable-provider.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,EAEZ,iBAAiB,EAMlB,MAAM,OAAO,CAAC;AAGf,OAAO,EAEL,KAAK,wBAAwB,EAC9B,MAAM,6BAA6B,CAAC;AAMrC,QAAA,MAAM,wBAAwB,yCAY5B,CAAC;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,yBAAyB,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CA8cjE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,gCAEhC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;GAS3C,CAAC"}
1
+ {"version":3,"file":"tambo-interactable-provider.d.ts","sourceRoot":"","sources":["../../src/providers/tambo-interactable-provider.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,EAEZ,iBAAiB,EAMlB,MAAM,OAAO,CAAC;AAGf,OAAO,EAEL,KAAK,wBAAwB,EAC9B,MAAM,6BAA6B,CAAC;AAMrC,QAAA,MAAM,wBAAwB,yCAY5B,CAAC;AAkBH;;;;;;;GAOG;AACH,eAAO,MAAM,yBAAyB,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CA0djE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,gCAEhC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;GAS3C,CAAC"}
@@ -57,6 +57,20 @@ const TamboInteractableContext = (0, react_1.createContext)({
57
57
  setInteractableSelected: () => { },
58
58
  clearInteractableSelections: () => { },
59
59
  });
60
+ /**
61
+ * Returns the per-component tool names that get registered for a given interactable ID.
62
+ * @param id - The interactable component ID
63
+ * @returns The tool names for props and state updates
64
+ */
65
+ function perComponentToolNames(id) {
66
+ return [`update_component_props_${id}`, `update_component_state_${id}`];
67
+ }
68
+ /** Tool names registered globally when at least one interactable component exists. */
69
+ const GLOBAL_INTERACTABLE_TOOL_NAMES = [
70
+ "get_all_interactable_components",
71
+ "get_interactable_component_by_id",
72
+ "remove_interactable_component",
73
+ ];
60
74
  /**
61
75
  * The TamboInteractableProvider manages a list of components that are currently
62
76
  * interactable, allowing tambo to interact with them by updating their props. It also registers tools
@@ -67,7 +81,7 @@ const TamboInteractableContext = (0, react_1.createContext)({
67
81
  */
68
82
  const TamboInteractableProvider = ({ children, }) => {
69
83
  const [interactableComponents, setInteractableComponents] = (0, react_1.useState)([]);
70
- const { registerTool } = (0, tambo_registry_provider_1.useTamboRegistry)();
84
+ const { registerTool, unregisterTools } = (0, tambo_registry_provider_1.useTamboRegistry)();
71
85
  const { addContextHelper, removeContextHelper } = (0, tambo_context_helpers_provider_1.useTamboContextHelpers)();
72
86
  // Create a stable context helper function for interactable components
73
87
  const interactablesContextHelper = (0, react_1.useMemo)(() => (0, current_interactables_context_helper_1.createInteractablesContextHelper)(interactableComponents), [interactableComponents]);
@@ -149,6 +163,7 @@ const TamboInteractableProvider = ({ children, }) => {
149
163
  error: `Component with ID ${componentId} not found`,
150
164
  };
151
165
  }
166
+ unregisterTools(perComponentToolNames(componentId));
152
167
  setInteractableComponents((prev) => prev.filter((c) => c.id !== componentId));
153
168
  return {
154
169
  success: true,
@@ -180,7 +195,11 @@ const TamboInteractableProvider = ({ children, }) => {
180
195
  ]),
181
196
  });
182
197
  }
183
- }, [interactableComponents, registerTool]);
198
+ else {
199
+ // No interactable components — remove the global tools
200
+ unregisterTools(GLOBAL_INTERACTABLE_TOOL_NAMES);
201
+ }
202
+ }, [interactableComponents, registerTool, unregisterTools]);
184
203
  const updateInteractableComponentProps = (0, react_1.useCallback)((id, newProps) => {
185
204
  if (!newProps || Object.keys(newProps).length === 0) {
186
205
  return `Warning: No props provided for component with ID ${id}.`;
@@ -343,8 +362,9 @@ const TamboInteractableProvider = ({ children, }) => {
343
362
  registerInteractableComponentStateUpdateTool,
344
363
  ]);
345
364
  const removeInteractableComponent = (0, react_1.useCallback)((id) => {
365
+ unregisterTools(perComponentToolNames(id));
346
366
  setInteractableComponents((prev) => prev.filter((c) => c.id !== id));
347
- }, []);
367
+ }, [unregisterTools]);
348
368
  const getInteractableComponent = (0, react_1.useCallback)((id) => {
349
369
  return interactableComponents.find((c) => c.id === id);
350
370
  }, [interactableComponents]);
@@ -352,8 +372,10 @@ const TamboInteractableProvider = ({ children, }) => {
352
372
  return interactableComponents.filter((c) => c.name === componentName);
353
373
  }, [interactableComponents]);
354
374
  const clearAllInteractableComponents = (0, react_1.useCallback)(() => {
375
+ const toolNames = interactableComponents.flatMap((c) => perComponentToolNames(c.id));
376
+ unregisterTools(toolNames);
355
377
  setInteractableComponents([]);
356
- }, []);
378
+ }, [interactableComponents, unregisterTools]);
357
379
  const setInteractableStateValue = (0, react_1.useCallback)((componentId, key, value) => {
358
380
  setInteractableComponents((prev) => {
359
381
  const component = prev.find((c) => c.id === componentId);
@@ -1 +1 @@
1
- {"version":3,"file":"tambo-interactable-provider.js","sourceRoot":"","sources":["../../src/providers/tambo-interactable-provider.tsx"],"names":[],"mappings":"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","sourcesContent":["// react-sdk/src/providers/tambo-interactable-provider.tsx\n\"use client\";\nimport { deepEqual } from \"fast-equals\";\nimport { JSONSchema7 } from \"json-schema\";\nimport React, {\n createContext,\n PropsWithChildren,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { z } from \"zod/v3\";\nimport { createInteractablesContextHelper } from \"../context-helpers/current-interactables-context-helper\";\nimport {\n TamboInteractableComponent,\n type TamboInteractableContext,\n} from \"../model/tambo-interactable\";\nimport { makeJsonSchemaPartial, schemaToJsonSchema } from \"../schema\";\nimport { assertValidName } from \"../util/validate-component-name\";\nimport { useTamboRegistry } from \"./tambo-registry-provider\";\nimport { useTamboContextHelpers } from \"./tambo-context-helpers-provider\";\n\nconst TamboInteractableContext = createContext<TamboInteractableContext>({\n interactableComponents: [],\n addInteractableComponent: () => \"\",\n removeInteractableComponent: () => {},\n updateInteractableComponentProps: () => \"\",\n getInteractableComponent: () => undefined,\n getInteractableComponentsByName: () => [],\n clearAllInteractableComponents: () => {},\n setInteractableState: () => {},\n getInteractableComponentState: () => undefined,\n setInteractableSelected: () => {},\n clearInteractableSelections: () => {},\n});\n\n/**\n * The TamboInteractableProvider manages a list of components that are currently\n * interactable, allowing tambo to interact with them by updating their props. It also registers tools\n * for Tambo to perform CRUD operations on the components list.\n * @param props - The props for the TamboInteractableProvider\n * @param props.children - The children to wrap\n * @returns The TamboInteractableProvider component\n */\nexport const TamboInteractableProvider: React.FC<PropsWithChildren> = ({\n children,\n}) => {\n const [interactableComponents, setInteractableComponents] = useState<\n TamboInteractableComponent[]\n >([]);\n const { registerTool } = useTamboRegistry();\n const { addContextHelper, removeContextHelper } = useTamboContextHelpers();\n\n // Create a stable context helper function for interactable components\n const interactablesContextHelper = useMemo(\n () => createInteractablesContextHelper(interactableComponents),\n [interactableComponents],\n );\n\n // Register the interactables context helper\n useEffect(() => {\n addContextHelper(\"interactables\", interactablesContextHelper);\n\n return () => {\n removeContextHelper(\"interactables\");\n };\n }, [interactablesContextHelper, addContextHelper, removeContextHelper]);\n\n useEffect(() => {\n if (interactableComponents.length > 0) {\n registerTool({\n name: \"get_all_interactable_components\",\n description:\n \"Only use this tool if the user is asking about interactable components.Get all currently interactable components with their details including their current props. These are components that you can interact with on behalf of the user.\",\n tool: () => {\n return {\n components: interactableComponents,\n };\n },\n inputSchema: z.object({}),\n outputSchema: z.object({\n components: z.array(\n z.object({\n id: z.string(),\n name: z.string(),\n props: z.record(z.string(), z.any()),\n propsSchema: z.record(z.string(), z.any()).optional(),\n }),\n ),\n }),\n });\n\n registerTool({\n name: \"get_interactable_component_by_id\",\n description: \"Get a specific interactable component by its ID\",\n tool: ({ componentId }) => {\n const component = interactableComponents.find(\n (c) => c.id === componentId,\n );\n\n if (!component) {\n return {\n success: false,\n error: `Component with ID ${componentId} not found`,\n } as const;\n }\n\n return {\n success: true,\n component: {\n id: component.id,\n componentName: component.name,\n props: component.props,\n },\n } as const;\n },\n inputSchema: z.object({\n componentId: z.string().describe(\"The ID of the component\"),\n }),\n outputSchema: z.discriminatedUnion(\"success\", [\n z.object({\n success: z.literal(true),\n component: z\n .object({\n id: z.string(),\n componentName: z.string(),\n props: z.record(z.string(), z.any()),\n })\n .optional(),\n }),\n z.object({\n success: z.literal(false),\n error: z.string(),\n }),\n ]),\n });\n\n registerTool({\n name: \"remove_interactable_component\",\n description: \"Remove an interactable component from the system\",\n tool: ({ componentId }) => {\n const component = interactableComponents.find(\n (c) => c.id === componentId,\n );\n\n if (!component) {\n return {\n success: false,\n error: `Component with ID ${componentId} not found`,\n } as const;\n }\n\n setInteractableComponents((prev) =>\n prev.filter((c) => c.id !== componentId),\n );\n\n return {\n success: true,\n componentId,\n removedComponent: {\n id: component.id,\n componentName: component.name,\n props: component.props,\n },\n } as const;\n },\n inputSchema: z.object({\n componentId: z.string().describe(\"The ID of the component\"),\n }),\n outputSchema: z.discriminatedUnion(\"success\", [\n z.object({\n success: z.literal(true),\n componentId: z.string(),\n removedComponent: z.object({\n id: z.string(),\n componentName: z.string(),\n props: z.record(z.string(), z.any()),\n }),\n }),\n z.object({\n success: z.literal(false),\n error: z.string(),\n }),\n ]),\n });\n }\n }, [interactableComponents, registerTool]);\n\n const updateInteractableComponentProps = useCallback(\n (id: string, newProps: Record<string, any>): string => {\n if (!newProps || Object.keys(newProps).length === 0) {\n return `Warning: No props provided for component with ID ${id}.`;\n }\n\n setInteractableComponents((prev) => {\n const component = prev.find((c) => c.id === id);\n if (!component) {\n return prev;\n }\n\n // Compare props shallowly\n const propsChanged = Object.entries(newProps).some(([key, value]) => {\n return component.props[key] !== value;\n });\n\n if (!propsChanged) {\n return prev; // unchanged\n }\n\n // Apply partial update\n const updated = {\n ...component,\n props: { ...component.props, ...newProps },\n };\n\n const updatedComponents = [...prev];\n const idx = prev.findIndex((c) => c.id === id);\n updatedComponents[idx] = updated;\n\n return updatedComponents;\n });\n\n return \"Updated successfully\";\n },\n [],\n );\n\n const updateInteractableComponentState = useCallback(\n (componentId: string, newState: Record<string, unknown>): string => {\n if (!newState || Object.keys(newState).length === 0) {\n return `Warning: No state values provided for component with ID ${componentId}.`;\n }\n\n setInteractableComponents((components = []) => {\n const component = components.find((c) => c.id === componentId);\n if (!component) return components;\n\n const prevState = component.state ?? {};\n const updatedState = { ...prevState, ...newState };\n if (deepEqual(prevState, updatedState)) return components;\n\n // TODO(lachieh): validate state against schema?\n\n const updated = {\n ...component,\n state: updatedState,\n };\n\n return components.map((c) => (c.id === componentId ? updated : c));\n });\n\n return \"Updated successfully\";\n },\n [],\n );\n\n const registerInteractableComponentPropsUpdateTool = useCallback(\n (component: TamboInteractableComponent, maxNameLength = 60) => {\n const tamboToolNamePart = `update_component_props_`;\n const availableLength = maxNameLength - tamboToolNamePart.length;\n if (component.id.length > availableLength) {\n throw new Error(\n `Interactable component id ${component.id} is too long. It must be less than ${availableLength} characters.`,\n );\n }\n\n // Build newProps schema as JSON Schema\n let newPropsSchema: JSONSchema7;\n if (component.propsSchema) {\n // Convert any supported schema to JSON Schema, then make partial\n const fullSchema = schemaToJsonSchema(component.propsSchema);\n newPropsSchema = makeJsonSchemaPartial(fullSchema);\n } else {\n // No schema - allow any properties\n newPropsSchema = { type: \"object\", additionalProperties: true };\n }\n\n // Build the full input schema as JSON Schema\n const inputSchema: JSONSchema7 = {\n type: \"object\",\n properties: {\n componentId: {\n type: \"string\",\n description: \"The ID of the interactable component to update\",\n },\n newProps: {\n ...newPropsSchema,\n description:\n \"The props to update. Provide only the props you want to change.\",\n },\n },\n required: [\"componentId\", \"newProps\"],\n };\n\n registerTool({\n name: `${tamboToolNamePart}${component.id}`,\n description: `Update the props of interactable component ${component.id} (${component.name}). Provide partial props (only props to change).`,\n tool: ({ componentId, newProps }) => {\n return updateInteractableComponentProps(componentId, newProps);\n },\n inputSchema,\n outputSchema: z.string(),\n annotations: {\n tamboStreamableHint: true,\n ...component.annotations,\n },\n });\n },\n [registerTool, updateInteractableComponentProps],\n );\n\n const registerInteractableComponentStateUpdateTool = useCallback(\n (component: TamboInteractableComponent, maxNameLength = 60) => {\n const tamboToolNamePart = `update_component_state_`;\n const availableLength = maxNameLength - tamboToolNamePart.length;\n if (component.id.length > availableLength) {\n throw new Error(\n `Interactable component id ${component.id} is too long. It must be less than ${availableLength} characters.`,\n );\n }\n\n // Build newState schema as JSON Schema\n let newStateSchema: JSONSchema7 = {\n type: \"object\",\n additionalProperties: true,\n };\n if (component.stateSchema) {\n // Convert any supported schema to JSON Schema, then make partial\n const fullSchema = schemaToJsonSchema(component.stateSchema);\n newStateSchema = makeJsonSchemaPartial(fullSchema);\n }\n\n // Build the full input schema as JSON Schema\n const inputSchema: JSONSchema7 = {\n type: \"object\",\n properties: {\n componentId: {\n type: \"string\",\n description: \"The ID of the interactable component to update\",\n },\n newState: {\n ...newStateSchema,\n description:\n \"The state values to update. Provide only the keys you want to change.\",\n },\n },\n required: [\"componentId\", \"newState\"],\n };\n\n registerTool({\n name: `${tamboToolNamePart}${component.id}`,\n description: `Update the state of interactable component ${component.id} (${component.name}). You may provide partial state (only keys to change).`,\n tool: ({ componentId, newState }) => {\n return updateInteractableComponentState(componentId, newState);\n },\n inputSchema,\n outputSchema: z.string(),\n annotations: {\n tamboStreamableHint: true,\n ...component.annotations,\n },\n });\n },\n [registerTool, updateInteractableComponentState],\n );\n\n const addInteractableComponent = useCallback(\n (\n component: Omit<TamboInteractableComponent, \"id\" | \"createdAt\">,\n ): string => {\n // Validate component name\n assertValidName(component.name, \"component\");\n\n // Add a random part to the component name to make it unique when using multiple instances of the same component.\n const tamboGeneratedNamePart = `-${Math.random().toString(36).slice(2, 5)}`;\n const id = `${component.name}${tamboGeneratedNamePart}`;\n const newComponent: TamboInteractableComponent = {\n ...component,\n id,\n state: component.state ?? {},\n };\n\n registerInteractableComponentPropsUpdateTool(newComponent);\n registerInteractableComponentStateUpdateTool(newComponent);\n\n setInteractableComponents((prev) => {\n return [...prev, newComponent];\n });\n\n return id;\n },\n [\n registerInteractableComponentPropsUpdateTool,\n registerInteractableComponentStateUpdateTool,\n ],\n );\n\n const removeInteractableComponent = useCallback((id: string) => {\n setInteractableComponents((prev) => prev.filter((c) => c.id !== id));\n }, []);\n\n const getInteractableComponent = useCallback(\n <P, S>(id: string): TamboInteractableComponent<P, S> | undefined => {\n return interactableComponents.find((c) => c.id === id) as\n | TamboInteractableComponent<P, S>\n | undefined;\n },\n [interactableComponents],\n );\n\n const getInteractableComponentsByName = useCallback(\n (componentName: string) => {\n return interactableComponents.filter((c) => c.name === componentName);\n },\n [interactableComponents],\n );\n\n const clearAllInteractableComponents = useCallback(() => {\n setInteractableComponents([]);\n }, []);\n\n const setInteractableStateValue = useCallback(\n (componentId: string, key: string, value: unknown) => {\n setInteractableComponents((prev) => {\n const component = prev.find((c) => c.id === componentId);\n if (!component) {\n console.warn(\n `Tried to update state for component ${componentId} but it was not found.`,\n );\n return prev;\n }\n\n const updated = {\n ...component,\n state: {\n ...component.state,\n [key]: value,\n },\n };\n\n const updatedComponents = prev.map((component) => {\n if (component.id === componentId) {\n return updated;\n }\n return component;\n });\n\n return updatedComponents;\n });\n },\n [],\n );\n\n const getInteractableComponentState = useCallback(\n (componentId: string) => {\n const component = interactableComponents.find(\n (c) => c.id === componentId,\n );\n return component?.state;\n },\n [interactableComponents],\n );\n\n const setInteractableSelected = useCallback(\n (componentId: string, isSelected: boolean) => {\n setInteractableComponents((prev) => {\n let found = false;\n const next = prev.map((component) => {\n if (component.id !== componentId) return component;\n found = true;\n return component.isSelected === isSelected\n ? component\n : { ...component, isSelected: isSelected };\n });\n return found ? next : prev;\n });\n },\n [],\n );\n\n const clearInteractableSelections = useCallback(() => {\n setInteractableComponents((prev) => {\n if (!prev.some((c) => c.isSelected)) return prev;\n return prev.map((c) => (c.isSelected ? { ...c, isSelected: false } : c));\n });\n }, []);\n\n const value: TamboInteractableContext = {\n interactableComponents,\n addInteractableComponent,\n removeInteractableComponent,\n updateInteractableComponentProps,\n getInteractableComponent,\n getInteractableComponentsByName,\n clearAllInteractableComponents,\n setInteractableState: setInteractableStateValue,\n getInteractableComponentState,\n setInteractableSelected,\n clearInteractableSelections,\n };\n\n return (\n <TamboInteractableContext.Provider value={value}>\n {children}\n </TamboInteractableContext.Provider>\n );\n};\n\n/**\n * The useTamboInteractable hook provides access to the interactable component\n * management functions.\n * @returns The interactable component management functions\n */\nexport const useTamboInteractable = () => {\n return useContext(TamboInteractableContext);\n};\n\n/**\n * Hook to get a cloned snapshot of the current interactables.\n * Returns a shallow copy of the array with cloned items and props to prevent\n * external mutation from affecting internal state.\n * @returns The current interactables snapshot (cloned).\n */\nexport const useCurrentInteractablesSnapshot = () => {\n const { interactableComponents } = useTamboInteractable();\n // Clone the array and each item/props to prevent mutation\n const copy = interactableComponents.map((c) => ({\n ...c,\n props: { ...c.props },\n }));\n\n return copy;\n};\n"]}
1
+ {"version":3,"file":"tambo-interactable-provider.js","sourceRoot":"","sources":["../../src/providers/tambo-interactable-provider.tsx"],"names":[],"mappings":"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","sourcesContent":["// react-sdk/src/providers/tambo-interactable-provider.tsx\n\"use client\";\nimport { deepEqual } from \"fast-equals\";\nimport { JSONSchema7 } from \"json-schema\";\nimport React, {\n createContext,\n PropsWithChildren,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { z } from \"zod/v3\";\nimport { createInteractablesContextHelper } from \"../context-helpers/current-interactables-context-helper\";\nimport {\n TamboInteractableComponent,\n type TamboInteractableContext,\n} from \"../model/tambo-interactable\";\nimport { makeJsonSchemaPartial, schemaToJsonSchema } from \"../schema\";\nimport { assertValidName } from \"../util/validate-component-name\";\nimport { useTamboRegistry } from \"./tambo-registry-provider\";\nimport { useTamboContextHelpers } from \"./tambo-context-helpers-provider\";\n\nconst TamboInteractableContext = createContext<TamboInteractableContext>({\n interactableComponents: [],\n addInteractableComponent: () => \"\",\n removeInteractableComponent: () => {},\n updateInteractableComponentProps: () => \"\",\n getInteractableComponent: () => undefined,\n getInteractableComponentsByName: () => [],\n clearAllInteractableComponents: () => {},\n setInteractableState: () => {},\n getInteractableComponentState: () => undefined,\n setInteractableSelected: () => {},\n clearInteractableSelections: () => {},\n});\n\n/**\n * Returns the per-component tool names that get registered for a given interactable ID.\n * @param id - The interactable component ID\n * @returns The tool names for props and state updates\n */\nfunction perComponentToolNames(id: string): [string, string] {\n return [`update_component_props_${id}`, `update_component_state_${id}`];\n}\n\n/** Tool names registered globally when at least one interactable component exists. */\nconst GLOBAL_INTERACTABLE_TOOL_NAMES = [\n \"get_all_interactable_components\",\n \"get_interactable_component_by_id\",\n \"remove_interactable_component\",\n];\n\n/**\n * The TamboInteractableProvider manages a list of components that are currently\n * interactable, allowing tambo to interact with them by updating their props. It also registers tools\n * for Tambo to perform CRUD operations on the components list.\n * @param props - The props for the TamboInteractableProvider\n * @param props.children - The children to wrap\n * @returns The TamboInteractableProvider component\n */\nexport const TamboInteractableProvider: React.FC<PropsWithChildren> = ({\n children,\n}) => {\n const [interactableComponents, setInteractableComponents] = useState<\n TamboInteractableComponent[]\n >([]);\n const { registerTool, unregisterTools } = useTamboRegistry();\n const { addContextHelper, removeContextHelper } = useTamboContextHelpers();\n\n // Create a stable context helper function for interactable components\n const interactablesContextHelper = useMemo(\n () => createInteractablesContextHelper(interactableComponents),\n [interactableComponents],\n );\n\n // Register the interactables context helper\n useEffect(() => {\n addContextHelper(\"interactables\", interactablesContextHelper);\n\n return () => {\n removeContextHelper(\"interactables\");\n };\n }, [interactablesContextHelper, addContextHelper, removeContextHelper]);\n\n useEffect(() => {\n if (interactableComponents.length > 0) {\n registerTool({\n name: \"get_all_interactable_components\",\n description:\n \"Only use this tool if the user is asking about interactable components.Get all currently interactable components with their details including their current props. These are components that you can interact with on behalf of the user.\",\n tool: () => {\n return {\n components: interactableComponents,\n };\n },\n inputSchema: z.object({}),\n outputSchema: z.object({\n components: z.array(\n z.object({\n id: z.string(),\n name: z.string(),\n props: z.record(z.string(), z.any()),\n propsSchema: z.record(z.string(), z.any()).optional(),\n }),\n ),\n }),\n });\n\n registerTool({\n name: \"get_interactable_component_by_id\",\n description: \"Get a specific interactable component by its ID\",\n tool: ({ componentId }) => {\n const component = interactableComponents.find(\n (c) => c.id === componentId,\n );\n\n if (!component) {\n return {\n success: false,\n error: `Component with ID ${componentId} not found`,\n } as const;\n }\n\n return {\n success: true,\n component: {\n id: component.id,\n componentName: component.name,\n props: component.props,\n },\n } as const;\n },\n inputSchema: z.object({\n componentId: z.string().describe(\"The ID of the component\"),\n }),\n outputSchema: z.discriminatedUnion(\"success\", [\n z.object({\n success: z.literal(true),\n component: z\n .object({\n id: z.string(),\n componentName: z.string(),\n props: z.record(z.string(), z.any()),\n })\n .optional(),\n }),\n z.object({\n success: z.literal(false),\n error: z.string(),\n }),\n ]),\n });\n\n registerTool({\n name: \"remove_interactable_component\",\n description: \"Remove an interactable component from the system\",\n tool: ({ componentId }) => {\n const component = interactableComponents.find(\n (c) => c.id === componentId,\n );\n\n if (!component) {\n return {\n success: false,\n error: `Component with ID ${componentId} not found`,\n } as const;\n }\n\n unregisterTools(perComponentToolNames(componentId));\n setInteractableComponents((prev) =>\n prev.filter((c) => c.id !== componentId),\n );\n\n return {\n success: true,\n componentId,\n removedComponent: {\n id: component.id,\n componentName: component.name,\n props: component.props,\n },\n } as const;\n },\n inputSchema: z.object({\n componentId: z.string().describe(\"The ID of the component\"),\n }),\n outputSchema: z.discriminatedUnion(\"success\", [\n z.object({\n success: z.literal(true),\n componentId: z.string(),\n removedComponent: z.object({\n id: z.string(),\n componentName: z.string(),\n props: z.record(z.string(), z.any()),\n }),\n }),\n z.object({\n success: z.literal(false),\n error: z.string(),\n }),\n ]),\n });\n } else {\n // No interactable components — remove the global tools\n unregisterTools(GLOBAL_INTERACTABLE_TOOL_NAMES);\n }\n }, [interactableComponents, registerTool, unregisterTools]);\n\n const updateInteractableComponentProps = useCallback(\n (id: string, newProps: Record<string, any>): string => {\n if (!newProps || Object.keys(newProps).length === 0) {\n return `Warning: No props provided for component with ID ${id}.`;\n }\n\n setInteractableComponents((prev) => {\n const component = prev.find((c) => c.id === id);\n if (!component) {\n return prev;\n }\n\n // Compare props shallowly\n const propsChanged = Object.entries(newProps).some(([key, value]) => {\n return component.props[key] !== value;\n });\n\n if (!propsChanged) {\n return prev; // unchanged\n }\n\n // Apply partial update\n const updated = {\n ...component,\n props: { ...component.props, ...newProps },\n };\n\n const updatedComponents = [...prev];\n const idx = prev.findIndex((c) => c.id === id);\n updatedComponents[idx] = updated;\n\n return updatedComponents;\n });\n\n return \"Updated successfully\";\n },\n [],\n );\n\n const updateInteractableComponentState = useCallback(\n (componentId: string, newState: Record<string, unknown>): string => {\n if (!newState || Object.keys(newState).length === 0) {\n return `Warning: No state values provided for component with ID ${componentId}.`;\n }\n\n setInteractableComponents((components = []) => {\n const component = components.find((c) => c.id === componentId);\n if (!component) return components;\n\n const prevState = component.state ?? {};\n const updatedState = { ...prevState, ...newState };\n if (deepEqual(prevState, updatedState)) return components;\n\n // TODO(lachieh): validate state against schema?\n\n const updated = {\n ...component,\n state: updatedState,\n };\n\n return components.map((c) => (c.id === componentId ? updated : c));\n });\n\n return \"Updated successfully\";\n },\n [],\n );\n\n const registerInteractableComponentPropsUpdateTool = useCallback(\n (component: TamboInteractableComponent, maxNameLength = 60) => {\n const tamboToolNamePart = `update_component_props_`;\n const availableLength = maxNameLength - tamboToolNamePart.length;\n if (component.id.length > availableLength) {\n throw new Error(\n `Interactable component id ${component.id} is too long. It must be less than ${availableLength} characters.`,\n );\n }\n\n // Build newProps schema as JSON Schema\n let newPropsSchema: JSONSchema7;\n if (component.propsSchema) {\n // Convert any supported schema to JSON Schema, then make partial\n const fullSchema = schemaToJsonSchema(component.propsSchema);\n newPropsSchema = makeJsonSchemaPartial(fullSchema);\n } else {\n // No schema - allow any properties\n newPropsSchema = { type: \"object\", additionalProperties: true };\n }\n\n // Build the full input schema as JSON Schema\n const inputSchema: JSONSchema7 = {\n type: \"object\",\n properties: {\n componentId: {\n type: \"string\",\n description: \"The ID of the interactable component to update\",\n },\n newProps: {\n ...newPropsSchema,\n description:\n \"The props to update. Provide only the props you want to change.\",\n },\n },\n required: [\"componentId\", \"newProps\"],\n };\n\n registerTool({\n name: `${tamboToolNamePart}${component.id}`,\n description: `Update the props of interactable component ${component.id} (${component.name}). Provide partial props (only props to change).`,\n tool: ({ componentId, newProps }) => {\n return updateInteractableComponentProps(componentId, newProps);\n },\n inputSchema,\n outputSchema: z.string(),\n annotations: {\n tamboStreamableHint: true,\n ...component.annotations,\n },\n });\n },\n [registerTool, updateInteractableComponentProps],\n );\n\n const registerInteractableComponentStateUpdateTool = useCallback(\n (component: TamboInteractableComponent, maxNameLength = 60) => {\n const tamboToolNamePart = `update_component_state_`;\n const availableLength = maxNameLength - tamboToolNamePart.length;\n if (component.id.length > availableLength) {\n throw new Error(\n `Interactable component id ${component.id} is too long. It must be less than ${availableLength} characters.`,\n );\n }\n\n // Build newState schema as JSON Schema\n let newStateSchema: JSONSchema7 = {\n type: \"object\",\n additionalProperties: true,\n };\n if (component.stateSchema) {\n // Convert any supported schema to JSON Schema, then make partial\n const fullSchema = schemaToJsonSchema(component.stateSchema);\n newStateSchema = makeJsonSchemaPartial(fullSchema);\n }\n\n // Build the full input schema as JSON Schema\n const inputSchema: JSONSchema7 = {\n type: \"object\",\n properties: {\n componentId: {\n type: \"string\",\n description: \"The ID of the interactable component to update\",\n },\n newState: {\n ...newStateSchema,\n description:\n \"The state values to update. Provide only the keys you want to change.\",\n },\n },\n required: [\"componentId\", \"newState\"],\n };\n\n registerTool({\n name: `${tamboToolNamePart}${component.id}`,\n description: `Update the state of interactable component ${component.id} (${component.name}). You may provide partial state (only keys to change).`,\n tool: ({ componentId, newState }) => {\n return updateInteractableComponentState(componentId, newState);\n },\n inputSchema,\n outputSchema: z.string(),\n annotations: {\n tamboStreamableHint: true,\n ...component.annotations,\n },\n });\n },\n [registerTool, updateInteractableComponentState],\n );\n\n const addInteractableComponent = useCallback(\n (\n component: Omit<TamboInteractableComponent, \"id\" | \"createdAt\">,\n ): string => {\n // Validate component name\n assertValidName(component.name, \"component\");\n\n // Add a random part to the component name to make it unique when using multiple instances of the same component.\n const tamboGeneratedNamePart = `-${Math.random().toString(36).slice(2, 5)}`;\n const id = `${component.name}${tamboGeneratedNamePart}`;\n const newComponent: TamboInteractableComponent = {\n ...component,\n id,\n state: component.state ?? {},\n };\n\n registerInteractableComponentPropsUpdateTool(newComponent);\n registerInteractableComponentStateUpdateTool(newComponent);\n\n setInteractableComponents((prev) => {\n return [...prev, newComponent];\n });\n\n return id;\n },\n [\n registerInteractableComponentPropsUpdateTool,\n registerInteractableComponentStateUpdateTool,\n ],\n );\n\n const removeInteractableComponent = useCallback(\n (id: string) => {\n unregisterTools(perComponentToolNames(id));\n setInteractableComponents((prev) => prev.filter((c) => c.id !== id));\n },\n [unregisterTools],\n );\n\n const getInteractableComponent = useCallback(\n <P, S>(id: string): TamboInteractableComponent<P, S> | undefined => {\n return interactableComponents.find((c) => c.id === id) as\n | TamboInteractableComponent<P, S>\n | undefined;\n },\n [interactableComponents],\n );\n\n const getInteractableComponentsByName = useCallback(\n (componentName: string) => {\n return interactableComponents.filter((c) => c.name === componentName);\n },\n [interactableComponents],\n );\n\n const clearAllInteractableComponents = useCallback(() => {\n const toolNames = interactableComponents.flatMap((c) =>\n perComponentToolNames(c.id),\n );\n unregisterTools(toolNames);\n setInteractableComponents([]);\n }, [interactableComponents, unregisterTools]);\n\n const setInteractableStateValue = useCallback(\n (componentId: string, key: string, value: unknown) => {\n setInteractableComponents((prev) => {\n const component = prev.find((c) => c.id === componentId);\n if (!component) {\n console.warn(\n `Tried to update state for component ${componentId} but it was not found.`,\n );\n return prev;\n }\n\n const updated = {\n ...component,\n state: {\n ...component.state,\n [key]: value,\n },\n };\n\n const updatedComponents = prev.map((component) => {\n if (component.id === componentId) {\n return updated;\n }\n return component;\n });\n\n return updatedComponents;\n });\n },\n [],\n );\n\n const getInteractableComponentState = useCallback(\n (componentId: string) => {\n const component = interactableComponents.find(\n (c) => c.id === componentId,\n );\n return component?.state;\n },\n [interactableComponents],\n );\n\n const setInteractableSelected = useCallback(\n (componentId: string, isSelected: boolean) => {\n setInteractableComponents((prev) => {\n let found = false;\n const next = prev.map((component) => {\n if (component.id !== componentId) return component;\n found = true;\n return component.isSelected === isSelected\n ? component\n : { ...component, isSelected: isSelected };\n });\n return found ? next : prev;\n });\n },\n [],\n );\n\n const clearInteractableSelections = useCallback(() => {\n setInteractableComponents((prev) => {\n if (!prev.some((c) => c.isSelected)) return prev;\n return prev.map((c) => (c.isSelected ? { ...c, isSelected: false } : c));\n });\n }, []);\n\n const value: TamboInteractableContext = {\n interactableComponents,\n addInteractableComponent,\n removeInteractableComponent,\n updateInteractableComponentProps,\n getInteractableComponent,\n getInteractableComponentsByName,\n clearAllInteractableComponents,\n setInteractableState: setInteractableStateValue,\n getInteractableComponentState,\n setInteractableSelected,\n clearInteractableSelections,\n };\n\n return (\n <TamboInteractableContext.Provider value={value}>\n {children}\n </TamboInteractableContext.Provider>\n );\n};\n\n/**\n * The useTamboInteractable hook provides access to the interactable component\n * management functions.\n * @returns The interactable component management functions\n */\nexport const useTamboInteractable = () => {\n return useContext(TamboInteractableContext);\n};\n\n/**\n * Hook to get a cloned snapshot of the current interactables.\n * Returns a shallow copy of the array with cloned items and props to prevent\n * external mutation from affecting internal state.\n * @returns The current interactables snapshot (cloned).\n */\nexport const useCurrentInteractablesSnapshot = () => {\n const { interactableComponents } = useTamboInteractable();\n // Clone the array and each item/props to prevent mutation\n const copy = interactableComponents.map((c) => ({\n ...c,\n props: { ...c.props },\n }));\n\n return copy;\n};\n"]}
@@ -19,9 +19,11 @@ jest.mock("./tambo-context-helpers-provider", () => ({
19
19
  }));
20
20
  // Mock the registry provider
21
21
  const mockRegisterTool = jest.fn();
22
+ const mockUnregisterTools = jest.fn();
22
23
  jest.mock("./tambo-registry-provider", () => ({
23
24
  useTamboRegistry: () => ({
24
25
  registerTool: mockRegisterTool,
26
+ unregisterTools: mockUnregisterTools,
25
27
  }),
26
28
  }));
27
29
  // Mock the context helper creation
@@ -347,5 +349,81 @@ describe("TamboInteractableProvider - State Update Tool Registration", () => {
347
349
  // The newProps property should allow additional properties
348
350
  expect(inputSchema.properties.newProps.additionalProperties).toBe(true);
349
351
  });
352
+ it("should unregister per-component tools when removing a component", () => {
353
+ const wrapper = ({ children }) => (react_2.default.createElement(tambo_interactable_provider_1.TamboInteractableProvider, null, children));
354
+ const { result } = (0, react_1.renderHook)(() => (0, tambo_interactable_provider_1.useTamboInteractable)(), { wrapper });
355
+ const component = {
356
+ name: "Cleanup",
357
+ description: "test",
358
+ component: () => null,
359
+ props: { x: 1 },
360
+ };
361
+ let componentId;
362
+ (0, react_1.act)(() => {
363
+ componentId = result.current.addInteractableComponent(component);
364
+ });
365
+ mockUnregisterTools.mockClear();
366
+ (0, react_1.act)(() => {
367
+ result.current.removeInteractableComponent(componentId);
368
+ });
369
+ expect(mockUnregisterTools).toHaveBeenCalledWith([
370
+ `update_component_props_${componentId}`,
371
+ `update_component_state_${componentId}`,
372
+ ]);
373
+ });
374
+ it("should unregister global tools when all components are removed", () => {
375
+ const wrapper = ({ children }) => (react_2.default.createElement(tambo_interactable_provider_1.TamboInteractableProvider, null, children));
376
+ const { result } = (0, react_1.renderHook)(() => (0, tambo_interactable_provider_1.useTamboInteractable)(), { wrapper });
377
+ const component = {
378
+ name: "Global",
379
+ description: "test",
380
+ component: () => null,
381
+ props: {},
382
+ };
383
+ let componentId;
384
+ (0, react_1.act)(() => {
385
+ componentId = result.current.addInteractableComponent(component);
386
+ });
387
+ mockUnregisterTools.mockClear();
388
+ (0, react_1.act)(() => {
389
+ result.current.removeInteractableComponent(componentId);
390
+ });
391
+ // Should also unregister global interactable tools once list is empty
392
+ expect(mockUnregisterTools).toHaveBeenCalledWith([
393
+ "get_all_interactable_components",
394
+ "get_interactable_component_by_id",
395
+ "remove_interactable_component",
396
+ ]);
397
+ });
398
+ it("should unregister all per-component tools when clearing all components", () => {
399
+ const wrapper = ({ children }) => (react_2.default.createElement(tambo_interactable_provider_1.TamboInteractableProvider, null, children));
400
+ const { result } = (0, react_1.renderHook)(() => (0, tambo_interactable_provider_1.useTamboInteractable)(), { wrapper });
401
+ let id1;
402
+ let id2;
403
+ (0, react_1.act)(() => {
404
+ id1 = result.current.addInteractableComponent({
405
+ name: "A",
406
+ description: "test",
407
+ component: () => null,
408
+ props: {},
409
+ });
410
+ id2 = result.current.addInteractableComponent({
411
+ name: "B",
412
+ description: "test",
413
+ component: () => null,
414
+ props: {},
415
+ });
416
+ });
417
+ mockUnregisterTools.mockClear();
418
+ (0, react_1.act)(() => {
419
+ result.current.clearAllInteractableComponents();
420
+ });
421
+ expect(mockUnregisterTools).toHaveBeenCalledWith(expect.arrayContaining([
422
+ `update_component_props_${id1}`,
423
+ `update_component_state_${id1}`,
424
+ `update_component_props_${id2}`,
425
+ `update_component_state_${id2}`,
426
+ ]));
427
+ });
350
428
  });
351
429
  //# sourceMappingURL=tambo-interactable-provider.test.js.map