@tambo-ai/react 0.67.1 → 0.69.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (424) hide show
  1. package/README.md +3 -5
  2. package/dist/context-helpers/context-helpers.test.js +16 -4
  3. package/dist/context-helpers/context-helpers.test.js.map +1 -1
  4. package/dist/context-helpers/current-interactables-context-helper.d.ts +2 -2
  5. package/dist/context-helpers/current-interactables-context-helper.d.ts.map +1 -1
  6. package/dist/context-helpers/current-interactables-context-helper.js +31 -12
  7. package/dist/context-helpers/current-interactables-context-helper.js.map +1 -1
  8. package/dist/context-helpers/registry.d.ts +2 -2
  9. package/dist/context-helpers/registry.d.ts.map +1 -1
  10. package/dist/context-helpers/registry.js.map +1 -1
  11. package/dist/context-helpers/types.d.ts +2 -2
  12. package/dist/context-helpers/types.d.ts.map +1 -1
  13. package/dist/context-helpers/types.js.map +1 -1
  14. package/dist/hoc/with-tambo-interactable.d.ts +50 -4
  15. package/dist/hoc/with-tambo-interactable.d.ts.map +1 -1
  16. package/dist/hoc/with-tambo-interactable.js +20 -5
  17. package/dist/hoc/with-tambo-interactable.js.map +1 -1
  18. package/dist/hooks/use-component-state.d.ts +3 -8
  19. package/dist/hooks/use-component-state.d.ts.map +1 -1
  20. package/dist/hooks/use-component-state.js +8 -0
  21. package/dist/hooks/use-component-state.js.map +1 -1
  22. package/dist/hooks/use-component-state.test.js +37 -0
  23. package/dist/hooks/use-component-state.test.js.map +1 -1
  24. package/dist/hooks/use-message-images.test.js +174 -37
  25. package/dist/hooks/use-message-images.test.js.map +1 -1
  26. package/dist/hooks/use-tambo-threads.js +1 -1
  27. package/dist/hooks/use-tambo-threads.js.map +1 -1
  28. package/dist/hooks/use-tambo-voice.d.ts +1 -1
  29. package/dist/hooks/use-tambo-voice.js +1 -1
  30. package/dist/hooks/use-tambo-voice.js.map +1 -1
  31. package/dist/hooks/use-tambo-voice.test.d.ts +2 -0
  32. package/dist/hooks/use-tambo-voice.test.d.ts.map +1 -0
  33. package/dist/hooks/use-tambo-voice.test.js +239 -0
  34. package/dist/hooks/use-tambo-voice.test.js.map +1 -0
  35. package/dist/index.d.ts +2 -2
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js.map +1 -1
  38. package/dist/mcp/elicitation.d.ts.map +1 -1
  39. package/dist/mcp/elicitation.js +12 -0
  40. package/dist/mcp/elicitation.js.map +1 -1
  41. package/dist/mcp/elicitation.test.js +8 -1
  42. package/dist/mcp/elicitation.test.js.map +1 -1
  43. package/dist/mcp/mcp-client.d.ts +6 -10
  44. package/dist/mcp/mcp-client.d.ts.map +1 -1
  45. package/dist/mcp/mcp-client.js.map +1 -1
  46. package/dist/mcp/mcp-constants.d.ts +19 -0
  47. package/dist/mcp/mcp-constants.d.ts.map +1 -0
  48. package/dist/mcp/mcp-constants.js +21 -0
  49. package/dist/mcp/mcp-constants.js.map +1 -0
  50. package/dist/mcp/mcp-hooks.d.ts +21 -40
  51. package/dist/mcp/mcp-hooks.d.ts.map +1 -1
  52. package/dist/mcp/mcp-hooks.js +130 -39
  53. package/dist/mcp/mcp-hooks.js.map +1 -1
  54. package/dist/mcp/mcp-hooks.test.js +431 -5
  55. package/dist/mcp/mcp-hooks.test.js.map +1 -1
  56. package/dist/mcp/tambo-mcp-provider.d.ts +7 -0
  57. package/dist/mcp/tambo-mcp-provider.d.ts.map +1 -1
  58. package/dist/mcp/tambo-mcp-provider.js +205 -155
  59. package/dist/mcp/tambo-mcp-provider.js.map +1 -1
  60. package/dist/mcp/tambo-mcp-provider.test.js +37 -0
  61. package/dist/mcp/tambo-mcp-provider.test.js.map +1 -1
  62. package/dist/model/component-metadata.d.ts +54 -21
  63. package/dist/model/component-metadata.d.ts.map +1 -1
  64. package/dist/model/component-metadata.js.map +1 -1
  65. package/dist/model/tambo-interactable.d.ts +13 -5
  66. package/dist/model/tambo-interactable.d.ts.map +1 -1
  67. package/dist/model/tambo-interactable.js.map +1 -1
  68. package/dist/providers/__tests__/thread-input-resource-resolution.test.d.ts +2 -0
  69. package/dist/providers/__tests__/thread-input-resource-resolution.test.d.ts.map +1 -0
  70. package/dist/providers/__tests__/thread-input-resource-resolution.test.js +592 -0
  71. package/dist/providers/__tests__/thread-input-resource-resolution.test.js.map +1 -0
  72. package/dist/providers/index.d.ts +1 -1
  73. package/dist/providers/index.d.ts.map +1 -1
  74. package/dist/providers/index.js.map +1 -1
  75. package/dist/providers/tambo-client-provider.d.ts +8 -0
  76. package/dist/providers/tambo-client-provider.d.ts.map +1 -1
  77. package/dist/providers/tambo-client-provider.js +10 -11
  78. package/dist/providers/tambo-client-provider.js.map +1 -1
  79. package/dist/providers/tambo-client-provider.test.d.ts +2 -0
  80. package/dist/providers/tambo-client-provider.test.d.ts.map +1 -0
  81. package/dist/providers/tambo-client-provider.test.js +208 -0
  82. package/dist/providers/tambo-client-provider.test.js.map +1 -0
  83. package/dist/providers/tambo-context-attachment-provider.d.ts +34 -92
  84. package/dist/providers/tambo-context-attachment-provider.d.ts.map +1 -1
  85. package/dist/providers/tambo-context-attachment-provider.js +62 -105
  86. package/dist/providers/tambo-context-attachment-provider.js.map +1 -1
  87. package/dist/providers/tambo-context-attachment-provider.test.js +229 -463
  88. package/dist/providers/tambo-context-attachment-provider.test.js.map +1 -1
  89. package/dist/providers/tambo-interactable-provider-partial-updates.test.js +22 -21
  90. package/dist/providers/tambo-interactable-provider-partial-updates.test.js.map +1 -1
  91. package/dist/providers/tambo-interactable-provider.d.ts +5 -2
  92. package/dist/providers/tambo-interactable-provider.d.ts.map +1 -1
  93. package/dist/providers/tambo-interactable-provider.js +126 -17
  94. package/dist/providers/tambo-interactable-provider.js.map +1 -1
  95. package/dist/providers/tambo-interactable-provider.test.js +242 -0
  96. package/dist/providers/tambo-interactable-provider.test.js.map +1 -1
  97. package/dist/providers/tambo-interactables-additional-context.test.js +2 -5
  98. package/dist/providers/tambo-interactables-additional-context.test.js.map +1 -1
  99. package/dist/providers/tambo-provider.d.ts +2 -3
  100. package/dist/providers/tambo-provider.d.ts.map +1 -1
  101. package/dist/providers/tambo-provider.js +6 -5
  102. package/dist/providers/tambo-provider.js.map +1 -1
  103. package/dist/providers/tambo-registry-provider.test.js +16 -0
  104. package/dist/providers/tambo-registry-provider.test.js.map +1 -1
  105. package/dist/providers/tambo-registry-schema-compat.test.js +31 -0
  106. package/dist/providers/tambo-registry-schema-compat.test.js.map +1 -1
  107. package/dist/providers/tambo-thread-input-provider.d.ts +1 -1
  108. package/dist/providers/tambo-thread-input-provider.d.ts.map +1 -1
  109. package/dist/providers/tambo-thread-input-provider.js +26 -4
  110. package/dist/providers/tambo-thread-input-provider.js.map +1 -1
  111. package/dist/providers/tambo-thread-provider-initial-messages.test.js +84 -2
  112. package/dist/providers/tambo-thread-provider-initial-messages.test.js.map +1 -1
  113. package/dist/providers/tambo-thread-provider.d.ts.map +1 -1
  114. package/dist/providers/tambo-thread-provider.js +53 -42
  115. package/dist/providers/tambo-thread-provider.js.map +1 -1
  116. package/dist/providers/tambo-thread-provider.test.js +368 -262
  117. package/dist/providers/tambo-thread-provider.test.js.map +1 -1
  118. package/dist/schema/index.d.ts +1 -1
  119. package/dist/schema/index.d.ts.map +1 -1
  120. package/dist/schema/index.js +2 -1
  121. package/dist/schema/index.js.map +1 -1
  122. package/dist/schema/json-schema.d.ts +7 -0
  123. package/dist/schema/json-schema.d.ts.map +1 -1
  124. package/dist/schema/json-schema.js +40 -29
  125. package/dist/schema/json-schema.js.map +1 -1
  126. package/dist/schema/json-schema.test.d.ts +2 -0
  127. package/dist/schema/json-schema.test.d.ts.map +1 -0
  128. package/dist/schema/json-schema.test.js +204 -0
  129. package/dist/schema/json-schema.test.js.map +1 -0
  130. package/dist/schema/schema.test.js +237 -0
  131. package/dist/schema/schema.test.js.map +1 -1
  132. package/dist/schema/standard-schema.d.ts +1 -0
  133. package/dist/schema/standard-schema.d.ts.map +1 -1
  134. package/dist/schema/standard-schema.js +18 -13
  135. package/dist/schema/standard-schema.js.map +1 -1
  136. package/dist/schema/standard-schema.test.d.ts +2 -0
  137. package/dist/schema/standard-schema.test.d.ts.map +1 -0
  138. package/dist/schema/standard-schema.test.js +165 -0
  139. package/dist/schema/standard-schema.test.js.map +1 -0
  140. package/dist/schema/validate.test.js +149 -0
  141. package/dist/schema/validate.test.js.map +1 -1
  142. package/dist/schema/zod.d.ts +7 -4
  143. package/dist/schema/zod.d.ts.map +1 -1
  144. package/dist/schema/zod.js +65 -22
  145. package/dist/schema/zod.js.map +1 -1
  146. package/dist/schema/zod.test.js +112 -0
  147. package/dist/schema/zod.test.js.map +1 -1
  148. package/dist/setupTests.js +3 -0
  149. package/dist/setupTests.js.map +1 -1
  150. package/dist/testing/tools.d.ts +4 -1
  151. package/dist/testing/tools.d.ts.map +1 -1
  152. package/dist/testing/tools.js +6 -1
  153. package/dist/testing/tools.js.map +1 -1
  154. package/dist/util/generate-component.d.ts.map +1 -1
  155. package/dist/util/generate-component.js +18 -3
  156. package/dist/util/generate-component.js.map +1 -1
  157. package/dist/util/generate-component.test.d.ts +2 -0
  158. package/dist/util/generate-component.test.d.ts.map +1 -0
  159. package/dist/util/generate-component.test.js +340 -0
  160. package/dist/util/generate-component.test.js.map +1 -0
  161. package/dist/util/is-promise.d.ts +9 -0
  162. package/dist/util/is-promise.d.ts.map +1 -0
  163. package/dist/util/is-promise.js +20 -0
  164. package/dist/util/is-promise.js.map +1 -0
  165. package/dist/util/is-promise.test.d.ts +2 -0
  166. package/dist/util/is-promise.test.d.ts.map +1 -0
  167. package/dist/util/is-promise.test.js +48 -0
  168. package/dist/util/is-promise.test.js.map +1 -0
  169. package/dist/util/message-builder.d.ts +3 -1
  170. package/dist/util/message-builder.d.ts.map +1 -1
  171. package/dist/util/message-builder.js +20 -3
  172. package/dist/util/message-builder.js.map +1 -1
  173. package/dist/util/message-builder.test.js +269 -0
  174. package/dist/util/message-builder.test.js.map +1 -1
  175. package/dist/util/query-utils.test.d.ts +2 -0
  176. package/dist/util/query-utils.test.d.ts.map +1 -0
  177. package/dist/util/query-utils.test.js +382 -0
  178. package/dist/util/query-utils.test.js.map +1 -0
  179. package/dist/util/registry-validators.d.ts.map +1 -1
  180. package/dist/util/registry-validators.js +7 -0
  181. package/dist/util/registry-validators.js.map +1 -1
  182. package/dist/util/registry-validators.test.js +57 -0
  183. package/dist/util/registry-validators.test.js.map +1 -1
  184. package/dist/util/registry.d.ts.map +1 -1
  185. package/dist/util/registry.js +9 -0
  186. package/dist/util/registry.js.map +1 -1
  187. package/dist/util/registry.test.js +323 -1
  188. package/dist/util/registry.test.js.map +1 -1
  189. package/dist/util/resource-content-resolver.d.ts +20 -0
  190. package/dist/util/resource-content-resolver.d.ts.map +1 -0
  191. package/dist/util/resource-content-resolver.js +93 -0
  192. package/dist/util/resource-content-resolver.js.map +1 -0
  193. package/dist/util/resource-content-resolver.test.d.ts +2 -0
  194. package/dist/util/resource-content-resolver.test.d.ts.map +1 -0
  195. package/dist/util/resource-content-resolver.test.js +254 -0
  196. package/dist/util/resource-content-resolver.test.js.map +1 -0
  197. package/dist/util/resource-validators.test.d.ts +2 -0
  198. package/dist/util/resource-validators.test.d.ts.map +1 -0
  199. package/dist/util/resource-validators.test.js +90 -0
  200. package/dist/util/resource-validators.test.js.map +1 -0
  201. package/dist/util/tool-caller.d.ts +2 -2
  202. package/dist/util/tool-caller.d.ts.map +1 -1
  203. package/dist/util/tool-caller.js +8 -8
  204. package/dist/util/tool-caller.js.map +1 -1
  205. package/dist/util/validate-component-name.test.d.ts +2 -0
  206. package/dist/util/validate-component-name.test.d.ts.map +1 -0
  207. package/dist/util/validate-component-name.test.js +35 -0
  208. package/dist/util/validate-component-name.test.js.map +1 -0
  209. package/esm/context-helpers/context-helpers.test.js +16 -4
  210. package/esm/context-helpers/context-helpers.test.js.map +1 -1
  211. package/esm/context-helpers/current-interactables-context-helper.d.ts +2 -2
  212. package/esm/context-helpers/current-interactables-context-helper.d.ts.map +1 -1
  213. package/esm/context-helpers/current-interactables-context-helper.js +31 -12
  214. package/esm/context-helpers/current-interactables-context-helper.js.map +1 -1
  215. package/esm/context-helpers/registry.d.ts +2 -2
  216. package/esm/context-helpers/registry.d.ts.map +1 -1
  217. package/esm/context-helpers/registry.js.map +1 -1
  218. package/esm/context-helpers/types.d.ts +2 -2
  219. package/esm/context-helpers/types.d.ts.map +1 -1
  220. package/esm/context-helpers/types.js.map +1 -1
  221. package/esm/hoc/with-tambo-interactable.d.ts +50 -4
  222. package/esm/hoc/with-tambo-interactable.d.ts.map +1 -1
  223. package/esm/hoc/with-tambo-interactable.js +20 -5
  224. package/esm/hoc/with-tambo-interactable.js.map +1 -1
  225. package/esm/hooks/use-component-state.d.ts +3 -8
  226. package/esm/hooks/use-component-state.d.ts.map +1 -1
  227. package/esm/hooks/use-component-state.js +8 -0
  228. package/esm/hooks/use-component-state.js.map +1 -1
  229. package/esm/hooks/use-component-state.test.js +37 -0
  230. package/esm/hooks/use-component-state.test.js.map +1 -1
  231. package/esm/hooks/use-message-images.test.js +174 -37
  232. package/esm/hooks/use-message-images.test.js.map +1 -1
  233. package/esm/hooks/use-tambo-threads.js +1 -1
  234. package/esm/hooks/use-tambo-threads.js.map +1 -1
  235. package/esm/hooks/use-tambo-voice.d.ts +1 -1
  236. package/esm/hooks/use-tambo-voice.js +1 -1
  237. package/esm/hooks/use-tambo-voice.js.map +1 -1
  238. package/esm/hooks/use-tambo-voice.test.d.ts +2 -0
  239. package/esm/hooks/use-tambo-voice.test.d.ts.map +1 -0
  240. package/esm/hooks/use-tambo-voice.test.js +234 -0
  241. package/esm/hooks/use-tambo-voice.test.js.map +1 -0
  242. package/esm/index.d.ts +2 -2
  243. package/esm/index.d.ts.map +1 -1
  244. package/esm/index.js.map +1 -1
  245. package/esm/mcp/elicitation.d.ts.map +1 -1
  246. package/esm/mcp/elicitation.js +12 -0
  247. package/esm/mcp/elicitation.js.map +1 -1
  248. package/esm/mcp/elicitation.test.js +8 -1
  249. package/esm/mcp/elicitation.test.js.map +1 -1
  250. package/esm/mcp/mcp-client.d.ts +6 -10
  251. package/esm/mcp/mcp-client.d.ts.map +1 -1
  252. package/esm/mcp/mcp-client.js.map +1 -1
  253. package/esm/mcp/mcp-constants.d.ts +19 -0
  254. package/esm/mcp/mcp-constants.d.ts.map +1 -0
  255. package/esm/mcp/mcp-constants.js +18 -0
  256. package/esm/mcp/mcp-constants.js.map +1 -0
  257. package/esm/mcp/mcp-hooks.d.ts +21 -40
  258. package/esm/mcp/mcp-hooks.d.ts.map +1 -1
  259. package/esm/mcp/mcp-hooks.js +97 -40
  260. package/esm/mcp/mcp-hooks.js.map +1 -1
  261. package/esm/mcp/mcp-hooks.test.js +431 -5
  262. package/esm/mcp/mcp-hooks.test.js.map +1 -1
  263. package/esm/mcp/tambo-mcp-provider.d.ts +7 -0
  264. package/esm/mcp/tambo-mcp-provider.d.ts.map +1 -1
  265. package/esm/mcp/tambo-mcp-provider.js +204 -154
  266. package/esm/mcp/tambo-mcp-provider.js.map +1 -1
  267. package/esm/mcp/tambo-mcp-provider.test.js +37 -0
  268. package/esm/mcp/tambo-mcp-provider.test.js.map +1 -1
  269. package/esm/model/component-metadata.d.ts +54 -21
  270. package/esm/model/component-metadata.d.ts.map +1 -1
  271. package/esm/model/component-metadata.js.map +1 -1
  272. package/esm/model/tambo-interactable.d.ts +13 -5
  273. package/esm/model/tambo-interactable.d.ts.map +1 -1
  274. package/esm/model/tambo-interactable.js.map +1 -1
  275. package/esm/providers/__tests__/thread-input-resource-resolution.test.d.ts +2 -0
  276. package/esm/providers/__tests__/thread-input-resource-resolution.test.d.ts.map +1 -0
  277. package/esm/providers/__tests__/thread-input-resource-resolution.test.js +587 -0
  278. package/esm/providers/__tests__/thread-input-resource-resolution.test.js.map +1 -0
  279. package/esm/providers/index.d.ts +1 -1
  280. package/esm/providers/index.d.ts.map +1 -1
  281. package/esm/providers/index.js.map +1 -1
  282. package/esm/providers/tambo-client-provider.d.ts +8 -0
  283. package/esm/providers/tambo-client-provider.d.ts.map +1 -1
  284. package/esm/providers/tambo-client-provider.js +11 -12
  285. package/esm/providers/tambo-client-provider.js.map +1 -1
  286. package/esm/providers/tambo-client-provider.test.d.ts +2 -0
  287. package/esm/providers/tambo-client-provider.test.d.ts.map +1 -0
  288. package/esm/providers/tambo-client-provider.test.js +203 -0
  289. package/esm/providers/tambo-client-provider.test.js.map +1 -0
  290. package/esm/providers/tambo-context-attachment-provider.d.ts +34 -92
  291. package/esm/providers/tambo-context-attachment-provider.d.ts.map +1 -1
  292. package/esm/providers/tambo-context-attachment-provider.js +63 -106
  293. package/esm/providers/tambo-context-attachment-provider.js.map +1 -1
  294. package/esm/providers/tambo-context-attachment-provider.test.js +230 -464
  295. package/esm/providers/tambo-context-attachment-provider.test.js.map +1 -1
  296. package/esm/providers/tambo-interactable-provider-partial-updates.test.js +22 -21
  297. package/esm/providers/tambo-interactable-provider-partial-updates.test.js.map +1 -1
  298. package/esm/providers/tambo-interactable-provider.d.ts +5 -2
  299. package/esm/providers/tambo-interactable-provider.d.ts.map +1 -1
  300. package/esm/providers/tambo-interactable-provider.js +126 -17
  301. package/esm/providers/tambo-interactable-provider.js.map +1 -1
  302. package/esm/providers/tambo-interactable-provider.test.js +242 -0
  303. package/esm/providers/tambo-interactable-provider.test.js.map +1 -1
  304. package/esm/providers/tambo-interactables-additional-context.test.js +2 -5
  305. package/esm/providers/tambo-interactables-additional-context.test.js.map +1 -1
  306. package/esm/providers/tambo-provider.d.ts +2 -3
  307. package/esm/providers/tambo-provider.d.ts.map +1 -1
  308. package/esm/providers/tambo-provider.js +6 -5
  309. package/esm/providers/tambo-provider.js.map +1 -1
  310. package/esm/providers/tambo-registry-provider.test.js +16 -0
  311. package/esm/providers/tambo-registry-provider.test.js.map +1 -1
  312. package/esm/providers/tambo-registry-schema-compat.test.js +31 -0
  313. package/esm/providers/tambo-registry-schema-compat.test.js.map +1 -1
  314. package/esm/providers/tambo-thread-input-provider.d.ts +1 -1
  315. package/esm/providers/tambo-thread-input-provider.d.ts.map +1 -1
  316. package/esm/providers/tambo-thread-input-provider.js +26 -4
  317. package/esm/providers/tambo-thread-input-provider.js.map +1 -1
  318. package/esm/providers/tambo-thread-provider-initial-messages.test.js +84 -2
  319. package/esm/providers/tambo-thread-provider-initial-messages.test.js.map +1 -1
  320. package/esm/providers/tambo-thread-provider.d.ts.map +1 -1
  321. package/esm/providers/tambo-thread-provider.js +53 -42
  322. package/esm/providers/tambo-thread-provider.js.map +1 -1
  323. package/esm/providers/tambo-thread-provider.test.js +368 -262
  324. package/esm/providers/tambo-thread-provider.test.js.map +1 -1
  325. package/esm/schema/index.d.ts +1 -1
  326. package/esm/schema/index.d.ts.map +1 -1
  327. package/esm/schema/index.js +1 -1
  328. package/esm/schema/index.js.map +1 -1
  329. package/esm/schema/json-schema.d.ts +7 -0
  330. package/esm/schema/json-schema.d.ts.map +1 -1
  331. package/esm/schema/json-schema.js +11 -1
  332. package/esm/schema/json-schema.js.map +1 -1
  333. package/esm/schema/json-schema.test.d.ts +2 -0
  334. package/esm/schema/json-schema.test.d.ts.map +1 -0
  335. package/esm/schema/json-schema.test.js +202 -0
  336. package/esm/schema/json-schema.test.js.map +1 -0
  337. package/esm/schema/schema.test.js +238 -1
  338. package/esm/schema/schema.test.js.map +1 -1
  339. package/esm/schema/standard-schema.d.ts +1 -0
  340. package/esm/schema/standard-schema.d.ts.map +1 -1
  341. package/esm/schema/standard-schema.js +18 -13
  342. package/esm/schema/standard-schema.js.map +1 -1
  343. package/esm/schema/standard-schema.test.d.ts +2 -0
  344. package/esm/schema/standard-schema.test.d.ts.map +1 -0
  345. package/esm/schema/standard-schema.test.js +130 -0
  346. package/esm/schema/standard-schema.test.js.map +1 -0
  347. package/esm/schema/validate.test.js +149 -0
  348. package/esm/schema/validate.test.js.map +1 -1
  349. package/esm/schema/zod.d.ts +7 -4
  350. package/esm/schema/zod.d.ts.map +1 -1
  351. package/esm/schema/zod.js +65 -22
  352. package/esm/schema/zod.js.map +1 -1
  353. package/esm/schema/zod.test.js +113 -1
  354. package/esm/schema/zod.test.js.map +1 -1
  355. package/esm/setupTests.js +3 -0
  356. package/esm/setupTests.js.map +1 -1
  357. package/esm/testing/tools.d.ts +4 -1
  358. package/esm/testing/tools.d.ts.map +1 -1
  359. package/esm/testing/tools.js +6 -1
  360. package/esm/testing/tools.js.map +1 -1
  361. package/esm/util/generate-component.d.ts.map +1 -1
  362. package/esm/util/generate-component.js +18 -3
  363. package/esm/util/generate-component.js.map +1 -1
  364. package/esm/util/generate-component.test.d.ts +2 -0
  365. package/esm/util/generate-component.test.d.ts.map +1 -0
  366. package/esm/util/generate-component.test.js +302 -0
  367. package/esm/util/generate-component.test.js.map +1 -0
  368. package/esm/util/is-promise.d.ts +9 -0
  369. package/esm/util/is-promise.d.ts.map +1 -0
  370. package/esm/util/is-promise.js +17 -0
  371. package/esm/util/is-promise.js.map +1 -0
  372. package/esm/util/is-promise.test.d.ts +2 -0
  373. package/esm/util/is-promise.test.d.ts.map +1 -0
  374. package/esm/util/is-promise.test.js +46 -0
  375. package/esm/util/is-promise.test.js.map +1 -0
  376. package/esm/util/message-builder.d.ts +3 -1
  377. package/esm/util/message-builder.d.ts.map +1 -1
  378. package/esm/util/message-builder.js +20 -3
  379. package/esm/util/message-builder.js.map +1 -1
  380. package/esm/util/message-builder.test.js +269 -0
  381. package/esm/util/message-builder.test.js.map +1 -1
  382. package/esm/util/query-utils.test.d.ts +2 -0
  383. package/esm/util/query-utils.test.d.ts.map +1 -0
  384. package/esm/util/query-utils.test.js +380 -0
  385. package/esm/util/query-utils.test.js.map +1 -0
  386. package/esm/util/registry-validators.d.ts.map +1 -1
  387. package/esm/util/registry-validators.js +7 -0
  388. package/esm/util/registry-validators.js.map +1 -1
  389. package/esm/util/registry-validators.test.js +57 -0
  390. package/esm/util/registry-validators.test.js.map +1 -1
  391. package/esm/util/registry.d.ts.map +1 -1
  392. package/esm/util/registry.js +9 -0
  393. package/esm/util/registry.js.map +1 -1
  394. package/esm/util/registry.test.js +324 -2
  395. package/esm/util/registry.test.js.map +1 -1
  396. package/esm/util/resource-content-resolver.d.ts +20 -0
  397. package/esm/util/resource-content-resolver.d.ts.map +1 -0
  398. package/esm/util/resource-content-resolver.js +89 -0
  399. package/esm/util/resource-content-resolver.js.map +1 -0
  400. package/esm/util/resource-content-resolver.test.d.ts +2 -0
  401. package/esm/util/resource-content-resolver.test.d.ts.map +1 -0
  402. package/esm/util/resource-content-resolver.test.js +252 -0
  403. package/esm/util/resource-content-resolver.test.js.map +1 -0
  404. package/esm/util/resource-validators.test.d.ts +2 -0
  405. package/esm/util/resource-validators.test.d.ts.map +1 -0
  406. package/esm/util/resource-validators.test.js +88 -0
  407. package/esm/util/resource-validators.test.js.map +1 -0
  408. package/esm/util/tool-caller.d.ts +2 -2
  409. package/esm/util/tool-caller.d.ts.map +1 -1
  410. package/esm/util/tool-caller.js +8 -8
  411. package/esm/util/tool-caller.js.map +1 -1
  412. package/esm/util/validate-component-name.test.d.ts +2 -0
  413. package/esm/util/validate-component-name.test.d.ts.map +1 -0
  414. package/esm/util/validate-component-name.test.js +33 -0
  415. package/esm/util/validate-component-name.test.js.map +1 -0
  416. package/package.json +15 -23
  417. package/dist/schema/alias.d.ts +0 -3
  418. package/dist/schema/alias.d.ts.map +0 -1
  419. package/dist/schema/alias.js +0 -6
  420. package/dist/schema/alias.js.map +0 -1
  421. package/esm/schema/alias.d.ts +0 -3
  422. package/esm/schema/alias.d.ts.map +0 -1
  423. package/esm/schema/alias.js +0 -13
  424. package/esm/schema/alias.js.map +0 -1
