larkup 0.1.14 → 0.1.21

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 (1047) hide show
  1. package/.next/BUILD_ID +1 -0
  2. package/.next/app-path-routes-manifest.json +69 -0
  3. package/.next/build/chunks/[root-of-the-server]__0cstldc._.js +206 -0
  4. package/.next/build/chunks/[root-of-the-server]__0s3ts0r._.js +500 -0
  5. package/.next/build/chunks/[turbopack-node]_transforms_postcss_ts_0xqnjlz._.js +13 -0
  6. package/.next/build/chunks/[turbopack]_runtime.js +890 -0
  7. package/.next/build/chunks/node_modules__pnpm_04zrf.1._.js +7126 -0
  8. package/.next/build/package.json +1 -0
  9. package/.next/build/postcss.js +6 -0
  10. package/.next/build-manifest.json +22 -0
  11. package/.next/diagnostics/build-diagnostics.json +6 -0
  12. package/.next/diagnostics/framework.json +1 -0
  13. package/.next/diagnostics/route-bundle-stats.json +133 -0
  14. package/.next/export-marker.json +6 -0
  15. package/.next/fallback-build-manifest.json +13 -0
  16. package/.next/images-manifest.json +68 -0
  17. package/.next/next-minimal-server.js.nft.json +1 -0
  18. package/.next/next-server.js.nft.json +1 -0
  19. package/.next/package.json +1 -0
  20. package/.next/prerender-manifest.json +210 -0
  21. package/.next/required-server-files.js +356 -0
  22. package/.next/required-server-files.json +356 -0
  23. package/.next/routes-manifest.json +462 -0
  24. package/.next/server/app/_global-error/page/app-paths-manifest.json +3 -0
  25. package/.next/server/app/_global-error/page/build-manifest.json +18 -0
  26. package/.next/server/app/_global-error/page/next-font-manifest.json +6 -0
  27. package/.next/server/app/_global-error/page/react-loadable-manifest.json +1 -0
  28. package/.next/server/app/_global-error/page/server-reference-manifest.json +4 -0
  29. package/.next/server/app/_global-error/page.js +10 -0
  30. package/.next/server/app/_global-error/page.js.nft.json +1 -0
  31. package/.next/server/app/_global-error/page_client-reference-manifest.js +3 -0
  32. package/.next/server/app/_global-error.html +1 -0
  33. package/.next/server/app/_global-error.meta +15 -0
  34. package/.next/server/app/_global-error.rsc +15 -0
  35. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +5 -0
  36. package/.next/server/app/_global-error.segments/_full.segment.rsc +15 -0
  37. package/.next/server/app/_global-error.segments/_head.segment.rsc +6 -0
  38. package/.next/server/app/_global-error.segments/_index.segment.rsc +5 -0
  39. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -0
  40. package/.next/server/app/_not-found/page/app-paths-manifest.json +3 -0
  41. package/.next/server/app/_not-found/page/build-manifest.json +18 -0
  42. package/.next/server/app/_not-found/page/next-font-manifest.json +11 -0
  43. package/.next/server/app/_not-found/page/react-loadable-manifest.json +1 -0
  44. package/.next/server/app/_not-found/page/server-reference-manifest.json +4 -0
  45. package/.next/server/app/_not-found/page.js +14 -0
  46. package/.next/server/app/_not-found/page.js.nft.json +1 -0
  47. package/.next/server/app/_not-found/page_client-reference-manifest.js +3 -0
  48. package/.next/server/app/_not-found.html +1 -0
  49. package/.next/server/app/_not-found.meta +16 -0
  50. package/.next/server/app/_not-found.rsc +28 -0
  51. package/.next/server/app/_not-found.segments/_full.segment.rsc +28 -0
  52. package/.next/server/app/_not-found.segments/_head.segment.rsc +6 -0
  53. package/.next/server/app/_not-found.segments/_index.segment.rsc +14 -0
  54. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +5 -0
  55. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +5 -0
  56. package/.next/server/app/_not-found.segments/_tree.segment.rsc +3 -0
  57. package/.next/server/app/analytics/page/app-paths-manifest.json +3 -0
  58. package/.next/server/app/analytics/page/build-manifest.json +18 -0
  59. package/.next/server/app/analytics/page/next-font-manifest.json +11 -0
  60. package/.next/server/app/analytics/page/react-loadable-manifest.json +1 -0
  61. package/.next/server/app/analytics/page/server-reference-manifest.json +4 -0
  62. package/.next/server/app/analytics/page.js +15 -0
  63. package/.next/server/app/analytics/page.js.nft.json +1 -0
  64. package/.next/server/app/analytics/page_client-reference-manifest.js +3 -0
  65. package/.next/server/app/analytics.html +1 -0
  66. package/.next/server/app/analytics.meta +15 -0
  67. package/.next/server/app/analytics.rsc +32 -0
  68. package/.next/server/app/analytics.segments/_full.segment.rsc +32 -0
  69. package/.next/server/app/analytics.segments/_head.segment.rsc +6 -0
  70. package/.next/server/app/analytics.segments/_index.segment.rsc +14 -0
  71. package/.next/server/app/analytics.segments/_tree.segment.rsc +5 -0
  72. package/.next/server/app/analytics.segments/analytics/__PAGE__.segment.rsc +6 -0
  73. package/.next/server/app/analytics.segments/analytics.segment.rsc +5 -0
  74. package/.next/server/app/api/analytics/route/app-paths-manifest.json +3 -0
  75. package/.next/server/app/api/analytics/route/build-manifest.json +9 -0
  76. package/.next/server/app/api/analytics/route/server-reference-manifest.json +4 -0
  77. package/.next/server/app/api/analytics/route.js +9 -0
  78. package/.next/server/app/api/analytics/route.js.nft.json +1 -0
  79. package/.next/server/app/api/analytics/route_client-reference-manifest.js +3 -0
  80. package/.next/server/app/api/chat/route/app-paths-manifest.json +3 -0
  81. package/.next/server/app/api/chat/route/build-manifest.json +9 -0
  82. package/.next/server/app/api/chat/route/server-reference-manifest.json +4 -0
  83. package/.next/server/app/api/chat/route.js +24 -0
  84. package/.next/server/app/api/chat/route.js.nft.json +1 -0
  85. package/.next/server/app/api/chat/route_client-reference-manifest.js +3 -0
  86. package/.next/server/app/api/chat/status/route/app-paths-manifest.json +3 -0
  87. package/.next/server/app/api/chat/status/route/build-manifest.json +9 -0
  88. package/.next/server/app/api/chat/status/route/server-reference-manifest.json +4 -0
  89. package/.next/server/app/api/chat/status/route.js +9 -0
  90. package/.next/server/app/api/chat/status/route.js.nft.json +1 -0
  91. package/.next/server/app/api/chat/status/route_client-reference-manifest.js +3 -0
  92. package/.next/server/app/api/chat/suggestions/route/app-paths-manifest.json +3 -0
  93. package/.next/server/app/api/chat/suggestions/route/build-manifest.json +9 -0
  94. package/.next/server/app/api/chat/suggestions/route/server-reference-manifest.json +4 -0
  95. package/.next/server/app/api/chat/suggestions/route.js +17 -0
  96. package/.next/server/app/api/chat/suggestions/route.js.nft.json +1 -0
  97. package/.next/server/app/api/chat/suggestions/route_client-reference-manifest.js +3 -0
  98. package/.next/server/app/api/config/route/app-paths-manifest.json +3 -0
  99. package/.next/server/app/api/config/route/build-manifest.json +9 -0
  100. package/.next/server/app/api/config/route/server-reference-manifest.json +4 -0
  101. package/.next/server/app/api/config/route.js +8 -0
  102. package/.next/server/app/api/config/route.js.nft.json +1 -0
  103. package/.next/server/app/api/config/route_client-reference-manifest.js +3 -0
  104. package/.next/server/app/api/config/test/route/app-paths-manifest.json +3 -0
  105. package/.next/server/app/api/config/test/route/build-manifest.json +9 -0
  106. package/.next/server/app/api/config/test/route/server-reference-manifest.json +4 -0
  107. package/.next/server/app/api/config/test/route.js +8 -0
  108. package/.next/server/app/api/config/test/route.js.nft.json +1 -0
  109. package/.next/server/app/api/config/test/route_client-reference-manifest.js +3 -0
  110. package/.next/server/app/api/config/test-embedding/route/app-paths-manifest.json +3 -0
  111. package/.next/server/app/api/config/test-embedding/route/build-manifest.json +9 -0
  112. package/.next/server/app/api/config/test-embedding/route/server-reference-manifest.json +4 -0
  113. package/.next/server/app/api/config/test-embedding/route.js +12 -0
  114. package/.next/server/app/api/config/test-embedding/route.js.nft.json +1 -0
  115. package/.next/server/app/api/config/test-embedding/route_client-reference-manifest.js +3 -0
  116. package/.next/server/app/api/config/test-llm/route/app-paths-manifest.json +3 -0
  117. package/.next/server/app/api/config/test-llm/route/build-manifest.json +9 -0
  118. package/.next/server/app/api/config/test-llm/route/server-reference-manifest.json +4 -0
  119. package/.next/server/app/api/config/test-llm/route.js +12 -0
  120. package/.next/server/app/api/config/test-llm/route.js.nft.json +1 -0
  121. package/.next/server/app/api/config/test-llm/route_client-reference-manifest.js +3 -0
  122. package/.next/server/app/api/config/test-provider/route/app-paths-manifest.json +3 -0
  123. package/.next/server/app/api/config/test-provider/route/build-manifest.json +9 -0
  124. package/.next/server/app/api/config/test-provider/route/server-reference-manifest.json +4 -0
  125. package/.next/server/app/api/config/test-provider/route.js +13 -0
  126. package/.next/server/app/api/config/test-provider/route.js.nft.json +1 -0
  127. package/.next/server/app/api/config/test-provider/route_client-reference-manifest.js +3 -0
  128. package/.next/server/app/api/config/verify/route/app-paths-manifest.json +3 -0
  129. package/.next/server/app/api/config/verify/route/build-manifest.json +9 -0
  130. package/.next/server/app/api/config/verify/route/server-reference-manifest.json +4 -0
  131. package/.next/server/app/api/config/verify/route.js +16 -0
  132. package/.next/server/app/api/config/verify/route.js.nft.json +1 -0
  133. package/.next/server/app/api/config/verify/route_client-reference-manifest.js +3 -0
  134. package/.next/server/app/api/connections/route/app-paths-manifest.json +3 -0
  135. package/.next/server/app/api/connections/route/build-manifest.json +9 -0
  136. package/.next/server/app/api/connections/route/server-reference-manifest.json +4 -0
  137. package/.next/server/app/api/connections/route.js +8 -0
  138. package/.next/server/app/api/connections/route.js.nft.json +1 -0
  139. package/.next/server/app/api/connections/route_client-reference-manifest.js +3 -0
  140. package/.next/server/app/api/connections/webhook/route/app-paths-manifest.json +3 -0
  141. package/.next/server/app/api/connections/webhook/route/build-manifest.json +9 -0
  142. package/.next/server/app/api/connections/webhook/route/server-reference-manifest.json +4 -0
  143. package/.next/server/app/api/connections/webhook/route.js +10 -0
  144. package/.next/server/app/api/connections/webhook/route.js.nft.json +1 -0
  145. package/.next/server/app/api/connections/webhook/route_client-reference-manifest.js +3 -0
  146. package/.next/server/app/api/demo/route/app-paths-manifest.json +3 -0
  147. package/.next/server/app/api/demo/route/build-manifest.json +9 -0
  148. package/.next/server/app/api/demo/route/server-reference-manifest.json +4 -0
  149. package/.next/server/app/api/demo/route.js +15 -0
  150. package/.next/server/app/api/demo/route.js.nft.json +1 -0
  151. package/.next/server/app/api/demo/route_client-reference-manifest.js +3 -0
  152. package/.next/server/app/api/deploy/cloud-project/route/app-paths-manifest.json +3 -0
  153. package/.next/server/app/api/deploy/cloud-project/route/build-manifest.json +9 -0
  154. package/.next/server/app/api/deploy/cloud-project/route/server-reference-manifest.json +4 -0
  155. package/.next/server/app/api/deploy/cloud-project/route.js +13 -0
  156. package/.next/server/app/api/deploy/cloud-project/route.js.nft.json +1 -0
  157. package/.next/server/app/api/deploy/cloud-project/route_client-reference-manifest.js +3 -0
  158. package/.next/server/app/api/deploy/ssh/route/app-paths-manifest.json +3 -0
  159. package/.next/server/app/api/deploy/ssh/route/build-manifest.json +9 -0
  160. package/.next/server/app/api/deploy/ssh/route/server-reference-manifest.json +4 -0
  161. package/.next/server/app/api/deploy/ssh/route.js +8 -0
  162. package/.next/server/app/api/deploy/ssh/route.js.nft.json +1 -0
  163. package/.next/server/app/api/deploy/ssh/route_client-reference-manifest.js +3 -0
  164. package/.next/server/app/api/deployment/blob-setup/route/app-paths-manifest.json +3 -0
  165. package/.next/server/app/api/deployment/blob-setup/route/build-manifest.json +9 -0
  166. package/.next/server/app/api/deployment/blob-setup/route/server-reference-manifest.json +4 -0
  167. package/.next/server/app/api/deployment/blob-setup/route.js +8 -0
  168. package/.next/server/app/api/deployment/blob-setup/route.js.nft.json +1 -0
  169. package/.next/server/app/api/deployment/blob-setup/route_client-reference-manifest.js +3 -0
  170. package/.next/server/app/api/deployment/config/route/app-paths-manifest.json +3 -0
  171. package/.next/server/app/api/deployment/config/route/build-manifest.json +9 -0
  172. package/.next/server/app/api/deployment/config/route/server-reference-manifest.json +4 -0
  173. package/.next/server/app/api/deployment/config/route.js +8 -0
  174. package/.next/server/app/api/deployment/config/route.js.nft.json +1 -0
  175. package/.next/server/app/api/deployment/config/route_client-reference-manifest.js +3 -0
  176. package/.next/server/app/api/describe-image/route/app-paths-manifest.json +3 -0
  177. package/.next/server/app/api/describe-image/route/build-manifest.json +9 -0
  178. package/.next/server/app/api/describe-image/route/server-reference-manifest.json +4 -0
  179. package/.next/server/app/api/describe-image/route.js +15 -0
  180. package/.next/server/app/api/describe-image/route.js.nft.json +1 -0
  181. package/.next/server/app/api/describe-image/route_client-reference-manifest.js +3 -0
  182. package/.next/server/app/api/doc-editor/edit/route/app-paths-manifest.json +3 -0
  183. package/.next/server/app/api/doc-editor/edit/route/build-manifest.json +9 -0
  184. package/.next/server/app/api/doc-editor/edit/route/server-reference-manifest.json +4 -0
  185. package/.next/server/app/api/doc-editor/edit/route.js +11 -0
  186. package/.next/server/app/api/doc-editor/edit/route.js.nft.json +1 -0
  187. package/.next/server/app/api/doc-editor/edit/route_client-reference-manifest.js +3 -0
  188. package/.next/server/app/api/doc-editor/export/route/app-paths-manifest.json +3 -0
  189. package/.next/server/app/api/doc-editor/export/route/build-manifest.json +9 -0
  190. package/.next/server/app/api/doc-editor/export/route/server-reference-manifest.json +4 -0
  191. package/.next/server/app/api/doc-editor/export/route.js +11 -0
  192. package/.next/server/app/api/doc-editor/export/route.js.nft.json +1 -0
  193. package/.next/server/app/api/doc-editor/export/route_client-reference-manifest.js +3 -0
  194. package/.next/server/app/api/doc-editor/extract-text/route/app-paths-manifest.json +3 -0
  195. package/.next/server/app/api/doc-editor/extract-text/route/build-manifest.json +9 -0
  196. package/.next/server/app/api/doc-editor/extract-text/route/server-reference-manifest.json +4 -0
  197. package/.next/server/app/api/doc-editor/extract-text/route.js +11 -0
  198. package/.next/server/app/api/doc-editor/extract-text/route.js.nft.json +1 -0
  199. package/.next/server/app/api/doc-editor/extract-text/route_client-reference-manifest.js +3 -0
  200. package/.next/server/app/api/doc-editor/parse/route/app-paths-manifest.json +3 -0
  201. package/.next/server/app/api/doc-editor/parse/route/build-manifest.json +9 -0
  202. package/.next/server/app/api/doc-editor/parse/route/server-reference-manifest.json +4 -0
  203. package/.next/server/app/api/doc-editor/parse/route.js +12 -0
  204. package/.next/server/app/api/doc-editor/parse/route.js.nft.json +1 -0
  205. package/.next/server/app/api/doc-editor/parse/route_client-reference-manifest.js +3 -0
  206. package/.next/server/app/api/doc-editor/restore/route/app-paths-manifest.json +3 -0
  207. package/.next/server/app/api/doc-editor/restore/route/build-manifest.json +9 -0
  208. package/.next/server/app/api/doc-editor/restore/route/server-reference-manifest.json +4 -0
  209. package/.next/server/app/api/doc-editor/restore/route.js +11 -0
  210. package/.next/server/app/api/doc-editor/restore/route.js.nft.json +1 -0
  211. package/.next/server/app/api/doc-editor/restore/route_client-reference-manifest.js +3 -0
  212. package/.next/server/app/api/document/sign/route/app-paths-manifest.json +3 -0
  213. package/.next/server/app/api/document/sign/route/build-manifest.json +9 -0
  214. package/.next/server/app/api/document/sign/route/server-reference-manifest.json +4 -0
  215. package/.next/server/app/api/document/sign/route.js +12 -0
  216. package/.next/server/app/api/document/sign/route.js.nft.json +1 -0
  217. package/.next/server/app/api/document/sign/route_client-reference-manifest.js +3 -0
  218. package/.next/server/app/api/documents/route/app-paths-manifest.json +3 -0
  219. package/.next/server/app/api/documents/route/build-manifest.json +9 -0
  220. package/.next/server/app/api/documents/route/server-reference-manifest.json +4 -0
  221. package/.next/server/app/api/documents/route.js +8 -0
  222. package/.next/server/app/api/documents/route.js.nft.json +1 -0
  223. package/.next/server/app/api/documents/route_client-reference-manifest.js +3 -0
  224. package/.next/server/app/api/firecrawl/local/route/app-paths-manifest.json +3 -0
  225. package/.next/server/app/api/firecrawl/local/route/build-manifest.json +9 -0
  226. package/.next/server/app/api/firecrawl/local/route/server-reference-manifest.json +4 -0
  227. package/.next/server/app/api/firecrawl/local/route.js +8 -0
  228. package/.next/server/app/api/firecrawl/local/route.js.nft.json +1 -0
  229. package/.next/server/app/api/firecrawl/local/route_client-reference-manifest.js +3 -0
  230. package/.next/server/app/api/index/route/app-paths-manifest.json +3 -0
  231. package/.next/server/app/api/index/route/build-manifest.json +9 -0
  232. package/.next/server/app/api/index/route/server-reference-manifest.json +4 -0
  233. package/.next/server/app/api/index/route.js +14 -0
  234. package/.next/server/app/api/index/route.js.nft.json +1 -0
  235. package/.next/server/app/api/index/route_client-reference-manifest.js +3 -0
  236. package/.next/server/app/api/integrations/notion/callback/route/app-paths-manifest.json +3 -0
  237. package/.next/server/app/api/integrations/notion/callback/route/build-manifest.json +9 -0
  238. package/.next/server/app/api/integrations/notion/callback/route/server-reference-manifest.json +4 -0
  239. package/.next/server/app/api/integrations/notion/callback/route.js +8 -0
  240. package/.next/server/app/api/integrations/notion/callback/route.js.nft.json +1 -0
  241. package/.next/server/app/api/integrations/notion/callback/route_client-reference-manifest.js +3 -0
  242. package/.next/server/app/api/integrations/notion/route/app-paths-manifest.json +3 -0
  243. package/.next/server/app/api/integrations/notion/route/build-manifest.json +9 -0
  244. package/.next/server/app/api/integrations/notion/route/server-reference-manifest.json +4 -0
  245. package/.next/server/app/api/integrations/notion/route.js +8 -0
  246. package/.next/server/app/api/integrations/notion/route.js.nft.json +1 -0
  247. package/.next/server/app/api/integrations/notion/route_client-reference-manifest.js +3 -0
  248. package/.next/server/app/api/jobs/[id]/route/app-paths-manifest.json +3 -0
  249. package/.next/server/app/api/jobs/[id]/route/build-manifest.json +9 -0
  250. package/.next/server/app/api/jobs/[id]/route/server-reference-manifest.json +4 -0
  251. package/.next/server/app/api/jobs/[id]/route.js +8 -0
  252. package/.next/server/app/api/jobs/[id]/route.js.nft.json +1 -0
  253. package/.next/server/app/api/jobs/[id]/route_client-reference-manifest.js +3 -0
  254. package/.next/server/app/api/jobs/route/app-paths-manifest.json +3 -0
  255. package/.next/server/app/api/jobs/route/build-manifest.json +9 -0
  256. package/.next/server/app/api/jobs/route/server-reference-manifest.json +4 -0
  257. package/.next/server/app/api/jobs/route.js +8 -0
  258. package/.next/server/app/api/jobs/route.js.nft.json +1 -0
  259. package/.next/server/app/api/jobs/route_client-reference-manifest.js +3 -0
  260. package/.next/server/app/api/marketplace/[toolId]/route/app-paths-manifest.json +3 -0
  261. package/.next/server/app/api/marketplace/[toolId]/route/build-manifest.json +9 -0
  262. package/.next/server/app/api/marketplace/[toolId]/route/server-reference-manifest.json +4 -0
  263. package/.next/server/app/api/marketplace/[toolId]/route.js +9 -0
  264. package/.next/server/app/api/marketplace/[toolId]/route.js.nft.json +1 -0
  265. package/.next/server/app/api/marketplace/[toolId]/route_client-reference-manifest.js +3 -0
  266. package/.next/server/app/api/marketplace/route/app-paths-manifest.json +3 -0
  267. package/.next/server/app/api/marketplace/route/build-manifest.json +9 -0
  268. package/.next/server/app/api/marketplace/route/server-reference-manifest.json +4 -0
  269. package/.next/server/app/api/marketplace/route.js +9 -0
  270. package/.next/server/app/api/marketplace/route.js.nft.json +1 -0
  271. package/.next/server/app/api/marketplace/route_client-reference-manifest.js +3 -0
  272. package/.next/server/app/api/media/[id]/route/app-paths-manifest.json +3 -0
  273. package/.next/server/app/api/media/[id]/route/build-manifest.json +9 -0
  274. package/.next/server/app/api/media/[id]/route/server-reference-manifest.json +4 -0
  275. package/.next/server/app/api/media/[id]/route.js +8 -0
  276. package/.next/server/app/api/media/[id]/route.js.nft.json +1 -0
  277. package/.next/server/app/api/media/[id]/route_client-reference-manifest.js +3 -0
  278. package/.next/server/app/api/media/process/route/app-paths-manifest.json +3 -0
  279. package/.next/server/app/api/media/process/route/build-manifest.json +9 -0
  280. package/.next/server/app/api/media/process/route/server-reference-manifest.json +4 -0
  281. package/.next/server/app/api/media/process/route.js +17 -0
  282. package/.next/server/app/api/media/process/route.js.nft.json +1 -0
  283. package/.next/server/app/api/media/process/route_client-reference-manifest.js +3 -0
  284. package/.next/server/app/api/media/route/app-paths-manifest.json +3 -0
  285. package/.next/server/app/api/media/route/build-manifest.json +9 -0
  286. package/.next/server/app/api/media/route/server-reference-manifest.json +4 -0
  287. package/.next/server/app/api/media/route.js +9 -0
  288. package/.next/server/app/api/media/route.js.nft.json +1 -0
  289. package/.next/server/app/api/media/route_client-reference-manifest.js +3 -0
  290. package/.next/server/app/api/media/stream/route/app-paths-manifest.json +3 -0
  291. package/.next/server/app/api/media/stream/route/build-manifest.json +9 -0
  292. package/.next/server/app/api/media/stream/route/server-reference-manifest.json +4 -0
  293. package/.next/server/app/api/media/stream/route.js +7 -0
  294. package/.next/server/app/api/media/stream/route.js.nft.json +1 -0
  295. package/.next/server/app/api/media/stream/route_client-reference-manifest.js +3 -0
  296. package/.next/server/app/api/models/route/app-paths-manifest.json +3 -0
  297. package/.next/server/app/api/models/route/build-manifest.json +9 -0
  298. package/.next/server/app/api/models/route/server-reference-manifest.json +4 -0
  299. package/.next/server/app/api/models/route.js +9 -0
  300. package/.next/server/app/api/models/route.js.nft.json +1 -0
  301. package/.next/server/app/api/models/route_client-reference-manifest.js +3 -0
  302. package/.next/server/app/api/parse-file/route/app-paths-manifest.json +3 -0
  303. package/.next/server/app/api/parse-file/route/build-manifest.json +9 -0
  304. package/.next/server/app/api/parse-file/route/server-reference-manifest.json +4 -0
  305. package/.next/server/app/api/parse-file/route.js +11 -0
  306. package/.next/server/app/api/parse-file/route.js.nft.json +1 -0
  307. package/.next/server/app/api/parse-file/route_client-reference-manifest.js +3 -0
  308. package/.next/server/app/api/proxy/verify/route/app-paths-manifest.json +3 -0
  309. package/.next/server/app/api/proxy/verify/route/build-manifest.json +9 -0
  310. package/.next/server/app/api/proxy/verify/route/server-reference-manifest.json +4 -0
  311. package/.next/server/app/api/proxy/verify/route.js +8 -0
  312. package/.next/server/app/api/proxy/verify/route.js.nft.json +1 -0
  313. package/.next/server/app/api/proxy/verify/route_client-reference-manifest.js +3 -0
  314. package/.next/server/app/api/sandbox/route/app-paths-manifest.json +3 -0
  315. package/.next/server/app/api/sandbox/route/build-manifest.json +9 -0
  316. package/.next/server/app/api/sandbox/route/server-reference-manifest.json +4 -0
  317. package/.next/server/app/api/sandbox/route.js +8 -0
  318. package/.next/server/app/api/sandbox/route.js.nft.json +1 -0
  319. package/.next/server/app/api/sandbox/route_client-reference-manifest.js +3 -0
  320. package/.next/server/app/api/search/bing/route/app-paths-manifest.json +3 -0
  321. package/.next/server/app/api/search/bing/route/build-manifest.json +9 -0
  322. package/.next/server/app/api/search/bing/route/server-reference-manifest.json +4 -0
  323. package/.next/server/app/api/search/bing/route.js +8 -0
  324. package/.next/server/app/api/search/bing/route.js.nft.json +1 -0
  325. package/.next/server/app/api/search/bing/route_client-reference-manifest.js +3 -0
  326. package/.next/server/app/api/search/brave/route/app-paths-manifest.json +3 -0
  327. package/.next/server/app/api/search/brave/route/build-manifest.json +9 -0
  328. package/.next/server/app/api/search/brave/route/server-reference-manifest.json +4 -0
  329. package/.next/server/app/api/search/brave/route.js +8 -0
  330. package/.next/server/app/api/search/brave/route.js.nft.json +1 -0
  331. package/.next/server/app/api/search/brave/route_client-reference-manifest.js +3 -0
  332. package/.next/server/app/api/search/exa/route/app-paths-manifest.json +3 -0
  333. package/.next/server/app/api/search/exa/route/build-manifest.json +9 -0
  334. package/.next/server/app/api/search/exa/route/server-reference-manifest.json +4 -0
  335. package/.next/server/app/api/search/exa/route.js +8 -0
  336. package/.next/server/app/api/search/exa/route.js.nft.json +1 -0
  337. package/.next/server/app/api/search/exa/route_client-reference-manifest.js +3 -0
  338. package/.next/server/app/api/search/google/route/app-paths-manifest.json +3 -0
  339. package/.next/server/app/api/search/google/route/build-manifest.json +9 -0
  340. package/.next/server/app/api/search/google/route/server-reference-manifest.json +4 -0
  341. package/.next/server/app/api/search/google/route.js +8 -0
  342. package/.next/server/app/api/search/google/route.js.nft.json +1 -0
  343. package/.next/server/app/api/search/google/route_client-reference-manifest.js +3 -0
  344. package/.next/server/app/api/search/route/app-paths-manifest.json +3 -0
  345. package/.next/server/app/api/search/route/build-manifest.json +9 -0
  346. package/.next/server/app/api/search/route/server-reference-manifest.json +4 -0
  347. package/.next/server/app/api/search/route.js +8 -0
  348. package/.next/server/app/api/search/route.js.nft.json +1 -0
  349. package/.next/server/app/api/search/route_client-reference-manifest.js +3 -0
  350. package/.next/server/app/api/search/tavily/route/app-paths-manifest.json +3 -0
  351. package/.next/server/app/api/search/tavily/route/build-manifest.json +9 -0
  352. package/.next/server/app/api/search/tavily/route/server-reference-manifest.json +4 -0
  353. package/.next/server/app/api/search/tavily/route.js +8 -0
  354. package/.next/server/app/api/search/tavily/route.js.nft.json +1 -0
  355. package/.next/server/app/api/search/tavily/route_client-reference-manifest.js +3 -0
  356. package/.next/server/app/api/search/verify/route/app-paths-manifest.json +3 -0
  357. package/.next/server/app/api/search/verify/route/build-manifest.json +9 -0
  358. package/.next/server/app/api/search/verify/route/server-reference-manifest.json +4 -0
  359. package/.next/server/app/api/search/verify/route.js +8 -0
  360. package/.next/server/app/api/search/verify/route.js.nft.json +1 -0
  361. package/.next/server/app/api/search/verify/route_client-reference-manifest.js +3 -0
  362. package/.next/server/app/api/server/agent/route/app-paths-manifest.json +3 -0
  363. package/.next/server/app/api/server/agent/route/build-manifest.json +9 -0
  364. package/.next/server/app/api/server/agent/route/server-reference-manifest.json +4 -0
  365. package/.next/server/app/api/server/agent/route.js +10 -0
  366. package/.next/server/app/api/server/agent/route.js.nft.json +1 -0
  367. package/.next/server/app/api/server/agent/route_client-reference-manifest.js +3 -0
  368. package/.next/server/app/api/server/download/route/app-paths-manifest.json +3 -0
  369. package/.next/server/app/api/server/download/route/build-manifest.json +9 -0
  370. package/.next/server/app/api/server/download/route/server-reference-manifest.json +4 -0
  371. package/.next/server/app/api/server/download/route.js +9 -0
  372. package/.next/server/app/api/server/download/route.js.nft.json +1 -0
  373. package/.next/server/app/api/server/download/route_client-reference-manifest.js +3 -0
  374. package/.next/server/app/api/server/generate/route/app-paths-manifest.json +3 -0
  375. package/.next/server/app/api/server/generate/route/build-manifest.json +9 -0
  376. package/.next/server/app/api/server/generate/route/server-reference-manifest.json +4 -0
  377. package/.next/server/app/api/server/generate/route.js +10 -0
  378. package/.next/server/app/api/server/generate/route.js.nft.json +1 -0
  379. package/.next/server/app/api/server/generate/route_client-reference-manifest.js +3 -0
  380. package/.next/server/app/api/server/local/route/app-paths-manifest.json +3 -0
  381. package/.next/server/app/api/server/local/route/build-manifest.json +9 -0
  382. package/.next/server/app/api/server/local/route/server-reference-manifest.json +4 -0
  383. package/.next/server/app/api/server/local/route.js +10 -0
  384. package/.next/server/app/api/server/local/route.js.nft.json +1 -0
  385. package/.next/server/app/api/server/local/route_client-reference-manifest.js +3 -0
  386. package/.next/server/app/api/servers/route/app-paths-manifest.json +3 -0
  387. package/.next/server/app/api/servers/route/build-manifest.json +9 -0
  388. package/.next/server/app/api/servers/route/server-reference-manifest.json +4 -0
  389. package/.next/server/app/api/servers/route.js +10 -0
  390. package/.next/server/app/api/servers/route.js.nft.json +1 -0
  391. package/.next/server/app/api/servers/route_client-reference-manifest.js +3 -0
  392. package/.next/server/app/api/tabular/query/route/app-paths-manifest.json +3 -0
  393. package/.next/server/app/api/tabular/query/route/build-manifest.json +9 -0
  394. package/.next/server/app/api/tabular/query/route/server-reference-manifest.json +4 -0
  395. package/.next/server/app/api/tabular/query/route.js +8 -0
  396. package/.next/server/app/api/tabular/query/route.js.nft.json +1 -0
  397. package/.next/server/app/api/tabular/query/route_client-reference-manifest.js +3 -0
  398. package/.next/server/app/api/tabular/route/app-paths-manifest.json +3 -0
  399. package/.next/server/app/api/tabular/route/build-manifest.json +9 -0
  400. package/.next/server/app/api/tabular/route/server-reference-manifest.json +4 -0
  401. package/.next/server/app/api/tabular/route.js +8 -0
  402. package/.next/server/app/api/tabular/route.js.nft.json +1 -0
  403. package/.next/server/app/api/tabular/route_client-reference-manifest.js +3 -0
  404. package/.next/server/app/api/upload-file/route/app-paths-manifest.json +3 -0
  405. package/.next/server/app/api/upload-file/route/build-manifest.json +9 -0
  406. package/.next/server/app/api/upload-file/route/server-reference-manifest.json +4 -0
  407. package/.next/server/app/api/upload-file/route.js +8 -0
  408. package/.next/server/app/api/upload-file/route.js.nft.json +1 -0
  409. package/.next/server/app/api/upload-file/route_client-reference-manifest.js +3 -0
  410. package/.next/server/app/api/uploads/[...slug]/route/app-paths-manifest.json +3 -0
  411. package/.next/server/app/api/uploads/[...slug]/route/build-manifest.json +9 -0
  412. package/.next/server/app/api/uploads/[...slug]/route/server-reference-manifest.json +4 -0
  413. package/.next/server/app/api/uploads/[...slug]/route.js +8 -0
  414. package/.next/server/app/api/uploads/[...slug]/route.js.nft.json +1 -0
  415. package/.next/server/app/api/uploads/[...slug]/route_client-reference-manifest.js +3 -0
  416. package/.next/server/app/api/vector-stores/install/route/app-paths-manifest.json +3 -0
  417. package/.next/server/app/api/vector-stores/install/route/build-manifest.json +9 -0
  418. package/.next/server/app/api/vector-stores/install/route/server-reference-manifest.json +4 -0
  419. package/.next/server/app/api/vector-stores/install/route.js +8 -0
  420. package/.next/server/app/api/vector-stores/install/route.js.nft.json +1 -0
  421. package/.next/server/app/api/vector-stores/install/route_client-reference-manifest.js +3 -0
  422. package/.next/server/app/api/vector-stores/status/route/app-paths-manifest.json +3 -0
  423. package/.next/server/app/api/vector-stores/status/route/build-manifest.json +9 -0
  424. package/.next/server/app/api/vector-stores/status/route/server-reference-manifest.json +4 -0
  425. package/.next/server/app/api/vector-stores/status/route.js +8 -0
  426. package/.next/server/app/api/vector-stores/status/route.js.nft.json +1 -0
  427. package/.next/server/app/api/vector-stores/status/route_client-reference-manifest.js +3 -0
  428. package/.next/server/app/chat/page/app-paths-manifest.json +3 -0
  429. package/.next/server/app/chat/page/build-manifest.json +18 -0
  430. package/.next/server/app/chat/page/next-font-manifest.json +11 -0
  431. package/.next/server/app/chat/page/react-loadable-manifest.json +1 -0
  432. package/.next/server/app/chat/page/server-reference-manifest.json +4 -0
  433. package/.next/server/app/chat/page.js +15 -0
  434. package/.next/server/app/chat/page.js.nft.json +1 -0
  435. package/.next/server/app/chat/page_client-reference-manifest.js +3 -0
  436. package/.next/server/app/chat.html +1 -0
  437. package/.next/server/app/chat.meta +15 -0
  438. package/.next/server/app/chat.rsc +29 -0
  439. package/.next/server/app/chat.segments/_full.segment.rsc +29 -0
  440. package/.next/server/app/chat.segments/_head.segment.rsc +6 -0
  441. package/.next/server/app/chat.segments/_index.segment.rsc +14 -0
  442. package/.next/server/app/chat.segments/_tree.segment.rsc +5 -0
  443. package/.next/server/app/chat.segments/chat/__PAGE__.segment.rsc +6 -0
  444. package/.next/server/app/chat.segments/chat.segment.rsc +5 -0
  445. package/.next/server/app/data/page/app-paths-manifest.json +3 -0
  446. package/.next/server/app/data/page/build-manifest.json +18 -0
  447. package/.next/server/app/data/page/next-font-manifest.json +11 -0
  448. package/.next/server/app/data/page/react-loadable-manifest.json +1 -0
  449. package/.next/server/app/data/page/server-reference-manifest.json +4 -0
  450. package/.next/server/app/data/page.js +15 -0
  451. package/.next/server/app/data/page.js.nft.json +1 -0
  452. package/.next/server/app/data/page_client-reference-manifest.js +3 -0
  453. package/.next/server/app/data.html +1 -0
  454. package/.next/server/app/data.meta +15 -0
  455. package/.next/server/app/data.rsc +32 -0
  456. package/.next/server/app/data.segments/_full.segment.rsc +32 -0
  457. package/.next/server/app/data.segments/_head.segment.rsc +6 -0
  458. package/.next/server/app/data.segments/_index.segment.rsc +14 -0
  459. package/.next/server/app/data.segments/_tree.segment.rsc +5 -0
  460. package/.next/server/app/data.segments/data/__PAGE__.segment.rsc +6 -0
  461. package/.next/server/app/data.segments/data.segment.rsc +5 -0
  462. package/.next/server/app/favicon.ico/route/app-paths-manifest.json +3 -0
  463. package/.next/server/app/favicon.ico/route/build-manifest.json +9 -0
  464. package/.next/server/app/favicon.ico/route.js +8 -0
  465. package/.next/server/app/favicon.ico/route.js.nft.json +1 -0
  466. package/.next/server/app/favicon.ico.body +0 -0
  467. package/.next/server/app/favicon.ico.meta +1 -0
  468. package/.next/server/app/index.html +1 -0
  469. package/.next/server/app/index.meta +14 -0
  470. package/.next/server/app/index.rsc +26 -0
  471. package/.next/server/app/index.segments/__PAGE__.segment.rsc +6 -0
  472. package/.next/server/app/index.segments/_full.segment.rsc +26 -0
  473. package/.next/server/app/index.segments/_head.segment.rsc +6 -0
  474. package/.next/server/app/index.segments/_index.segment.rsc +14 -0
  475. package/.next/server/app/index.segments/_tree.segment.rsc +5 -0
  476. package/.next/server/app/page/app-paths-manifest.json +3 -0
  477. package/.next/server/app/page/build-manifest.json +18 -0
  478. package/.next/server/app/page/next-font-manifest.json +11 -0
  479. package/.next/server/app/page/react-loadable-manifest.json +1 -0
  480. package/.next/server/app/page/server-reference-manifest.json +4 -0
  481. package/.next/server/app/page.js +16 -0
  482. package/.next/server/app/page.js.nft.json +1 -0
  483. package/.next/server/app/page_client-reference-manifest.js +3 -0
  484. package/.next/server/app/settings/page/app-paths-manifest.json +3 -0
  485. package/.next/server/app/settings/page/build-manifest.json +18 -0
  486. package/.next/server/app/settings/page/next-font-manifest.json +11 -0
  487. package/.next/server/app/settings/page/react-loadable-manifest.json +1 -0
  488. package/.next/server/app/settings/page/server-reference-manifest.json +41 -0
  489. package/.next/server/app/settings/page.js +16 -0
  490. package/.next/server/app/settings/page.js.nft.json +1 -0
  491. package/.next/server/app/settings/page_client-reference-manifest.js +3 -0
  492. package/.next/server/app/settings.html +1 -0
  493. package/.next/server/app/settings.meta +15 -0
  494. package/.next/server/app/settings.rsc +31 -0
  495. package/.next/server/app/settings.segments/_full.segment.rsc +31 -0
  496. package/.next/server/app/settings.segments/_head.segment.rsc +6 -0
  497. package/.next/server/app/settings.segments/_index.segment.rsc +14 -0
  498. package/.next/server/app/settings.segments/_tree.segment.rsc +5 -0
  499. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +9 -0
  500. package/.next/server/app/settings.segments/settings.segment.rsc +5 -0
  501. package/.next/server/app-paths-manifest.json +69 -0
  502. package/.next/server/chunks/00i._ai_dist_index_mjs_0u4.k1t._.js +34 -0
  503. package/.next/server/chunks/02dz_web__next-internal_server_app_api_config_test-embedding_route_actions_09--owe.js +3 -0
  504. package/.next/server/chunks/02dz_web__next-internal_server_app_api_config_test-provider_route_actions_0l6xr0t.js +3 -0
  505. package/.next/server/chunks/02dz_web__next-internal_server_app_api_deploy_cloud-project_route_actions_0pghds2.js +3 -0
  506. package/.next/server/chunks/02dz_web__next-internal_server_app_api_deployment_blob-setup_route_actions_0f55gkq.js +3 -0
  507. package/.next/server/chunks/02dz_web__next-internal_server_app_api_doc-editor_extract-text_route_actions_0dzj6iq.js +3 -0
  508. package/.next/server/chunks/02dz_web__next-internal_server_app_api_marketplace_[toolId]_route_actions_0cxbtrw.js +3 -0
  509. package/.next/server/chunks/02dz_web__next-internal_server_app_api_vector-stores_install_route_actions_0_220fs.js +3 -0
  510. package/.next/server/chunks/02dz_web__next-internal_server_app_api_vector-stores_status_route_actions_0~_~b02.js +3 -0
  511. package/.next/server/chunks/0gvc_next_03p7xh-._.js +13 -0
  512. package/.next/server/chunks/0gvc_next_dist_esm_build_templates_app-route_0--xko7.js +24 -0
  513. package/.next/server/chunks/0gvc_next_dist_esm_build_templates_app-route_0.07y39.js +3 -0
  514. package/.next/server/chunks/0gvc_next_dist_esm_build_templates_app-route_04i84m2.js +10 -0
  515. package/.next/server/chunks/0gvc_next_dist_esm_build_templates_app-route_05yqn19.js +3 -0
  516. package/.next/server/chunks/0gvc_next_dist_esm_build_templates_app-route_0_c4eox.js +3 -0
  517. package/.next/server/chunks/0m6-_@ai-sdk_anthropic_dist_index_093y5mm.js +10 -0
  518. package/.next/server/chunks/0nf3_next-internal_server_app_api_integrations_notion_callback_route_actions_0hyfnmw.js +3 -0
  519. package/.next/server/chunks/0ntz_@ai-sdk_openai_dist_index_mjs_03ljy2u._.js +13 -0
  520. package/.next/server/chunks/0ozc_@vercel_oidc_dist_token_0m1934l.js +3 -0
  521. package/.next/server/chunks/0rgj_zod_v4_0ponial._.js +64 -0
  522. package/.next/server/chunks/0rgj_zod_v4_0zoqna9._.js +64 -0
  523. package/.next/server/chunks/[externals]__01hpkma._.js +3 -0
  524. package/.next/server/chunks/[externals]__01tm01i._.js +3 -0
  525. package/.next/server/chunks/[externals]_chromadb_0goja~y._.js +3 -0
  526. package/.next/server/chunks/[externals]_fs_0eo4gmu._.js +3 -0
  527. package/.next/server/chunks/[externals]_path_0.09pfe._.js +3 -0
  528. package/.next/server/chunks/[externals]_stream_0g9s3ok._.js +3 -0
  529. package/.next/server/chunks/[root-of-the-server]__0--6uey._.js +3 -0
  530. package/.next/server/chunks/[root-of-the-server]__0.qd1p3._.js +3 -0
  531. package/.next/server/chunks/[root-of-the-server]__0.r5yhr._.js +49 -0
  532. package/.next/server/chunks/[root-of-the-server]__0036943._.js +199 -0
  533. package/.next/server/chunks/[root-of-the-server]__00a7cyb._.js +3 -0
  534. package/.next/server/chunks/[root-of-the-server]__00nqa2u._.js +59 -0
  535. package/.next/server/chunks/[root-of-the-server]__0111be7._.js +3 -0
  536. package/.next/server/chunks/[root-of-the-server]__02c_z~9._.js +3 -0
  537. package/.next/server/chunks/[root-of-the-server]__02cpmox._.js +105 -0
  538. package/.next/server/chunks/[root-of-the-server]__02p-tv7._.js +105 -0
  539. package/.next/server/chunks/[root-of-the-server]__02p34d7._.js +3 -0
  540. package/.next/server/chunks/[root-of-the-server]__02t_0g7._.js +59 -0
  541. package/.next/server/chunks/[root-of-the-server]__03-x3no._.js +3 -0
  542. package/.next/server/chunks/[root-of-the-server]__03l~uw5._.js +143 -0
  543. package/.next/server/chunks/[root-of-the-server]__044l2_f._.js +143 -0
  544. package/.next/server/chunks/[root-of-the-server]__04kopvt._.js +63 -0
  545. package/.next/server/chunks/[root-of-the-server]__04l~ip-._.js +59 -0
  546. package/.next/server/chunks/[root-of-the-server]__04visk8._.js +105 -0
  547. package/.next/server/chunks/[root-of-the-server]__05wk..v._.js +3 -0
  548. package/.next/server/chunks/[root-of-the-server]__05x8tmf._.js +59 -0
  549. package/.next/server/chunks/[root-of-the-server]__06l96vc._.js +59 -0
  550. package/.next/server/chunks/[root-of-the-server]__06ohoeu._.js +59 -0
  551. package/.next/server/chunks/[root-of-the-server]__072q335._.js +3 -0
  552. package/.next/server/chunks/[root-of-the-server]__07_1411._.js +59 -0
  553. package/.next/server/chunks/[root-of-the-server]__09kos0n._.js +3 -0
  554. package/.next/server/chunks/[root-of-the-server]__09oyip3._.js +3 -0
  555. package/.next/server/chunks/[root-of-the-server]__09rsmk2._.js +3 -0
  556. package/.next/server/chunks/[root-of-the-server]__0_by00t._.js +11 -0
  557. package/.next/server/chunks/[root-of-the-server]__0a9jp5~._.js +3 -0
  558. package/.next/server/chunks/[root-of-the-server]__0acpo9m._.js +59 -0
  559. package/.next/server/chunks/[root-of-the-server]__0b17yoc._.js +3 -0
  560. package/.next/server/chunks/[root-of-the-server]__0cumfx6._.js +9 -0
  561. package/.next/server/chunks/[root-of-the-server]__0d7p0xo._.js +3 -0
  562. package/.next/server/chunks/[root-of-the-server]__0e_itje._.js +3 -0
  563. package/.next/server/chunks/[root-of-the-server]__0exyn0q._.js +88 -0
  564. package/.next/server/chunks/[root-of-the-server]__0fcf_rl._.js +59 -0
  565. package/.next/server/chunks/[root-of-the-server]__0f~eq1-._.js +59 -0
  566. package/.next/server/chunks/[root-of-the-server]__0g36cgg._.js +143 -0
  567. package/.next/server/chunks/[root-of-the-server]__0g4hq1o._.js +3 -0
  568. package/.next/server/chunks/[root-of-the-server]__0i9fj76._.js +3 -0
  569. package/.next/server/chunks/[root-of-the-server]__0lczaer._.js +143 -0
  570. package/.next/server/chunks/[root-of-the-server]__0ljy49-._.js +59 -0
  571. package/.next/server/chunks/[root-of-the-server]__0lk5hkk._.js +3 -0
  572. package/.next/server/chunks/[root-of-the-server]__0n0nerw._.js +59 -0
  573. package/.next/server/chunks/[root-of-the-server]__0np09bv._.js +3 -0
  574. package/.next/server/chunks/[root-of-the-server]__0ns~dg6._.js +3 -0
  575. package/.next/server/chunks/[root-of-the-server]__0oh5wgp._.js +59 -0
  576. package/.next/server/chunks/[root-of-the-server]__0oyc7s4._.js +105 -0
  577. package/.next/server/chunks/[root-of-the-server]__0pg~eys._.js +59 -0
  578. package/.next/server/chunks/[root-of-the-server]__0qhpl6k._.js +3 -0
  579. package/.next/server/chunks/[root-of-the-server]__0qhwzn-._.js +21 -0
  580. package/.next/server/chunks/[root-of-the-server]__0qs73xp._.js +143 -0
  581. package/.next/server/chunks/[root-of-the-server]__0qtx78g._.js +59 -0
  582. package/.next/server/chunks/[root-of-the-server]__0r03jcl._.js +59 -0
  583. package/.next/server/chunks/[root-of-the-server]__0rdjqpy._.js +3 -0
  584. package/.next/server/chunks/[root-of-the-server]__0sb7d93._.js +59 -0
  585. package/.next/server/chunks/[root-of-the-server]__0t36t5o._.js +60 -0
  586. package/.next/server/chunks/[root-of-the-server]__0t_hp52._.js +59 -0
  587. package/.next/server/chunks/[root-of-the-server]__0udlgj6._.js +3 -0
  588. package/.next/server/chunks/[root-of-the-server]__0ufk3d0._.js +3 -0
  589. package/.next/server/chunks/[root-of-the-server]__0uu6oan._.js +3 -0
  590. package/.next/server/chunks/[root-of-the-server]__0v.0gyp._.js +3 -0
  591. package/.next/server/chunks/[root-of-the-server]__0v03x56._.js +59 -0
  592. package/.next/server/chunks/[root-of-the-server]__0v4bbce._.js +59 -0
  593. package/.next/server/chunks/[root-of-the-server]__0v67rlo._.js +3 -0
  594. package/.next/server/chunks/[root-of-the-server]__0vcdpoc._.js +59 -0
  595. package/.next/server/chunks/[root-of-the-server]__0veqa4o._.js +3 -0
  596. package/.next/server/chunks/[root-of-the-server]__0wvxpqf._.js +59 -0
  597. package/.next/server/chunks/[root-of-the-server]__0wyl7x5._.js +59 -0
  598. package/.next/server/chunks/[root-of-the-server]__0y5y7tu._.js +3 -0
  599. package/.next/server/chunks/[root-of-the-server]__0yo._sm._.js +3 -0
  600. package/.next/server/chunks/[root-of-the-server]__0yx8vxp._.js +59 -0
  601. package/.next/server/chunks/[root-of-the-server]__0zh8t6z._.js +59 -0
  602. package/.next/server/chunks/[root-of-the-server]__0~q2fro._.js +59 -0
  603. package/.next/server/chunks/[root-of-the-server]__0~wsw0_._.js +3 -0
  604. package/.next/server/chunks/[root-of-the-server]__100gqj0._.js +143 -0
  605. package/.next/server/chunks/[root-of-the-server]__10au-r5._.js +13 -0
  606. package/.next/server/chunks/[root-of-the-server]__10d58x4._.js +59 -0
  607. package/.next/server/chunks/[root-of-the-server]__10zm06g._.js +143 -0
  608. package/.next/server/chunks/[root-of-the-server]__12kvuvp._.js +59 -0
  609. package/.next/server/chunks/[root-of-the-server]__13gq0t2._.js +3 -0
  610. package/.next/server/chunks/[turbopack]_runtime.js +903 -0
  611. package/.next/server/chunks/_01kokno._.js +3 -0
  612. package/.next/server/chunks/_059f-.0._.js +258 -0
  613. package/.next/server/chunks/_071mhy1._.js +32 -0
  614. package/.next/server/chunks/apps_web__next-internal_server_app_api_analytics_route_actions_0.uxcnt.js +3 -0
  615. package/.next/server/chunks/apps_web__next-internal_server_app_api_chat_route_actions_0q6zwqv.js +3 -0
  616. package/.next/server/chunks/apps_web__next-internal_server_app_api_chat_status_route_actions_0t_21~v.js +3 -0
  617. package/.next/server/chunks/apps_web__next-internal_server_app_api_chat_suggestions_route_actions_01umx_-.js +3 -0
  618. package/.next/server/chunks/apps_web__next-internal_server_app_api_config_route_actions_0-4ivvk.js +3 -0
  619. package/.next/server/chunks/apps_web__next-internal_server_app_api_config_test-llm_route_actions_0z5ew-0.js +3 -0
  620. package/.next/server/chunks/apps_web__next-internal_server_app_api_config_test_route_actions_08cur6r.js +3 -0
  621. package/.next/server/chunks/apps_web__next-internal_server_app_api_config_verify_route_actions_0hid6b..js +3 -0
  622. package/.next/server/chunks/apps_web__next-internal_server_app_api_connections_route_actions_0q3wdg3.js +3 -0
  623. package/.next/server/chunks/apps_web__next-internal_server_app_api_connections_webhook_route_actions_0wa28~b.js +3 -0
  624. package/.next/server/chunks/apps_web__next-internal_server_app_api_demo_route_actions_05lntn3.js +3 -0
  625. package/.next/server/chunks/apps_web__next-internal_server_app_api_deploy_ssh_route_actions_0r44rn0.js +3 -0
  626. package/.next/server/chunks/apps_web__next-internal_server_app_api_deployment_config_route_actions_0bkon.m.js +3 -0
  627. package/.next/server/chunks/apps_web__next-internal_server_app_api_describe-image_route_actions_0pmvs8v.js +3 -0
  628. package/.next/server/chunks/apps_web__next-internal_server_app_api_doc-editor_edit_route_actions_10hrovj.js +3 -0
  629. package/.next/server/chunks/apps_web__next-internal_server_app_api_doc-editor_export_route_actions_0rff01q.js +3 -0
  630. package/.next/server/chunks/apps_web__next-internal_server_app_api_doc-editor_parse_route_actions_0fkx6xw.js +3 -0
  631. package/.next/server/chunks/apps_web__next-internal_server_app_api_doc-editor_restore_route_actions_0g9uodw.js +3 -0
  632. package/.next/server/chunks/apps_web__next-internal_server_app_api_document_sign_route_actions_0_6rnl_.js +3 -0
  633. package/.next/server/chunks/apps_web__next-internal_server_app_api_documents_route_actions_0l2znaz.js +3 -0
  634. package/.next/server/chunks/apps_web__next-internal_server_app_api_firecrawl_local_route_actions_0ubjaim.js +3 -0
  635. package/.next/server/chunks/apps_web__next-internal_server_app_api_index_route_actions_0~2989e.js +3 -0
  636. package/.next/server/chunks/apps_web__next-internal_server_app_api_integrations_notion_route_actions_08es~5e.js +3 -0
  637. package/.next/server/chunks/apps_web__next-internal_server_app_api_jobs_[id]_route_actions_0.l39qd.js +3 -0
  638. package/.next/server/chunks/apps_web__next-internal_server_app_api_jobs_route_actions_08kx~8-.js +3 -0
  639. package/.next/server/chunks/apps_web__next-internal_server_app_api_marketplace_route_actions_0z~vymm.js +3 -0
  640. package/.next/server/chunks/apps_web__next-internal_server_app_api_media_[id]_route_actions_0wsnidd.js +3 -0
  641. package/.next/server/chunks/apps_web__next-internal_server_app_api_media_process_route_actions_0_j9maz.js +3 -0
  642. package/.next/server/chunks/apps_web__next-internal_server_app_api_media_route_actions_01szz-1.js +3 -0
  643. package/.next/server/chunks/apps_web__next-internal_server_app_api_media_stream_route_actions_0h2x_~2.js +3 -0
  644. package/.next/server/chunks/apps_web__next-internal_server_app_api_models_route_actions_0ervfbf.js +3 -0
  645. package/.next/server/chunks/apps_web__next-internal_server_app_api_parse-file_route_actions_134wu5p.js +3 -0
  646. package/.next/server/chunks/apps_web__next-internal_server_app_api_proxy_verify_route_actions_11frmb9.js +3 -0
  647. package/.next/server/chunks/apps_web__next-internal_server_app_api_sandbox_route_actions_0y9te9y.js +3 -0
  648. package/.next/server/chunks/apps_web__next-internal_server_app_api_search_bing_route_actions_0pfrdr1.js +3 -0
  649. package/.next/server/chunks/apps_web__next-internal_server_app_api_search_brave_route_actions_0sij14a.js +3 -0
  650. package/.next/server/chunks/apps_web__next-internal_server_app_api_search_exa_route_actions_013do9i.js +3 -0
  651. package/.next/server/chunks/apps_web__next-internal_server_app_api_search_google_route_actions_02aoghr.js +3 -0
  652. package/.next/server/chunks/apps_web__next-internal_server_app_api_search_route_actions_0_2o9ph.js +3 -0
  653. package/.next/server/chunks/apps_web__next-internal_server_app_api_search_tavily_route_actions_0z0cnd4.js +3 -0
  654. package/.next/server/chunks/apps_web__next-internal_server_app_api_search_verify_route_actions_0xtygzs.js +3 -0
  655. package/.next/server/chunks/apps_web__next-internal_server_app_api_server_agent_route_actions_11xuz1m.js +3 -0
  656. package/.next/server/chunks/apps_web__next-internal_server_app_api_server_download_route_actions_0vdr_bn.js +3 -0
  657. package/.next/server/chunks/apps_web__next-internal_server_app_api_server_generate_route_actions_12qf.pa.js +3 -0
  658. package/.next/server/chunks/apps_web__next-internal_server_app_api_server_local_route_actions_0c~tchb.js +3 -0
  659. package/.next/server/chunks/apps_web__next-internal_server_app_api_servers_route_actions_0_qimaq.js +3 -0
  660. package/.next/server/chunks/apps_web__next-internal_server_app_api_tabular_query_route_actions_0m_i8~j.js +3 -0
  661. package/.next/server/chunks/apps_web__next-internal_server_app_api_tabular_route_actions_06xgjmg.js +3 -0
  662. package/.next/server/chunks/apps_web__next-internal_server_app_api_upload-file_route_actions_0-df~h8.js +3 -0
  663. package/.next/server/chunks/apps_web__next-internal_server_app_api_uploads_[___slug]_route_actions_0-6rd8s.js +3 -0
  664. package/.next/server/chunks/apps_web__next-internal_server_app_favicon_ico_route_actions_0h5n1et.js +3 -0
  665. package/.next/server/chunks/node_modules__pnpm_00a45hz._.js +15 -0
  666. package/.next/server/chunks/node_modules__pnpm_01evtue._.js +36 -0
  667. package/.next/server/chunks/node_modules__pnpm_058qmaf._.js +36 -0
  668. package/.next/server/chunks/node_modules__pnpm_090g2s3._.js +3 -0
  669. package/.next/server/chunks/node_modules__pnpm_0of6.x_._.js +3 -0
  670. package/.next/server/chunks/node_modules__pnpm_0tui34u._.js +5 -0
  671. package/.next/server/chunks/node_modules__pnpm_11fyqx5._.js +15 -0
  672. package/.next/server/chunks/node_modules__pnpm_12rdsen._.js +36 -0
  673. package/.next/server/chunks/packages_070bs61._.js +3 -0
  674. package/.next/server/chunks/packages_0jmx5.-._.js +3 -0
  675. package/.next/server/chunks/packages_core_src_analytics-store_ts_03tqnqs._.js +3 -0
  676. package/.next/server/chunks/packages_core_src_embeddings_providers_ts_05f4_w-._.js +19 -0
  677. package/.next/server/chunks/packages_core_src_embeddings_registry_ts_031sc7-._.js +3 -0
  678. package/.next/server/chunks/packages_core_src_generator_generate-server_ts_0mt.je3._.js +1145 -0
  679. package/.next/server/chunks/packages_core_src_generator_server-runtime_ts_127f0ye._.js +648 -0
  680. package/.next/server/chunks/packages_core_src_index-store_ts_13sjtkb._.js +3 -0
  681. package/.next/server/chunks/packages_core_src_indexing_embedder_ts_0h75r~u._.js +20 -0
  682. package/.next/server/chunks/packages_core_src_media-store_ts_0v0lx36._.js +3 -0
  683. package/.next/server/chunks/packages_core_src_models-list_ts_03-odl5._.js +3 -0
  684. package/.next/server/chunks/packages_marketplace_src_0mxp_e3._.js +3 -0
  685. package/.next/server/chunks/packages_marketplace_src_storage-provider_ts_0mbs32-._.js +3 -0
  686. package/.next/server/chunks/packages_vector-stores_src_044u_tk._.js +3 -0
  687. package/.next/server/chunks/ssr/0ay0_framer-motion_dist_es_render_components_motion_proxy_mjs_00idub3._.js +3 -0
  688. package/.next/server/chunks/ssr/0gvc_next_dist_0e.uypd._.js +6 -0
  689. package/.next/server/chunks/ssr/0gvc_next_dist_client_components_0mj6fnc._.js +3 -0
  690. package/.next/server/chunks/ssr/0gvc_next_dist_client_components_builtin_forbidden_10qct8z.js +3 -0
  691. package/.next/server/chunks/ssr/0gvc_next_dist_client_components_builtin_global-error_0azu6.3.js +3 -0
  692. package/.next/server/chunks/ssr/0gvc_next_dist_client_components_builtin_unauthorized_03b6_.w.js +3 -0
  693. package/.next/server/chunks/ssr/0gvc_next_dist_esm_build_templates_app-page_0-imr0z.js +4 -0
  694. package/.next/server/chunks/ssr/0gvc_next_dist_esm_build_templates_app-page_00l31p..js +4 -0
  695. package/.next/server/chunks/ssr/0gvc_next_dist_esm_build_templates_app-page_0cjdc2w.js +4 -0
  696. package/.next/server/chunks/ssr/0gvc_next_dist_esm_build_templates_app-page_0fsrb82.js +4 -0
  697. package/.next/server/chunks/ssr/0gvc_next_dist_esm_build_templates_app-page_0l3eneq.js +4 -0
  698. package/.next/server/chunks/ssr/0gvc_next_dist_esm_build_templates_app-page_0l6387r.js +4 -0
  699. package/.next/server/chunks/ssr/0gvc_next_dist_esm_build_templates_app-page_0pk8tjk.js +4 -0
  700. package/.next/server/chunks/ssr/0hhw_pdfjs-dist_build_pdf_mjs_0emol.8._.js +47 -0
  701. package/.next/server/chunks/ssr/0ozc_@vercel_oidc_dist_token_0qkzh69.js +3 -0
  702. package/.next/server/chunks/ssr/[root-of-the-server]__03nybtv._.js +3 -0
  703. package/.next/server/chunks/ssr/[root-of-the-server]__061054q._.js +33 -0
  704. package/.next/server/chunks/ssr/[root-of-the-server]__0_lfs3c._.js +3 -0
  705. package/.next/server/chunks/ssr/[root-of-the-server]__0bxkvem._.js +3 -0
  706. package/.next/server/chunks/ssr/[root-of-the-server]__0ciwgj6._.js +3 -0
  707. package/.next/server/chunks/ssr/[root-of-the-server]__0f10~ff._.js +3 -0
  708. package/.next/server/chunks/ssr/[root-of-the-server]__0l9758p._.js +3 -0
  709. package/.next/server/chunks/ssr/[root-of-the-server]__0mib-aw._.js +3 -0
  710. package/.next/server/chunks/ssr/[root-of-the-server]__0o6u8a1._.js +3 -0
  711. package/.next/server/chunks/ssr/[root-of-the-server]__0q-0ign._.js +33 -0
  712. package/.next/server/chunks/ssr/[root-of-the-server]__0u7t7hm._.js +3 -0
  713. package/.next/server/chunks/ssr/[root-of-the-server]__0yxrvhy._.js +3 -0
  714. package/.next/server/chunks/ssr/[root-of-the-server]__0z9yy2_._.js +3 -0
  715. package/.next/server/chunks/ssr/[root-of-the-server]__0zl.q74._.js +3 -0
  716. package/.next/server/chunks/ssr/[turbopack]_runtime.js +903 -0
  717. package/.next/server/chunks/ssr/_0-uky5v._.js +3 -0
  718. package/.next/server/chunks/ssr/_0007q7_._.js +3 -0
  719. package/.next/server/chunks/ssr/_003vid-._.js +3 -0
  720. package/.next/server/chunks/ssr/_03casre._.js +6 -0
  721. package/.next/server/chunks/ssr/_06imf71._.js +4 -0
  722. package/.next/server/chunks/ssr/_08uade7._.js +3 -0
  723. package/.next/server/chunks/ssr/_09~o4f.._.js +13 -0
  724. package/.next/server/chunks/ssr/_0_aolb-._.js +3 -0
  725. package/.next/server/chunks/ssr/_0_zom3a._.js +3 -0
  726. package/.next/server/chunks/ssr/_0erod4k._.js +3 -0
  727. package/.next/server/chunks/ssr/_0gh6844._.js +3 -0
  728. package/.next/server/chunks/ssr/_0h9s_hw._.js +3 -0
  729. package/.next/server/chunks/ssr/_0p1j64v._.js +3 -0
  730. package/.next/server/chunks/ssr/_0qi5c9~._.js +132 -0
  731. package/.next/server/chunks/ssr/_0qopd-r._.js +120 -0
  732. package/.next/server/chunks/ssr/_0s5_0n1._.js +3 -0
  733. package/.next/server/chunks/ssr/_11.lrfy._.js +6 -0
  734. package/.next/server/chunks/ssr/_13gucvb._.js +3 -0
  735. package/.next/server/chunks/ssr/apps_web__next-internal_server_app__global-error_page_actions_0.u5cfa.js +3 -0
  736. package/.next/server/chunks/ssr/apps_web__next-internal_server_app__not-found_page_actions_0appun9.js +3 -0
  737. package/.next/server/chunks/ssr/apps_web__next-internal_server_app_analytics_page_actions_04e3dmk.js +3 -0
  738. package/.next/server/chunks/ssr/apps_web__next-internal_server_app_chat_page_actions_0x9i55t.js +3 -0
  739. package/.next/server/chunks/ssr/apps_web__next-internal_server_app_data_page_actions_0f9t7xs.js +3 -0
  740. package/.next/server/chunks/ssr/apps_web__next-internal_server_app_page_actions_0rm5_5w.js +3 -0
  741. package/.next/server/chunks/ssr/apps_web_app_template_tsx_0.4m7c9._.js +3 -0
  742. package/.next/server/chunks/ssr/apps_web_app_template_tsx_0j2myib._.js +3 -0
  743. package/.next/server/chunks/ssr/apps_web_components_analytics_analytics-dashboard_tsx_0lrr85m._.js +3 -0
  744. package/.next/server/chunks/ssr/apps_web_components_ui_tabs_tsx_0435ww5._.js +3 -0
  745. package/.next/server/chunks/ssr/apps_web_lib_pdf-images_ts_0nzct~e._.js +3 -0
  746. package/.next/server/chunks/ssr/node_modules__pnpm_0auud-z._.js +3 -0
  747. package/.next/server/chunks/ssr/node_modules__pnpm_0efi01o._.js +3 -0
  748. package/.next/server/chunks/ssr/node_modules__pnpm_0ge5k63._.js +3 -0
  749. package/.next/server/chunks/ssr/node_modules__pnpm_0j6v-w5._.js +3 -0
  750. package/.next/server/chunks/ssr/node_modules__pnpm_0jmin55._.js +33 -0
  751. package/.next/server/chunks/ssr/node_modules__pnpm_0qjmu5-._.js +3 -0
  752. package/.next/server/chunks/ssr/node_modules__pnpm_0q~5d-e._.js +3 -0
  753. package/.next/server/chunks/ssr/node_modules__pnpm_0xnq.u3._.js +19 -0
  754. package/.next/server/chunks/ssr/packages_core_src_generator_generate-server_ts_0o.y7vi._.js +1145 -0
  755. package/.next/server/functions-config-manifest.json +52 -0
  756. package/.next/server/interception-route-rewrite-manifest.js +1 -0
  757. package/.next/server/middleware-build-manifest.js +22 -0
  758. package/.next/server/middleware-manifest.json +6 -0
  759. package/.next/server/next-font-manifest.js +1 -0
  760. package/.next/server/next-font-manifest.json +31 -0
  761. package/.next/server/pages/404.html +1 -0
  762. package/.next/server/pages/500.html +1 -0
  763. package/.next/server/pages-manifest.json +4 -0
  764. package/.next/server/prefetch-hints.json +1 -0
  765. package/.next/server/server-reference-manifest.js +1 -0
  766. package/.next/server/server-reference-manifest.json +42 -0
  767. package/.next/static/KqIuNxkoeAlhCusoxtMrS/_buildManifest.js +16 -0
  768. package/.next/static/KqIuNxkoeAlhCusoxtMrS/_clientMiddlewareManifest.js +1 -0
  769. package/.next/static/KqIuNxkoeAlhCusoxtMrS/_ssgManifest.js +1 -0
  770. package/.next/static/chunks/0-l-_.e4~p-tu.js +1 -0
  771. package/.next/static/chunks/00bdh97xa16uo.js +1 -0
  772. package/.next/static/chunks/00h-ng_jqta-2.js +1 -0
  773. package/.next/static/chunks/03jot0gqi~a10.js +1 -0
  774. package/.next/static/chunks/03~yq9q893hmn.js +1 -0
  775. package/.next/static/chunks/066jf0nk75nic.css +2 -0
  776. package/.next/static/chunks/06lztj0p4bq9f.js +31 -0
  777. package/.next/static/chunks/06mvsykkx_ufi.js +1 -0
  778. package/.next/static/chunks/090nmx8zs_1wf.js +1 -0
  779. package/.next/static/chunks/0_~l8kd_h3sbq.js +1 -0
  780. package/.next/static/chunks/0c-2rnxmjsotm.js +118 -0
  781. package/.next/static/chunks/0ho7lc.x2uknx.js +1 -0
  782. package/.next/static/chunks/0i-8kxwbvp9.l.js +129 -0
  783. package/.next/static/chunks/0l27y8_9hhe7s.js +4 -0
  784. package/.next/static/chunks/0q_qvc60_3aw4.js +1 -0
  785. package/.next/static/chunks/0r4ctb~yxw0ip.js +45 -0
  786. package/.next/static/chunks/0rp85cjcakb29.js +1 -0
  787. package/.next/static/chunks/0uawaqqylt5zw.css +1 -0
  788. package/.next/static/chunks/0ufxt21gvl.3g.js +1 -0
  789. package/.next/static/chunks/0vnayejbagbex.js +1 -0
  790. package/.next/static/chunks/0w6lgn24.0eip.js +1 -0
  791. package/.next/static/chunks/0wrbyfcre8l1-.js +1 -0
  792. package/.next/static/chunks/0xil-1~ra.qnv.js +1 -0
  793. package/.next/static/chunks/0zoh3o_.geqbv.js +1 -0
  794. package/.next/static/chunks/0~074ua5vk6f8.js +1 -0
  795. package/.next/static/chunks/0~_-3fik2n4-i.js +1 -0
  796. package/.next/static/chunks/10a_hianorzj3.js +1 -0
  797. package/.next/static/chunks/10k--lk9wf4pw.js +1 -0
  798. package/.next/static/chunks/14x~vj_4i-4bz.js +1 -0
  799. package/.next/static/chunks/15tyhmsp4jgmc.js +11 -0
  800. package/.next/static/chunks/16alfqkklv-bt.js +2 -0
  801. package/.next/static/chunks/176ixsksxtch_.js +1 -0
  802. package/.next/static/chunks/turbopack-06_~2vs.chjg_.js +1 -0
  803. package/.next/static/media/4fa387ec64143e14-s.0wkzw~je483f-.woff2 +0 -0
  804. package/.next/static/media/53b9e256198e5412-s.0-wfv7uh4i7h9.woff2 +0 -0
  805. package/.next/static/media/5ce348bf30bf5439-s.0zgw-jeven.3w.woff2 +0 -0
  806. package/.next/static/media/6306c77e7c8268e4-s.0rhz0arwfsn~5.woff2 +0 -0
  807. package/.next/static/media/7178b3e590c64307-s.0nx0ww8fni_q3.woff2 +0 -0
  808. package/.next/static/media/797e433ab948586e-s.p.08e28id.o-okb.woff2 +0 -0
  809. package/.next/static/media/7d817b4c03b0c5f1-s.0l76wvqk9d84w.woff2 +0 -0
  810. package/.next/static/media/8a480f0b521d4e75-s.0jzbimsg8vl84.woff2 +0 -0
  811. package/.next/static/media/bbc41e54d2fcbd21-s.0k4k9394f2q-k.woff2 +0 -0
  812. package/.next/static/media/caa3a2e1cccd8315-s.p.09~u27dqhyhd6.woff2 +0 -0
  813. package/.next/static/media/favicon.01rzdfen4476b.ico +0 -0
  814. package/.next/static/media/fef07dbb0973bf53-s.12tyk43_3sh9u.woff2 +0 -0
  815. package/.next/types/cache-life.d.ts +145 -0
  816. package/.next/types/routes.d.ts +136 -0
  817. package/.next/types/validator.ts +637 -0
  818. package/CHANGELOG.md +24 -0
  819. package/LICENSE +176 -0
  820. package/app/actions/vercel.ts +325 -152
  821. package/app/analytics/page.tsx +19 -0
  822. package/app/api/analytics/route.ts +31 -0
  823. package/app/api/chat/route.ts +331 -145
  824. package/app/api/chat/status/route.ts +73 -22
  825. package/app/api/chat/suggestions/route.ts +61 -48
  826. package/app/api/chat/tools.ts +995 -0
  827. package/app/api/config/route.ts +56 -32
  828. package/app/api/config/test/route.ts +33 -32
  829. package/app/api/config/test-llm/route.ts +9 -10
  830. package/app/api/config/verify/route.ts +315 -0
  831. package/app/api/connections/route.ts +39 -0
  832. package/app/api/connections/webhook/route.ts +43 -0
  833. package/app/api/demo/route.ts +32 -44
  834. package/app/api/deploy/cloud-project/route.ts +125 -0
  835. package/app/api/deploy/ssh/route.ts +173 -132
  836. package/app/api/deployment/blob-setup/route.ts +28 -0
  837. package/app/api/deployment/config/route.ts +23 -0
  838. package/app/api/describe-image/route.ts +84 -0
  839. package/app/api/doc-editor/edit/route.ts +88 -0
  840. package/app/api/doc-editor/export/route.ts +33 -0
  841. package/app/api/doc-editor/extract-text/route.ts +41 -0
  842. package/app/api/doc-editor/parse/route.ts +66 -0
  843. package/app/api/doc-editor/restore/route.ts +74 -0
  844. package/app/api/document/sign/route.ts +56 -0
  845. package/app/api/documents/route.ts +185 -35
  846. package/app/api/firecrawl/local/route.ts +63 -23
  847. package/app/api/index/route.ts +73 -59
  848. package/app/api/integrations/notion/callback/route.ts +121 -0
  849. package/app/api/integrations/notion/route.ts +304 -0
  850. package/app/api/jobs/route.ts +45 -47
  851. package/app/api/marketplace/[toolId]/route.ts +70 -0
  852. package/app/api/marketplace/route.ts +32 -0
  853. package/app/api/media/[id]/route.ts +108 -0
  854. package/app/api/media/process/route.ts +1242 -0
  855. package/app/api/media/route.ts +284 -0
  856. package/app/api/media/stream/route.ts +113 -0
  857. package/app/api/models/route.ts +23 -0
  858. package/app/api/proxy/verify/route.ts +66 -0
  859. package/app/api/sandbox/route.ts +59 -0
  860. package/app/api/search/bing/route.ts +87 -0
  861. package/app/api/search/brave/route.ts +89 -0
  862. package/app/api/search/exa/route.ts +101 -0
  863. package/app/api/search/google/route.ts +16 -29
  864. package/app/api/search/tavily/route.ts +94 -0
  865. package/app/api/search/verify/route.ts +28 -0
  866. package/app/api/server/agent/route.ts +41 -0
  867. package/app/api/server/download/route.ts +42 -34
  868. package/app/api/server/generate/route.ts +23 -23
  869. package/app/api/servers/route.ts +46 -62
  870. package/app/api/tabular/query/route.ts +26 -0
  871. package/app/api/tabular/route.ts +63 -0
  872. package/app/api/upload-file/route.ts +38 -0
  873. package/app/api/uploads/[...slug]/route.ts +90 -0
  874. package/app/api/vector-stores/install/route.ts +5 -6
  875. package/app/api/vector-stores/status/route.ts +9 -7
  876. package/app/chat/page.tsx +4 -8
  877. package/app/data/page.tsx +15 -8
  878. package/app/globals.css +150 -22
  879. package/app/layout.tsx +19 -17
  880. package/app/page.tsx +3 -32
  881. package/app/settings/page.tsx +80 -0
  882. package/app/themes.css +38 -2
  883. package/archive/redesign-v2/app/configure/page.tsx +53 -0
  884. package/archive/redesign-v2/app/demo/page.tsx +15 -0
  885. package/archive/redesign-v2/app/server/page.tsx +22 -0
  886. package/archive/redesign-v2/app/simple/chat/page.tsx +17 -0
  887. package/archive/redesign-v2/app/simple/docs/page.tsx +21 -0
  888. package/archive/redesign-v2/app/simple/settings/page.tsx +1104 -0
  889. package/{app → archive/redesign-v2/app-routes}/server/page.tsx +2 -2
  890. package/archive/redesign-v2/app-routes/simple/settings/page.tsx +1104 -0
  891. package/archive/redesign-v2/components/app-sidebar.tsx +188 -0
  892. package/archive/redesign-v2/components/app-topnav.tsx +195 -0
  893. package/archive/redesign-v2/components/global-settings.tsx +288 -0
  894. package/archive/redesign-v2/components/simple/simple-sidebar.tsx +171 -0
  895. package/archive/redesign-v2/components/simple/simple-topnav.tsx +175 -0
  896. package/bin/larkup.js +28 -0
  897. package/components/analytics/analytics-dashboard.tsx +504 -0
  898. package/components/app-sidebar.tsx +46 -57
  899. package/components/app-topnav.tsx +64 -150
  900. package/components/chat/canvas/doc-editor-provider.tsx +343 -0
  901. package/components/chat/canvas/document-canvas.tsx +102 -0
  902. package/components/chat/canvas/document-field.tsx +171 -0
  903. package/components/chat/canvas/document-viewer.tsx +453 -0
  904. package/components/chat/canvas/file-attachment-button.tsx +88 -0
  905. package/components/chat/canvas/file-chip.tsx +151 -0
  906. package/components/chat/chat-settings-modal.tsx +253 -149
  907. package/components/chat/chat-workspace.tsx +961 -149
  908. package/components/chat/message-item.tsx +935 -71
  909. package/components/chat/tools/chat-card.tsx +116 -0
  910. package/components/chat/tools/chat-chart.tsx +548 -0
  911. package/components/chat/tools/chat-data-table.tsx +370 -0
  912. package/components/chat/tools/chat-grid.tsx +99 -0
  913. package/components/chat/tools/chat-media-preview.tsx +246 -0
  914. package/components/chat/tools/chat-metrics.tsx +76 -0
  915. package/components/chat/tools/chat-sandbox-result.tsx +175 -0
  916. package/components/chat/tools/chat-signature-request.tsx +809 -0
  917. package/components/chat/tools/chat-tabs.tsx +66 -0
  918. package/components/chat/tools/corpus-data-result.tsx +206 -0
  919. package/components/chat/tools/knowledge-base-result.tsx +135 -0
  920. package/components/chat/tools/visual-placement-modal.tsx +316 -0
  921. package/components/chat/tools/visualization-tabs.tsx +37 -0
  922. package/components/client-layout-wrapper.tsx +52 -124
  923. package/components/configure/configure-form.tsx +301 -530
  924. package/components/configure/custom-model-modal.tsx +205 -0
  925. package/components/configure/store-fields.tsx +4 -1
  926. package/components/data/corpus-panel.tsx +329 -137
  927. package/components/data/data-workspace.tsx +428 -185
  928. package/components/data/firecrawl-notice.tsx +94 -122
  929. package/components/data/integrations-panel.tsx +408 -0
  930. package/components/data/jobs-panel.tsx +83 -105
  931. package/components/data/media-panel.tsx +1701 -0
  932. package/components/data/notion-panel.tsx +372 -0
  933. package/components/data/paste-panel.tsx +4 -3
  934. package/components/data/scrape-panel.tsx +389 -343
  935. package/components/data/tabular-preview.tsx +228 -0
  936. package/components/data/upload-panel.tsx +500 -206
  937. package/components/demo/demo-workspace.tsx +50 -83
  938. package/components/global-settings.tsx +71 -108
  939. package/components/index/global-index-progress.tsx +46 -0
  940. package/components/index/index-action-dialog.tsx +545 -0
  941. package/components/index/index-workspace.tsx +138 -219
  942. package/components/onboarding/simple-setup.tsx +126 -180
  943. package/components/onboarding/welcome-screen.tsx +428 -157
  944. package/components/server/deploy-button.tsx +95 -1233
  945. package/components/server/deploy-sheet.tsx +1061 -0
  946. package/components/server/server-workspace.tsx +62 -95
  947. package/components/settings/appearance-section.tsx +300 -0
  948. package/components/settings/connections-section.tsx +471 -0
  949. package/components/settings/deploy-section.tsx +24 -0
  950. package/components/settings/deployment-section.tsx +430 -0
  951. package/components/settings/general-section.tsx +734 -0
  952. package/components/settings/marketplace-section.tsx +385 -0
  953. package/components/settings/marketplace-tools-settings.tsx +436 -0
  954. package/components/settings/models-section.tsx +810 -0
  955. package/components/settings/playground-section.tsx +17 -0
  956. package/components/settings/prompts-section.tsx +384 -0
  957. package/components/settings/server-section.tsx +808 -0
  958. package/components/settings/settings-layout.tsx +147 -0
  959. package/components/settings/storage-section.tsx +394 -0
  960. package/components/simple/sdk-connect-dialog.tsx +38 -33
  961. package/components/simple/simple-sidebar.tsx +69 -72
  962. package/components/simple/simple-topnav.tsx +154 -0
  963. package/components/theme-customizer-provider.tsx +56 -79
  964. package/components/theme-switcher.tsx +92 -114
  965. package/components/ui/button.tsx +11 -13
  966. package/components/ui/card.tsx +17 -17
  967. package/components/ui/checkbox.tsx +5 -5
  968. package/components/ui/dialog.tsx +1 -1
  969. package/components/ui/dropdown-menu.tsx +24 -38
  970. package/components/ui/input.tsx +2 -2
  971. package/components/ui/popover.tsx +21 -34
  972. package/components/ui/provider-icon.tsx +88 -17
  973. package/components/ui/select.tsx +44 -61
  974. package/components/ui/sheet.tsx +33 -46
  975. package/components/ui/slider.tsx +52 -0
  976. package/components/ui/sonner.tsx +23 -36
  977. package/components/ui/table.tsx +19 -19
  978. package/components/ui/tabs.tsx +17 -24
  979. package/components/ui/textarea.tsx +4 -4
  980. package/components/unified-sidebar.tsx +222 -0
  981. package/components/update-banner.tsx +203 -0
  982. package/components/workspace/server-form-dialog.tsx +7 -7
  983. package/components/workspace/server-switcher.tsx +15 -37
  984. package/hooks/use-notion-auth.ts +60 -0
  985. package/lib/chat-model-provider.ts +115 -0
  986. package/lib/deployments.ts +119 -0
  987. package/lib/env-utils.ts +27 -0
  988. package/lib/media-knowledge.ts +431 -0
  989. package/lib/os-concurrency.ts +37 -0
  990. package/lib/pdf-images.ts +80 -0
  991. package/lib/search-provider-verification.ts +95 -0
  992. package/next.config.mjs +19 -2
  993. package/package.json +37 -20
  994. package/parse_log.mjs +67 -0
  995. package/public/icons/Confluence.png +0 -0
  996. package/public/icons/Salesforce.png +0 -0
  997. package/public/icons/audio.png +0 -0
  998. package/public/icons/bing.png +0 -0
  999. package/public/icons/brave.png +0 -0
  1000. package/public/icons/deepgram.png +0 -0
  1001. package/public/icons/discord.png +0 -0
  1002. package/public/icons/elevenlabs.png +0 -0
  1003. package/public/icons/exa.png +0 -0
  1004. package/public/icons/excel.png +0 -0
  1005. package/public/icons/fal.png +0 -0
  1006. package/public/icons/firecrawl.png +0 -0
  1007. package/public/icons/google-calender.png +0 -0
  1008. package/public/icons/google-drive.png +0 -0
  1009. package/public/icons/google.png +0 -0
  1010. package/public/icons/grok.png +0 -0
  1011. package/public/icons/image.png +0 -0
  1012. package/public/icons/jira.png +0 -0
  1013. package/public/icons/linear.png +0 -0
  1014. package/public/icons/markdown.png +0 -0
  1015. package/public/icons/onedrive.png +0 -0
  1016. package/public/icons/outlook.png +0 -0
  1017. package/public/icons/pdf.png +0 -0
  1018. package/public/icons/revai.png +0 -0
  1019. package/public/icons/revai.svg +1 -0
  1020. package/public/icons/sap.png +0 -0
  1021. package/public/icons/serpapi.svg +34 -0
  1022. package/public/icons/serper.png +0 -0
  1023. package/public/icons/sharepoint.png +0 -0
  1024. package/public/icons/slack.png +0 -0
  1025. package/public/icons/tavily.png +0 -0
  1026. package/public/icons/telegram.png +0 -0
  1027. package/public/icons/video.png +0 -0
  1028. package/public/icons/webhook.png +0 -0
  1029. package/public/icons/whatsapp.png +0 -0
  1030. package/public/icons/word.png +0 -0
  1031. package/public/logo-light2.png +0 -0
  1032. package/public/logo.png +0 -0
  1033. package/public/notion-white.png +0 -0
  1034. package/public/notion.png +0 -0
  1035. package/store/chat-store.ts +19 -0
  1036. package/store/scrape-store.ts +78 -0
  1037. package/tsconfig.json +1 -1
  1038. package/verify-models.mjs +133 -0
  1039. package/.env +0 -2
  1040. package/app/index-data/page.tsx +0 -15
  1041. package/app/simple/settings/page.tsx +0 -627
  1042. package/components/chat/knowledge-base-result.tsx +0 -97
  1043. /package/{app → archive/redesign-v2/app-routes}/configure/page.tsx +0 -0
  1044. /package/{app → archive/redesign-v2/app-routes}/demo/page.tsx +0 -0
  1045. /package/{app → archive/redesign-v2/app-routes}/simple/chat/page.tsx +0 -0
  1046. /package/{app → archive/redesign-v2/app-routes}/simple/docs/page.tsx +0 -0
  1047. /package/{app → archive/redesign-v2/app-routes}/simple/layout.tsx +0 -0
