veryfront 0.1.46 → 0.1.48

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 (397) hide show
  1. package/esm/cli/app/shell.js +1 -1
  2. package/esm/cli/commands/build/handler.d.ts +1 -1
  3. package/esm/cli/commands/init/catalog.js +3 -3
  4. package/esm/cli/commands/init/command-help.js +2 -2
  5. package/esm/cli/commands/init/config-generator.d.ts.map +1 -1
  6. package/esm/cli/commands/init/config-generator.js +8 -0
  7. package/esm/cli/commands/init/types.d.ts +1 -1
  8. package/esm/cli/commands/init/types.d.ts.map +1 -1
  9. package/esm/cli/commands/merge/command.d.ts +1 -1
  10. package/esm/cli/help/tips.js +1 -1
  11. package/esm/cli/mcp/remote-file-tools.js +1 -1
  12. package/esm/cli/mcp/tools/catalog-tools.d.ts +3 -3
  13. package/esm/cli/mcp/tools/catalog-tools.js +3 -3
  14. package/esm/cli/templates/index.js +2 -2
  15. package/esm/cli/templates/manifest.d.ts +10 -8
  16. package/esm/cli/templates/manifest.js +15 -13
  17. package/esm/cli/templates/types.d.ts +1 -1
  18. package/esm/cli/templates/types.d.ts.map +1 -1
  19. package/esm/deno.d.ts +7 -2
  20. package/esm/deno.js +12 -7
  21. package/esm/src/agent/chat-handler.d.ts +22 -0
  22. package/esm/src/agent/chat-handler.d.ts.map +1 -1
  23. package/esm/src/agent/chat-handler.js +95 -20
  24. package/esm/src/agent/index.d.ts +1 -1
  25. package/esm/src/agent/index.d.ts.map +1 -1
  26. package/esm/src/agent/index.js +1 -1
  27. package/esm/src/agent/react/index.d.ts +1 -1
  28. package/esm/src/agent/react/index.d.ts.map +1 -1
  29. package/esm/src/agent/react/use-chat/index.d.ts +1 -1
  30. package/esm/src/agent/react/use-chat/index.d.ts.map +1 -1
  31. package/esm/src/agent/react/use-chat/streaming/handler.d.ts.map +1 -1
  32. package/esm/src/agent/react/use-chat/streaming/handler.js +42 -4
  33. package/esm/src/agent/react/use-chat/streaming/parts-builder.d.ts +2 -2
  34. package/esm/src/agent/react/use-chat/streaming/parts-builder.d.ts.map +1 -1
  35. package/esm/src/agent/react/use-chat/streaming/parts-builder.js +14 -1
  36. package/esm/src/agent/react/use-chat/streaming/types.d.ts +5 -0
  37. package/esm/src/agent/react/use-chat/streaming/types.d.ts.map +1 -1
  38. package/esm/src/agent/react/use-chat/types.d.ts +21 -1
  39. package/esm/src/agent/react/use-chat/types.d.ts.map +1 -1
  40. package/esm/src/agent/react/use-chat/use-chat.d.ts +15 -1
  41. package/esm/src/agent/react/use-chat/use-chat.d.ts.map +1 -1
  42. package/esm/src/agent/react/use-chat/use-chat.js +174 -28
  43. package/esm/src/build/production-build/client-runtime.d.ts +7 -3
  44. package/esm/src/build/production-build/client-runtime.d.ts.map +1 -1
  45. package/esm/src/build/production-build/client-runtime.js +9 -9
  46. package/esm/src/chat/index.d.ts +33 -24
  47. package/esm/src/chat/index.d.ts.map +1 -1
  48. package/esm/src/chat/index.js +40 -26
  49. package/esm/src/discovery/transpiler.d.ts.map +1 -1
  50. package/esm/src/discovery/transpiler.js +3 -1
  51. package/esm/src/embedding/chunk.d.ts +18 -0
  52. package/esm/src/embedding/chunk.d.ts.map +1 -0
  53. package/esm/src/embedding/chunk.js +48 -0
  54. package/esm/src/embedding/embedding.d.ts +23 -0
  55. package/esm/src/embedding/embedding.d.ts.map +1 -0
  56. package/esm/src/embedding/embedding.js +54 -0
  57. package/esm/src/embedding/index.d.ts +29 -0
  58. package/esm/src/embedding/index.d.ts.map +1 -0
  59. package/esm/src/embedding/index.js +26 -0
  60. package/esm/src/embedding/react/use-uploads.d.ts +31 -0
  61. package/esm/src/embedding/react/use-uploads.d.ts.map +1 -0
  62. package/esm/src/embedding/react/use-uploads.js +71 -0
  63. package/esm/src/embedding/resolve.d.ts +27 -0
  64. package/esm/src/embedding/resolve.d.ts.map +1 -0
  65. package/esm/src/embedding/resolve.js +96 -0
  66. package/esm/src/embedding/types.d.ts +90 -0
  67. package/esm/src/embedding/types.d.ts.map +1 -0
  68. package/esm/src/embedding/types.js +1 -0
  69. package/esm/src/embedding/upload-handler.d.ts +43 -0
  70. package/esm/src/embedding/upload-handler.d.ts.map +1 -0
  71. package/esm/src/embedding/upload-handler.js +143 -0
  72. package/esm/src/embedding/upload-loader.d.ts +14 -0
  73. package/esm/src/embedding/upload-loader.d.ts.map +1 -0
  74. package/esm/src/embedding/upload-loader.js +70 -0
  75. package/esm/src/embedding/upload-store.d.ts +27 -0
  76. package/esm/src/embedding/upload-store.d.ts.map +1 -0
  77. package/esm/src/embedding/upload-store.js +244 -0
  78. package/esm/src/embedding/vector-store.d.ts +33 -0
  79. package/esm/src/embedding/vector-store.d.ts.map +1 -0
  80. package/esm/src/embedding/vector-store.js +215 -0
  81. package/esm/src/modules/import-map/default-import-map.d.ts.map +1 -1
  82. package/esm/src/modules/import-map/default-import-map.js +8 -0
  83. package/esm/src/modules/react-loader/component-loader.d.ts.map +1 -1
  84. package/esm/src/modules/react-loader/component-loader.js +1 -0
  85. package/esm/src/modules/react-loader/ssr-module-loader/loader.d.ts.map +1 -1
  86. package/esm/src/modules/react-loader/ssr-module-loader/loader.js +10 -1
  87. package/esm/src/modules/react-loader/ssr-module-loader/types.d.ts +2 -0
  88. package/esm/src/modules/react-loader/ssr-module-loader/types.d.ts.map +1 -1
  89. package/esm/src/modules/react-loader/types.d.ts +2 -0
  90. package/esm/src/modules/react-loader/types.d.ts.map +1 -1
  91. package/esm/src/modules/server/module-server.d.ts +2 -0
  92. package/esm/src/modules/server/module-server.d.ts.map +1 -1
  93. package/esm/src/modules/server/module-server.js +6 -2
  94. package/esm/src/platform/compat/dynamic-import.d.ts +11 -0
  95. package/esm/src/platform/compat/dynamic-import.d.ts.map +1 -0
  96. package/esm/src/platform/compat/dynamic-import.js +11 -0
  97. package/esm/src/platform/compat/opaque-deps.d.ts +35 -0
  98. package/esm/src/platform/compat/opaque-deps.d.ts.map +1 -0
  99. package/esm/src/platform/compat/opaque-deps.js +48 -0
  100. package/esm/src/platform/compat/path/basic-operations.d.ts.map +1 -1
  101. package/esm/src/platform/compat/path/basic-operations.js +9 -3
  102. package/esm/src/platform/compat/path/resolution.d.ts.map +1 -1
  103. package/esm/src/platform/compat/path/resolution.js +51 -11
  104. package/esm/src/platform/compat/process.d.ts.map +1 -1
  105. package/esm/src/platform/compat/process.js +1 -3
  106. package/esm/src/provider/local/local-embedding-adapter.d.ts +19 -0
  107. package/esm/src/provider/local/local-embedding-adapter.d.ts.map +1 -0
  108. package/esm/src/provider/local/local-embedding-adapter.js +32 -0
  109. package/esm/src/provider/local/local-embedding-engine.d.ts +17 -0
  110. package/esm/src/provider/local/local-embedding-engine.d.ts.map +1 -0
  111. package/esm/src/provider/local/local-embedding-engine.js +63 -0
  112. package/esm/src/provider/local/local-engine.d.ts +7 -0
  113. package/esm/src/provider/local/local-engine.d.ts.map +1 -1
  114. package/esm/src/provider/local/local-engine.js +3 -2
  115. package/esm/src/provider/local/model-catalog.d.ts +10 -1
  116. package/esm/src/provider/local/model-catalog.d.ts.map +1 -1
  117. package/esm/src/provider/local/model-catalog.js +61 -0
  118. package/esm/src/react/components/ai/agent-card.js +13 -13
  119. package/esm/src/react/components/ai/chat/components/animations.d.ts +5 -0
  120. package/esm/src/react/components/ai/chat/components/animations.d.ts.map +1 -1
  121. package/esm/src/react/components/ai/chat/components/animations.js +13 -1
  122. package/esm/src/react/components/ai/chat/components/attachment-pill.d.ts +15 -0
  123. package/esm/src/react/components/ai/chat/components/attachment-pill.d.ts.map +1 -0
  124. package/esm/src/react/components/ai/chat/components/attachment-pill.js +40 -0
  125. package/esm/src/react/components/ai/chat/components/branch-picker.d.ts +9 -0
  126. package/esm/src/react/components/ai/chat/components/branch-picker.d.ts.map +1 -0
  127. package/esm/src/react/components/ai/chat/components/branch-picker.js +17 -0
  128. package/esm/src/react/components/ai/chat/components/code-block.d.ts +8 -0
  129. package/esm/src/react/components/ai/chat/components/code-block.d.ts.map +1 -0
  130. package/esm/src/react/components/ai/chat/components/code-block.js +38 -0
  131. package/esm/src/react/components/ai/chat/components/drop-zone.d.ts +7 -0
  132. package/esm/src/react/components/ai/chat/components/drop-zone.d.ts.map +1 -0
  133. package/esm/src/react/components/ai/chat/components/drop-zone.js +14 -0
  134. package/esm/src/react/components/ai/chat/components/empty-state.d.ts.map +1 -1
  135. package/esm/src/react/components/ai/chat/components/empty-state.js +10 -8
  136. package/esm/src/react/components/ai/chat/components/inference-badge.js +1 -1
  137. package/esm/src/react/components/ai/chat/components/inline-citation.d.ts +10 -0
  138. package/esm/src/react/components/ai/chat/components/inline-citation.d.ts.map +1 -0
  139. package/esm/src/react/components/ai/chat/components/inline-citation.js +59 -0
  140. package/esm/src/react/components/ai/chat/components/message-actions.d.ts +3 -2
  141. package/esm/src/react/components/ai/chat/components/message-actions.d.ts.map +1 -1
  142. package/esm/src/react/components/ai/chat/components/message-actions.js +10 -10
  143. package/esm/src/react/components/ai/chat/components/message-edit-form.d.ts +8 -0
  144. package/esm/src/react/components/ai/chat/components/message-edit-form.d.ts.map +1 -0
  145. package/esm/src/react/components/ai/chat/components/message-edit-form.js +46 -0
  146. package/esm/src/react/components/ai/chat/components/message-feedback.d.ts +9 -0
  147. package/esm/src/react/components/ai/chat/components/message-feedback.d.ts.map +1 -0
  148. package/esm/src/react/components/ai/chat/components/message-feedback.js +19 -0
  149. package/esm/src/react/components/ai/chat/components/quick-actions.d.ts +14 -0
  150. package/esm/src/react/components/ai/chat/components/quick-actions.d.ts.map +1 -0
  151. package/esm/src/react/components/ai/chat/components/quick-actions.js +7 -0
  152. package/esm/src/react/components/ai/chat/components/reasoning.d.ts +3 -4
  153. package/esm/src/react/components/ai/chat/components/reasoning.d.ts.map +1 -1
  154. package/esm/src/react/components/ai/chat/components/reasoning.js +11 -6
  155. package/esm/src/react/components/ai/chat/components/sidebar.d.ts +14 -0
  156. package/esm/src/react/components/ai/chat/components/sidebar.d.ts.map +1 -0
  157. package/esm/src/react/components/ai/chat/components/sidebar.js +92 -0
  158. package/esm/src/react/components/ai/chat/components/sources.d.ts +13 -0
  159. package/esm/src/react/components/ai/chat/components/sources.d.ts.map +1 -0
  160. package/esm/src/react/components/ai/chat/components/sources.js +28 -0
  161. package/esm/src/react/components/ai/chat/components/step-indicator.d.ts +8 -0
  162. package/esm/src/react/components/ai/chat/components/step-indicator.d.ts.map +1 -0
  163. package/esm/src/react/components/ai/chat/components/step-indicator.js +15 -0
  164. package/esm/src/react/components/ai/chat/components/tab-switcher.d.ts +16 -0
  165. package/esm/src/react/components/ai/chat/components/tab-switcher.d.ts.map +1 -0
  166. package/esm/src/react/components/ai/chat/components/tab-switcher.js +28 -0
  167. package/esm/src/react/components/ai/chat/components/tool-ui.d.ts.map +1 -1
  168. package/esm/src/react/components/ai/chat/components/tool-ui.js +23 -21
  169. package/esm/src/react/components/ai/chat/components/upgrade-cta.d.ts.map +1 -1
  170. package/esm/src/react/components/ai/chat/components/upgrade-cta.js +3 -3
  171. package/esm/src/react/components/ai/chat/components/uploads-panel.d.ts +16 -0
  172. package/esm/src/react/components/ai/chat/components/uploads-panel.d.ts.map +1 -0
  173. package/esm/src/react/components/ai/chat/components/uploads-panel.js +46 -0
  174. package/esm/src/react/components/ai/chat/composition/api.d.ts +10 -5
  175. package/esm/src/react/components/ai/chat/composition/api.d.ts.map +1 -1
  176. package/esm/src/react/components/ai/chat/composition/api.js +12 -20
  177. package/esm/src/react/components/ai/chat/composition/chat-composer.d.ts +35 -0
  178. package/esm/src/react/components/ai/chat/composition/chat-composer.d.ts.map +1 -0
  179. package/esm/src/react/components/ai/chat/composition/chat-composer.js +53 -0
  180. package/esm/src/react/components/ai/chat/composition/chat-empty.d.ts +20 -0
  181. package/esm/src/react/components/ai/chat/composition/chat-empty.d.ts.map +1 -0
  182. package/esm/src/react/components/ai/chat/composition/chat-empty.js +23 -0
  183. package/esm/src/react/components/ai/chat/composition/chat-if.d.ts +14 -0
  184. package/esm/src/react/components/ai/chat/composition/chat-if.d.ts.map +1 -0
  185. package/esm/src/react/components/ai/chat/composition/chat-if.js +11 -0
  186. package/esm/src/react/components/ai/chat/composition/chat-message-list.d.ts +36 -0
  187. package/esm/src/react/components/ai/chat/composition/chat-message-list.d.ts.map +1 -0
  188. package/esm/src/react/components/ai/chat/composition/chat-message-list.js +107 -0
  189. package/esm/src/react/components/ai/chat/composition/chat-root.d.ts +43 -0
  190. package/esm/src/react/components/ai/chat/composition/chat-root.d.ts.map +1 -0
  191. package/esm/src/react/components/ai/chat/composition/chat-root.js +78 -0
  192. package/esm/src/react/components/ai/chat/composition/error-banner.d.ts +12 -0
  193. package/esm/src/react/components/ai/chat/composition/error-banner.d.ts.map +1 -0
  194. package/esm/src/react/components/ai/chat/composition/error-banner.js +17 -0
  195. package/esm/src/react/components/ai/chat/composition/message.d.ts +54 -0
  196. package/esm/src/react/components/ai/chat/composition/message.d.ts.map +1 -0
  197. package/esm/src/react/components/ai/chat/composition/message.js +169 -0
  198. package/esm/src/react/components/ai/chat/composition/model-avatar.d.ts +14 -0
  199. package/esm/src/react/components/ai/chat/composition/model-avatar.d.ts.map +1 -0
  200. package/esm/src/react/components/ai/chat/composition/model-avatar.js +60 -0
  201. package/esm/src/react/components/ai/chat/contexts/chat-context.d.ts +45 -0
  202. package/esm/src/react/components/ai/chat/contexts/chat-context.d.ts.map +1 -0
  203. package/esm/src/react/components/ai/chat/contexts/chat-context.js +20 -0
  204. package/esm/src/react/components/ai/chat/contexts/composer-context.d.ts +34 -0
  205. package/esm/src/react/components/ai/chat/contexts/composer-context.d.ts.map +1 -0
  206. package/esm/src/react/components/ai/chat/contexts/composer-context.js +21 -0
  207. package/esm/src/react/components/ai/chat/contexts/index.d.ts +13 -0
  208. package/esm/src/react/components/ai/chat/contexts/index.d.ts.map +1 -0
  209. package/esm/src/react/components/ai/chat/contexts/index.js +12 -0
  210. package/esm/src/react/components/ai/chat/contexts/message-context.d.ts +30 -0
  211. package/esm/src/react/components/ai/chat/contexts/message-context.d.ts.map +1 -0
  212. package/esm/src/react/components/ai/chat/contexts/message-context.js +21 -0
  213. package/esm/src/react/components/ai/chat/contexts/thread-list-context.d.ts +23 -0
  214. package/esm/src/react/components/ai/chat/contexts/thread-list-context.d.ts.map +1 -0
  215. package/esm/src/react/components/ai/chat/contexts/thread-list-context.js +21 -0
  216. package/esm/src/react/components/ai/chat/hooks/use-threads.d.ts +24 -0
  217. package/esm/src/react/components/ai/chat/hooks/use-threads.d.ts.map +1 -0
  218. package/esm/src/react/components/ai/chat/hooks/use-threads.js +151 -0
  219. package/esm/src/react/components/ai/chat/index.d.ts +99 -17
  220. package/esm/src/react/components/ai/chat/index.d.ts.map +1 -1
  221. package/esm/src/react/components/ai/chat/index.js +163 -95
  222. package/esm/src/react/components/ai/chat/utils/export.d.ts +10 -0
  223. package/esm/src/react/components/ai/chat/utils/export.d.ts.map +1 -0
  224. package/esm/src/react/components/ai/chat/utils/export.js +64 -0
  225. package/esm/src/react/components/ai/chat/utils/message-parts.d.ts +10 -0
  226. package/esm/src/react/components/ai/chat/utils/message-parts.d.ts.map +1 -1
  227. package/esm/src/react/components/ai/chat/utils/message-parts.js +46 -0
  228. package/esm/src/react/components/ai/chat-with-sidebar.d.ts +97 -0
  229. package/esm/src/react/components/ai/chat-with-sidebar.d.ts.map +1 -0
  230. package/esm/src/react/components/ai/chat-with-sidebar.js +164 -0
  231. package/esm/src/react/components/ai/chat.d.ts +10 -1
  232. package/esm/src/react/components/ai/chat.d.ts.map +1 -1
  233. package/esm/src/react/components/ai/chat.js +25 -1
  234. package/esm/src/react/components/ai/error-boundary.js +6 -6
  235. package/esm/src/react/components/ai/icons/index.d.ts +9 -0
  236. package/esm/src/react/components/ai/icons/index.d.ts.map +1 -1
  237. package/esm/src/react/components/ai/icons/index.js +82 -0
  238. package/esm/src/react/components/ai/markdown.d.ts.map +1 -1
  239. package/esm/src/react/components/ai/markdown.js +12 -12
  240. package/esm/src/react/components/ai/model-selector.d.ts +10 -2
  241. package/esm/src/react/components/ai/model-selector.d.ts.map +1 -1
  242. package/esm/src/react/components/ai/model-selector.js +138 -4
  243. package/esm/src/react/components/ai/theme.d.ts +96 -13
  244. package/esm/src/react/components/ai/theme.d.ts.map +1 -1
  245. package/esm/src/react/components/ai/theme.js +177 -21
  246. package/esm/src/react/primitives/input-box.d.ts.map +1 -1
  247. package/esm/src/react/primitives/input-box.js +16 -3
  248. package/esm/src/rendering/component-handling.d.ts +2 -0
  249. package/esm/src/rendering/component-handling.d.ts.map +1 -1
  250. package/esm/src/rendering/component-handling.js +7 -6
  251. package/esm/src/rendering/page-renderer.d.ts.map +1 -1
  252. package/esm/src/rendering/page-renderer.js +1 -0
  253. package/esm/src/rendering/page-rendering.d.ts.map +1 -1
  254. package/esm/src/rendering/page-rendering.js +2 -2
  255. package/esm/src/routing/api/module-loader/esbuild-plugin.d.ts.map +1 -1
  256. package/esm/src/routing/api/module-loader/esbuild-plugin.js +11 -24
  257. package/esm/src/routing/api/module-loader/loader.d.ts +1 -0
  258. package/esm/src/routing/api/module-loader/loader.d.ts.map +1 -1
  259. package/esm/src/routing/api/module-loader/loader.js +284 -20
  260. package/esm/src/server/handlers/dev/framework-candidates.generated.d.ts +9 -0
  261. package/esm/src/server/handlers/dev/framework-candidates.generated.d.ts.map +1 -0
  262. package/esm/src/server/handlers/dev/framework-candidates.generated.js +4940 -0
  263. package/esm/src/server/handlers/dev/styles-candidate-scanner.d.ts.map +1 -1
  264. package/esm/src/server/handlers/dev/styles-candidate-scanner.js +3 -190
  265. package/esm/src/server/handlers/request/module/module-server-handler.d.ts.map +1 -1
  266. package/esm/src/server/handlers/request/module/module-server-handler.js +1 -0
  267. package/esm/src/transforms/md/compiler/md-compiler.d.ts +1 -1
  268. package/esm/src/transforms/md/compiler/md-compiler.d.ts.map +1 -1
  269. package/esm/src/transforms/md/compiler/md-compiler.js +10 -5
  270. package/esm/src/transforms/mdx/compiler/index.d.ts +1 -1
  271. package/esm/src/transforms/mdx/compiler/index.d.ts.map +1 -1
  272. package/esm/src/transforms/mdx/compiler/index.js +3 -3
  273. package/esm/src/transforms/mdx/compiler/mdx-compiler.d.ts +1 -1
  274. package/esm/src/transforms/mdx/compiler/mdx-compiler.d.ts.map +1 -1
  275. package/esm/src/transforms/mdx/compiler/mdx-compiler.js +5 -1
  276. package/esm/src/transforms/plugins/babel-node-positions.d.ts +1 -1
  277. package/esm/src/transforms/plugins/babel-node-positions.d.ts.map +1 -1
  278. package/esm/src/transforms/plugins/babel-node-positions.js +4 -5
  279. package/esm/src/transforms/plugins/rehype-node-positions.d.ts +19 -0
  280. package/esm/src/transforms/plugins/rehype-node-positions.d.ts.map +1 -0
  281. package/esm/src/transforms/plugins/rehype-node-positions.js +45 -0
  282. package/esm/src/workflow/claude-code/agent.d.ts +8 -0
  283. package/esm/src/workflow/claude-code/agent.d.ts.map +1 -1
  284. package/esm/src/workflow/claude-code/agent.js +5 -4
  285. package/esm/src/workflow/schemas/workflow.schema.d.ts +2 -2
  286. package/package.json +10 -4
  287. package/src/cli/app/shell.ts +1 -1
  288. package/src/cli/commands/init/catalog.ts +3 -3
  289. package/src/cli/commands/init/command-help.ts +2 -2
  290. package/src/cli/commands/init/config-generator.ts +9 -0
  291. package/src/cli/commands/init/types.ts +1 -1
  292. package/src/cli/help/tips.ts +1 -1
  293. package/src/cli/mcp/remote-file-tools.ts +1 -1
  294. package/src/cli/mcp/tools/catalog-tools.ts +3 -3
  295. package/src/cli/templates/index.ts +2 -2
  296. package/src/cli/templates/manifest.js +15 -13
  297. package/src/cli/templates/types.ts +1 -1
  298. package/src/deno.js +12 -7
  299. package/src/src/agent/chat-handler.ts +146 -21
  300. package/src/src/agent/index.ts +8 -1
  301. package/src/src/agent/react/index.ts +2 -0
  302. package/src/src/agent/react/use-chat/index.ts +2 -0
  303. package/src/src/agent/react/use-chat/streaming/handler.ts +66 -5
  304. package/src/src/agent/react/use-chat/streaming/parts-builder.ts +18 -1
  305. package/src/src/agent/react/use-chat/streaming/types.ts +6 -0
  306. package/src/src/agent/react/use-chat/types.ts +24 -1
  307. package/src/src/agent/react/use-chat/use-chat.ts +232 -29
  308. package/src/src/build/production-build/client-runtime.ts +21 -5
  309. package/src/src/chat/index.ts +166 -34
  310. package/src/src/discovery/transpiler.ts +3 -1
  311. package/src/src/embedding/chunk.ts +60 -0
  312. package/src/src/embedding/embedding.ts +62 -0
  313. package/src/src/embedding/index.ts +49 -0
  314. package/src/src/embedding/react/use-uploads.ts +101 -0
  315. package/src/src/embedding/resolve.ts +128 -0
  316. package/src/src/embedding/types.ts +103 -0
  317. package/src/src/embedding/upload-handler.ts +176 -0
  318. package/src/src/embedding/upload-loader.ts +76 -0
  319. package/src/src/embedding/upload-store.ts +299 -0
  320. package/src/src/embedding/vector-store.ts +282 -0
  321. package/src/src/modules/import-map/default-import-map.ts +10 -0
  322. package/src/src/modules/react-loader/component-loader.ts +1 -0
  323. package/src/src/modules/react-loader/ssr-module-loader/loader.ts +12 -1
  324. package/src/src/modules/react-loader/ssr-module-loader/types.ts +2 -0
  325. package/src/src/modules/react-loader/types.ts +2 -0
  326. package/src/src/modules/server/module-server.ts +8 -2
  327. package/src/src/platform/compat/dynamic-import.ts +14 -0
  328. package/src/src/platform/compat/opaque-deps.ts +58 -0
  329. package/src/src/platform/compat/path/basic-operations.ts +10 -3
  330. package/src/src/platform/compat/path/resolution.ts +55 -11
  331. package/src/src/platform/compat/process.ts +1 -6
  332. package/src/src/provider/local/local-embedding-adapter.ts +37 -0
  333. package/src/src/provider/local/local-embedding-engine.ts +88 -0
  334. package/src/src/provider/local/local-engine.ts +3 -2
  335. package/src/src/provider/local/model-catalog.ts +67 -1
  336. package/src/src/react/components/ai/agent-card.tsx +13 -13
  337. package/src/src/react/components/ai/chat/components/animations.tsx +31 -1
  338. package/src/src/react/components/ai/chat/components/attachment-pill.tsx +110 -0
  339. package/src/src/react/components/ai/chat/components/branch-picker.tsx +70 -0
  340. package/src/src/react/components/ai/chat/components/code-block.tsx +82 -0
  341. package/src/src/react/components/ai/chat/components/drop-zone.tsx +49 -0
  342. package/src/src/react/components/ai/chat/components/empty-state.tsx +20 -8
  343. package/src/src/react/components/ai/chat/components/inference-badge.tsx +1 -1
  344. package/src/src/react/components/ai/chat/components/inline-citation.tsx +150 -0
  345. package/src/src/react/components/ai/chat/components/message-actions.tsx +73 -51
  346. package/src/src/react/components/ai/chat/components/message-edit-form.tsx +95 -0
  347. package/src/src/react/components/ai/chat/components/message-feedback.tsx +72 -0
  348. package/src/src/react/components/ai/chat/components/quick-actions.tsx +38 -0
  349. package/src/src/react/components/ai/chat/components/reasoning.tsx +40 -35
  350. package/src/src/react/components/ai/chat/components/sidebar.tsx +204 -0
  351. package/src/src/react/components/ai/chat/components/sources.tsx +99 -0
  352. package/src/src/react/components/ai/chat/components/step-indicator.tsx +33 -0
  353. package/src/src/react/components/ai/chat/components/tab-switcher.tsx +69 -0
  354. package/src/src/react/components/ai/chat/components/tool-ui.tsx +31 -29
  355. package/src/src/react/components/ai/chat/components/upgrade-cta.tsx +3 -4
  356. package/src/src/react/components/ai/chat/components/uploads-panel.tsx +129 -0
  357. package/src/src/react/components/ai/chat/composition/api.tsx +12 -62
  358. package/src/src/react/components/ai/chat/composition/chat-composer.tsx +205 -0
  359. package/src/src/react/components/ai/chat/composition/chat-empty.tsx +77 -0
  360. package/src/src/react/components/ai/chat/composition/chat-if.tsx +25 -0
  361. package/src/src/react/components/ai/chat/composition/chat-message-list.tsx +349 -0
  362. package/src/src/react/components/ai/chat/composition/chat-root.tsx +181 -0
  363. package/src/src/react/components/ai/chat/composition/error-banner.tsx +38 -0
  364. package/src/src/react/components/ai/chat/composition/message.tsx +330 -0
  365. package/src/src/react/components/ai/chat/composition/model-avatar.tsx +103 -0
  366. package/src/src/react/components/ai/chat/contexts/chat-context.tsx +78 -0
  367. package/src/src/react/components/ai/chat/contexts/composer-context.tsx +59 -0
  368. package/src/src/react/components/ai/chat/contexts/index.ts +36 -0
  369. package/src/src/react/components/ai/chat/contexts/message-context.tsx +49 -0
  370. package/src/src/react/components/ai/chat/contexts/thread-list-context.tsx +40 -0
  371. package/src/src/react/components/ai/chat/hooks/use-threads.ts +208 -0
  372. package/src/src/react/components/ai/chat/index.tsx +384 -230
  373. package/src/src/react/components/ai/chat/utils/export.ts +77 -0
  374. package/src/src/react/components/ai/chat/utils/message-parts.ts +52 -1
  375. package/src/src/react/components/ai/chat-with-sidebar.tsx +369 -0
  376. package/src/src/react/components/ai/chat.tsx +119 -7
  377. package/src/src/react/components/ai/error-boundary.tsx +6 -6
  378. package/src/src/react/components/ai/icons/index.ts +100 -0
  379. package/src/src/react/components/ai/markdown.tsx +12 -15
  380. package/src/src/react/components/ai/model-selector.tsx +223 -15
  381. package/src/src/react/components/ai/theme.ts +205 -39
  382. package/src/src/react/primitives/input-box.tsx +27 -4
  383. package/src/src/rendering/component-handling.ts +9 -6
  384. package/src/src/rendering/page-renderer.ts +1 -0
  385. package/src/src/rendering/page-rendering.ts +4 -0
  386. package/src/src/routing/api/module-loader/esbuild-plugin.ts +11 -25
  387. package/src/src/routing/api/module-loader/loader.ts +333 -14
  388. package/src/src/server/handlers/dev/framework-candidates.generated.ts +4941 -0
  389. package/src/src/server/handlers/dev/styles-candidate-scanner.ts +3 -191
  390. package/src/src/server/handlers/request/module/module-server-handler.ts +1 -0
  391. package/src/src/transforms/md/compiler/md-compiler.ts +11 -4
  392. package/src/src/transforms/mdx/compiler/index.ts +12 -1
  393. package/src/src/transforms/mdx/compiler/mdx-compiler.ts +6 -0
  394. package/src/src/transforms/plugins/babel-node-positions.ts +7 -15
  395. package/src/src/transforms/plugins/rehype-node-positions.ts +67 -0
  396. package/src/src/utils/logger/logger.ts +2 -2
  397. package/src/src/workflow/claude-code/agent.ts +5 -5