@@ -674,5 +674,274 @@ describe("buildMessageContent", () => {
674
674
  expect(result[0].type).toBe("resource");
675
675
  });
676
676
  });
677
+ describe("resource content resolution", () => {
678
+ it("should include text content from resolved resource", () => {
679
+ const resourceContent = new Map([
680
+ [
681
+ "registry:file:///doc.txt",
682
+ {
683
+ contents: [
684
+ {
685
+ uri: "file:///doc.txt",
686
+ mimeType: "text/plain",
687
+ text: "This is the document content",
688
+ },
689
+ ],
690
+ },
691
+ ],
692
+ ]);
693
+ const result = (0, message_builder_1.buildMessageContent)("Check @registry:file:///doc.txt", [], {}, resourceContent);
694
+ expect(result).toEqual([
695
+ {
696
+ type: "text",
697
+ text: "Check ",
698
+ },
699
+ {
700
+ type: "resource",
701
+ resource: {
702
+ uri: "file:///doc.txt",
703
+ text: "This is the document content",
704
+ mimeType: "text/plain",
705
+ },
706
+ },
707
+ ]);
708
+ });
709
+ it("should include blob content from resolved resource", () => {
710
+ const resourceContent = new Map([
711
+ [
712
+ "registry:file:///image.png",
713
+ {
714
+ contents: [
715
+ {
716
+ uri: "file:///image.png",
717
+ mimeType: "image/png",
718
+ blob: "base64encodeddata",
719
+ },
720
+ ],
721
+ },
722
+ ],
723
+ ]);
724
+ const result = (0, message_builder_1.buildMessageContent)("Check @registry:file:///image.png", [], {}, resourceContent);
725
+ expect(result).toEqual([
726
+ {
727
+ type: "text",
728
+ text: "Check ",
729
+ },
730
+ {
731
+ type: "resource",
732
+ resource: {
733
+ uri: "file:///image.png",
734
+ blob: "base64encodeddata",
735
+ mimeType: "image/png",
736
+ },
737
+ },
738
+ ]);
739
+ });
740
+ it("should include name and resolved content together", () => {
741
+ const resourceNames = {
742
+ "registry:file:///doc.txt": "Important Document",
743
+ };
744
+ const resourceContent = new Map([
745
+ [
746
+ "registry:file:///doc.txt",
747
+ {
748
+ contents: [
749
+ {
750
+ uri: "file:///doc.txt",
751
+ mimeType: "text/plain",
752
+ text: "Document content here",
753
+ },
754
+ ],
755
+ },
756
+ ],
757
+ ]);
758
+ const result = (0, message_builder_1.buildMessageContent)("@registry:file:///doc.txt", [], resourceNames, resourceContent);
759
+ expect(result).toEqual([
760
+ {
761
+ type: "resource",
762
+ resource: {
763
+ uri: "file:///doc.txt",
764
+ name: "Important Document",
765
+ text: "Document content here",
766
+ mimeType: "text/plain",
767
+ },
768
+ },
769
+ ]);
770
+ });
771
+ it("should handle multiple resources with mixed resolved content", () => {
772
+ const resourceContent = new Map([
773
+ [
774
+ "registry:file:///doc1.txt",
775
+ {
776
+ contents: [
777
+ {
778
+ uri: "file:///doc1.txt",
779
+ text: "First doc content",
780
+ },
781
+ ],
782
+ },
783
+ ],
784
+ // doc2 is NOT in resourceContent - simulates internal server resource
785
+ ]);
786
+ const result = (0, message_builder_1.buildMessageContent)("@registry:file:///doc1.txt and @tambo-abc:tambo://doc2", [], {}, resourceContent);
787
+ expect(result).toEqual([
788
+ {
789
+ type: "resource",
790
+ resource: {
791
+ uri: "file:///doc1.txt",
792
+ text: "First doc content",
793
+ },
794
+ },
795
+ {
796
+ type: "text",
797
+ text: " and ",
798
+ },
799
+ {
800
+ type: "resource",
801
+ resource: {
802
+ uri: "tambo://doc2",
803
+ // No text/blob - internal server resource
804
+ },
805
+ },
806
+ ]);
807
+ });
808
+ it("should handle resolved content without mimeType", () => {
809
+ const resourceContent = new Map([
810
+ [
811
+ "server:file:///doc.txt",
812
+ {
813
+ contents: [
814
+ {
815
+ uri: "file:///doc.txt",
816
+ text: "Content without mimeType",
817
+ },
818
+ ],
819
+ },
820
+ ],
821
+ ]);
822
+ const result = (0, message_builder_1.buildMessageContent)("@server:file:///doc.txt", [], {}, resourceContent);
823
+ expect(result).toEqual([
824
+ {
825
+ type: "resource",
826
+ resource: {
827
+ uri: "file:///doc.txt",
828
+ text: "Content without mimeType",
829
+ },
830
+ },
831
+ ]);
832
+ });
833
+ it("should handle empty resourceContent map gracefully", () => {
834
+ const result = (0, message_builder_1.buildMessageContent)("@registry:file:///doc.txt", [], {}, new Map());
835
+ expect(result).toEqual([
836
+ {
837
+ type: "resource",
838
+ resource: {
839
+ uri: "file:///doc.txt",
840
+ },
841
+ },
842
+ ]);
843
+ });
844
+ it("should handle undefined resourceContent gracefully", () => {
845
+ const result = (0, message_builder_1.buildMessageContent)("@registry:file:///doc.txt", [], {}, undefined);
846
+ expect(result).toEqual([
847
+ {
848
+ type: "resource",
849
+ resource: {
850
+ uri: "file:///doc.txt",
851
+ },
852
+ },
853
+ ]);
854
+ });
855
+ it("should handle resolved content with empty contents array", () => {
856
+ const resourceContent = new Map([
857
+ [
858
+ "registry:file:///doc.txt",
859
+ {
860
+ contents: [],
861
+ },
862
+ ],
863
+ ]);
864
+ const result = (0, message_builder_1.buildMessageContent)("@registry:file:///doc.txt", [], {}, resourceContent);
865
+ expect(result).toEqual([
866
+ {
867
+ type: "resource",
868
+ resource: {
869
+ uri: "file:///doc.txt",
870
+ },
871
+ },
872
+ ]);
873
+ });
874
+ it("should include resolved content with MCP server resources", () => {
875
+ const resourceContent = new Map([
876
+ [
877
+ "linear:linear://issue/123",
878
+ {
879
+ contents: [
880
+ {
881
+ uri: "linear://issue/123",
882
+ mimeType: "application/json",
883
+ text: '{"title": "Bug fix", "status": "open"}',
884
+ },
885
+ ],
886
+ },
887
+ ],
888
+ ]);
889
+ const result = (0, message_builder_1.buildMessageContent)("Check issue @linear:linear://issue/123", [], {}, resourceContent);
890
+ expect(result).toEqual([
891
+ {
892
+ type: "text",
893
+ text: "Check issue ",
894
+ },
895
+ {
896
+ type: "resource",
897
+ resource: {
898
+ uri: "linear://issue/123",
899
+ text: '{"title": "Bug fix", "status": "open"}',
900
+ mimeType: "application/json",
901
+ },
902
+ },
903
+ ]);
904
+ });
905
+ it("should combine resolved content with images", () => {
906
+ const resourceContent = new Map([
907
+ [
908
+ "registry:file:///doc.txt",
909
+ {
910
+ contents: [
911
+ {
912
+ uri: "file:///doc.txt",
913
+ text: "Document content",
914
+ },
915
+ ],
916
+ },
917
+ ],
918
+ ]);
919
+ const images = [
920
+ createMockStagedImage({
921
+ dataUrl: "data:image/png;base64,imagedata",
922
+ }),
923
+ ];
924
+ const result = (0, message_builder_1.buildMessageContent)("Check @registry:file:///doc.txt", images, {}, resourceContent);
925
+ expect(result).toEqual([
926
+ {
927
+ type: "text",
928
+ text: "Check ",
929
+ },
930
+ {
931
+ type: "resource",
932
+ resource: {
933
+ uri: "file:///doc.txt",
934
+ text: "Document content",
935
+ },
936
+ },
937
+ {
938
+ type: "image_url",
939
+ image_url: {
940
+ url: "data:image/png;base64,imagedata",
941
+ },
942
+ },
943
+ ]);
944
+ });
945
+ });
677
946
  });
