@tambo-ai/react 0.74.0 → 0.75.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 (314) hide show
  1. package/README.md +46 -449
  2. package/dist/hoc/with-tambo-interactable.d.ts +8 -0
  3. package/dist/hoc/with-tambo-interactable.d.ts.map +1 -1
  4. package/dist/hoc/with-tambo-interactable.js +5 -2
  5. package/dist/hoc/with-tambo-interactable.js.map +1 -1
  6. package/dist/hoc/with-tambo-interactable.test.js +12 -0
  7. package/dist/hoc/with-tambo-interactable.test.js.map +1 -1
  8. package/dist/hooks/use-tambo-voice.test.js +3 -0
  9. package/dist/hooks/use-tambo-voice.test.js.map +1 -1
  10. package/dist/mcp/mcp-hooks.d.ts.map +1 -1
  11. package/dist/mcp/mcp-hooks.js +70 -16
  12. package/dist/mcp/mcp-hooks.js.map +1 -1
  13. package/dist/mcp/mcp-hooks.test.js +69 -0
  14. package/dist/mcp/mcp-hooks.test.js.map +1 -1
  15. package/dist/mcp/tambo-mcp-provider.test.js +24 -0
  16. package/dist/mcp/tambo-mcp-provider.test.js.map +1 -1
  17. package/dist/mcp/use-mcp-servers.test.js +9 -0
  18. package/dist/mcp/use-mcp-servers.test.js.map +1 -1
  19. package/dist/model/component-metadata.d.ts +4 -4
  20. package/dist/model/component-metadata.js.map +1 -1
  21. package/dist/providers/__tests__/thread-input-resource-resolution.test.js +2 -2
  22. package/dist/providers/__tests__/thread-input-resource-resolution.test.js.map +1 -1
  23. package/dist/providers/tambo-client-provider.d.ts +6 -0
  24. package/dist/providers/tambo-client-provider.d.ts.map +1 -1
  25. package/dist/providers/tambo-client-provider.js +4 -1
  26. package/dist/providers/tambo-client-provider.js.map +1 -1
  27. package/dist/providers/tambo-interactable-provider.d.ts.map +1 -1
  28. package/dist/providers/tambo-interactable-provider.js +8 -0
  29. package/dist/providers/tambo-interactable-provider.js.map +1 -1
  30. package/dist/providers/tambo-interactable-provider.test.js +47 -0
  31. package/dist/providers/tambo-interactable-provider.test.js.map +1 -1
  32. package/dist/providers/tambo-provider.d.ts.map +1 -1
  33. package/dist/providers/tambo-provider.js +4 -1
  34. package/dist/providers/tambo-provider.js.map +1 -1
  35. package/dist/providers/tambo-stubs.d.ts.map +1 -1
  36. package/dist/providers/tambo-stubs.js +3 -0
  37. package/dist/providers/tambo-stubs.js.map +1 -1
  38. package/dist/providers/tambo-thread-provider-initial-messages.test.js +3 -0
  39. package/dist/providers/tambo-thread-provider-initial-messages.test.js.map +1 -1
  40. package/dist/providers/tambo-thread-provider.test.js +3 -0
  41. package/dist/providers/tambo-thread-provider.test.js.map +1 -1
  42. package/dist/util/registry-validators.js +1 -1
  43. package/dist/util/registry-validators.js.map +1 -1
  44. package/dist/util/resource-content-resolver.test.js +1 -1
  45. package/dist/util/resource-content-resolver.test.js.map +1 -1
  46. package/dist/v1/hooks/use-tambo-v1-auth-state.d.ts +11 -0
  47. package/dist/v1/hooks/use-tambo-v1-auth-state.d.ts.map +1 -0
  48. package/dist/v1/hooks/use-tambo-v1-auth-state.js +48 -0
  49. package/dist/v1/hooks/use-tambo-v1-auth-state.js.map +1 -0
  50. package/dist/v1/hooks/use-tambo-v1-auth-state.test.d.ts +2 -0
  51. package/dist/v1/hooks/use-tambo-v1-auth-state.test.d.ts.map +1 -0
  52. package/dist/v1/hooks/use-tambo-v1-auth-state.test.js +105 -0
  53. package/dist/v1/hooks/use-tambo-v1-auth-state.test.js.map +1 -0
  54. package/dist/v1/hooks/use-tambo-v1-component-state.d.ts.map +1 -1
  55. package/dist/v1/hooks/use-tambo-v1-component-state.js +68 -21
  56. package/dist/v1/hooks/use-tambo-v1-component-state.js.map +1 -1
  57. package/dist/v1/hooks/use-tambo-v1-component-state.test.js +100 -0
  58. package/dist/v1/hooks/use-tambo-v1-component-state.test.js.map +1 -1
  59. package/dist/v1/hooks/use-tambo-v1-messages.test.js +8 -0
  60. package/dist/v1/hooks/use-tambo-v1-messages.test.js.map +1 -1
  61. package/dist/v1/hooks/use-tambo-v1-send-message.d.ts +19 -1
  62. package/dist/v1/hooks/use-tambo-v1-send-message.d.ts.map +1 -1
  63. package/dist/v1/hooks/use-tambo-v1-send-message.js +86 -9
  64. package/dist/v1/hooks/use-tambo-v1-send-message.js.map +1 -1
  65. package/dist/v1/hooks/use-tambo-v1-send-message.test.js +273 -0
  66. package/dist/v1/hooks/use-tambo-v1-send-message.test.js.map +1 -1
  67. package/dist/v1/hooks/use-tambo-v1-stream-status.d.ts +2 -2
  68. package/dist/v1/hooks/use-tambo-v1-stream-status.d.ts.map +1 -1
  69. package/dist/v1/hooks/use-tambo-v1-stream-status.js +2 -2
  70. package/dist/v1/hooks/use-tambo-v1-stream-status.js.map +1 -1
  71. package/dist/v1/hooks/use-tambo-v1-stream-status.test.js +11 -11
  72. package/dist/v1/hooks/use-tambo-v1-stream-status.test.js.map +1 -1
  73. package/dist/v1/hooks/use-tambo-v1-thread-input.test.js +13 -0
  74. package/dist/v1/hooks/use-tambo-v1-thread-input.test.js.map +1 -1
  75. package/dist/v1/hooks/use-tambo-v1-thread-list.d.ts.map +1 -1
  76. package/dist/v1/hooks/use-tambo-v1-thread-list.js +4 -0
  77. package/dist/v1/hooks/use-tambo-v1-thread-list.js.map +1 -1
  78. package/dist/v1/hooks/use-tambo-v1-thread-list.test.js +6 -0
  79. package/dist/v1/hooks/use-tambo-v1-thread-list.test.js.map +1 -1
  80. package/dist/v1/hooks/use-tambo-v1-thread.d.ts.map +1 -1
  81. package/dist/v1/hooks/use-tambo-v1-thread.js +4 -0
  82. package/dist/v1/hooks/use-tambo-v1-thread.js.map +1 -1
  83. package/dist/v1/hooks/use-tambo-v1-thread.test.js +6 -0
  84. package/dist/v1/hooks/use-tambo-v1-thread.test.js.map +1 -1
  85. package/dist/v1/hooks/use-tambo-v1.d.ts +11 -0
  86. package/dist/v1/hooks/use-tambo-v1.d.ts.map +1 -1
  87. package/dist/v1/hooks/use-tambo-v1.js +5 -0
  88. package/dist/v1/hooks/use-tambo-v1.js.map +1 -1
  89. package/dist/v1/hooks/use-tambo-v1.test.js +13 -0
  90. package/dist/v1/hooks/use-tambo-v1.test.js.map +1 -1
  91. package/dist/v1/index.d.ts +4 -1
  92. package/dist/v1/index.d.ts.map +1 -1
  93. package/dist/v1/index.js +5 -2
  94. package/dist/v1/index.js.map +1 -1
  95. package/dist/v1/providers/tambo-v1-provider.d.ts +16 -1
  96. package/dist/v1/providers/tambo-v1-provider.d.ts.map +1 -1
  97. package/dist/v1/providers/tambo-v1-provider.js +42 -5
  98. package/dist/v1/providers/tambo-v1-provider.js.map +1 -1
  99. package/dist/v1/providers/tambo-v1-provider.test.js +19 -2
  100. package/dist/v1/providers/tambo-v1-provider.test.js.map +1 -1
  101. package/dist/v1/providers/tambo-v1-stream-context.d.ts +6 -0
  102. package/dist/v1/providers/tambo-v1-stream-context.d.ts.map +1 -1
  103. package/dist/v1/providers/tambo-v1-stream-context.js +50 -11
  104. package/dist/v1/providers/tambo-v1-stream-context.js.map +1 -1
  105. package/dist/v1/providers/tambo-v1-stream-context.test.js +9 -0
  106. package/dist/v1/providers/tambo-v1-stream-context.test.js.map +1 -1
  107. package/dist/v1/providers/tambo-v1-stub-provider.d.ts.map +1 -1
  108. package/dist/v1/providers/tambo-v1-stub-provider.js +4 -0
  109. package/dist/v1/providers/tambo-v1-stub-provider.js.map +1 -1
  110. package/dist/v1/providers/tambo-v1-thread-input-provider.d.ts +11 -0
  111. package/dist/v1/providers/tambo-v1-thread-input-provider.d.ts.map +1 -1
  112. package/dist/v1/providers/tambo-v1-thread-input-provider.js +10 -1
  113. package/dist/v1/providers/tambo-v1-thread-input-provider.js.map +1 -1
  114. package/dist/v1/types/auth.d.ts +24 -0
  115. package/dist/v1/types/auth.d.ts.map +1 -0
  116. package/dist/v1/types/auth.js +3 -0
  117. package/dist/v1/types/auth.js.map +1 -0
  118. package/dist/v1/types/message.d.ts +12 -0
  119. package/dist/v1/types/message.d.ts.map +1 -1
  120. package/dist/v1/types/message.js.map +1 -1
  121. package/dist/v1/types/tool-choice.d.ts +8 -0
  122. package/dist/v1/types/tool-choice.d.ts.map +1 -0
  123. package/dist/v1/types/tool-choice.js +3 -0
  124. package/dist/v1/types/tool-choice.js.map +1 -0
  125. package/dist/v1/utils/event-accumulator.d.ts +28 -2
  126. package/dist/v1/utils/event-accumulator.d.ts.map +1 -1
  127. package/dist/v1/utils/event-accumulator.js +67 -15
  128. package/dist/v1/utils/event-accumulator.js.map +1 -1
  129. package/dist/v1/utils/event-accumulator.test.js +106 -0
  130. package/dist/v1/utils/event-accumulator.test.js.map +1 -1
  131. package/dist/v1/utils/keyed-throttle.d.ts +42 -0
  132. package/dist/v1/utils/keyed-throttle.d.ts.map +1 -0
  133. package/dist/v1/utils/keyed-throttle.js +86 -0
  134. package/dist/v1/utils/keyed-throttle.js.map +1 -0
  135. package/dist/v1/utils/keyed-throttle.test.d.ts +2 -0
  136. package/dist/v1/utils/keyed-throttle.test.d.ts.map +1 -0
  137. package/dist/v1/utils/keyed-throttle.test.js +147 -0
  138. package/dist/v1/utils/keyed-throttle.test.js.map +1 -0
  139. package/dist/v1/utils/registry-conversion.d.ts.map +1 -1
  140. package/dist/v1/utils/registry-conversion.js +2 -0
  141. package/dist/v1/utils/registry-conversion.js.map +1 -1
  142. package/dist/v1/utils/registry-conversion.test.js +23 -0
  143. package/dist/v1/utils/registry-conversion.test.js.map +1 -1
  144. package/dist/v1/utils/tool-call-tracker.d.ts +10 -0
  145. package/dist/v1/utils/tool-call-tracker.d.ts.map +1 -1
  146. package/dist/v1/utils/tool-call-tracker.js +13 -0
  147. package/dist/v1/utils/tool-call-tracker.js.map +1 -1
  148. package/dist/v1/utils/tool-call-tracker.test.d.ts +2 -0
  149. package/dist/v1/utils/tool-call-tracker.test.d.ts.map +1 -0
  150. package/dist/v1/utils/tool-call-tracker.test.js +67 -0
  151. package/dist/v1/utils/tool-call-tracker.test.js.map +1 -0
  152. package/dist/v1/utils/tool-executor.d.ts +34 -0
  153. package/dist/v1/utils/tool-executor.d.ts.map +1 -1
  154. package/dist/v1/utils/tool-executor.js +55 -0
  155. package/dist/v1/utils/tool-executor.js.map +1 -1
  156. package/dist/v1/utils/tool-executor.test.js +211 -0
  157. package/dist/v1/utils/tool-executor.test.js.map +1 -1
  158. package/esm/hoc/with-tambo-interactable.d.ts +8 -0
  159. package/esm/hoc/with-tambo-interactable.d.ts.map +1 -1
  160. package/esm/hoc/with-tambo-interactable.js +5 -2
  161. package/esm/hoc/with-tambo-interactable.js.map +1 -1
  162. package/esm/hoc/with-tambo-interactable.test.js +12 -0
  163. package/esm/hoc/with-tambo-interactable.test.js.map +1 -1
  164. package/esm/hooks/use-tambo-voice.test.js +3 -0
  165. package/esm/hooks/use-tambo-voice.test.js.map +1 -1
  166. package/esm/mcp/mcp-hooks.d.ts.map +1 -1
  167. package/esm/mcp/mcp-hooks.js +70 -16
  168. package/esm/mcp/mcp-hooks.js.map +1 -1
  169. package/esm/mcp/mcp-hooks.test.js +69 -0
  170. package/esm/mcp/mcp-hooks.test.js.map +1 -1
  171. package/esm/mcp/tambo-mcp-provider.test.js +24 -0
  172. package/esm/mcp/tambo-mcp-provider.test.js.map +1 -1
  173. package/esm/mcp/use-mcp-servers.test.js +9 -0
  174. package/esm/mcp/use-mcp-servers.test.js.map +1 -1
  175. package/esm/model/component-metadata.d.ts +4 -4
  176. package/esm/model/component-metadata.js.map +1 -1
  177. package/esm/providers/__tests__/thread-input-resource-resolution.test.js +2 -2
  178. package/esm/providers/__tests__/thread-input-resource-resolution.test.js.map +1 -1
  179. package/esm/providers/tambo-client-provider.d.ts +6 -0
  180. package/esm/providers/tambo-client-provider.d.ts.map +1 -1
  181. package/esm/providers/tambo-client-provider.js +4 -1
  182. package/esm/providers/tambo-client-provider.js.map +1 -1
  183. package/esm/providers/tambo-interactable-provider.d.ts.map +1 -1
  184. package/esm/providers/tambo-interactable-provider.js +8 -0
  185. package/esm/providers/tambo-interactable-provider.js.map +1 -1
  186. package/esm/providers/tambo-interactable-provider.test.js +47 -0
  187. package/esm/providers/tambo-interactable-provider.test.js.map +1 -1
  188. package/esm/providers/tambo-provider.d.ts.map +1 -1
  189. package/esm/providers/tambo-provider.js +4 -1
  190. package/esm/providers/tambo-provider.js.map +1 -1
  191. package/esm/providers/tambo-stubs.d.ts.map +1 -1
  192. package/esm/providers/tambo-stubs.js +3 -0
  193. package/esm/providers/tambo-stubs.js.map +1 -1
  194. package/esm/providers/tambo-thread-provider-initial-messages.test.js +3 -0
  195. package/esm/providers/tambo-thread-provider-initial-messages.test.js.map +1 -1
  196. package/esm/providers/tambo-thread-provider.test.js +3 -0
  197. package/esm/providers/tambo-thread-provider.test.js.map +1 -1
  198. package/esm/util/registry-validators.js +1 -1
  199. package/esm/util/registry-validators.js.map +1 -1
  200. package/esm/util/resource-content-resolver.test.js +1 -1
  201. package/esm/util/resource-content-resolver.test.js.map +1 -1
  202. package/esm/v1/hooks/use-tambo-v1-auth-state.d.ts +11 -0
  203. package/esm/v1/hooks/use-tambo-v1-auth-state.d.ts.map +1 -0
  204. package/esm/v1/hooks/use-tambo-v1-auth-state.js +45 -0
  205. package/esm/v1/hooks/use-tambo-v1-auth-state.js.map +1 -0
  206. package/esm/v1/hooks/use-tambo-v1-auth-state.test.d.ts +2 -0
  207. package/esm/v1/hooks/use-tambo-v1-auth-state.test.d.ts.map +1 -0
  208. package/esm/v1/hooks/use-tambo-v1-auth-state.test.js +100 -0
  209. package/esm/v1/hooks/use-tambo-v1-auth-state.test.js.map +1 -0
  210. package/esm/v1/hooks/use-tambo-v1-component-state.d.ts.map +1 -1
  211. package/esm/v1/hooks/use-tambo-v1-component-state.js +68 -21
  212. package/esm/v1/hooks/use-tambo-v1-component-state.js.map +1 -1
  213. package/esm/v1/hooks/use-tambo-v1-component-state.test.js +100 -0
  214. package/esm/v1/hooks/use-tambo-v1-component-state.test.js.map +1 -1
  215. package/esm/v1/hooks/use-tambo-v1-messages.test.js +8 -0
  216. package/esm/v1/hooks/use-tambo-v1-messages.test.js.map +1 -1
  217. package/esm/v1/hooks/use-tambo-v1-send-message.d.ts +19 -1
  218. package/esm/v1/hooks/use-tambo-v1-send-message.d.ts.map +1 -1
  219. package/esm/v1/hooks/use-tambo-v1-send-message.js +87 -10
  220. package/esm/v1/hooks/use-tambo-v1-send-message.js.map +1 -1
  221. package/esm/v1/hooks/use-tambo-v1-send-message.test.js +273 -0
  222. package/esm/v1/hooks/use-tambo-v1-send-message.test.js.map +1 -1
  223. package/esm/v1/hooks/use-tambo-v1-stream-status.d.ts +2 -2
  224. package/esm/v1/hooks/use-tambo-v1-stream-status.d.ts.map +1 -1
  225. package/esm/v1/hooks/use-tambo-v1-stream-status.js +2 -2
  226. package/esm/v1/hooks/use-tambo-v1-stream-status.js.map +1 -1
  227. package/esm/v1/hooks/use-tambo-v1-stream-status.test.js +11 -11
  228. package/esm/v1/hooks/use-tambo-v1-stream-status.test.js.map +1 -1
  229. package/esm/v1/hooks/use-tambo-v1-thread-input.test.js +13 -0
  230. package/esm/v1/hooks/use-tambo-v1-thread-input.test.js.map +1 -1
  231. package/esm/v1/hooks/use-tambo-v1-thread-list.d.ts.map +1 -1
  232. package/esm/v1/hooks/use-tambo-v1-thread-list.js +4 -0
  233. package/esm/v1/hooks/use-tambo-v1-thread-list.js.map +1 -1
  234. package/esm/v1/hooks/use-tambo-v1-thread-list.test.js +6 -0
  235. package/esm/v1/hooks/use-tambo-v1-thread-list.test.js.map +1 -1
  236. package/esm/v1/hooks/use-tambo-v1-thread.d.ts.map +1 -1
  237. package/esm/v1/hooks/use-tambo-v1-thread.js +4 -0
  238. package/esm/v1/hooks/use-tambo-v1-thread.js.map +1 -1
  239. package/esm/v1/hooks/use-tambo-v1-thread.test.js +6 -0
  240. package/esm/v1/hooks/use-tambo-v1-thread.test.js.map +1 -1
  241. package/esm/v1/hooks/use-tambo-v1.d.ts +11 -0
  242. package/esm/v1/hooks/use-tambo-v1.d.ts.map +1 -1
  243. package/esm/v1/hooks/use-tambo-v1.js +5 -0
  244. package/esm/v1/hooks/use-tambo-v1.js.map +1 -1
  245. package/esm/v1/hooks/use-tambo-v1.test.js +13 -0
  246. package/esm/v1/hooks/use-tambo-v1.test.js.map +1 -1
  247. package/esm/v1/index.d.ts +4 -1
  248. package/esm/v1/index.d.ts.map +1 -1
  249. package/esm/v1/index.js +3 -1
  250. package/esm/v1/index.js.map +1 -1
  251. package/esm/v1/providers/tambo-v1-provider.d.ts +16 -1
  252. package/esm/v1/providers/tambo-v1-provider.d.ts.map +1 -1
  253. package/esm/v1/providers/tambo-v1-provider.js +43 -6
  254. package/esm/v1/providers/tambo-v1-provider.js.map +1 -1
  255. package/esm/v1/providers/tambo-v1-provider.test.js +19 -2
  256. package/esm/v1/providers/tambo-v1-provider.test.js.map +1 -1
  257. package/esm/v1/providers/tambo-v1-stream-context.d.ts +6 -0
  258. package/esm/v1/providers/tambo-v1-stream-context.d.ts.map +1 -1
  259. package/esm/v1/providers/tambo-v1-stream-context.js +51 -12
  260. package/esm/v1/providers/tambo-v1-stream-context.js.map +1 -1
  261. package/esm/v1/providers/tambo-v1-stream-context.test.js +9 -0
  262. package/esm/v1/providers/tambo-v1-stream-context.test.js.map +1 -1
  263. package/esm/v1/providers/tambo-v1-stub-provider.d.ts.map +1 -1
  264. package/esm/v1/providers/tambo-v1-stub-provider.js +4 -0
  265. package/esm/v1/providers/tambo-v1-stub-provider.js.map +1 -1
  266. package/esm/v1/providers/tambo-v1-thread-input-provider.d.ts +11 -0
  267. package/esm/v1/providers/tambo-v1-thread-input-provider.d.ts.map +1 -1
  268. package/esm/v1/providers/tambo-v1-thread-input-provider.js +10 -1
  269. package/esm/v1/providers/tambo-v1-thread-input-provider.js.map +1 -1
  270. package/esm/v1/types/auth.d.ts +24 -0
  271. package/esm/v1/types/auth.d.ts.map +1 -0
  272. package/esm/v1/types/auth.js +2 -0
  273. package/esm/v1/types/auth.js.map +1 -0
  274. package/esm/v1/types/message.d.ts +12 -0
  275. package/esm/v1/types/message.d.ts.map +1 -1
  276. package/esm/v1/types/message.js.map +1 -1
  277. package/esm/v1/types/tool-choice.d.ts +8 -0
  278. package/esm/v1/types/tool-choice.d.ts.map +1 -0
  279. package/esm/v1/types/tool-choice.js +2 -0
  280. package/esm/v1/types/tool-choice.js.map +1 -0
  281. package/esm/v1/utils/event-accumulator.d.ts +28 -2
  282. package/esm/v1/utils/event-accumulator.d.ts.map +1 -1
  283. package/esm/v1/utils/event-accumulator.js +66 -15
  284. package/esm/v1/utils/event-accumulator.js.map +1 -1
  285. package/esm/v1/utils/event-accumulator.test.js +106 -0
  286. package/esm/v1/utils/event-accumulator.test.js.map +1 -1
  287. package/esm/v1/utils/keyed-throttle.d.ts +42 -0
  288. package/esm/v1/utils/keyed-throttle.d.ts.map +1 -0
  289. package/esm/v1/utils/keyed-throttle.js +83 -0
  290. package/esm/v1/utils/keyed-throttle.js.map +1 -0
  291. package/esm/v1/utils/keyed-throttle.test.d.ts +2 -0
  292. package/esm/v1/utils/keyed-throttle.test.d.ts.map +1 -0
  293. package/esm/v1/utils/keyed-throttle.test.js +145 -0
  294. package/esm/v1/utils/keyed-throttle.test.js.map +1 -0
  295. package/esm/v1/utils/registry-conversion.d.ts.map +1 -1
  296. package/esm/v1/utils/registry-conversion.js +2 -0
  297. package/esm/v1/utils/registry-conversion.js.map +1 -1
  298. package/esm/v1/utils/registry-conversion.test.js +23 -0
  299. package/esm/v1/utils/registry-conversion.test.js.map +1 -1
  300. package/esm/v1/utils/tool-call-tracker.d.ts +10 -0
  301. package/esm/v1/utils/tool-call-tracker.d.ts.map +1 -1
  302. package/esm/v1/utils/tool-call-tracker.js +13 -0
  303. package/esm/v1/utils/tool-call-tracker.js.map +1 -1
  304. package/esm/v1/utils/tool-call-tracker.test.d.ts +2 -0
  305. package/esm/v1/utils/tool-call-tracker.test.d.ts.map +1 -0
  306. package/esm/v1/utils/tool-call-tracker.test.js +65 -0
  307. package/esm/v1/utils/tool-call-tracker.test.js.map +1 -0
  308. package/esm/v1/utils/tool-executor.d.ts +34 -0
  309. package/esm/v1/utils/tool-executor.d.ts.map +1 -1
  310. package/esm/v1/utils/tool-executor.js +53 -0
  311. package/esm/v1/utils/tool-executor.js.map +1 -1
  312. package/esm/v1/utils/tool-executor.test.js +212 -1
  313. package/esm/v1/utils/tool-executor.test.js.map +1 -1
  314. package/package.json +4 -4
