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,12 +1,11 @@
1
- "use client";
1
+ 'use client';
2
2
 
3
- import { useMemo, useState, useEffect, useRef } from "react";
4
- import { toast } from "sonner";
5
- import { formatErrorMessage } from "@/lib/error-formatter";
3
+ import { useMemo, useState, useEffect, useRef } from 'react';
4
+ import { toast } from 'sonner';
5
+ import { formatErrorMessage } from '@/lib/error-formatter';
6
6
  import {
7
7
  Globe,
8
8
  Loader2,
9
- Plus,
10
9
  Rocket,
11
10
  Search,
12
11
  ChevronDown,
@@ -14,32 +13,32 @@ import {
14
13
  Info,
15
14
  Clock,
16
15
  X,
17
- } from "lucide-react";
18
- import type { CrawlScope, SearchResultItem } from "@larkup/core/types";
19
- import { Button } from "@/components/ui/button";
20
- import { Input } from "@/components/ui/input";
21
- import { Label } from "@/components/ui/label";
22
- import { Checkbox } from "@/components/ui/checkbox";
23
- import { Badge } from "@/components/ui/badge";
24
-
25
- import { Switch } from "@/components/ui/switch";
16
+ Trash2,
17
+ } from 'lucide-react';
18
+ import { useScrapeStore, type SearchState } from '@/store/scrape-store';
19
+ import type { CrawlScope, SearchResultItem } from '@larkup/core/types';
20
+ import { Button } from '@/components/ui/button';
21
+ import { Input } from '@/components/ui/input';
22
+ import { Label } from '@/components/ui/label';
23
+ import { Checkbox } from '@/components/ui/checkbox';
24
+ import { Badge } from '@/components/ui/badge';
25
+
26
+ import { Switch } from '@/components/ui/switch';
26
27
  import {
27
28
  Select,
28
29
  SelectContent,
29
30
  SelectItem,
30
31
  SelectTrigger,
31
32
  SelectValue,
32
- } from "@/components/ui/select";
33
- import {
34
- Tooltip,
35
- TooltipContent,
36
- TooltipProvider,
37
- TooltipTrigger,
38
- } from "@/components/ui/tooltip";
39
- import { GenericAlert } from "@/components/alerts/generic-alert";
40
- import { cn } from "@/lib/utils";
33
+ } from '@/components/ui/select';
34
+ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';
35
+ import { GenericAlert } from '@/components/alerts/generic-alert';
36
+ import { cn } from '@/lib/utils';
37
+ import { Tabs, TabsList, TabsTrigger } from '@/components/ui/tabs';
38
+ import useSWR from 'swr';
39
+ import type { RagConfig } from '@larkup/core/types';
41
40
 
42
- import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs";
41
+ const fetcher = (url: string) => fetch(url).then((r) => r.json() as Promise<{ config: RagConfig }>);
43
42
 