@@ -1,7 +1,7 @@
1
- "use client";
1
+ 'use client';
2
2
 
3
- import { useEffect, useMemo, useRef, useState, useCallback } from "react";
4
- import useSWR from "swr";
3
+ import { useEffect, useMemo, useRef, useState, useCallback } from 'react';
4
+ import useSWR from 'swr';
5
5
  import {
6
6
  ChevronDown,
7
7
  Cloud,
@@ -19,8 +19,8 @@ import {
19
19
  Download,
20
20
  Clock,
21
21
  Settings,
22
- } from "lucide-react";
23
- import { GenericAlert } from "@/components/alerts/generic-alert";
22
+ } from 'lucide-react';
23
+ import { GenericAlert } from '@/components/alerts/generic-alert';
24
24
  import {
25
25
  Dialog,
26
26
  DialogContent,
@@ -28,24 +28,13 @@ import {
28
28
  DialogFooter,
29
29
  DialogHeader,
30
30
  DialogTitle,
31
- } from "@/components/ui/dialog";
32
- import { toast } from "sonner";
33
- import { Button } from "@/components/ui/button";
34
- import {
35
- Tooltip,
36
- TooltipContent,
37
- TooltipProvider,
38
- TooltipTrigger,
39
- } from "@/components/ui/tooltip";
40
- import {
41
- Card,
42
- CardContent,
43
- CardDescription,
44
- CardHeader,
45
- CardTitle,
46
- } from "@/components/ui/card";
47
- import { Input } from "@/components/ui/input";
48
- import { Label } from "@/components/ui/label";
31
+ } from '@/components/ui/dialog';
32
+ import { toast } from 'sonner';
33
+ import { Button } from '@/components/ui/button';
34
+ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';
35
+ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';
36
+ import { Input } from '@/components/ui/input';
37
+ import { Label } from '@/components/ui/label';
49
38
  import {
50
39
  Select,
51
40
  SelectContent,
@@ -53,44 +42,38 @@ import {
53
42
  SelectTrigger,
54
43
  SelectGroup,
55
44
  SelectLabel,
56
- } from "@/components/ui/select";
57
- import { Badge } from "@/components/ui/badge";
58
- import {
59
- Collapsible,
60
- CollapsibleContent,
61
- CollapsibleTrigger,
62
- } from "@/components/ui/collapsible";
63
- import { cn } from "@/lib/utils";
45
+ } from '@/components/ui/select';
46
+ import { Badge } from '@/components/ui/badge';
47
+ import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/components/ui/collapsible';
48
+ import { cn } from '@/lib/utils';
64
49
  import {
65
50
  DEFAULT_CONFIG,
66
51
  type IndexType,
67
52
  type RagConfig,
68
53
  type VectorStoreId,
69
54
  type EmbeddingProvider,
70
- type CustomEmbeddingConfig,
71
- } from "@larkup/core/types";
72
- import {
73
- EMBEDDING_MODELS,
74
- getEmbeddingModel,
75
- } from "@larkup/core/embeddings/registry";
55
+ type CustomModelConfig,
56
+ } from '@larkup/core/types';
57
+ import { EMBEDDING_MODELS, getEmbeddingModel } from '@larkup/core/embeddings/registry';
76
58
  import {
77
59
  getVectorStore,
78
60
  validateStoreConfig,
79
61
  VECTOR_STORE_LIST,
80
- } from "@larkup/vector-stores/registry";
81
- import { StoreFields } from "@/components/configure/store-fields";
82
- import { useRouter } from "next/navigation";
83
- import { PROVIDER_META, ProviderIcon } from "@/components/ui/provider-icon";
62
+ } from '@larkup/vector-stores/registry';
63
+ import { StoreFields } from '@/components/configure/store-fields';
64
+ import { useRouter } from 'next/navigation';
65
+ import { PROVIDER_META, ProviderIcon } from '@/components/ui/provider-icon';
66
+ import { CustomModelModal } from './custom-model-modal';
67
+ import { ServerFormDialog } from '@/components/workspace/server-form-dialog';
84
68
 