@@ -5,7 +5,7 @@
5
5
  * Used with useReducer to accumulate events into thread state.
6
6
  */
7
7
  import type { AGUIEvent } from "@ag-ui/core";
8
- import type { TamboV1Message } from "../types/message";
8
+ import type { InitialInputMessage, TamboV1Message } from "../types/message";
9
9
  import type { StreamingState, TamboV1Thread } from "../types/thread";
10
10
  /**
11
11
  * Error thrown when an unreachable case is reached in a switch statement.
@@ -26,6 +26,13 @@ export interface ThreadState {
26
26
  * Maps tool call ID to accumulated JSON string.
27
27
  */
28
28
  accumulatingToolArgs: Map<string, string>;
29
+ /**
30
+ * ID of the last completed run. Persists across the session so it's
31
+ * available as `previousRunId` when sending follow-up messages, even
32
+ * after the streaming state has been cleared (e.g., after page reload
33
+ * and thread re-fetch).
34
+ */
35
+ lastCompletedRunId?: string;
29
36
  }
30
37
  /**
31
38
  * State managed by the stream reducer.
@@ -48,6 +55,8 @@ export interface EventAction {
48
55
  type: "EVENT";
49
56
  event: AGUIEvent;
50
57
  threadId: string;
58
+ /** Pre-parsed partial JSON args for TOOL_CALL_ARGS events. Avoids double-parsing. */
59
+ parsedToolArgs?: Record<string, unknown>;
51
60
  }
52
61
  /**
53
62
  * Initialize thread action - creates a new thread in the threadMap.
@@ -87,6 +96,15 @@ export interface LoadThreadMessagesAction {
87
96
  */
88
97
  skipIfStreaming?: boolean;
89
98
  }
99
+ /**
100
+ * Set last completed run ID action - stores metadata from the API
101
+ * so it can be used as `previousRunId` for follow-up messages.
102
+ */
103
+ export interface SetLastCompletedRunIdAction {
104
+ type: "SET_LAST_COMPLETED_RUN_ID";
105
+ threadId: string;
106
+ lastCompletedRunId: string;
107
+ }
90
108
  /**
91
109
  * Update thread title action - sets the title on a thread.
92
110
  * Used after auto-generating a thread name via the API.
@@ -99,7 +117,7 @@ export interface UpdateThreadTitleAction {
99
117
  /**
100
118
  * Action type for the stream reducer.
101
119
  */
102
- export type StreamAction = EventAction | InitThreadAction | SetCurrentThreadAction | StartNewThreadAction | LoadThreadMessagesAction | UpdateThreadTitleAction;
120
+ export type StreamAction = EventAction | InitThreadAction | SetCurrentThreadAction | StartNewThreadAction | LoadThreadMessagesAction | SetLastCompletedRunIdAction | UpdateThreadTitleAction;
103
121
  /**
104
122
  * Create initial thread state for a new thread.
105
123
  * @param threadId - Unique thread identifier
@@ -123,6 +141,14 @@ export declare function isPlaceholderThreadId(threadId: string | null | undefine
123
141
  * @returns Initial stream state
124
142
  */
125
143
  export declare function createInitialState(): StreamState;
144
+ /**
145
+ * Create initial stream state with placeholder thread seeded with initial messages.
146
+ * The messages are converted from InputMessage format to TamboV1Message format
147
+ * for immediate UI display before any API call.
148
+ * @param initialMessages - Messages to seed the placeholder thread with
149
+ * @returns Initial stream state with messages in the placeholder thread
150
+ */
151
+ export declare function createInitialStateWithMessages(initialMessages: InitialInputMessage[]): StreamState;
126
152
  /**
127
153
  * Stream reducer that accumulates events into thread state.
128
154
  *
@@ -1 +1 @@
1
- {"version":3,"file":"event-accumulator.d.ts","sourceRoot":"","sources":["../../../src/v1/utils/event-accumulator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,SAAS,EAeV,MAAM,aAAa,CAAC;AAUrB,OAAO,KAAK,EAAW,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIrE;;;GAGG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,KAAK,EAAE,KAAK;CAIzB;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,EAAE,cAAc,CAAC;IAC1B;;;OAGG;IACH,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3C;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAEvC;;OAEG;IACH,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,aAAa,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;CACxC;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,kBAAkB,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;CACxC;AAED;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,sBAAsB,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,qBAAqB,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GACpB,WAAW,GACX,gBAAgB,GAChB,sBAAsB,GACtB,oBAAoB,GACpB,wBAAwB,GACxB,uBAAuB,CAAC;AAS5B;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CActE;AAED;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,gBAAgB,CAAC;AAEnD;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAClC,OAAO,CAET;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,WAAW,CAOhD;AAuGD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,YAAY,GACnB,WAAW,CAiQb"}
1
+ {"version":3,"file":"event-accumulator.d.ts","sourceRoot":"","sources":["../../../src/v1/utils/event-accumulator.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,7 @@ exports.PLACEHOLDER_THREAD_ID = exports.UnreachableCaseError = void 0;
10
10
  exports.createInitialThreadState = createInitialThreadState;
11
11
  exports.isPlaceholderThreadId = isPlaceholderThreadId;
12
12
  exports.createInitialState = createInitialState;
13
+ exports.createInitialStateWithMessages = createInitialStateWithMessages;
13
14
  exports.streamReducer = streamReducer;
14
15
  const core_1 = require("@ag-ui/core");
15
16
  const event_1 = require("../types/event");
@@ -78,6 +79,38 @@ function createInitialState() {
78
79
  currentThreadId: exports.PLACEHOLDER_THREAD_ID,
79
80
  };
80
81
  }
82
+ /**
83
+ * Create initial stream state with placeholder thread seeded with initial messages.
84
+ * The messages are converted from InputMessage format to TamboV1Message format
85
+ * for immediate UI display before any API call.
86
+ * @param initialMessages - Messages to seed the placeholder thread with
87
+ * @returns Initial stream state with messages in the placeholder thread
88
+ */
89
+ function createInitialStateWithMessages(initialMessages) {
90
+ const placeholderState = createInitialThreadState(exports.PLACEHOLDER_THREAD_ID);
91
+ const messages = initialMessages.map((msg) => ({
92
+ id: `initial_${crypto.randomUUID()}`,
93
+ role: msg.role,
94
+ content: msg.content.map((c) => {
95
+ if (c.type === "text") {
96
+ return { type: "text", text: c.text };
97
+ }
98
+ return c;
99
+ }),
100
+ }));
101
+ return {
102
+ threadMap: {
103
+ [exports.PLACEHOLDER_THREAD_ID]: {
104
+ ...placeholderState,
105
+ thread: {
106
+ ...placeholderState.thread,
107
+ messages,
108
+ },
109
+ },
110
+ },
111
+ currentThreadId: exports.PLACEHOLDER_THREAD_ID,
112
+ };
113
+ }
81
114
  /**
82
115
  * Replace a message at a specific index immutably.
83
116
  * @param messages - Current messages array
@@ -222,6 +255,20 @@ function streamReducer(state, action) {
222
255
  case "LOAD_THREAD_MESSAGES": {
223
256
  return handleLoadThreadMessages(state, action);
224
257
  }
258
+ case "SET_LAST_COMPLETED_RUN_ID": {
259
+ const threadState = state.threadMap[action.threadId] ??
260
+ createInitialThreadState(action.threadId);
261
+ return {
262
+ ...state,
263
+ threadMap: {
264
+ ...state.threadMap,
265
+ [action.threadId]: {
266
+ ...threadState,
267
+ lastCompletedRunId: action.lastCompletedRunId,
268
+ },
269
+ },
270
+ };
271
+ }
225
272
  case "UPDATE_THREAD_TITLE": {
226
273
  const threadState = state.threadMap[action.threadId];
227
274
  if (!threadState) {
@@ -325,7 +372,7 @@ function streamReducer(state, action) {
325
372
  updatedThreadState = handleToolCallStart(threadState, event);
326
373
  break;
327
374
  case core_1.EventType.TOOL_CALL_ARGS:
328
- updatedThreadState = handleToolCallArgs(threadState, event);
375
+ updatedThreadState = handleToolCallArgs(threadState, event, action.parsedToolArgs);
329
376
  break;
330
377
  case core_1.EventType.TOOL_CALL_END:
331
378
  updatedThreadState = handleToolCallEnd(threadState, event);
@@ -404,12 +451,15 @@ function handleRunStarted(threadState, event) {
404
451
  /**
405
452
  * Handle RUN_FINISHED event.
406
453
  * @param threadState - Current thread state
407
- * @param _event - Run finished event (unused)
454
+ * @param event - Run finished event containing the completed run's ID
408
455
  * @returns Updated thread state
409
456
  */
