veryfront 0.1.996 → 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 (380) hide show
  1. package/esm/cli/templates/manifest.js +1 -1
  2. package/esm/deno.d.ts +8 -0
  3. package/esm/deno.js +12 -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/task/discovery.d.ts +95 -0
  350. package/esm/src/task/discovery.d.ts.map +1 -0
  351. package/esm/src/task/discovery.js +192 -0
  352. package/esm/src/task/index.d.ts +27 -0
  353. package/esm/src/task/index.d.ts.map +1 -0
  354. package/esm/src/task/index.js +22 -0
  355. package/esm/src/utils/version-constant.d.ts +1 -1
  356. package/esm/src/utils/version-constant.js +1 -1
  357. package/esm/src/workflow/blob/local-storage.d.ts +32 -0
  358. package/esm/src/workflow/blob/local-storage.d.ts.map +1 -0
  359. package/esm/src/workflow/blob/local-storage.js +179 -0
  360. package/esm/src/workflow/blob/types.d.ts +5 -0
  361. package/esm/src/workflow/blob/types.d.ts.map +1 -1
  362. package/esm/src/workflow/blob/veryfront-cloud-storage.d.ts +11 -0
  363. package/esm/src/workflow/blob/veryfront-cloud-storage.d.ts.map +1 -1
  364. package/esm/src/workflow/blob/veryfront-cloud-storage.js +36 -0
  365. package/package.json +9 -1
  366. package/esm/src/react/components/chat/chat/components/uploads-panel.d.ts +0 -20
  367. package/esm/src/react/components/chat/chat/components/uploads-panel.d.ts.map +0 -1
  368. package/esm/src/react/components/chat/chat/components/uploads-panel.js +0 -49
  369. package/esm/src/react/components/chat/chat/contexts/thread-list-context.d.ts +0 -28
  370. package/esm/src/react/components/chat/chat/contexts/thread-list-context.d.ts.map +0 -1
  371. package/esm/src/react/components/chat/chat/contexts/thread-list-context.js +0 -27
  372. package/esm/src/react/components/chat/chat/hooks/use-threads.d.ts +0 -28
  373. package/esm/src/react/components/chat/chat/hooks/use-threads.d.ts.map +0 -1
  374. package/esm/src/react/components/chat/chat/hooks/use-threads.js +0 -151
  375. package/esm/src/react/components/chat/chat-with-sidebar.d.ts +0 -110
  376. package/esm/src/react/components/chat/chat-with-sidebar.d.ts.map +0 -1
  377. package/esm/src/react/components/chat/chat-with-sidebar.js +0 -167
  378. package/esm/src/react/components/chat/message.d.ts +0 -42
  379. package/esm/src/react/components/chat/message.d.ts.map +0 -1
  380. package/esm/src/react/components/chat/message.js +0 -69
