veryfront 0.1.997 → 0.1.998

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 (374) hide show
  1. package/esm/cli/templates/manifest.js +1 -1
  2. package/esm/deno.d.ts +7 -0
  3. package/esm/deno.js +11 -3
  4. package/esm/deps/esm.sh/react-dom@19.2.4.d.ts +2 -0
  5. package/esm/deps/esm.sh/react-dom@19.2.4.d.ts.map +1 -0
  6. package/esm/deps/esm.sh/react-dom@19.2.4.js +3 -0
  7. package/esm/react/react-dom.d.ts +3 -0
  8. package/esm/react/react-dom.d.ts.map +1 -0
  9. package/esm/react/react-dom.js +2 -0
  10. package/esm/src/agent/ag-ui/host-support.d.ts.map +1 -1
  11. package/esm/src/agent/ag-ui/host-support.js +12 -0
  12. package/esm/src/agent/react/index.d.ts +4 -2
  13. package/esm/src/agent/react/index.d.ts.map +1 -1
  14. package/esm/src/agent/react/index.js +2 -1
  15. package/esm/src/agent/react/use-agent-metadata.d.ts +5 -0
  16. package/esm/src/agent/react/use-agent-metadata.d.ts.map +1 -1
  17. package/esm/src/agent/react/use-agent-metadata.js +18 -9
  18. package/esm/src/agent/react/use-agents.d.ts +33 -0
  19. package/esm/src/agent/react/use-agents.d.ts.map +1 -0
  20. package/esm/src/agent/react/use-agents.js +72 -0
  21. package/esm/src/agent/react/use-chat/index.d.ts +1 -1
  22. package/esm/src/agent/react/use-chat/index.d.ts.map +1 -1
  23. package/esm/src/agent/react/use-chat/types.d.ts +3 -2
  24. package/esm/src/agent/react/use-chat/types.d.ts.map +1 -1
  25. package/esm/src/agent/react/use-chat/use-chat.d.ts +12 -1
  26. package/esm/src/agent/react/use-chat/use-chat.d.ts.map +1 -1
  27. package/esm/src/agent/react/use-chat/use-chat.js +47 -7
  28. package/esm/src/agent/react/use-chat/utils.d.ts.map +1 -1
  29. package/esm/src/agent/react/use-chat/utils.js +4 -0
  30. package/esm/src/agent/runtime/message-adapter.d.ts.map +1 -1
  31. package/esm/src/agent/runtime/message-adapter.js +3 -1
  32. package/esm/src/agent/runtime/text-generation-runtime-message-converter.d.ts.map +1 -1
  33. package/esm/src/agent/runtime/text-generation-runtime-message-converter.js +6 -2
  34. package/esm/src/chat/index.d.ts +17 -7
  35. package/esm/src/chat/index.d.ts.map +1 -1
  36. package/esm/src/chat/index.js +33 -7
  37. package/esm/src/chat/protocol.d.ts +13 -1
  38. package/esm/src/chat/protocol.d.ts.map +1 -1
  39. package/esm/src/chat/upload-handler.d.ts +55 -0
  40. package/esm/src/chat/upload-handler.d.ts.map +1 -0
  41. package/esm/src/chat/upload-handler.js +180 -0
  42. package/esm/src/discovery/import-rewriter.d.ts +1 -1
  43. package/esm/src/discovery/import-rewriter.d.ts.map +1 -1
  44. package/esm/src/discovery/import-rewriter.js +2 -0
  45. package/esm/src/discovery/transpiler.d.ts.map +1 -1
  46. package/esm/src/discovery/transpiler.js +2 -0
  47. package/esm/src/react/components/chat/agent-card.d.ts +84 -11
  48. package/esm/src/react/components/chat/agent-card.d.ts.map +1 -1
  49. package/esm/src/react/components/chat/agent-card.js +151 -57
  50. package/esm/src/react/components/chat/agent-picker.d.ts +166 -0
  51. package/esm/src/react/components/chat/agent-picker.d.ts.map +1 -0
  52. package/esm/src/react/components/chat/agent-picker.js +183 -0
  53. package/esm/src/react/components/chat/chat/components/animations.js +1 -1
  54. package/esm/src/react/components/chat/chat/components/attachment-pill.d.ts +125 -3
  55. package/esm/src/react/components/chat/chat/components/attachment-pill.d.ts.map +1 -1
  56. package/esm/src/react/components/chat/chat/components/attachment-pill.js +209 -25
  57. package/esm/src/react/components/chat/chat/components/attachments-panel.d.ts +149 -0
  58. package/esm/src/react/components/chat/chat/components/attachments-panel.d.ts.map +1 -0
  59. package/esm/src/react/components/chat/chat/components/attachments-panel.js +187 -0
  60. package/esm/src/react/components/chat/chat/components/branch-picker.d.ts +13 -2
  61. package/esm/src/react/components/chat/chat/components/branch-picker.d.ts.map +1 -1
  62. package/esm/src/react/components/chat/chat/components/branch-picker.js +6 -8
  63. package/esm/src/react/components/chat/chat/components/chat-messages-skeleton.d.ts +20 -0
  64. package/esm/src/react/components/chat/chat/components/chat-messages-skeleton.d.ts.map +1 -0
  65. package/esm/src/react/components/chat/chat/components/chat-messages-skeleton.js +31 -0
  66. package/esm/src/react/components/chat/chat/components/code-block.d.ts +9 -1
  67. package/esm/src/react/components/chat/chat/components/code-block.d.ts.map +1 -1
  68. package/esm/src/react/components/chat/chat/components/code-block.js +14 -6
  69. package/esm/src/react/components/chat/chat/components/drop-zone.d.ts +11 -4
  70. package/esm/src/react/components/chat/chat/components/drop-zone.d.ts.map +1 -1
  71. package/esm/src/react/components/chat/chat/components/drop-zone.js +10 -8
  72. package/esm/src/react/components/chat/chat/components/empty-state.d.ts +2 -1
  73. package/esm/src/react/components/chat/chat/components/empty-state.d.ts.map +1 -1
  74. package/esm/src/react/components/chat/chat/components/empty-state.js +7 -8
  75. package/esm/src/react/components/chat/chat/components/inference-badge.d.ts +6 -2
  76. package/esm/src/react/components/chat/chat/components/inference-badge.d.ts.map +1 -1
  77. package/esm/src/react/components/chat/chat/components/inference-badge.js +5 -4
  78. package/esm/src/react/components/chat/chat/components/inline-citation.d.ts +9 -1
  79. package/esm/src/react/components/chat/chat/components/inline-citation.d.ts.map +1 -1
  80. package/esm/src/react/components/chat/chat/components/inline-citation.js +19 -20
  81. package/esm/src/react/components/chat/chat/components/message-actions.d.ts +28 -5
  82. package/esm/src/react/components/chat/chat/components/message-actions.d.ts.map +1 -1
  83. package/esm/src/react/components/chat/chat/components/message-actions.js +24 -36
  84. package/esm/src/react/components/chat/chat/components/message-edit-form.d.ts +7 -2
  85. package/esm/src/react/components/chat/chat/components/message-edit-form.d.ts.map +1 -1
  86. package/esm/src/react/components/chat/chat/components/message-edit-form.js +5 -5
  87. package/esm/src/react/components/chat/chat/components/message-feedback.d.ts +11 -1
  88. package/esm/src/react/components/chat/chat/components/message-feedback.d.ts.map +1 -1
  89. package/esm/src/react/components/chat/chat/components/message-feedback.js +9 -11
  90. package/esm/src/react/components/chat/chat/components/quick-actions.d.ts.map +1 -1
  91. package/esm/src/react/components/chat/chat/components/quick-actions.js +3 -1
  92. package/esm/src/react/components/chat/chat/components/reasoning.d.ts +66 -3
  93. package/esm/src/react/components/chat/chat/components/reasoning.d.ts.map +1 -1
  94. package/esm/src/react/components/chat/chat/components/reasoning.js +95 -21
  95. package/esm/src/react/components/chat/chat/components/sidebar.d.ts +178 -12
  96. package/esm/src/react/components/chat/chat/components/sidebar.d.ts.map +1 -1
  97. package/esm/src/react/components/chat/chat/components/sidebar.js +228 -45
  98. package/esm/src/react/components/chat/chat/components/skill-badge.d.ts +6 -1
  99. package/esm/src/react/components/chat/chat/components/skill-badge.d.ts.map +1 -1
  100. package/esm/src/react/components/chat/chat/components/skill-badge.js +6 -5
  101. package/esm/src/react/components/chat/chat/components/skill-tool.d.ts +37 -0
  102. package/esm/src/react/components/chat/chat/components/skill-tool.d.ts.map +1 -0
  103. package/esm/src/react/components/chat/chat/components/skill-tool.js +46 -0
  104. package/esm/src/react/components/chat/chat/components/sources.d.ts +55 -3
  105. package/esm/src/react/components/chat/chat/components/sources.d.ts.map +1 -1
  106. package/esm/src/react/components/chat/chat/components/sources.js +50 -16
  107. package/esm/src/react/components/chat/chat/components/step-indicator.d.ts +42 -3
  108. package/esm/src/react/components/chat/chat/components/step-indicator.d.ts.map +1 -1
  109. package/esm/src/react/components/chat/chat/components/step-indicator.js +55 -12
  110. package/esm/src/react/components/chat/chat/components/tab-switcher.d.ts +1 -1
  111. package/esm/src/react/components/chat/chat/components/tab-switcher.d.ts.map +1 -1
  112. package/esm/src/react/components/chat/chat/components/tab-switcher.js +3 -3
  113. package/esm/src/react/components/chat/chat/components/tool-ui.d.ts +96 -3
  114. package/esm/src/react/components/chat/chat/components/tool-ui.d.ts.map +1 -1
  115. package/esm/src/react/components/chat/chat/components/tool-ui.js +158 -36
  116. package/esm/src/react/components/chat/chat/composition/api.d.ts +4 -2
  117. package/esm/src/react/components/chat/chat/composition/api.d.ts.map +1 -1
  118. package/esm/src/react/components/chat/chat/composition/api.js +4 -2
  119. package/esm/src/react/components/chat/chat/composition/chat-composer.d.ts +112 -5
  120. package/esm/src/react/components/chat/chat/composition/chat-composer.d.ts.map +1 -1
  121. package/esm/src/react/components/chat/chat/composition/chat-composer.js +251 -61
  122. package/esm/src/react/components/chat/chat/composition/chat-empty-state.d.ts +78 -0
  123. package/esm/src/react/components/chat/chat/composition/chat-empty-state.d.ts.map +1 -0
  124. package/esm/src/react/components/chat/chat/composition/chat-empty-state.js +63 -0
  125. package/esm/src/react/components/chat/chat/composition/chat-empty.d.ts +4 -1
  126. package/esm/src/react/components/chat/chat/composition/chat-empty.d.ts.map +1 -1
  127. package/esm/src/react/components/chat/chat/composition/chat-empty.js +11 -10
  128. package/esm/src/react/components/chat/chat/composition/chat-message-list.d.ts +11 -3
  129. package/esm/src/react/components/chat/chat/composition/chat-message-list.d.ts.map +1 -1
  130. package/esm/src/react/components/chat/chat/composition/chat-message-list.js +81 -111
  131. package/esm/src/react/components/chat/chat/composition/chat-root.d.ts +4 -0
  132. package/esm/src/react/components/chat/chat/composition/chat-root.d.ts.map +1 -1
  133. package/esm/src/react/components/chat/chat/composition/chat-root.js +3 -1
  134. package/esm/src/react/components/chat/chat/composition/error-banner.d.ts +4 -0
  135. package/esm/src/react/components/chat/chat/composition/error-banner.d.ts.map +1 -1
  136. package/esm/src/react/components/chat/chat/composition/error-banner.js +10 -7
  137. package/esm/src/react/components/chat/chat/composition/message.d.ts +123 -5
  138. package/esm/src/react/components/chat/chat/composition/message.d.ts.map +1 -1
  139. package/esm/src/react/components/chat/chat/composition/message.js +332 -53
  140. package/esm/src/react/components/chat/chat/composition/model-avatar.d.ts +6 -1
  141. package/esm/src/react/components/chat/chat/composition/model-avatar.d.ts.map +1 -1
  142. package/esm/src/react/components/chat/chat/composition/model-avatar.js +3 -4
  143. package/esm/src/react/components/chat/chat/composition/pending-message.d.ts +31 -0
  144. package/esm/src/react/components/chat/chat/composition/pending-message.d.ts.map +1 -0
  145. package/esm/src/react/components/chat/chat/composition/pending-message.js +31 -0
  146. package/esm/src/react/components/chat/chat/contexts/chat-context.d.ts +4 -0
  147. package/esm/src/react/components/chat/chat/contexts/chat-context.d.ts.map +1 -1
  148. package/esm/src/react/components/chat/chat/contexts/composer-context.d.ts +1 -0
  149. package/esm/src/react/components/chat/chat/contexts/composer-context.d.ts.map +1 -1
  150. package/esm/src/react/components/chat/chat/contexts/conversations-context.d.ts +29 -0
  151. package/esm/src/react/components/chat/chat/contexts/conversations-context.d.ts.map +1 -0
  152. package/esm/src/react/components/chat/chat/contexts/conversations-context.js +39 -0
  153. package/esm/src/react/components/chat/chat/contexts/index.d.ts +1 -1
  154. package/esm/src/react/components/chat/chat/contexts/index.d.ts.map +1 -1
  155. package/esm/src/react/components/chat/chat/contexts/index.js +1 -1
  156. package/esm/src/react/components/chat/chat/contexts/message-context.d.ts +2 -0
  157. package/esm/src/react/components/chat/chat/contexts/message-context.d.ts.map +1 -1
  158. package/esm/src/react/components/chat/chat/hooks/use-clipboard.d.ts +10 -0
  159. package/esm/src/react/components/chat/chat/hooks/use-clipboard.d.ts.map +1 -0
  160. package/esm/src/react/components/chat/chat/hooks/use-clipboard.js +34 -0
  161. package/esm/src/react/components/chat/chat/hooks/use-conversation.d.ts +21 -0
  162. package/esm/src/react/components/chat/chat/hooks/use-conversation.d.ts.map +1 -0
  163. package/esm/src/react/components/chat/chat/hooks/use-conversation.js +54 -0
  164. package/esm/src/react/components/chat/chat/hooks/use-conversations.d.ts +67 -0
  165. package/esm/src/react/components/chat/chat/hooks/use-conversations.d.ts.map +1 -0
  166. package/esm/src/react/components/chat/chat/hooks/use-conversations.js +317 -0
  167. package/esm/src/react/components/chat/chat/hooks/use-drop-zone.d.ts +27 -0
  168. package/esm/src/react/components/chat/chat/hooks/use-drop-zone.d.ts.map +1 -0
  169. package/esm/src/react/components/chat/chat/hooks/use-drop-zone.js +50 -0
  170. package/esm/src/react/components/chat/chat/hooks/use-stick-to-bottom.d.ts +49 -0
  171. package/esm/src/react/components/chat/chat/hooks/use-stick-to-bottom.d.ts.map +1 -0
  172. package/esm/src/react/components/chat/chat/hooks/use-stick-to-bottom.js +120 -0
  173. package/esm/src/react/components/chat/chat/hooks/use-upload.d.ts +34 -0
  174. package/esm/src/react/components/chat/chat/hooks/use-upload.d.ts.map +1 -0
  175. package/esm/src/react/components/chat/chat/hooks/use-upload.js +147 -0
  176. package/esm/src/react/components/chat/chat/hooks/use-uploads-registry.d.ts +37 -0
  177. package/esm/src/react/components/chat/chat/hooks/use-uploads-registry.d.ts.map +1 -0
  178. package/esm/src/react/components/chat/chat/hooks/use-uploads-registry.js +178 -0
  179. package/esm/src/react/components/chat/chat/index.d.ts +171 -31
  180. package/esm/src/react/components/chat/chat/index.d.ts.map +1 -1
  181. package/esm/src/react/components/chat/chat/index.js +371 -77
  182. package/esm/src/react/components/chat/chat/persistence/conversation-store.d.ts +63 -0
  183. package/esm/src/react/components/chat/chat/persistence/conversation-store.d.ts.map +1 -0
  184. package/esm/src/react/components/chat/chat/persistence/conversation-store.js +1 -0
  185. package/esm/src/react/components/chat/chat/persistence/local-conversation-store.d.ts +13 -0
  186. package/esm/src/react/components/chat/chat/persistence/local-conversation-store.d.ts.map +1 -0
  187. package/esm/src/react/components/chat/chat/persistence/local-conversation-store.js +102 -0
  188. package/esm/src/react/components/chat/chat/persistence/memory-conversation-store.d.ts +11 -0
  189. package/esm/src/react/components/chat/chat/persistence/memory-conversation-store.d.ts.map +1 -0
  190. package/esm/src/react/components/chat/chat/persistence/memory-conversation-store.js +33 -0
  191. package/esm/src/react/components/chat/chat/utils/message-parts.d.ts +4 -1
  192. package/esm/src/react/components/chat/chat/utils/message-parts.d.ts.map +1 -1
  193. package/esm/src/react/components/chat/chat/utils/message-parts.js +4 -0
  194. package/esm/src/react/components/chat/chat-actions.d.ts +164 -0
  195. package/esm/src/react/components/chat/chat-actions.d.ts.map +1 -0
  196. package/esm/src/react/components/chat/chat-actions.js +191 -0
  197. package/esm/src/react/components/chat/chat-agent-picker.d.ts +50 -0
  198. package/esm/src/react/components/chat/chat-agent-picker.d.ts.map +1 -0
  199. package/esm/src/react/components/chat/chat-agent-picker.js +40 -0
  200. package/esm/src/react/components/chat/chat-theme-scope.d.ts +26 -0
  201. package/esm/src/react/components/chat/chat-theme-scope.d.ts.map +1 -0
  202. package/esm/src/react/components/chat/chat-theme-scope.js +27 -0
  203. package/esm/src/react/components/chat/chat-tokens-style.d.ts +21 -0
  204. package/esm/src/react/components/chat/chat-tokens-style.d.ts.map +1 -0
  205. package/esm/src/react/components/chat/chat-tokens-style.js +24 -0
  206. package/esm/src/react/components/chat/chat.d.ts +5 -5
  207. package/esm/src/react/components/chat/chat.d.ts.map +1 -1
  208. package/esm/src/react/components/chat/chat.js +5 -5
  209. package/esm/src/react/components/chat/color-mode.d.ts +46 -0
  210. package/esm/src/react/components/chat/color-mode.d.ts.map +1 -0
  211. package/esm/src/react/components/chat/color-mode.js +123 -0
  212. package/esm/src/react/components/chat/error-boundary.js +2 -2
  213. package/esm/src/react/components/chat/icons/index.d.ts +8 -0
  214. package/esm/src/react/components/chat/icons/index.d.ts.map +1 -1
  215. package/esm/src/react/components/chat/icons/index.js +64 -0
  216. package/esm/src/react/components/chat/markdown.d.ts +24 -1
  217. package/esm/src/react/components/chat/markdown.d.ts.map +1 -1
  218. package/esm/src/react/components/chat/markdown.js +122 -38
  219. package/esm/src/react/components/chat/model-selector.d.ts +130 -8
  220. package/esm/src/react/components/chat/model-selector.d.ts.map +1 -1
  221. package/esm/src/react/components/chat/model-selector.js +148 -121
  222. package/esm/src/react/components/chat/theme.d.ts +9 -12
  223. package/esm/src/react/components/chat/theme.d.ts.map +1 -1
  224. package/esm/src/react/components/chat/theme.js +149 -93
  225. package/esm/src/react/components/chat/ui/alert.d.ts +30 -0
  226. package/esm/src/react/components/chat/ui/alert.d.ts.map +1 -0
  227. package/esm/src/react/components/chat/ui/alert.js +35 -0
  228. package/esm/src/react/components/chat/ui/app-shell.d.ts +155 -0
  229. package/esm/src/react/components/chat/ui/app-shell.d.ts.map +1 -0
  230. package/esm/src/react/components/chat/ui/app-shell.js +276 -0
  231. package/esm/src/react/components/chat/ui/avatar.d.ts +24 -0
  232. package/esm/src/react/components/chat/ui/avatar.d.ts.map +1 -0
  233. package/esm/src/react/components/chat/ui/avatar.js +44 -0
  234. package/esm/src/react/components/chat/ui/badge.d.ts +24 -0
  235. package/esm/src/react/components/chat/ui/badge.d.ts.map +1 -0
  236. package/esm/src/react/components/chat/ui/badge.js +30 -0
  237. package/esm/src/react/components/chat/ui/button.d.ts +44 -0
  238. package/esm/src/react/components/chat/ui/button.d.ts.map +1 -0
  239. package/esm/src/react/components/chat/ui/button.js +108 -0
  240. package/esm/src/react/components/chat/ui/card.d.ts +42 -0
  241. package/esm/src/react/components/chat/ui/card.d.ts.map +1 -0
  242. package/esm/src/react/components/chat/ui/card.js +55 -0
  243. package/esm/src/react/components/chat/ui/checkbox.d.ts +28 -0
  244. package/esm/src/react/components/chat/ui/checkbox.d.ts.map +1 -0
  245. package/esm/src/react/components/chat/ui/checkbox.js +36 -0
  246. package/esm/src/react/components/chat/ui/code-block.d.ts +89 -0
  247. package/esm/src/react/components/chat/ui/code-block.d.ts.map +1 -0
  248. package/esm/src/react/components/chat/ui/code-block.js +277 -0
  249. package/esm/src/react/components/chat/ui/collapsible.d.ts +30 -0
  250. package/esm/src/react/components/chat/ui/collapsible.d.ts.map +1 -0
  251. package/esm/src/react/components/chat/ui/collapsible.js +44 -0
  252. package/esm/src/react/components/chat/ui/command.d.ts +65 -0
  253. package/esm/src/react/components/chat/ui/command.d.ts.map +1 -0
  254. package/esm/src/react/components/chat/ui/command.js +121 -0
  255. package/esm/src/react/components/chat/ui/cva.d.ts +36 -0
  256. package/esm/src/react/components/chat/ui/cva.d.ts.map +1 -0
  257. package/esm/src/react/components/chat/ui/cva.js +45 -0
  258. package/esm/src/react/components/chat/ui/dialog.d.ts +55 -0
  259. package/esm/src/react/components/chat/ui/dialog.d.ts.map +1 -0
  260. package/esm/src/react/components/chat/ui/dialog.js +116 -0
  261. package/esm/src/react/components/chat/ui/drawer.d.ts +41 -0
  262. package/esm/src/react/components/chat/ui/drawer.d.ts.map +1 -0
  263. package/esm/src/react/components/chat/ui/drawer.js +92 -0
  264. package/esm/src/react/components/chat/ui/dropdown-menu.d.ts +63 -0
  265. package/esm/src/react/components/chat/ui/dropdown-menu.d.ts.map +1 -0
  266. package/esm/src/react/components/chat/ui/dropdown-menu.js +76 -0
  267. package/esm/src/react/components/chat/ui/file-type.d.ts +26 -0
  268. package/esm/src/react/components/chat/ui/file-type.d.ts.map +1 -0
  269. package/esm/src/react/components/chat/ui/file-type.js +235 -0
  270. package/esm/src/react/components/chat/ui/floating.d.ts +29 -0
  271. package/esm/src/react/components/chat/ui/floating.d.ts.map +1 -0
  272. package/esm/src/react/components/chat/ui/floating.js +90 -0
  273. package/esm/src/react/components/chat/ui/icon-button.d.ts +19 -0
  274. package/esm/src/react/components/chat/ui/icon-button.d.ts.map +1 -0
  275. package/esm/src/react/components/chat/ui/icon-button.js +20 -0
  276. package/esm/src/react/components/chat/ui/index.d.ts +43 -0
  277. package/esm/src/react/components/chat/ui/index.d.ts.map +1 -0
  278. package/esm/src/react/components/chat/ui/index.js +42 -0
  279. package/esm/src/react/components/chat/ui/input.d.ts +27 -0
  280. package/esm/src/react/components/chat/ui/input.d.ts.map +1 -0
  281. package/esm/src/react/components/chat/ui/input.js +41 -0
  282. package/esm/src/react/components/chat/ui/label.d.ts +29 -0
  283. package/esm/src/react/components/chat/ui/label.d.ts.map +1 -0
  284. package/esm/src/react/components/chat/ui/label.js +40 -0
  285. package/esm/src/react/components/chat/ui/list.d.ts +47 -0
  286. package/esm/src/react/components/chat/ui/list.d.ts.map +1 -0
  287. package/esm/src/react/components/chat/ui/list.js +40 -0
  288. package/esm/src/react/components/chat/ui/pill.d.ts +26 -0
  289. package/esm/src/react/components/chat/ui/pill.d.ts.map +1 -0
  290. package/esm/src/react/components/chat/ui/pill.js +39 -0
  291. package/esm/src/react/components/chat/ui/popover.d.ts +47 -0
  292. package/esm/src/react/components/chat/ui/popover.d.ts.map +1 -0
  293. package/esm/src/react/components/chat/ui/popover.js +68 -0
  294. package/esm/src/react/components/chat/ui/progress-bar.d.ts +20 -0
  295. package/esm/src/react/components/chat/ui/progress-bar.d.ts.map +1 -0
  296. package/esm/src/react/components/chat/ui/progress-bar.js +31 -0
  297. package/esm/src/react/components/chat/ui/radio.d.ts +25 -0
  298. package/esm/src/react/components/chat/ui/radio.d.ts.map +1 -0
  299. package/esm/src/react/components/chat/ui/radio.js +29 -0
  300. package/esm/src/react/components/chat/ui/scroll-fade.d.ts +23 -0
  301. package/esm/src/react/components/chat/ui/scroll-fade.d.ts.map +1 -0
  302. package/esm/src/react/components/chat/ui/scroll-fade.js +40 -0
  303. package/esm/src/react/components/chat/ui/select.d.ts +64 -0
  304. package/esm/src/react/components/chat/ui/select.d.ts.map +1 -0
  305. package/esm/src/react/components/chat/ui/select.js +148 -0
  306. package/esm/src/react/components/chat/ui/shimmer.d.ts +25 -0
  307. package/esm/src/react/components/chat/ui/shimmer.d.ts.map +1 -0
  308. package/esm/src/react/components/chat/ui/shimmer.js +24 -0
  309. package/esm/src/react/components/chat/ui/skeleton.d.ts +14 -0
  310. package/esm/src/react/components/chat/ui/skeleton.d.ts.map +1 -0
  311. package/esm/src/react/components/chat/ui/skeleton.js +12 -0
  312. package/esm/src/react/components/chat/ui/slot.d.ts +21 -0
  313. package/esm/src/react/components/chat/ui/slot.d.ts.map +1 -0
  314. package/esm/src/react/components/chat/ui/slot.js +70 -0
  315. package/esm/src/react/components/chat/ui/status.d.ts +28 -0
  316. package/esm/src/react/components/chat/ui/status.d.ts.map +1 -0
  317. package/esm/src/react/components/chat/ui/status.js +23 -0
  318. package/esm/src/react/components/chat/ui/switch.d.ts +34 -0
  319. package/esm/src/react/components/chat/ui/switch.d.ts.map +1 -0
  320. package/esm/src/react/components/chat/ui/switch.js +58 -0
  321. package/esm/src/react/components/chat/ui/tabs.d.ts +44 -0
  322. package/esm/src/react/components/chat/ui/tabs.d.ts.map +1 -0
  323. package/esm/src/react/components/chat/ui/tabs.js +51 -0
  324. package/esm/src/react/components/chat/ui/tag.d.ts +22 -0
  325. package/esm/src/react/components/chat/ui/tag.d.ts.map +1 -0
  326. package/esm/src/react/components/chat/ui/tag.js +27 -0
  327. package/esm/src/react/components/chat/ui/textarea.d.ts +22 -0
  328. package/esm/src/react/components/chat/ui/textarea.d.ts.map +1 -0
  329. package/esm/src/react/components/chat/ui/textarea.js +35 -0
  330. package/esm/src/react/components/chat/ui/tooltip.d.ts +40 -0
  331. package/esm/src/react/components/chat/ui/tooltip.d.ts.map +1 -0
  332. package/esm/src/react/components/chat/ui/tooltip.js +132 -0
  333. package/esm/src/react/primitives/input-box.d.ts.map +1 -1
  334. package/esm/src/react/primitives/input-box.js +17 -4
  335. package/esm/src/server/handlers/dev/framework-candidates.generated.d.ts.map +1 -1
  336. package/esm/src/server/handlers/dev/framework-candidates.generated.js +9437 -1064
  337. package/esm/src/server/handlers/dev/projects/html-shell.d.ts +1 -1
  338. package/esm/src/server/handlers/dev/projects/html-shell.d.ts.map +1 -1
  339. package/esm/src/server/handlers/dev/projects/html-shell.js +1 -12
  340. package/esm/src/server/handlers/request/public-agents-list.handler.d.ts +18 -0
  341. package/esm/src/server/handlers/request/public-agents-list.handler.d.ts.map +1 -0
  342. package/esm/src/server/handlers/request/public-agents-list.handler.js +44 -0
  343. package/esm/src/server/runtime-handler/index.d.ts +1 -1
  344. package/esm/src/server/runtime-handler/index.d.ts.map +1 -1
  345. package/esm/src/server/runtime-handler/index.js +3 -0
  346. package/esm/src/studio/bridge/bridge-bundle.generated.d.ts +1 -1
  347. package/esm/src/studio/bridge/bridge-bundle.generated.d.ts.map +1 -1
  348. package/esm/src/studio/bridge/bridge-bundle.generated.js +3 -2
  349. package/esm/src/utils/version-constant.d.ts +1 -1
  350. package/esm/src/utils/version-constant.js +1 -1
  351. package/esm/src/workflow/blob/local-storage.d.ts +32 -0
  352. package/esm/src/workflow/blob/local-storage.d.ts.map +1 -0
  353. package/esm/src/workflow/blob/local-storage.js +179 -0
  354. package/esm/src/workflow/blob/types.d.ts +5 -0
  355. package/esm/src/workflow/blob/types.d.ts.map +1 -1
  356. package/esm/src/workflow/blob/veryfront-cloud-storage.d.ts +11 -0
  357. package/esm/src/workflow/blob/veryfront-cloud-storage.d.ts.map +1 -1
  358. package/esm/src/workflow/blob/veryfront-cloud-storage.js +36 -0
  359. package/package.json +5 -1
  360. package/esm/src/react/components/chat/chat/components/uploads-panel.d.ts +0 -20
  361. package/esm/src/react/components/chat/chat/components/uploads-panel.d.ts.map +0 -1
  362. package/esm/src/react/components/chat/chat/components/uploads-panel.js +0 -49
  363. package/esm/src/react/components/chat/chat/contexts/thread-list-context.d.ts +0 -28
  364. package/esm/src/react/components/chat/chat/contexts/thread-list-context.d.ts.map +0 -1
  365. package/esm/src/react/components/chat/chat/contexts/thread-list-context.js +0 -27
  366. package/esm/src/react/components/chat/chat/hooks/use-threads.d.ts +0 -28
  367. package/esm/src/react/components/chat/chat/hooks/use-threads.d.ts.map +0 -1
  368. package/esm/src/react/components/chat/chat/hooks/use-threads.js +0 -151
  369. package/esm/src/react/components/chat/chat-with-sidebar.d.ts +0 -110
  370. package/esm/src/react/components/chat/chat-with-sidebar.d.ts.map +0 -1
  371. package/esm/src/react/components/chat/chat-with-sidebar.js +0 -167
  372. package/esm/src/react/components/chat/message.d.ts +0 -42
  373. package/esm/src/react/components/chat/message.d.ts.map +0 -1
  374. package/esm/src/react/components/chat/message.js +0 -69
