@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
@@ -672,5 +672,274 @@ describe("buildMessageContent", () => {
672
672
  expect(result[0].type).toBe("resource");
673
673
  });
674
674
  });
675
+ describe("resource content resolution", () => {
676
+ it("should include text content from resolved resource", () => {
677
+ const resourceContent = new Map([
678
+ [
679
+ "registry:file:///doc.txt",
680
+ {
681
+ contents: [
682
+ {
683
+ uri: "file:///doc.txt",
684
+ mimeType: "text/plain",
685
+ text: "This is the document content",
686
+ },
687
+ ],
688
+ },
689
+ ],
690
+ ]);
691
+ const result = buildMessageContent("Check @registry:file:///doc.txt", [], {}, resourceContent);
692
+ expect(result).toEqual([
693
+ {
694
+ type: "text",
695
+ text: "Check ",
696
+ },
697
+ {
698
+ type: "resource",
699
+ resource: {
700
+ uri: "file:///doc.txt",
701
+ text: "This is the document content",
702
+ mimeType: "text/plain",
703
+ },
704
+ },
705
+ ]);
706
+ });
707
+ it("should include blob content from resolved resource", () => {
708
+ const resourceContent = new Map([
709
+ [
710
+ "registry:file:///image.png",
711
+ {
712
+ contents: [
713
+ {
714
+ uri: "file:///image.png",
715
+ mimeType: "image/png",
716
+ blob: "base64encodeddata",
717
+ },
718
+ ],
719
+ },
720
+ ],
721
+ ]);
722
+ const result = buildMessageContent("Check @registry:file:///image.png", [], {}, resourceContent);
723
+ expect(result).toEqual([
724
+ {
725
+ type: "text",
726
+ text: "Check ",
727
+ },
728
+ {
729
+ type: "resource",
730
+ resource: {
731
+ uri: "file:///image.png",
732
+ blob: "base64encodeddata",
733
+ mimeType: "image/png",
734
+ },
735
+ },
736
+ ]);
737
+ });
738
+ it("should include name and resolved content together", () => {
739
+ const resourceNames = {
740
+ "registry:file:///doc.txt": "Important Document",
741
+ };
742
+ const resourceContent = new Map([
743
+ [
744
+ "registry:file:///doc.txt",
745
+ {
746
+ contents: [
747
+ {
748
+ uri: "file:///doc.txt",
749
+ mimeType: "text/plain",
750
+ text: "Document content here",
751
+ },
752
+ ],
753
+ },
754
+ ],
755
+ ]);
756
+ const result = buildMessageContent("@registry:file:///doc.txt", [], resourceNames, resourceContent);
757
+ expect(result).toEqual([
758
+ {
759
+ type: "resource",
760
+ resource: {
761
+ uri: "file:///doc.txt",
762
+ name: "Important Document",
763
+ text: "Document content here",
764
+ mimeType: "text/plain",
765
+ },
766
+ },
767
+ ]);
768
+ });
769
+ it("should handle multiple resources with mixed resolved content", () => {
770
+ const resourceContent = new Map([
771
+ [
772
+ "registry:file:///doc1.txt",
773
+ {
774
+ contents: [
775
+ {
776
+ uri: "file:///doc1.txt",
777
+ text: "First doc content",
778
+ },
779
+ ],
780
+ },
781
+ ],
782
+ // doc2 is NOT in resourceContent - simulates internal server resource
783
+ ]);
784
+ const result = buildMessageContent("@registry:file:///doc1.txt and @tambo-abc:tambo://doc2", [], {}, resourceContent);
785
+ expect(result).toEqual([
786
+ {
787
+ type: "resource",
788
+ resource: {
789
+ uri: "file:///doc1.txt",
790
+ text: "First doc content",
791
+ },
792
+ },
793
+ {
794
+ type: "text",
795
+ text: " and ",
796
+ },
797
+ {
798
+ type: "resource",
799
+ resource: {
800
+ uri: "tambo://doc2",
801
+ // No text/blob - internal server resource
802
+ },
803
+ },
804
+ ]);
805
+ });
806
+ it("should handle resolved content without mimeType", () => {
807
+ const resourceContent = new Map([
808
+ [
809
+ "server:file:///doc.txt",
810
+ {
811
+ contents: [
812
+ {
813
+ uri: "file:///doc.txt",
814
+ text: "Content without mimeType",
815
+ },
816
+ ],
817
+ },
818
+ ],
819
+ ]);
820
+ const result = buildMessageContent("@server:file:///doc.txt", [], {}, resourceContent);
821
+ expect(result).toEqual([
822
+ {
823
+ type: "resource",
824
+ resource: {
825
+ uri: "file:///doc.txt",
826
+ text: "Content without mimeType",
827
+ },
828
+ },
829
+ ]);
830
+ });
831
+ it("should handle empty resourceContent map gracefully", () => {
832
+ const result = buildMessageContent("@registry:file:///doc.txt", [], {}, new Map());
833
+ expect(result).toEqual([
834
+ {
835
+ type: "resource",
836
+ resource: {
837
+ uri: "file:///doc.txt",
838
+ },
839
+ },
840
+ ]);
841
+ });
842
+ it("should handle undefined resourceContent gracefully", () => {
843
+ const result = buildMessageContent("@registry:file:///doc.txt", [], {}, undefined);
844
+ expect(result).toEqual([
845
+ {
846
+ type: "resource",
847
+ resource: {
848
+ uri: "file:///doc.txt",
849
+ },
850
+ },
851
+ ]);
852
+ });
853
+ it("should handle resolved content with empty contents array", () => {
854
+ const resourceContent = new Map([
855
+ [
856
+ "registry:file:///doc.txt",
857
+ {
858
+ contents: [],
859
+ },
860
+ ],
861
+ ]);
862
+ const result = buildMessageContent("@registry:file:///doc.txt", [], {}, resourceContent);
863
+ expect(result).toEqual([
864
+ {
865
+ type: "resource",
866
+ resource: {
867
+ uri: "file:///doc.txt",
868
+ },
869
+ },
870
+ ]);
871
+ });
872
+ it("should include resolved content with MCP server resources", () => {
873
+ const resourceContent = new Map([
874
+ [
875
+ "linear:linear://issue/123",
876
+ {
877
+ contents: [
878
+ {
879
+ uri: "linear://issue/123",
880
+ mimeType: "application/json",
881
+ text: '{"title": "Bug fix", "status": "open"}',
882
+ },
883
+ ],
884
+ },
885
+ ],
886
+ ]);
887
+ const result = buildMessageContent("Check issue @linear:linear://issue/123", [], {}, resourceContent);
888
+ expect(result).toEqual([
889
+ {
890
+ type: "text",
891
+ text: "Check issue ",
892
+ },
893
+ {
894
+ type: "resource",
895
+ resource: {
896
+ uri: "linear://issue/123",
897
+ text: '{"title": "Bug fix", "status": "open"}',
898
+ mimeType: "application/json",
899
+ },
900
+ },
901
+ ]);
902
+ });
903
+ it("should combine resolved content with images", () => {
904
+ const resourceContent = new Map([
905
+ [
906
+ "registry:file:///doc.txt",
907
+ {
908
+ contents: [
909
+ {
910
+ uri: "file:///doc.txt",
911
+ text: "Document content",
912
+ },
913
+ ],
914
+ },
915
+ ],
916
+ ]);
917
+ const images = [
918
+ createMockStagedImage({
919
+ dataUrl: "data:image/png;base64,imagedata",
920
+ }),
921
+ ];
922
+ const result = buildMessageContent("Check @registry:file:///doc.txt", images, {}, resourceContent);
923
+ expect(result).toEqual([
924
+ {
925
+ type: "text",
926
+ text: "Check ",
927
+ },
928
+ {
929
+ type: "resource",
930
+ resource: {
931
+ uri: "file:///doc.txt",
932
+ text: "Document content",
933
+ },
934
+ },
935
+ {
936
+ type: "image_url",
937
+ image_url: {
938
+ url: "data:image/png;base64,imagedata",
939
+ },
940
+ },
941
+ ]);
942
+ });
943
+ });
675
944
  });
676
945
  //# 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":""}