678
947
  //# sourceMappingURL=message-builder.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"message-builder.test.js","sourceRoot":"","sources":["../../src/util/message-builder.test.ts"],"names":[],"mappings":"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","sourcesContent":["import type TamboAI from \"@tambo-ai/typescript-sdk\";\nimport { StagedImage } from \"../hooks/use-message-images\";\nimport { buildMessageContent } from \"./message-builder\";\n\ndescribe(\"buildMessageContent\", () => {\n const createMockStagedImage = (\n overrides: Partial<StagedImage> = {},\n ): StagedImage => ({\n id: \"test-id\",\n name: \"test-image.png\",\n dataUrl: \"data:image/png;base64,mock-data\",\n file: new File([\"\"], \"test-image.png\", { type: \"image/png\" }),\n size: 1024,\n type: \"image/png\",\n ...overrides,\n });\n\n it(\"should build content with text only\", () => {\n const result = buildMessageContent(\"Hello world\", [], {});\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Hello world\",\n },\n ]);\n });\n\n it(\"should build content with images only\", () => {\n const image = createMockStagedImage({\n dataUrl: \"data:image/png;base64,abc123\",\n });\n\n const result = buildMessageContent(\"\", [image], {});\n\n expect(result).toEqual([\n {\n type: \"image_url\",\n image_url: {\n url: \"data:image/png;base64,abc123\",\n },\n },\n ]);\n });\n\n it(\"should build content with both text and images\", () => {\n const images = [\n createMockStagedImage({\n id: \"img1\",\n dataUrl: \"data:image/png;base64,abc123\",\n }),\n createMockStagedImage({\n id: \"img2\",\n dataUrl: \"data:image/jpeg;base64,def456\",\n }),\n ];\n\n const result = buildMessageContent(\"Check these images:\", images, {});\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Check these images:\",\n },\n {\n type: \"image_url\",\n image_url: {\n url: \"data:image/png;base64,abc123\",\n },\n },\n {\n type: \"image_url\",\n image_url: {\n url: \"data:image/jpeg;base64,def456\",\n },\n },\n ]);\n });\n\n it(\"should preserve leading and trailing whitespace in text\", () => {\n const result = buildMessageContent(\" Hello world \", [], {});\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \" Hello world \",\n },\n ]);\n });\n\n it(\"should skip empty text but keep images\", () => {\n const image = createMockStagedImage();\n const result = buildMessageContent(\" \", [image], {});\n\n expect(result).toEqual([\n {\n type: \"image_url\",\n image_url: {\n url: \"data:image/png;base64,mock-data\",\n },\n },\n ]);\n });\n\n it(\"should handle multiple images correctly\", () => {\n const images = [\n createMockStagedImage({\n id: \"img1\",\n name: \"photo1.jpg\",\n dataUrl: \"data:image/jpeg;base64,photo1data\",\n }),\n createMockStagedImage({\n id: \"img2\",\n name: \"photo2.png\",\n dataUrl: \"data:image/png;base64,photo2data\",\n }),\n createMockStagedImage({\n id: \"img3\",\n name: \"photo3.gif\",\n dataUrl: \"data:image/gif;base64,photo3data\",\n }),\n ];\n\n const result = buildMessageContent(\"Multiple images:\", images, {});\n\n expect(result).toHaveLength(4); // 1 text + 3 images\n expect(result[0]).toEqual({\n type: \"text\",\n text: \"Multiple images:\",\n });\n expect(result[1]).toEqual({\n type: \"image_url\",\n image_url: {\n url: \"data:image/jpeg;base64,photo1data\",\n },\n });\n expect(result[2]).toEqual({\n type: \"image_url\",\n image_url: {\n url: \"data:image/png;base64,photo2data\",\n },\n });\n expect(result[3]).toEqual({\n type: \"image_url\",\n image_url: {\n url: \"data:image/gif;base64,photo3data\",\n },\n });\n });\n\n it(\"should throw error when no content provided\", () => {\n expect(() => {\n buildMessageContent(\"\", [], {});\n }).toThrow(\"Message must contain text or images\");\n });\n\n it(\"should throw error when only whitespace provided\", () => {\n expect(() => {\n buildMessageContent(\" \\n\\t \", [], {});\n }).toThrow(\"Message must contain text or images\");\n });\n\n it(\"should return correct content type structure\", () => {\n const image = createMockStagedImage();\n const result = buildMessageContent(\"Test\", [image], {});\n\n // Verify the structure matches ChatCompletionContentPart interface\n result.forEach((part: TamboAI.Beta.Threads.ChatCompletionContentPart) => {\n expect(part).toHaveProperty(\"type\");\n expect([\"text\", \"image_url\", \"input_audio\"]).toContain(part.type);\n\n if (part.type === \"text\") {\n expect(part).toHaveProperty(\"text\");\n expect(typeof part.text).toBe(\"string\");\n }\n\n if (part.type === \"image_url\") {\n expect(part).toHaveProperty(\"image_url\");\n expect(part.image_url).toHaveProperty(\"url\");\n expect(typeof part.image_url?.url).toBe(\"string\");\n }\n });\n });\n\n it(\"should handle edge case with empty array but valid text\", () => {\n const result = buildMessageContent(\"Just text\", [], {});\n\n expect(result).toHaveLength(1);\n expect(result[0]).toEqual({\n type: \"text\",\n text: \"Just text\",\n });\n });\n\n it(\"should maintain order of text first then images\", () => {\n const images = [\n createMockStagedImage({\n id: \"first\",\n dataUrl: \"data:image/png;base64,first\",\n }),\n createMockStagedImage({\n id: \"second\",\n dataUrl: \"data:image/png;base64,second\",\n }),\n ];\n\n const result = buildMessageContent(\"Text content\", images, {});\n\n expect(result[0].type).toBe(\"text\");\n expect(result[1].type).toBe(\"image_url\");\n expect(result[2].type).toBe(\"image_url\");\n\n if (result[1].type === \"image_url\") {\n expect(result[1].image_url?.url).toBe(\"data:image/png;base64,first\");\n }\n if (result[2].type === \"image_url\") {\n expect(result[2].image_url?.url).toBe(\"data:image/png;base64,second\");\n }\n });\n\n describe(\"resource parsing\", () => {\n it(\"should parse a single resource reference\", () => {\n const result = buildMessageContent(\n \"Check @tambo-1hfs429:tambo:test://static/resource/1\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Check \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n ]);\n });\n\n it(\"should parse resource reference at the start of text\", () => {\n const result = buildMessageContent(\n \"@tambo-1hfs429:tambo:test://static/resource/1 check this\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"text\",\n text: \" check this\",\n },\n ]);\n });\n\n it(\"should parse resource reference at the end of text\", () => {\n const result = buildMessageContent(\n \"Check this @tambo-1hfs429:tambo:test://static/resource/1\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Check this \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n ]);\n });\n\n it(\"should parse resource reference with name from resourceNames map\", () => {\n const resourceNames = {\n \"tambo-1hfs429:tambo:test://static/resource/1\": \"Documentation.pdf\",\n };\n\n const result = buildMessageContent(\n \"Check @tambo-1hfs429:tambo:test://static/resource/1\",\n [],\n resourceNames,\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Check \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n name: \"Documentation.pdf\",\n },\n },\n ]);\n });\n\n it(\"should parse resource reference without name when not in resourceNames map\", () => {\n const resourceNames = {\n \"other-server:other-uri\": \"Other Resource\",\n };\n\n const result = buildMessageContent(\n \"Check @tambo-1hfs429:tambo:test://static/resource/1\",\n [],\n resourceNames,\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Check \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n ]);\n });\n\n it(\"should parse multiple resource references\", () => {\n const result = buildMessageContent(\n \"Check @tambo-1hfs429:tambo:test://static/resource/1 and @tambo-1hfs429:tambo:test://static/resource/2\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Check \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"text\",\n text: \" and \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/2\",\n },\n },\n ]);\n });\n\n it(\"should preserve whitespace between consecutive resource references\", () => {\n const result = buildMessageContent(\n \"@tambo-1hfs429:tambo:test://static/resource/1 @tambo-1hfs429:tambo:test://static/resource/2\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"text\",\n text: \" \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/2\",\n },\n },\n ]);\n });\n\n it(\"should parse resources with text before, between, and after\", () => {\n const result = buildMessageContent(\n \"Before @tambo-1hfs429:tambo:test://static/resource/1 middle @linear:file://path/to/file.txt after\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Before \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"text\",\n text: \" middle \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"file://path/to/file.txt\",\n },\n },\n {\n type: \"text\",\n text: \" after\",\n },\n ]);\n });\n\n it(\"should parse resources from different server keys\", () => {\n const result = buildMessageContent(\n \"@tambo-1hfs429:tambo:test://static/resource/1 and @linear:linear://issue/123\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"text\",\n text: \" and \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"linear://issue/123\",\n },\n },\n ]);\n });\n\n it(\"should parse resources with various URI formats and preserve whitespace\", () => {\n const result = buildMessageContent(\n \"@server1:file:///path/to/file.txt @server2:https://example.com/doc.pdf @server3:s3://bucket/key.json\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"file:///path/to/file.txt\",\n },\n },\n {\n type: \"text\",\n text: \" \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"https://example.com/doc.pdf\",\n },\n },\n {\n type: \"text\",\n text: \" \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"s3://bucket/key.json\",\n },\n },\n ]);\n });\n\n it(\"should parse resources with hyphens in server key\", () => {\n const result = buildMessageContent(\n \"@my-server-123:file:///path/to/file.txt\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"file:///path/to/file.txt\",\n },\n },\n ]);\n });\n\n it(\"should parse resources with numbers in server key\", () => {\n const result = buildMessageContent(\n \"@server123:tambo:test://static/resource/1\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n ]);\n });\n\n it(\"should preserve whitespace in text segments around resource references\", () => {\n const result = buildMessageContent(\n \" Before @tambo-1hfs429:tambo:test://static/resource/1 After \",\n [],\n {},\n );\n expect(result).toEqual([\n {\n type: \"text\",\n text: \" Before \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"text\",\n text: \" After \",\n },\n ]);\n });\n\n it(\"should handle resource with only whitespace text segments\", () => {\n const result = buildMessageContent(\n \" @tambo-1hfs429:tambo:test://static/resource/1 \",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \" \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"text\",\n text: \" \",\n },\n ]);\n });\n\n it(\"should preserve newlines and spaces around resource references\", () => {\n const result = buildMessageContent(\n \"\\n @tambo-1hfs429:tambo:test://static/resource/1 text\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"\\n \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"text\",\n text: \" text\",\n },\n ]);\n });\n\n it(\"should parse resource-only message without text\", () => {\n const result = buildMessageContent(\n \"@tambo-1hfs429:tambo:test://static/resource/1\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n ]);\n });\n\n it(\"should parse multiple resources with names\", () => {\n const resourceNames = {\n \"tambo-1hfs429:tambo:test://static/resource/1\": \"First Resource\",\n \"tambo-1hfs429:tambo:test://static/resource/2\": \"Second Resource\",\n };\n\n const result = buildMessageContent(\n \"Check @tambo-1hfs429:tambo:test://static/resource/1 and @tambo-1hfs429:tambo:test://static/resource/2\",\n [],\n resourceNames,\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Check \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n name: \"First Resource\",\n },\n },\n {\n type: \"text\",\n text: \" and \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/2\",\n name: \"Second Resource\",\n },\n },\n ]);\n });\n\n it(\"should parse resources mixed with images\", () => {\n const images = [\n createMockStagedImage({\n id: \"img1\",\n dataUrl: \"data:image/png;base64,abc123\",\n }),\n ];\n\n const result = buildMessageContent(\n \"Check @tambo-1hfs429:tambo:test://static/resource/1\",\n images,\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Check \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"image_url\",\n image_url: {\n url: \"data:image/png;base64,abc123\",\n },\n },\n ]);\n });\n\n it(\"should parse resources and images with proper ordering\", () => {\n const images = [\n createMockStagedImage({\n id: \"img1\",\n dataUrl: \"data:image/png;base64,img1\",\n }),\n createMockStagedImage({\n id: \"img2\",\n dataUrl: \"data:image/jpeg;base64,img2\",\n }),\n ];\n\n const result = buildMessageContent(\n \"Text @tambo-1hfs429:tambo:test://static/resource/1 more text\",\n images,\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Text \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"text\",\n text: \" more text\",\n },\n {\n type: \"image_url\",\n image_url: {\n url: \"data:image/png;base64,img1\",\n },\n },\n {\n type: \"image_url\",\n image_url: {\n url: \"data:image/jpeg;base64,img2\",\n },\n },\n ]);\n });\n\n it(\"should parse resource reference with URI containing colons\", () => {\n const result = buildMessageContent(\n \"@server:http://example.com:8080/path\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"http://example.com:8080/path\",\n },\n },\n ]);\n });\n\n it(\"should parse resource reference with URI containing special characters\", () => {\n const result = buildMessageContent(\n \"@server:file:///path/to/file%20with%20spaces.txt\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"file:///path/to/file%20with%20spaces.txt\",\n },\n },\n ]);\n });\n\n it(\"should not parse @ symbol without server key and colon\", () => {\n const result = buildMessageContent(\n \"Mention @user but not a resource\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Mention @user but not a resource\",\n },\n ]);\n });\n\n it(\"should not parse malformed resource reference missing colon\", () => {\n const result = buildMessageContent(\n \"@serverkey-missing-colon resource\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"@serverkey-missing-colon resource\",\n },\n ]);\n });\n\n it(\"should not parse resource reference with space before colon\", () => {\n const result = buildMessageContent(\"@server key :uri\", [], {});\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"@server key :uri\",\n },\n ]);\n });\n\n it(\"should preserve multiple whitespace characters between consecutive resources\", () => {\n const result = buildMessageContent(\n \"@tambo-1hfs429:tambo:test://static/resource/1 @tambo-1hfs429:tambo:test://static/resource/2\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"text\",\n text: \" \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/2\",\n },\n },\n ]);\n });\n\n it(\"should parse resource with only URI and no surrounding text\", () => {\n const result = buildMessageContent(\n \"@tambo-1hfs429:tambo:test://static/resource/1\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n ]);\n });\n\n it(\"should throw error when only resources with empty text segments\", () => {\n // This should work - resources alone should be valid\n const result = buildMessageContent(\n \"@tambo-1hfs429:tambo:test://static/resource/1\",\n [],\n {},\n );\n\n expect(result.length).toBeGreaterThan(0);\n expect(result[0].type).toBe(\"resource\");\n });\n });\n});\n"]}