410
- function handleRunFinished(threadState, _event) {
457
+ function handleRunFinished(threadState, event) {
411
458
  return {
412
459
  ...threadState,
460
+ lastCompletedRunId: event.runId ??
461
+ threadState.streaming.runId ??
462
+ threadState.lastCompletedRunId,
413
463
  thread: {
414
464
  ...threadState.thread,
415
465
  status: "complete",
@@ -631,7 +681,7 @@ function handleToolCallStart(threadState, event) {
631
681
  * @param event - Tool call args event
632
682
  * @returns Updated thread state
633
683
  */
634
- function handleToolCallArgs(threadState, event) {
684
+ function handleToolCallArgs(threadState, event, parsedToolArgs) {
635
685
  const toolCallId = event.toolCallId;
636
686
  // Accumulate the JSON string delta
637
687
  const accumulatedArgs = threadState.accumulatingToolArgs;
@@ -639,18 +689,20 @@ function handleToolCallArgs(threadState, event) {
639
689
  const newAccumulatedJson = existingArgs + event.delta;
640
690
  const newAccumulatedArgs = new Map(accumulatedArgs);
641
691
  newAccumulatedArgs.set(toolCallId, newAccumulatedJson);
642
- // Optimistically parse partial JSON to update the tool_use content block
643
- let parsedInput;
644
- try {
645
- const parsed = (0, partial_json_1.parse)(newAccumulatedJson);
646
- if (typeof parsed === "object" &&
647
- parsed !== null &&
648
- !Array.isArray(parsed)) {
649
- parsedInput = parsed;
692
+ // Use pre-parsed args if provided, otherwise parse partial JSON ourselves
693
+ let parsedInput = parsedToolArgs;
694
+ if (!parsedInput) {
695
+ try {
696
+ const parsed = (0, partial_json_1.parse)(newAccumulatedJson);
697
+ if (typeof parsed === "object" &&
698
+ parsed !== null &&
699
+ !Array.isArray(parsed)) {
700
+ parsedInput = parsed;
701
+ }
702
+ }
703
+ catch {
704
+ // Partial JSON not parseable yet — leave input unchanged
650
705
  }
651
- }
652
- catch {
653
- // Partial JSON not parseable yet — leave input unchanged
654
706
  }
655
707
  if (!parsedInput) {
656
708
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"event-accumulator.js","sourceRoot":"","sources":["../../../src/v1/utils/event-accumulator.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Event Accumulation Logic for v1 Streaming API\n *\n * Implements a reducer that transforms AG-UI event streams into React state.\n * Used with useReducer to accumulate events into thread state.\n */\n\nimport type {\n AGUIEvent,\n CustomEvent,\n RunErrorEvent,\n RunFinishedEvent,\n RunStartedEvent,\n TextMessageContentEvent,\n TextMessageEndEvent,\n TextMessageStartEvent,\n ThinkingTextMessageContentEvent,\n ThinkingTextMessageEndEvent,\n ThinkingTextMessageStartEvent,\n ToolCallArgsEvent,\n ToolCallEndEvent,\n ToolCallResultEvent,\n ToolCallStartEvent,\n} from \"@ag-ui/core\";\nimport { EventType } from \"@ag-ui/core\";\nimport {\n asTamboCustomEvent,\n type ComponentEndEvent,\n type ComponentPropsDeltaEvent,\n type ComponentStartEvent,\n type ComponentStateDeltaEvent,\n type RunAwaitingInputEvent,\n} from \"../types/event\";\nimport type { Content, TamboV1Message } from \"../types/message\";\nimport type { StreamingState, TamboV1Thread } from \"../types/thread\";\nimport { parse as parsePartialJson } from \"partial-json\";\nimport { applyJsonPatch } from \"./json-patch\";\n\n/**\n * Error thrown when an unreachable case is reached in a switch statement.\n * This indicates a programming error where not all cases were handled.\n */\nexport class UnreachableCaseError extends Error {\n constructor(value: never) {\n super(`Unreachable case: ${JSON.stringify(value)}`);\n this.name = \"UnreachableCaseError\";\n }\n}\n\n/**\n * Per-thread state managed by the stream reducer.\n * Tracks thread data, streaming status, and accumulating data.\n */\nexport interface ThreadState {\n thread: TamboV1Thread;\n streaming: StreamingState;\n /**\n * Accumulating tool call arguments as JSON strings (for streaming).\n * Maps tool call ID to accumulated JSON string.\n */\n accumulatingToolArgs: Map<string, string>;\n}\n\n/**\n * State managed by the stream reducer.\n * Maintains a map of all threads being tracked.\n */\nexport interface StreamState {\n /**\n * Map of thread ID to thread state\n */\n threadMap: Record<string, ThreadState>;\n\n /**\n * Current active thread ID (for UI context)\n */\n currentThreadId: string;\n}\n\n/**\n * Event action - dispatches an AG-UI event to update thread state.\n */\nexport interface EventAction {\n type: \"EVENT\";\n event: AGUIEvent;\n threadId: string;\n}\n\n/**\n * Initialize thread action - creates a new thread in the threadMap.\n */\nexport interface InitThreadAction {\n type: \"INIT_THREAD\";\n threadId: string;\n initialThread?: Partial<TamboV1Thread>;\n}\n\n/**\n * Set current thread action - changes the active thread.\n */\nexport interface SetCurrentThreadAction {\n type: \"SET_CURRENT_THREAD\";\n threadId: string;\n}\n\n/**\n * Start new thread action - atomically creates and switches to a new thread.\n * This prevents race conditions when multiple calls happen concurrently.\n */\nexport interface StartNewThreadAction {\n type: \"START_NEW_THREAD\";\n threadId: string;\n initialThread?: Partial<TamboV1Thread>;\n}\n\n/**\n * Load thread messages action - loads messages from API into stream state.\n * Used when switching to an existing thread to populate its messages.\n */\nexport interface LoadThreadMessagesAction {\n type: \"LOAD_THREAD_MESSAGES\";\n threadId: string;\n messages: TamboV1Message[];\n /**\n * If true, skip loading if the thread is currently streaming.\n * This prevents overwriting in-flight streaming messages.\n */\n skipIfStreaming?: boolean;\n}\n\n/**\n * Update thread title action - sets the title on a thread.\n * Used after auto-generating a thread name via the API.\n */\nexport interface UpdateThreadTitleAction {\n type: \"UPDATE_THREAD_TITLE\";\n threadId: string;\n title: string;\n}\n\n/**\n * Action type for the stream reducer.\n */\nexport type StreamAction =\n | EventAction\n | InitThreadAction\n | SetCurrentThreadAction\n | StartNewThreadAction\n | LoadThreadMessagesAction\n | UpdateThreadTitleAction;\n\n/**\n * Initial streaming state.\n */\nconst initialStreamingState: StreamingState = {\n status: \"idle\",\n};\n\n/**\n * Create initial thread state for a new thread.\n * @param threadId - Unique thread identifier\n * @returns Initial thread state\n */\nexport function createInitialThreadState(threadId: string): ThreadState {\n const now = new Date().toISOString();\n return {\n thread: {\n id: threadId,\n messages: [],\n status: \"idle\",\n createdAt: now,\n updatedAt: now,\n lastRunCancelled: false,\n },\n streaming: initialStreamingState,\n accumulatingToolArgs: new Map(),\n };\n}\n\n/**\n * Placeholder thread ID used for new threads before they get a real ID from the server.\n * This allows optimistic UI updates (showing user messages immediately) before the\n * server responds with the actual thread ID.\n */\nexport const PLACEHOLDER_THREAD_ID = \"placeholder\";\n\n/**\n * Check if a thread ID is a placeholder (not a real API thread ID).\n * @param threadId - Thread ID to check\n * @returns True if this is a placeholder thread ID\n */\nexport function isPlaceholderThreadId(\n threadId: string | null | undefined,\n): boolean {\n return threadId === PLACEHOLDER_THREAD_ID;\n}\n\n/**\n * Create initial stream state with placeholder thread.\n * @returns Initial stream state\n */\nexport function createInitialState(): StreamState {\n return {\n threadMap: {\n [PLACEHOLDER_THREAD_ID]: createInitialThreadState(PLACEHOLDER_THREAD_ID),\n },\n currentThreadId: PLACEHOLDER_THREAD_ID,\n };\n}\n\n// ============================================================================\n// Helper Functions for Immutable State Updates\n// ============================================================================\n\n/**\n * Location of a content block within messages.\n */\ninterface ContentLocation {\n messageIndex: number;\n contentIndex: number;\n}\n\n/**\n * Replace a message at a specific index immutably.\n * @param messages - Current messages array\n * @param index - Index of message to replace\n * @param updatedMessage - New message to insert\n * @returns New messages array with the message replaced\n */\nfunction updateMessageAtIndex(\n messages: TamboV1Message[],\n index: number,\n updatedMessage: TamboV1Message,\n): TamboV1Message[] {\n return [\n ...messages.slice(0, index),\n updatedMessage,\n ...messages.slice(index + 1),\n ];\n}\n\n/**\n * Replace a content block at a specific index within a message's content immutably.\n * @param content - Current content array\n * @param index - Index of content to replace\n * @param updatedContent - New content to insert\n * @returns New content array with the content replaced\n */\nfunction updateContentAtIndex(\n content: Content[],\n index: number,\n updatedContent: Content,\n): Content[] {\n return [\n ...content.slice(0, index),\n updatedContent,\n ...content.slice(index + 1),\n ];\n}\n\n/**\n * Find a content block by ID across all messages, searching from most recent.\n *\n * TODO: This is O(n*m) where n = messages and m = content blocks per message.\n * For high-frequency streaming with many messages, consider maintaining an\n * index map of contentId -> {messageIndex, contentIndex} that gets updated\n * when content blocks are created.\n * @param messages - Messages to search\n * @param contentType - Type of content to find (\"component\" or \"tool_use\")\n * @param contentId - ID of the content block\n * @param eventName - Name of the event (for error messages)\n * @returns Location of the content block\n * @throws {Error} If content not found\n */\nfunction findContentById(\n messages: TamboV1Message[],\n contentType: \"component\" | \"tool_use\",\n contentId: string,\n eventName: string,\n): ContentLocation {\n for (let i = messages.length - 1; i >= 0; i--) {\n const idx = messages[i].content.findIndex(\n (c) => c.type === contentType && c.id === contentId,\n );\n if (idx !== -1) {\n return { messageIndex: i, contentIndex: idx };\n }\n }\n throw new Error(`${contentType} ${contentId} not found for ${eventName}`);\n}\n\n/**\n * Create updated thread state with new messages.\n * @param threadState - Current thread state\n * @param messages - New messages array\n * @returns Updated thread state\n */\nfunction updateThreadMessages(\n threadState: ThreadState,\n messages: TamboV1Message[],\n): ThreadState {\n return {\n ...threadState,\n thread: {\n ...threadState.thread,\n messages,\n updatedAt: new Date().toISOString(),\n },\n };\n}\n\n/**\n * Stream reducer that accumulates events into thread state.\n *\n * This reducer handles all AG-UI events and Tambo custom events,\n * transforming them into immutable state updates per thread.\n * @param state - Current stream state\n * @param action - Action to process\n * @returns Updated stream state\n */\nexport function streamReducer(\n state: StreamState,\n action: StreamAction,\n): StreamState {\n // Handle non-event actions first\n switch (action.type) {\n case \"INIT_THREAD\": {\n const { threadId, initialThread } = action;\n // Don't overwrite existing thread\n if (state.threadMap[threadId]) {\n return state;\n }\n const baseState = createInitialThreadState(threadId);\n const threadState = initialThread\n ? {\n ...baseState,\n thread: {\n ...baseState.thread,\n ...initialThread,\n id: threadId,\n },\n }\n : baseState;\n return {\n ...state,\n threadMap: {\n ...state.threadMap,\n [threadId]: threadState,\n },\n };\n }\n\n case \"SET_CURRENT_THREAD\": {\n return {\n ...state,\n currentThreadId: action.threadId,\n };\n }\n\n case \"START_NEW_THREAD\": {\n // Atomic action: initialize thread AND set as current in one reducer pass\n // This prevents race conditions when multiple startNewThread() calls happen\n const { threadId, initialThread } = action;\n // Don't overwrite existing thread\n if (state.threadMap[threadId]) {\n return {\n ...state,\n currentThreadId: threadId,\n };\n }\n const baseState = createInitialThreadState(threadId);\n const threadState = initialThread\n ? {\n ...baseState,\n thread: {\n ...baseState.thread,\n ...initialThread,\n id: threadId,\n },\n }\n : baseState;\n return {\n ...state,\n threadMap: {\n ...state.threadMap,\n [threadId]: threadState,\n },\n currentThreadId: threadId,\n };\n }\n\n case \"LOAD_THREAD_MESSAGES\": {\n return handleLoadThreadMessages(state, action);\n }\n\n case \"UPDATE_THREAD_TITLE\": {\n const threadState = state.threadMap[action.threadId];\n if (!threadState) {\n return state;\n }\n return {\n ...state,\n threadMap: {\n ...state.threadMap,\n [action.threadId]: {\n ...threadState,\n thread: {\n ...threadState.thread,\n title: action.title,\n },\n },\n },\n };\n }\n\n case \"EVENT\":\n // Fall through to event handling below\n break;\n }\n\n // Handle EVENT action\n const { event, threadId } = action;\n const effectiveThreadId =\n event.type === EventType.RUN_STARTED ? event.threadId : threadId;\n\n // Get the current thread state, auto-initializing if needed\n // Auto-initialization handles the case where events arrive before explicit thread init\n // (e.g., when creating a new thread and RUN_STARTED is the first event)\n let threadState = state.threadMap[effectiveThreadId];\n let updatedState = state;\n\n if (!threadState) {\n // Auto-initialize the thread to avoid dropping events\n threadState = createInitialThreadState(effectiveThreadId);\n updatedState = {\n ...state,\n threadMap: {\n ...state.threadMap,\n [effectiveThreadId]: threadState,\n },\n };\n }\n\n // Handle placeholder thread migration for RUN_STARTED events\n // When a new thread is created, messages may have been added to the placeholder thread\n // for immediate UI feedback. Now that we have the real threadId, migrate those messages.\n if (\n event.type === EventType.RUN_STARTED &&\n effectiveThreadId !== PLACEHOLDER_THREAD_ID\n ) {\n const placeholderState = updatedState.threadMap[PLACEHOLDER_THREAD_ID];\n if (placeholderState?.thread.messages.length) {\n // Prepend placeholder thread messages to the real thread\n threadState = {\n ...threadState,\n thread: {\n ...threadState.thread,\n messages: [\n ...placeholderState.thread.messages,\n ...threadState.thread.messages,\n ],\n },\n };\n\n // Reset placeholder thread to empty state\n const resetPlaceholder = createInitialThreadState(PLACEHOLDER_THREAD_ID);\n updatedState = {\n ...updatedState,\n threadMap: {\n ...updatedState.threadMap,\n [PLACEHOLDER_THREAD_ID]: resetPlaceholder,\n [effectiveThreadId]: threadState,\n },\n // Only switch selection if the user is currently on the placeholder thread\n currentThreadId: isPlaceholderThreadId(updatedState.currentThreadId)\n ? effectiveThreadId\n : updatedState.currentThreadId,\n };\n }\n }\n\n // Process the event for this specific thread\n let updatedThreadState: ThreadState;\n\n // Switch on event.type - AGUIEvent is a discriminated union so TypeScript\n // automatically narrows the type in each case branch\n switch (event.type) {\n case EventType.RUN_STARTED:\n updatedThreadState = handleRunStarted(threadState, event);\n break;\n\n case EventType.RUN_FINISHED:\n updatedThreadState = handleRunFinished(threadState, event);\n break;\n\n case EventType.RUN_ERROR:\n updatedThreadState = handleRunError(threadState, event);\n break;\n\n case EventType.TEXT_MESSAGE_START:\n updatedThreadState = handleTextMessageStart(threadState, event);\n break;\n\n case EventType.TEXT_MESSAGE_CONTENT:\n updatedThreadState = handleTextMessageContent(threadState, event);\n break;\n\n case EventType.TEXT_MESSAGE_END:\n updatedThreadState = handleTextMessageEnd(threadState, event);\n break;\n\n case EventType.TOOL_CALL_START:\n updatedThreadState = handleToolCallStart(threadState, event);\n break;\n\n case EventType.TOOL_CALL_ARGS:\n updatedThreadState = handleToolCallArgs(threadState, event);\n break;\n\n case EventType.TOOL_CALL_END:\n updatedThreadState = handleToolCallEnd(threadState, event);\n break;\n\n case EventType.TOOL_CALL_RESULT:\n updatedThreadState = handleToolCallResult(threadState, event);\n break;\n\n case EventType.CUSTOM:\n updatedThreadState = handleCustomEvent(threadState, event);\n break;\n\n case EventType.THINKING_TEXT_MESSAGE_START:\n updatedThreadState = handleThinkingTextMessageStart(threadState, event);\n break;\n\n case EventType.THINKING_TEXT_MESSAGE_CONTENT:\n updatedThreadState = handleThinkingTextMessageContent(threadState, event);\n break;\n\n case EventType.THINKING_TEXT_MESSAGE_END:\n updatedThreadState = handleThinkingTextMessageEnd(threadState, event);\n break;\n\n // Unsupported AG-UI event types - may be added in future phases\n case EventType.TEXT_MESSAGE_CHUNK:\n case EventType.TOOL_CALL_CHUNK:\n case EventType.THINKING_START:\n case EventType.THINKING_END:\n case EventType.STATE_SNAPSHOT:\n case EventType.STATE_DELTA:\n case EventType.MESSAGES_SNAPSHOT:\n case EventType.ACTIVITY_SNAPSHOT:\n case EventType.ACTIVITY_DELTA:\n case EventType.RAW:\n case EventType.STEP_STARTED:\n case EventType.STEP_FINISHED:\n // Log warning - these events are being ignored\n\n console.warn(\n `[StreamReducer] Received unsupported event type: ${event.type}. ` +\n `This event will be ignored.`,\n );\n return updatedState;\n\n default: {\n // Exhaustiveness check: if a new event type is added to AGUIEvent\n // and not handled above, TypeScript will error here\n const _exhaustiveCheck: never = event;\n throw new UnreachableCaseError(_exhaustiveCheck);\n }\n }\n\n // Return updated state with modified thread\n return {\n ...updatedState,\n threadMap: {\n ...updatedState.threadMap,\n [effectiveThreadId]: updatedThreadState,\n },\n };\n}\n\n/**\n * Handle RUN_STARTED event.\n * @param threadState - Current thread state\n * @param event - Run started event\n * @returns Updated thread state\n */\nfunction handleRunStarted(\n threadState: ThreadState,\n event: RunStartedEvent,\n): ThreadState {\n return {\n ...threadState,\n thread: {\n ...threadState.thread,\n status: \"streaming\",\n updatedAt: new Date().toISOString(),\n // Reset lastRunCancelled when a new run starts\n lastRunCancelled: false,\n },\n streaming: {\n status: \"streaming\",\n runId: event.runId,\n startTime: event.timestamp ?? Date.now(),\n },\n };\n}\n\n/**\n * Handle RUN_FINISHED event.\n * @param threadState - Current thread state\n * @param _event - Run finished event (unused)\n * @returns Updated thread state\n */\nfunction handleRunFinished(\n threadState: ThreadState,\n _event: RunFinishedEvent,\n): ThreadState {\n return {\n ...threadState,\n thread: {\n ...threadState.thread,\n status: \"complete\",\n updatedAt: new Date().toISOString(),\n },\n streaming: {\n ...threadState.streaming,\n status: \"complete\",\n },\n };\n}\n\n/**\n * Handle RUN_ERROR event.\n * Sets lastRunCancelled if the error code is \"CANCELLED\".\n * @param threadState - Current thread state\n * @param event - Run error event\n * @returns Updated thread state\n */\nfunction handleRunError(\n threadState: ThreadState,\n event: RunErrorEvent,\n): ThreadState {\n const isCancelled = event.code === \"CANCELLED\";\n\n return {\n ...threadState,\n thread: {\n ...threadState.thread,\n // Use \"idle\" status for cancelled runs (not a real error from user perspective)\n status: isCancelled ? \"idle\" : \"error\",\n updatedAt: new Date().toISOString(),\n lastRunCancelled: isCancelled,\n },\n streaming: {\n ...threadState.streaming,\n // Use \"idle\" status for cancelled runs so UI shows as not streaming\n status: isCancelled ? \"idle\" : \"error\",\n error: isCancelled\n ? undefined\n : {\n message: event.message,\n code: event.code,\n },\n },\n };\n}\n\n/**\n * Handle TEXT_MESSAGE_START event.\n * Creates a new message or reuses an ephemeral reasoning message.\n * @param threadState - Current thread state\n * @param event - Text message start event\n * @returns Updated thread state\n */\nfunction handleTextMessageStart(\n threadState: ThreadState,\n event: TextMessageStartEvent,\n): ThreadState {\n const isAssistant = event.role !== \"user\";\n const messages = threadState.thread.messages;\n\n // For assistant messages, check if there's an ephemeral message with reasoning\n // that we should merge into instead of creating a new message.\n if (isAssistant) {\n const ephemeralIndex = messages.findIndex(\n (m) =>\n m.role === \"assistant\" &&\n m.id.startsWith(\"ephemeral_\") &&\n m.reasoning &&\n m.reasoning.length > 0,\n );\n\n if (ephemeralIndex !== -1) {\n // Update the ephemeral message with the real ID\n const ephemeralMessage = messages[ephemeralIndex];\n const updatedMessages = [...messages];\n updatedMessages[ephemeralIndex] = {\n ...ephemeralMessage,\n id: event.messageId,\n };\n\n return {\n ...threadState,\n thread: {\n ...threadState.thread,\n messages: updatedMessages,\n updatedAt: new Date().toISOString(),\n },\n streaming: {\n ...threadState.streaming,\n messageId: event.messageId,\n },\n };\n }\n }\n\n // No ephemeral message to reuse - create a new message\n const newMessage: TamboV1Message = {\n id: event.messageId,\n role: isAssistant ? \"assistant\" : \"user\",\n content: [],\n createdAt: new Date().toISOString(),\n };\n\n return {\n ...threadState,\n thread: {\n ...threadState.thread,\n messages: [...messages, newMessage],\n updatedAt: new Date().toISOString(),\n },\n streaming: {\n ...threadState.streaming,\n messageId: event.messageId,\n },\n };\n}\n\n/**\n * Handle TEXT_MESSAGE_CONTENT event.\n * Appends text content to the current message.\n * @param threadState - Current thread state\n * @param event - Text message content event\n * @returns Updated thread state\n */\nfunction handleTextMessageContent(\n threadState: ThreadState,\n event: TextMessageContentEvent,\n): ThreadState {\n const messageId = event.messageId;\n const messages = threadState.thread.messages;\n\n // Find the message to update\n const messageIndex = messages.findIndex((m) => m.id === messageId);\n if (messageIndex === -1) {\n throw new Error(\n `Message ${messageId} not found for TEXT_MESSAGE_CONTENT event`,\n );\n }\n\n const message = messages[messageIndex];\n const content = message.content;\n\n // Find or create text content block\n const lastContent = content[content.length - 1];\n const isTextBlock = lastContent?.type === \"text\";\n\n const updatedContent: Content[] = isTextBlock\n ? [\n ...content.slice(0, -1),\n {\n ...lastContent,\n text: lastContent.text + event.delta,\n },\n ]\n : [\n ...content,\n {\n type: \"text\",\n text: event.delta,\n },\n ];\n\n const updatedMessage: TamboV1Message = {\n ...message,\n content: updatedContent,\n };\n\n return updateThreadMessages(\n threadState,\n updateMessageAtIndex(messages, messageIndex, updatedMessage),\n );\n}\n\n/**\n * Handle TEXT_MESSAGE_END event.\n * Marks the message as complete.\n * @param threadState - Current thread state\n * @param event - Text message end event\n * @returns Updated thread state\n */\nfunction handleTextMessageEnd(\n threadState: ThreadState,\n event: TextMessageEndEvent,\n): ThreadState {\n const activeMessageId = threadState.streaming.messageId;\n\n if (activeMessageId && event.messageId !== activeMessageId) {\n throw new Error(\n `TEXT_MESSAGE_END messageId mismatch (thread ${threadState.thread.id}): expected ${activeMessageId}, got ${event.messageId}`,\n );\n }\n\n return {\n ...threadState,\n streaming: {\n ...threadState.streaming,\n messageId: undefined,\n },\n };\n}\n\n/**\n * Handle TOOL_CALL_START event.\n * Adds a tool use content block to the current message.\n * If no message exists, creates a synthetic assistant message to hold the tool call.\n * @param threadState - Current thread state\n * @param event - Tool call start event\n * @returns Updated thread state\n */\nfunction handleToolCallStart(\n threadState: ThreadState,\n event: ToolCallStartEvent,\n): ThreadState {\n const messageId = event.parentMessageId;\n const messages = threadState.thread.messages;\n\n // If no parent message ID, use the last message\n const messageIndex = messageId\n ? messages.findIndex((m) => m.id === messageId)\n : messages.length - 1;\n\n const newContent: Content = {\n type: \"tool_use\",\n id: event.toolCallId,\n name: event.toolCallName,\n input: {},\n };\n\n // If no message found, create a synthetic assistant message for the tool call\n if (messageIndex === -1) {\n const syntheticMessageId = messageId ?? `msg_tool_${event.toolCallId}`;\n const syntheticMessage: TamboV1Message = {\n id: syntheticMessageId,\n role: \"assistant\",\n content: [newContent],\n createdAt: new Date().toISOString(),\n };\n\n return {\n ...threadState,\n thread: {\n ...threadState.thread,\n messages: [...messages, syntheticMessage],\n updatedAt: new Date().toISOString(),\n },\n streaming: {\n ...threadState.streaming,\n messageId: syntheticMessageId,\n },\n };\n }\n\n const message = messages[messageIndex];\n\n const updatedMessage: TamboV1Message = {\n ...message,\n content: [...message.content, newContent],\n };\n\n return updateThreadMessages(\n threadState,\n updateMessageAtIndex(messages, messageIndex, updatedMessage),\n );\n}\n\n/**\n * Handle TOOL_CALL_ARGS event.\n * Accumulates JSON string deltas for tool call arguments and optimistically\n * parses the partial JSON to update the tool_use content block in real-time.\n * The final authoritative parse still happens at TOOL_CALL_END.\n * @param threadState - Current thread state\n * @param event - Tool call args event\n * @returns Updated thread state\n */\nfunction handleToolCallArgs(\n threadState: ThreadState,\n event: ToolCallArgsEvent,\n): ThreadState {\n const toolCallId = event.toolCallId;\n\n // Accumulate the JSON string delta\n const accumulatedArgs = threadState.accumulatingToolArgs;\n const existingArgs = accumulatedArgs.get(toolCallId) ?? \"\";\n const newAccumulatedJson = existingArgs + event.delta;\n const newAccumulatedArgs = new Map(accumulatedArgs);\n newAccumulatedArgs.set(toolCallId, newAccumulatedJson);\n\n // Optimistically parse partial JSON to update the tool_use content block\n let parsedInput: Record<string, unknown> | undefined;\n try {\n const parsed: unknown = parsePartialJson(newAccumulatedJson);\n if (\n typeof parsed === \"object\" &&\n parsed !== null &&\n !Array.isArray(parsed)\n ) {\n parsedInput = parsed as Record<string, unknown>;\n }\n } catch {\n // Partial JSON not parseable yet — leave input unchanged\n }\n\n if (!parsedInput) {\n return {\n ...threadState,\n accumulatingToolArgs: newAccumulatedArgs,\n };\n }\n\n // Update the tool_use content block with partially parsed input\n const messages = threadState.thread.messages;\n const { messageIndex, contentIndex } = findContentById(\n messages,\n \"tool_use\",\n toolCallId,\n \"TOOL_CALL_ARGS event\",\n );\n\n const message = messages[messageIndex];\n const toolUseContent = message.content[contentIndex];\n\n if (toolUseContent.type !== \"tool_use\") {\n throw new Error(\n `Content at index ${contentIndex} is not a tool_use block for TOOL_CALL_ARGS event`,\n );\n }\n\n const updatedContent: Content = {\n ...toolUseContent,\n input: parsedInput,\n };\n\n const updatedMessage: TamboV1Message = {\n ...message,\n content: updateContentAtIndex(\n message.content,\n contentIndex,\n updatedContent,\n ),\n };\n\n return {\n ...updateThreadMessages(\n threadState,\n updateMessageAtIndex(messages, messageIndex, updatedMessage),\n ),\n accumulatingToolArgs: newAccumulatedArgs,\n };\n}\n\n/**\n * Handle TOOL_CALL_END event.\n * Parses the accumulated JSON arguments and updates the tool_use content block.\n * @param threadState - Current thread state\n * @param event - Tool call end event\n * @returns Updated thread state\n */\nfunction handleToolCallEnd(\n threadState: ThreadState,\n event: ToolCallEndEvent,\n): ThreadState {\n const toolCallId = event.toolCallId;\n const messages = threadState.thread.messages;\n\n // Get accumulated JSON args string\n const accumulatedJson = threadState.accumulatingToolArgs.get(toolCallId);\n if (!accumulatedJson) {\n // No args accumulated - tool call has empty input\n return threadState;\n }\n\n // Parse the accumulated JSON - tool inputs are always objects\n let parsedInput: Record<string, unknown>;\n try {\n parsedInput = JSON.parse(accumulatedJson) as Record<string, unknown>;\n } catch (error) {\n throw new Error(\n `Failed to parse tool call arguments for ${toolCallId}: ${error instanceof Error ? error.message : String(error)}. JSON: ${accumulatedJson}`,\n );\n }\n\n // Find the tool_use content block\n const { messageIndex, contentIndex } = findContentById(\n messages,\n \"tool_use\",\n toolCallId,\n \"TOOL_CALL_END event\",\n );\n\n const message = messages[messageIndex];\n const toolUseContent = message.content[contentIndex];\n\n if (toolUseContent.type !== \"tool_use\") {\n throw new Error(\n `Content at index ${contentIndex} is not a tool_use block for TOOL_CALL_END event`,\n );\n }\n\n // Update the tool_use content with parsed input\n const updatedContent: Content = {\n ...toolUseContent,\n input: parsedInput,\n };\n\n const updatedMessage: TamboV1Message = {\n ...message,\n content: updateContentAtIndex(\n message.content,\n contentIndex,\n updatedContent,\n ),\n };\n\n // Clear accumulated args for this tool call\n const newAccumulatingToolArgs = new Map(threadState.accumulatingToolArgs);\n newAccumulatingToolArgs.delete(toolCallId);\n\n return {\n ...updateThreadMessages(\n threadState,\n updateMessageAtIndex(messages, messageIndex, updatedMessage),\n ),\n accumulatingToolArgs: newAccumulatingToolArgs,\n };\n}\n\n/**\n * Handle TOOL_CALL_RESULT event.\n * Adds tool result to the specified message.\n * @param threadState - Current thread state\n * @param event - Tool call result event\n * @returns Updated thread state\n */\nfunction handleToolCallResult(\n threadState: ThreadState,\n event: ToolCallResultEvent,\n): ThreadState {\n const messageId = event.messageId;\n const messages = threadState.thread.messages;\n\n // Find the message\n const messageIndex = messages.findIndex((m) => m.id === messageId);\n if (messageIndex === -1) {\n throw new Error(\n `Message ${messageId} not found for TOOL_CALL_RESULT event`,\n );\n }\n\n const message = messages[messageIndex];\n\n // Add tool result content\n const newContent: Content = {\n type: \"tool_result\",\n toolUseId: event.toolCallId,\n content: [\n {\n type: \"text\",\n text: event.content,\n },\n ],\n };\n\n const updatedMessage: TamboV1Message = {\n ...message,\n content: [...message.content, newContent],\n };\n\n return updateThreadMessages(\n threadState,\n updateMessageAtIndex(messages, messageIndex, updatedMessage),\n );\n}\n\n/**\n * Handle custom events (Tambo-specific).\n * @param threadState - Current thread state\n * @param event - Custom event (already narrowed from AGUIEvent)\n * @returns Updated thread state\n */\nfunction handleCustomEvent(\n threadState: ThreadState,\n event: CustomEvent,\n): ThreadState {\n // Use centralized casting function to get properly typed Tambo event\n const customEvent = asTamboCustomEvent(event);\n\n if (!customEvent) {\n // Unknown custom event - log and return unchanged\n console.warn(`[StreamReducer] Unknown custom event name: ${event.name}`);\n return threadState;\n }\n\n switch (customEvent.name) {\n case \"tambo.component.start\":\n return handleComponentStart(threadState, customEvent);\n\n case \"tambo.component.props_delta\":\n return handleComponentDelta(threadState, customEvent, \"props\");\n\n case \"tambo.component.state_delta\":\n return handleComponentDelta(threadState, customEvent, \"state\");\n\n case \"tambo.component.end\":\n return handleComponentEnd(threadState, customEvent);\n\n case \"tambo.run.awaiting_input\":\n return handleRunAwaitingInput(threadState, customEvent);\n\n default: {\n // Exhaustiveness check: if a new event type is added to TamboCustomEvent\n // and not handled here, TypeScript will error\n const _exhaustiveCheck: never = customEvent;\n throw new UnreachableCaseError(_exhaustiveCheck);\n }\n }\n}\n\n/**\n * Handle tambo.component.start event.\n * Adds a component content block to the message with 'started' streaming state.\n * @param threadState - Current thread state\n * @param event - Component start event\n * @returns Updated thread state\n */\nfunction handleComponentStart(\n threadState: ThreadState,\n event: ComponentStartEvent,\n): ThreadState {\n const messageId = event.value.messageId;\n let messages = threadState.thread.messages;\n\n // Find the message, or create it if it doesn't exist.\n // The backend may emit component events before TEXT_MESSAGE_START when\n // the LLM outputs a component tool call without preceding text.\n let messageIndex = messages.findIndex((m) => m.id === messageId);\n if (messageIndex === -1) {\n // Create a new assistant message for this component\n const newMessage: TamboV1Message = {\n id: messageId,\n role: \"assistant\",\n content: [],\n createdAt: new Date().toISOString(),\n };\n messages = [...messages, newMessage];\n messageIndex = messages.length - 1;\n\n // Update thread state with the new message before adding the component\n threadState = updateThreadMessages(threadState, messages);\n }\n\n const message = messages[messageIndex];\n\n // Add component content block with 'started' streaming state\n const newContent: Content = {\n type: \"component\",\n id: event.value.componentId,\n name: event.value.componentName,\n props: {},\n streamingState: \"started\",\n };\n\n const updatedMessage: TamboV1Message = {\n ...message,\n content: [...message.content, newContent],\n };\n\n return updateThreadMessages(\n threadState,\n updateMessageAtIndex(messages, messageIndex, updatedMessage),\n );\n}\n\n/**\n * Handle component delta events (both props_delta and state_delta).\n * Applies JSON Patch to the specified field and sets streamingState to 'streaming'.\n * @param threadState - Current thread state\n * @param event - Component delta event (props or state)\n * @param field - Which field to update ('props' or 'state')\n * @returns Updated thread state\n */\nfunction handleComponentDelta(\n threadState: ThreadState,\n event: ComponentPropsDeltaEvent | ComponentStateDeltaEvent,\n field: \"props\" | \"state\",\n): ThreadState {\n const componentId = event.value.componentId;\n const operations = event.value.operations;\n const messages = threadState.thread.messages;\n const eventName = `tambo.component.${field}_delta`;\n\n // Find the component content block\n const { messageIndex, contentIndex } = findContentById(\n messages,\n \"component\",\n componentId,\n `${eventName} event`,\n );\n\n const message = messages[messageIndex];\n const componentContent = message.content[contentIndex];\n\n if (componentContent.type !== \"component\") {\n throw new Error(\n `Content at index ${contentIndex} is not a component block for ${eventName} event`,\n );\n }\n\n // Get current value (state defaults to {} if undefined)\n const currentValue =\n field === \"props\"\n ? (componentContent.props as Record<string, unknown>)\n : ((componentContent.state as Record<string, unknown>) ?? {});\n\n // Apply JSON Patch\n const updatedValue = applyJsonPatch(currentValue, operations);\n\n // Update field and set streaming state to 'streaming'\n const updatedContent: Content = {\n ...componentContent,\n [field]: updatedValue,\n streamingState: \"streaming\",\n };\n\n const updatedMessage: TamboV1Message = {\n ...message,\n content: updateContentAtIndex(\n message.content,\n contentIndex,\n updatedContent,\n ),\n };\n\n return updateThreadMessages(\n threadState,\n updateMessageAtIndex(messages, messageIndex, updatedMessage),\n );\n}\n\n/**\n * Handle tambo.component.end event.\n * Sets component streaming state to 'done'.\n * @param threadState - Current thread state\n * @param event - Component end event\n * @returns Updated thread state\n */\nfunction handleComponentEnd(\n threadState: ThreadState,\n event: ComponentEndEvent,\n): ThreadState {\n const componentId = event.value.componentId;\n const messages = threadState.thread.messages;\n\n // Find the component content block\n const { messageIndex, contentIndex } = findContentById(\n messages,\n \"component\",\n componentId,\n \"tambo.component.end event\",\n );\n\n const message = messages[messageIndex];\n const componentContent = message.content[contentIndex];\n\n if (componentContent.type !== \"component\") {\n throw new Error(\n `Content at index ${contentIndex} is not a component block for tambo.component.end event`,\n );\n }\n\n // Set streaming state to 'done'\n const updatedContent: Content = {\n ...componentContent,\n streamingState: \"done\",\n };\n\n const updatedMessage: TamboV1Message = {\n ...message,\n content: updateContentAtIndex(\n message.content,\n contentIndex,\n updatedContent,\n ),\n };\n\n return updateThreadMessages(\n threadState,\n updateMessageAtIndex(messages, messageIndex, updatedMessage),\n );\n}\n\n/**\n * Handle tambo.run.awaiting_input event.\n * Sets thread status to waiting for client-side tool execution.\n * @param threadState - Current thread state\n * @param _event - Run awaiting input event (unused)\n * @returns Updated thread state\n */\nfunction handleRunAwaitingInput(\n threadState: ThreadState,\n _event: RunAwaitingInputEvent,\n): ThreadState {\n return {\n ...threadState,\n thread: {\n ...threadState.thread,\n status: \"waiting\",\n updatedAt: new Date().toISOString(),\n },\n streaming: {\n ...threadState.streaming,\n status: \"waiting\",\n },\n };\n}\n\n// ============================================================================\n// Reasoning Event Handlers (currently mapped from THINKING_TEXT_MESSAGE_* events)\n// ============================================================================\n\n/**\n * Generate an ephemeral message ID for reasoning messages that arrive before TEXT_MESSAGE_START.\n * Uses crypto.randomUUID() which is available in Node.js 19+ and modern browsers.\n */\nfunction generateEphemeralMessageId(): string {\n return `ephemeral_${crypto.randomUUID()}`;\n}\n\n/**\n * Find or create an assistant message for reasoning events.\n * Reasoning should only be attached to assistant messages.\n * If no suitable assistant message exists, creates an ephemeral one.\n * @param threadState - Current thread state\n * @returns Object with messageIndex, messages array, and updated threadState\n */\nfunction findOrCreateMessageForReasoning(threadState: ThreadState): {\n messageIndex: number;\n messages: TamboV1Message[];\n threadState: ThreadState;\n} {\n const messageId = threadState.streaming.messageId;\n let messages = threadState.thread.messages;\n\n // If we have an active streaming messageId, try to find it\n if (messageId) {\n const messageIndex = messages.findIndex((m) => m.id === messageId);\n if (messageIndex !== -1 && messages[messageIndex].role === \"assistant\") {\n return { messageIndex, messages, threadState };\n }\n }\n\n // Look for the last assistant message\n const lastAssistantIndex = messages.findLastIndex(\n (m) => m.role === \"assistant\",\n );\n\n // If there's an assistant message and it's the most recent message, use it\n // (Don't attach reasoning to an old assistant message if user message came after)\n if (lastAssistantIndex !== -1 && lastAssistantIndex === messages.length - 1) {\n return { messageIndex: lastAssistantIndex, messages, threadState };\n }\n\n // No suitable assistant message - create an ephemeral one\n const ephemeralId = generateEphemeralMessageId();\n const newMessage: TamboV1Message = {\n id: ephemeralId,\n role: \"assistant\",\n content: [],\n createdAt: new Date().toISOString(),\n };\n messages = [...messages, newMessage];\n const messageIndex = messages.length - 1;\n\n // Update thread state with new message\n threadState = {\n ...threadState,\n thread: {\n ...threadState.thread,\n messages,\n updatedAt: new Date().toISOString(),\n },\n streaming: {\n ...threadState.streaming,\n messageId: ephemeralId,\n },\n };\n\n return { messageIndex, messages, threadState };\n}\n\n/**\n * Handle THINKING_TEXT_MESSAGE_START event (will become REASONING_MESSAGE_START).\n * Starts a new reasoning chunk by appending an empty string to the message's reasoning array.\n * Records the start time for duration calculation.\n * @param threadState - Current thread state\n * @param event - Thinking text message start event\n * @returns Updated thread state\n */\nfunction handleThinkingTextMessageStart(\n threadState: ThreadState,\n event: ThinkingTextMessageStartEvent,\n): ThreadState {\n const {\n messageIndex,\n messages,\n threadState: updatedThreadState,\n } = findOrCreateMessageForReasoning(threadState);\n threadState = updatedThreadState;\n\n const message = messages[messageIndex];\n const existingReasoning = message.reasoning ?? [];\n\n const updatedMessage: TamboV1Message = {\n ...message,\n reasoning: [...existingReasoning, \"\"],\n };\n\n // Record reasoning start time if this is the first reasoning chunk\n const reasoningStartTime =\n threadState.streaming.reasoningStartTime ?? event.timestamp ?? Date.now();\n\n return {\n ...updateThreadMessages(\n threadState,\n updateMessageAtIndex(messages, messageIndex, updatedMessage),\n ),\n streaming: {\n ...threadState.streaming,\n reasoningStartTime,\n },\n };\n}\n\n/**\n * Handle THINKING_TEXT_MESSAGE_CONTENT event (will become REASONING_MESSAGE_CONTENT).\n * Appends delta text to the last reasoning chunk.\n * @param threadState - Current thread state\n * @param event - Thinking text message content event\n * @returns Updated thread state\n */\nfunction handleThinkingTextMessageContent(\n threadState: ThreadState,\n event: ThinkingTextMessageContentEvent,\n): ThreadState {\n const {\n messageIndex,\n messages,\n threadState: updatedThreadState,\n } = findOrCreateMessageForReasoning(threadState);\n threadState = updatedThreadState;\n\n const message = messages[messageIndex];\n const existingReasoning = message.reasoning ?? [];\n\n if (existingReasoning.length === 0) {\n // No reasoning chunk started - start one implicitly\n const updatedMessage: TamboV1Message = {\n ...message,\n reasoning: [event.delta],\n };\n\n return {\n ...updateThreadMessages(\n threadState,\n updateMessageAtIndex(messages, messageIndex, updatedMessage),\n ),\n streaming: {\n ...threadState.streaming,\n reasoningStartTime:\n threadState.streaming.reasoningStartTime ??\n event.timestamp ??\n Date.now(),\n },\n };\n }\n\n // Append to the last reasoning chunk\n const updatedReasoning = [\n ...existingReasoning.slice(0, -1),\n existingReasoning[existingReasoning.length - 1] + event.delta,\n ];\n\n const updatedMessage: TamboV1Message = {\n ...message,\n reasoning: updatedReasoning,\n };\n\n return updateThreadMessages(\n threadState,\n updateMessageAtIndex(messages, messageIndex, updatedMessage),\n );\n}\n\n/**\n * Handle THINKING_TEXT_MESSAGE_END event (will become REASONING_MESSAGE_END).\n * Calculates and stores the reasoning duration.\n * @param threadState - Current thread state\n * @param event - Thinking text message end event\n * @returns Updated thread state\n */\nfunction handleThinkingTextMessageEnd(\n threadState: ThreadState,\n event: ThinkingTextMessageEndEvent,\n): ThreadState {\n const {\n messageIndex,\n messages,\n threadState: updatedThreadState,\n } = findOrCreateMessageForReasoning(threadState);\n threadState = updatedThreadState;\n\n const message = messages[messageIndex];\n\n // Calculate duration if we have a start time\n const reasoningStartTime = threadState.streaming.reasoningStartTime;\n const endTime = event.timestamp ?? Date.now();\n const reasoningDurationMS = reasoningStartTime\n ? endTime - reasoningStartTime\n : undefined;\n\n const updatedMessage: TamboV1Message = {\n ...message,\n reasoningDurationMS:\n reasoningDurationMS ?? message.reasoningDurationMS ?? undefined,\n };\n\n return updateThreadMessages(\n threadState,\n updateMessageAtIndex(messages, messageIndex, updatedMessage),\n );\n}\n\n/**\n * Handle LOAD_THREAD_MESSAGES action.\n * Loads messages from API into stream state for an existing thread.\n * Deduplicates by message ID, keeping existing messages (they may have in-flight updates).\n * Sorts merged messages by createdAt to ensure chronological order.\n * @param state - Current stream state\n * @param action - Load thread messages action\n * @returns Updated stream state\n */\nfunction handleLoadThreadMessages(\n state: StreamState,\n action: LoadThreadMessagesAction,\n): StreamState {\n const { threadId, messages, skipIfStreaming } = action;\n\n // Get or create thread state\n let threadState = state.threadMap[threadId];\n if (!threadState) {\n threadState = createInitialThreadState(threadId);\n }\n\n // Skip if streaming and skipIfStreaming is true\n if (skipIfStreaming && threadState.streaming.status === \"streaming\") {\n return state;\n }\n\n const existingMessages = threadState.thread.messages;\n\n // Build a set of existing message IDs for fast lookup\n const existingIds = new Set(existingMessages.map((m) => m.id));\n\n // Filter out messages that already exist (keep existing, add new).\n // API-loaded messages are by definition fully complete, so stamp\n // streamingState: \"done\" on all component content blocks. This is\n // required by downstream hooks (usePropsStreamingStatus) which check\n // streamingState === \"done\" to report isSuccess: true.\n const newMessages = messages\n .filter((m) => !existingIds.has(m.id))\n .map((m) => ({\n ...m,\n content: m.content.map((block): Content => {\n if (block.type !== \"component\") return block;\n if (\n block.streamingState !== undefined &&\n block.streamingState !== \"done\"\n ) {\n console.warn(\n `LOAD_THREAD_MESSAGES: component \"${block.id}\" has unexpected ` +\n `streamingState \"${block.streamingState}\". API-loaded messages ` +\n `should not have in-flight streaming state.`,\n );\n }\n return { ...block, streamingState: \"done\" as const };\n }),\n }));\n\n // Merge and sort by createdAt\n const mergedMessages = [...existingMessages, ...newMessages].toSorted(\n (a, b) => {\n // Messages without createdAt go to the end\n if (!a.createdAt && !b.createdAt) return 0;\n if (!a.createdAt) return 1;\n if (!b.createdAt) return -1;\n return a.createdAt.localeCompare(b.createdAt);\n },\n );\n\n const updatedThreadState: ThreadState = {\n ...threadState,\n thread: {\n ...threadState.thread,\n messages: mergedMessages,\n updatedAt: new Date().toISOString(),\n },\n };\n\n return {\n ...state,\n threadMap: {\n ...state.threadMap,\n [threadId]: updatedThreadState,\n },\n };\n}\n"]}
1
+ {"version":3,"file":"event-accumulator.js","sourceRoot":"","sources":["../../../src/v1/utils/event-accumulator.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAsLH,4DAcC;AAcD,sDAIC;AAMD,gDAOC;AASD,wEA2BC;AAgHD,sCAwRC;AA5nBD,sCAAwC;AACxC,0CAOwB;AAOxB,+CAAyD;AACzD,6CAA8C;AAE9C;;;GAGG;AACH,MAAa,oBAAqB,SAAQ,KAAK;IAC7C,YAAY,KAAY;QACtB,KAAK,CAAC,qBAAqB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AALD,oDAKC;AA4HD;;GAEG;AACH,MAAM,qBAAqB,GAAmB;IAC5C,MAAM,EAAE,MAAM;CACf,CAAC;AAEF;;;;GAIG;AACH,SAAgB,wBAAwB,CAAC,QAAgB;IACvD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,OAAO;QACL,MAAM,EAAE;YACN,EAAE,EAAE,QAAQ;YACZ,QAAQ,EAAE,EAAE;YACZ,MAAM,EAAE,MAAM;YACd,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,GAAG;YACd,gBAAgB,EAAE,KAAK;SACxB;QACD,SAAS,EAAE,qBAAqB;QAChC,oBAAoB,EAAE,IAAI,GAAG,EAAE;KAChC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACU,QAAA,qBAAqB,GAAG,aAAa,CAAC;AAEnD;;;;GAIG;AACH,SAAgB,qBAAqB,CACnC,QAAmC;IAEnC,OAAO,QAAQ,KAAK,6BAAqB,CAAC;AAC5C,CAAC;AAED;;;GAGG;AACH,SAAgB,kBAAkB;IAChC,OAAO;QACL,SAAS,EAAE;YACT,CAAC,6BAAqB,CAAC,EAAE,wBAAwB,CAAC,6BAAqB,CAAC;SACzE;QACD,eAAe,EAAE,6BAAqB;KACvC,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,8BAA8B,CAC5C,eAAsC;IAEtC,MAAM,gBAAgB,GAAG,wBAAwB,CAAC,6BAAqB,CAAC,CAAC;IACzE,MAAM,QAAQ,GAAqB,eAAe,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC/D,EAAE,EAAE,WAAW,MAAM,CAAC,UAAU,EAAE,EAAE;QACpC,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAW,EAAE;YACtC,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBACtB,OAAO,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACjD,CAAC;YACD,OAAO,CAAY,CAAC;QACtB,CAAC,CAAC;KACH,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,SAAS,EAAE;YACT,CAAC,6BAAqB,CAAC,EAAE;gBACvB,GAAG,gBAAgB;gBACnB,MAAM,EAAE;oBACN,GAAG,gBAAgB,CAAC,MAAM;oBAC1B,QAAQ;iBACT;aACF;SACF;QACD,eAAe,EAAE,6BAAqB;KACvC,CAAC;AACJ,CAAC;AAcD;;;;;;GAMG;AACH,SAAS,oBAAoB,CAC3B,QAA0B,EAC1B,KAAa,EACb,cAA8B;IAE9B,OAAO;QACL,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;QAC3B,cAAc;QACd,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;KAC7B,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,oBAAoB,CAC3B,OAAkB,EAClB,KAAa,EACb,cAAuB;IAEvB,OAAO;QACL,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;QAC1B,cAAc;QACd,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;KAC5B,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,SAAS,eAAe,CACtB,QAA0B,EAC1B,WAAqC,EACrC,SAAiB,EACjB,SAAiB;IAEjB,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CACvC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,EAAE,KAAK,SAAS,CACpD,CAAC;QACF,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;YACf,OAAO,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC;QAChD,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,GAAG,WAAW,IAAI,SAAS,kBAAkB,SAAS,EAAE,CAAC,CAAC;AAC5E,CAAC;AAED;;;;;GAKG;AACH,SAAS,oBAAoB,CAC3B,WAAwB,EACxB,QAA0B;IAE1B,OAAO;QACL,GAAG,WAAW;QACd,MAAM,EAAE;YACN,GAAG,WAAW,CAAC,MAAM;YACrB,QAAQ;YACR,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,aAAa,CAC3B,KAAkB,EAClB,MAAoB;IAEpB,iCAAiC;IACjC,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,MAAM,CAAC;YAC3C,kCAAkC;YAClC,IAAI,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC9B,OAAO,KAAK,CAAC;YACf,CAAC;YACD,MAAM,SAAS,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAC;YACrD,MAAM,WAAW,GAAG,aAAa;gBAC/B,CAAC,CAAC;oBACE,GAAG,SAAS;oBACZ,MAAM,EAAE;wBACN,GAAG,SAAS,CAAC,MAAM;wBACnB,GAAG,aAAa;wBAChB,EAAE,EAAE,QAAQ;qBACb;iBACF;gBACH,CAAC,CAAC,SAAS,CAAC;YACd,OAAO;gBACL,GAAG,KAAK;gBACR,SAAS,EAAE;oBACT,GAAG,KAAK,CAAC,SAAS;oBAClB,CAAC,QAAQ,CAAC,EAAE,WAAW;iBACxB;aACF,CAAC;QACJ,CAAC;QAED,KAAK,oBAAoB,CAAC,CAAC,CAAC;YAC1B,OAAO;gBACL,GAAG,KAAK;gBACR,eAAe,EAAE,MAAM,CAAC,QAAQ;aACjC,CAAC;QACJ,CAAC;QAED,KAAK,kBAAkB,CAAC,CAAC,CAAC;YACxB,0EAA0E;YAC1E,4EAA4E;YAC5E,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,MAAM,CAAC;YAC3C,kCAAkC;YAClC,IAAI,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC9B,OAAO;oBACL,GAAG,KAAK;oBACR,eAAe,EAAE,QAAQ;iBAC1B,CAAC;YACJ,CAAC;YACD,MAAM,SAAS,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAC;YACrD,MAAM,WAAW,GAAG,aAAa;gBAC/B,CAAC,CAAC;oBACE,GAAG,SAAS;oBACZ,MAAM,EAAE;wBACN,GAAG,SAAS,CAAC,MAAM;wBACnB,GAAG,aAAa;wBAChB,EAAE,EAAE,QAAQ;qBACb;iBACF;gBACH,CAAC,CAAC,SAAS,CAAC;YACd,OAAO;gBACL,GAAG,KAAK;gBACR,SAAS,EAAE;oBACT,GAAG,KAAK,CAAC,SAAS;oBAClB,CAAC,QAAQ,CAAC,EAAE,WAAW;iBACxB;gBACD,eAAe,EAAE,QAAQ;aAC1B,CAAC;QACJ,CAAC;QAED,KAAK,sBAAsB,CAAC,CAAC,CAAC;YAC5B,OAAO,wBAAwB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACjD,CAAC;QAED,KAAK,2BAA2B,CAAC,CAAC,CAAC;YACjC,MAAM,WAAW,GACf,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC;gBAChC,wBAAwB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC5C,OAAO;gBACL,GAAG,KAAK;gBACR,SAAS,EAAE;oBACT,GAAG,KAAK,CAAC,SAAS;oBAClB,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;wBACjB,GAAG,WAAW;wBACd,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;qBAC9C;iBACF;aACF,CAAC;QACJ,CAAC;QAED,KAAK,qBAAqB,CAAC,CAAC,CAAC;YAC3B,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACrD,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO;gBACL,GAAG,KAAK;gBACR,SAAS,EAAE;oBACT,GAAG,KAAK,CAAC,SAAS;oBAClB,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;wBACjB,GAAG,WAAW;wBACd,MAAM,EAAE;4BACN,GAAG,WAAW,CAAC,MAAM;4BACrB,KAAK,EAAE,MAAM,CAAC,KAAK;yBACpB;qBACF;iBACF;aACF,CAAC;QACJ,CAAC;QAED,KAAK,OAAO;YACV,uCAAuC;YACvC,MAAM;IACV,CAAC;IAED,sBAAsB;IACtB,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IACnC,MAAM,iBAAiB,GACrB,KAAK,CAAC,IAAI,KAAK,gBAAS,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;IAEnE,4DAA4D;IAC5D,uFAAuF;IACvF,wEAAwE;IACxE,IAAI,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IACrD,IAAI,YAAY,GAAG,KAAK,CAAC;IAEzB,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,sDAAsD;QACtD,WAAW,GAAG,wBAAwB,CAAC,iBAAiB,CAAC,CAAC;QAC1D,YAAY,GAAG;YACb,GAAG,KAAK;YACR,SAAS,EAAE;gBACT,GAAG,KAAK,CAAC,SAAS;gBAClB,CAAC,iBAAiB,CAAC,EAAE,WAAW;aACjC;SACF,CAAC;IACJ,CAAC;IAED,6DAA6D;IAC7D,uFAAuF;IACvF,yFAAyF;IACzF,IACE,KAAK,CAAC,IAAI,KAAK,gBAAS,CAAC,WAAW;QACpC,iBAAiB,KAAK,6BAAqB,EAC3C,CAAC;QACD,MAAM,gBAAgB,GAAG,YAAY,CAAC,SAAS,CAAC,6BAAqB,CAAC,CAAC;QACvE,IAAI,gBAAgB,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YAC7C,yDAAyD;YACzD,WAAW,GAAG;gBACZ,GAAG,WAAW;gBACd,MAAM,EAAE;oBACN,GAAG,WAAW,CAAC,MAAM;oBACrB,QAAQ,EAAE;wBACR,GAAG,gBAAgB,CAAC,MAAM,CAAC,QAAQ;wBACnC,GAAG,WAAW,CAAC,MAAM,CAAC,QAAQ;qBAC/B;iBACF;aACF,CAAC;YAEF,0CAA0C;YAC1C,MAAM,gBAAgB,GAAG,wBAAwB,CAAC,6BAAqB,CAAC,CAAC;YACzE,YAAY,GAAG;gBACb,GAAG,YAAY;gBACf,SAAS,EAAE;oBACT,GAAG,YAAY,CAAC,SAAS;oBACzB,CAAC,6BAAqB,CAAC,EAAE,gBAAgB;oBACzC,CAAC,iBAAiB,CAAC,EAAE,WAAW;iBACjC;gBACD,2EAA2E;gBAC3E,eAAe,EAAE,qBAAqB,CAAC,YAAY,CAAC,eAAe,CAAC;oBAClE,CAAC,CAAC,iBAAiB;oBACnB,CAAC,CAAC,YAAY,CAAC,eAAe;aACjC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,6CAA6C;IAC7C,IAAI,kBAA+B,CAAC;IAEpC,0EAA0E;IAC1E,qDAAqD;IACrD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,gBAAS,CAAC,WAAW;YACxB,kBAAkB,GAAG,gBAAgB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YAC1D,MAAM;QAER,KAAK,gBAAS,CAAC,YAAY;YACzB,kBAAkB,GAAG,iBAAiB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YAC3D,MAAM;QAER,KAAK,gBAAS,CAAC,SAAS;YACtB,kBAAkB,GAAG,cAAc,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YACxD,MAAM;QAER,KAAK,gBAAS,CAAC,kBAAkB;YAC/B,kBAAkB,GAAG,sBAAsB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YAChE,MAAM;QAER,KAAK,gBAAS,CAAC,oBAAoB;YACjC,kBAAkB,GAAG,wBAAwB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YAClE,MAAM;QAER,KAAK,gBAAS,CAAC,gBAAgB;YAC7B,kBAAkB,GAAG,oBAAoB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YAC9D,MAAM;QAER,KAAK,gBAAS,CAAC,eAAe;YAC5B,kBAAkB,GAAG,mBAAmB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YAC7D,MAAM;QAER,KAAK,gBAAS,CAAC,cAAc;YAC3B,kBAAkB,GAAG,kBAAkB,CACrC,WAAW,EACX,KAAK,EACL,MAAM,CAAC,cAAc,CACtB,CAAC;YACF,MAAM;QAER,KAAK,gBAAS,CAAC,aAAa;YAC1B,kBAAkB,GAAG,iBAAiB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YAC3D,MAAM;QAER,KAAK,gBAAS,CAAC,gBAAgB;YAC7B,kBAAkB,GAAG,oBAAoB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YAC9D,MAAM;QAER,KAAK,gBAAS,CAAC,MAAM;YACnB,kBAAkB,GAAG,iBAAiB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YAC3D,MAAM;QAER,KAAK,gBAAS,CAAC,2BAA2B;YACxC,kBAAkB,GAAG,8BAA8B,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YACxE,MAAM;QAER,KAAK,gBAAS,CAAC,6BAA6B;YAC1C,kBAAkB,GAAG,gCAAgC,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YAC1E,MAAM;QAER,KAAK,gBAAS,CAAC,yBAAyB;YACtC,kBAAkB,GAAG,4BAA4B,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YACtE,MAAM;QAER,gEAAgE;QAChE,KAAK,gBAAS,CAAC,kBAAkB,CAAC;QAClC,KAAK,gBAAS,CAAC,eAAe,CAAC;QAC/B,KAAK,gBAAS,CAAC,cAAc,CAAC;QAC9B,KAAK,gBAAS,CAAC,YAAY,CAAC;QAC5B,KAAK,gBAAS,CAAC,cAAc,CAAC;QAC9B,KAAK,gBAAS,CAAC,WAAW,CAAC;QAC3B,KAAK,gBAAS,CAAC,iBAAiB,CAAC;QACjC,KAAK,gBAAS,CAAC,iBAAiB,CAAC;QACjC,KAAK,gBAAS,CAAC,cAAc,CAAC;QAC9B,KAAK,gBAAS,CAAC,GAAG,CAAC;QACnB,KAAK,gBAAS,CAAC,YAAY,CAAC;QAC5B,KAAK,gBAAS,CAAC,aAAa;YAC1B,+CAA+C;YAE/C,OAAO,CAAC,IAAI,CACV,oDAAoD,KAAK,CAAC,IAAI,IAAI;gBAChE,6BAA6B,CAChC,CAAC;YACF,OAAO,YAAY,CAAC;QAEtB,OAAO,CAAC,CAAC,CAAC;YACR,kEAAkE;YAClE,oDAAoD;YACpD,MAAM,gBAAgB,GAAU,KAAK,CAAC;YACtC,MAAM,IAAI,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,4CAA4C;IAC5C,OAAO;QACL,GAAG,YAAY;QACf,SAAS,EAAE;YACT,GAAG,YAAY,CAAC,SAAS;YACzB,CAAC,iBAAiB,CAAC,EAAE,kBAAkB;SACxC;KACF,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAS,gBAAgB,CACvB,WAAwB,EACxB,KAAsB;IAEtB,OAAO;QACL,GAAG,WAAW;QACd,MAAM,EAAE;YACN,GAAG,WAAW,CAAC,MAAM;YACrB,MAAM,EAAE,WAAW;YACnB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,+CAA+C;YAC/C,gBAAgB,EAAE,KAAK;SACxB;QACD,SAAS,EAAE;YACT,MAAM,EAAE,WAAW;YACnB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE;SACzC;KACF,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAS,iBAAiB,CACxB,WAAwB,EACxB,KAAuB;IAEvB,OAAO;QACL,GAAG,WAAW;QACd,kBAAkB,EAChB,KAAK,CAAC,KAAK;YACX,WAAW,CAAC,SAAS,CAAC,KAAK;YAC3B,WAAW,CAAC,kBAAkB;QAChC,MAAM,EAAE;YACN,GAAG,WAAW,CAAC,MAAM;YACrB,MAAM,EAAE,UAAU;YAClB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC;QACD,SAAS,EAAE;YACT,GAAG,WAAW,CAAC,SAAS;YACxB,MAAM,EAAE,UAAU;SACnB;KACF,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,cAAc,CACrB,WAAwB,EACxB,KAAoB;IAEpB,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC;IAE/C,OAAO;QACL,GAAG,WAAW;QACd,MAAM,EAAE;YACN,GAAG,WAAW,CAAC,MAAM;YACrB,gFAAgF;YAChF,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;YACtC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,gBAAgB,EAAE,WAAW;SAC9B;QACD,SAAS,EAAE;YACT,GAAG,WAAW,CAAC,SAAS;YACxB,oEAAoE;YACpE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;YACtC,KAAK,EAAE,WAAW;gBAChB,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC;oBACE,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,IAAI,EAAE,KAAK,CAAC,IAAI;iBACjB;SACN;KACF,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,sBAAsB,CAC7B,WAAwB,EACxB,KAA4B;IAE5B,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC;IAC1C,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC;IAE7C,+EAA+E;IAC/E,+DAA+D;IAC/D,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,cAAc,GAAG,QAAQ,CAAC,SAAS,CACvC,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,IAAI,KAAK,WAAW;YACtB,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;YAC7B,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CACzB,CAAC;QAEF,IAAI,cAAc,KAAK,CAAC,CAAC,EAAE,CAAC;YAC1B,gDAAgD;YAChD,MAAM,gBAAgB,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC;YAClD,MAAM,eAAe,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;YACtC,eAAe,CAAC,cAAc,CAAC,GAAG;gBAChC,GAAG,gBAAgB;gBACnB,EAAE,EAAE,KAAK,CAAC,SAAS;aACpB,CAAC;YAEF,OAAO;gBACL,GAAG,WAAW;gBACd,MAAM,EAAE;oBACN,GAAG,WAAW,CAAC,MAAM;oBACrB,QAAQ,EAAE,eAAe;oBACzB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACpC;gBACD,SAAS,EAAE;oBACT,GAAG,WAAW,CAAC,SAAS;oBACxB,SAAS,EAAE,KAAK,CAAC,SAAS;iBAC3B;aACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,uDAAuD;IACvD,MAAM,UAAU,GAAmB;QACjC,EAAE,EAAE,KAAK,CAAC,SAAS;QACnB,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM;QACxC,OAAO,EAAE,EAAE;QACX,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IAEF,OAAO;QACL,GAAG,WAAW;QACd,MAAM,EAAE;YACN,GAAG,WAAW,CAAC,MAAM;YACrB,QAAQ,EAAE,CAAC,GAAG,QAAQ,EAAE,UAAU,CAAC;YACnC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC;QACD,SAAS,EAAE;YACT,GAAG,WAAW,CAAC,SAAS;YACxB,SAAS,EAAE,KAAK,CAAC,SAAS;SAC3B;KACF,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,wBAAwB,CAC/B,WAAwB,EACxB,KAA8B;IAE9B,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;IAClC,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC;IAE7C,6BAA6B;IAC7B,MAAM,YAAY,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;IACnE,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACb,WAAW,SAAS,2CAA2C,CAChE,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAEhC,oCAAoC;IACpC,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAChD,MAAM,WAAW,GAAG,WAAW,EAAE,IAAI,KAAK,MAAM,CAAC;IAEjD,MAAM,cAAc,GAAc,WAAW;QAC3C,CAAC,CAAC;YACE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACvB;gBACE,GAAG,WAAW;gBACd,IAAI,EAAE,WAAW,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK;aACrC;SACF;QACH,CAAC,CAAC;YACE,GAAG,OAAO;YACV;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,KAAK,CAAC,KAAK;aAClB;SACF,CAAC;IAEN,MAAM,cAAc,GAAmB;QACrC,GAAG,OAAO;QACV,OAAO,EAAE,cAAc;KACxB,CAAC;IAEF,OAAO,oBAAoB,CACzB,WAAW,EACX,oBAAoB,CAAC,QAAQ,EAAE,YAAY,EAAE,cAAc,CAAC,CAC7D,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,oBAAoB,CAC3B,WAAwB,EACxB,KAA0B;IAE1B,MAAM,eAAe,GAAG,WAAW,CAAC,SAAS,CAAC,SAAS,CAAC;IAExD,IAAI,eAAe,IAAI,KAAK,CAAC,SAAS,KAAK,eAAe,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CACb,+CAA+C,WAAW,CAAC,MAAM,CAAC,EAAE,eAAe,eAAe,SAAS,KAAK,CAAC,SAAS,EAAE,CAC7H,CAAC;IACJ,CAAC;IAED,OAAO;QACL,GAAG,WAAW;QACd,SAAS,EAAE;YACT,GAAG,WAAW,CAAC,SAAS;YACxB,SAAS,EAAE,SAAS;SACrB;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,mBAAmB,CAC1B,WAAwB,EACxB,KAAyB;IAEzB,MAAM,SAAS,GAAG,KAAK,CAAC,eAAe,CAAC;IACxC,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC;IAE7C,gDAAgD;IAChD,MAAM,YAAY,GAAG,SAAS;QAC5B,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC;QAC/C,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IAExB,MAAM,UAAU,GAAY;QAC1B,IAAI,EAAE,UAAU;QAChB,EAAE,EAAE,KAAK,CAAC,UAAU;QACpB,IAAI,EAAE,KAAK,CAAC,YAAY;QACxB,KAAK,EAAE,EAAE;KACV,CAAC;IAEF,8EAA8E;IAC9E,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE,CAAC;QACxB,MAAM,kBAAkB,GAAG,SAAS,IAAI,YAAY,KAAK,CAAC,UAAU,EAAE,CAAC;QACvE,MAAM,gBAAgB,GAAmB;YACvC,EAAE,EAAE,kBAAkB;YACtB,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,CAAC,UAAU,CAAC;YACrB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QAEF,OAAO;YACL,GAAG,WAAW;YACd,MAAM,EAAE;gBACN,GAAG,WAAW,CAAC,MAAM;gBACrB,QAAQ,EAAE,CAAC,GAAG,QAAQ,EAAE,gBAAgB,CAAC;gBACzC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC;YACD,SAAS,EAAE;gBACT,GAAG,WAAW,CAAC,SAAS;gBACxB,SAAS,EAAE,kBAAkB;aAC9B;SACF,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;IAEvC,MAAM,cAAc,GAAmB;QACrC,GAAG,OAAO;QACV,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC;KAC1C,CAAC;IAEF,OAAO,oBAAoB,CACzB,WAAW,EACX,oBAAoB,CAAC,QAAQ,EAAE,YAAY,EAAE,cAAc,CAAC,CAC7D,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,kBAAkB,CACzB,WAAwB,EACxB,KAAwB,EACxB,cAAwC;IAExC,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;IAEpC,mCAAmC;IACnC,MAAM,eAAe,GAAG,WAAW,CAAC,oBAAoB,CAAC;IACzD,MAAM,YAAY,GAAG,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IAC3D,MAAM,kBAAkB,GAAG,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC;IACtD,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,CAAC;IACpD,kBAAkB,CAAC,GAAG,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;IAEvD,0EAA0E;IAC1E,IAAI,WAAW,GAAwC,cAAc,CAAC;IACtE,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,MAAM,GAAY,IAAA,oBAAgB,EAAC,kBAAkB,CAAC,CAAC;YAC7D,IACE,OAAO,MAAM,KAAK,QAAQ;gBAC1B,MAAM,KAAK,IAAI;gBACf,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EACtB,CAAC;gBACD,WAAW,GAAG,MAAiC,CAAC;YAClD,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,yDAAyD;QAC3D,CAAC;IACH,CAAC;IAED,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO;YACL,GAAG,WAAW;YACd,oBAAoB,EAAE,kBAAkB;SACzC,CAAC;IACJ,CAAC;IAED,gEAAgE;IAChE,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC;IAC7C,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,eAAe,CACpD,QAAQ,EACR,UAAU,EACV,UAAU,EACV,sBAAsB,CACvB,CAAC;IAEF,MAAM,OAAO,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;IACvC,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAErD,IAAI,cAAc,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CACb,oBAAoB,YAAY,mDAAmD,CACpF,CAAC;IACJ,CAAC;IAED,MAAM,cAAc,GAAY;QAC9B,GAAG,cAAc;QACjB,KAAK,EAAE,WAAW;KACnB,CAAC;IAEF,MAAM,cAAc,GAAmB;QACrC,GAAG,OAAO;QACV,OAAO,EAAE,oBAAoB,CAC3B,OAAO,CAAC,OAAO,EACf,YAAY,EACZ,cAAc,CACf;KACF,CAAC;IAEF,OAAO;QACL,GAAG,oBAAoB,CACrB,WAAW,EACX,oBAAoB,CAAC,QAAQ,EAAE,YAAY,EAAE,cAAc,CAAC,CAC7D;QACD,oBAAoB,EAAE,kBAAkB;KACzC,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,iBAAiB,CACxB,WAAwB,EACxB,KAAuB;IAEvB,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;IACpC,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC;IAE7C,mCAAmC;IACnC,MAAM,eAAe,GAAG,WAAW,CAAC,oBAAoB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACzE,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,kDAAkD;QAClD,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,8DAA8D;IAC9D,IAAI,WAAoC,CAAC;IACzC,IAAI,CAAC;QACH,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAA4B,CAAC;IACvE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,2CAA2C,UAAU,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,eAAe,EAAE,CAC7I,CAAC;IACJ,CAAC;IAED,kCAAkC;IAClC,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,eAAe,CACpD,QAAQ,EACR,UAAU,EACV,UAAU,EACV,qBAAqB,CACtB,CAAC;IAEF,MAAM,OAAO,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;IACvC,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAErD,IAAI,cAAc,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CACb,oBAAoB,YAAY,kDAAkD,CACnF,CAAC;IACJ,CAAC;IAED,gDAAgD;IAChD,MAAM,cAAc,GAAY;QAC9B,GAAG,cAAc;QACjB,KAAK,EAAE,WAAW;KACnB,CAAC;IAEF,MAAM,cAAc,GAAmB;QACrC,GAAG,OAAO;QACV,OAAO,EAAE,oBAAoB,CAC3B,OAAO,CAAC,OAAO,EACf,YAAY,EACZ,cAAc,CACf;KACF,CAAC;IAEF,4CAA4C;IAC5C,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC;IAC1E,uBAAuB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAE3C,OAAO;QACL,GAAG,oBAAoB,CACrB,WAAW,EACX,oBAAoB,CAAC,QAAQ,EAAE,YAAY,EAAE,cAAc,CAAC,CAC7D;QACD,oBAAoB,EAAE,uBAAuB;KAC9C,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,oBAAoB,CAC3B,WAAwB,EACxB,KAA0B;IAE1B,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;IAClC,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC;IAE7C,mBAAmB;IACnB,MAAM,YAAY,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;IACnE,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACb,WAAW,SAAS,uCAAuC,CAC5D,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;IAEvC,0BAA0B;IAC1B,MAAM,UAAU,GAAY;QAC1B,IAAI,EAAE,aAAa;QACnB,SAAS,EAAE,KAAK,CAAC,UAAU;QAC3B,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,KAAK,CAAC,OAAO;aACpB;SACF;KACF,CAAC;IAEF,MAAM,cAAc,GAAmB;QACrC,GAAG,OAAO;QACV,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC;KAC1C,CAAC;IAEF,OAAO,oBAAoB,CACzB,WAAW,EACX,oBAAoB,CAAC,QAAQ,EAAE,YAAY,EAAE,cAAc,CAAC,CAC7D,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAS,iBAAiB,CACxB,WAAwB,EACxB,KAAkB;IAElB,qEAAqE;IACrE,MAAM,WAAW,GAAG,IAAA,0BAAkB,EAAC,KAAK,CAAC,CAAC;IAE9C,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,kDAAkD;QAClD,OAAO,CAAC,IAAI,CAAC,8CAA8C,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACzE,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,QAAQ,WAAW,CAAC,IAAI,EAAE,CAAC;QACzB,KAAK,uBAAuB;YAC1B,OAAO,oBAAoB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAExD,KAAK,6BAA6B;YAChC,OAAO,oBAAoB,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;QAEjE,KAAK,6BAA6B;YAChC,OAAO,oBAAoB,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;QAEjE,KAAK,qBAAqB;YACxB,OAAO,kBAAkB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAEtD,KAAK,0BAA0B;YAC7B,OAAO,sBAAsB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAE1D,OAAO,CAAC,CAAC,CAAC;YACR,yEAAyE;YACzE,8CAA8C;YAC9C,MAAM,gBAAgB,GAAU,WAAW,CAAC;YAC5C,MAAM,IAAI,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAS,oBAAoB,CAC3B,WAAwB,EACxB,KAA0B;IAE1B,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC;IACxC,IAAI,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC;IAE3C,sDAAsD;IACtD,uEAAuE;IACvE,gEAAgE;IAChE,IAAI,YAAY,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;IACjE,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE,CAAC;QACxB,oDAAoD;QACpD,MAAM,UAAU,GAAmB;YACjC,EAAE,EAAE,SAAS;YACb,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,EAAE;YACX,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QACF,QAAQ,GAAG,CAAC,GAAG,QAAQ,EAAE,UAAU,CAAC,CAAC;QACrC,YAAY,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QAEnC,uEAAuE;QACvE,WAAW,GAAG,oBAAoB,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;IAEvC,6DAA6D;IAC7D,MAAM,UAAU,GAAY;QAC1B,IAAI,EAAE,WAAW;QACjB,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,WAAW;QAC3B,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,aAAa;QAC/B,KAAK,EAAE,EAAE;QACT,cAAc,EAAE,SAAS;KAC1B,CAAC;IAEF,MAAM,cAAc,GAAmB;QACrC,GAAG,OAAO;QACV,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC;KAC1C,CAAC;IAEF,OAAO,oBAAoB,CACzB,WAAW,EACX,oBAAoB,CAAC,QAAQ,EAAE,YAAY,EAAE,cAAc,CAAC,CAC7D,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,oBAAoB,CAC3B,WAAwB,EACxB,KAA0D,EAC1D,KAAwB;IAExB,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC;IAC5C,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC;IAC1C,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC;IAC7C,MAAM,SAAS,GAAG,mBAAmB,KAAK,QAAQ,CAAC;IAEnD,mCAAmC;IACnC,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,eAAe,CACpD,QAAQ,EACR,WAAW,EACX,WAAW,EACX,GAAG,SAAS,QAAQ,CACrB,CAAC;IAEF,MAAM,OAAO,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;IACvC,MAAM,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAEvD,IAAI,gBAAgB,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CACb,oBAAoB,YAAY,iCAAiC,SAAS,QAAQ,CACnF,CAAC;IACJ,CAAC;IAED,wDAAwD;IACxD,MAAM,YAAY,GAChB,KAAK,KAAK,OAAO;QACf,CAAC,CAAE,gBAAgB,CAAC,KAAiC;QACrD,CAAC,CAAC,CAAE,gBAAgB,CAAC,KAAiC,IAAI,EAAE,CAAC,CAAC;IAElE,mBAAmB;IACnB,MAAM,YAAY,GAAG,IAAA,2BAAc,EAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IAE9D,sDAAsD;IACtD,MAAM,cAAc,GAAY;QAC9B,GAAG,gBAAgB;QACnB,CAAC,KAAK,CAAC,EAAE,YAAY;QACrB,cAAc,EAAE,WAAW;KAC5B,CAAC;IAEF,MAAM,cAAc,GAAmB;QACrC,GAAG,OAAO;QACV,OAAO,EAAE,oBAAoB,CAC3B,OAAO,CAAC,OAAO,EACf,YAAY,EACZ,cAAc,CACf;KACF,CAAC;IAEF,OAAO,oBAAoB,CACzB,WAAW,EACX,oBAAoB,CAAC,QAAQ,EAAE,YAAY,EAAE,cAAc,CAAC,CAC7D,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,kBAAkB,CACzB,WAAwB,EACxB,KAAwB;IAExB,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC;IAC5C,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC;IAE7C,mCAAmC;IACnC,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,eAAe,CACpD,QAAQ,EACR,WAAW,EACX,WAAW,EACX,2BAA2B,CAC5B,CAAC;IAEF,MAAM,OAAO,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;IACvC,MAAM,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAEvD,IAAI,gBAAgB,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CACb,oBAAoB,YAAY,yDAAyD,CAC1F,CAAC;IACJ,CAAC;IAED,gCAAgC;IAChC,MAAM,cAAc,GAAY;QAC9B,GAAG,gBAAgB;QACnB,cAAc,EAAE,MAAM;KACvB,CAAC;IAEF,MAAM,cAAc,GAAmB;QACrC,GAAG,OAAO;QACV,OAAO,EAAE,oBAAoB,CAC3B,OAAO,CAAC,OAAO,EACf,YAAY,EACZ,cAAc,CACf;KACF,CAAC;IAEF,OAAO,oBAAoB,CACzB,WAAW,EACX,oBAAoB,CAAC,QAAQ,EAAE,YAAY,EAAE,cAAc,CAAC,CAC7D,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,sBAAsB,CAC7B,WAAwB,EACxB,MAA6B;IAE7B,OAAO;QACL,GAAG,WAAW;QACd,MAAM,EAAE;YACN,GAAG,WAAW,CAAC,MAAM;YACrB,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC;QACD,SAAS,EAAE;YACT,GAAG,WAAW,CAAC,SAAS;YACxB,MAAM,EAAE,SAAS;SAClB;KACF,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,kFAAkF;AAClF,+EAA+E;AAE/E;;;GAGG;AACH,SAAS,0BAA0B;IACjC,OAAO,aAAa,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;AAC5C,CAAC;AAED;;;;;;GAMG;AACH,SAAS,+BAA+B,CAAC,WAAwB;IAK/D,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC,SAAS,CAAC;IAClD,IAAI,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC;IAE3C,2DAA2D;IAC3D,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,YAAY,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;QACnE,IAAI,YAAY,KAAK,CAAC,CAAC,IAAI,QAAQ,CAAC,YAAY,CAAC,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACvE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;QACjD,CAAC;IACH,CAAC;IAED,sCAAsC;IACtC,MAAM,kBAAkB,GAAG,QAAQ,CAAC,aAAa,CAC/C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAC9B,CAAC;IAEF,2EAA2E;IAC3E,kFAAkF;IAClF,IAAI,kBAAkB,KAAK,CAAC,CAAC,IAAI,kBAAkB,KAAK,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5E,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;IACrE,CAAC;IAED,0DAA0D;IAC1D,MAAM,WAAW,GAAG,0BAA0B,EAAE,CAAC;IACjD,MAAM,UAAU,GAAmB;QACjC,EAAE,EAAE,WAAW;QACf,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,EAAE;QACX,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IACF,QAAQ,GAAG,CAAC,GAAG,QAAQ,EAAE,UAAU,CAAC,CAAC;IACrC,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IAEzC,uCAAuC;IACvC,WAAW,GAAG;QACZ,GAAG,WAAW;QACd,MAAM,EAAE;YACN,GAAG,WAAW,CAAC,MAAM;YACrB,QAAQ;YACR,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC;QACD,SAAS,EAAE;YACT,GAAG,WAAW,CAAC,SAAS;YACxB,SAAS,EAAE,WAAW;SACvB;KACF,CAAC;IAEF,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;AACjD,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,8BAA8B,CACrC,WAAwB,EACxB,KAAoC;IAEpC,MAAM,EACJ,YAAY,EACZ,QAAQ,EACR,WAAW,EAAE,kBAAkB,GAChC,GAAG,+BAA+B,CAAC,WAAW,CAAC,CAAC;IACjD,WAAW,GAAG,kBAAkB,CAAC;IAEjC,MAAM,OAAO,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;IACvC,MAAM,iBAAiB,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;IAElD,MAAM,cAAc,GAAmB;QACrC,GAAG,OAAO;QACV,SAAS,EAAE,CAAC,GAAG,iBAAiB,EAAE,EAAE,CAAC;KACtC,CAAC;IAEF,mEAAmE;IACnE,MAAM,kBAAkB,GACtB,WAAW,CAAC,SAAS,CAAC,kBAAkB,IAAI,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;IAE5E,OAAO;QACL,GAAG,oBAAoB,CACrB,WAAW,EACX,oBAAoB,CAAC,QAAQ,EAAE,YAAY,EAAE,cAAc,CAAC,CAC7D;QACD,SAAS,EAAE;YACT,GAAG,WAAW,CAAC,SAAS;YACxB,kBAAkB;SACnB;KACF,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,gCAAgC,CACvC,WAAwB,EACxB,KAAsC;IAEtC,MAAM,EACJ,YAAY,EACZ,QAAQ,EACR,WAAW,EAAE,kBAAkB,GAChC,GAAG,+BAA+B,CAAC,WAAW,CAAC,CAAC;IACjD,WAAW,GAAG,kBAAkB,CAAC;IAEjC,MAAM,OAAO,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;IACvC,MAAM,iBAAiB,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;IAElD,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,oDAAoD;QACpD,MAAM,cAAc,GAAmB;YACrC,GAAG,OAAO;YACV,SAAS,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;SACzB,CAAC;QAEF,OAAO;YACL,GAAG,oBAAoB,CACrB,WAAW,EACX,oBAAoB,CAAC,QAAQ,EAAE,YAAY,EAAE,cAAc,CAAC,CAC7D;YACD,SAAS,EAAE;gBACT,GAAG,WAAW,CAAC,SAAS;gBACxB,kBAAkB,EAChB,WAAW,CAAC,SAAS,CAAC,kBAAkB;oBACxC,KAAK,CAAC,SAAS;oBACf,IAAI,CAAC,GAAG,EAAE;aACb;SACF,CAAC;IACJ,CAAC;IAED,qCAAqC;IACrC,MAAM,gBAAgB,GAAG;QACvB,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACjC,iBAAiB,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK;KAC9D,CAAC;IAEF,MAAM,cAAc,GAAmB;QACrC,GAAG,OAAO;QACV,SAAS,EAAE,gBAAgB;KAC5B,CAAC;IAEF,OAAO,oBAAoB,CACzB,WAAW,EACX,oBAAoB,CAAC,QAAQ,EAAE,YAAY,EAAE,cAAc,CAAC,CAC7D,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,4BAA4B,CACnC,WAAwB,EACxB,KAAkC;IAElC,MAAM,EACJ,YAAY,EACZ,QAAQ,EACR,WAAW,EAAE,kBAAkB,GAChC,GAAG,+BAA+B,CAAC,WAAW,CAAC,CAAC;IACjD,WAAW,GAAG,kBAAkB,CAAC;IAEjC,MAAM,OAAO,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;IAEvC,6CAA6C;IAC7C,MAAM,kBAAkB,GAAG,WAAW,CAAC,SAAS,CAAC,kBAAkB,CAAC;IACpE,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;IAC9C,MAAM,mBAAmB,GAAG,kBAAkB;QAC5C,CAAC,CAAC,OAAO,GAAG,kBAAkB;QAC9B,CAAC,CAAC,SAAS,CAAC;IAEd,MAAM,cAAc,GAAmB;QACrC,GAAG,OAAO;QACV,mBAAmB,EACjB,mBAAmB,IAAI,OAAO,CAAC,mBAAmB,IAAI,SAAS;KAClE,CAAC;IAEF,OAAO,oBAAoB,CACzB,WAAW,EACX,oBAAoB,CAAC,QAAQ,EAAE,YAAY,EAAE,cAAc,CAAC,CAC7D,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,wBAAwB,CAC/B,KAAkB,EAClB,MAAgC;IAEhC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,MAAM,CAAC;IAEvD,6BAA6B;IAC7B,IAAI,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,WAAW,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAC;IACnD,CAAC;IAED,gDAAgD;IAChD,IAAI,eAAe,IAAI,WAAW,CAAC,SAAS,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QACpE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,gBAAgB,GAAG,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC;IAErD,sDAAsD;IACtD,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAE/D,mEAAmE;IACnE,iEAAiE;IACjE,kEAAkE;IAClE,qEAAqE;IACrE,uDAAuD;IACvD,MAAM,WAAW,GAAG,QAAQ;SACzB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SACrC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,GAAG,CAAC;QACJ,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAW,EAAE;YACxC,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW;gBAAE,OAAO,KAAK,CAAC;YAC7C,IACE,KAAK,CAAC,cAAc,KAAK,SAAS;gBAClC,KAAK,CAAC,cAAc,KAAK,MAAM,EAC/B,CAAC;gBACD,OAAO,CAAC,IAAI,CACV,oCAAoC,KAAK,CAAC,EAAE,mBAAmB;oBAC7D,mBAAmB,KAAK,CAAC,cAAc,yBAAyB;oBAChE,4CAA4C,CAC/C,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,GAAG,KAAK,EAAE,cAAc,EAAE,MAAe,EAAE,CAAC;QACvD,CAAC,CAAC;KACH,CAAC,CAAC,CAAC;IAEN,8BAA8B;IAC9B,MAAM,cAAc,GAAG,CAAC,GAAG,gBAAgB,EAAE,GAAG,WAAW,CAAC,CAAC,QAAQ,CACnE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACP,2CAA2C;QAC3C,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,SAAS;YAAE,OAAO,CAAC,CAAC;QAC3C,IAAI,CAAC,CAAC,CAAC,SAAS;YAAE,OAAO,CAAC,CAAC;QAC3B,IAAI,CAAC,CAAC,CAAC,SAAS;YAAE,OAAO,CAAC,CAAC,CAAC;QAC5B,OAAO,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAChD,CAAC,CACF,CAAC;IAEF,MAAM,kBAAkB,GAAgB;QACtC,GAAG,WAAW;QACd,MAAM,EAAE;YACN,GAAG,WAAW,CAAC,MAAM;YACrB,QAAQ,EAAE,cAAc;YACxB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC;KACF,CAAC;IAEF,OAAO;QACL,GAAG,KAAK;QACR,SAAS,EAAE;YACT,GAAG,KAAK,CAAC,SAAS;YAClB,CAAC,QAAQ,CAAC,EAAE,kBAAkB;SAC/B;KACF,CAAC;AACJ,CAAC","sourcesContent":["/**\n * Event Accumulation Logic for v1 Streaming API\n *\n * Implements a reducer that transforms AG-UI event streams into React state.\n * Used with useReducer to accumulate events into thread state.\n */\n\nimport type {\n AGUIEvent,\n CustomEvent,\n RunErrorEvent,\n RunFinishedEvent,\n RunStartedEvent,\n TextMessageContentEvent,\n TextMessageEndEvent,\n TextMessageStartEvent,\n ThinkingTextMessageContentEvent,\n ThinkingTextMessageEndEvent,\n ThinkingTextMessageStartEvent,\n ToolCallArgsEvent,\n ToolCallEndEvent,\n ToolCallResultEvent,\n ToolCallStartEvent,\n} from \"@ag-ui/core\";\nimport { EventType } from \"@ag-ui/core\";\nimport {\n asTamboCustomEvent,\n type ComponentEndEvent,\n type ComponentPropsDeltaEvent,\n type ComponentStartEvent,\n type ComponentStateDeltaEvent,\n type RunAwaitingInputEvent,\n} from \"../types/event\";\nimport type {\n Content,\n InitialInputMessage,\n TamboV1Message,\n} from \"../types/message\";\nimport type { StreamingState, TamboV1Thread } from \"../types/thread\";\nimport { parse as parsePartialJson } from \"partial-json\";\nimport { applyJsonPatch } from \"./json-patch\";\n\n/**\n * Error thrown when an unreachable case is reached in a switch statement.\n * This indicates a programming error where not all cases were handled.\n */\nexport class UnreachableCaseError extends Error {\n constructor(value: never) {\n super(`Unreachable case: ${JSON.stringify(value)}`);\n this.name = \"UnreachableCaseError\";\n }\n}\n\n/**\n * Per-thread state managed by the stream reducer.\n * Tracks thread data, streaming status, and accumulating data.\n */\nexport interface ThreadState {\n thread: TamboV1Thread;\n streaming: StreamingState;\n /**\n * Accumulating tool call arguments as JSON strings (for streaming).\n * Maps tool call ID to accumulated JSON string.\n */\n accumulatingToolArgs: Map<string, string>;\n /**\n * ID of the last completed run. Persists across the session so it's\n * available as `previousRunId` when sending follow-up messages, even\n * after the streaming state has been cleared (e.g., after page reload\n * and thread re-fetch).\n */\n lastCompletedRunId?: string;\n}\n\n/**\n * State managed by the stream reducer.\n * Maintains a map of all threads being tracked.\n */\nexport interface StreamState {\n /**\n * Map of thread ID to thread state\n */\n threadMap: Record<string, ThreadState>;\n\n /**\n * Current active thread ID (for UI context)\n */\n currentThreadId: string;\n}\n\n/**\n * Event action - dispatches an AG-UI event to update thread state.\n */\nexport interface EventAction {\n type: \"EVENT\";\n event: AGUIEvent;\n threadId: string;\n /** Pre-parsed partial JSON args for TOOL_CALL_ARGS events. Avoids double-parsing. */\n parsedToolArgs?: Record<string, unknown>;\n}\n\n/**\n * Initialize thread action - creates a new thread in the threadMap.\n */\nexport interface InitThreadAction {\n type: \"INIT_THREAD\";\n threadId: string;\n initialThread?: Partial<TamboV1Thread>;\n}\n\n/**\n * Set current thread action - changes the active thread.\n */\nexport interface SetCurrentThreadAction {\n type: \"SET_CURRENT_THREAD\";\n threadId: string;\n}\n\n/**\n * Start new thread action - atomically creates and switches to a new thread.\n * This prevents race conditions when multiple calls happen concurrently.\n */\nexport interface StartNewThreadAction {\n type: \"START_NEW_THREAD\";\n threadId: string;\n initialThread?: Partial<TamboV1Thread>;\n}\n\n/**\n * Load thread messages action - loads messages from API into stream state.\n * Used when switching to an existing thread to populate its messages.\n */\nexport interface LoadThreadMessagesAction {\n type: \"LOAD_THREAD_MESSAGES\";\n threadId: string;\n messages: TamboV1Message[];\n /**\n * If true, skip loading if the thread is currently streaming.\n * This prevents overwriting in-flight streaming messages.\n */\n skipIfStreaming?: boolean;\n}\n\n/**\n * Set last completed run ID action - stores metadata from the API\n * so it can be used as `previousRunId` for follow-up messages.\n */\nexport interface SetLastCompletedRunIdAction {\n type: \"SET_LAST_COMPLETED_RUN_ID\";\n threadId: string;\n lastCompletedRunId: string;\n}\n\n/**\n * Update thread title action - sets the title on a thread.\n * Used after auto-generating a thread name via the API.\n */\nexport interface UpdateThreadTitleAction {\n type: \"UPDATE_THREAD_TITLE\";\n threadId: string;\n title: string;\n}\n\n/**\n * Action type for the stream reducer.\n */\nexport type StreamAction =\n | EventAction\n | InitThreadAction\n | SetCurrentThreadAction\n | StartNewThreadAction\n | LoadThreadMessagesAction\n | SetLastCompletedRunIdAction\n | UpdateThreadTitleAction;\n\n/**\n * Initial streaming state.\n */\nconst initialStreamingState: StreamingState = {\n status: \"idle\",\n};\n\n/**\n * Create initial thread state for a new thread.\n * @param threadId - Unique thread identifier\n * @returns Initial thread state\n */\nexport function createInitialThreadState(threadId: string): ThreadState {\n const now = new Date().toISOString();\n return {\n thread: {\n id: threadId,\n messages: [],\n status: \"idle\",\n createdAt: now,\n updatedAt: now,\n lastRunCancelled: false,\n },\n streaming: initialStreamingState,\n accumulatingToolArgs: new Map(),\n };\n}\n\n/**\n * Placeholder thread ID used for new threads before they get a real ID from the server.\n * This allows optimistic UI updates (showing user messages immediately) before the\n * server responds with the actual thread ID.\n */\nexport const PLACEHOLDER_THREAD_ID = \"placeholder\";\n\n/**\n * Check if a thread ID is a placeholder (not a real API thread ID).\n * @param threadId - Thread ID to check\n * @returns True if this is a placeholder thread ID\n */\nexport function isPlaceholderThreadId(\n threadId: string | null | undefined,\n): boolean {\n return threadId === PLACEHOLDER_THREAD_ID;\n}\n\n/**\n * Create initial stream state with placeholder thread.\n * @returns Initial stream state\n */\nexport function createInitialState(): StreamState {\n return {\n threadMap: {\n [PLACEHOLDER_THREAD_ID]: createInitialThreadState(PLACEHOLDER_THREAD_ID),\n },\n currentThreadId: PLACEHOLDER_THREAD_ID,\n };\n}\n\n/**\n * Create initial stream state with placeholder thread seeded with initial messages.\n * The messages are converted from InputMessage format to TamboV1Message format\n * for immediate UI display before any API call.\n * @param initialMessages - Messages to seed the placeholder thread with\n * @returns Initial stream state with messages in the placeholder thread\n */\nexport function createInitialStateWithMessages(\n initialMessages: InitialInputMessage[],\n): StreamState {\n const placeholderState = createInitialThreadState(PLACEHOLDER_THREAD_ID);\n const messages: TamboV1Message[] = initialMessages.map((msg) => ({\n id: `initial_${crypto.randomUUID()}`,\n role: msg.role,\n content: msg.content.map((c): Content => {\n if (c.type === \"text\") {\n return { type: \"text\" as const, text: c.text };\n }\n return c as Content;\n }),\n }));\n\n return {\n threadMap: {\n [PLACEHOLDER_THREAD_ID]: {\n ...placeholderState,\n thread: {\n ...placeholderState.thread,\n messages,\n },\n },\n },\n currentThreadId: PLACEHOLDER_THREAD_ID,\n };\n}\n\n// ============================================================================\n// Helper Functions for Immutable State Updates\n// ============================================================================\n\n/**\n * Location of a content block within messages.\n */\ninterface ContentLocation {\n messageIndex: number;\n contentIndex: number;\n}\n\n/**\n * Replace a message at a specific index immutably.\n * @param messages - Current messages array\n * @param index - Index of message to replace\n * @param updatedMessage - New message to insert\n * @returns New messages array with the message replaced\n */\nfunction updateMessageAtIndex(\n messages: TamboV1Message[],\n index: number,\n updatedMessage: TamboV1Message,\n): TamboV1Message[] {\n return [\n ...messages.slice(0, index),\n updatedMessage,\n ...messages.slice(index + 1),\n ];\n}\n\n/**\n * Replace a content block at a specific index within a message's content immutably.\n * @param content - Current content array\n * @param index - Index of content to replace\n * @param updatedContent - New content to insert\n * @returns New content array with the content replaced\n */\nfunction updateContentAtIndex(\n content: Content[],\n index: number,\n updatedContent: Content,\n): Content[] {\n return [\n ...content.slice(0, index),\n updatedContent,\n ...content.slice(index + 1),\n ];\n}\n\n/**\n * Find a content block by ID across all messages, searching from most recent.\n *\n * TODO: This is O(n*m) where n = messages and m = content blocks per message.\n * For high-frequency streaming with many messages, consider maintaining an\n * index map of contentId -> {messageIndex, contentIndex} that gets updated\n * when content blocks are created.\n * @param messages - Messages to search\n * @param contentType - Type of content to find (\"component\" or \"tool_use\")\n * @param contentId - ID of the content block\n * @param eventName - Name of the event (for error messages)\n * @returns Location of the content block\n * @throws {Error} If content not found\n */\nfunction findContentById(\n messages: TamboV1Message[],\n contentType: \"component\" | \"tool_use\",\n contentId: string,\n eventName: string,\n): ContentLocation {\n for (let i = messages.length - 1; i >= 0; i--) {\n const idx = messages[i].content.findIndex(\n (c) => c.type === contentType && c.id === contentId,\n );\n if (idx !== -1) {\n return { messageIndex: i, contentIndex: idx };\n }\n }\n throw new Error(`${contentType} ${contentId} not found for ${eventName}`);\n}\n\n/**\n * Create updated thread state with new messages.\n * @param threadState - Current thread state\n * @param messages - New messages array\n * @returns Updated thread state\n */\nfunction updateThreadMessages(\n threadState: ThreadState,\n messages: TamboV1Message[],\n): ThreadState {\n return {\n ...threadState,\n thread: {\n ...threadState.thread,\n messages,\n updatedAt: new Date().toISOString(),\n },\n };\n}\n\n/**\n * Stream reducer that accumulates events into thread state.\n *\n * This reducer handles all AG-UI events and Tambo custom events,\n * transforming them into immutable state updates per thread.\n * @param state - Current stream state\n * @param action - Action to process\n * @returns Updated stream state\n */\nexport function streamReducer(\n state: StreamState,\n action: StreamAction,\n): StreamState {\n // Handle non-event actions first\n switch (action.type) {\n case \"INIT_THREAD\": {\n const { threadId, initialThread } = action;\n // Don't overwrite existing thread\n if (state.threadMap[threadId]) {\n return state;\n }\n const baseState = createInitialThreadState(threadId);\n const threadState = initialThread\n ? {\n ...baseState,\n thread: {\n ...baseState.thread,\n ...initialThread,\n id: threadId,\n },\n }\n : baseState;\n return {\n ...state,\n threadMap: {\n ...state.threadMap,\n [threadId]: threadState,\n },\n };\n }\n\n case \"SET_CURRENT_THREAD\": {\n return {\n ...state,\n currentThreadId: action.threadId,\n };\n }\n\n case \"START_NEW_THREAD\": {\n // Atomic action: initialize thread AND set as current in one reducer pass\n // This prevents race conditions when multiple startNewThread() calls happen\n const { threadId, initialThread } = action;\n // Don't overwrite existing thread\n if (state.threadMap[threadId]) {\n return {\n ...state,\n currentThreadId: threadId,\n };\n }\n const baseState = createInitialThreadState(threadId);\n const threadState = initialThread\n ? {\n ...baseState,\n thread: {\n ...baseState.thread,\n ...initialThread,\n id: threadId,\n },\n }\n : baseState;\n return {\n ...state,\n threadMap: {\n ...state.threadMap,\n [threadId]: threadState,\n },\n currentThreadId: threadId,\n };\n }\n\n case \"LOAD_THREAD_MESSAGES\": {\n return handleLoadThreadMessages(state, action);\n }\n\n case \"SET_LAST_COMPLETED_RUN_ID\": {\n const threadState =\n state.threadMap[action.threadId] ??\n createInitialThreadState(action.threadId);\n return {\n ...state,\n threadMap: {\n ...state.threadMap,\n [action.threadId]: {\n ...threadState,\n lastCompletedRunId: action.lastCompletedRunId,\n },\n },\n };\n }\n\n case \"UPDATE_THREAD_TITLE\": {\n const threadState = state.threadMap[action.threadId];\n if (!threadState) {\n return state;\n }\n return {\n ...state,\n threadMap: {\n ...state.threadMap,\n [action.threadId]: {\n ...threadState,\n thread: {\n ...threadState.thread,\n title: action.title,\n },\n },\n },\n };\n }\n\n case \"EVENT\":\n // Fall through to event handling below\n break;\n }\n\n // Handle EVENT action\n const { event, threadId } = action;\n const effectiveThreadId =\n event.type === EventType.RUN_STARTED ? event.threadId : threadId;\n\n // Get the current thread state, auto-initializing if needed\n // Auto-initialization handles the case where events arrive before explicit thread init\n // (e.g., when creating a new thread and RUN_STARTED is the first event)\n let threadState = state.threadMap[effectiveThreadId];\n let updatedState = state;\n\n if (!threadState) {\n // Auto-initialize the thread to avoid dropping events\n threadState = createInitialThreadState(effectiveThreadId);\n updatedState = {\n ...state,\n threadMap: {\n ...state.threadMap,\n [effectiveThreadId]: threadState,\n },\n };\n }\n\n // Handle placeholder thread migration for RUN_STARTED events\n // When a new thread is created, messages may have been added to the placeholder thread\n // for immediate UI feedback. Now that we have the real threadId, migrate those messages.\n if (\n event.type === EventType.RUN_STARTED &&\n effectiveThreadId !== PLACEHOLDER_THREAD_ID\n ) {\n const placeholderState = updatedState.threadMap[PLACEHOLDER_THREAD_ID];\n if (placeholderState?.thread.messages.length) {\n // Prepend placeholder thread messages to the real thread\n threadState = {\n ...threadState,\n thread: {\n ...threadState.thread,\n messages: [\n ...placeholderState.thread.messages,\n ...threadState.thread.messages,\n ],\n },\n };\n\n // Reset placeholder thread to empty state\n const resetPlaceholder = createInitialThreadState(PLACEHOLDER_THREAD_ID);\n updatedState = {\n ...updatedState,\n threadMap: {\n ...updatedState.threadMap,\n [PLACEHOLDER_THREAD_ID]: resetPlaceholder,\n [effectiveThreadId]: threadState,\n },\n // Only switch selection if the user is currently on the placeholder thread\n currentThreadId: isPlaceholderThreadId(updatedState.currentThreadId)\n ? effectiveThreadId\n : updatedState.currentThreadId,\n };\n }\n }\n\n // Process the event for this specific thread\n let updatedThreadState: ThreadState;\n\n // Switch on event.type - AGUIEvent is a discriminated union so TypeScript\n // automatically narrows the type in each case branch\n switch (event.type) {\n case EventType.RUN_STARTED:\n updatedThreadState = handleRunStarted(threadState, event);\n break;\n\n case EventType.RUN_FINISHED:\n updatedThreadState = handleRunFinished(threadState, event);\n break;\n\n case EventType.RUN_ERROR:\n updatedThreadState = handleRunError(threadState, event);\n break;\n\n case EventType.TEXT_MESSAGE_START:\n updatedThreadState = handleTextMessageStart(threadState, event);\n break;\n\n case EventType.TEXT_MESSAGE_CONTENT:\n updatedThreadState = handleTextMessageContent(threadState, event);\n break;\n\n case EventType.TEXT_MESSAGE_END:\n updatedThreadState = handleTextMessageEnd(threadState, event);\n break;\n\n case EventType.TOOL_CALL_START:\n updatedThreadState = handleToolCallStart(threadState, event);\n break;\n\n case EventType.TOOL_CALL_ARGS:\n updatedThreadState = handleToolCallArgs(\n threadState,\n event,\n action.parsedToolArgs,\n );\n break;\n\n case EventType.TOOL_CALL_END:\n updatedThreadState = handleToolCallEnd(threadState, event);\n break;\n\n case EventType.TOOL_CALL_RESULT:\n updatedThreadState = handleToolCallResult(threadState, event);\n break;\n\n case EventType.CUSTOM:\n updatedThreadState = handleCustomEvent(threadState, event);\n break;\n\n case EventType.THINKING_TEXT_MESSAGE_START:\n updatedThreadState = handleThinkingTextMessageStart(threadState, event);\n break;\n\n case EventType.THINKING_TEXT_MESSAGE_CONTENT:\n updatedThreadState = handleThinkingTextMessageContent(threadState, event);\n break;\n\n case EventType.THINKING_TEXT_MESSAGE_END:\n updatedThreadState = handleThinkingTextMessageEnd(threadState, event);\n break;\n\n // Unsupported AG-UI event types - may be added in future phases\n case EventType.TEXT_MESSAGE_CHUNK:\n case EventType.TOOL_CALL_CHUNK:\n case EventType.THINKING_START:\n case EventType.THINKING_END:\n case EventType.STATE_SNAPSHOT:\n case EventType.STATE_DELTA:\n case EventType.MESSAGES_SNAPSHOT:\n case EventType.ACTIVITY_SNAPSHOT:\n case EventType.ACTIVITY_DELTA:\n case EventType.RAW:\n case EventType.STEP_STARTED:\n case EventType.STEP_FINISHED:\n // Log warning - these events are being ignored\n\n console.warn(\n `[StreamReducer] Received unsupported event type: ${event.type}. ` +\n `This event will be ignored.`,\n );\n return updatedState;\n\n default: {\n // Exhaustiveness check: if a new event type is added to AGUIEvent\n // and not handled above, TypeScript will error here\n const _exhaustiveCheck: never = event;\n throw new UnreachableCaseError(_exhaustiveCheck);\n }\n }\n\n // Return updated state with modified thread\n return {\n ...updatedState,\n threadMap: {\n ...updatedState.threadMap,\n [effectiveThreadId]: updatedThreadState,\n },\n };\n}\n\n/**\n * Handle RUN_STARTED event.\n * @param threadState - Current thread state\n * @param event - Run started event\n * @returns Updated thread state\n */\nfunction handleRunStarted(\n threadState: ThreadState,\n event: RunStartedEvent,\n): ThreadState {\n return {\n ...threadState,\n thread: {\n ...threadState.thread,\n status: \"streaming\",\n updatedAt: new Date().toISOString(),\n // Reset lastRunCancelled when a new run starts\n lastRunCancelled: false,\n },\n streaming: {\n status: \"streaming\",\n runId: event.runId,\n startTime: event.timestamp ?? Date.now(),\n },\n };\n}\n\n/**\n * Handle RUN_FINISHED event.\n * @param threadState - Current thread state\n * @param event - Run finished event containing the completed run's ID\n * @returns Updated thread state\n */\nfunction handleRunFinished(\n threadState: ThreadState,\n event: RunFinishedEvent,\n): ThreadState {\n return {\n ...threadState,\n lastCompletedRunId:\n event.runId ??\n threadState.streaming.runId ??\n threadState.lastCompletedRunId,\n thread: {\n ...threadState.thread,\n status: \"complete\",\n updatedAt: new Date().toISOString(),\n },\n streaming: {\n ...threadState.streaming,\n status: \"complete\",\n },\n };\n}\n\n/**\n * Handle RUN_ERROR event.\n * Sets lastRunCancelled if the error code is \"CANCELLED\".\n * @param threadState - Current thread state\n * @param event - Run error event\n * @returns Updated thread state\n */\nfunction handleRunError(\n threadState: ThreadState,\n event: RunErrorEvent,\n): ThreadState {\n const isCancelled = event.code === \"CANCELLED\";\n\n return {\n ...threadState,\n thread: {\n ...threadState.thread,\n // Use \"idle\" status for cancelled runs (not a real error from user perspective)\n status: isCancelled ? \"idle\" : \"error\",\n updatedAt: new Date().toISOString(),\n lastRunCancelled: isCancelled,\n },\n streaming: {\n ...threadState.streaming,\n // Use \"idle\" status for cancelled runs so UI shows as not streaming\n status: isCancelled ? \"idle\" : \"error\",\n error: isCancelled\n ? undefined\n : {\n message: event.message,\n code: event.code,\n },\n },\n };\n}\n\n/**\n * Handle TEXT_MESSAGE_START event.\n * Creates a new message or reuses an ephemeral reasoning message.\n * @param threadState - Current thread state\n * @param event - Text message start event\n * @returns Updated thread state\n */\nfunction handleTextMessageStart(\n threadState: ThreadState,\n event: TextMessageStartEvent,\n): ThreadState {\n const isAssistant = event.role !== \"user\";\n const messages = threadState.thread.messages;\n\n // For assistant messages, check if there's an ephemeral message with reasoning\n // that we should merge into instead of creating a new message.\n if (isAssistant) {\n const ephemeralIndex = messages.findIndex(\n (m) =>\n m.role === \"assistant\" &&\n m.id.startsWith(\"ephemeral_\") &&\n m.reasoning &&\n m.reasoning.length > 0,\n );\n\n if (ephemeralIndex !== -1) {\n // Update the ephemeral message with the real ID\n const ephemeralMessage = messages[ephemeralIndex];\n const updatedMessages = [...messages];\n updatedMessages[ephemeralIndex] = {\n ...ephemeralMessage,\n id: event.messageId,\n };\n\n return {\n ...threadState,\n thread: {\n ...threadState.thread,\n messages: updatedMessages,\n updatedAt: new Date().toISOString(),\n },\n streaming: {\n ...threadState.streaming,\n messageId: event.messageId,\n },\n };\n }\n }\n\n // No ephemeral message to reuse - create a new message\n const newMessage: TamboV1Message = {\n id: event.messageId,\n role: isAssistant ? \"assistant\" : \"user\",\n content: [],\n createdAt: new Date().toISOString(),\n };\n\n return {\n ...threadState,\n thread: {\n ...threadState.thread,\n messages: [...messages, newMessage],\n updatedAt: new Date().toISOString(),\n },\n streaming: {\n ...threadState.streaming,\n messageId: event.messageId,\n },\n };\n}\n\n/**\n * Handle TEXT_MESSAGE_CONTENT event.\n * Appends text content to the current message.\n * @param threadState - Current thread state\n * @param event - Text message content event\n * @returns Updated thread state\n */\nfunction handleTextMessageContent(\n threadState: ThreadState,\n event: TextMessageContentEvent,\n): ThreadState {\n const messageId = event.messageId;\n const messages = threadState.thread.messages;\n\n // Find the message to update\n const messageIndex = messages.findIndex((m) => m.id === messageId);\n if (messageIndex === -1) {\n throw new Error(\n `Message ${messageId} not found for TEXT_MESSAGE_CONTENT event`,\n );\n }\n\n const message = messages[messageIndex];\n const content = message.content;\n\n // Find or create text content block\n const lastContent = content[content.length - 1];\n const isTextBlock = lastContent?.type === \"text\";\n\n const updatedContent: Content[] = isTextBlock\n ? [\n ...content.slice(0, -1),\n {\n ...lastContent,\n text: lastContent.text + event.delta,\n },\n ]\n : [\n ...content,\n {\n type: \"text\",\n text: event.delta,\n },\n ];\n\n const updatedMessage: TamboV1Message = {\n ...message,\n content: updatedContent,\n };\n\n return updateThreadMessages(\n threadState,\n updateMessageAtIndex(messages, messageIndex, updatedMessage),\n );\n}\n\n/**\n * Handle TEXT_MESSAGE_END event.\n * Marks the message as complete.\n * @param threadState - Current thread state\n * @param event - Text message end event\n * @returns Updated thread state\n */\nfunction handleTextMessageEnd(\n threadState: ThreadState,\n event: TextMessageEndEvent,\n): ThreadState {\n const activeMessageId = threadState.streaming.messageId;\n\n if (activeMessageId && event.messageId !== activeMessageId) {\n throw new Error(\n `TEXT_MESSAGE_END messageId mismatch (thread ${threadState.thread.id}): expected ${activeMessageId}, got ${event.messageId}`,\n );\n }\n\n return {\n ...threadState,\n streaming: {\n ...threadState.streaming,\n messageId: undefined,\n },\n };\n}\n\n/**\n * Handle TOOL_CALL_START event.\n * Adds a tool use content block to the current message.\n * If no message exists, creates a synthetic assistant message to hold the tool call.\n * @param threadState - Current thread state\n * @param event - Tool call start event\n * @returns Updated thread state\n */\nfunction handleToolCallStart(\n threadState: ThreadState,\n event: ToolCallStartEvent,\n): ThreadState {\n const messageId = event.parentMessageId;\n const messages = threadState.thread.messages;\n\n // If no parent message ID, use the last message\n const messageIndex = messageId\n ? messages.findIndex((m) => m.id === messageId)\n : messages.length - 1;\n\n const newContent: Content = {\n type: \"tool_use\",\n id: event.toolCallId,\n name: event.toolCallName,\n input: {},\n };\n\n // If no message found, create a synthetic assistant message for the tool call\n if (messageIndex === -1) {\n const syntheticMessageId = messageId ?? `msg_tool_${event.toolCallId}`;\n const syntheticMessage: TamboV1Message = {\n id: syntheticMessageId,\n role: \"assistant\",\n content: [newContent],\n createdAt: new Date().toISOString(),\n };\n\n return {\n ...threadState,\n thread: {\n ...threadState.thread,\n messages: [...messages, syntheticMessage],\n updatedAt: new Date().toISOString(),\n },\n streaming: {\n ...threadState.streaming,\n messageId: syntheticMessageId,\n },\n };\n }\n\n const message = messages[messageIndex];\n\n const updatedMessage: TamboV1Message = {\n ...message,\n content: [...message.content, newContent],\n };\n\n return updateThreadMessages(\n threadState,\n updateMessageAtIndex(messages, messageIndex, updatedMessage),\n );\n}\n\n/**\n * Handle TOOL_CALL_ARGS event.\n * Accumulates JSON string deltas for tool call arguments and optimistically\n * parses the partial JSON to update the tool_use content block in real-time.\n * The final authoritative parse still happens at TOOL_CALL_END.\n * @param threadState - Current thread state\n * @param event - Tool call args event\n * @returns Updated thread state\n */\nfunction handleToolCallArgs(\n threadState: ThreadState,\n event: ToolCallArgsEvent,\n parsedToolArgs?: Record<string, unknown>,\n): ThreadState {\n const toolCallId = event.toolCallId;\n\n // Accumulate the JSON string delta\n const accumulatedArgs = threadState.accumulatingToolArgs;\n const existingArgs = accumulatedArgs.get(toolCallId) ?? \"\";\n const newAccumulatedJson = existingArgs + event.delta;\n const newAccumulatedArgs = new Map(accumulatedArgs);\n newAccumulatedArgs.set(toolCallId, newAccumulatedJson);\n\n // Use pre-parsed args if provided, otherwise parse partial JSON ourselves\n let parsedInput: Record<string, unknown> | undefined = parsedToolArgs;\n if (!parsedInput) {\n try {\n const parsed: unknown = parsePartialJson(newAccumulatedJson);\n if (\n typeof parsed === \"object\" &&\n parsed !== null &&\n !Array.isArray(parsed)\n ) {\n parsedInput = parsed as Record<string, unknown>;\n }\n } catch {\n // Partial JSON not parseable yet — leave input unchanged\n }\n }\n\n if (!parsedInput) {\n return {\n ...threadState,\n accumulatingToolArgs: newAccumulatedArgs,\n };\n }\n\n // Update the tool_use content block with partially parsed input\n const messages = threadState.thread.messages;\n const { messageIndex, contentIndex } = findContentById(\n messages,\n \"tool_use\",\n toolCallId,\n \"TOOL_CALL_ARGS event\",\n );\n\n const message = messages[messageIndex];\n const toolUseContent = message.content[contentIndex];\n\n if (toolUseContent.type !== \"tool_use\") {\n throw new Error(\n `Content at index ${contentIndex} is not a tool_use block for TOOL_CALL_ARGS event`,\n );\n }\n\n const updatedContent: Content = {\n ...toolUseContent,\n input: parsedInput,\n };\n\n const updatedMessage: TamboV1Message = {\n ...message,\n content: updateContentAtIndex(\n message.content,\n contentIndex,\n updatedContent,\n ),\n };\n\n return {\n ...updateThreadMessages(\n threadState,\n updateMessageAtIndex(messages, messageIndex, updatedMessage),\n ),\n accumulatingToolArgs: newAccumulatedArgs,\n };\n}\n\n/**\n * Handle TOOL_CALL_END event.\n * Parses the accumulated JSON arguments and updates the tool_use content block.\n * @param threadState - Current thread state\n * @param event - Tool call end event\n * @returns Updated thread state\n */\nfunction handleToolCallEnd(\n threadState: ThreadState,\n event: ToolCallEndEvent,\n): ThreadState {\n const toolCallId = event.toolCallId;\n const messages = threadState.thread.messages;\n\n // Get accumulated JSON args string\n const accumulatedJson = threadState.accumulatingToolArgs.get(toolCallId);\n if (!accumulatedJson) {\n // No args accumulated - tool call has empty input\n return threadState;\n }\n\n // Parse the accumulated JSON - tool inputs are always objects\n let parsedInput: Record<string, unknown>;\n try {\n parsedInput = JSON.parse(accumulatedJson) as Record<string, unknown>;\n } catch (error) {\n throw new Error(\n `Failed to parse tool call arguments for ${toolCallId}: ${error instanceof Error ? error.message : String(error)}. JSON: ${accumulatedJson}`,\n );\n }\n\n // Find the tool_use content block\n const { messageIndex, contentIndex } = findContentById(\n messages,\n \"tool_use\",\n toolCallId,\n \"TOOL_CALL_END event\",\n );\n\n const message = messages[messageIndex];\n const toolUseContent = message.content[contentIndex];\n\n if (toolUseContent.type !== \"tool_use\") {\n throw new Error(\n `Content at index ${contentIndex} is not a tool_use block for TOOL_CALL_END event`,\n );\n }\n\n // Update the tool_use content with parsed input\n const updatedContent: Content = {\n ...toolUseContent,\n input: parsedInput,\n };\n\n const updatedMessage: TamboV1Message = {\n ...message,\n content: updateContentAtIndex(\n message.content,\n contentIndex,\n updatedContent,\n ),\n };\n\n // Clear accumulated args for this tool call\n const newAccumulatingToolArgs = new Map(threadState.accumulatingToolArgs);\n newAccumulatingToolArgs.delete(toolCallId);\n\n return {\n ...updateThreadMessages(\n threadState,\n updateMessageAtIndex(messages, messageIndex, updatedMessage),\n ),\n accumulatingToolArgs: newAccumulatingToolArgs,\n };\n}\n\n/**\n * Handle TOOL_CALL_RESULT event.\n * Adds tool result to the specified message.\n * @param threadState - Current thread state\n * @param event - Tool call result event\n * @returns Updated thread state\n */\nfunction handleToolCallResult(\n threadState: ThreadState,\n event: ToolCallResultEvent,\n): ThreadState {\n const messageId = event.messageId;\n const messages = threadState.thread.messages;\n\n // Find the message\n const messageIndex = messages.findIndex((m) => m.id === messageId);\n if (messageIndex === -1) {\n throw new Error(\n `Message ${messageId} not found for TOOL_CALL_RESULT event`,\n );\n }\n\n const message = messages[messageIndex];\n\n // Add tool result content\n const newContent: Content = {\n type: \"tool_result\",\n toolUseId: event.toolCallId,\n content: [\n {\n type: \"text\",\n text: event.content,\n },\n ],\n };\n\n const updatedMessage: TamboV1Message = {\n ...message,\n content: [...message.content, newContent],\n };\n\n return updateThreadMessages(\n threadState,\n updateMessageAtIndex(messages, messageIndex, updatedMessage),\n );\n}\n\n/**\n * Handle custom events (Tambo-specific).\n * @param threadState - Current thread state\n * @param event - Custom event (already narrowed from AGUIEvent)\n * @returns Updated thread state\n */\nfunction handleCustomEvent(\n threadState: ThreadState,\n event: CustomEvent,\n): ThreadState {\n // Use centralized casting function to get properly typed Tambo event\n const customEvent = asTamboCustomEvent(event);\n\n if (!customEvent) {\n // Unknown custom event - log and return unchanged\n console.warn(`[StreamReducer] Unknown custom event name: ${event.name}`);\n return threadState;\n }\n\n switch (customEvent.name) {\n case \"tambo.component.start\":\n return handleComponentStart(threadState, customEvent);\n\n case \"tambo.component.props_delta\":\n return handleComponentDelta(threadState, customEvent, \"props\");\n\n case \"tambo.component.state_delta\":\n return handleComponentDelta(threadState, customEvent, \"state\");\n\n case \"tambo.component.end\":\n return handleComponentEnd(threadState, customEvent);\n\n case \"tambo.run.awaiting_input\":\n return handleRunAwaitingInput(threadState, customEvent);\n\n default: {\n // Exhaustiveness check: if a new event type is added to TamboCustomEvent\n // and not handled here, TypeScript will error\n const _exhaustiveCheck: never = customEvent;\n throw new UnreachableCaseError(_exhaustiveCheck);\n }\n }\n}\n\n/**\n * Handle tambo.component.start event.\n * Adds a component content block to the message with 'started' streaming state.\n * @param threadState - Current thread state\n * @param event - Component start event\n * @returns Updated thread state\n */\nfunction handleComponentStart(\n threadState: ThreadState,\n event: ComponentStartEvent,\n): ThreadState {\n const messageId = event.value.messageId;\n let messages = threadState.thread.messages;\n\n // Find the message, or create it if it doesn't exist.\n // The backend may emit component events before TEXT_MESSAGE_START when\n // the LLM outputs a component tool call without preceding text.\n let messageIndex = messages.findIndex((m) => m.id === messageId);\n if (messageIndex === -1) {\n // Create a new assistant message for this component\n const newMessage: TamboV1Message = {\n id: messageId,\n role: \"assistant\",\n content: [],\n createdAt: new Date().toISOString(),\n };\n messages = [...messages, newMessage];\n messageIndex = messages.length - 1;\n\n // Update thread state with the new message before adding the component\n threadState = updateThreadMessages(threadState, messages);\n }\n\n const message = messages[messageIndex];\n\n // Add component content block with 'started' streaming state\n const newContent: Content = {\n type: \"component\",\n id: event.value.componentId,\n name: event.value.componentName,\n props: {},\n streamingState: \"started\",\n };\n\n const updatedMessage: TamboV1Message = {\n ...message,\n content: [...message.content, newContent],\n };\n\n return updateThreadMessages(\n threadState,\n updateMessageAtIndex(messages, messageIndex, updatedMessage),\n );\n}\n\n/**\n * Handle component delta events (both props_delta and state_delta).\n * Applies JSON Patch to the specified field and sets streamingState to 'streaming'.\n * @param threadState - Current thread state\n * @param event - Component delta event (props or state)\n * @param field - Which field to update ('props' or 'state')\n * @returns Updated thread state\n */\nfunction handleComponentDelta(\n threadState: ThreadState,\n event: ComponentPropsDeltaEvent | ComponentStateDeltaEvent,\n field: \"props\" | \"state\",\n): ThreadState {\n const componentId = event.value.componentId;\n const operations = event.value.operations;\n const messages = threadState.thread.messages;\n const eventName = `tambo.component.${field}_delta`;\n\n // Find the component content block\n const { messageIndex, contentIndex } = findContentById(\n messages,\n \"component\",\n componentId,\n `${eventName} event`,\n );\n\n const message = messages[messageIndex];\n const componentContent = message.content[contentIndex];\n\n if (componentContent.type !== \"component\") {\n throw new Error(\n `Content at index ${contentIndex} is not a component block for ${eventName} event`,\n );\n }\n\n // Get current value (state defaults to {} if undefined)\n const currentValue =\n field === \"props\"\n ? (componentContent.props as Record<string, unknown>)\n : ((componentContent.state as Record<string, unknown>) ?? {});\n\n // Apply JSON Patch\n const updatedValue = applyJsonPatch(currentValue, operations);\n\n // Update field and set streaming state to 'streaming'\n const updatedContent: Content = {\n ...componentContent,\n [field]: updatedValue,\n streamingState: \"streaming\",\n };\n\n const updatedMessage: TamboV1Message = {\n ...message,\n content: updateContentAtIndex(\n message.content,\n contentIndex,\n updatedContent,\n ),\n };\n\n return updateThreadMessages(\n threadState,\n updateMessageAtIndex(messages, messageIndex, updatedMessage),\n );\n}\n\n/**\n * Handle tambo.component.end event.\n * Sets component streaming state to 'done'.\n * @param threadState - Current thread state\n * @param event - Component end event\n * @returns Updated thread state\n */\nfunction handleComponentEnd(\n threadState: ThreadState,\n event: ComponentEndEvent,\n): ThreadState {\n const componentId = event.value.componentId;\n const messages = threadState.thread.messages;\n\n // Find the component content block\n const { messageIndex, contentIndex } = findContentById(\n messages,\n \"component\",\n componentId,\n \"tambo.component.end event\",\n );\n\n const message = messages[messageIndex];\n const componentContent = message.content[contentIndex];\n\n if (componentContent.type !== \"component\") {\n throw new Error(\n `Content at index ${contentIndex} is not a component block for tambo.component.end event`,\n );\n }\n\n // Set streaming state to 'done'\n const updatedContent: Content = {\n ...componentContent,\n streamingState: \"done\",\n };\n\n const updatedMessage: TamboV1Message = {\n ...message,\n content: updateContentAtIndex(\n message.content,\n contentIndex,\n updatedContent,\n ),\n };\n\n return updateThreadMessages(\n threadState,\n updateMessageAtIndex(messages, messageIndex, updatedMessage),\n );\n}\n\n/**\n * Handle tambo.run.awaiting_input event.\n * Sets thread status to waiting for client-side tool execution.\n * @param threadState - Current thread state\n * @param _event - Run awaiting input event (unused)\n * @returns Updated thread state\n */\nfunction handleRunAwaitingInput(\n threadState: ThreadState,\n _event: RunAwaitingInputEvent,\n): ThreadState {\n return {\n ...threadState,\n thread: {\n ...threadState.thread,\n status: \"waiting\",\n updatedAt: new Date().toISOString(),\n },\n streaming: {\n ...threadState.streaming,\n status: \"waiting\",\n },\n };\n}\n\n// ============================================================================\n// Reasoning Event Handlers (currently mapped from THINKING_TEXT_MESSAGE_* events)\n// ============================================================================\n\n/**\n * Generate an ephemeral message ID for reasoning messages that arrive before TEXT_MESSAGE_START.\n * Uses crypto.randomUUID() which is available in Node.js 19+ and modern browsers.\n */\nfunction generateEphemeralMessageId(): string {\n return `ephemeral_${crypto.randomUUID()}`;\n}\n\n/**\n * Find or create an assistant message for reasoning events.\n * Reasoning should only be attached to assistant messages.\n * If no suitable assistant message exists, creates an ephemeral one.\n * @param threadState - Current thread state\n * @returns Object with messageIndex, messages array, and updated threadState\n */\nfunction findOrCreateMessageForReasoning(threadState: ThreadState): {\n messageIndex: number;\n messages: TamboV1Message[];\n threadState: ThreadState;\n} {\n const messageId = threadState.streaming.messageId;\n let messages = threadState.thread.messages;\n\n // If we have an active streaming messageId, try to find it\n if (messageId) {\n const messageIndex = messages.findIndex((m) => m.id === messageId);\n if (messageIndex !== -1 && messages[messageIndex].role === \"assistant\") {\n return { messageIndex, messages, threadState };\n }\n }\n\n // Look for the last assistant message\n const lastAssistantIndex = messages.findLastIndex(\n (m) => m.role === \"assistant\",\n );\n\n // If there's an assistant message and it's the most recent message, use it\n // (Don't attach reasoning to an old assistant message if user message came after)\n if (lastAssistantIndex !== -1 && lastAssistantIndex === messages.length - 1) {\n return { messageIndex: lastAssistantIndex, messages, threadState };\n }\n\n // No suitable assistant message - create an ephemeral one\n const ephemeralId = generateEphemeralMessageId();\n const newMessage: TamboV1Message = {\n id: ephemeralId,\n role: \"assistant\",\n content: [],\n createdAt: new Date().toISOString(),\n };\n messages = [...messages, newMessage];\n const messageIndex = messages.length - 1;\n\n // Update thread state with new message\n threadState = {\n ...threadState,\n thread: {\n ...threadState.thread,\n messages,\n updatedAt: new Date().toISOString(),\n },\n streaming: {\n ...threadState.streaming,\n messageId: ephemeralId,\n },\n };\n\n return { messageIndex, messages, threadState };\n}\n\n/**\n * Handle THINKING_TEXT_MESSAGE_START event (will become REASONING_MESSAGE_START).\n * Starts a new reasoning chunk by appending an empty string to the message's reasoning array.\n * Records the start time for duration calculation.\n * @param threadState - Current thread state\n * @param event - Thinking text message start event\n * @returns Updated thread state\n */\nfunction handleThinkingTextMessageStart(\n threadState: ThreadState,\n event: ThinkingTextMessageStartEvent,\n): ThreadState {\n const {\n messageIndex,\n messages,\n threadState: updatedThreadState,\n } = findOrCreateMessageForReasoning(threadState);\n threadState = updatedThreadState;\n\n const message = messages[messageIndex];\n const existingReasoning = message.reasoning ?? [];\n\n const updatedMessage: TamboV1Message = {\n ...message,\n reasoning: [...existingReasoning, \"\"],\n };\n\n // Record reasoning start time if this is the first reasoning chunk\n const reasoningStartTime =\n threadState.streaming.reasoningStartTime ?? event.timestamp ?? Date.now();\n\n return {\n ...updateThreadMessages(\n threadState,\n updateMessageAtIndex(messages, messageIndex, updatedMessage),\n ),\n streaming: {\n ...threadState.streaming,\n reasoningStartTime,\n },\n };\n}\n\n/**\n * Handle THINKING_TEXT_MESSAGE_CONTENT event (will become REASONING_MESSAGE_CONTENT).\n * Appends delta text to the last reasoning chunk.\n * @param threadState - Current thread state\n * @param event - Thinking text message content event\n * @returns Updated thread state\n */\nfunction handleThinkingTextMessageContent(\n threadState: ThreadState,\n event: ThinkingTextMessageContentEvent,\n): ThreadState {\n const {\n messageIndex,\n messages,\n threadState: updatedThreadState,\n } = findOrCreateMessageForReasoning(threadState);\n threadState = updatedThreadState;\n\n const message = messages[messageIndex];\n const existingReasoning = message.reasoning ?? [];\n\n if (existingReasoning.length === 0) {\n // No reasoning chunk started - start one implicitly\n const updatedMessage: TamboV1Message = {\n ...message,\n reasoning: [event.delta],\n };\n\n return {\n ...updateThreadMessages(\n threadState,\n updateMessageAtIndex(messages, messageIndex, updatedMessage),\n ),\n streaming: {\n ...threadState.streaming,\n reasoningStartTime:\n threadState.streaming.reasoningStartTime ??\n event.timestamp ??\n Date.now(),\n },\n };\n }\n\n // Append to the last reasoning chunk\n const updatedReasoning = [\n ...existingReasoning.slice(0, -1),\n existingReasoning[existingReasoning.length - 1] + event.delta,\n ];\n\n const updatedMessage: TamboV1Message = {\n ...message,\n reasoning: updatedReasoning,\n };\n\n return updateThreadMessages(\n threadState,\n updateMessageAtIndex(messages, messageIndex, updatedMessage),\n );\n}\n\n/**\n * Handle THINKING_TEXT_MESSAGE_END event (will become REASONING_MESSAGE_END).\n * Calculates and stores the reasoning duration.\n * @param threadState - Current thread state\n * @param event - Thinking text message end event\n * @returns Updated thread state\n */\nfunction handleThinkingTextMessageEnd(\n threadState: ThreadState,\n event: ThinkingTextMessageEndEvent,\n): ThreadState {\n const {\n messageIndex,\n messages,\n threadState: updatedThreadState,\n } = findOrCreateMessageForReasoning(threadState);\n threadState = updatedThreadState;\n\n const message = messages[messageIndex];\n\n // Calculate duration if we have a start time\n const reasoningStartTime = threadState.streaming.reasoningStartTime;\n const endTime = event.timestamp ?? Date.now();\n const reasoningDurationMS = reasoningStartTime\n ? endTime - reasoningStartTime\n : undefined;\n\n const updatedMessage: TamboV1Message = {\n ...message,\n reasoningDurationMS:\n reasoningDurationMS ?? message.reasoningDurationMS ?? undefined,\n };\n\n return updateThreadMessages(\n threadState,\n updateMessageAtIndex(messages, messageIndex, updatedMessage),\n );\n}\n\n/**\n * Handle LOAD_THREAD_MESSAGES action.\n * Loads messages from API into stream state for an existing thread.\n * Deduplicates by message ID, keeping existing messages (they may have in-flight updates).\n * Sorts merged messages by createdAt to ensure chronological order.\n * @param state - Current stream state\n * @param action - Load thread messages action\n * @returns Updated stream state\n */\nfunction handleLoadThreadMessages(\n state: StreamState,\n action: LoadThreadMessagesAction,\n): StreamState {\n const { threadId, messages, skipIfStreaming } = action;\n\n // Get or create thread state\n let threadState = state.threadMap[threadId];\n if (!threadState) {\n threadState = createInitialThreadState(threadId);\n }\n\n // Skip if streaming and skipIfStreaming is true\n if (skipIfStreaming && threadState.streaming.status === \"streaming\") {\n return state;\n }\n\n const existingMessages = threadState.thread.messages;\n\n // Build a set of existing message IDs for fast lookup\n const existingIds = new Set(existingMessages.map((m) => m.id));\n\n // Filter out messages that already exist (keep existing, add new).\n // API-loaded messages are by definition fully complete, so stamp\n // streamingState: \"done\" on all component content blocks. This is\n // required by downstream hooks (usePropsStreamingStatus) which check\n // streamingState === \"done\" to report isSuccess: true.\n const newMessages = messages\n .filter((m) => !existingIds.has(m.id))\n .map((m) => ({\n ...m,\n content: m.content.map((block): Content => {\n if (block.type !== \"component\") return block;\n if (\n block.streamingState !== undefined &&\n block.streamingState !== \"done\"\n ) {\n console.warn(\n `LOAD_THREAD_MESSAGES: component \"${block.id}\" has unexpected ` +\n `streamingState \"${block.streamingState}\". API-loaded messages ` +\n `should not have in-flight streaming state.`,\n );\n }\n return { ...block, streamingState: \"done\" as const };\n }),\n }));\n\n // Merge and sort by createdAt\n const mergedMessages = [...existingMessages, ...newMessages].toSorted(\n (a, b) => {\n // Messages without createdAt go to the end\n if (!a.createdAt && !b.createdAt) return 0;\n if (!a.createdAt) return 1;\n if (!b.createdAt) return -1;\n return a.createdAt.localeCompare(b.createdAt);\n },\n );\n\n const updatedThreadState: ThreadState = {\n ...threadState,\n thread: {\n ...threadState.thread,\n messages: mergedMessages,\n updatedAt: new Date().toISOString(),\n },\n };\n\n return {\n ...state,\n threadMap: {\n ...state.threadMap,\n [threadId]: updatedThreadState,\n },\n };\n}\n"]}