@@ -48,7 +48,7 @@ export function createApp(config) {
48
48
  }
49
49
  state = setTemplates([
50
50
  { id: "ai-agent", name: "AI Chatbot", description: "Agent + chat UI + streaming" },
51
- { id: "chat-with-your-docs", name: "Chat with Docs", description: "RAG with source citations" },
51
+ { id: "docs-agent", name: "Docs Agent", description: "Document Q&A with source citations" },
52
52
  {
53
53
  id: "multi-agent-system",
54
54
  name: "Multi-Agent",
@@ -31,8 +31,8 @@ export declare const BuildArgsSchema: z.ZodObject<{
31
31
  split?: boolean | undefined;
32
32
  output?: string | undefined;
33
33
  prefetch?: boolean | undefined;
34
- dryRun?: boolean | undefined;
35
34
  preset?: string | undefined;
35
+ dryRun?: boolean | undefined;
36
36
  compress?: boolean | undefined;
37
37
  ssg?: boolean | undefined;
38
38
  noSsg?: boolean | undefined;
@@ -6,9 +6,9 @@ export const TEMPLATES = [
6
6
  { id: "minimal", label: "Minimal", description: "Blank canvas, no extras" },
7
7
  { id: "ai-agent", label: "AI Agent", description: "Agent + chat UI + streaming" },
8
8
  {
9
- id: "chat-with-your-docs",
10
- label: "Chat with Your Docs",
11
- description: "RAG with source citations",
9
+ id: "docs-agent",
10
+ label: "Docs Agent",
11
+ description: "Document Q&A with source citations",
12
12
  },
13
13
  {
14
14
  id: "agentic-workflow",
@@ -5,7 +5,7 @@ export const initHelp = {
5
5
  options: [
6
6
  {
7
7
  flag: "-t, --template <name>",
8
- description: "Project template (minimal | ai-agent | chat-with-your-docs | agentic-workflow | multi-agent-system | coding-agent | saas-starter)",
8
+ description: "Project template (minimal | ai-agent | docs-agent | agentic-workflow | multi-agent-system | coding-agent | saas-starter)",
9
9
  },
10
10
  {
11
11
  flag: "--integrations <list>",
@@ -36,7 +36,7 @@ export const initHelp = {
36
36
  "veryfront init # Interactive wizard",
37
37
  "veryfront init my-app",
38
38
  "veryfront init my-app --template ai-agent",
39
- "veryfront init my-rag --template chat-with-your-docs",
39
+ "veryfront init my-rag --template docs-agent",
40
40
  "veryfront init my-pipeline --template agentic-workflow",
41
41
  "veryfront init my-app --deploy # Create and deploy",
42
42
  "veryfront init --config project.json # From config file",
@@ -1 +1 @@
1
- {"version":3,"file":"config-generator.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init/config-generator.ts"],"names":[],"mappings":"AAOA,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CA8Bf"}
1
+ {"version":3,"file":"config-generator.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init/config-generator.ts"],"names":[],"mappings":"AAOA,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAuCf"}
@@ -5,6 +5,13 @@ import { createFileSystem } from "../../../src/platform/index.js";
5
5
  const DEFAULT_INIT_REACT_VERSION = "19.1.1";
6
6
  export async function createPackageJson(projectDir, projectName) {
7
7
  const fs = createFileSystem();
8
+ // Read any existing package.json (e.g. from template) to merge dependencies
9
+ let templateDeps = {};
10
+ const pkgPath = join(projectDir, "package.json");
11
+ if (await fs.exists(pkgPath)) {
12
+ const existing = JSON.parse(await fs.readTextFile(pkgPath));
13
+ templateDeps = existing.dependencies ?? {};
14
+ }
8
15
  const dirName = projectDir.split(/[/\\]/).pop();
9
16
  const packageJson = {
10
17
  name: projectName ?? dirName ?? "veryfront-project",
@@ -19,6 +26,7 @@ export async function createPackageJson(projectDir, projectName) {
19
26
  onlyBuiltDependencies: ["esbuild", "veryfront"],
20
27
  },
21
28
  dependencies: {
29
+ ...templateDeps,
22
30
  react: `^${DEFAULT_INIT_REACT_VERSION}`,
23
31
  "react-dom": `^${DEFAULT_INIT_REACT_VERSION}`,
24
32
  veryfront: `^${VERSION}`,
@@ -1,5 +1,5 @@
1
1
  import type { FeatureName, IntegrationName } from "../../templates/types.js";
2
- export type InitTemplate = "ai-agent" | "chat-with-your-docs" | "multi-agent-system" | "agentic-workflow" | "coding-agent" | "saas-starter" | "minimal";
2
+ export type InitTemplate = "ai-agent" | "docs-agent" | "multi-agent-system" | "agentic-workflow" | "coding-agent" | "saas-starter" | "minimal";
3
3
  export type EnvValues = Record<string, string>;
4
4
  export interface InitOptions {
5
5
  name?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE7E,MAAM,MAAM,YAAY,GACpB,UAAU,GACV,qBAAqB,GACrB,oBAAoB,GACpB,kBAAkB,GAClB,cAAc,GACd,cAAc,GACd,SAAS,CAAC;AAEd,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE/C,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;IACzB,YAAY,CAAC,EAAE,eAAe,EAAE,CAAC;IACjC,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,wCAAwC;IACxC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,mCAAmC;IACnC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE7E,MAAM,MAAM,YAAY,GACpB,UAAU,GACV,YAAY,GACZ,oBAAoB,GACpB,kBAAkB,GAClB,cAAc,GACd,cAAc,GACd,SAAS,CAAC;AAEd,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE/C,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;IACzB,YAAY,CAAC,EAAE,eAAe,EAAE,CAAC;IACjC,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,wCAAwC;IACxC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,mCAAmC;IACnC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB"}
@@ -24,8 +24,8 @@ export declare const MergeArgsSchema: z.ZodObject<{
24
24
  }, {
25
25
  branch: string;
26
26
  force?: boolean | undefined;
27
- dryRun?: boolean | undefined;
28
27
  into?: string | undefined;
28
+ dryRun?: boolean | undefined;
29
29
  }>;
30
30
  /**
31
31
  * Merge command options (inferred from schema)
@@ -14,7 +14,7 @@ export function getBuildTips() {
14
14
  export function getInitTemplates() {
15
15
  return `${yellow("Available Templates:")}\n` +
16
16
  ` • ${green("ai-agent")} - AI chatbot with tools and streaming\n` +
17
- ` • ${green("chat-with-your-docs")} - Chat with your docs (RAG + citations)\n` +
17
+ ` • ${green("docs-agent")} - Document Q&A with source citations\n` +
18
18
  ` • ${green("multi-agent-system")} - Agents that delegate to each other\n` +
19
19
  ` • ${green("agentic-workflow")} - AI pipeline with approvals\n` +
20
20
  ` • ${green("coding-agent")} - AI code assistant with file tools\n` +
@@ -364,7 +364,7 @@ export const vfRemoteDeleteBranch = {
364
364
  // ============================================================================
365
365
  const remoteCreateProjectInput = z.object({
366
366
  slug: z.string().describe("Project slug (lowercase letters, numbers, hyphens only). A random suffix is appended if the slug is already taken."),
367
- templateSlug: z.string().optional().describe("Template project slug to fork from (e.g., 'blank', 'ai-agent', 'chat-with-your-docs')"),
367
+ templateSlug: z.string().optional().describe("Template project slug to fork from (e.g., 'blank', 'ai-agent', 'docs-agent')"),
368
368
  is_public: z.boolean().optional().describe("Whether the project is public (default: false)"),
369
369
  });
370
370
  export const vfRemoteCreateProject = {
@@ -52,18 +52,18 @@ type ListUsecasesInput = z.infer<typeof listUsecasesInput>;
52
52
  export declare const vfListUsecases: MCPTool<ListUsecasesInput, UsecaseInfo[]>;
53
53
  declare const createProjectInput: z.ZodObject<{
54
54
  name: z.ZodString;
55
- template: z.ZodDefault<z.ZodOptional<z.ZodEnum<["ai-agent", "chat-with-your-docs", "multi-agent-system", "agentic-workflow", "coding-agent", "saas-starter", "minimal"]>>>;
55
+ template: z.ZodDefault<z.ZodOptional<z.ZodEnum<["ai-agent", "docs-agent", "multi-agent-system", "agentic-workflow", "coding-agent", "saas-starter", "minimal"]>>>;
56
56
  integrations: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
57
57
  directory: z.ZodOptional<z.ZodString>;
58
58
  }, "strip", z.ZodTypeAny, {
59
59
  name: string;
60
- template: "minimal" | "ai-agent" | "chat-with-your-docs" | "multi-agent-system" | "agentic-workflow" | "coding-agent" | "saas-starter";
60
+ template: "minimal" | "ai-agent" | "docs-agent" | "multi-agent-system" | "agentic-workflow" | "coding-agent" | "saas-starter";
61
61
  integrations?: string[] | undefined;
62
62
  directory?: string | undefined;
63
63
  }, {
64
64
  name: string;
65
65
  integrations?: string[] | undefined;
66
- template?: "minimal" | "ai-agent" | "chat-with-your-docs" | "multi-agent-system" | "agentic-workflow" | "coding-agent" | "saas-starter" | undefined;
66
+ template?: "minimal" | "ai-agent" | "docs-agent" | "multi-agent-system" | "agentic-workflow" | "coding-agent" | "saas-starter" | undefined;
67
67
  directory?: string | undefined;
68
68
  }>;
69
69
  type CreateProjectInput = z.infer<typeof createProjectInput>;
@@ -34,7 +34,7 @@ const EXAMPLES = [
34
34
  {
35
35
  name: "data-analyst",
36
36
  description: "RAG-powered data analyst with Sheets and Snowflake",
37
- template: "chat-with-your-docs",
37
+ template: "docs-agent",
38
38
  integrations: ["sheets", "snowflake", "notion"],
39
39
  features: ["Document search", "Chart generation", "Reports"],
40
40
  difficulty: "advanced",
@@ -64,7 +64,7 @@ const TEMPLATES = [
64
64
  recommended: true,
65
65
  },
66
66
  {
67
- name: "chat-with-your-docs",
67
+ name: "docs-agent",
68
68
  description: "Chat with your docs using retrieval-augmented generation",
69
69
  features: ["Document search", "Source citations", "File-based knowledge"],
70
70
  },
@@ -339,7 +339,7 @@ const createProjectInput = z.object({
339
339
  template: z
340
340
  .enum([
341
341
  "ai-agent",
342
- "chat-with-your-docs",
342
+ "docs-agent",
343
343
  "multi-agent-system",
344
344
  "agentic-workflow",
345
345
  "coding-agent",
@@ -17,7 +17,7 @@ const OPENAI_KEY_CONFIG = {
17
17
  };
18
18
  export const templateConfigs = {
19
19
  "ai-agent": { envVars: [OPENAI_KEY_CONFIG] },
20
- "chat-with-your-docs": { envVars: [OPENAI_KEY_CONFIG] },
20
+ "docs-agent": { envVars: [OPENAI_KEY_CONFIG] },
21
21
  "multi-agent-system": { envVars: [OPENAI_KEY_CONFIG] },
22
22
  "agentic-workflow": { envVars: [OPENAI_KEY_CONFIG] },
23
23
  "coding-agent": { envVars: [OPENAI_KEY_CONFIG] },
@@ -25,7 +25,7 @@ export const templateConfigs = {
25
25
  };
26
26
  const DIRECTORY_BASED_TEMPLATES = [
27
27
  "ai-agent",
28
- "chat-with-your-docs",
28
+ "docs-agent",
29
29
  "multi-agent-system",
30
30
  "agentic-workflow",
31
31
  "coding-agent",
@@ -26,28 +26,30 @@ declare namespace _default {
26
26
  "tools/search.ts": string;
27
27
  };
28
28
  };
29
- "chat-with-your-docs": {
29
+ "ai-agent": {
30
30
  files: {
31
31
  "README.md": string;
32
32
  "app/api/chat/route.ts": string;
33
33
  "app/layout.tsx": string;
34
34
  "app/page.tsx": string;
35
35
  "tsconfig.json": string;
36
- "agents/qa.ts": string;
37
- "content/getting-started.md": string;
38
- "content/architecture.md": string;
39
- "tools/search-docs.ts": string;
36
+ "agents/assistant.ts": string;
37
+ "tools/calculator.ts": string;
40
38
  };
41
39
  };
42
- "ai-agent": {
40
+ "docs-agent": {
43
41
  files: {
44
42
  "README.md": string;
43
+ "app/api/uploads/route.ts": string;
44
+ "app/api/uploads/[id]/route.ts": string;
45
45
  "app/api/chat/route.ts": string;
46
46
  "app/layout.tsx": string;
47
47
  "app/page.tsx": string;
48
48
  "tsconfig.json": string;
49
- "agents/assistant.ts": string;
50
- "tools/calculator.ts": string;
49
+ "store.ts": string;
50
+ "agents/rag.ts": string;
51
+ "content/getting-started.md": string;
52
+ "content/architecture.md": string;
51
53
  };
52
54
  };
53
55
  minimal: {
@@ -26,19 +26,6 @@ export default {
26
26
  "tools/search.ts": "import { tool } from \"veryfront/tool\";\nimport { z } from \"zod\";\n\nexport default tool({\n id: \"search\",\n description: \"Search your knowledge base\",\n inputSchema: z.object({\n query: z.string().describe(\"Search query\"),\n }),\n execute: async ({ query }) => {\n // Replace with your domain-specific search logic\n return {\n results: [],\n query,\n message: \"Connect your data source for real results.\",\n };\n },\n});\n"
27
27
  }
28
28
  },
29
- "chat-with-your-docs": {
30
- "files": {
31
- "README.md": "# Chat with Your Docs\n\nA chatbot that answers questions from your own documents.\n\n## What's included\n\n- Q&A agent with source citation\n- Keyword-based document search over markdown files\n- Sample content in `/content` directory\n\n## Structure\n\n```\nagents/qa.ts Q&A agent with citation instructions\ntools/search-docs.ts Searches markdown files by relevance\ncontent/\n getting-started.md Sample document\n architecture.md Sample document\napp/\n api/chat/route.ts Chat API endpoint\n page.tsx Chat interface\n```\n\nAdd your own `.md`, `.mdx`, or `.txt` files to `content/` to expand the knowledge base.\n\nThis is a starter template to give you a good starting point — not a production-ready setup.\n",
32
- "app/api/chat/route.ts": "import { createChatHandler } from \"veryfront/agent\";\n\nexport const POST = createChatHandler(\"qa\");\n",
33
- "app/layout.tsx": "import { Head } from \"veryfront/head\";\n\nexport default function RootLayout({\n children,\n}: {\n children: React.ReactNode;\n}): React.ReactNode {\n return (\n <>\n <Head>\n <title>Chat with Your Docs</title>\n </Head>\n <div className=\"flex flex-col h-screen bg-white dark:bg-neutral-950\">\n <header className=\"flex-shrink-0 border-b border-neutral-200 dark:border-neutral-800\">\n <div className=\"max-w-3xl mx-auto flex items-center gap-3 px-4 py-3\">\n <div className=\"w-8 h-8 rounded-lg bg-emerald-500/10 flex items-center justify-center\">\n <svg className=\"w-4 h-4 text-emerald-500\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m5.231 13.481L15 17.25m-4.5-15H5.625c-.621 0-1.125.504-1.125 1.125v16.5c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9zm3.75 11.625a2.625 2.625 0 11-5.25 0 2.625 2.625 0 015.25 0z\" />\n </svg>\n </div>\n <div>\n <h1 className=\"font-medium text-neutral-900 dark:text-white text-sm\">Docs Q&A</h1>\n <p className=\"text-xs text-neutral-500 dark:text-neutral-400\">Ask questions about your documents</p>\n </div>\n </div>\n </header>\n {children}\n </div>\n </>\n );\n}\n",
34
- "app/page.tsx": "'use client'\n\nimport { Chat, useChat } from 'veryfront/chat'\n\nexport default function DocsChat(): JSX.Element {\n const chat = useChat({ api: '/api/chat' })\n\n return <Chat {...chat} className=\"flex-1 min-h-0\" placeholder=\"Ask a question about your docs...\" />\n}\n",
35
- "tsconfig.json": "{\n \"compilerOptions\": {\n \"target\": \"ES2022\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"bundler\",\n \"strict\": true,\n \"jsx\": \"react-jsx\",\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"paths\": {\n \"@/*\": [\"./*\"]\n }\n },\n \"include\": [\"**/*.ts\", \"**/*.tsx\"],\n \"exclude\": [\"node_modules\"]\n}\n",
36
- "agents/qa.ts": "import { agent } from \"veryfront/agent\";\n\nexport default agent({\n id: \"qa\",\n model: \"openai/gpt-4o\",\n system: `You answer questions using the provided documents. Always cite your sources by referencing the document title. If the documents don't contain the answer, say so honestly.`,\n tools: true,\n maxSteps: 5,\n});\n",
37
- "content/getting-started.md": "# Getting Started\n\nWelcome to Acme Platform. This guide covers initial setup and core concepts.\n\n## Installation\n\nInstall the CLI globally:\n\n```bash\nnpm install -g @acme/cli\n```\n\n## Creating a Project\n\nRun the init command to scaffold a new project:\n\n```bash\nacme init my-project\ncd my-project\n```\n\n## Project Structure\n\n- `src/` — Application source code\n- `config/` — Configuration files\n- `tests/` — Test suite\n- `docs/` — Documentation\n\n## Configuration\n\nCreate an `acme.config.ts` file in your project root:\n\n```ts\nexport default {\n name: \"my-project\",\n region: \"us-east-1\",\n features: [\"auth\", \"storage\"],\n};\n```\n\n## Next Steps\n\n- Read the [Architecture Guide](./architecture) to understand the system design\n- Check [API Reference](./api-reference) for available endpoints\n- Join our Discord community for support\n",
38
- "content/architecture.md": "# Architecture\n\nAcme Platform uses a modular, event-driven architecture.\n\n## Core Components\n\n### API Gateway\nRoutes incoming requests to the appropriate microservice. Handles authentication, rate limiting, and request validation.\n\n### Event Bus\nAsynchronous message broker connecting all services. Supports pub/sub and point-to-point messaging patterns.\n\n### Data Layer\nMulti-tenant data storage with automatic sharding. Supports PostgreSQL for relational data and Redis for caching.\n\n## Request Flow\n\n1. Client sends request to API Gateway\n2. Gateway validates authentication token\n3. Request is routed to the target service\n4. Service processes request and publishes events\n5. Response is returned through the gateway\n\n## Scaling\n\nEach component scales independently. The API Gateway uses horizontal scaling with load balancing. Services auto-scale based on queue depth and CPU utilization.\n\n## Security\n\n- All inter-service communication uses mTLS\n- API tokens are rotated every 24 hours\n- Data at rest is encrypted with AES-256\n- Audit logs are retained for 90 days\n",
39
- "tools/search-docs.ts": "import { tool } from \"veryfront/tool\";\nimport { z } from \"zod\";\nimport { readTextFile, readDir, join, extname } from \"veryfront/fs\";\n\nconst CONTENT_DIR = \"content\";\nconst ALLOWED_EXTENSIONS = new Set([\".md\", \".mdx\", \".txt\"]);\n\nasync function listContentFiles(dir: string): Promise<string[]> {\n const files: string[] = [];\n\n for await (const entry of readDir(dir)) {\n const fullPath = join(dir, entry.name);\n\n if (entry.isDirectory) {\n files.push(...(await listContentFiles(fullPath)));\n } else if (entry.isFile && ALLOWED_EXTENSIONS.has(extname(entry.name))) {\n files.push(fullPath);\n }\n }\n\n return files;\n}\n\nexport default tool({\n id: \"search-docs\",\n description: \"Search documents in the knowledge base for relevant content\",\n inputSchema: z.object({\n query: z.string().describe(\"Search query\"),\n }),\n execute: async ({ query }) => {\n const files = await listContentFiles(CONTENT_DIR);\n const results: Array<{ title: string; content: string; relevance: number }> = [];\n const queryTerms = query.toLowerCase().split(/\\s+/);\n\n for (const file of files) {\n const content = await readTextFile(file);\n if (!content) continue;\n\n const lower = content.toLowerCase();\n const relevance = queryTerms.filter((term) => lower.includes(term)).length / queryTerms.length;\n\n if (relevance > 0) {\n const title = file.replace(/^content\\//, \"\").replace(/\\.(md|mdx|txt)$/, \"\");\n results.push({ title, content: content.slice(0, 2000), relevance });\n }\n }\n\n results.sort((a, b) => b.relevance - a.relevance);\n return { documents: results.slice(0, 3) };\n },\n});\n"
40
- }
41
- },
42
29
  "ai-agent": {
43
30
  "files": {
44
31
  "README.md": "# AI Agent\n\nA simple conversational AI with tool support.\n\n## What's included\n\n- Single assistant agent with streaming chat UI\n- Example calculator tool\n- `useChat` hook for real-time responses\n\n## Structure\n\n```\nagents/assistant.ts Agent definition\ntools/calculator.ts Example tool\napp/\n api/chat/route.ts Chat API endpoint\n page.tsx Chat interface\n```\n\nThis is a starter template to give you a good starting point — not a production-ready setup.\n",
@@ -50,6 +37,21 @@ export default {
50
37
  "tools/calculator.ts": "import { tool } from \"veryfront/tool\";\nimport { z } from \"zod\";\n\nexport default tool({\n id: \"calculator\",\n description: \"Perform basic arithmetic operations\",\n inputSchema: z.object({\n operation: z.enum([\"add\", \"subtract\", \"multiply\", \"divide\"]),\n a: z.number(),\n b: z.number(),\n }),\n execute: async ({ operation, a, b }) => {\n if (operation === \"divide\" && b === 0) {\n throw new Error(\"Cannot divide by zero\");\n }\n\n if (operation === \"add\") return { result: a + b };\n if (operation === \"subtract\") return { result: a - b };\n if (operation === \"multiply\") return { result: a * b };\n return { result: a / b };\n },\n});\n"
51
38
  }
52
39
  },
40
+ "docs-agent": {
41
+ "files": {
42
+ "README.md": "# Docs Agent\n\nA chatbot that answers questions from your own documents using Retrieval-Augmented Generation (RAG).\n\n## What's included\n\n- Q&A agent with source citation\n- Embedding-based semantic search (OpenAI text-embedding-3-small)\n- Document upload supporting PDF, DOCX, XLSX, PPTX, CSV, HTML, RTF, EPUB, TXT, and Markdown\n- JSON-based vector store — no external database required\n- Sample content in `/content` directory auto-indexed on first search\n\n## Getting started\n\n1. Set your OpenAI API key:\n\n ```bash\n export OPENAI_API_KEY=sk-...\n ```\n\n2. Start the dev server:\n\n ```bash\n npx veryfront dev\n ```\n\n3. Open the app and upload a document or ask a question — the sample docs in `content/` are indexed automatically.\n\n## Architecture\n\nRAG grounds LLM responses in your documents through three pipelines — **Ingestion**, **Query**, and **RAG** — orchestrated around a shared vector store.\n\n```mermaid\nflowchart LR\n ChatUI_L[\"Chat UI\"]\n\n subgraph IngestionFlow[\"Ingestion Pipeline\"]\n D[\"Documents\"] --> EXT[\"Extraction\"] --> DC[\"Chunking\"] --> DE[\"Document\\nEmbedding\"] --> ING[\"Storage\"]\n end\n\n subgraph QueryFlow[\"Query Pipeline\"]\n Q[\"Query\"] --> QE[\"Query\\nEmbedding\"] --> SS[\"Similarity\\nSearch\"]\n end\n\n subgraph RAGFlow[\"RAG Pipeline\"]\n BF[\"beforeStream\\nHook\"] --> RET[\"Retrieval\"] --> AUG[\"Augmentation\"] --> AG[\"Agent\"] --> GEN[\"Generation\"]\n end\n\n EMB((\"Embedding\\nModel\"))\n GEN_LLM((\"Generative\\nModel\"))\n VS[(\"Vector\\nStore\")]\n ChatUI_R[\"Chat UI\"]\n\n ChatUI_L --> D\n ChatUI_L --> Q\n\n QE -.- EMB\n DE -.- EMB\n\n SS --> VS\n ING --> VS\n\n Q --> BF\n VS --> RET\n AG -.- GEN_LLM\n GEN -.- GEN_LLM\n GEN --> ChatUI_R\n```\n\n### Pipelines\n\n**Ingestion** — Documents are parsed into plain text via the built-in kreuzberg extraction engine (supporting PDF, DOCX, XLSX, PPTX, HTML, RTF, EPUB, and 76+ formats), split into overlapping chunks (~1000 chars, 200 char overlap), and stored with their embeddings in `data/index.json`. Embeddings are generated lazily on first search to keep uploads fast.\n\n**Query** — The user's query is embedded into the same vector space as the documents, then compared against all stored chunks using cosine similarity to find the top-*k* most relevant results.\n\n**RAG** — The `beforeStream` hook in the chat route intercepts each message before it reaches the agent. It searches the document store for relevant chunks, assembles them into context, and prepends them as a system message. The agent then generates a cited response streamed back to the user.\n\n## Structure\n\n```\nstore.ts Upload store config (embedding model, storage path)\nagents/rag.ts Q&A agent with citation instructions\ncontent/\n getting-started.md Sample document\n architecture.md Sample document\napp/\n api/chat/route.ts Chat API endpoint\n api/uploads/route.ts Upload (POST) and list (GET) uploads\n api/uploads/[id]/route.ts Delete upload\n page.tsx Chat UI with document upload panel\n layout.tsx Root layout with header\n```\n\n## Framework usage\n\n| What | Framework | Template code |\n|------|-----------|---------------|\n| Chat UI + streaming | `Chat`, `useChat` | `page.tsx` |\n| Upload management | `useUploads` hook | `page.tsx` |\n| Source display | `showSources` prop on `Chat` | `page.tsx` |\n| Upload API routes | `createUploadHandler` | 1-line per route file |\n| Chat API route | `createChatHandler` | 1 line in `route.ts` |\n| Agent definition | `agent()` | Config object in `agents/rag.ts` |\n| RAG retrieval | `beforeStream` hook | Context injection in `api/chat/route.ts` |\n| Vector store | `uploadStore()` | Config in `store.ts` |\n\n## Adding documents\n\n- Drop files into `content/` — they're indexed automatically on first search\n- Or use the upload panel in the UI for PDF, DOCX, XLSX, PPTX, CSV, HTML, RTF, EPUB, TXT, and MD files\n\n## Production notes\n\nThis is a starter template — not a production-ready setup. For production, consider:\n\n- **Vector store** — Replace the JSON store with pgvector, Pinecone, or Qdrant for datasets beyond ~10k chunks\n- **Reranking** — Add a cross-encoder reranker (e.g. Cohere Rerank) after retrieval to improve precision\n- **Hybrid search** — Combine dense vectors with BM25 keyword matching for better recall\n",
43
+ "app/api/uploads/route.ts": "import { createUploadHandler } from \"veryfront/embedding\";\nimport { store } from \"../../../store.ts\";\n\nexport const { POST, GET } = createUploadHandler(store);\n",
44
+ "app/api/uploads/[id]/route.ts": "import { createUploadHandler } from \"veryfront/embedding\";\nimport { store } from \"../../../../store.ts\";\n\nexport const { DELETE } = createUploadHandler(store);\n",
45
+ "app/api/chat/route.ts": "import { createChatHandler } from \"veryfront/agent\";\nimport { store } from \"../../../store.ts\";\n\nexport const POST = createChatHandler(\"rag\", {\n beforeStream: async ({ lastUserText }) => {\n const query = lastUserText.trim();\n if (!query) return;\n\n try {\n await store.indexContentDir();\n const results = await store.search(query, { topK: 5 });\n if (results.length === 0) return;\n\n const contextBlock = results\n .map(\n (result) =>\n `[${result.title}] (score: ${\n result.score.toFixed(2)\n })\\n${result.text}`,\n )\n .join(\"\\n\\n---\\n\\n\");\n\n return {\n prepend: [\n {\n role: \"system\",\n parts: [\n {\n type: \"text\",\n text:\n `Here are relevant documents retrieved for the user's question:\\n\\n${contextBlock}\\n\\n` +\n \"Use these documents to answer. Cite the document title when referencing information.\",\n },\n ],\n },\n ],\n };\n } catch (e) {\n console.error(\"[RAG] Retrieval failed:\", e);\n return;\n }\n },\n});\n",
46
+ "app/layout.tsx": "import { Head } from \"veryfront/head\";\n\nexport default function RootLayout({ children }: { children: React.ReactNode }): React.ReactNode {\n return (\n <>\n <Head><title>Docs Agent</title></Head>\n <div className=\"flex flex-col h-screen\">\n {children}\n </div>\n </>\n );\n}\n",
47
+ "app/page.tsx": "'use client'\n\nimport { useState, useEffect, useCallback, useMemo } from 'react'\nimport { ChatWithSidebar, useChat, type QuickAction } from 'veryfront/chat'\n\nconst UPLOAD_API = '/api/uploads'\nconst ACCEPT = '.pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.csv,.txt,.md,.mdx,.html,.rtf,.epub,.json,.xml'\n\nconst QUICK_ACTIONS: QuickAction[] = [\n { id: 'ask-question', label: 'Ask Question', prompt: 'I have a question about this document: ' },\n { id: 'extract-insights', label: 'Extract Insights', prompt: 'Extract the key insights from the uploaded documents.' },\n { id: 'find-sources', label: 'Find Sources', prompt: 'Find relevant sources and references in the documents for: ' },\n]\n\ninterface Doc { id: string; title: string; source: string }\n\nfunction useUploads(api: string) {\n const [docs, setDocs] = useState<Doc[]>([])\n const [uploading, setUploading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n const refresh = useCallback(async () => {\n try {\n const res = await fetch(api)\n if (res.ok) {\n const data = await res.json()\n setDocs(Array.isArray(data) ? data : data.uploads ?? [])\n }\n } catch { /* ignore */ }\n }, [api])\n\n useEffect(() => { refresh() }, [refresh])\n\n const upload = useCallback(async (file: File) => {\n setUploading(true)\n setError(null)\n try {\n const form = new FormData()\n form.append('file', file)\n const res = await fetch(api, { method: 'POST', body: form })\n if (!res.ok) throw new Error(await res.text())\n await refresh()\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Upload failed')\n } finally {\n setUploading(false)\n }\n }, [api, refresh])\n\n const remove = useCallback(async (id: string) => {\n await fetch(`${api}/${id}`, { method: 'DELETE' })\n await refresh()\n }, [api, refresh])\n\n const uploads = useMemo(\n () => docs.filter((d) => d.source.startsWith('upload:')),\n [docs],\n )\n\n return { uploads, uploading, error, upload, remove }\n}\n\nexport default function DocsChat() {\n const chat = useChat({ api: '/api/chat' })\n const docs = useUploads(UPLOAD_API)\n\n const attachmentItems = useMemo(() => {\n const items = docs.uploads.map((d) => ({\n id: d.id,\n name: d.title,\n status: 'ready' as const,\n }))\n if (docs.uploading) {\n items.push({ id: '__uploading', name: 'Uploading...', status: 'uploading' as const })\n }\n return items\n }, [docs.uploads, docs.uploading])\n\n const uploadFiles = useMemo(\n () => docs.uploads.map((d) => ({ id: d.id, name: d.title })),\n [docs.uploads],\n )\n\n const handleAttach = useCallback((files: FileList) => {\n for (const file of Array.from(files)) {\n docs.upload(file)\n }\n }, [docs.upload])\n\n const handleQuickAction = useCallback((action: QuickAction) => {\n if (action.prompt) chat.setInput(action.prompt)\n }, [chat.setInput])\n\n return (\n <ChatWithSidebar\n chat={chat}\n sidebar={{ storageKey: 'rag-threads' }}\n features={{ steps: true, tabs: true, sources: true, export: true }}\n models={{\n options: [\n { value: 'anthropic/claude-sonnet-4-20250514', label: 'Claude Sonnet 4', provider: 'Anthropic' },\n { value: 'openai/gpt-4o', label: 'GPT-4o', provider: 'OpenAI' },\n { value: 'openai/gpt-4o-mini', label: 'GPT-4o Mini', provider: 'OpenAI', badge: 'Fast' },\n ],\n }}\n attachments={{\n uploads: uploadFiles,\n onRemoveUpload: docs.remove,\n onAttach: handleAttach,\n accept: ACCEPT,\n items: attachmentItems,\n onRemoveItem: docs.remove,\n }}\n quickActions={{\n actions: QUICK_ACTIONS,\n onAction: handleQuickAction,\n }}\n message={{\n renderTool: () => null,\n }}\n className=\"flex-1 min-h-0\"\n placeholder=\"Ask anything about your documents...\"\n emptyState={{ title: 'Docs Agent', description: 'Upload files and ask questions' }}\n />\n )\n}\n",
48
+ "tsconfig.json": "{\n \"compilerOptions\": {\n \"target\": \"ES2022\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"bundler\",\n \"strict\": true,\n \"jsx\": \"react-jsx\",\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"paths\": {\n \"@/*\": [\"./*\"]\n }\n },\n \"include\": [\"**/*.ts\", \"**/*.tsx\"],\n \"exclude\": [\"node_modules\"]\n}\n",
49
+ "store.ts": "import { uploadStore } from \"veryfront/embedding\";\n\nexport const store = uploadStore({\n model: \"openai/text-embedding-3-small\",\n storagePath: \"data/index.json\",\n contentDir: \"content\",\n});\n",
50
+ "agents/rag.ts": "import { agent } from \"veryfront/agent\";\n\nexport default agent({\n id: \"rag\",\n model: \"local/qwen3-1.7b\",\n system:\n `You answer questions using the provided documents. ` +\n `Always cite your sources by referencing the document title. ` +\n `If the search results don't contain a clear answer, say so honestly.`,\n});\n",
51
+ "content/getting-started.md": "# Getting Started\n\nWelcome to Acme Platform. This guide covers initial setup and core concepts.\n\n## Installation\n\nInstall the CLI globally:\n\n```bash\nnpm install -g @acme/cli\n```\n\n## Creating a Project\n\nRun the init command to scaffold a new project:\n\n```bash\nacme init my-project\ncd my-project\n```\n\n## Project Structure\n\n- `src/` — Application source code\n- `config/` — Configuration files\n- `tests/` — Test suite\n- `docs/` — Documentation\n\n## Configuration\n\nCreate an `acme.config.ts` file in your project root:\n\n```ts\nexport default {\n name: \"my-project\",\n region: \"us-east-1\",\n features: [\"auth\", \"storage\"],\n};\n```\n\n## Next Steps\n\n- Read the [Architecture Guide](./architecture) to understand the system design\n- Check [API Reference](./api-reference) for available endpoints\n- Join our Discord community for support\n",
52
+ "content/architecture.md": "# Architecture\n\nAcme Platform uses a modular, event-driven architecture.\n\n## Core Components\n\n### API Gateway\nRoutes incoming requests to the appropriate microservice. Handles authentication, rate limiting, and request validation.\n\n### Event Bus\nAsynchronous message broker connecting all services. Supports pub/sub and point-to-point messaging patterns.\n\n### Data Layer\nMulti-tenant data storage with automatic sharding. Supports PostgreSQL for relational data and Redis for caching.\n\n## Request Flow\n\n1. Client sends request to API Gateway\n2. Gateway validates authentication token\n3. Request is routed to the target service\n4. Service processes request and publishes events\n5. Response is returned through the gateway\n\n## Scaling\n\nEach component scales independently. The API Gateway uses horizontal scaling with load balancing. Services auto-scale based on queue depth and CPU utilization.\n\n## Security\n\n- All inter-service communication uses mTLS\n- API tokens are rotated every 24 hours\n- Data at rest is encrypted with AES-256\n- Audit logs are retained for 90 days\n"
53
+ }
54
+ },
53
55
  "minimal": {
54
56
  "files": {
55
57
  "README.md": "# Minimal\n\nA barebones starter with just pages and routing — no agents, no tools.\n\n## What's included\n\n- Home page with welcome message\n- About page using MDX\n- Tailwind CSS styling with dark mode\n\n## Structure\n\n```\napp/\n layout.tsx Root layout\n page.tsx Home page\n about/page.mdx Markdown content page\n```\n\nThis is a starter template to give you a good starting point — not a production-ready setup.\n",
@@ -7,7 +7,7 @@ export interface TemplateFile {
7
7
  export interface TemplateConfig {
8
8
  envVars?: EnvVarConfig[];
9
9
  }
10
- export type TemplateName = "ai-agent" | "chat-with-your-docs" | "multi-agent-system" | "agentic-workflow" | "coding-agent" | "saas-starter" | "minimal" | "pages-router" | "app-router";
10
+ export type TemplateName = "ai-agent" | "docs-agent" | "multi-agent-system" | "agentic-workflow" | "coding-agent" | "saas-starter" | "minimal" | "pages-router" | "app-router";
11
11
  export type FeatureName = "ai" | "auth" | "workflows" | "mdx" | "redis" | "blob";
12
12
  export interface FeatureConfig {
13
13
  name: FeatureName;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/cli/templates/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,eAAe,EAChB,MAAM,kCAAkC,CAAC;AAE1C,YAAY,EACV,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,WAAW,EACX,UAAU,GACX,MAAM,kCAAkC,CAAC;AAE1C,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED,MAAM,MAAM,YAAY,GACpB,UAAU,GACV,qBAAqB,GACrB,oBAAoB,GACpB,kBAAkB,GAClB,cAAc,GACd,cAAc,GACd,SAAS,GACT,cAAc,GACd,YAAY,CAAC;AAEjB,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,MAAM,GAAG,WAAW,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,CAAC;AAEjF,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,WAAW,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;IACzB,SAAS,CAAC,EAAE,WAAW,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAED,MAAM,MAAM,WAAW,GACnB,cAAc,GACd,WAAW,GACX,SAAS,GACT,QAAQ,GACR,QAAQ,CAAC;AAEb,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEvE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,WAAW,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,eAAe,EAAE,CAAC;IAChC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,MAAM,EAAE,WAAW,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/cli/templates/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,eAAe,EAChB,MAAM,kCAAkC,CAAC;AAE1C,YAAY,EACV,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,WAAW,EACX,UAAU,GACX,MAAM,kCAAkC,CAAC;AAE1C,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED,MAAM,MAAM,YAAY,GACpB,UAAU,GACV,YAAY,GACZ,oBAAoB,GACpB,kBAAkB,GAClB,cAAc,GACd,cAAc,GACd,SAAS,GACT,cAAc,GACd,YAAY,CAAC;AAEjB,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,MAAM,GAAG,WAAW,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,CAAC;AAEjF,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,WAAW,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;IACzB,SAAS,CAAC,EAAE,WAAW,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAED,MAAM,MAAM,WAAW,GACnB,cAAc,GACd,WAAW,GACX,SAAS,GACT,QAAQ,GACR,QAAQ,CAAC;AAEb,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEvE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,WAAW,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,eAAe,EAAE,CAAC;IAChC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,MAAM,EAAE,WAAW,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf"}
package/esm/deno.d.ts CHANGED
@@ -29,6 +29,7 @@ declare namespace _default {
29
29
  "./fs": string;
30
30
  "./integrations": string;
31
31
  "./sandbox": string;
32
+ "./embedding": string;
32
33
  "./cli": string;
33
34
  };
34
35
  let imports: {
@@ -48,6 +49,7 @@ declare namespace _default {
48
49
  "veryfront/react/components/ai": string;
49
50
  "veryfront/components/ai": string;
50
51
  "veryfront/sandbox": string;
52
+ "veryfront/embedding": string;
51
53
  "veryfront/agent/react": string;
52
54
  "veryfront/agent/testing": string;
53
55
  "veryfront/agent/middleware": string;
@@ -229,7 +231,6 @@ declare namespace _default {
229
231
  "@ai-sdk/openai": string;
230
232
  "@ai-sdk/anthropic": string;
231
233
  "@ai-sdk/google": string;
232
- "@anthropic-ai/claude-agent-sdk": string;
233
234
  tailwindcss: string;
234
235
  "tailwindcss/plugin": string;
235
236
  "tailwindcss/defaultTheme": string;
@@ -247,7 +248,10 @@ declare namespace _default {
247
248
  "@babel/traverse": string;
248
249
  "@babel/generator": string;
249
250
  "@babel/types": string;
250
- "@huggingface/transformers": string;
251
+ "class-variance-authority": string;
252
+ clsx: string;
253
+ "tailwind-merge": string;
254
+ "@kreuzberg/wasm": string;
251
255
  };
252
256
  namespace compilerOptions {
253
257
  let jsx: string;
@@ -265,6 +269,7 @@ declare namespace _default {
265
269
  proxy: string;
266
270
  dev: string;
267
271
  production: string;
272
+ "build:prepare": string;
268
273
  build: string;
269
274
  "build:npm": string;
270
275
  release: string;
package/esm/deno.js CHANGED
@@ -1,6 +1,6 @@
1
1
  export default {
2
2
  "name": "veryfront",
3
- "version": "0.1.46",
3
+ "version": "0.1.48",
4
4
  "license": "Apache-2.0",
5
5
  "nodeModulesDir": "auto",
6
6
  "exclude": [
@@ -39,6 +39,7 @@ export default {
39
39
  "./fs": "./src/fs/index.ts",
40
40
  "./integrations": "./src/integrations/index.ts",
41
41
  "./sandbox": "./src/sandbox/index.ts",
42
+ "./embedding": "./src/embedding/index.ts",
42
43
  "./cli": "./cli/main.ts"
43
44
  },
44
45
  "imports": {
@@ -58,6 +59,7 @@ export default {
58
59
  "veryfront/react/components/ai": "./src/react/components/ai/index.ts",
59
60
  "veryfront/components/ai": "./src/react/components/ai/index.ts",
60
61
  "veryfront/sandbox": "./src/sandbox/index.ts",
62
+ "veryfront/embedding": "./src/embedding/index.ts",
61
63
  "veryfront/agent/react": "./src/agent/react/index.ts",
62
64
  "veryfront/agent/testing": "./src/agent/testing/index.ts",
63
65
  "veryfront/agent/middleware": "./src/agent/middleware/index.ts",
@@ -239,7 +241,6 @@ export default {
239
241
  "@ai-sdk/openai": "npm:@ai-sdk/openai@3.0.28",
240
242
  "@ai-sdk/anthropic": "npm:@ai-sdk/anthropic@3.0.43",
241
243
  "@ai-sdk/google": "npm:@ai-sdk/google@3.0.29",
242
- "@anthropic-ai/claude-agent-sdk": "npm:@anthropic-ai/claude-agent-sdk@0.2.37",
243
244
  "tailwindcss": "https://esm.sh/tailwindcss@4.1.8",
244
245
  "tailwindcss/plugin": "https://esm.sh/tailwindcss@4.1.8/plugin",
245
246
  "tailwindcss/defaultTheme": "https://esm.sh/tailwindcss@4.1.8/defaultTheme",
@@ -257,7 +258,10 @@ export default {
257
258
  "@babel/traverse": "npm:@babel/traverse@7.26.3",
258
259
  "@babel/generator": "npm:@babel/generator@7.26.3",
259
260
  "@babel/types": "npm:@babel/types@7.26.3",
260
- "@huggingface/transformers": "npm:@huggingface/transformers@3.4.2"
261
+ "class-variance-authority": "npm:class-variance-authority@0.7.1",
262
+ "clsx": "npm:clsx@2.1.1",
263
+ "tailwind-merge": "npm:tailwind-merge@2.6.0",
264
+ "@kreuzberg/wasm": "npm:@kreuzberg/wasm@4.4.2"
261
265
  },
262
266
  "compilerOptions": {
263
267
  "jsx": "react-jsx",
@@ -278,12 +282,13 @@ export default {
278
282
  },
279
283
  "tasks": {
280
284
  "setup": "deno run --allow-all scripts/setup.ts",
281
- "start": "deno run --allow-all cli/main.ts",
285
+ "start": "deno run -A scripts/build/generate-templates-manifest.ts && deno run --allow-all cli/main.ts",
282
286
  "start:headless": "deno run --allow-all cli/main.ts --headless",
283
287
  "proxy": "deno run --allow-all cli/main.ts serve --mode=proxy",
284
- "dev": "deno run --allow-all cli/main.ts dev",
288
+ "dev": "deno run -A scripts/build/generate-templates-manifest.ts && deno run --allow-all cli/main.ts dev",
285
289
  "production": "deno run --allow-all cli/main.ts serve --mode=production",
286
- "build": "deno run -A scripts/build/generate-integrations-module.ts && deno run -A scripts/build/generate-templates-manifest.ts && deno run -A scripts/build/generate-dev-ui-manifest.ts && deno run -A scripts/build/prepare-framework-sources.ts && deno run -A scripts/build/prebundle-client-scripts.ts && deno run -A scripts/build/prebundle-bridge.ts && deno compile --allow-all --include src/platform/polyfills --include src/proxy/main.ts --include dist/framework-src --output ./bin/veryfront cli/main.ts",
290
+ "build:prepare": "deno run -A scripts/build/generate-integrations-module.ts && deno run -A scripts/build/generate-templates-manifest.ts && deno run -A scripts/build/generate-dev-ui-manifest.ts && deno run -A scripts/build/prepare-framework-sources.ts && deno run -A scripts/build/prebundle-client-scripts.ts && deno run -A scripts/build/prebundle-bridge.ts",
291
+ "build": "deno task build:prepare && deno compile --allow-all --include src/platform/polyfills --include src/proxy/main.ts --include dist/framework-src --output ./bin/veryfront cli/main.ts",
287
292
  "build:npm": "deno run -A scripts/build/generate-integrations-module.ts && deno run -A scripts/build/build-npm-dnt.ts",
288
293
  "release": "deno run -A scripts/release.ts",
289
294
  "test": "VF_DISABLE_LRU_INTERVAL=1 SSR_TRANSFORM_PER_PROJECT_LIMIT=0 REVALIDATION_PER_PROJECT_LIMIT=0 NODE_ENV=production LOG_FORMAT=text deno test --no-check --parallel --allow-all '--ignore=tests/e2e,tests/integration/compiled-binary-e2e.test.ts' --unstable-worker-options --unstable-net",
@@ -391,7 +396,7 @@ export default {
391
396
  "allowScripts": {
392
397
  "allow": [
393
398
  "npm:sharp@0.33.5",
394
- "npm:onnxruntime-node@1.20.1"
399
+ "npm:onnxruntime-node@1.21.0"
395
400
  ],
396
401
  "deny": [
397
402
  "npm:esbuild@0.20.2",
@@ -1,8 +1,30 @@
1
1
  import * as dntShim from "../../_dnt.shims.js";
2
+ import type { Message } from "./types.js";
3
+ export type ChatHandlerMessageInput = Omit<Message, "id"> & {
4
+ id?: string;
5
+ };
6
+ export interface ChatHandlerBeforeStreamContext {
7
+ request: dntShim.Request;
8
+ messages: Message[];
9
+ context: Record<string, unknown>;
10
+ lastUserText: string;
11
+ }
12
+ export interface ChatHandlerBeforeStreamResult {
13
+ prepend?: ChatHandlerMessageInput[];
14
+ append?: ChatHandlerMessageInput[];
15
+ replaceMessages?: ChatHandlerMessageInput[];
16
+ context?: Record<string, unknown>;
17
+ }
18
+ export type ChatHandlerBeforeStream = (input: ChatHandlerBeforeStreamContext) => void | dntShim.Response | ChatHandlerBeforeStreamResult | Promise<void | dntShim.Response | ChatHandlerBeforeStreamResult>;
2
19
  /** Options for `createChatHandler` — customize the context passed to the agent. */
3
20
  export interface ChatHandlerOptions {
4
21
  /** Override context passed to agent.stream(). Default: `{ userId: "current-user" }` */
5
22
  context?: Record<string, unknown> | ((request: dntShim.Request) => Record<string, unknown> | Promise<Record<string, unknown>>);
23
+ /**
24
+ * Hook to customize validated messages/context right before `agent.stream()`.
25
+ * Return `Response` to short-circuit (e.g. auth/rate limit).
26
+ */
27
+ beforeStream?: ChatHandlerBeforeStream;
6
28
  }
7
29
  /**
8
30
  * Create a POST handler for a chat API route.
@@ -1 +1 @@
1
- {"version":3,"file":"chat-handler.d.ts","sourceRoot":"","sources":["../../../src/src/agent/chat-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,qBAAqB,CAAC;AA4H/C,mFAAmF;AACnF,MAAM,WAAW,kBAAkB;IACjC,uFAAuF;IACvF,OAAO,CAAC,EACJ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACvB,CAAC,CACD,OAAO,EAAE,OAAO,CAAC,OAAO,KACrB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;CACpE;AA2BD;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,kBAAkB,IAGD,cAAc,GAAG,KAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CA0EzE"}
1
+ {"version":3,"file":"chat-handler.d.ts","sourceRoot":"","sources":["../../../src/src/agent/chat-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,qBAAqB,CAAC;AAG/C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAuK1C,MAAM,MAAM,uBAAuB,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG;IAAE,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5E,MAAM,WAAW,8BAA8B;IAC7C,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC;IACzB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,6BAA6B;IAC5C,OAAO,CAAC,EAAE,uBAAuB,EAAE,CAAC;IACpC,MAAM,CAAC,EAAE,uBAAuB,EAAE,CAAC;IACnC,eAAe,CAAC,EAAE,uBAAuB,EAAE,CAAC;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,MAAM,uBAAuB,GAAG,CACpC,KAAK,EAAE,8BAA8B,KAEnC,IAAI,GACJ,OAAO,CAAC,QAAQ,GAChB,6BAA6B,GAC7B,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,QAAQ,GAAG,6BAA6B,CAAC,CAAC;AAiCrE,mFAAmF;AACnF,MAAM,WAAW,kBAAkB;IACjC,uFAAuF;IACvF,OAAO,CAAC,EACJ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACvB,CAAC,CACD,OAAO,EAAE,OAAO,CAAC,OAAO,KACrB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACnE;;;OAGG;IACH,YAAY,CAAC,EAAE,uBAAuB,CAAC;CACxC;AA2BD;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,kBAAkB,IAGD,cAAc,GAAG,KAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CA6FzE"}