@@ -0,0 +1,192 @@
1
+ /**
2
+ * Task Discovery
3
+ *
4
+ * Discovers task definitions from user's project `tasks/` directory.
5
+ * Follows the same patterns as workflow-discovery.ts.
6
+ *
7
+ * Scans:
8
+ * - tasks/*.ts - task definition files
9
+ * - tasks/**\/*.ts - nested task files
10
+ *
11
+ * Task files should export a task definition:
12
+ * ```typescript
13
+ * export default {
14
+ * name: "Sync external data",
15
+ * run: async (ctx) => {
16
+ * console.log("Syncing data...")
17
+ * return { synced: 42 }
18
+ * }
19
+ * }
20
+ * ```
21
+ */
22
+ import { join } from "../../deps/jsr.io/@std/path/1.1.4/mod.js";
23
+ import { logger as baseLogger } from "../utils/index.js";
24
+ import { collectFiles } from "../utils/file-discovery.js";
25
+ import { importDiscoveryModule } from "../discovery/module-import.js";
26
+ import { isTaskDefinition } from "./types.js";
27
+ const logger = baseLogger.component("task-discovery");
28
+ const TASK_FILE_EXTENSIONS = [".ts", ".tsx", ".js", ".jsx"];
29
+ const TASK_IGNORE_PATTERNS = [
30
+ "node_modules",
31
+ ".git",
32
+ "__tests__",
33
+ "*.test.*",
34
+ "*.spec.*",
35
+ ];
36
+ function resolveTasksBaseDir(projectDir, tasksDir, config) {
37
+ const fsType = config?.fs?.type ?? "local";
38
+ return fsType === "github" || fsType === "veryfront-api" ? tasksDir : join(projectDir, tasksDir);
39
+ }
40
+ function toErrorMessage(error) {
41
+ return error instanceof Error ? error.message : String(error);
42
+ }
43
+ async function collectTaskFiles(baseDir, adapter) {
44
+ return await collectFiles({
45
+ baseDir,
46
+ extensions: [...TASK_FILE_EXTENSIONS],
47
+ recursive: true,
48
+ ignorePatterns: [...TASK_IGNORE_PATTERNS],
49
+ adapter,
50
+ });
51
+ }
52
+ function extractTaskExport(module) {
53
+ const defaultExport = module.default;
54
+ if (isTaskDefinition(defaultExport)) {
55
+ return { exportName: "default", definition: defaultExport };
56
+ }
57
+ for (const [exportName, value] of Object.entries(module)) {
58
+ if (exportName !== "default" && isTaskDefinition(value)) {
59
+ return { exportName, definition: value };
60
+ }
61
+ }
62
+ return null;
63
+ }
64
+ async function loadTaskFromFile(filePath, id, adapter, projectDir) {
65
+ const module = await importDiscoveryModule(filePath, {
66
+ adapter,
67
+ projectDir,
68
+ });
69
+ const taskExport = extractTaskExport(module);
70
+ if (!taskExport)
71
+ return null;
72
+ return {
73
+ id,
74
+ name: taskExport.definition.name || id,
75
+ filePath,
76
+ exportName: taskExport.exportName,
77
+ definition: taskExport.definition,
78
+ };
79
+ }
80
+ function logDiscoveredTask(task, debug) {
81
+ if (debug) {
82
+ logger.info(`Found task "${task.id}" in ${task.filePath} (export: ${task.exportName})`);
83
+ }
84
+ }
85
+ /**
86
+ * Derive task ID from file path (e.g., "tasks/sync-data.ts" -> "sync-data").
87
+ *
88
+ * @deprecated Use project runtime task IDs from `discoverProjectTaskRuntime`
89
+ * instead.
90
+ */
91
+ export function deriveTaskId(filePath, tasksDir) {
92
+ // Remove the tasks dir prefix and extension
93
+ let relative = filePath;
94
+ const dirPrefix = tasksDir.endsWith("/") ? tasksDir : `${tasksDir}/`;
95
+ if (relative.startsWith(dirPrefix)) {
96
+ relative = relative.slice(dirPrefix.length);
97
+ }
98
+ // Remove extension
99
+ return relative.replace(/\.(ts|tsx|js|jsx)$/, "");
100
+ }
101
+ /**
102
+ * Discover all tasks in a project with the legacy file-based path.
103
+ *
104
+ * @deprecated Use `discoverProjectTaskRuntime` instead.
105
+ */
106
+ export async function discoverTasks(options) {
107
+ const { projectDir, adapter, config, tasksDir = "tasks", debug = false, } = options;
108
+ const tasks = [];
109
+ const errors = [];
110
+ const baseDir = resolveTasksBaseDir(projectDir, tasksDir, config);
111
+ if (debug) {
112
+ logger.info(`Scanning ${baseDir} for tasks`);
113
+ }
114
+ try {
115
+ const dirExists = await adapter.fs.exists(baseDir);
116
+ if (!dirExists) {
117
+ if (debug) {
118
+ logger.info(`No tasks directory found at ${baseDir}`);
119
+ }
120
+ return { tasks, errors };
121
+ }
122
+ const files = await collectTaskFiles(baseDir, adapter);
123
+ if (debug) {
124
+ logger.info(`Found ${files.length} potential task files`);
125
+ }
126
+ for (const file of files) {
127
+ try {
128
+ const task = await loadTaskFromFile(file.path, deriveTaskId(file.path, baseDir), adapter, projectDir);
129
+ if (task) {
130
+ tasks.push(task);
131
+ logDiscoveredTask(task, debug);
132
+ }
133
+ }
134
+ catch (error) {
135
+ const errorMsg = toErrorMessage(error);
136
+ errors.push({ filePath: file.path, error: errorMsg });
137
+ if (debug) {
138
+ logger.warn(`Failed to load ${file.path}: ${errorMsg}`);
139
+ }
140
+ }
141
+ }
142
+ if (debug) {
143
+ logger.info(`Discovered ${tasks.length} tasks`);
144
+ }
145
+ return { tasks, errors };
146
+ }
147
+ catch (error) {
148
+ const errorMsg = toErrorMessage(error);
149
+ logger.error(`Task discovery failed: ${errorMsg}`);
150
+ errors.push({ filePath: baseDir, error: errorMsg });
151
+ return { tasks, errors };
152
+ }
153
+ }
154
+ /**
155
+ * Find a specific task by ID through the legacy file-based path.
156
+ *
157
+ * @deprecated Use `discoverProjectTaskRuntime` and `findProjectRuntimeTask`
158
+ * instead.
159
+ */
160
+ export async function findTaskById(taskId, options) {
161
+ const { projectDir, adapter, config, tasksDir = "tasks", debug = false, } = options;
162
+ const baseDir = resolveTasksBaseDir(projectDir, tasksDir, config);
163
+ try {
164
+ const dirExists = await adapter.fs.exists(baseDir);
165
+ if (!dirExists)
166
+ return null;
167
+ const files = await collectTaskFiles(baseDir, adapter);
168
+ for (const file of files) {
169
+ const id = deriveTaskId(file.path, baseDir);
170
+ if (id !== taskId)
171
+ continue;
172
+ try {
173
+ const task = await loadTaskFromFile(file.path, id, adapter, projectDir);
174
+ if (task) {
175
+ logDiscoveredTask(task, debug);
176
+ return task;
177
+ }
178
+ }
179
+ catch (error) {
180
+ const errorMsg = toErrorMessage(error);
181
+ if (debug) {
182
+ logger.warn(`Failed to load ${file.path}: ${errorMsg}`);
183
+ }
184
+ }
185
+ }
186
+ }
187
+ catch (error) {
188
+ const errorMsg = toErrorMessage(error);
189
+ logger.error(`Task discovery failed while finding "${taskId}": ${errorMsg}`);
190
+ }
191
+ return null;
192
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Source-defined tasks for Veryfront projects.
3
+ *
4
+ * @module task
5
+ *
6
+ * @example Define a task in tasks/sync-data.ts
7
+ * ```ts
8
+ * import type { TaskContext } from "veryfront/task";
9
+ *
10
+ * export default {
11
+ * name: "Sync external data",
12
+ * async run(ctx: TaskContext) {
13
+ * return { synced: 42 };
14
+ * },
15
+ * };
16
+ * ```
17
+ */
18
+ import "../../_dnt.polyfills.js";
19
+ export type { TaskContext, TaskDefinition } from "./types.js";
20
+ export { isTaskDefinition } from "./types.js";
21
+ export { deriveTaskId, discoverTasks, findTaskById } from "./discovery.js";
22
+ export type { DiscoveredTask, TaskDiscoveryOptions, TaskDiscoveryResult } from "./discovery.js";
23
+ export { runTask } from "./runner.js";
24
+ export type { RunnableTask, RunTaskOptions, TaskRunResult } from "./runner.js";
25
+ export { discoverProjectTaskRuntime, findProjectRuntimeTask, formatProjectRuntimeDiscoveryErrors, listProjectRuntimeTasks, } from "./project-runtime.js";
26
+ export type { ProjectTaskRuntimeOptions } from "./project-runtime.js";
27
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/src/task/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,yBAAyB,CAAC;AAEjC,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC3E,YAAY,EAAE,cAAc,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAChG,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EACL,0BAA0B,EAC1B,sBAAsB,EACtB,mCAAmC,EACnC,uBAAuB,GACxB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Source-defined tasks for Veryfront projects.
3
+ *
4
+ * @module task
5
+ *
6
+ * @example Define a task in tasks/sync-data.ts
7
+ * ```ts
8
+ * import type { TaskContext } from "veryfront/task";
9
+ *
10
+ * export default {
11
+ * name: "Sync external data",
12
+ * async run(ctx: TaskContext) {
13
+ * return { synced: 42 };
14
+ * },
15
+ * };
16
+ * ```
17
+ */
18
+ import "../../_dnt.polyfills.js";
19
+ export { isTaskDefinition } from "./types.js";
20
+ export { deriveTaskId, discoverTasks, findTaskById } from "./discovery.js";
21
+ export { runTask } from "./runner.js";
22
+ export { discoverProjectTaskRuntime, findProjectRuntimeTask, formatProjectRuntimeDiscoveryErrors, listProjectRuntimeTasks, } from "./project-runtime.js";
@@ -1,3 +1,3 @@
1
1
  /** Shared version value. */
2
- export declare const VERSION = "0.1.996";
2
+ export declare const VERSION = "0.1.998";
3
3
  //# sourceMappingURL=version-constant.d.ts.map
@@ -1,4 +1,4 @@
1
1
  // Keep in sync with deno.json version.
2
2
  // scripts/release.ts updates this constant during releases.
3
3
  /** Shared version value. */
4
- export const VERSION = "0.1.996";
4
+ export const VERSION = "0.1.998";
@@ -0,0 +1,32 @@
1
+ import type { BlobRef, BlobStorage, StoreBlobOptions } from "./types.js";
2
+ export declare class LocalBlobStorage implements BlobStorage {
3
+ private rootDir;
4
+ private baseUrl?;
5
+ private fs;
6
+ private now;
7
+ constructor(rootDir: string, baseUrl?: string, options?: {
8
+ now?: () => Date;
9
+ });
10
+ private getPath;
11
+ private getMetadataPath;
12
+ put(data: string | Uint8Array | Blob | ReadableStream, options?: StoreBlobOptions): Promise<BlobRef>;
13
+ private normalizeToBytes;
14
+ getStream(id: string): Promise<ReadableStream | null>;
15
+ getText(id: string): Promise<string | null>;
16
+ getBytes(id: string): Promise<Uint8Array | null>;
17
+ delete(id: string): Promise<void>;
18
+ exists(id: string): Promise<boolean>;
19
+ stat(id: string): Promise<BlobRef | null>;
20
+ /**
21
+ * Enumerate every stored (non-expired) blob, newest first. Walks the same
22
+ * two-char-prefix partitions as {@link cleanupExpiredBlobs}, reading each
23
+ * `.meta.json` sidecar. Used by the chat upload handler's list endpoint.
24
+ */
25
+ list(): Promise<BlobRef[]>;
26
+ /**
27
+ * Cleans up all expired blobs from storage.
28
+ * This method should typically be run periodically by an external process.
29
+ */
30
+ cleanupExpiredBlobs(): Promise<void>;
31
+ }
32
+ //# sourceMappingURL=local-storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-storage.d.ts","sourceRoot":"","sources":["../../../../src/src/workflow/blob/local-storage.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAMzE,qBAAa,gBAAiB,YAAW,WAAW;IAClD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,EAAE,CAAa;IACvB,OAAO,CAAC,GAAG,CAAa;gBAEZ,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,IAAI,CAAA;KAAE;IAO7E,OAAO,CAAC,OAAO;IAMf,OAAO,CAAC,eAAe;IAIjB,GAAG,CACP,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,GAAG,cAAc,EACjD,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,OAAO,CAAC;YA4BL,gBAAgB;IAwBxB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAarD,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAS3C,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAShD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASjC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIpC,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAe/C;;;;OAIG;IACG,IAAI,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IA0BhC;;;OAGG;IACG,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;CAwB3C"}
@@ -0,0 +1,179 @@
1
+ import * as dntShim from "../../../_dnt.shims.js";
2
+ import { dirname, join } from "../../platform/compat/path/index.js";
3
+ import { createFileSystem } from "../../platform/compat/fs.js";
4
+ import { agentLogger } from "../../utils/index.js";
5
+ import { INVALID_ARGUMENT } from "../../errors/index.js";
6
+ const logger = agentLogger.component("local-blob-storage");
7
+ export class LocalBlobStorage {
8
+ rootDir;
9
+ baseUrl;
10
+ fs;
11
+ now;
12
+ constructor(rootDir, baseUrl, options) {
13
+ this.rootDir = rootDir;
14
+ this.baseUrl = baseUrl;
15
+ this.fs = createFileSystem();
16
+ this.now = options?.now ?? (() => new Date());
17
+ }
18
+ getPath(id) {
19
+ // Partition by first 2 chars to avoid too many files in one dir
20
+ const prefix = id.slice(0, 2);
21
+ return join(this.rootDir, prefix, id);
22
+ }
23
+ getMetadataPath(id) {
24
+ return `${this.getPath(id)}.meta.json`;
25
+ }
26
+ async put(data, options = {}) {
27
+ const id = options.id ?? dntShim.crypto.randomUUID();
28
+ const filePath = this.getPath(id);
29
+ const metaPath = this.getMetadataPath(id);
30
+ await this.fs.mkdir(dirname(filePath), { recursive: true });
31
+ const { bytes, size } = await this.normalizeToBytes(data);
32
+ await this.fs.writeFile(filePath, bytes);
33
+ const createdAt = this.now();
34
+ const expiresAt = options.ttl ? new Date(createdAt.getTime() + options.ttl * 1000) : undefined;
35
+ const ref = {
36
+ __kind: "blob",
37
+ id,
38
+ size,
39
+ mimeType: options.mimeType ?? "application/octet-stream",
40
+ createdAt,
41
+ expiresAt,
42
+ metadata: options.metadata,
43
+ url: this.baseUrl ? `${this.baseUrl}/${id}` : undefined,
44
+ };
45
+ await this.fs.writeTextFile(metaPath, JSON.stringify(ref));
46
+ return ref;
47
+ }
48
+ async normalizeToBytes(data) {
49
+ if (typeof data === "string") {
50
+ const bytes = new TextEncoder().encode(data);
51
+ return { bytes, size: bytes.length };
52
+ }
53
+ if (data instanceof Uint8Array)
54
+ return { bytes: data, size: data.length };
55
+ if (data instanceof Blob) {
56
+ const bytes = new Uint8Array(await data.arrayBuffer());
57
+ return { bytes, size: data.size };
58
+ }
59
+ if (data instanceof ReadableStream) {
60
+ // Normalize stream to bytes for cross-runtime compatibility
61
+ const bytes = new Uint8Array(await new Response(data).arrayBuffer());
62
+ return { bytes, size: bytes.length };
63
+ }
64
+ throw INVALID_ARGUMENT.create({ detail: "Unsupported data type for LocalBlobStorage" });
65
+ }
66
+ async getStream(id) {
67
+ const bytes = await this.getBytes(id);
68
+ if (!bytes)
69
+ return null;
70
+ // Create a minimal cross-runtime ReadableStream from the bytes
71
+ return new ReadableStream({
72
+ start(controller) {
73
+ controller.enqueue(bytes);
74
+ controller.close();
75
+ },
76
+ });
77
+ }
78
+ async getText(id) {
79
+ try {
80
+ return await this.fs.readTextFile(this.getPath(id));
81
+ }
82
+ catch (_) {
83
+ /* expected: file not found returns null */
84
+ return null;
85
+ }
86
+ }
87
+ async getBytes(id) {
88
+ try {
89
+ return await this.fs.readFile(this.getPath(id));
90
+ }
91
+ catch (_) {
92
+ /* expected: file not found returns null */
93
+ return null;
94
+ }
95
+ }
96
+ async delete(id) {
97
+ try {
98
+ await this.fs.remove(this.getPath(id));
99
+ await this.fs.remove(this.getMetadataPath(id));
100
+ }
101
+ catch (_) {
102
+ /* expected: file may not exist during cleanup */
103
+ }
104
+ }
105
+ async exists(id) {
106
+ return this.fs.exists(this.getPath(id));
107
+ }
108
+ async stat(id) {
109
+ try {
110
+ const json = await this.fs.readTextFile(this.getMetadataPath(id));
111
+ const data = JSON.parse(json);
112
+ return {
113
+ ...data,
114
+ createdAt: new Date(data.createdAt),
115
+ expiresAt: data.expiresAt ? new Date(data.expiresAt) : undefined,
116
+ };
117
+ }
118
+ catch (_) {
119
+ /* expected: metadata file not found or invalid JSON */
120
+ return null;
121
+ }
122
+ }
123
+ /**
124
+ * Enumerate every stored (non-expired) blob, newest first. Walks the same
125
+ * two-char-prefix partitions as {@link cleanupExpiredBlobs}, reading each
126
+ * `.meta.json` sidecar. Used by the chat upload handler's list endpoint.
127
+ */
128
+ async list() {
129
+ const now = this.now();
130
+ const refs = [];
131
+ for (let i = 0; i < 256; i++) {
132
+ const prefix = i.toString(16).padStart(2, "0");
133
+ const prefixDir = join(this.rootDir, prefix);
134
+ try {
135
+ for await (const entry of this.fs.readDir(prefixDir)) {
136
+ if (!entry.isFile || !entry.name.endsWith(".meta.json"))
137
+ continue;
138
+ const id = entry.name.replace(".meta.json", "");
139
+ const ref = await this.stat(id);
140
+ if (!ref)
141
+ continue;
142
+ if (ref.expiresAt && ref.expiresAt < now)
143
+ continue;
144
+ refs.push(ref);
145
+ }
146
+ }
147
+ catch (_) {
148
+ /* expected: partition directory may not exist yet */
149
+ }
150
+ }
151
+ return refs.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());
152
+ }
153
+ /**
154
+ * Cleans up all expired blobs from storage.
155
+ * This method should typically be run periodically by an external process.
156
+ */
157
+ async cleanupExpiredBlobs() {
158
+ const now = this.now();
159
+ for (let i = 0; i < 256; i++) {
160
+ const prefix = i.toString(16).padStart(2, "0");
161
+ const prefixDir = join(this.rootDir, prefix);
162
+ try {
163
+ for await (const entry of this.fs.readDir(prefixDir)) {
164
+ if (!entry.isFile || !entry.name.endsWith(".meta.json"))
165
+ continue;
166
+ const id = entry.name.replace(".meta.json", "");
167
+ const blobRef = await this.stat(id);
168
+ if (!blobRef?.expiresAt || blobRef.expiresAt >= now)
169
+ continue;
170
+ logger.debug(`Deleting expired blob: ${id}`);
171
+ await this.delete(id);
172
+ }
173
+ }
174
+ catch (_) {
175
+ /* expected: directory may not exist yet */
176
+ }
177
+ }
178
+ }
179
+ }
@@ -27,5 +27,10 @@ export interface BlobStorage {
27
27
  delete(id: string): Promise<void>;
28
28
  exists(id: string): Promise<boolean>;
29
29
  stat(id: string): Promise<BlobRef | null>;
30
+ /**
31
+ * Enumerate stored blobs, newest first. Optional — only backends that can
32
+ * cheaply list (e.g. local disk) implement it; callers must feature-detect.
33
+ */
34
+ list?(): Promise<BlobRef[]>;
30
35
  }