85
- const fetcher = (url: string) =>
86
- fetch(url).then((r) => r.json() as Promise<{ config: RagConfig }>);
69
+ const fetcher = (url: string) => fetch(url).then((r) => r.json() as Promise<{ config: RagConfig }>);
87
70
 
88
71
  // ── Index types ───────────────────────────────────────────────────────────────
89
72
 
90
73
  const INDEX_TYPES: { value: IndexType; label: string; hint: string }[] = [
91
- { value: "lexical", label: "Lexical", hint: "Keyword / BM25 matching" },
92
- { value: "semantic", label: "Semantic", hint: "Pure vector similarity" },
93
- { value: "hybrid", label: "Hybrid", hint: "Lexical + semantic, reranked" },
74
+ { value: 'lexical', label: 'Lexical', hint: 'Keyword / BM25 matching' },
75
+ { value: 'semantic', label: 'Semantic', hint: 'Pure vector similarity' },
76
+ { value: 'hybrid', label: 'Hybrid', hint: 'Lexical + semantic, reranked' },
94
77
  ];
95
78
 
96
79
  // ── Vector-store branding (real icons from /icons/) ───────────────────────────
@@ -102,50 +85,49 @@ type StoreMeta = {
102
85
 
103
86
  const STORE_META: Record<VectorStoreId, StoreMeta> = {
104
87
  lancedb: {
105
- iconSrc: "/icons/lancedb2.png",
106
- pillBg: "bg-yellow-50 dark:bg-yellow-950/40",
88
+ iconSrc: '/icons/lancedb2.png',
89
+ pillBg: 'bg-yellow-50 dark:bg-yellow-950/40',
107
90
  },
108
91
  pinecone: {
109
- iconSrc: "/icons/pinecone.png",
110
- pillBg: "bg-green-50 dark:bg-green-950/40",
92
+ iconSrc: '/icons/pinecone.png',
93
+ pillBg: 'bg-green-50 dark:bg-green-950/40',
111
94
  },
112
95
  weaviate: {
113
- iconSrc: "/icons/weaviate.webp",
114
- pillBg: "bg-teal-50 dark:bg-teal-950/40",
96
+ iconSrc: '/icons/weaviate.webp',
97
+ pillBg: 'bg-teal-50 dark:bg-teal-950/40',
115
98
  },
116
99
  qdrant: {
117
- iconSrc: "/icons/qdrant.svg",
118
- pillBg: "bg-red-50 dark:bg-red-950/40",
100
+ iconSrc: '/icons/qdrant.svg',
101
+ pillBg: 'bg-red-50 dark:bg-red-950/40',
119
102
  },
120
103
  chroma: {
121
- iconSrc: "/icons/chroma.png",
122
- pillBg: "bg-purple-50 dark:bg-purple-950/40",
104
+ iconSrc: '/icons/chroma.png',
105
+ pillBg: 'bg-purple-50 dark:bg-purple-950/40',
123
106
  },
124
107
  pgvector: {
125
- iconSrc: "/icons/pgvector2.png",
126
- pillBg: "bg-blue-50 dark:bg-blue-950/40",
108
+ iconSrc: '/icons/pgvector2.png',
109
+ pillBg: 'bg-blue-50 dark:bg-blue-950/40',
127
110
  },
128
111
  supabase: {
129
- iconSrc: "/icons/supabase.png",
130
- pillBg: "bg-emerald-50 dark:bg-emerald-950/40",
112
+ iconSrc: '/icons/supabase.png',
113
+ pillBg: 'bg-emerald-50 dark:bg-emerald-950/40',
131
114
  },
132
115
  };
133
116
 
134
117
  // ── Helpers ───────────────────────────────────────────────────────────────────
135
118
 
136
- // Group embedding models by provider for the grouped select
137
- const EMBEDDING_BY_PROVIDER = EMBEDDING_MODELS.reduce<
138
- Record<string, typeof EMBEDDING_MODELS>
139
- >((acc, m) => {
140
- (acc[m.provider] ??= []).push(m);
141
- return acc;
142
- }, {});
119
+ const EMBEDDING_BY_PROVIDER = EMBEDDING_MODELS.reduce<Record<string, typeof EMBEDDING_MODELS>>(
120
+ (acc, m) => {
121
+ (acc[m.provider] ??= []).push(m);
122
+ return acc;
123
+ },
124
+ {},
125
+ );
143
126
 
144
127
  // ── Main component ────────────────────────────────────────────────────────────
145
128
 
146
129
  const indexFetcher = (url: string) => fetch(url).then((r) => r.json());
147
130
 
148
- // Expose dirty state + save trigger so the configure page can place the button in the header
149
131
  export type ConfigureFormHandle = {
150
132
  dirty: boolean;
151
133
  saving: boolean;
@@ -158,13 +140,13 @@ export function ConfigureForm({
158
140
  onHandleReady?: (handle: ConfigureFormHandle) => void;
159
141
  }) {
160
142
  const router = useRouter();
161
- const { data, isLoading, mutate } = useSWR("/api/config", fetcher);
162
- const { data: indexData } = useSWR("/api/index", indexFetcher, {
143
+ const { data, isLoading, mutate } = useSWR('/api/config', fetcher);
144
+ const { data: indexData } = useSWR('/api/index', indexFetcher, {
163
145
  refreshInterval: 0,
164
146
  });
165
147
  // Fetch install status for optional vector stores
166
148
  const { data: storeStatusData, mutate: mutateStoreStatus } = useSWR(
167
- "/api/vector-stores/status",
149
+ '/api/vector-stores/status',
168
150
  (url: string) => fetch(url).then((r) => r.json()),
169
151
  { refreshInterval: 0 },
170
152
  );
@@ -177,6 +159,7 @@ export function ConfigureForm({
177
159
  const [hydrated, setHydrated] = useState(false);
178
160
  const [customModalOpen, setCustomModalOpen] = useState(false);
179
161
  const [deleteConfirmOpen, setDeleteConfirmOpen] = useState(false);
162
+ const [newServerModalOpen, setNewServerModalOpen] = useState(false);
180
163
  // Confirmation summary dialog before saving
181
164
  const [saveConfirmOpen, setSaveConfirmOpen] = useState(false);
182
165
  // Unsaved-changes navigation blocker
@@ -189,12 +172,11 @@ export function ConfigureForm({
189
172
  const [testingKey, setTestingKey] = useState(false);
190
173
  const [showProviderApiKey, setShowProviderApiKey] = useState(false);
191
174
 
192
- // Is the currently selected store actually installed (for installable stores)?
193
175
  const isStoreInstalled = useCallback(
194
176
  (storeId: VectorStoreId) => {
195
177
  const desc = getVectorStore(storeId);
196
- if (desc.installStatus === "installed") return true;
197
- if (desc.installStatus === "coming-soon") return false;
178
+ if (desc.installStatus === 'installed') return true;
179
+ if (desc.installStatus === 'coming-soon') return false;
198
180
  // installable — check runtime status
199
181
  return storeStatusData?.stores?.[storeId]?.installed === true;
200
182
  },
@@ -202,29 +184,23 @@ export function ConfigureForm({
202
184
  );
203
185
 
204
186
  const currentStoreInstalled = isStoreInstalled(form.vectorStore);
205
- // Cache storeConfig per store id so switching A→B→A restores A's values.
206
187
  const storeConfigCache = useRef<Record<string, Record<string, string>>>({});
207
188
 
208
- // Hydrate local form from the persisted config once it loads.
209
189
  useEffect(() => {
210
190
  if (data?.config && !hydrated) {
211
191
  setForm(data.config);
212
- storeConfigCache.current[data.config.vectorStore] =
213
- data.config.storeConfig;
192
+ storeConfigCache.current[data.config.vectorStore] = data.config.storeConfig;
214
193
  setHydrated(true);
215
194
  }
216
195
  }, [data, hydrated]);
217
196
 
218
197
  const store = getVectorStore(form.vectorStore);
219
- // Resolve the active custom model from the array when id starts with "custom:"
220
- const activeCustomModel = form.embeddingModelId.startsWith("custom:")
198
+ const activeCustomModel = form.embeddingModelId.startsWith('custom:')
221
199
  ? (form.customEmbeddings ?? []).find(
222
- (m) => m.modelName === form.embeddingModelId.slice("custom:".length),
200
+ (m) => m.modelName === form.embeddingModelId.slice('custom:'.length),
223
201
  )
224
202
  : undefined;
225
- const embeddingModel = activeCustomModel
226
- ? null
227
- : getEmbeddingModel(form.embeddingModelId);
203
+ const embeddingModel = activeCustomModel ? null : getEmbeddingModel(form.embeddingModelId);
228
204
  const embeddingMeta = embeddingModel
229
205
  ? PROVIDER_META[embeddingModel.provider as EmbeddingProvider]
230
206
  : null;
@@ -244,21 +220,18 @@ export function ConfigureForm({
244
220
  };
245
221
 
246
222
  // Whether a completed index already exists
247
- const indexedRun =
248
- indexData?.run?.status === "completed" ? indexData.run : null;
223
+ const indexedRun = indexData?.run?.status === 'completed' ? indexData.run : null;
249
224
  const indexedDimensions: number | null = indexedRun?.dimensions ?? null;
250
- const indexedVectorStore: VectorStoreId | null =
251
- indexedRun?.vectorStore ?? null;
225
+ const indexedVectorStore: VectorStoreId | null = indexedRun?.vectorStore ?? null;
252
226
 
253
227
  const selectStore = (id: VectorStoreId) => {
254
228
  if (id === form.vectorStore) return;
255
229
  // Block "coming soon" stores
256
230
  const desc = getVectorStore(id);
257
- if (desc.installStatus === "coming-soon") {
231
+ if (desc.installStatus === 'coming-soon') {
258
232
  toast.info(`${desc.label} support is coming soon!`);
259
233
  return;
260
234
  }
261
- // Block if a completed index exists with a different vector store
262
235
  if (indexedVectorStore && id !== indexedVectorStore) {
263
236
  setStoreBlockAlertOpen(true);
264
237
  return;
@@ -281,22 +254,18 @@ export function ConfigureForm({
281
254
  const handleInstallStore = async (storeId: VectorStoreId) => {
282
255
  setInstalling(true);
283
256
  try {
284
- const res = await fetch("/api/vector-stores/install", {
285
- method: "POST",
286
- headers: { "Content-Type": "application/json" },
257
+ const res = await fetch('/api/vector-stores/install', {
258
+ method: 'POST',
259
+ headers: { 'Content-Type': 'application/json' },
287
260
  body: JSON.stringify({ storeId }),
288
261
  });
289
262
  const json = await res.json();
290
263
  if (!res.ok) {
291
- throw new Error(json.error ?? "Installation failed");
264
+ throw new Error(json.error ?? 'Installation failed');
292
265
  }
293
- toast.success(
294
- `${getVectorStore(storeId).label} installed successfully!`,
295
- {
296
- description: `The ${json.package} package has been added to your project.`,
297
- },
298
- );
299
- // Refresh install status optimistically so the UI instantly hides the install card
266
+ toast.success(`${getVectorStore(storeId).label} installed successfully!`, {
267
+ description: `The ${json.package} package has been added to your project.`,
268
+ });
300
269
  await mutateStoreStatus(
301
270
  (current: any) => ({
302
271
  ...current,
@@ -308,20 +277,17 @@ export function ConfigureForm({
308
277
  { revalidate: true },
309
278
  );
310
279
  } catch (err) {
311
- toast.error(err instanceof Error ? err.message : "Installation failed");
280
+ toast.error(err instanceof Error ? err.message : 'Installation failed');
312
281
  } finally {
313
282
  setInstalling(false);
314
283
  }
315
284
  };
316
285
 
317
- // Returns true if the given model ID would have different dimensions than the indexed run
318
286
  function wouldBreakDimensions(newModelId: string): boolean {
319
287
  if (!indexedDimensions) return false;
320
- if (newModelId.startsWith("custom:")) {
321
- const name = newModelId.slice("custom:".length);
322
- const custom = (form.customEmbeddings ?? []).find(
323
- (m) => m.modelName === name,
324
- );
288
+ if (newModelId.startsWith('custom:')) {
289
+ const name = newModelId.slice('custom:'.length);
290
+ const custom = (form.customEmbeddings ?? []).find((m) => m.modelName === name);
325
291
  if (!custom) return false;
326
292
  return custom.dimensions !== indexedDimensions;
327
293
  }
@@ -330,16 +296,35 @@ export function ConfigureForm({
330
296
  return model.dimensions !== indexedDimensions;
331
297
  }
332
298
 
299
+ function handleStructuralChangeBlock() {
300
+ setApiKeyModalOpen(false);
301
+ setCustomModalOpen(false);
302
+ toast('Cannot modify configuration', {
303
+ description:
304
+ 'You cannot change this in the current project because it already has an index. You must initiate a new project.',
305
+ duration: Number.POSITIVE_INFINITY,
306
+ action: {
307
+ label: 'New Project',
308
+ onClick: () => {
309
+ setNewServerModalOpen(true);
310
+ },
311
+ },
312
+ });
313
+ }
314
+
333
315
  const handleEmbeddingModelChange = (v: string) => {
316
+ if (indexedRun && data?.config && v !== data.config.embeddingModelId) {
317
+ handleStructuralChangeBlock();
318
+ return;
319
+ }
334
320
  if (wouldBreakDimensions(v)) {
335
321
  setModelBlockAlertOpen(true);
336
322
  return;
337
323
  }
338
- set("embeddingModelId", v);
324
+ set('embeddingModelId', v);
339
325
  if (!form.embeddingApiKey) {
340
- toast.error("API Key Required", {
341
- description:
342
- "Please set an API key for this provider. Recommended: Vercel AI Gateway Key.",
326
+ toast.error('API Key Required', {
327
+ description: 'Please set an API key for this provider. Recommended: Vercel AI Gateway Key.',
343
328
  });
344
329
  setApiKeyModalOpen(true);
345
330
  }
@@ -355,35 +340,32 @@ export function ConfigureForm({
355
340
  const handler = (e: BeforeUnloadEvent) => {
356
341
  if (dirty) {
357
342
  e.preventDefault();
358
- e.returnValue = "";
343
+ e.returnValue = '';
359
344
  }
360
345
  };
361
- window.addEventListener("beforeunload", handler);
362
- return () => window.removeEventListener("beforeunload", handler);
346
+ window.addEventListener('beforeunload', handler);
347
+ return () => window.removeEventListener('beforeunload', handler);
363
348
  }, [dirty]);
364
349
 
365
- // Intercept Next.js App Router client-side link clicks when there are unsaved changes
366
350
  const dirtyRef = useRef(dirty);
367
351
  dirtyRef.current = dirty;
368
352
 
369
353
  useEffect(() => {
370
354
  const handleClick = (e: MouseEvent) => {
371
355
  if (!dirtyRef.current) return;
372
- const anchor = (e.target as Element)?.closest("a[href]");
356
+ const anchor = (e.target as Element)?.closest('a[href]');
373
357
  if (!anchor) return;
374
- const href = anchor.getAttribute("href") ?? "";
375
- // Only intercept same-origin relative navigation (not # links or external)
376
- if (!href || href.startsWith("#") || href.startsWith("http")) return;
358
+ const href = anchor.getAttribute('href') ?? '';
359
+ if (!href || href.startsWith('#') || href.startsWith('http')) return;
377
360
  // Skip if it's already the configure page
378
- if (href === "/configure" || href === "/") return;
361
+ if (href === '/configure' || href === '/') return;
379
362
  e.preventDefault();
380
363
  e.stopPropagation();
381
364
  setPendingHref(href);
382
365
  setNavBlockOpen(true);
383
366
  };
384
- document.addEventListener("click", handleClick, { capture: true });
385
- return () =>
386
- document.removeEventListener("click", handleClick, { capture: true });
367
+ document.addEventListener('click', handleClick, { capture: true });
368
+ return () => document.removeEventListener('click', handleClick, { capture: true });
387
369
  }, []);
388
370
 
389
371
  // Expose handle to parent
@@ -398,80 +380,70 @@ export function ConfigureForm({
398
380
  }, [dirty, saving, onHandleReady]);
399
381
 
400
382
  async function performSave() {
401
- const fieldErrors = validateStoreConfig(
402
- store,
403
- form.storeConfig,
404
- form.indexType,
405
- );
383
+ const fieldErrors = validateStoreConfig(store, form.storeConfig, form.indexType);
406
384
  if (Object.keys(fieldErrors).length > 0) {
407
385
  setErrors(fieldErrors);
408
- toast.error("Please complete the required vector store fields.");
386
+ toast.error('Please complete the required vector store fields.');
409
387
  return;
410
388
  }
411
389
  setSaving(true);
412
390
  try {
413
- const testRes = await fetch("/api/config/test", {
414
- method: "POST",
415
- headers: { "Content-Type": "application/json" },
391
+ const testRes = await fetch('/api/config/test', {
392
+ method: 'POST',
393
+ headers: { 'Content-Type': 'application/json' },
416
394
  body: JSON.stringify(form),
417
395
  });
418
396
  const testJson = await testRes.json();
419
397
  if (!testRes.ok) {
420
398
  if (testJson.fieldErrors) setErrors(testJson.fieldErrors);
421
- throw new Error(
422
- `Connection test failed: ${testJson.error ?? "Invalid credentials"}`,
423
- );
399
+ throw new Error(`Connection test failed: ${testJson.error ?? 'Invalid credentials'}`);
424
400
  }
425
- const res = await fetch("/api/config", {
426
- method: "PUT",
427
- headers: { "Content-Type": "application/json" },
401
+ const res = await fetch('/api/config', {
402
+ method: 'PUT',
403
+ headers: { 'Content-Type': 'application/json' },
428
404
  body: JSON.stringify(form),
429
405
  });
430
406
  const json = await res.json();
431
407
  if (!res.ok) {
432
408
  if (json.fieldErrors) setErrors(json.fieldErrors);
433
- throw new Error(json.error ?? "Failed to save configuration");
409
+ throw new Error(json.error ?? 'Failed to save configuration');
434
410
  }
435
411
  await mutate(json, { revalidate: false });
436
412
  setForm(json.config);
437
- toast.success("Configuration saved", {
438
- description: "Written to .larkup/config.json",
413
+ toast.success('Configuration saved', {
414
+ description: 'Written to .larkup/config.json',
439
415
  });
440
416
  } catch (err) {
441
- toast.error(err instanceof Error ? err.message : "Failed to save");
417
+ toast.error(err instanceof Error ? err.message : 'Failed to save');
442
418
  } finally {
443
419
  setSaving(false);
444
420
  }
445
421
  }
446
422
 
447
423
  async function handleTestConnection() {
448
- const fieldErrors = validateStoreConfig(
449
- store,
450
- form.storeConfig,
451
- form.indexType,
452
- );
424
+ const fieldErrors = validateStoreConfig(store, form.storeConfig, form.indexType);
453
425
  if (Object.keys(fieldErrors).length > 0) {
454
426
  setErrors(fieldErrors);
455
- toast.error("Please complete the required vector store fields.");
427
+ toast.error('Please complete the required vector store fields.');
456
428
  return;
457
429
  }
458
430
  setTesting(true);
459
431
  try {
460
- const res = await fetch("/api/config/test", {
461
- method: "POST",
462
- headers: { "Content-Type": "application/json" },
432
+ const res = await fetch('/api/config/test', {
433
+ method: 'POST',
434
+ headers: { 'Content-Type': 'application/json' },
463
435
  body: JSON.stringify(form),
464
436
  });
465
437
  const json = await res.json();
466
438
  if (!res.ok) {
467
439
  if (json.fieldErrors) setErrors(json.fieldErrors);
468
- throw new Error(json.error ?? "Connection failed");
440
+ throw new Error(json.error ?? 'Connection failed');
469
441
  }
470
- toast.success("Connection successful", {
471
- description: "Credentials and settings are valid.",
442
+ toast.success('Connection successful', {
443
+ description: 'Credentials and settings are valid.',
472
444
  });
473
445
  } catch (err) {
474
- toast.error(err instanceof Error ? err.message : "Connection failed");
446
+ toast.error(err instanceof Error ? err.message : 'Connection failed');
475
447
  } finally {
476
448
  setTesting(false);
477
449
  }
@@ -488,39 +460,39 @@ export function ConfigureForm({
488
460
 
489
461
  // Build summary rows for confirm dialog
490
462
  const summaryItems = [
491
- { label: "Project", value: form.projectName },
463
+ { label: 'Project', value: form.projectName },
492
464
  {
493
- label: "Embedding model",
494
- value:
495
- activeCustomModel?.modelName ??
496
- embeddingModel?.label ??
497
- form.embeddingModelId,
465
+ label: 'Embedding model',
466
+ value: activeCustomModel?.modelName ?? embeddingModel?.label ?? form.embeddingModelId,
498
467
  },
499
468
  {
500
- label: "Provider",
469
+ label: 'Provider',
501
470
  value: activeCustomModel
502
- ? "Custom (OpenAI-compatible)"
503
- : (embeddingMeta?.label ?? embeddingModel?.provider ?? ""),
471
+ ? 'Custom (OpenAI-compatible)'
472
+ : embeddingMeta?.label ?? embeddingModel?.provider ?? '',
504
473
  },
505
474
  {
506
- label: "Dimensions",
507
- value: String(
508
- activeCustomModel?.dimensions ?? embeddingModel?.dimensions ?? "—",
509
- ),
475
+ label: 'Dimensions',
476
+ value: String(activeCustomModel?.dimensions ?? embeddingModel?.dimensions ?? '—'),
510
477
  mono: true,
511
478
  },
512
- { label: "Index type", value: indexTypeMeta?.label ?? form.indexType },
513
- { label: "Vector store", value: store.label },
479
+ { label: 'Index type', value: indexTypeMeta?.label ?? form.indexType },
480
+ { label: 'Vector store', value: store.label },
514
481
  {
515
- label: "Chunk size / overlap",
482
+ label: 'Chunk size / overlap',
516
483
  value: `${form.chunking.chunkSize} / ${form.chunking.chunkOverlap} tokens`,
517
484
  mono: true,
518
485
  },
519
- { label: "Top-K", value: String(form.topK), mono: true },
486
+ { label: 'Top-K', value: String(form.topK), mono: true },
520
487
  ];
521
488
 
522
489
  return (
523
490
  <div className="px-6 py-6 md:px-8">
491
+ <ServerFormDialog
492
+ mode="create"
493
+ open={newServerModalOpen}
494
+ onOpenChange={setNewServerModalOpen}
495
+ />
524
496
  {/* ── Cards: first two side-by-side, last card full-width below ── */}
525
497
  <div className="mx-auto space-y-5">
526
498
  {/* Row 1: Project + Embedding side-by-side */}
@@ -540,7 +512,7 @@ export function ConfigureForm({
540
512
  id="projectName"
541
513
  value={form.projectName}
542
514
  spellCheck={false}
543
- onChange={(e) => set("projectName", e.target.value)}
515
+ onChange={(e) => set('projectName', e.target.value)}
544
516
  />
545
517
  </div>
546
518
  <div className="space-y-1.5">
@@ -551,13 +523,9 @@ export function ConfigureForm({
551
523
  min={1}
552
524
  max={50}
553
525
  value={form.topK}
554
- onChange={(e) =>
555
- set("topK", Math.max(1, Number(e.target.value) || 1))
556
- }
526
+ onChange={(e) => set('topK', Math.max(1, Number(e.target.value) || 1))}
557
527
  />
558
- <p className="text-xs text-muted-foreground">
559
- Documents returned per query.
560
- </p>
528
+ <p className="text-xs text-muted-foreground">Documents returned per query.</p>
561
529
  </div>
562
530
  </CardContent>
563
531
  </Card>
@@ -590,18 +558,16 @@ export function ConfigureForm({
590
558
  <div className="flex gap-2 items-start">
591
559
  <Select
592
560
  value={form.embeddingModelId}
593
- onValueChange={(v) =>
594
- handleEmbeddingModelChange((v as string) ?? "")
595
- }
561
+ onValueChange={(v) => handleEmbeddingModelChange((v as string) ?? '')}
596
562
  >
597
563
  <SelectTrigger
598
564
  className="w-full flex-1"
599
565
  onPointerDown={(e) => {
600
566
  if (!form.embeddingApiKey) {
601
567
  e.preventDefault();
602
- toast.info("API Key Required", {
568
+ toast.info('API Key Required', {
603
569
  description:
604
- "Please set an API key first. Recommended: Vercel AI Gateway Key.",
570
+ 'Please set an API key first. Recommended: Vercel AI Gateway Key.',
605
571
  });
606
572
  setApiKeyModalOpen(true);
607
573
  }
@@ -630,30 +596,22 @@ export function ConfigureForm({
630
596
  size={20}
631
597
  />
632
598
  <span className="flex flex-col items-start leading-none">
633
- <span className="font-medium text-sm ">
634
- {embeddingModel.label}
635
- </span>
599
+ <span className="font-medium text-sm ">{embeddingModel.label}</span>
636
600
  </span>
637
601
  </span>
638
602
  ) : (
639
- <span className="text-muted-foreground">
640
- Select a model…
641
- </span>
603
+ <span className="text-muted-foreground">Select a model…</span>
642
604
  )}
643
605
  </SelectTrigger>
644
606
  <SelectContent className="max-h-[320px]">
645
607
  {Object.entries(EMBEDDING_BY_PROVIDER)
646
608
  .filter(
647
609
  ([provider]) =>
648
- form.embeddingProvider === "vercel_ai_gateway" ||
649
- provider === form.embeddingProvider ||
650
- provider === "deepseek",
610
+ form.embeddingProvider === 'vercel_ai_gateway' ||
611
+ provider === form.embeddingProvider,
651
612
  )
652
613
  .map(([provider, models]) => {
653
- const meta =
654
- PROVIDER_META[
655
- provider as keyof typeof PROVIDER_META
656
- ];
614
+ const meta = PROVIDER_META[provider as keyof typeof PROVIDER_META];
657
615
  return (
658
616
  <SelectGroup key={provider}>
659
617
  <SelectLabel className="flex items-center gap-2 py-1.5">
@@ -665,16 +623,10 @@ export function ConfigureForm({
665
623
  size={18}
666
624
  />
667
625
  )}
668
- <span className="font-medium">
669
- {meta?.label ?? provider}
670
- </span>
626
+ <span className="font-medium">{meta?.label ?? provider}</span>
671
627
  </SelectLabel>
672
628
  {models.map((m) => (
673
- <SelectItem
674
- key={m.id}
675
- value={m.id}
676
- className="pl-8"
677
- >
629
+ <SelectItem key={m.id} value={m.id} className="pl-8">
678
630
  <span className="flex items-center gap-2">
679
631
  <span>{m.label}</span>
680
632
  <span className="text-[10px] text-muted-foreground font-mono">
@@ -723,7 +675,13 @@ export function ConfigureForm({
723
675
  <Button
724
676
  variant="outline"
725
677
  size="icon"
726
- onClick={() => setCustomModalOpen(true)}
678
+ onClick={() => {
679
+ if (indexedRun) {
680
+ handleStructuralChangeBlock();
681
+ } else {
682
+ setCustomModalOpen(true);
683
+ }
684
+ }}
727
685
  type="button"
728
686
  >
729
687
  <Plus className="size-4" />
@@ -769,9 +727,7 @@ export function ConfigureForm({
769
727
  <Badge variant="outline" className="font-mono">
770
728
  OpenAI Compatible
771
729
  </Badge>
772
- <span className="text-muted-foreground">
773
- Custom configuration
774
- </span>
730
+ <span className="text-muted-foreground">Custom configuration</span>
775
731
  </div>
776
732
  ) : embeddingModel ? (
777
733
  <div className="flex flex-wrap items-center gap-2 text-xs">
@@ -779,12 +735,9 @@ export function ConfigureForm({
779
735
  {embeddingModel.dimensions} dims
780
736
  </Badge>
781
737
  <Badge variant="outline" className="font-mono">
782
- {embeddingModel.maxInputTokens.toLocaleString()} max
783
- tokens
738
+ {embeddingModel.maxInputTokens.toLocaleString()} max tokens
784
739
  </Badge>
785
- <span className="text-muted-foreground">
786
- {embeddingModel.description}
787
- </span>
740
+ <span className="text-muted-foreground">{embeddingModel.description}</span>
788
741
  </div>
789
742
  ) : null}
790
743
  </div>
@@ -794,8 +747,8 @@ export function ConfigureForm({
794
747
  <CollapsibleTrigger className="-ml-2 inline-flex h-8 items-center gap-1.5 rounded-md px-2 text-sm text-muted-foreground transition-colors hover:bg-accent hover:text-foreground">
795
748
  <ChevronDown
796
749
  className={cn(
797
- "size-4 transition-transform duration-200",
798
- advancedOpen && "rotate-180",
750
+ 'size-4 transition-transform duration-200',
751
+ advancedOpen && 'rotate-180',
799
752
  )}
800
753
  />
801
754
  Advanced chunking
@@ -810,7 +763,7 @@ export function ConfigureForm({
810
763
  min={64}
811
764
  value={form.chunking.chunkSize}
812
765
  onChange={(e) =>
813
- set("chunking", {
766
+ set('chunking', {
814
767
  ...form.chunking,
815
768
  chunkSize: Number(e.target.value) || 0,
816
769
  })
@@ -826,7 +779,7 @@ export function ConfigureForm({
826
779
  min={0}
827
780
  value={form.chunking.chunkOverlap}
828
781
  onChange={(e) =>
829
- set("chunking", {
782
+ set('chunking', {
830
783
  ...form.chunking,
831
784
  chunkOverlap: Number(e.target.value) || 0,
832
785
  })
@@ -839,9 +792,9 @@ export function ConfigureForm({
839
792
  <Select
840
793
  value={form.chunking.strategy}
841
794
  onValueChange={(v) =>
842
- set("chunking", {
795
+ set('chunking', {
843
796
  ...form.chunking,
844
- strategy: v as RagConfig["chunking"]["strategy"],
797
+ strategy: v as RagConfig['chunking']['strategy'],
845
798
  })
846
799
  }
847
800
  >
@@ -870,8 +823,7 @@ export function ConfigureForm({
870
823
  Indexing &amp; Vector store
871
824
  </CardTitle>
872
825
  <CardDescription className="text-xs">
873
- Choose how documents are matched at retrieval time and where
874
- vectors are stored.
826
+ Choose how documents are matched at retrieval time and where vectors are stored.
875
827
  </CardDescription>
876
828
  </CardHeader>
877
829
  <CardContent className="space-y-5">
@@ -884,19 +836,15 @@ export function ConfigureForm({
884
836
  </Label>
885
837
  <Select
886
838
  value={form.indexType}
887
- onValueChange={(v) => set("indexType", v as IndexType)}
839
+ onValueChange={(v) => set('indexType', v as IndexType)}
888
840
  >
889
841
  <SelectTrigger className="w-full">
890
842
  {indexTypeMeta ? (
891
843
  <span className="flex flex-col items-start leading-none">
892
- <span className="font-medium text-sm">
893
- {indexTypeMeta.label}
894
- </span>
844
+ <span className="font-medium text-sm">{indexTypeMeta.label}</span>
895
845
  </span>
896
846
  ) : (
897
- <span className="text-muted-foreground">
898
- Select index type…
899
- </span>
847
+ <span className="text-muted-foreground">Select index type…</span>
900
848
  )}
901
849
  </SelectTrigger>
902
850
  <SelectContent>
@@ -904,9 +852,7 @@ export function ConfigureForm({
904
852
  <SelectItem key={t.value} value={t.value}>
905
853
  <span className="flex flex-col">
906
854
  <span className="font-medium">{t.label}</span>
907
- <span className="text-[11px] text-muted-foreground">
908
- {t.hint}
909
- </span>
855
+ <span className="text-[11px] text-muted-foreground">{t.hint}</span>
910
856
  </span>
911
857
  </SelectItem>
912
858
  ))}
@@ -933,29 +879,25 @@ export function ConfigureForm({
933
879
  size={20}
934
880
  />
935
881
  <span className="flex flex-col items-start leading-none">
936
- <span className="font-medium text-sm">
937
- {store.label}
938
- </span>
882
+ <span className="font-medium text-sm">{store.label}</span>
939
883
  </span>
940
884
  </span>
941
885
  ) : (
942
- <span className="text-muted-foreground">
943
- Select a vector store…
944
- </span>
886
+ <span className="text-muted-foreground">Select a vector store…</span>
945
887
  )}
946
888
  </SelectTrigger>
947
889
  <SelectContent>
948
890
  {VECTOR_STORE_LIST.map((s) => {
949
891
  const meta = STORE_META[s.id];
950
- const isComingSoon = s.installStatus === "coming-soon";
951
- const isInstallable = s.installStatus === "installable";
892
+ const isComingSoon = s.installStatus === 'coming-soon';
893
+ const isInstallable = s.installStatus === 'installable';
952
894
  const installed = isStoreInstalled(s.id);
953
895
  return (
954
896
  <SelectItem
955
897
  key={s.id}
956
898
  value={s.id}
957
899
  disabled={isComingSoon}
958
- className={isComingSoon ? "opacity-50" : ""}
900
+ className={isComingSoon ? 'opacity-50' : ''}
959
901
  >
960
902
  <span className="flex items-center gap-2.5 w-full">
961
903
  {meta && (
@@ -968,9 +910,7 @@ export function ConfigureForm({
968
910
  )}
969
911
  <span className="flex flex-col flex-1 min-w-0">
970
912
  <span className="flex items-center gap-2">
971
- <span className="font-medium text-sm leading-tight">
972
- {s.label}
973
- </span>
913
+ <span className="font-medium text-sm leading-tight">{s.label}</span>
974
914
  {isComingSoon && (
975
915
  <Badge
976
916
  variant="outline"
@@ -991,7 +931,7 @@ export function ConfigureForm({
991
931
  )}
992
932
  </span>
993
933
  <span className="text-[10px] text-muted-foreground leading-tight">
994
- {s.description.split(".")[0]}
934
+ {s.description.split('.')[0]}
995
935
  </span>
996
936
  </span>
997
937
  </span>
@@ -1003,10 +943,7 @@ export function ConfigureForm({
1003
943
 
1004
944
  {/* Store badges */}
1005
945
  <div className="flex items-center gap-2">
1006
- <Badge
1007
- variant="outline"
1008
- className="text-[10px] font-mono uppercase"
1009
- >
946
+ <Badge variant="outline" className="text-[10px] font-mono uppercase">
1010
947
  {store.runtime}
1011
948
  </Badge>
1012
949
  {store.docsUrl && (
@@ -1029,7 +966,7 @@ export function ConfigureForm({
1029
966
  </p>
1030
967
 
1031
968
  {/* Store config fields — or install prompt if not yet installed */}
1032
- {store.installStatus === "installable" && !currentStoreInstalled ? (
969
+ {store.installStatus === 'installable' && !currentStoreInstalled ? (
1033
970
  /* ── Install panel for installable stores ─────────────────── */
1034
971
  <div className="rounded-lg border border-dashed border-amber-500/40 bg-amber-50/50 dark:bg-amber-950/20 p-6 space-y-4 transition-all duration-300">
1035
972
  <div className="flex items-start gap-3">
@@ -1041,17 +978,16 @@ export function ConfigureForm({
1041
978
  {store.label} is not installed
1042
979
  </p>
1043
980
  <p className="text-xs text-muted-foreground leading-relaxed">
1044
- {store.label} is an optional dependency and not included
1045
- by default. Click <strong>Install</strong> to add the{" "}
981
+ {store.label} is an optional dependency and not included by default. Click{' '}
982
+ <strong>Install</strong> to add the{' '}
1046
983
  <code className="text-[11px] font-mono bg-muted px-1 py-0.5 rounded">
1047
984
  {Object.keys(store.serverDependencies)[0]}
1048
- </code>{" "}
985
+ </code>{' '}
1049
986
  package to your project.
1050
987
  </p>
1051
988
  <p className="text-[11px] text-amber-700 dark:text-amber-400/80 leading-relaxed mt-2">
1052
- ⚠ Install only works in local development. For production
1053
- deployments, add the package to your dependencies before
1054
- deploying.
989
+ ⚠ Install only works in local development. For production deployments, add the
990
+ package to your dependencies before deploying.
1055
991
  </p>
1056
992
  </div>
1057
993
  </div>
@@ -1067,11 +1003,11 @@ export function ConfigureForm({
1067
1003
  ) : (
1068
1004
  <Download className="size-4" />
1069
1005
  )}
1070
- {installing ? "Installing…" : `Install ${store.label}`}
1006
+ {installing ? 'Installing…' : `Install ${store.label}`}
1071
1007
  </Button>
1072
1008
  </div>
1073
1009
  </div>
1074
- ) : store.installStatus === "coming-soon" ? (
1010
+ ) : store.installStatus === 'coming-soon' ? (
1075
1011
  /* ── Coming Soon panel ──────────────────────────────────── */
1076
1012
  <div className="rounded-lg border border-dashed border-muted-foreground/20 bg-muted/20 p-6 space-y-2 transition-all duration-300">
1077
1013
  <div className="flex items-center gap-2 text-muted-foreground">
@@ -1116,12 +1052,11 @@ export function ConfigureForm({
1116
1052
  </Card>
1117
1053
 
1118
1054
  {/* Last saved timestamp */}
1119
- {data?.config?.updatedAt &&
1120
- data.config.updatedAt !== new Date(0).toISOString() && (
1121
- <p className="text-center text-xs text-muted-foreground pb-2">
1122
- Last saved {new Date(data.config.updatedAt).toLocaleString()}
1123
- </p>
1124
- )}
1055
+ {data?.config?.updatedAt && data.config.updatedAt !== new Date(0).toISOString() && (
1056
+ <p className="text-center text-xs text-muted-foreground pb-2">
1057
+ Last saved {new Date(data.config.updatedAt).toLocaleString()}
1058
+ </p>
1059
+ )}
1125
1060
  </div>
1126
1061
 
1127
1062
  {/* ── Save confirmation dialog ─────────────────────────────────────── */}
@@ -1132,23 +1067,16 @@ export function ConfigureForm({
1132
1067
  <CheckCircle2 className="size-5 text-primary" />
1133
1068
  Confirm configuration
1134
1069
  </DialogTitle>
1135
- <DialogDescription>
1136
- Review your settings before saving.
1137
- </DialogDescription>
1070
+ <DialogDescription>Review your settings before saving.</DialogDescription>
1138
1071
  </DialogHeader>
1139
1072
  <div className="divide-y divide-border rounded-lg border border-border overflow-hidden text-sm">
1140
1073
  {summaryItems.map((item) => (
1141
- <div
1142
- key={item.label}
1143
- className="flex items-center justify-between px-3 py-2 gap-3"
1144
- >
1145
- <span className="text-muted-foreground text-xs">
1146
- {item.label}
1147
- </span>
1074
+ <div key={item.label} className="flex items-center justify-between px-3 py-2 gap-3">
1075
+ <span className="text-muted-foreground text-xs">{item.label}</span>
1148
1076
  <span
1149
1077
  className={cn(
1150
- "font-medium text-right truncate",
1151
- item.mono && "font-mono text-xs",
1078
+ 'font-medium text-right truncate',
1079
+ item.mono && 'font-mono text-xs',
1152
1080
  )}
1153
1081
  >
1154
1082
  {item.value}
@@ -1194,21 +1122,26 @@ export function ConfigureForm({
1194
1122
  }}
1195
1123
  />
1196
1124
 
1197
- <CustomEmbeddingModal
1125
+ <CustomModelModal
1126
+ type="embedding"
1198
1127
  open={customModalOpen}
1199
1128
  onOpenChange={setCustomModalOpen}
1200
1129
  onSave={async (cfg) => {
1201
- // Upsert: replace existing model with same name, or append a new one.
1130
+ const nextId = `custom:${cfg.modelName}`;
1202
1131
  const existing = form.customEmbeddings ?? [];
1203
- const updatedList = existing.some(
1204
- (m) => m.modelName === cfg.modelName,
1205
- )
1132
+ const updatedList = existing.some((m) => m.modelName === cfg.modelName)
1206
1133
  ? existing.map((m) => (m.modelName === cfg.modelName ? cfg : m))
1207
1134
  : [...existing, cfg];
1208
1135
 
1136
+ if (indexedRun && data?.config && nextId !== data.config.embeddingModelId) {
1137
+ handleStructuralChangeBlock();
1138
+ setForm({ ...form, customEmbeddings: updatedList });
1139
+ return;
1140
+ }
1141
+
1209
1142
  const nextForm = {
1210
1143
  ...form,
1211
- embeddingModelId: `custom:${cfg.modelName}`,
1144
+ embeddingModelId: nextId,
1212
1145
  customEmbeddings: updatedList,
1213
1146
  };
1214
1147
  setForm(nextForm);
@@ -1224,9 +1157,9 @@ export function ConfigureForm({
1224
1157
  if (Object.keys(fieldErrors).length === 0) {
1225
1158
  setSaving(true);
1226
1159
  try {
1227
- const res = await fetch("/api/config", {
1228
- method: "PUT",
1229
- headers: { "Content-Type": "application/json" },
1160
+ const res = await fetch('/api/config', {
1161
+ method: 'PUT',
1162
+ headers: { 'Content-Type': 'application/json' },
1230
1163
  body: JSON.stringify(nextForm),
1231
1164
  });
1232
1165
  if (res.ok) {
@@ -1243,7 +1176,7 @@ export function ConfigureForm({
1243
1176
  }
1244
1177
  }
1245
1178
 
1246
- toast.info("Custom model added", {
1179
+ toast.info('Custom model added', {
1247
1180
  description: "Click 'Save configuration' to persist your changes.",
1248
1181
  });
1249
1182
  }}
@@ -1258,21 +1191,19 @@ export function ConfigureForm({
1258
1191
  description={
1259
1192
  <>
1260
1193
  <span className="block">
1261
- Your index was built with{" "}
1194
+ Your index was built with{' '}
1262
1195
  <span className="font-semibold text-foreground">
1263
1196
  {indexedVectorStore
1264
- ? (getVectorStore(indexedVectorStore)?.label ??
1265
- indexedVectorStore)
1197
+ ? getVectorStore(indexedVectorStore)?.label ?? indexedVectorStore
1266
1198
  : form.vectorStore}
1267
1199
  </span>
1268
- . Switching to a different vector store would make the existing
1269
- index incompatible — vectors are bound to the store they were
1270
- written to.
1200
+ . Switching to a different vector store would make the existing index incompatible —
1201
+ vectors are bound to the store they were written to.
1271
1202
  </span>
1272
1203
  <span className="block">
1273
- To use a different vector store, go to the{" "}
1274
- <strong className="text-foreground">Index</strong> page and run a
1275
- full re-index with your new settings.
1204
+ To use a different vector store, go to the{' '}
1205
+ <strong className="text-foreground">Index</strong> page and run a full re-index with
1206
+ your new settings.
1276
1207
  </span>
1277
1208
  </>
1278
1209
  }
@@ -1285,7 +1216,7 @@ export function ConfigureForm({
1285
1216
  }
1286
1217
  variant="destructive"
1287
1218
  onAction={() => {
1288
- window.location.href = "/index-data";
1219
+ window.location.href = '/index-data';
1289
1220
  }}
1290
1221
  />
1291
1222
 
@@ -1298,21 +1229,16 @@ export function ConfigureForm({
1298
1229
  description={
1299
1230
  <>
1300
1231
  <span className="block">
1301
- Your index was built with{" "}
1302
- <span className="font-semibold text-foreground">
1303
- {indexedDimensions} dimensions
1304
- </span>
1305
- . The selected model outputs a different vector size, which is
1306
- incompatible with the existing index.
1232
+ Your index was built with{' '}
1233
+ <span className="font-semibold text-foreground">{indexedDimensions} dimensions</span>.
1234
+ The selected model outputs a different vector size, which is incompatible with the
1235
+ existing index.
1307
1236
  </span>
1308
1237
  <span className="block">
1309
- ✓ You can freely switch to any model that also produces{" "}
1310
- <span className="font-semibold text-foreground">
1311
- {indexedDimensions}d
1312
- </span>{" "}
1313
- vectors. To use a different dimension size, go to the{" "}
1314
- <strong className="text-foreground">Index</strong> page and run a
1315
- full re-index.
1238
+ ✓ You can freely switch to any model that also produces{' '}
1239
+ <span className="font-semibold text-foreground">{indexedDimensions}d</span> vectors.
1240
+ To use a different dimension size, go to the{' '}
1241
+ <strong className="text-foreground">Index</strong> page and run a full re-index.
1316
1242
  </span>
1317
1243
  </>
1318
1244
  }
@@ -1325,7 +1251,7 @@ export function ConfigureForm({
1325
1251
  }
1326
1252
  variant="destructive"
1327
1253
  onAction={() => {
1328
- window.location.href = "/index-data";
1254
+ window.location.href = '/index-data';
1329
1255
  }}
1330
1256
  />
1331
1257
 
@@ -1336,10 +1262,10 @@ export function ConfigureForm({
1336
1262
  title="Delete custom model?"
1337
1263
  description={
1338
1264
  <>
1339
- This will remove{" "}
1265
+ This will remove{' '}
1340
1266
  <span className="font-semibold text-foreground">
1341
1267
  &quot;{activeCustomModel?.modelName}&quot;
1342
- </span>{" "}
1268
+ </span>{' '}
1343
1269
  from your saved custom models. This action cannot be undone.
1344
1270
  </>
1345
1271
  }
@@ -1365,9 +1291,9 @@ export function ConfigureForm({
1365
1291
 
1366
1292
  setSaving(true);
1367
1293
  try {
1368
- const res = await fetch("/api/config", {
1369
- method: "PUT",
1370
- headers: { "Content-Type": "application/json" },
1294
+ const res = await fetch('/api/config', {
1295
+ method: 'PUT',
1296
+ headers: { 'Content-Type': 'application/json' },
1371
1297
  body: JSON.stringify(nextForm),
1372
1298
  });
1373
1299
  if (res.ok) {
@@ -1377,7 +1303,7 @@ export function ConfigureForm({
1377
1303
  toast.success(`Custom model "${modelName}" deleted`);
1378
1304
  }
1379
1305
  } catch {
1380
- toast.error("Failed to save after deletion");
1306
+ toast.error('Failed to save after deletion');
1381
1307
  } finally {
1382
1308
  setSaving(false);
1383
1309
  }
@@ -1397,61 +1323,65 @@ export function ConfigureForm({
1397
1323
  <div className="space-y-2">
1398
1324
  <Label>Provider</Label>
1399
1325
  <Select
1400
- value={form.embeddingProvider || "openai"}
1326
+ value={form.embeddingProvider || 'openai'}
1401
1327
  onValueChange={(v) => {
1402
- set("embeddingProvider", v as string);
1403
- // Reset model when provider changes (except for vercel_ai_gateway which shows all)
1404
- if (v !== "vercel_ai_gateway" && v !== "custom") {
1405
- const firstModel = EMBEDDING_MODELS.find(
1406
- (m) => m.provider === v,
1407
- )?.id;
1328
+ if (indexedRun && data?.config && v !== data.config.embeddingProvider) {
1329
+ handleStructuralChangeBlock();
1330
+ return;
1331
+ }
1332
+ set('embeddingProvider', v as string);
1333
+ if (v !== 'vercel_ai_gateway' && v !== 'custom') {
1334
+ const firstModel = EMBEDDING_MODELS.find((m) => m.provider === v)?.id;
1408
1335
  if (firstModel) {
1409
- set("embeddingModelId", firstModel);
1336
+ set('embeddingModelId', firstModel);
1410
1337
  }
1411
1338
  }
1412
1339
  }}
1413
1340
  >
1414
1341
  <SelectTrigger className="w-full">
1415
1342
  <span className="flex items-center gap-2">
1416
- {PROVIDER_META[
1417
- form.embeddingProvider as keyof typeof PROVIDER_META
1418
- ]?.label || form.embeddingProvider}
1343
+ {PROVIDER_META[form.embeddingProvider as keyof typeof PROVIDER_META]?.label ||
1344
+ form.embeddingProvider}
1419
1345
  </span>
1420
1346
  </SelectTrigger>
1421
1347
  <SelectContent>
1422
1348
  {[
1423
- "vercel_ai_gateway",
1424
- "openai",
1425
- "deepseek",
1426
- "google",
1349
+ 'vercel_ai_gateway',
1350
+ 'openai',
1351
+ 'google',
1427
1352
  // "cohere",
1428
- "voyage",
1429
- "mistral",
1430
- "jina",
1431
- "nomic",
1432
- "custom",
1433
- ].map((providerKey) => {
1434
- const meta =
1435
- PROVIDER_META[providerKey as keyof typeof PROVIDER_META];
1436
- if (!meta) return null;
1437
- return (
1438
- <SelectItem key={providerKey} value={providerKey}>
1439
- <div className="flex items-center gap-2">
1440
- <ProviderIcon
1441
- src={meta.iconSrc}
1442
- alt={meta.label}
1443
- pillBg={meta.pillBg}
1444
- size={16}
1445
- />
1446
- <span>
1447
- {meta.label}
1448
- {providerKey === "vercel_ai_gateway" &&
1449
- " (Recommended)"}
1450
- </span>
1451
- </div>
1452
- </SelectItem>
1453
- );
1454
- })}
1353
+ 'voyage',
1354
+ 'mistral',
1355
+ 'jina',
1356
+ 'nomic',
1357
+ 'custom',
1358
+ ]
1359
+ .filter(
1360
+ (key) =>
1361
+ (EMBEDDING_BY_PROVIDER[key] && EMBEDDING_BY_PROVIDER[key].length > 0) ||
1362
+ key === 'vercel_ai_gateway' ||
1363
+ key === 'custom',
1364
+ )
1365
+ .map((providerKey) => {
1366
+ const meta = PROVIDER_META[providerKey as keyof typeof PROVIDER_META];
1367
+ if (!meta) return null;
1368
+ return (
1369
+ <SelectItem key={providerKey} value={providerKey}>
1370
+ <div className="flex items-center gap-2">
1371
+ <ProviderIcon
1372
+ src={meta.iconSrc}
1373
+ alt={meta.label}
1374
+ pillBg={meta.pillBg}
1375
+ size={16}
1376
+ />
1377
+ <span>
1378
+ {meta.label}
1379
+ {providerKey === 'vercel_ai_gateway' && ' (Recommended)'}
1380
+ </span>
1381
+ </div>
1382
+ </SelectItem>
1383
+ );
1384
+ })}
1455
1385
  </SelectContent>
1456
1386
  </Select>
1457
1387
  </div>
@@ -1460,10 +1390,10 @@ export function ConfigureForm({
1460
1390
  <div className="relative">
1461
1391
  <Input
1462
1392
  id="apiKey"
1463
- type={showProviderApiKey ? "text" : "password"}
1393
+ type={showProviderApiKey ? 'text' : 'password'}
1464
1394
  placeholder="Enter API Key..."
1465
- value={form.embeddingApiKey || ""}
1466
- onChange={(e) => set("embeddingApiKey", e.target.value)}
1395
+ value={form.embeddingApiKey || ''}
1396
+ onChange={(e) => set('embeddingApiKey', e.target.value)}
1467
1397
  className="pr-10"
1468
1398
  />
1469
1399
  <button
@@ -1471,11 +1401,7 @@ export function ConfigureForm({
1471
1401
  onClick={() => setShowProviderApiKey(!showProviderApiKey)}
1472
1402
  className="absolute inset-y-0 right-0 flex items-center pr-3 text-muted-foreground hover:text-foreground"
1473
1403
  >
1474
- {showProviderApiKey ? (
1475
- <EyeOff className="size-4" />
1476
- ) : (
1477
- <Eye className="size-4" />
1478
- )}
1404
+ {showProviderApiKey ? <EyeOff className="size-4" /> : <Eye className="size-4" />}
1479
1405
  </button>
1480
1406
  </div>
1481
1407
  <p className="text-xs text-muted-foreground mt-2">
@@ -1490,9 +1416,9 @@ export function ConfigureForm({
1490
1416
  onClick={async () => {
1491
1417
  setTestingKey(true);
1492
1418
  try {
1493
- const res = await fetch("/api/config/test-provider", {
1494
- method: "POST",
1495
- headers: { "Content-Type": "application/json" },
1419
+ const res = await fetch('/api/config/test-provider', {
1420
+ method: 'POST',
1421
+ headers: { 'Content-Type': 'application/json' },
1496
1422
  body: JSON.stringify({
1497
1423
  embeddingProvider: form.embeddingProvider,
1498
1424
  embeddingApiKey: form.embeddingApiKey,
@@ -1501,28 +1427,23 @@ export function ConfigureForm({
1501
1427
  }),
1502
1428
  });
1503
1429
  const data = await res.json();
1504
- if (!res.ok)
1505
- throw new Error(data.error || "Connection failed");
1430
+ if (!res.ok) throw new Error(data.error || 'Connection failed');
1506
1431
 
1507
- toast.success("Settings saved", {
1432
+ toast.success('Settings saved', {
1508
1433
  description: `Connection verified for ${form.embeddingProvider}.`,
1509
1434
  });
1510
1435
  setApiKeyModalOpen(false);
1511
1436
  } catch (err) {
1512
- toast.error("Invalid API Key", {
1437
+ toast.error('Invalid API Key', {
1513
1438
  description:
1514
- err instanceof Error
1515
- ? err.message
1516
- : "Could not connect to provider.",
1439
+ err instanceof Error ? err.message : 'Could not connect to provider.',
1517
1440
  });
1518
1441
  } finally {
1519
1442
  setTestingKey(false);
1520
1443
  }
1521
1444
  }}
1522
1445
  >
1523
- {testingKey ? (
1524
- <Loader2 className="size-4 animate-spin mr-2" />
1525
- ) : null}
1446
+ {testingKey ? <Loader2 className="size-4 animate-spin mr-2" /> : null}
1526
1447
  Save changes
1527
1448
  </Button>
1528
1449
  </DialogFooter>
@@ -1531,153 +1452,3 @@ export function ConfigureForm({
1531
1452
  </div>
1532
1453
  );
1533
1454
  }
1534
-
1535
- function CustomEmbeddingModal({
1536
- open,
1537
- onOpenChange,
1538
- onSave,
1539
- }: {
1540
- open: boolean;
1541
- onOpenChange: (open: boolean) => void;
1542
- onSave: (config: CustomEmbeddingConfig) => void;
1543
- }) {
1544
- const [baseUrl, setBaseUrl] = useState("");
1545
- const [apiKey, setApiKey] = useState("");
1546
- const [showApiKey, setShowApiKey] = useState(false);
1547
- const [modelName, setModelName] = useState("");
1548
- const [dimensions, setDimensions] = useState<number | null>(null);
1549
- const [testing, setTesting] = useState(false);
1550
-
1551
- // Reset form every time the modal opens so users always start fresh.
1552
- useEffect(() => {
1553
- if (open) {
1554
- setBaseUrl("");
1555
- setApiKey("");
1556
- setModelName("");
1557
- setDimensions(null);
1558
- setShowApiKey(false);
1559
- }
1560
- }, [open]);
1561
-
1562
- const handleTest = async () => {
1563
- if (!baseUrl || !modelName) {
1564
- toast.error("Base URL and Model Name are required");
1565
- return;
1566
- }
1567
- setTesting(true);
1568
- try {
1569
- const res = await fetch("/api/config/test-embedding", {
1570
- method: "POST",
1571
- headers: { "Content-Type": "application/json" },
1572
- body: JSON.stringify({ baseUrl, apiKey, modelName }),
1573
- });
1574
- const data = await res.json();
1575
- if (!res.ok) throw new Error(data.error || "Connection failed");
1576
-
1577
- setDimensions(data.dimensions);
1578
- toast.success(`Success! Detected ${data.dimensions} dimensions.`);
1579
- } catch (err) {
1580
- toast.error(err instanceof Error ? err.message : "Test failed");
1581
- setDimensions(null);
1582
- } finally {
1583
- setTesting(false);
1584
- }
1585
- };
1586
-
1587
- const handleSave = () => {
1588
- if (!baseUrl || !modelName || !dimensions) {
1589
- toast.error("Please test the connection to fetch dimensions first.");
1590
- return;
1591
- }
1592
- onSave({ baseUrl, apiKey, modelName, dimensions });
1593
- onOpenChange(false);
1594
- };
1595
-
1596
- return (
1597
- <Dialog open={open} onOpenChange={onOpenChange}>
1598
- <DialogContent className={"max-w-xl "}>
1599
- <DialogHeader>
1600
- <DialogTitle>Custom Embedding Model</DialogTitle>
1601
- <DialogDescription>
1602
- Connect an OpenAI-compatible embedding model.
1603
- </DialogDescription>
1604
- </DialogHeader>
1605
- <div className="grid gap-4 py-4">
1606
- <div className="grid gap-2">
1607
- <Label htmlFor="baseUrl">Base URL</Label>
1608
- <Input
1609
- id="baseUrl"
1610
- placeholder="https://api.example.com/v1"
1611
- value={baseUrl}
1612
- onChange={(e) => {
1613
- setBaseUrl(e.target.value);
1614
- setDimensions(null); // Require re-test on change
1615
- }}
1616
- />
1617
- </div>
1618
- <div className="grid gap-2">
1619
- <Label htmlFor="apiKey">API Key (Optional)</Label>
1620
- <div className="relative">
1621
- <Input
1622
- id="apiKey"
1623
- type={showApiKey ? "text" : "password"}
1624
- placeholder="sk-..."
1625
- value={apiKey}
1626
- onChange={(e) => {
1627
- setApiKey(e.target.value);
1628
- setDimensions(null);
1629
- }}
1630
- className="pr-10"
1631
- />
1632
- <button
1633
- type="button"
1634
- onClick={() => setShowApiKey(!showApiKey)}
1635
- className="absolute inset-y-0 right-0 flex items-center pr-3 text-muted-foreground hover:text-foreground"
1636
- >
1637
- {showApiKey ? (
1638
- <EyeOff className="size-4" />
1639
- ) : (
1640
- <Eye className="size-4" />
1641
- )}
1642
- </button>
1643
- </div>
1644
- </div>
1645
- <div className="grid gap-2">
1646
- <Label htmlFor="modelName">Model Name</Label>
1647
- <Input
1648
- id="modelName"
1649
- placeholder="my-embedding-model"
1650
- value={modelName}
1651
- onChange={(e) => {
1652
- setModelName(e.target.value);
1653
- setDimensions(null);
1654
- }}
1655
- />
1656
- </div>
1657
- {dimensions && (
1658
- <div className="text-sm text-green-600 dark:text-green-400 font-medium">
1659
- ✓ Connection verified ({dimensions} dimensions)
1660
- </div>
1661
- )}
1662
- </div>
1663
- <DialogFooter className="flex flex-row justify-between sm:justify-between items-center gap-2">
1664
- <Button variant="outline" onClick={handleTest} disabled={testing}>
1665
- {testing ? (
1666
- <Loader2 className="size-4 animate-spin mr-2" />
1667
- ) : (
1668
- <Cloud className="size-4 mr-2" />
1669
- )}
1670
- Test Connection
1671
- </Button>
1672
- <Button
1673
- className={"px-5"}
1674
- onClick={handleSave}
1675
- disabled={!dimensions}
1676
- >
1677
- Add Model
1678
- </Button>
1679
- </DialogFooter>
1680
- </DialogContent>
1681
- </Dialog>
1682
- );
1683
- }