1
+ {"version":3,"file":"message-builder.test.js","sourceRoot":"","sources":["../../src/util/message-builder.test.ts"],"names":[],"mappings":"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","sourcesContent":["import type TamboAI from \"@tambo-ai/typescript-sdk\";\nimport { StagedImage } from \"../hooks/use-message-images\";\nimport { buildMessageContent } from \"./message-builder\";\n\ndescribe(\"buildMessageContent\", () => {\n const createMockStagedImage = (\n overrides: Partial<StagedImage> = {},\n ): StagedImage => ({\n id: \"test-id\",\n name: \"test-image.png\",\n dataUrl: \"data:image/png;base64,mock-data\",\n file: new File([\"\"], \"test-image.png\", { type: \"image/png\" }),\n size: 1024,\n type: \"image/png\",\n ...overrides,\n });\n\n it(\"should build content with text only\", () => {\n const result = buildMessageContent(\"Hello world\", [], {});\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Hello world\",\n },\n ]);\n });\n\n it(\"should build content with images only\", () => {\n const image = createMockStagedImage({\n dataUrl: \"data:image/png;base64,abc123\",\n });\n\n const result = buildMessageContent(\"\", [image], {});\n\n expect(result).toEqual([\n {\n type: \"image_url\",\n image_url: {\n url: \"data:image/png;base64,abc123\",\n },\n },\n ]);\n });\n\n it(\"should build content with both text and images\", () => {\n const images = [\n createMockStagedImage({\n id: \"img1\",\n dataUrl: \"data:image/png;base64,abc123\",\n }),\n createMockStagedImage({\n id: \"img2\",\n dataUrl: \"data:image/jpeg;base64,def456\",\n }),\n ];\n\n const result = buildMessageContent(\"Check these images:\", images, {});\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Check these images:\",\n },\n {\n type: \"image_url\",\n image_url: {\n url: \"data:image/png;base64,abc123\",\n },\n },\n {\n type: \"image_url\",\n image_url: {\n url: \"data:image/jpeg;base64,def456\",\n },\n },\n ]);\n });\n\n it(\"should preserve leading and trailing whitespace in text\", () => {\n const result = buildMessageContent(\" Hello world \", [], {});\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \" Hello world \",\n },\n ]);\n });\n\n it(\"should skip empty text but keep images\", () => {\n const image = createMockStagedImage();\n const result = buildMessageContent(\" \", [image], {});\n\n expect(result).toEqual([\n {\n type: \"image_url\",\n image_url: {\n url: \"data:image/png;base64,mock-data\",\n },\n },\n ]);\n });\n\n it(\"should handle multiple images correctly\", () => {\n const images = [\n createMockStagedImage({\n id: \"img1\",\n name: \"photo1.jpg\",\n dataUrl: \"data:image/jpeg;base64,photo1data\",\n }),\n createMockStagedImage({\n id: \"img2\",\n name: \"photo2.png\",\n dataUrl: \"data:image/png;base64,photo2data\",\n }),\n createMockStagedImage({\n id: \"img3\",\n name: \"photo3.gif\",\n dataUrl: \"data:image/gif;base64,photo3data\",\n }),\n ];\n\n const result = buildMessageContent(\"Multiple images:\", images, {});\n\n expect(result).toHaveLength(4); // 1 text + 3 images\n expect(result[0]).toEqual({\n type: \"text\",\n text: \"Multiple images:\",\n });\n expect(result[1]).toEqual({\n type: \"image_url\",\n image_url: {\n url: \"data:image/jpeg;base64,photo1data\",\n },\n });\n expect(result[2]).toEqual({\n type: \"image_url\",\n image_url: {\n url: \"data:image/png;base64,photo2data\",\n },\n });\n expect(result[3]).toEqual({\n type: \"image_url\",\n image_url: {\n url: \"data:image/gif;base64,photo3data\",\n },\n });\n });\n\n it(\"should throw error when no content provided\", () => {\n expect(() => {\n buildMessageContent(\"\", [], {});\n }).toThrow(\"Message must contain text or images\");\n });\n\n it(\"should throw error when only whitespace provided\", () => {\n expect(() => {\n buildMessageContent(\" \\n\\t \", [], {});\n }).toThrow(\"Message must contain text or images\");\n });\n\n it(\"should return correct content type structure\", () => {\n const image = createMockStagedImage();\n const result = buildMessageContent(\"Test\", [image], {});\n\n // Verify the structure matches ChatCompletionContentPart interface\n result.forEach((part: TamboAI.Beta.Threads.ChatCompletionContentPart) => {\n expect(part).toHaveProperty(\"type\");\n expect([\"text\", \"image_url\", \"input_audio\"]).toContain(part.type);\n\n if (part.type === \"text\") {\n expect(part).toHaveProperty(\"text\");\n expect(typeof part.text).toBe(\"string\");\n }\n\n if (part.type === \"image_url\") {\n expect(part).toHaveProperty(\"image_url\");\n expect(part.image_url).toHaveProperty(\"url\");\n expect(typeof part.image_url?.url).toBe(\"string\");\n }\n });\n });\n\n it(\"should handle edge case with empty array but valid text\", () => {\n const result = buildMessageContent(\"Just text\", [], {});\n\n expect(result).toHaveLength(1);\n expect(result[0]).toEqual({\n type: \"text\",\n text: \"Just text\",\n });\n });\n\n it(\"should maintain order of text first then images\", () => {\n const images = [\n createMockStagedImage({\n id: \"first\",\n dataUrl: \"data:image/png;base64,first\",\n }),\n createMockStagedImage({\n id: \"second\",\n dataUrl: \"data:image/png;base64,second\",\n }),\n ];\n\n const result = buildMessageContent(\"Text content\", images, {});\n\n expect(result[0].type).toBe(\"text\");\n expect(result[1].type).toBe(\"image_url\");\n expect(result[2].type).toBe(\"image_url\");\n\n if (result[1].type === \"image_url\") {\n expect(result[1].image_url?.url).toBe(\"data:image/png;base64,first\");\n }\n if (result[2].type === \"image_url\") {\n expect(result[2].image_url?.url).toBe(\"data:image/png;base64,second\");\n }\n });\n\n describe(\"resource parsing\", () => {\n it(\"should parse a single resource reference\", () => {\n const result = buildMessageContent(\n \"Check @tambo-1hfs429:tambo:test://static/resource/1\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Check \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n ]);\n });\n\n it(\"should parse resource reference at the start of text\", () => {\n const result = buildMessageContent(\n \"@tambo-1hfs429:tambo:test://static/resource/1 check this\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"text\",\n text: \" check this\",\n },\n ]);\n });\n\n it(\"should parse resource reference at the end of text\", () => {\n const result = buildMessageContent(\n \"Check this @tambo-1hfs429:tambo:test://static/resource/1\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Check this \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n ]);\n });\n\n it(\"should parse resource reference with name from resourceNames map\", () => {\n const resourceNames = {\n \"tambo-1hfs429:tambo:test://static/resource/1\": \"Documentation.pdf\",\n };\n\n const result = buildMessageContent(\n \"Check @tambo-1hfs429:tambo:test://static/resource/1\",\n [],\n resourceNames,\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Check \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n name: \"Documentation.pdf\",\n },\n },\n ]);\n });\n\n it(\"should parse resource reference without name when not in resourceNames map\", () => {\n const resourceNames = {\n \"other-server:other-uri\": \"Other Resource\",\n };\n\n const result = buildMessageContent(\n \"Check @tambo-1hfs429:tambo:test://static/resource/1\",\n [],\n resourceNames,\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Check \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n ]);\n });\n\n it(\"should parse multiple resource references\", () => {\n const result = buildMessageContent(\n \"Check @tambo-1hfs429:tambo:test://static/resource/1 and @tambo-1hfs429:tambo:test://static/resource/2\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Check \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"text\",\n text: \" and \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/2\",\n },\n },\n ]);\n });\n\n it(\"should preserve whitespace between consecutive resource references\", () => {\n const result = buildMessageContent(\n \"@tambo-1hfs429:tambo:test://static/resource/1 @tambo-1hfs429:tambo:test://static/resource/2\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"text\",\n text: \" \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/2\",\n },\n },\n ]);\n });\n\n it(\"should parse resources with text before, between, and after\", () => {\n const result = buildMessageContent(\n \"Before @tambo-1hfs429:tambo:test://static/resource/1 middle @linear:file://path/to/file.txt after\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Before \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"text\",\n text: \" middle \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"file://path/to/file.txt\",\n },\n },\n {\n type: \"text\",\n text: \" after\",\n },\n ]);\n });\n\n it(\"should parse resources from different server keys\", () => {\n const result = buildMessageContent(\n \"@tambo-1hfs429:tambo:test://static/resource/1 and @linear:linear://issue/123\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"text\",\n text: \" and \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"linear://issue/123\",\n },\n },\n ]);\n });\n\n it(\"should parse resources with various URI formats and preserve whitespace\", () => {\n const result = buildMessageContent(\n \"@server1:file:///path/to/file.txt @server2:https://example.com/doc.pdf @server3:s3://bucket/key.json\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"file:///path/to/file.txt\",\n },\n },\n {\n type: \"text\",\n text: \" \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"https://example.com/doc.pdf\",\n },\n },\n {\n type: \"text\",\n text: \" \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"s3://bucket/key.json\",\n },\n },\n ]);\n });\n\n it(\"should parse resources with hyphens in server key\", () => {\n const result = buildMessageContent(\n \"@my-server-123:file:///path/to/file.txt\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"file:///path/to/file.txt\",\n },\n },\n ]);\n });\n\n it(\"should parse resources with numbers in server key\", () => {\n const result = buildMessageContent(\n \"@server123:tambo:test://static/resource/1\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n ]);\n });\n\n it(\"should preserve whitespace in text segments around resource references\", () => {\n const result = buildMessageContent(\n \" Before @tambo-1hfs429:tambo:test://static/resource/1 After \",\n [],\n {},\n );\n expect(result).toEqual([\n {\n type: \"text\",\n text: \" Before \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"text\",\n text: \" After \",\n },\n ]);\n });\n\n it(\"should handle resource with only whitespace text segments\", () => {\n const result = buildMessageContent(\n \" @tambo-1hfs429:tambo:test://static/resource/1 \",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \" \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"text\",\n text: \" \",\n },\n ]);\n });\n\n it(\"should preserve newlines and spaces around resource references\", () => {\n const result = buildMessageContent(\n \"\\n @tambo-1hfs429:tambo:test://static/resource/1 text\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"\\n \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"text\",\n text: \" text\",\n },\n ]);\n });\n\n it(\"should parse resource-only message without text\", () => {\n const result = buildMessageContent(\n \"@tambo-1hfs429:tambo:test://static/resource/1\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n ]);\n });\n\n it(\"should parse multiple resources with names\", () => {\n const resourceNames = {\n \"tambo-1hfs429:tambo:test://static/resource/1\": \"First Resource\",\n \"tambo-1hfs429:tambo:test://static/resource/2\": \"Second Resource\",\n };\n\n const result = buildMessageContent(\n \"Check @tambo-1hfs429:tambo:test://static/resource/1 and @tambo-1hfs429:tambo:test://static/resource/2\",\n [],\n resourceNames,\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Check \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n name: \"First Resource\",\n },\n },\n {\n type: \"text\",\n text: \" and \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/2\",\n name: \"Second Resource\",\n },\n },\n ]);\n });\n\n it(\"should parse resources mixed with images\", () => {\n const images = [\n createMockStagedImage({\n id: \"img1\",\n dataUrl: \"data:image/png;base64,abc123\",\n }),\n ];\n\n const result = buildMessageContent(\n \"Check @tambo-1hfs429:tambo:test://static/resource/1\",\n images,\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Check \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"image_url\",\n image_url: {\n url: \"data:image/png;base64,abc123\",\n },\n },\n ]);\n });\n\n it(\"should parse resources and images with proper ordering\", () => {\n const images = [\n createMockStagedImage({\n id: \"img1\",\n dataUrl: \"data:image/png;base64,img1\",\n }),\n createMockStagedImage({\n id: \"img2\",\n dataUrl: \"data:image/jpeg;base64,img2\",\n }),\n ];\n\n const result = buildMessageContent(\n \"Text @tambo-1hfs429:tambo:test://static/resource/1 more text\",\n images,\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Text \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"text\",\n text: \" more text\",\n },\n {\n type: \"image_url\",\n image_url: {\n url: \"data:image/png;base64,img1\",\n },\n },\n {\n type: \"image_url\",\n image_url: {\n url: \"data:image/jpeg;base64,img2\",\n },\n },\n ]);\n });\n\n it(\"should parse resource reference with URI containing colons\", () => {\n const result = buildMessageContent(\n \"@server:http://example.com:8080/path\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"http://example.com:8080/path\",\n },\n },\n ]);\n });\n\n it(\"should parse resource reference with URI containing special characters\", () => {\n const result = buildMessageContent(\n \"@server:file:///path/to/file%20with%20spaces.txt\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"file:///path/to/file%20with%20spaces.txt\",\n },\n },\n ]);\n });\n\n it(\"should not parse @ symbol without server key and colon\", () => {\n const result = buildMessageContent(\n \"Mention @user but not a resource\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Mention @user but not a resource\",\n },\n ]);\n });\n\n it(\"should not parse malformed resource reference missing colon\", () => {\n const result = buildMessageContent(\n \"@serverkey-missing-colon resource\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"@serverkey-missing-colon resource\",\n },\n ]);\n });\n\n it(\"should not parse resource reference with space before colon\", () => {\n const result = buildMessageContent(\"@server key :uri\", [], {});\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"@server key :uri\",\n },\n ]);\n });\n\n it(\"should preserve multiple whitespace characters between consecutive resources\", () => {\n const result = buildMessageContent(\n \"@tambo-1hfs429:tambo:test://static/resource/1 @tambo-1hfs429:tambo:test://static/resource/2\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"text\",\n text: \" \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/2\",\n },\n },\n ]);\n });\n\n it(\"should parse resource with only URI and no surrounding text\", () => {\n const result = buildMessageContent(\n \"@tambo-1hfs429:tambo:test://static/resource/1\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n ]);\n });\n\n it(\"should throw error when only resources with empty text segments\", () => {\n // This should work - resources alone should be valid\n const result = buildMessageContent(\n \"@tambo-1hfs429:tambo:test://static/resource/1\",\n [],\n {},\n );\n\n expect(result.length).toBeGreaterThan(0);\n expect(result[0].type).toBe(\"resource\");\n });\n });\n\n describe(\"resource content resolution\", () => {\n it(\"should include text content from resolved resource\", () => {\n const resourceContent = new Map([\n [\n \"registry:file:///doc.txt\",\n {\n contents: [\n {\n uri: \"file:///doc.txt\",\n mimeType: \"text/plain\",\n text: \"This is the document content\",\n },\n ],\n },\n ],\n ]);\n\n const result = buildMessageContent(\n \"Check @registry:file:///doc.txt\",\n [],\n {},\n resourceContent,\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Check \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"file:///doc.txt\",\n text: \"This is the document content\",\n mimeType: \"text/plain\",\n },\n },\n ]);\n });\n\n it(\"should include blob content from resolved resource\", () => {\n const resourceContent = new Map([\n [\n \"registry:file:///image.png\",\n {\n contents: [\n {\n uri: \"file:///image.png\",\n mimeType: \"image/png\",\n blob: \"base64encodeddata\",\n },\n ],\n },\n ],\n ]);\n\n const result = buildMessageContent(\n \"Check @registry:file:///image.png\",\n [],\n {},\n resourceContent,\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Check \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"file:///image.png\",\n blob: \"base64encodeddata\",\n mimeType: \"image/png\",\n },\n },\n ]);\n });\n\n it(\"should include name and resolved content together\", () => {\n const resourceNames = {\n \"registry:file:///doc.txt\": \"Important Document\",\n };\n const resourceContent = new Map([\n [\n \"registry:file:///doc.txt\",\n {\n contents: [\n {\n uri: \"file:///doc.txt\",\n mimeType: \"text/plain\",\n text: \"Document content here\",\n },\n ],\n },\n ],\n ]);\n\n const result = buildMessageContent(\n \"@registry:file:///doc.txt\",\n [],\n resourceNames,\n resourceContent,\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"file:///doc.txt\",\n name: \"Important Document\",\n text: \"Document content here\",\n mimeType: \"text/plain\",\n },\n },\n ]);\n });\n\n it(\"should handle multiple resources with mixed resolved content\", () => {\n const resourceContent = new Map([\n [\n \"registry:file:///doc1.txt\",\n {\n contents: [\n {\n uri: \"file:///doc1.txt\",\n text: \"First doc content\",\n },\n ],\n },\n ],\n // doc2 is NOT in resourceContent - simulates internal server resource\n ]);\n\n const result = buildMessageContent(\n \"@registry:file:///doc1.txt and @tambo-abc:tambo://doc2\",\n [],\n {},\n resourceContent,\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"file:///doc1.txt\",\n text: \"First doc content\",\n },\n },\n {\n type: \"text\",\n text: \" and \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo://doc2\",\n // No text/blob - internal server resource\n },\n },\n ]);\n });\n\n it(\"should handle resolved content without mimeType\", () => {\n const resourceContent = new Map([\n [\n \"server:file:///doc.txt\",\n {\n contents: [\n {\n uri: \"file:///doc.txt\",\n text: \"Content without mimeType\",\n },\n ],\n },\n ],\n ]);\n\n const result = buildMessageContent(\n \"@server:file:///doc.txt\",\n [],\n {},\n resourceContent,\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"file:///doc.txt\",\n text: \"Content without mimeType\",\n },\n },\n ]);\n });\n\n it(\"should handle empty resourceContent map gracefully\", () => {\n const result = buildMessageContent(\n \"@registry:file:///doc.txt\",\n [],\n {},\n new Map(),\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"file:///doc.txt\",\n },\n },\n ]);\n });\n\n it(\"should handle undefined resourceContent gracefully\", () => {\n const result = buildMessageContent(\n \"@registry:file:///doc.txt\",\n [],\n {},\n undefined,\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"file:///doc.txt\",\n },\n },\n ]);\n });\n\n it(\"should handle resolved content with empty contents array\", () => {\n const resourceContent = new Map([\n [\n \"registry:file:///doc.txt\",\n {\n contents: [],\n },\n ],\n ]);\n\n const result = buildMessageContent(\n \"@registry:file:///doc.txt\",\n [],\n {},\n resourceContent,\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"file:///doc.txt\",\n },\n },\n ]);\n });\n\n it(\"should include resolved content with MCP server resources\", () => {\n const resourceContent = new Map([\n [\n \"linear:linear://issue/123\",\n {\n contents: [\n {\n uri: \"linear://issue/123\",\n mimeType: \"application/json\",\n text: '{\"title\": \"Bug fix\", \"status\": \"open\"}',\n },\n ],\n },\n ],\n ]);\n\n const result = buildMessageContent(\n \"Check issue @linear:linear://issue/123\",\n [],\n {},\n resourceContent,\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Check issue \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"linear://issue/123\",\n text: '{\"title\": \"Bug fix\", \"status\": \"open\"}',\n mimeType: \"application/json\",\n },\n },\n ]);\n });\n\n it(\"should combine resolved content with images\", () => {\n const resourceContent = new Map([\n [\n \"registry:file:///doc.txt\",\n {\n contents: [\n {\n uri: \"file:///doc.txt\",\n text: \"Document content\",\n },\n ],\n },\n ],\n ]);\n\n const images = [\n createMockStagedImage({\n dataUrl: \"data:image/png;base64,imagedata\",\n }),\n ];\n\n const result = buildMessageContent(\n \"Check @registry:file:///doc.txt\",\n images,\n {},\n resourceContent,\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Check \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"file:///doc.txt\",\n text: \"Document content\",\n },\n },\n {\n type: \"image_url\",\n image_url: {\n url: \"data:image/png;base64,imagedata\",\n },\n },\n ]);\n });\n });\n});\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=query-utils.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-utils.test.d.ts","sourceRoot":"","sources":["../../src/util/query-utils.test.ts"],"names":[],"mappings":""}