31
36
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/src/workflow/blob/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,CACD,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,GAAG,cAAc,EACjD,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,OAAO,CAAC,CAAC;IACpB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACtD,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC5C,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACjD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACrC,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;CAC3C"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/src/workflow/blob/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,CACD,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,GAAG,cAAc,EACjD,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,OAAO,CAAC,CAAC;IACpB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACtD,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC5C,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACjD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACrC,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC1C;;;OAGG;IACH,IAAI,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;CAC7B"}
@@ -25,6 +25,17 @@ export declare class VeryfrontCloudBlobStorage implements BlobStorage {
25
25
  delete(id: string): Promise<void>;
26
26
  exists(id: string): Promise<boolean>;
27
27
  stat(id: string): Promise<BlobRef | null>;
28
+ /**
29
+ * Enumerate blobs under this store's prefix, newest first. The list endpoint
30
+ * (`GET /projects/{slug}/uploads`) carries only paths — the original filename
31
+ * lives in each blob's sidecar — so ids are recovered from the `.blob` data
32
+ * paths and enriched via {@link stat} (one extra request per blob). Suitable
33
+ * for an uploads panel; not a hot path.
34
+ *
35
+ * Note: a single page is fetched. If the project accumulates more uploads than
36
+ * one page, pagination will need wiring here.
37
+ */
38
+ list(): Promise<BlobRef[]>;
28
39
  private resolveConfig;
29
40
  private assertSafeBlobId;
30
41
  private getDataPath;
@@ -1 +1 @@
1
- {"version":3,"file":"veryfront-cloud-storage.d.ts","sourceRoot":"","sources":["../../../../src/src/workflow/blob/veryfront-cloud-storage.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AA0DzE,MAAM,WAAW,+BAA+B;IAC9C,iFAAiF;IACjF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6BAA6B;IAC7B,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AA6FD,qBAAa,yBAA0B,YAAW,WAAW;IAC3D,OAAO,CAAC,MAAM,CAAkC;gBAEpC,MAAM,GAAE,+BAAoC;IAIlD,GAAG,CACP,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,GAAG,cAAc,EACjD,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,OAAO,CAAC;IAkEb,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAKrD,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAM3C,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAMhD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUjC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIpC,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IA0B/C,OAAO,CAAC,aAAa;IA8BrB,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,eAAe;YAKT,UAAU;YA2CV,iBAAiB;YAkBjB,YAAY;YAgBZ,cAAc;YAwBd,cAAc;YAuBd,kBAAkB;YASlB,WAAW;CAwC1B"}
1
+ {"version":3,"file":"veryfront-cloud-storage.d.ts","sourceRoot":"","sources":["../../../../src/src/workflow/blob/veryfront-cloud-storage.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAiEzE,MAAM,WAAW,+BAA+B;IAC9C,iFAAiF;IACjF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6BAA6B;IAC7B,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AA6FD,qBAAa,yBAA0B,YAAW,WAAW;IAC3D,OAAO,CAAC,MAAM,CAAkC;gBAEpC,MAAM,GAAE,+BAAoC;IAIlD,GAAG,CACP,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,GAAG,cAAc,EACjD,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,OAAO,CAAC;IAkEb,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAKrD,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAM3C,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAMhD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUjC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIpC,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IA0B/C;;;;;;;;;OASG;IACG,IAAI,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IA2BhC,OAAO,CAAC,aAAa;IA8BrB,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,eAAe;YAKT,UAAU;YA2CV,iBAAiB;YAkBjB,YAAY;YAgBZ,cAAc;YAwBd,cAAc;YAuBd,kBAAkB;YASlB,WAAW;CAwC1B"}
@@ -30,6 +30,9 @@ const getUploadSignedUrlResponseSchema = defineSchema((v) => v.object({
30
30
  signed_url: v.string().url(),
31
31
  expires_at: v.string(),
32
32
  }));
33
+ const getUploadListResponseSchema = defineSchema((v) => v.object({
34
+ data: v.array(v.object({ path: v.string().optional() }).passthrough()).optional(),
35
+ }));
33
36
  const getBlobMetadataSchema = defineSchema((v) => v.object({
34
37
  version: v.literal(1),
35
38
  id: v.string(),
@@ -42,6 +45,7 @@ const getBlobMetadataSchema = defineSchema((v) => v.object({
42
45
  const UploadCreateResponseSchema = lazySchema(getUploadCreateResponseSchema);
43
46
  const UploadMetadataResponseSchema = lazySchema(getUploadMetadataResponseSchema);
44
47
  const UploadSignedUrlResponseSchema = lazySchema(getUploadSignedUrlResponseSchema);
48
+ const UploadListResponseSchema = lazySchema(getUploadListResponseSchema);
45
49
  const BlobMetadataSchema = lazySchema(getBlobMetadataSchema);
46
50
  function normalizePrefix(prefix) {
47
51
  const value = (prefix ?? DEFAULT_PREFIX).trim().replace(/^\/+/, "");
@@ -216,6 +220,38 @@ export class VeryfrontCloudBlobStorage {
216
220
  const ref = mapUploadMetadataToRef(upload, id);
217
221
  return await attachSignedUrl(ref, dataPath, resolved, this.getDownloadUrl.bind(this));
218
222
  }
223
+ /**
224
+ * Enumerate blobs under this store's prefix, newest first. The list endpoint
225
+ * (`GET /projects/{slug}/uploads`) carries only paths — the original filename
226
+ * lives in each blob's sidecar — so ids are recovered from the `.blob` data
227
+ * paths and enriched via {@link stat} (one extra request per blob). Suitable
228
+ * for an uploads panel; not a hot path.
229
+ *
230
+ * Note: a single page is fetched. If the project accumulates more uploads than
231
+ * one page, pagination will need wiring here.
232
+ */
233
+ async list() {
234
+ const resolved = this.resolveConfig();
235
+ const raw = await this.requestJson("GET", `/projects/${encodeURIComponent(resolved.projectSlug)}/uploads`, resolved, { headers: { Accept: "application/json" }, allowNotFound: true });
236
+ if (!raw)
237
+ return [];
238
+ const parsed = UploadListResponseSchema.parse(raw);
239
+ const ids = [];
240
+ for (const item of parsed.data ?? []) {
241
+ const path = item.path;
242
+ // Only the data objects under our prefix — skip `.meta.json` sidecars and
243
+ // anything another store namespaced elsewhere.
244
+ if (!path || !path.startsWith(resolved.prefix) || !path.endsWith(DATA_SUFFIX))
245
+ continue;
246
+ const id = path.slice(resolved.prefix.length, path.length - DATA_SUFFIX.length);
247
+ if (SAFE_BLOB_ID_PATTERN.test(id))
248
+ ids.push(id);
249
+ }
250
+ const refs = await Promise.all(ids.map((id) => this.stat(id)));
251
+ return refs
252
+ .filter((ref) => ref !== null)
253
+ .sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());
254
+ }
219
255
  resolveConfig() {
220
256
  const apiBaseUrl = this.config.apiBaseUrl ?? getVeryfrontCloudBootstrap().apiBaseUrl;
221
257
  const apiToken = this.config.apiToken ?? getVeryfrontCloudAuthToken();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "veryfront",
3
- "version": "0.1.996",
3
+ "version": "0.1.998",
4
4
  "description": "The simplest way to build AI-powered apps",
5
5
  "keywords": [
6
6
  "react",
@@ -61,6 +61,10 @@
61
61
  "import": "./esm/src/chat/types.js",
62
62
  "types": "./esm/src/chat/types.d.ts"
63
63
  },
64
+ "./chat/uploads": {
65
+ "import": "./esm/src/chat/upload-handler.js",
66
+ "types": "./esm/src/chat/upload-handler.d.ts"
67
+ },
64
68
  "./markdown": {
65
69
  "import": "./esm/src/markdown/index.js",
66
70
  "types": "./esm/src/markdown/index.d.ts"
@@ -149,6 +153,10 @@
149
153
  "import": "./esm/src/trigger/index.js",
150
154
  "types": "./esm/src/trigger/index.d.ts"
151
155
  },
156
+ "./task": {
157
+ "import": "./esm/src/task/index.js",
158
+ "types": "./esm/src/task/index.d.ts"
159
+ },
152
160
  "./schedule": {
153
161
  "import": "./esm/src/schedule/index.js",
154
162
  "types": "./esm/src/schedule/index.d.ts"
@@ -1,20 +0,0 @@
1
- import * as React from "../../../../../../react/react.js";
2
- /** Public API contract for uploaded file. */
3
- export interface UploadedFile {
4
- id: string;
5
- name: string;
6
- size?: number;
7
- type?: string;
8
- url?: string;
9
- }
10
- /** Props accepted by uploads panel. */
11
- export interface UploadsPanelProps {
12
- uploads?: UploadedFile[];
13
- onRemoveUpload?: (id: string) => void;
14
- onAttach?: (files: FileList) => void;
15
- attachAccept?: string;
16
- className?: string;
17
- }
18
- /** Render uploads panel. */
19
- export declare function UploadsPanel({ uploads, onRemoveUpload, onAttach, attachAccept, className, }: UploadsPanelProps): React.ReactElement;
20
- //# sourceMappingURL=uploads-panel.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"uploads-panel.d.ts","sourceRoot":"","sources":["../../../../../../../src/src/react/components/chat/chat/components/uploads-panel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,kCAAkC,CAAC;AAI1D,6CAA6C;AAC7C,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,uCAAuC;AACvC,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,cAAc,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAQD,4BAA4B;AAC5B,wBAAgB,YAAY,CAAC,EAC3B,OAAY,EACZ,cAAc,EACd,QAAQ,EACR,YAAY,EACZ,SAAS,GACV,EAAE,iBAAiB,GAAG,KAAK,CAAC,YAAY,CA8GxC"}