@@ -10,23 +10,21 @@
10
10
  *
11
11
  * export default function Page() {
12
12
  * const chat = useChat();
13
- * return (
14
- * <Chat
15
- * messages={chat.messages}
16
- * input={chat.input}
17
- * onChange={chat.handleInputChange}
18
- * onSubmit={chat.handleSubmit}
19
- * />
20
- * );
13
+ * return <Chat chat={chat} />;
21
14
  * }
22
15
  * ```
23
16
  *
17
+ * @example App mode (black box — no wiring)
18
+ * ```tsx
19
+ * <Chat agentId="support" api="/api/ag-ui" />
20
+ * ```
21
+ *
24
22
  * @example Custom layout (composition)
25
23
  * ```tsx
26
24
  * <Chat.Root messages={messages} input={input}>
27
25
  * <Chat.Empty title="Ask anything" />
28
26
  * <Chat.MessageList messages={messages} />
29
- * <Chat.Composer input={input} onChange={onChange} />
27
+ * <Chat.Input input={input} onChange={onChange} />
30
28
  * </Chat.Root>
31
29
  * ```
32
30
  *
@@ -44,94 +42,140 @@
44
42
  * @module react/components/chat
45
43
  */
46
44
  import * as React from "../../../../../react/react.js";
47
- import { useVoiceInput } from "../../../../agent/react/index.js";
45
+ import { useChat, useVoiceInput } from "../../../../agent/react/index.js";
46
+ import { useAgentMetadata } from "../../../../agent/react/use-agent-metadata.js";
48
47
  import { defaultChatTheme, mergeThemes } from "../theme.js";
48
+ import { useUpload } from "./hooks/use-upload.js";
49
49
  // Composition imports (used in the Chat preset)
50
50
  import { ChatRoot } from "./composition/chat-root.js";
51
- import { ChatComposer } from "./composition/chat-composer.js";
51
+ import { ChatInput } from "./composition/chat-composer.js";
52
52
  import { ChatMessageList } from "./composition/chat-message-list.js";
53
53
  import { ChatEmpty } from "./composition/chat-empty.js";
54
+ import { AgentAvatar } from "./composition/agent-avatar.js";
54
55
  import { ChatIf } from "./composition/chat-if.js";
55
56
  import { ErrorBanner } from "./composition/error-banner.js";
56
57
  import { Message } from "./composition/message.js";
57
- import { DropZoneOverlay } from "./components/drop-zone.js";
58
+ import { ChatMessagesSkeleton } from "./components/chat-messages-skeleton.js";
58
59
  import { TabSwitcher } from "./components/tab-switcher.js";
59
- import { UploadsPanel } from "./components/uploads-panel.js";
60
+ import { AttachmentsPanel } from "./components/attachments-panel.js";
60
61
  import { InferenceBadge } from "./components/inference-badge.js";
61
62
  import { QuickActions as QuickActionsComponent } from "./components/quick-actions.js";
62
63
  // ---------------------------------------------------------------------------
63
64
  // Re-exports — sub-components
64
65
  // ---------------------------------------------------------------------------
65
66
  export { FadeIn, Loader, Shimmer } from "./components/animations.js";
66
- export { ReasoningCard } from "./components/reasoning.js";
67
+ export { Reasoning, ReasoningCard, useReasoning, } from "./components/reasoning.js";
67
68
  export { ConversationEmptyState, ConversationScrollButton, Suggestion, Suggestions, } from "./components/empty-state.js";
68
- export { MessageActions } from "./components/message-actions.js";
69
+ export { MessageActionBar } from "./components/message-actions.js";
69
70
  export { MessageEditForm } from "./components/message-edit-form.js";
70
71
  export { BranchPicker } from "./components/branch-picker.js";
71
72
  export { DropZoneOverlay } from "./components/drop-zone.js";
73
+ export { ChatMessagesSkeleton, } from "./components/chat-messages-skeleton.js";
72
74
  export { SkillBadge } from "./components/skill-badge.js";
73
- export { ToolCallCard, ToolStatusBadge } from "./components/tool-ui.js";
75
+ export { ToolCall, ToolCallCard, ToolStatusBadge, useToolCall, } from "./components/tool-ui.js";
74
76
  export { InferenceBadge } from "./components/inference-badge.js";
75
- export { Sources } from "./components/sources.js";
77
+ export { SourcePill, Sources, useSources, } from "./components/sources.js";
76
78
  export { InlineCitation } from "./components/inline-citation.js";
77
79
  export { MessageFeedback, } from "./components/message-feedback.js";
78
- export { AttachmentPill, } from "./components/attachment-pill.js";
80
+ export { AttachmentPill, useAttachmentPill, } from "./components/attachment-pill.js";
79
81
  export { RichCodeBlock } from "./components/code-block.js";
80
- export { StepIndicator } from "./components/step-indicator.js";
81
- export { ChatSidebar } from "./components/sidebar.js";
82
+ export { StepIndicator, useStepIndicator, } from "./components/step-indicator.js";
83
+ // The sub-components (`ChatSidebar.Root` / `.Item` / …) hang off the compound
84
+ // object, so only the preset needs to be a runtime export. The rest are
85
+ // type-only — they annotate props without widening the public runtime surface.
86
+ export { ChatSidebar, } from "./components/sidebar.js";
82
87
  export { TabSwitcher } from "./components/tab-switcher.js";
83
88
  export { QuickActions, } from "./components/quick-actions.js";
84
- export { UploadsPanel, } from "./components/uploads-panel.js";
89
+ export { AttachmentsPanel, useAttachmentsPanel, } from "./components/attachments-panel.js";
85
90
  // Re-exports — hooks
86
- export { useThreads, } from "./hooks/use-threads.js";
91
+ export { useConversations, } from "./hooks/use-conversations.js";
92
+ export { useConversation, } from "./hooks/use-conversation.js";
93
+ export { ConversationsContextProvider, ConversationsProvider, useConversationsContext, useConversationsContextOptional, } from "./contexts/conversations-context.js";
94
+ // Local binding for the `<Chat>` optional-provider integration below (the line
95
+ // above only re-exports; it does not import the name for use in this module).
96
+ import { useConversationsContextOptional } from "./contexts/conversations-context.js";
97
+ import { createEmptyConversation, DEFAULT_CONVERSATION_TITLE, deriveTitle, } from "./hooks/use-conversations.js";
98
+ export { localConversationStore, } from "./persistence/local-conversation-store.js";
99
+ export { memoryConversationStore } from "./persistence/memory-conversation-store.js";
100
+ export { useUpload } from "./hooks/use-upload.js";
101
+ export { useUploadsRegistry, } from "./hooks/use-uploads-registry.js";
102
+ export { useStickToBottom, } from "./hooks/use-stick-to-bottom.js";
87
103
  // Re-exports — utils
88
104
  export { extractSourcesFromParts, getTextContent, groupPartsInOrder, isReasoningPart, isSkillToolPart, isToolPart, } from "./utils/message-parts.js";
89
105
  export { downloadMarkdown, exportAsMarkdown } from "./utils/export.js";
90
106
  // Re-exports — composition
91
- export { AgentAvatar, ChatComposer, ChatEmpty, ChatIf, ChatMessageList, ChatRoot, ErrorBanner, Message, ModelAvatar, } from "./composition/api.js";
107
+ export { AgentAvatar, ChatEmpty, ChatEmptyState, ChatIf, ChatInput, ChatMessageList, ChatRoot, ErrorBanner, Message, ModelAvatar, } from "./composition/api.js";
92
108
  // Re-exports — contexts
93
- export { ChatContextProvider, ComposerContextProvider, MessageContextProvider, ThreadListContextProvider, useChatContext, useChatContextOptional, useComposerContext, useComposerContextOptional, useMessageContext, useMessageContextOptional, useThreadListContext, useThreadListContextOptional, } from "./contexts/index.js";
109
+ export { ChatContextProvider, ComposerContextProvider, MessageContextProvider, useChatContext, useChatContextOptional, useComposerContext, useComposerContextOptional, useMessageContext, useMessageContextOptional, } from "./contexts/index.js";
94
110
  // ---------------------------------------------------------------------------
95
111
  // Chat — Preset component
96
112
  //
97
- // Composes ChatRoot, ChatMessageList, ChatComposer, ChatEmpty, etc. into a
113
+ // Composes ChatRoot, ChatMessageList, ChatInput, ChatEmpty, etc. into a
98
114
  // full-featured chat UI with sensible defaults. For custom layouts, use the
99
115
  // building blocks directly.
100
116
  // ---------------------------------------------------------------------------
101
- /** Render chat. */
102
- export const Chat = React.forwardRef(function Chat({ messages, input, onChange, onSubmit, stop, reload, enableVoice = false, onVoice, setInput, isLoading, error, placeholder = "Type a message...", maxHeight = "100%", className, theme: userTheme, renderMessage, renderTool, suggestions, onSuggestionClick, emptyState, showScrollButton = false, showMessageActions = true, models, model, activeModel, onModelChange, inferenceMode, showSources = false, onSourceClick, onAttach, onSelectAttachment, onDrop, attachAccept, attachments, onRemoveAttachment, showExport = false, onFeedback, editMessage, getBranches, switchBranch, showSteps = false, showTabs = false, activeTab: controlledTab, onTabChange: controlledTabChange, uploads, onRemoveUpload, quickActions, onQuickAction, hideTabSwitcher = false, children, }, ref) {
103
- const theme = React.useMemo(() => mergeThemes(defaultChatTheme, userTheme), [userTheme]);
104
- // --- Drag-and-drop ---
105
- const dropHandler = onDrop ?? onAttach;
106
- const [dragOver, setDragOver] = React.useState(false);
107
- const dragCounter = React.useRef(0);
108
- const handleDragEnter = React.useCallback((e) => {
109
- e.preventDefault();
110
- e.stopPropagation();
111
- dragCounter.current++;
112
- if (e.dataTransfer.types.includes("Files"))
113
- setDragOver(true);
114
- }, []);
115
- const handleDragLeave = React.useCallback((e) => {
116
- e.preventDefault();
117
- e.stopPropagation();
118
- dragCounter.current--;
119
- if (dragCounter.current === 0)
120
- setDragOver(false);
121
- }, []);
122
- const handleDragOver = React.useCallback((e) => {
123
- e.preventDefault();
124
- e.stopPropagation();
125
- }, []);
126
- const handleFileDrop = React.useCallback((e) => {
127
- e.preventDefault();
128
- e.stopPropagation();
129
- dragCounter.current = 0;
130
- setDragOver(false);
131
- if (e.dataTransfer.files.length > 0 && dropHandler) {
132
- dropHandler(e.dataTransfer.files);
117
+ /** Render the controlled chat (caller supplies `messages`/`input`). */
118
+ const ControlledChat = React.forwardRef(function ControlledChat({ messages = [], input = "", onChange = () => { }, onSubmit, sendMessage, stop, reload, enableVoice = false, onVoice, setInput, isLoading, error, placeholder = "Type a message...", maxHeight = "100%", className, theme: userTheme, renderMessage, renderTool, suggestions, onSuggestionClick, emptyState, initializing = false, skeleton, agent, showScrollButton = false, showMessageActions = true, models, model, activeModel, onModelChange, inferenceMode, showSources = false, onSourceClick, enableAttachments = true, uploadApi, onAttach, onSelectAttachment, onDrop, attachAccept, attachments, onRemoveAttachment, showExport = false, onFeedback, editMessage, getBranches, switchBranch, showSteps = false, showTabs = false, activeTab: controlledTab, onTabChange: controlledTabChange, uploads, onRemoveUpload, quickActions, onQuickAction, toolbarStart, hideTabSwitcher = false, children, }, ref) {
119
+ const theme = React.useMemo(() => mergeThemes(defaultChatTheme, userTheme), [
120
+ userTheme,
121
+ ]);
122
+ // --- Attachments (batteries-included) ---
123
+ // The composer's `+` menu and drag-to-attach are on by default: when the
124
+ // caller wires none of the attachment props, `<Chat>` manages the pending
125
+ // files itself so `<Chat />` "just works". Pass any attachment prop to take
126
+ // control; pass `enableAttachments={false}` to hide the control entirely.
127
+ const isAttachControlled = onAttach !== undefined ||
128
+ onDrop !== undefined ||
129
+ attachments !== undefined ||
130
+ onRemoveAttachment !== undefined ||
131
+ onSelectAttachment !== undefined;
132
+ // When the caller wires no attachment props, `<Chat>` self-manages pending
133
+ // files through `useUpload` — the SAME hook app-mode uses — so drag/`+`
134
+ // uploads get an instant thumbnail (`preview`) and a resolved `url` (base64
135
+ // `data:` by default, or a durable POST when `uploadApi` is set). The old
136
+ // path only recorded name/size, so pills had no preview and never sent.
137
+ const upload = useUpload({ api: uploadApi });
138
+ const manageAttachments = enableAttachments && !isAttachControlled;
139
+ const effectiveOnAttach = !enableAttachments
140
+ ? undefined
141
+ : isAttachControlled
142
+ ? onAttach
143
+ : upload.upload;
144
+ const effectiveOnDrop = !enableAttachments
145
+ ? undefined
146
+ : isAttachControlled
147
+ ? onDrop
148
+ : upload.upload;
149
+ const effectiveAttachments = isAttachControlled ? attachments : upload.attachments;
150
+ const effectiveOnRemove = !enableAttachments
151
+ ? undefined
152
+ : isAttachControlled
153
+ ? onRemoveAttachment
154
+ : upload.remove;
155
+ // Self-managed attachments must ride along on submit: the caller's
156
+ // `onSubmit` only carries the input text, so fold the uploaded files into
157
+ // `sendMessage({ text, files })` (then clear). Falls back to `onSubmit` for
158
+ // a text-only turn, when the caller controls attachments, or when no
159
+ // `sendMessage` is available.
160
+ const handleSubmit = React.useCallback((e) => {
161
+ if (manageAttachments && sendMessage) {
162
+ // Wait for pending uploads: sending now would carry only the resolved
163
+ // files and silently drop the one still in flight.
164
+ if (hasPendingAttachments(upload.attachments)) {
165
+ e?.preventDefault();
166
+ return;
167
+ }
168
+ const files = attachmentsToFileParts(upload.attachments);
169
+ if (files.length > 0) {
170
+ e?.preventDefault();
171
+ void sendMessage({ text: input.trim(), files });
172
+ setInput?.("");
173
+ upload.clear();
174
+ return;
175
+ }
133
176
  }
134
- }, [dropHandler]);
177
+ onSubmit?.(e);
178
+ }, [manageAttachments, sendMessage, upload, input, setInput, onSubmit]);
135
179
  // --- Tab state ---
136
180
  const [internalTab, setInternalTab] = React.useState("chat");
137
181
  const currentTab = controlledTab ?? internalTab;
@@ -152,37 +196,287 @@ export const Chat = React.forwardRef(function Chat({ messages, input, onChange,
152
196
  return undefined;
153
197
  }, [onVoice, enableVoice, voice.isSupported, voice.toggle, setInput]);
154
198
  const isEmpty = messages.length === 0;
155
- const isDocsTab = showTabs && currentTab === "uploads";
156
- const dragProps = dropHandler
157
- ? {
158
- onDragEnter: handleDragEnter,
159
- onDragLeave: handleDragLeave,
160
- onDragOver: handleDragOver,
161
- onDrop: handleFileDrop,
162
- }
163
- : {};
164
- return (React.createElement(ChatRoot, { ref: ref, messages: messages, input: input, isLoading: isLoading, error: error, setInput: setInput, onSubmit: onSubmit, onStop: stop, onReload: reload, model: model, models: models, onModelChange: onModelChange, attachments: attachments, onAttach: onAttach, onRemoveAttachment: onRemoveAttachment, editMessage: editMessage, getBranches: getBranches, switchBranch: switchBranch, onFeedback: onFeedback, showSources: showSources, onSourceClick: onSourceClick, theme: userTheme, maxHeight: maxHeight, className: className, ...dragProps },
165
- dropHandler && React.createElement(DropZoneOverlay, { visible: dragOver, accept: attachAccept }),
199
+ const isDocsTab = showTabs && currentTab === "attachments";
200
+ return (React.createElement(ChatRoot, { ref: ref, messages: messages, input: input, isLoading: isLoading, error: error, setInput: setInput, onSubmit: handleSubmit, onStop: stop, onReload: reload, model: model, models: models, onModelChange: onModelChange, agent: agent, attachments: effectiveAttachments, onAttach: effectiveOnAttach, onRemoveAttachment: effectiveOnRemove, editMessage: editMessage, getBranches: getBranches, switchBranch: switchBranch, onFeedback: onFeedback, showSources: showSources, onSourceClick: onSourceClick, theme: userTheme, maxHeight: maxHeight, className: className },
166
201
  showTabs && !hideTabSwitcher && (React.createElement(TabSwitcher, { activeTab: currentTab, onTabChange: handleTabChange })),
167
202
  isDocsTab
168
- ? (React.createElement(UploadsPanel, { uploads: uploads, onRemoveUpload: onRemoveUpload, onAttach: onAttach, attachAccept: attachAccept, className: "flex-1 min-h-0" }))
169
- : isEmpty
170
- ? (React.createElement(ChatEmpty, { icon: emptyState?.icon, title: emptyState?.title, description: emptyState?.description, suggestions: suggestions, onSuggestionClick: onSuggestionClick }))
171
- : (React.createElement(ChatMessageList, { messages: messages, isLoading: isLoading, theme: theme, renderMessage: renderMessage, renderTool: renderTool, model: activeModel || model, showMessageActions: showMessageActions, showSources: showSources, showSteps: showSteps, showScrollButton: showScrollButton, onSourceClick: onSourceClick, inferenceMode: inferenceMode, editMessage: editMessage, getBranches: getBranches, switchBranch: switchBranch, onFeedback: onFeedback })),
203
+ ? (React.createElement(AttachmentsPanel, { uploads: uploads, onRemoveUpload: onRemoveUpload, onAttach: effectiveOnAttach, attachAccept: attachAccept, onClose: () => handleTabChange("chat"), className: "flex-1 min-h-0" }))
204
+ : isEmpty && (isLoading || initializing)
205
+ // Thread still loading its history (or agent metadata still
206
+ // resolving) skeleton, not an idle placeholder.
207
+ ? (skeleton ?? React.createElement(ChatMessagesSkeleton, null))
208
+ : isEmpty && emptyState
209
+ // Idle hero is opt-in: only rendered when the consumer supplies an
210
+ // `emptyState`. Otherwise an empty thread is just a blank canvas +
211
+ // composer — no "What can I help with?" placeholder.
212
+ ? (React.createElement(ChatEmpty, { icon: emptyState.icon, title: emptyState.title, description: emptyState.description, suggestions: suggestions, onSuggestionClick: onSuggestionClick }))
213
+ : (React.createElement(ChatMessageList, { messages: messages, isLoading: isLoading, theme: theme, renderMessage: renderMessage, renderTool: renderTool, model: activeModel || model, showMessageActions: showMessageActions, showSources: showSources, showSteps: showSteps, showScrollButton: showScrollButton, onSourceClick: onSourceClick, inferenceMode: inferenceMode, editMessage: editMessage, getBranches: getBranches, switchBranch: switchBranch, onFeedback: onFeedback })),
172
214
  error && React.createElement(ErrorBanner, { error: error, onRetry: reload }),
173
- !isDocsTab && (React.createElement(ChatComposer, { input: voice.isListening ? voice.transcript || input : input, onChange: onChange, onSubmit: onSubmit, isLoading: isLoading, placeholder: voice.isListening ? "Listening..." : placeholder, theme: theme, stop: voice.isListening ? undefined : stop, onVoice: voiceHandler, isListening: voice.isListening, transcript: voice.transcript, models: models, model: model, onModelChange: onModelChange, onAttach: onAttach, onSelectAttachment: onSelectAttachment, attachAccept: attachAccept, attachments: attachments, onRemoveAttachment: onRemoveAttachment, showExport: showExport, messages: messages },
215
+ !isDocsTab && (React.createElement(ChatInput, { input: voice.isListening ? voice.transcript || input : input, onChange: onChange, onSubmit: handleSubmit, isLoading: isLoading, placeholder: voice.isListening ? "Listening..." : placeholder, theme: theme, stop: voice.isListening ? undefined : stop, onVoice: voiceHandler, isListening: voice.isListening, transcript: voice.transcript, models: models, model: model, onModelChange: onModelChange, onAttach: effectiveOnAttach, onSelectAttachment: onSelectAttachment, onDrop: effectiveOnDrop, attachAccept: attachAccept, attachments: effectiveAttachments, onRemoveAttachment: effectiveOnRemove, showExport: showExport, messages: messages, toolbarStart: toolbarStart },
174
216
  inferenceMode && inferenceMode !== "cloud" && (React.createElement(InferenceBadge, { inferenceMode: inferenceMode })),
175
217
  isEmpty && quickActions && quickActions.length > 0 && (React.createElement(QuickActionsComponent, { actions: quickActions, onActionClick: onQuickAction })))),
176
218
  children));
177
219
  });
178
- Chat.displayName = "Chat";
220
+ ControlledChat.displayName = "ControlledChat";
221
+ /**
222
+ * Map agent-metadata suggestions to `{ label, prompt }`. The chip shows the
223
+ * short `title` ("Triage login issue") while the click sends the full `prompt`
224
+ * ("Triage a customer who cannot sign in after a release.") — so the empty
225
+ * state stays scannable without truncating what the agent actually receives.
226
+ */
227
+ function agentSuggestionItems(suggestions) {
228
+ const list = suggestions?.suggestions;
229
+ if (!Array.isArray(list))
230
+ return [];
231
+ return list.flatMap((s) => {
232
+ if (s.type !== "prompt" || !("prompt" in s) || !s.prompt)
233
+ return [];
234
+ const title = s.title;
235
+ const label = typeof title === "string" && title.length > 0 ? title : s.prompt;
236
+ return [{ label, prompt: s.prompt }];
237
+ });
238
+ }
239
+ /**
240
+ * Map uploaded attachments to `file` message parts. Only attachments that
241
+ * finished uploading (have a resolved `url`) are sent — pending/errored ones
242
+ * are skipped so a half-uploaded file never reaches the agent.
243
+ */
244
+ function attachmentsToFileParts(items) {
245
+ return items
246
+ .filter((a) => Boolean(a.url))
247
+ .map((a) => ({
248
+ type: "file",
249
+ mediaType: a.type ?? "application/octet-stream",
250
+ url: a.url,
251
+ filename: a.name,
252
+ ...(a.size != null ? { size: a.size } : {}),
253
+ }));
254
+ }
255
+ /** True while any attachment is still resolving its `url`; submits must wait
256
+ * or the fold above would silently drop the pending file. */
257
+ function hasPendingAttachments(items) {
258
+ return items.some((a) => a.state === "uploading" || a.state === "processing");
259
+ }
260
+ const UncontrolledChat = React.forwardRef(function UncontrolledChat({ agentId, api = "/api/ag-ui", initialMessages, onError, onUpdate, models, suggestions: suggestionsProp, onSuggestionClick, emptyState,
261
+ // App mode defaults the scroll-to-bottom button on (batteries-included).
262
+ showScrollButton = true,
263
+ // Attachments: default-wired through `useUpload` unless the caller
264
+ // controls them. With no `uploadApi`, files inline as base64 `data:` URLs
265
+ // (guest mode — zero backend). Set `uploadApi` to POST to a durable
266
+ // upload endpoint (multipart `file` → `{ url }`) for real users + a project.
267
+ uploadApi, enableAttachments = true, onAttach: userOnAttach, onDrop: userOnDrop, attachments: userAttachments, onRemoveAttachment: userOnRemoveAttachment, onSubmit: userOnSubmit, ...rest }, ref) {
268
+ // Inside a `ConversationsProvider`, bind to the active conversation — seed
269
+ // from its messages/agent and persist changes back. No props: the context
270
+ // carries it, so standalone `<Chat>` (no provider) is unchanged. `active`
271
+ // must match `activeId` so we never seed from a still-loading thread.
272
+ const conversations = useConversationsContextOptional();
273
+ const bound = conversations?.active && conversations.active.id === conversations.activeId
274
+ ? conversations.active
275
+ : null;
276
+ const resolvedAgentId = bound?.agentId ?? agentId;
277
+ const chat = useChat({
278
+ api,
279
+ initialMessages: bound ? bound.messages : initialMessages,
280
+ onError,
281
+ body: resolvedAgentId ? { agentId: resolvedAgentId } : undefined,
282
+ });
283
+ const { agent, error: agentError } = useAgentMetadata(resolvedAgentId);
284
+ // --- Persistence sink (explicit prop → provider default → ephemeral) ------
285
+ // Resolve WHERE the live thread persists: an explicit `onUpdate` wins, else
286
+ // a surrounding `ConversationsProvider`'s `save`, else nothing. The sink
287
+ // takes the whole updated conversation; `<Chat>` owns building it (title
288
+ // included) so `useConversations` stays dumb about titling and `useChat`
289
+ // never touches the store.
290
+ const persist = onUpdate ?? conversations?.save;
291
+ // Identity for the emitted conversation: in a provider we ride the bound
292
+ // conversation (id/agentId/createdAt); standalone (explicit `onUpdate`, no
293
+ // provider) we mint one stable id so updates target a single record.
294
+ const syntheticRef = React.useRef(null);
295
+ const persistRef = React.useRef(persist);
296
+ persistRef.current = persist;
297
+ const boundRef = React.useRef(bound);
298
+ boundRef.current = bound;
299
+ const agentIdRef = React.useRef(resolvedAgentId);
300
+ agentIdRef.current = resolvedAgentId;
301
+ // Emit the whole conversation when the live messages change. Keyed on
302
+ // `chat.messages` + `boundId` only (sink/identity read via refs) so the
303
+ // save→setActive round-trip inside a provider can't feed a render loop.
304
+ // Seeded with the mount-time messages so merely *opening* a thread never
305
+ // re-saves it (a fresh `updatedAt` would jump it to the top of the sidebar).
306
+ const boundId = bound?.id;
307
+ const lastEmittedRef = React.useRef(null);
308
+ if (lastEmittedRef.current === null)
309
+ lastEmittedRef.current = chat.messages;
310
+ React.useEffect(() => {
311
+ const sink = persistRef.current;
312
+ if (!sink)
313
+ return;
314
+ if (chat.messages === lastEmittedRef.current)
315
+ return;
316
+ lastEmittedRef.current = chat.messages;
317
+ let base = boundRef.current;
318
+ if (!base) {
319
+ syntheticRef.current ??= createEmptyConversation({ agentId: agentIdRef.current });
320
+ base = syntheticRef.current;
321
+ }
322
+ const keepTitle = base.title !== "" && base.title !== DEFAULT_CONVERSATION_TITLE;
323
+ const title = keepTitle ? base.title : (deriveTitle(chat.messages) || base.title);
324
+ const conversation = {
325
+ ...base,
326
+ messages: chat.messages,
327
+ title,
328
+ updatedAt: Date.now(),
329
+ };
330
+ // Fold the derived title back onto the synthetic identity so later emits
331
+ // don't re-derive it every keystroke of a streamed reply.
332
+ if (base === syntheticRef.current)
333
+ syntheticRef.current = conversation;
334
+ sink(conversation);
335
+ }, [chat.messages, boundId]);
336
+ // App mode owns the loading signal: from the very first paint until the
337
+ // agent resolves (or errors) we render the skeleton — never flash an idle
338
+ // placeholder first. Keyed off "agent not yet here" rather than the hook's
339
+ // `isLoading` flag so there's no one-frame gap on mount. Works out of the
340
+ // box — no `isLoading` wiring from the consumer.
341
+ const agentInitializing = Boolean(resolvedAgentId) && !agent && !agentError;
342
+ // Agent-driven empty state: avatar + name + description, shown once the
343
+ // agent resolves (the skeleton covers the load, so the generic
344
+ // "What can I help with?" placeholder never flashes). A consumer-supplied
345
+ // `emptyState` still wins.
346
+ const derivedEmptyState = React.useMemo(() => {
347
+ if (emptyState)
348
+ return emptyState;
349
+ if (!agent)
350
+ return undefined;
351
+ return {
352
+ icon: (React.createElement(AgentAvatar, { name: agent.name, avatarUrl: agent.avatarUrl ?? undefined, className: "size-12" })),
353
+ title: agent.name,
354
+ description: agent.description ?? undefined,
355
+ };
356
+ }, [emptyState, agent]);
357
+ // Chips show the short `title`; the click sends the full `prompt`.
358
+ const suggestionItems = React.useMemo(() => agentSuggestionItems(agent?.suggestions), [agent]);
359
+ const derivedSuggestions = suggestionsProp ??
360
+ (suggestionItems.length > 0 ? suggestionItems.map((s) => s.label) : undefined);
361
+ const handleSuggestion = onSuggestionClick ??
362
+ ((label) => {
363
+ const item = suggestionItems.find((s) => s.label === label);
364
+ void chat.sendMessage({ text: item?.prompt ?? label });
365
+ });
366
+ // Batteries-included attachments: unless the caller controls them, files
367
+ // uploaded via the `+` menu / drag land here, ride along on submit as
368
+ // `file` parts, and clear once sent.
369
+ const upload = useUpload({ api: uploadApi });
370
+ const attachControlled = userOnAttach !== undefined ||
371
+ userOnDrop !== undefined ||
372
+ userAttachments !== undefined ||
373
+ userOnRemoveAttachment !== undefined;
374
+ const manageAttachments = enableAttachments && !attachControlled;
375
+ const submitWithAttachments = React.useCallback((e) => {
376
+ e?.preventDefault();
377
+ if (chat.isLoading)
378
+ return;
379
+ // Never send while a file is still uploading: the fold below only
380
+ // carries resolved urls, so submitting now would silently drop the
381
+ // pending attachment (and `clear()` would abort its upload).
382
+ if (hasPendingAttachments(upload.attachments))
383
+ return;
384
+ const text = chat.input.trim();
385
+ const files = attachmentsToFileParts(upload.attachments);
386
+ if (!text && files.length === 0)
387
+ return;
388
+ chat.setInput("");
389
+ upload.clear();
390
+ void chat.sendMessage({ text, files });
391
+ }, [chat, upload]);
392
+ return (React.createElement(ControlledChat, { ref: ref, messages: chat.messages, input: chat.input, onChange: chat.onChange, onSubmit: manageAttachments ? submitWithAttachments : (userOnSubmit ?? chat.onSubmit), stop: chat.stop, reload: () => void chat.reload(), setInput: chat.setInput, isLoading: chat.isLoading, error: chat.error, model: chat.model, activeModel: chat.activeModel, onModelChange: chat.onModelChange, inferenceMode: chat.inferenceMode, models: models, editMessage: chat.editMessage, getBranches: chat.getBranches, switchBranch: chat.switchBranch, emptyState: derivedEmptyState, agent: agent ? { name: agent.name, avatarUrl: agent.avatarUrl ?? undefined } : undefined, initializing: agentInitializing, suggestions: derivedSuggestions, onSuggestionClick: handleSuggestion, showScrollButton: showScrollButton, enableAttachments: enableAttachments, onAttach: manageAttachments ? upload.upload : userOnAttach, onDrop: manageAttachments ? upload.upload : userOnDrop, attachments: manageAttachments ? upload.attachments : userAttachments, onRemoveAttachment: manageAttachments ? upload.remove : userOnRemoveAttachment, ...rest }));
393
+ });
394
+ UncontrolledChat.displayName = "UncontrolledChat";
395
+ /**
396
+ * App-mode `<Chat>` with conversation-thread lifecycle when a
397
+ * `ConversationsProvider` is present: keys by the active id so switching threads
398
+ * remounts `UncontrolledChat` (fresh `useChat` seed), and holds the skeleton
399
+ * while the active thread's messages load from the store. No provider → renders
400
+ * `UncontrolledChat` unchanged.
401
+ */
402
+ const ConversationBoundChat = React.forwardRef(function ConversationBoundChat(props, ref) {
403
+ const conversations = useConversationsContextOptional();
404
+ if (!conversations || conversations.activeId == null) {
405
+ return React.createElement(UncontrolledChat, { ref: ref, ...props });
406
+ }
407
+ const { active, activeId } = conversations;
408
+ // Wait for the active thread's messages before mounting, so `useChat` seeds
409
+ // from the right thread rather than a still-loading one.
410
+ if (active?.id !== activeId) {
411
+ return React.createElement(React.Fragment, null, props.skeleton ?? React.createElement(ChatMessagesSkeleton, null));
412
+ }
413
+ return React.createElement(UncontrolledChat, { key: activeId, ref: ref, ...props });
414
+ });
415
+ ConversationBoundChat.displayName = "ConversationBoundChat";
416
+ /**
417
+ * Normalize the consolidated `chat={useChat()}` / `agent={…}` objects onto the
418
+ * flat props `ControlledChat` consumes. The object API wins; the legacy flat
419
+ * props remain as a one-release fallback. Agent-driven content (`models`,
420
+ * `suggestions`) folds in too.
421
+ */
422
+ function resolveControlledProps(props) {
423
+ const { chat, agent } = props;
424
+ const merged = {
425
+ ...props,
426
+ models: agent?.models ?? props.models,
427
+ suggestions: props.suggestions ?? agent?.suggestions,
428
+ };
429
+ if (chat) {
430
+ merged.messages = chat.messages;
431
+ merged.input = chat.input;
432
+ merged.onChange = chat.onChange;
433
+ merged.onSubmit = props.onSubmit ?? chat.onSubmit;
434
+ merged.sendMessage = chat.sendMessage;
435
+ merged.stop = chat.stop;
436
+ merged.reload = () => void chat.reload();
437
+ merged.setInput = chat.setInput;
438
+ merged.isLoading = chat.isLoading;
439
+ merged.error = chat.error;
440
+ merged.model = chat.model;
441
+ merged.activeModel = chat.activeModel;
442
+ merged.onModelChange = chat.onModelChange;
443
+ merged.inferenceMode = chat.inferenceMode;
444
+ merged.editMessage = chat.editMessage;
445
+ merged.getBranches = chat.getBranches;
446
+ merged.switchBranch = chat.switchBranch;
447
+ }
448
+ return merged;
449
+ }
450
+ /**
451
+ * Chat — batteries-included chat surface.
452
+ *
453
+ * - **App mode (uncontrolled):** omit `chat`/`messages` and pass `agentId` +
454
+ * `api`; `<Chat>` wires `useChat` + `useAgentMetadata` internally. Inside a
455
+ * `ConversationsProvider` it also binds to the active conversation.
456
+ * - **Controlled mode:** pass `chat={useChat()}` (preferred) or the legacy
457
+ * flat `messages` + `input` props to drive it yourself.
458
+ */
459
+ const ChatBase = React.forwardRef(function Chat(props, ref) {
460
+ // Controlled when the caller supplies a `chat` session (or the legacy flat
461
+ // message/input state); otherwise the component self-drives (app mode).
462
+ const isControlled = props.chat !== undefined ||
463
+ (props.messages !== undefined && props.input !== undefined);
464
+ return isControlled
465
+ ? React.createElement(ControlledChat, { ref: ref, ...resolveControlledProps(props) })
466
+ : React.createElement(ConversationBoundChat, { ref: ref, ...props });
467
+ });
468
+ ChatBase.displayName = "Chat";
179
469
  /** Render chat components. */
180
- export const ChatComponents = Object.assign(Chat, {
470
+ export const Chat = Object.assign(ChatBase, {
181
471
  Root: ChatRoot,
182
472
  MessageList: ChatMessageList,
183
- Composer: ChatComposer,
473
+ Input: ChatInput,
474
+ Composer: ChatInput,
184
475
  Empty: ChatEmpty,
476
+ Skeleton: ChatMessagesSkeleton,
185
477
  If: ChatIf,
186
478
  Message: Message,
187
479
  ErrorBanner: ErrorBanner,
188
480
  });
481
+ /** @deprecated Back-compat alias — `Chat` is now the compound itself. */
482
+ export const ChatComponents = Chat;
@@ -0,0 +1,63 @@
1
+ /**
2
+ * ConversationStore — the async, swappable persistence adapter behind
3
+ * {@link useConversations}. Mirrors the `BlobStorage` / `CacheStore` house
4
+ * style: async methods, one action per method, optional capability methods.
5
+ *
6
+ * Swap the whole store (localStorage / IndexedDB / your API) or override a
7
+ * single action by wrapping another store. The React hook drives the calls —
8
+ * `list()` on mount, `load(id)` when active changes, `save()` (debounced) on
9
+ * message/title change, `delete()` on remove — so adapters stay dumb and
10
+ * batching lives in the hook.
11
+ *
12
+ * Two decisions that matter the moment you leave localStorage:
13
+ * - `list()` returns **summaries** (no messages) so a sidebar never hauls every
14
+ * message of every conversation; `load(id)` fetches the full thread on open.
15
+ * - ids are minted client-side, so `save()` is a create-or-update **upsert**
16
+ * (REST: idempotent `PUT {base}/{id}`) — no async "create returns id" dance.
17
+ *
18
+ * @module react/components/chat/persistence/conversation-store
19
+ */
20
+ import type { ChatMessage } from "../../../../../agent/react/index.js";
21
+ /** Fields shared by a conversation and its list summary. */
22
+ interface ConversationMeta {
23
+ id: string;
24
+ title: string;
25
+ /** Last agent this conversation talked to — lets a switcher restore per-thread. */
26
+ agentId?: string;
27
+ createdAt: number;
28
+ updatedAt: number;
29
+ }
30
+ /** Lightweight conversation metadata — what a list / sidebar needs (no messages). */
31
+ export interface ConversationSummary extends ConversationMeta {
32
+ /** Number of messages, so a list can show "empty" / reuse an empty draft
33
+ * without loading the message blob. Derived from the conversation on save. */
34
+ messageCount: number;
35
+ }
36
+ /** A full conversation — metadata + its messages. Fetched via {@link ConversationStore.load}. */
37
+ export interface Conversation extends ConversationMeta {
38
+ messages: ChatMessage[];
39
+ }
40
+ /**
41
+ * Async persistence contract for conversations. Implement all four methods;
42
+ * `subscribe`/`dispose` are optional capabilities (feature-detect them).
43
+ */
44
+ export interface ConversationStore {
45
+ /** All conversations as summaries (no messages), newest first. */
46
+ list(): Promise<ConversationSummary[]>;
47
+ /** Load one full conversation (with messages). `null` if it does not exist. */
48
+ load(id: string): Promise<Conversation | null>;
49
+ /** Create-or-update by id (upsert). */
50
+ save(conversation: Conversation): Promise<void>;
51
+ /** Delete a conversation. Idempotent — deleting a missing id is not an error. */
52
+ delete(id: string): Promise<void>;
53
+ /**
54
+ * Optional: notify when conversations change out-of-band (another tab or
55
+ * device). Returns an unsubscribe fn. Backends that can push (IndexedDB via
56
+ * BroadcastChannel, an API via SSE) implement it; localStorage omits it.
57
+ */
58
+ subscribe?(onChange: (ids: string[]) => void): () => void;
59
+ /** Optional: release resources (sockets, db handles). */
60
+ dispose?(): void;
61
+ }
62
+ export {};
63
+ //# sourceMappingURL=conversation-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-store.d.ts","sourceRoot":"","sources":["../../../../../../../src/src/react/components/chat/chat/persistence/conversation-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAEvE,4DAA4D;AAC5D,UAAU,gBAAgB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,mFAAmF;IACnF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qFAAqF;AACrF,MAAM,WAAW,mBAAoB,SAAQ,gBAAgB;IAC3D;mFAC+E;IAC/E,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,iGAAiG;AACjG,MAAM,WAAW,YAAa,SAAQ,gBAAgB;IACpD,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,kEAAkE;IAClE,IAAI,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;IACvC,+EAA+E;IAC/E,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAC/C,uCAAuC;IACvC,IAAI,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,iFAAiF;IACjF,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC;;;;OAIG;IACH,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAC1D,yDAAyD;IACzD,OAAO,CAAC,IAAI,IAAI,CAAC;CAClB"}
@@ -0,0 +1,13 @@
1
+ import type { ConversationStore } from "./conversation-store.js";
2
+ /** The slice of the Web Storage API this adapter needs. */
3
+ export interface StorageLike {
4
+ getItem(key: string): string | null;
5
+ setItem(key: string, value: string): void;
6
+ removeItem(key: string): void;
7
+ }
8
+ /**
9
+ * localStorage-backed conversation persistence. Pass a `storage` to back it with
10
+ * something else (tests inject an in-memory store); defaults to `localStorage`.
11
+ */
12
+ export declare function localConversationStore(storageKey?: string, storage?: StorageLike): ConversationStore;
13
+ //# sourceMappingURL=local-conversation-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-conversation-store.d.ts","sourceRoot":"","sources":["../../../../../../../src/src/react/components/chat/chat/persistence/local-conversation-store.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAgB,iBAAiB,EAAuB,MAAM,yBAAyB,CAAC;AAEpG,2DAA2D;AAC3D,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACpC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAmCD;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,GAAE,MAAoB,EAChC,OAAO,GAAE,WAA8B,GACtC,iBAAiB,CAiDnB"}