44
43
  function domainOf(url: string) {
45
44
  try {
@@ -70,61 +69,58 @@ function estimateEtlDuration(
70
69
  scope: CrawlScope,
71
70
  pageLimit: number,
72
71
  ): { totalPages: number; estimatedSeconds: number } {
73
- // ~3s per page scrape, ~5s per domain page (crawl overhead)
74
- const pagesPerUrl = scope === "domain" ? pageLimit : 1;
72
+ const pagesPerUrl = scope === 'domain' ? pageLimit : 1;
75
73
  const totalPages = urlCount * pagesPerUrl;
76
- const perPageSeconds = scope === "domain" ? 5 : 3;
74
+ const perPageSeconds = scope === 'domain' ? 5 : 3;
77
75
  const estimatedSeconds = totalPages * perPageSeconds;
78
76
  return { totalPages, estimatedSeconds };
79
77
  }
80
78
 
81
- interface SearchState {
82
- results: SearchResultItem[];
83
- totalResults: number;
84
- totalResultsIsEstimate: boolean;
85
- currentPage: number;
86
- totalPages: number;
87
- hasMore: boolean;
88
- query: string;
89
- searchProvider: "firecrawl" | "serper";
90
- }
91
-
92
79
  export function ScrapePanel({
93
80
  disabled,
94
81
  onStarted,
82
+ crawlerControl,
95
83
  }: {
96
- disabled: boolean;
84
+ disabled?: boolean;
97
85
  onStarted: () => void;
86
+ crawlerControl?: React.ReactNode;
98
87
  }) {
99
- const [query, setQuery] = useState("");
88
+ const {
89
+ query,
90
+ setQuery,
91
+ searchState,
92
+ setSearchState,
93
+ selected,
94
+ setSelected,
95
+ scope,
96
+ setScope,
97
+ pageLimit,
98
+ setPageLimit,
99
+ searchLimit,
100
+ setSearchLimit,
101
+ showAdvanced,
102
+ setShowAdvanced,
103
+ serperTotalForQuery,
104
+ setSerperTotalForQuery,
105
+ flush: flushSearch,
106
+ } = useScrapeStore();
107
+
100
108
  const [searching, setSearching] = useState(false);
101
109
  const [loadingMore, setLoadingMore] = useState(false);
102
110
  const [gatheringAll, setGatheringAll] = useState(false);
103
111
  const [gatherProgress, setGatherProgress] = useState(0);
104
- const [searchState, setSearchState] = useState<SearchState | null>(null);
105
- const [selected, setSelected] = useState<Record<string, boolean>>({});
106
- const [scope, setScope] = useState<CrawlScope>("domain");
107
- const [pageLimit, setPageLimit] = useState(25);
108
- const [manualUrl, setManualUrl] = useState("");
112
+ const [manualUrl, setManualUrl] = useState('');
109
113
  const [starting, setStarting] = useState(false);
110
114
  /** When true: only the exact custom URLs are scraped — no deep crawl/pagination */
111
115
  const [specificUrls, setSpecificUrls] = useState(false);
112
- const [serperConfigured, setSerperConfigured] = useState<boolean | null>(
113
- null,
114
- );
115
- const [firecrawlConfigured, setFirecrawlConfigured] = useState<
116
- boolean | null
117
- >(null);
116
+ const [serperConfigured, setSerperConfigured] = useState<boolean | null>(null);
117
+ const [firecrawlConfigured, setFirecrawlConfigured] = useState<boolean | null>(null);
118
118
  const [confirmOpen, setConfirmOpen] = useState(false);
119
+ const { data: configData } = useSWR('/api/config', fetcher);
120
+ const activeProvider = configData?.config?.webSearchProvider || 'tavily';
119
121
  const [fetchingCount, setFetchingCount] = useState(false);
120
- const [serperTotalForQuery, setSerperTotalForQuery] = useState<{
121
- query: string;
122
- total: number;
123
- totalPages: number;
124
- } | null>(null);
125
122
  const [cachedQueries, setCachedQueries] = useState<string[]>([]);
126
123
  const [showDropdown, setShowDropdown] = useState(false);
127
- const [searchLimit, setSearchLimit] = useState(15);
128
124
  const inputRef = useRef<HTMLInputElement>(null);
129
125
  const dropdownRef = useRef<HTMLDivElement>(null);
130
126
 
@@ -139,13 +135,13 @@ export function ScrapePanel({
139
135
  setShowDropdown(false);
140
136
  }
141
137
  }
142
- document.addEventListener("mousedown", handleClickOutside);
143
- return () => document.removeEventListener("mousedown", handleClickOutside);
138
+ document.addEventListener('mousedown', handleClickOutside);
139
+ return () => document.removeEventListener('mousedown', handleClickOutside);
144
140
  }, []);
145
141
 
146
142
  useEffect(() => {
147
143
  try {
148
- const saved = localStorage.getItem("scrape_recent_queries");
144
+ const saved = localStorage.getItem('scrape_recent_queries');
149
145
  if (saved) setCachedQueries(JSON.parse(saved));
150
146
  } catch {
151
147
  // ignore
@@ -156,12 +152,9 @@ export function ScrapePanel({
156
152
  const trimmed = q.trim();
157
153
  if (!trimmed) return;
158
154
  setCachedQueries((prev) => {
159
- const newCache = [
160
- trimmed,
161
- ...prev.filter((item) => item !== trimmed),
162
- ].slice(0, 10);
155
+ const newCache = [trimmed, ...prev.filter((item) => item !== trimmed)].slice(0, 10);
163
156
  try {
164
- localStorage.setItem("scrape_recent_queries", JSON.stringify(newCache));
157
+ localStorage.setItem('scrape_recent_queries', JSON.stringify(newCache));
165
158
  } catch {
166
159
  // ignore
167
160
  }
@@ -174,7 +167,7 @@ export function ScrapePanel({
174
167
  setCachedQueries((prev) => {
175
168
  const newCache = prev.filter((item) => item !== q);
176
169
  try {
177
- localStorage.setItem("scrape_recent_queries", JSON.stringify(newCache));
170
+ localStorage.setItem('scrape_recent_queries', JSON.stringify(newCache));
178
171
  } catch {
179
172
  // ignore
180
173
  }
@@ -182,35 +175,26 @@ export function ScrapePanel({
182
175
  });
183
176
  }
184
177
 
185
- // Check providers on mount
186
178
  useEffect(() => {
187
- // Check Serper
188
- fetch("/api/search/google")
189
- .then((r) => r.json())
190
- .then((d) => setSerperConfigured(d.configured ?? false))
191
- .catch(() => setSerperConfigured(false));
192
179
  // Check Firecrawl
193
- fetch("/api/search")
180
+ fetch('/api/search')
194
181
  .then((r) => r.json())
195
182
  .then((d) => setFirecrawlConfigured(d.configured ?? false))
196
183
  .catch(() => setFirecrawlConfigured(false));
197
184
  }, []);
198
185
 
199
- const selectedUrls = useMemo(
200
- () => Object.keys(selected).filter((u) => selected[u]),
201
- [selected],
202
- );
186
+ const selectedUrls = useMemo(() => Object.keys(selected).filter((u) => selected[u]), [selected]);
203
187
 
204
188
  /** Search using Firecrawl (preferred — no Serper credits used for search). */
205
189
  async function searchFirecrawl(q: string, isMulti: boolean) {
206
190
  try {
207
- const res = await fetch("/api/search", {
208
- method: "POST",
209
- headers: { "Content-Type": "application/json" },
191
+ const res = await fetch('/api/search', {
192
+ method: 'POST',
193
+ headers: { 'Content-Type': 'application/json' },
210
194
  body: JSON.stringify({ query: q, limit: searchLimit }),
211
195
  });
212
196
  const data = await res.json();
213
- if (!res.ok) throw new Error(data.error ?? "Search failed");
197
+ if (!res.ok) throw new Error(data.error ?? 'Search failed');
214
198
  const newItems = (data.results as SearchResultItem[]) ?? [];
215
199
 
216
200
  setSearchState((prev) => {
@@ -219,55 +203,69 @@ export function ScrapePanel({
219
203
  const fresh = newItems.filter((r) => !existingUrls.has(r.url));
220
204
  return {
221
205
  results: [...existingResults, ...fresh],
222
- totalResults: isMulti
223
- ? (prev?.totalResults ?? 0) + fresh.length
224
- : fresh.length,
206
+ totalResults: isMulti ? (prev?.totalResults ?? 0) + fresh.length : fresh.length,
225
207
  totalResultsIsEstimate: false,
226
208
  currentPage: 1,
227
209
  totalPages: 1,
228
210
  hasMore: false,
229
- query: isMulti ? "Multiple queries" : q,
230
- searchProvider: "firecrawl",
211
+ query: isMulti ? 'Multiple queries' : q,
212
+ searchProvider: 'firecrawl',
231
213
  };
232
214
  });
233
215
 
234
216
  const newSelected = Object.fromEntries(newItems.map((r) => [r.url, true]));
235
217
  setSelected((prev) => ({ ...prev, ...newSelected }));
236
218
 
237
- if (newItems.length === 0 && !isMulti)
238
- toast.message("No results — try different keywords.");
219
+ if (newItems.length === 0 && !isMulti) toast.message('No results. Try different keywords.');
239
220
 
240
- // If Serper is also configured, fetch the total count in background
241
- if (serperConfigured && !isMulti) {
242
- fetchSerperTotalCount(q);
221
+ if (activeProvider && !isMulti) {
222
+ fetchProviderTotalCount(q, activeProvider);
243
223
  }
244
224
  } catch (err) {
245
225
  toast.error(formatErrorMessage(err));
246
226
  }
247
227
  }
248
228
 
249
- /** Search using Serper (fallback if Firecrawl not available). */
250
- async function searchSerper(
229
+ /** Search using generic provider. */
230
+ async function searchGeneric(
251
231
  q: string,
232
+ provider: string,
252
233
  page: number,
253
234
  isMulti: boolean,
254
235
  appendPagination = false,
255
236
  ) {
256
- if (!appendPagination) {
257
- // It's the initial search, searching flag is handled in runSearch
258
- } else {
237
+ if (appendPagination) {
259
238
  setLoadingMore(true);
260
239
  }
261
240
 
241
+ const endpoint =
242
+ provider === 'serper' || provider === 'google'
243
+ ? '/api/search/google'
244
+ : provider === 'brave'
245
+ ? '/api/search/brave'
246
+ : provider === 'bing'
247
+ ? '/api/search/bing'
248
+ : provider === 'tavily'
249
+ ? '/api/search/tavily'
250
+ : provider === 'exa'
251
+ ? '/api/search/exa'
252
+ : null;
253
+
254
+ if (!endpoint) {
255
+ toast.error('Invalid search provider');
256
+ if (appendPagination) setLoadingMore(false);
257
+ return;
258
+ }
259
+
262
260
  try {
263
- const res = await fetch("/api/search/google", {
264
- method: "POST",
265
- headers: { "Content-Type": "application/json" },
261
+ const res = await fetch(endpoint, {
262
+ method: 'POST',
263
+ headers: { 'Content-Type': 'application/json' },
266
264
  body: JSON.stringify({ query: q, page }),
267
265
  });
268
266
  const data = await res.json();
269
267
 
270
- if (!res.ok) throw new Error(data.error ?? "Search failed");
268
+ if (!res.ok) throw new Error(data.error ?? 'Search failed');
271
269
 
272
270
  const newItems: SearchResultItem[] = (data.items ?? []).map(
273
271
  (item: { url: string; title: string; description?: string }) => ({
@@ -289,7 +287,7 @@ export function ScrapePanel({
289
287
  totalPages: data.totalPages ?? 1,
290
288
  hasMore: data.hasMore ?? false,
291
289
  query: data.query ?? q,
292
- searchProvider: "serper",
290
+ searchProvider: provider as any,
293
291
  };
294
292
  });
295
293
 
@@ -297,7 +295,7 @@ export function ScrapePanel({
297
295
  setSelected((prev) => ({ ...prev, ...newSelected }));
298
296
 
299
297
  if (!isMulti) {
300
- // Update Serper total
298
+ // Update total
301
299
  setSerperTotalForQuery({
302
300
  query: q,
303
301
  total: data.totalResults ?? 0,
@@ -305,23 +303,39 @@ export function ScrapePanel({
305
303
  });
306
304
  }
307
305
 
308
- if (page === 1 && (data.totalResults ?? 0) === 0 && !isMulti) {
309
- toast.message("No results try different keywords.");
306
+ if (page === 1 && newItems.length === 0 && !isMulti) {
307
+ toast.message('No results. Try different keywords.');
310
308
  }
311
309
  } catch (err) {
310
+ if (page === 1) throw err;
312
311
  toast.error(formatErrorMessage(err));
313
312
  } finally {
314
313
  if (appendPagination) setLoadingMore(false);
315
314
  }
316
315
  }
317
316
 
318
- /** Fetch total count from Serper without using it for results (saves on Firecrawl credits) */
319
- async function fetchSerperTotalCount(q: string) {
317
+ /** Fetch total count from provider without using it for results (saves on Firecrawl credits) */
318
+ async function fetchProviderTotalCount(q: string, provider: string) {
319
+ const endpoint =
320
+ provider === 'serper' || provider === 'google'
321
+ ? '/api/search/google'
322
+ : provider === 'brave'
323
+ ? '/api/search/brave'
324
+ : provider === 'bing'
325
+ ? '/api/search/bing'
326
+ : provider === 'tavily'
327
+ ? '/api/search/tavily'
328
+ : provider === 'exa'
329
+ ? '/api/search/exa'
330
+ : null;
331
+
332
+ if (!endpoint) return;
333
+
320
334
  setFetchingCount(true);
321
335
  try {
322
- const res = await fetch("/api/search/google", {
323
- method: "POST",
324
- headers: { "Content-Type": "application/json" },
336
+ const res = await fetch(endpoint, {
337
+ method: 'POST',
338
+ headers: { 'Content-Type': 'application/json' },
325
339
  body: JSON.stringify({ query: q, page: 1 }),
326
340
  });
327
341
  const data = await res.json();
@@ -342,16 +356,15 @@ export function ScrapePanel({
342
356
  async function runSearch() {
343
357
  setShowDropdown(false);
344
358
  if (!query.trim()) {
345
- toast.error("Enter one or more keywords to search.");
359
+ toast.error('Enter one or more keywords to search.');
346
360
  return;
347
361
  }
348
362
 
349
- // We do NOT clear selected URLs here so users can keep them across searches
350
363
  setSerperTotalForQuery(null);
351
364
  saveQuery(query);
352
365
 
353
366
  const queries = query
354
- .split(",")
367
+ .split(',')
355
368
  .map((q) => q.trim())
356
369
  .filter(Boolean);
357
370
  if (queries.length === 0) return;
@@ -360,22 +373,17 @@ export function ScrapePanel({
360
373
  // Removed setSearchState(null) so we append instead of clear
361
374
 
362
375
  try {
363
- if (firecrawlConfigured) {
364
- await Promise.all(
365
- queries.map((q) => searchFirecrawl(q, queries.length > 1)),
366
- );
367
- } else if (serperConfigured) {
368
- await Promise.all(
369
- queries.map((q) => searchSerper(q, 1, queries.length > 1, false)),
370
- );
376
+ if (activeProvider === 'local' || !activeProvider) {
377
+ await Promise.all(queries.map((q) => searchFirecrawl(q, queries.length > 1)));
371
378
  } else {
372
- toast.error(
373
- formatErrorMessage(
374
- new Error(
375
- "No search provider available. Configure Firecrawl or add SERPER_API_KEY.",
376
- ),
377
- ),
378
- );
379
+ try {
380
+ await Promise.all(
381
+ queries.map((q) => searchGeneric(q, activeProvider, 1, queries.length > 1, false)),
382
+ );
383
+ } catch (err) {
384
+ toast.error(`${activeProvider} search failed. Falling back to local crawler...`);
385
+ await Promise.all(queries.map((q) => searchFirecrawl(q, queries.length > 1)));
386
+ }
379
387
  }
380
388
  } finally {
381
389
  setSearching(false);
@@ -384,9 +392,10 @@ export function ScrapePanel({
384
392
 
385
393
  async function loadNextPage() {
386
394
  if (!searchState?.hasMore || loadingMore) return;
387
- if (searchState.searchProvider === "serper") {
388
- await searchSerper(
395
+ if (searchState.searchProvider !== 'firecrawl') {
396
+ await searchGeneric(
389
397
  searchState.query,
398
+ searchState.searchProvider,
390
399
  searchState.currentPage + 1,
391
400
  false,
392
401
  true,
@@ -394,25 +403,40 @@ export function ScrapePanel({
394
403
  }
395
404
  }
396
405
 
397
- /** Automatically paginate through ALL available Serper results. */
406
+ /** Automatically paginate through ALL available provider results. */
398
407
  async function gatherAll() {
399
- if (!searchState || searchState.searchProvider !== "serper") return;
408
+ if (!searchState || searchState.searchProvider === 'firecrawl') return;
400
409
  setGatheringAll(true);
401
410
  setGatherProgress(searchState.currentPage);
402
411
 
403
412
  let page = searchState.currentPage + 1;
404
413
  const total = searchState.totalPages;
414
+ const provider = searchState.searchProvider;
415
+
416
+ const endpoint =
417
+ provider === 'serper' || provider === 'google'
418
+ ? '/api/search/google'
419
+ : provider === 'brave'
420
+ ? '/api/search/brave'
421
+ : provider === 'bing'
422
+ ? '/api/search/bing'
423
+ : provider === 'tavily'
424
+ ? '/api/search/tavily'
425
+ : provider === 'exa'
426
+ ? '/api/search/exa'
427
+ : null;
405
428
 
406
429
  try {
407
430
  while (page <= total) {
408
431
  setGatherProgress(page);
409
- const res = await fetch("/api/search/google", {
410
- method: "POST",
411
- headers: { "Content-Type": "application/json" },
432
+ if (!endpoint) break;
433
+ const res = await fetch(endpoint, {
434
+ method: 'POST',
435
+ headers: { 'Content-Type': 'application/json' },
412
436
  body: JSON.stringify({ query: query.trim(), page }),
413
437
  });
414
438
  const data = await res.json();
415
- if (!res.ok) throw new Error(data.error ?? "Search failed");
439
+ if (!res.ok) throw new Error(data.error ?? 'Search failed');
416
440
 
417
441
  const newItems: SearchResultItem[] = (data.items ?? []).map(
418
442
  (item: { url: string; title: string; description?: string }) => ({
@@ -429,8 +453,7 @@ export function ScrapePanel({
429
453
  return {
430
454
  ...prev,
431
455
  results: [...prev.results, ...fresh],
432
- totalResultsIsEstimate:
433
- data.totalResultsIsEstimate ?? prev.totalResultsIsEstimate,
456
+ totalResultsIsEstimate: data.totalResultsIsEstimate ?? prev.totalResultsIsEstimate,
434
457
  currentPage: data.currentPage ?? page,
435
458
  totalPages: data.totalPages ?? prev.totalPages,
436
459
  hasMore: data.hasMore ?? false,
@@ -444,7 +467,7 @@ export function ScrapePanel({
444
467
  page++;
445
468
  await new Promise((r) => setTimeout(r, 300));
446
469
  }
447
- toast.success("All available results gathered!");
470
+ toast.success('All available results gathered!');
448
471
  } catch (err) {
449
472
  toast.error(formatErrorMessage(err));
450
473
  } finally {
@@ -460,7 +483,7 @@ export function ScrapePanel({
460
483
  .filter((u) => /^https?:\/\//i.test(u));
461
484
 
462
485
  if (urls.length === 0) {
463
- toast.error("Enter at least one full URL starting with http(s)://");
486
+ toast.error('Enter at least one full URL starting with http(s)://');
464
487
  return;
465
488
  }
466
489
 
@@ -487,14 +510,14 @@ export function ScrapePanel({
487
510
  currentPage: 1,
488
511
  totalPages: 1,
489
512
  hasMore: false,
490
- query: "",
491
- searchProvider: "firecrawl",
513
+ query: '',
514
+ searchProvider: 'firecrawl',
492
515
  };
493
516
  });
494
517
 
495
518
  const newSelected = Object.fromEntries(urls.map((u) => [u, true]));
496
519
  setSelected((prev) => ({ ...prev, ...newSelected }));
497
- setManualUrl("");
520
+ setManualUrl('');
498
521
  }
499
522
 
500
523
  const handleFileUpload = (e: React.ChangeEvent<HTMLInputElement>) => {
@@ -504,17 +527,17 @@ export function ScrapePanel({
504
527
  reader.onload = (e) => {
505
528
  const text = e.target?.result as string;
506
529
  if (text) {
507
- setManualUrl((prev) => prev + (prev ? "\n" : "") + text);
530
+ setManualUrl((prev) => prev + (prev ? '\n' : '') + text);
508
531
  }
509
532
  };
510
533
  reader.readAsText(file);
511
- e.target.value = ""; // reset input
534
+ e.target.value = ''; // reset input
512
535
  };
513
536
 
514
537
  /** Open confirm modal before starting ETL */
515
538
  function handleStartClick() {
516
539
  if (selectedUrls.length === 0) {
517
- toast.error("Select at least one URL to scrape.");
540
+ toast.error('Select at least one URL to scrape.');
518
541
  return;
519
542
  }
520
543
  setConfirmOpen(true);
@@ -523,12 +546,11 @@ export function ScrapePanel({
523
546
  async function startJob() {
524
547
  setStarting(true);
525
548
  setConfirmOpen(false);
526
- // When "Specific URLs" is on, force page-level scrape (no crawl)
527
- const effectiveScope: CrawlScope = specificUrls ? "page" : scope;
549
+ const effectiveScope: CrawlScope = specificUrls ? 'page' : scope;
528
550
  try {
529
- const res = await fetch("/api/jobs", {
530
- method: "POST",
531
- headers: { "Content-Type": "application/json" },
551
+ const res = await fetch('/api/jobs', {
552
+ method: 'POST',
553
+ headers: { 'Content-Type': 'application/json' },
532
554
  body: JSON.stringify({
533
555
  keywords: query || selectedUrls[0],
534
556
  pageLimit: specificUrls ? 1 : pageLimit,
@@ -536,7 +558,7 @@ export function ScrapePanel({
536
558
  }),
537
559
  });
538
560
  const data = await res.json();
539
- if (!res.ok) throw new Error(data.error ?? "Could not start job");
561
+ if (!res.ok) throw new Error(data.error ?? 'Could not start job');
540
562
 
541
563
  const { totalPages, estimatedSeconds } = estimateEtlDuration(
542
564
  selectedUrls.length,
@@ -544,10 +566,14 @@ export function ScrapePanel({
544
566
  specificUrls ? 1 : pageLimit,
545
567
  );
546
568
 
547
- toast.success("ETL job started running in background", {
569
+ toast.success('Scraping started, running in background', {
548
570
  description: specificUrls
549
- ? `Scraping ${selectedUrls.length} specific URL(s) only no deep crawl. You can navigate away progress is tracked automatically.`
550
- : `${selectedUrls.length} ${effectiveScope === "domain" ? "domain(s)" : "page(s)"} · ~${totalPages} pages · ETA ${formatDuration(estimatedSeconds)}. You can navigate away — progress is tracked automatically.`,
571
+ ? `Scraping ${selectedUrls.length} specific URL(s) only, no deep crawl. You can navigate away. Progress is tracked automatically.`
572
+ : `${selectedUrls.length} ${
573
+ effectiveScope === 'domain' ? 'domain(s)' : 'page(s)'
574
+ } · ~${totalPages} pages · ETA ${formatDuration(
575
+ estimatedSeconds,
576
+ )}. You can navigate away. Progress is tracked automatically.`,
551
577
  duration: 8000,
552
578
  });
553
579
 
@@ -562,12 +588,10 @@ export function ScrapePanel({
562
588
 
563
589
  const results = searchState?.results ?? [];
564
590
  const gatherAllAvailable =
565
- searchState?.searchProvider === "serper" &&
566
- searchState.hasMore &&
567
- !gatheringAll;
591
+ searchState?.searchProvider !== 'firecrawl' && searchState?.hasMore && !gatheringAll;
568
592
 
569
593
  // Estimate for confirmation modal
570
- const effectiveScopeForEstimate: CrawlScope = specificUrls ? "page" : scope;
594
+ const effectiveScopeForEstimate: CrawlScope = specificUrls ? 'page' : scope;
571
595
  const estimate = useMemo(
572
596
  () =>
573
597
  estimateEtlDuration(
@@ -578,7 +602,7 @@ export function ScrapePanel({
578
602
  [selectedUrls.length, effectiveScopeForEstimate, specificUrls, pageLimit],
579
603
  );
580
604
 
581
- const [inputMode, setInputMode] = useState<"search" | "url">("search");
605
+ const [inputMode, setInputMode] = useState<'search' | 'url'>('search');
582
606
 
583
607
  return (
584
608
  <div className="space-y-4">
@@ -586,22 +610,23 @@ export function ScrapePanel({
586
610
  <div className="space-y-3">
587
611
  {/* Mode toggle + input */}
588
612
  <div className="flex items-center gap-2">
613
+ {crawlerControl}
589
614
  <Tabs
590
615
  value={inputMode}
591
- onValueChange={(v) => setInputMode(v as "search" | "url")}
616
+ onValueChange={(v) => setInputMode(v as 'search' | 'url')}
592
617
  className="shrink-0"
593
618
  >
594
- <TabsList className="inline-flex h-9 items-center justify-center rounded-lg bg-muted/40 border border-border p-0.5 text-muted-foreground">
619
+ <TabsList className="inline-flex bg-white/70 h-9 items-center justify-center rounded-lg border border-border p-0.5 text-muted-foreground">
595
620
  <TabsTrigger
596
621
  value="search"
597
- className="inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-xs font-medium transition-all focus-visible:outline-none data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm hover:text-foreground h-full"
622
+ className="inline-flex items-center h-9 justify-center whitespace-nowrap rounded-md px-3 py-1 text-xs font-medium transition-all focus-visible:outline-none data-[state=active]:bg-white data-[state=active]:text-foreground data-[state=active]: hover:text-foreground"
598
623
  >
599
624
  <Search className="size-3.5 mr-1.5" />
600
625
  Search
601
626
  </TabsTrigger>
602
627
  <TabsTrigger
603
628
  value="url"
604
- className="inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-xs font-medium transition-all focus-visible:outline-none data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm hover:text-foreground h-full"
629
+ className="inline-flex h-9 items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-xs font-medium transition-all focus-visible:outline-none data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]: hover:text-foreground"
605
630
  >
606
631
  <Globe className="size-3.5 mr-1.5" />
607
632
  Direct URL
@@ -611,30 +636,48 @@ export function ScrapePanel({
611
636
 
612
637
  {/* Input field */}
613
638
  <div className="relative flex-1">
614
- {inputMode === "search" ? (
639
+ {inputMode === 'search' ? (
615
640
  <>
641
+ <Search className="absolute left-3 top-1/2 -translate-y-1/2 size-4 text-muted-foreground z-10 pointer-events-none" />
616
642
  <Input
617
643
  ref={inputRef}
618
644
  id="kw"
645
+ autoComplete="off"
619
646
  placeholder='Search keywords, e.g. "RAG pipelines"'
620
647
  value={query}
621
648
  disabled={disabled}
649
+ className="pl-9 pr-22"
622
650
  onChange={(e) => {
623
651
  setQuery(e.target.value);
624
652
  setShowDropdown(true);
625
653
  }}
626
654
  onFocus={() => setShowDropdown(true)}
627
655
  onKeyDown={(e) => {
628
- if (e.key === "Enter") {
656
+ if (e.key === 'Enter') {
629
657
  setShowDropdown(false);
630
658
  runSearch();
631
659
  }
632
660
  }}
633
661
  />
662
+ {query.length > 0 && (
663
+ <Button
664
+ size="sm"
665
+ variant="secondary"
666
+ className="absolute right-1 top-1/2 -translate-y-1/2 h-8"
667
+ onClick={() => {
668
+ setShowDropdown(false);
669
+ runSearch();
670
+ }}
671
+ disabled={disabled || searching}
672
+ >
673
+ {searching ? <Loader2 className="size-3.5 animate-spin mr-1" /> : null}
674
+ Search
675
+ </Button>
676
+ )}
634
677
  {showDropdown && cachedQueries.length > 0 && (
635
678
  <div
636
679
  ref={dropdownRef}
637
- className="absolute z-10 top-full left-0 mt-1 w-full rounded-md border border-border bg-popover shadow-md overflow-hidden"
680
+ className="absolute z-10 top-full left-0 mt-1 w-full rounded-md border border-border bg-popover overflow-hidden"
638
681
  >
639
682
  <div className="py-1">
640
683
  {cachedQueries.map((cq) => (
@@ -663,18 +706,33 @@ export function ScrapePanel({
663
706
  )}
664
707
  </>
665
708
  ) : (
666
- <Input
667
- placeholder="Paste URLs (comma or space separated)"
668
- value={manualUrl}
669
- disabled={disabled}
670
- onChange={(e) => setManualUrl(e.target.value)}
671
- onKeyDown={(e) => e.key === "Enter" && addManual()}
672
- />
709
+ <>
710
+ <Globe className="absolute left-3 top-1/2 -translate-y-1/2 size-4 text-muted-foreground z-10 pointer-events-none" />
711
+ <Input
712
+ placeholder="Paste URLs (comma or space separated)"
713
+ value={manualUrl}
714
+ disabled={disabled}
715
+ className="pl-9 pr-16"
716
+ onChange={(e) => setManualUrl(e.target.value)}
717
+ onKeyDown={(e) => e.key === 'Enter' && addManual()}
718
+ />
719
+ {manualUrl.length > 0 && (
720
+ <Button
721
+ size="sm"
722
+ variant="secondary"
723
+ className="absolute right-1 top-1/2 -translate-y-1/2 h-8"
724
+ onClick={addManual}
725
+ disabled={disabled}
726
+ >
727
+ Add
728
+ </Button>
729
+ )}
730
+ </>
673
731
  )}
674
732
  </div>
675
733
 
676
734
  {/* Search limit (only in search mode) */}
677
- {inputMode === "search" && (
735
+ {inputMode === 'search' && (
678
736
  <Input
679
737
  type="number"
680
738
  min={1}
@@ -687,181 +745,168 @@ export function ScrapePanel({
687
745
  />
688
746
  )}
689
747
 
690
- {/* Action button */}
691
- {inputMode === "search" ? (
692
- <Button
693
- onClick={() => {
694
- setShowDropdown(false);
695
- runSearch();
696
- }}
697
- disabled={disabled || searching}
698
- className="shrink-0"
699
- >
700
- {searching ? (
701
- <Loader2 className="size-4 animate-spin" />
702
- ) : (
703
- <Search className="size-4" />
704
- )}
705
- Search
706
- </Button>
707
- ) : (
708
- <Button
709
- variant="outline"
710
- onClick={addManual}
711
- disabled={disabled}
712
- className="shrink-0"
713
- >
714
- <Plus className="size-4" />
715
- Add
716
- </Button>
717
- )}
748
+ {/* Start Scraping Button (always visible) */}
749
+ <Button
750
+ onClick={handleStartClick}
751
+ disabled={disabled || starting || selectedUrls.length === 0}
752
+ className="shrink-0"
753
+ >
754
+ {starting ? (
755
+ <Loader2 className="size-4 animate-spin mr-1" />
756
+ ) : (
757
+ <Rocket className="size-4 mr-2" />
758
+ )}
759
+ Start Scraping
760
+ {selectedUrls.length > 0 && (
761
+ <Badge variant="secondary" className="ml-1">
762
+ {selectedUrls.length}
763
+ </Badge>
764
+ )}
765
+ </Button>
718
766
  </div>
719
767
  </div>
720
768
 
721
769
  {/* No provider configured hint */}
722
- {firecrawlConfigured === false && serperConfigured === false && (
770
+ {firecrawlConfigured === false && !activeProvider && (
723
771
  <div className="flex items-start gap-2 rounded-md border border-border bg-muted/30 px-3 py-2.5 text-xs text-muted-foreground">
724
772
  <Info className="mt-0.5 size-3.5 shrink-0" />
725
773
  <span>
726
- <strong className="text-foreground">
727
- No search provider configured.
728
- </strong>{" "}
729
- Set up Firecrawl (recommended) for search and scraping, or add{" "}
730
- <code className="rounded bg-muted px-1 font-mono">
731
- SERPER_API_KEY
732
- </code>{" "}
733
- to your{" "}
734
- <code className="rounded bg-muted px-1 font-mono">.env</code> for
735
- Google search.
774
+ <strong className="text-foreground">No search provider configured.</strong> Set up
775
+ Firecrawl (recommended) for search and scraping, or configure a Web Search provider in
776
+ Settings.
736
777
  </span>
737
778
  </div>
738
779
  )}
739
780
 
740
- {/* Scope + launch — compact single row */}
741
- <div className="flex items-center gap-3 flex-wrap">
742
- <Select
743
- defaultValue={scope}
744
- value={scope}
745
- onValueChange={(v) => setScope(v as CrawlScope)}
746
- disabled={specificUrls || disabled}
781
+ {/* Minimal Action Row */}
782
+ <div className="flex items-center justify-between mt-2">
783
+ <button
784
+ type="button"
785
+ onClick={() => setShowAdvanced(!showAdvanced)}
786
+ className="flex items-center gap-1.5 text-xs text-muted-foreground hover:text-foreground transition-colors"
747
787
  >
748
- <SelectTrigger className="w-auto min-w-[180px] flex-1 bg-white h-9 text-xs">
749
- <SelectValue />
750
- </SelectTrigger>
751
- <SelectContent>
752
- <SelectItem value="page">Scrape pages only</SelectItem>
753
- <SelectItem value="domain">Crawl whole domain</SelectItem>
754
- </SelectContent>
755
- </Select>
756
-
757
- {scope === "domain" && !specificUrls && (
758
- <div className="flex items-center gap-1.5">
759
- <Label
760
- htmlFor="limit"
761
- className="text-xs text-muted-foreground whitespace-nowrap"
762
- >
763
- Max pages
764
- </Label>
765
- <Input
766
- id="limit"
767
- type="number"
768
- min={1}
769
- max={500}
770
- value={pageLimit}
771
- disabled={specificUrls || disabled}
772
- onChange={(e) => setPageLimit(Number(e.target.value) || 1)}
773
- className="w-20 h-9 tabular-nums"
774
- />
775
- </div>
788
+ {showAdvanced ? (
789
+ <ChevronDown className="size-3.5" />
790
+ ) : (
791
+ <ChevronsDown className="size-3.5" />
792
+ )}
793
+ {showAdvanced ? 'Hide advanced settings' : 'Advanced settings'}
794
+ </button>
795
+
796
+ {/* Estimation inline */}
797
+ {selectedUrls.length > 0 && (
798
+ <span className="text-xs text-muted-foreground flex items-center gap-1.5 ml-auto">
799
+ <Clock className="size-3" />
800
+ {specificUrls
801
+ ? `${selectedUrls.length} URL${selectedUrls.length !== 1 ? 's' : ''}`
802
+ : `~${estimate.totalPages.toLocaleString()} pages · ${formatDuration(
803
+ estimate.estimatedSeconds,
804
+ )}`}
805
+ </span>
776
806
  )}
807
+ </div>
777
808
 
778
- <div className="flex items-center gap-1.5">
779
- <Switch
780
- id="specific-urls-inline"
781
- checked={specificUrls}
782
- onCheckedChange={setSpecificUrls}
783
- disabled={disabled}
784
- size="sm"
785
- />
786
- <Label
787
- htmlFor="specific-urls-inline"
788
- className="text-xs font-medium cursor-pointer flex items-center gap-1"
789
- >
790
- Exact URLs
791
- <TooltipProvider delay={0}>
792
- <Tooltip>
793
- <TooltipTrigger
794
- type="button"
795
- className="text-muted-foreground hover:text-foreground"
796
- onClick={(e) => e.preventDefault()}
797
- >
798
- <Info className="size-3.5" />
799
- </TooltipTrigger>
800
- <TooltipContent>
801
- <p className="max-w-[200px] text-center">
802
- Scrape exact URLs only — no deep crawl or pagination.
803
- </p>
804
- </TooltipContent>
805
- </Tooltip>
806
- </TooltipProvider>
807
- </Label>
808
- </div>
809
+ {/* Advanced Settings Collapsible */}
810
+ {showAdvanced && (
811
+ <div className="flex flex-wrap items-center gap-4 rounded-lg border border-border bg-muted/30 p-3 mt-2 animate-in slide-in-from-top-2 fade-in duration-200">
812
+ <div className="flex items-center gap-2">
813
+ <Label className="text-xs text-muted-foreground">Scope</Label>
814
+ <Select
815
+ defaultValue={scope}
816
+ value={scope}
817
+ onValueChange={(v) => setScope(v as CrawlScope)}
818
+ disabled={specificUrls || disabled}
819
+ >
820
+ <SelectTrigger className="w-40 bg-white h-8 text-xs">
821
+ <SelectValue />
822
+ </SelectTrigger>
823
+ <SelectContent>
824
+ <SelectItem value="page">Scrape pages only</SelectItem>
825
+ <SelectItem value="domain">Crawl whole domain</SelectItem>
826
+ </SelectContent>
827
+ </Select>
828
+ </div>
809
829
 
810
- <div className="flex items-center gap-2 ml-auto">
811
- {/* ETL estimation inline */}
812
- {selectedUrls.length > 0 && (
813
- <span className="text-xs text-muted-foreground flex items-center gap-1.5">
814
- <Clock className="size-3" />
815
- {specificUrls
816
- ? `${selectedUrls.length} URL${selectedUrls.length !== 1 ? "s" : ""}`
817
- : `~${estimate.totalPages.toLocaleString()} pages · ${formatDuration(estimate.estimatedSeconds)}`}
818
- </span>
830
+ {scope === 'domain' && !specificUrls && (
831
+ <div className="flex items-center gap-2">
832
+ <Label htmlFor="limit" className="text-xs text-muted-foreground">
833
+ Max pages
834
+ </Label>
835
+ <Input
836
+ id="limit"
837
+ type="number"
838
+ min={1}
839
+ max={500}
840
+ value={pageLimit}
841
+ disabled={specificUrls || disabled}
842
+ onChange={(e) => setPageLimit(Number(e.target.value) || 1)}
843
+ className="w-20 h-8 tabular-nums text-xs"
844
+ />
845
+ </div>
819
846
  )}
820
847
 
821
- <Button
822
- onClick={handleStartClick}
823
- disabled={disabled || starting || selectedUrls.length === 0}
824
- className="shrink-0"
825
- >
826
- {starting ? (
827
- <Loader2 className="size-4 animate-spin" />
828
- ) : (
829
- <Rocket className="size-4" />
830
- )}
831
- Start ETL
832
- {selectedUrls.length > 0 && (
833
- <Badge variant="secondary" className="ml-1">
834
- {selectedUrls.length}
835
- </Badge>
836
- )}
837
- </Button>
848
+ <div className="flex items-center gap-2">
849
+ <Switch
850
+ id="specific-urls-inline"
851
+ checked={specificUrls}
852
+ onCheckedChange={setSpecificUrls}
853
+ disabled={disabled}
854
+ size="sm"
855
+ />
856
+ <Label
857
+ htmlFor="specific-urls-inline"
858
+ className="text-xs font-medium cursor-pointer flex items-center gap-1"
859
+ >
860
+ Exact URLs only
861
+ <TooltipProvider delay={0}>
862
+ <Tooltip>
863
+ <TooltipTrigger
864
+ type="button"
865
+ className="text-muted-foreground hover:text-foreground"
866
+ onClick={(e) => e.preventDefault()}
867
+ >
868
+ <Info className="size-3" />
869
+ </TooltipTrigger>
870
+ <TooltipContent>
871
+ <p className="max-w-50 text-center">
872
+ Scrape exact URLs only — no deep crawl or pagination.
873
+ </p>
874
+ </TooltipContent>
875
+ </Tooltip>
876
+ </TooltipProvider>
877
+ </Label>
878
+ </div>
838
879
  </div>
839
- </div>
880
+ )}
840
881
 
841
882
  {/* Results list */}
842
883
  {results.length > 0 && (
843
884
  <div className="rounded-lg border border-border">
844
885
  <div className="flex items-center justify-between border-b border-border px-3 py-2">
845
886
  <span className="text-xs font-medium text-muted-foreground">
846
- {results.length} source{results.length === 1 ? "" : "s"} ·{" "}
847
- {selectedUrls.length} selected
887
+ {results.length} source{results.length === 1 ? '' : 's'} · {selectedUrls.length}{' '}
888
+ selected
848
889
  </span>
849
- <button
850
- type="button"
851
- className="text-xs text-primary hover:underline"
852
- onClick={() => {
853
- const all = selectedUrls.length !== results.length;
854
- setSelected(
855
- all
856
- ? Object.fromEntries(results.map((r) => [r.url, true]))
857
- : {},
858
- );
859
- }}
860
- >
861
- {selectedUrls.length === results.length
862
- ? "Clear all"
863
- : "Select all"}
864
- </button>
890
+ <div className="flex items-center gap-4">
891
+ <button
892
+ type="button"
893
+ className="text-xs text-primary hover:underline"
894
+ onClick={() => {
895
+ const all = selectedUrls.length !== results.length;
896
+ setSelected(all ? Object.fromEntries(results.map((r) => [r.url, true])) : {});
897
+ }}
898
+ >
899
+ {selectedUrls.length === results.length ? 'Deselect all' : 'Select all'}
900
+ </button>
901
+ <button
902
+ type="button"
903
+ className="flex items-center gap-1 text-xs text-destructive hover:underline"
904
+ onClick={flushSearch}
905
+ >
906
+ <Trash2 className="size-3.5" />
907
+ Clear
908
+ </button>
909
+ </div>
865
910
  </div>
866
911
  <ul className="max-h-72 divide-y divide-border overflow-y-auto">
867
912
  {results.map((r) => {
@@ -870,21 +915,18 @@ export function ScrapePanel({
870
915
  <li key={r.url}>
871
916
  <label
872
917
  className={cn(
873
- "flex cursor-pointer items-start gap-3 px-3 py-2.5 transition-colors hover:bg-muted/50",
874
- checked && "bg-accent/50",
918
+ 'flex cursor-pointer items-start gap-3 px-3 py-2.5 transition-colors hover:bg-muted/50',
919
+ 'bg-white',
920
+ checked && 'bg-accent/50',
875
921
  )}
876
922
  >
877
923
  <Checkbox
878
924
  checked={checked}
879
- onCheckedChange={(v) =>
880
- setSelected((prev) => ({ ...prev, [r.url]: !!v }))
881
- }
925
+ onCheckedChange={(v) => setSelected((prev) => ({ ...prev, [r.url]: !!v }))}
882
926
  className="mt-0.5"
883
927
  />
884
928
  <span className="min-w-0 flex-1">
885
- <span className="block truncate text-sm font-medium">
886
- {r.title}
887
- </span>
929
+ <span className="block truncate text-sm font-medium">{r.title}</span>
888
930
  <span className="flex items-center gap-1 truncate text-xs text-muted-foreground">
889
931
  <Globe className="size-3 shrink-0" />
890
932
  {domainOf(r.url)}
@@ -902,7 +944,7 @@ export function ScrapePanel({
902
944
  </ul>
903
945
 
904
946
  {/* Pagination footer */}
905
- {searchState?.searchProvider === "serper" &&
947
+ {searchState?.searchProvider === 'serper' &&
906
948
  (searchState.hasMore || loadingMore || gatheringAll) && (
907
949
  <div className="flex items-center justify-between border-t border-border px-3 py-2">
908
950
  <span className="text-xs text-muted-foreground">
@@ -919,9 +961,7 @@ export function ScrapePanel({
919
961
  onClick={gatherAll}
920
962
  >
921
963
  <ChevronsDown className="size-3.5" />
922
- Gather all (
923
- {searchState.totalPages - searchState.currentPage} more
924
- pages)
964
+ Gather all ({searchState.totalPages - searchState.currentPage} more pages)
925
965
  </Button>
926
966
  )}
927
967
  <Button
@@ -929,9 +969,7 @@ export function ScrapePanel({
929
969
  variant="outline"
930
970
  className="h-7 gap-1 text-xs"
931
971
  onClick={loadNextPage}
932
- disabled={
933
- !searchState?.hasMore || loadingMore || gatheringAll
934
- }
972
+ disabled={!searchState?.hasMore || loadingMore || gatheringAll}
935
973
  >
936
974
  {loadingMore ? (
937
975
  <Loader2 className="size-3.5 animate-spin" />
@@ -950,13 +988,21 @@ export function ScrapePanel({
950
988
  <GenericAlert
951
989
  open={confirmOpen}
952
990
  onOpenChange={setConfirmOpen}
953
- title="Start ETL Job?"
991
+ title="Start Scraping?"
954
992
  description={
955
993
  specificUrls
956
- ? `This will scrape ${selectedUrls.length} specific URL${selectedUrls.length !== 1 ? "s" : ""} exactly as provided — no deep crawl or pagination.\n\nThe job will run in the background. You can navigate away and check progress anytime.`
957
- : `This will scrape ${selectedUrls.length} ${scope === "domain" ? "domain(s)" : "page(s)"}${scope === "domain" ? ` with up to ${pageLimit} pages each` : ""}.\n\n• Total pages: ~${estimate.totalPages.toLocaleString()}\n• Estimated time: ${formatDuration(estimate.estimatedSeconds)}\n\nThe job will run in the background. You can navigate away and check progress anytime.`
994
+ ? `This will scrape ${selectedUrls.length} specific URL${
995
+ selectedUrls.length !== 1 ? 's' : ''
996
+ } exactly as provided, no deep crawl or pagination.\n\nThe job will run in the background. You can navigate away and check progress anytime.`
997
+ : `This will scrape ${selectedUrls.length} ${
998
+ scope === 'domain' ? 'domain(s)' : 'page(s)'
999
+ }${
1000
+ scope === 'domain' ? ` with up to ${pageLimit} pages each` : ''
1001
+ }.\n\n• Total pages: ~${estimate.totalPages.toLocaleString()}\n• Estimated time: ${formatDuration(
1002
+ estimate.estimatedSeconds,
1003
+ )}\n\nThe job will run in the background. You can navigate away and check progress anytime.`
958
1004
  }
959
- actionText="Start ETL Job"
1005
+ actionText="Start Scraping"
960
1006
  onAction={startJob}
961
1007
  />
962
1008
  </div>