larkup 0.4.12 → 0.4.14

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 (959) hide show
  1. package/.next/standalone/apps/web/.next/BUILD_ID +1 -0
  2. package/.next/standalone/apps/web/.next/app-path-routes-manifest.json +94 -0
  3. package/.next/standalone/apps/web/.next/build-manifest.json +20 -0
  4. package/.next/standalone/apps/web/.next/diagnostics/build-diagnostics.json +6 -0
  5. package/.next/standalone/apps/web/.next/diagnostics/framework.json +1 -0
  6. package/.next/standalone/apps/web/.next/lock +0 -0
  7. package/.next/standalone/apps/web/.next/package.json +1 -0
  8. package/.next/standalone/apps/web/.next/prerender-manifest.json +241 -0
  9. package/.next/standalone/apps/web/.next/react-loadable-manifest.json +31 -0
  10. package/.next/standalone/apps/web/.next/required-server-files.json +399 -0
  11. package/.next/standalone/apps/web/.next/routes-manifest.json +644 -0
  12. package/.next/standalone/apps/web/.next/server/app/_global-error/page.js +31 -0
  13. package/.next/standalone/apps/web/.next/server/app/_global-error/page.js.nft.json +1 -0
  14. package/.next/standalone/apps/web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -0
  15. package/.next/standalone/apps/web/.next/server/app/_global-error.html +1 -0
  16. package/.next/standalone/apps/web/.next/server/app/_global-error.meta +35 -0
  17. package/.next/standalone/apps/web/.next/server/app/_global-error.rsc +15 -0
  18. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_full.segment.rsc +15 -0
  19. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +21 -0
  20. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -0
  21. package/.next/standalone/apps/web/.next/server/app/_not-found/page.js +1 -0
  22. package/.next/standalone/apps/web/.next/server/app/_not-found/page.js.nft.json +1 -0
  23. package/.next/standalone/apps/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
  24. package/.next/standalone/apps/web/.next/server/app/_not-found.html +1 -0
  25. package/.next/standalone/apps/web/.next/server/app/_not-found.meta +35 -0
  26. package/.next/standalone/apps/web/.next/server/app/_not-found.rsc +26 -0
  27. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_full.segment.rsc +26 -0
  28. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +32 -0
  29. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -0
  30. package/.next/standalone/apps/web/.next/server/app/add/page.js +1 -0
  31. package/.next/standalone/apps/web/.next/server/app/add/page.js.nft.json +1 -0
  32. package/.next/standalone/apps/web/.next/server/app/add/page_client-reference-manifest.js +1 -0
  33. package/.next/standalone/apps/web/.next/server/app/add.html +1 -0
  34. package/.next/standalone/apps/web/.next/server/app/add.meta +34 -0
  35. package/.next/standalone/apps/web/.next/server/app/add.rsc +27 -0
  36. package/.next/standalone/apps/web/.next/server/app/add.segments/_full.segment.rsc +27 -0
  37. package/.next/standalone/apps/web/.next/server/app/add.segments/_tree.segment.rsc +2 -0
  38. package/.next/standalone/apps/web/.next/server/app/add.segments/add/__PAGE__.segment.rsc +33 -0
  39. package/.next/standalone/apps/web/.next/server/app/api/analytics/route.js +1 -0
  40. package/.next/standalone/apps/web/.next/server/app/api/analytics/route.js.nft.json +1 -0
  41. package/.next/standalone/apps/web/.next/server/app/api/analytics/route_client-reference-manifest.js +1 -0
  42. package/.next/standalone/apps/web/.next/server/app/api/chat/feedback/route.js +1 -0
  43. package/.next/standalone/apps/web/.next/server/app/api/chat/feedback/route.js.nft.json +1 -0
  44. package/.next/standalone/apps/web/.next/server/app/api/chat/feedback/route_client-reference-manifest.js +1 -0
  45. package/.next/standalone/apps/web/.next/server/app/api/chat/route.js +111 -0
  46. package/.next/standalone/apps/web/.next/server/app/api/chat/route.js.nft.json +1 -0
  47. package/.next/standalone/apps/web/.next/server/app/api/chat/route_client-reference-manifest.js +1 -0
  48. package/.next/standalone/apps/web/.next/server/app/api/chat/status/route.js +1 -0
  49. package/.next/standalone/apps/web/.next/server/app/api/chat/status/route.js.nft.json +1 -0
  50. package/.next/standalone/apps/web/.next/server/app/api/chat/status/route_client-reference-manifest.js +1 -0
  51. package/.next/standalone/apps/web/.next/server/app/api/config/route.js +1 -0
  52. package/.next/standalone/apps/web/.next/server/app/api/config/route.js.nft.json +1 -0
  53. package/.next/standalone/apps/web/.next/server/app/api/config/route_client-reference-manifest.js +1 -0
  54. package/.next/standalone/apps/web/.next/server/app/api/config/test/route.js +1 -0
  55. package/.next/standalone/apps/web/.next/server/app/api/config/test/route.js.nft.json +1 -0
  56. package/.next/standalone/apps/web/.next/server/app/api/config/test/route_client-reference-manifest.js +1 -0
  57. package/.next/standalone/apps/web/.next/server/app/api/config/test-embedding/route.js +10 -0
  58. package/.next/standalone/apps/web/.next/server/app/api/config/test-embedding/route.js.nft.json +1 -0
  59. package/.next/standalone/apps/web/.next/server/app/api/config/test-embedding/route_client-reference-manifest.js +1 -0
  60. package/.next/standalone/apps/web/.next/server/app/api/config/test-llm/route.js +10 -0
  61. package/.next/standalone/apps/web/.next/server/app/api/config/test-llm/route.js.nft.json +1 -0
  62. package/.next/standalone/apps/web/.next/server/app/api/config/test-llm/route_client-reference-manifest.js +1 -0
  63. package/.next/standalone/apps/web/.next/server/app/api/config/test-provider/route.js +1 -0
  64. package/.next/standalone/apps/web/.next/server/app/api/config/test-provider/route.js.nft.json +1 -0
  65. package/.next/standalone/apps/web/.next/server/app/api/config/test-provider/route_client-reference-manifest.js +1 -0
  66. package/.next/standalone/apps/web/.next/server/app/api/config/verify/route.js +1 -0
  67. package/.next/standalone/apps/web/.next/server/app/api/config/verify/route.js.nft.json +1 -0
  68. package/.next/standalone/apps/web/.next/server/app/api/config/verify/route_client-reference-manifest.js +1 -0
  69. package/.next/standalone/apps/web/.next/server/app/api/connections/[channelId]/oauth/callback/route.js +1 -0
  70. package/.next/standalone/apps/web/.next/server/app/api/connections/[channelId]/oauth/callback/route.js.nft.json +1 -0
  71. package/.next/standalone/apps/web/.next/server/app/api/connections/[channelId]/oauth/callback/route_client-reference-manifest.js +1 -0
  72. package/.next/standalone/apps/web/.next/server/app/api/connections/[channelId]/oauth/start/route.js +1 -0
  73. package/.next/standalone/apps/web/.next/server/app/api/connections/[channelId]/oauth/start/route.js.nft.json +1 -0
  74. package/.next/standalone/apps/web/.next/server/app/api/connections/[channelId]/oauth/start/route_client-reference-manifest.js +1 -0
  75. package/.next/standalone/apps/web/.next/server/app/api/connections/[channelId]/route.js +1 -0
  76. package/.next/standalone/apps/web/.next/server/app/api/connections/[channelId]/route.js.nft.json +1 -0
  77. package/.next/standalone/apps/web/.next/server/app/api/connections/[channelId]/route_client-reference-manifest.js +1 -0
  78. package/.next/standalone/apps/web/.next/server/app/api/connections/route.js +1 -0
  79. package/.next/standalone/apps/web/.next/server/app/api/connections/route.js.nft.json +1 -0
  80. package/.next/standalone/apps/web/.next/server/app/api/connections/route_client-reference-manifest.js +1 -0
  81. package/.next/standalone/apps/web/.next/server/app/api/connections/tunnel/route.js +1 -0
  82. package/.next/standalone/apps/web/.next/server/app/api/connections/tunnel/route.js.nft.json +1 -0
  83. package/.next/standalone/apps/web/.next/server/app/api/connections/tunnel/route_client-reference-manifest.js +1 -0
  84. package/.next/standalone/apps/web/.next/server/app/api/demo/route.js +1 -0
  85. package/.next/standalone/apps/web/.next/server/app/api/demo/route.js.nft.json +1 -0
  86. package/.next/standalone/apps/web/.next/server/app/api/demo/route_client-reference-manifest.js +1 -0
  87. package/.next/standalone/apps/web/.next/server/app/api/deploy/ssh/route.js +5 -0
  88. package/.next/standalone/apps/web/.next/server/app/api/deploy/ssh/route.js.nft.json +1 -0
  89. package/.next/standalone/apps/web/.next/server/app/api/deploy/ssh/route_client-reference-manifest.js +1 -0
  90. package/.next/standalone/apps/web/.next/server/app/api/deploy/verify/route.js +1 -0
  91. package/.next/standalone/apps/web/.next/server/app/api/deploy/verify/route.js.nft.json +1 -0
  92. package/.next/standalone/apps/web/.next/server/app/api/deploy/verify/route_client-reference-manifest.js +1 -0
  93. package/.next/standalone/apps/web/.next/server/app/api/describe-image/route.js +1 -0
  94. package/.next/standalone/apps/web/.next/server/app/api/describe-image/route.js.nft.json +1 -0
  95. package/.next/standalone/apps/web/.next/server/app/api/describe-image/route_client-reference-manifest.js +1 -0
  96. package/.next/standalone/apps/web/.next/server/app/api/doc-editor/edit/route.js +1 -0
  97. package/.next/standalone/apps/web/.next/server/app/api/doc-editor/edit/route.js.nft.json +1 -0
  98. package/.next/standalone/apps/web/.next/server/app/api/doc-editor/edit/route_client-reference-manifest.js +1 -0
  99. package/.next/standalone/apps/web/.next/server/app/api/doc-editor/export/route.js +1 -0
  100. package/.next/standalone/apps/web/.next/server/app/api/doc-editor/export/route.js.nft.json +1 -0
  101. package/.next/standalone/apps/web/.next/server/app/api/doc-editor/export/route_client-reference-manifest.js +1 -0
  102. package/.next/standalone/apps/web/.next/server/app/api/doc-editor/extract-text/route.js +1 -0
  103. package/.next/standalone/apps/web/.next/server/app/api/doc-editor/extract-text/route.js.nft.json +1 -0
  104. package/.next/standalone/apps/web/.next/server/app/api/doc-editor/extract-text/route_client-reference-manifest.js +1 -0
  105. package/.next/standalone/apps/web/.next/server/app/api/doc-editor/parse/route.js +1 -0
  106. package/.next/standalone/apps/web/.next/server/app/api/doc-editor/parse/route.js.nft.json +1 -0
  107. package/.next/standalone/apps/web/.next/server/app/api/doc-editor/parse/route_client-reference-manifest.js +1 -0
  108. package/.next/standalone/apps/web/.next/server/app/api/doc-editor/restore/route.js +1 -0
  109. package/.next/standalone/apps/web/.next/server/app/api/doc-editor/restore/route.js.nft.json +1 -0
  110. package/.next/standalone/apps/web/.next/server/app/api/doc-editor/restore/route_client-reference-manifest.js +1 -0
  111. package/.next/standalone/apps/web/.next/server/app/api/document/sign/route.js +1 -0
  112. package/.next/standalone/apps/web/.next/server/app/api/document/sign/route.js.nft.json +1 -0
  113. package/.next/standalone/apps/web/.next/server/app/api/document/sign/route_client-reference-manifest.js +1 -0
  114. package/.next/standalone/apps/web/.next/server/app/api/documents/move/route.js +1 -0
  115. package/.next/standalone/apps/web/.next/server/app/api/documents/move/route.js.nft.json +1 -0
  116. package/.next/standalone/apps/web/.next/server/app/api/documents/move/route_client-reference-manifest.js +1 -0
  117. package/.next/standalone/apps/web/.next/server/app/api/documents/route.js +1 -0
  118. package/.next/standalone/apps/web/.next/server/app/api/documents/route.js.nft.json +1 -0
  119. package/.next/standalone/apps/web/.next/server/app/api/documents/route_client-reference-manifest.js +1 -0
  120. package/.next/standalone/apps/web/.next/server/app/api/files/remote/route.js +1 -0
  121. package/.next/standalone/apps/web/.next/server/app/api/files/remote/route.js.nft.json +1 -0
  122. package/.next/standalone/apps/web/.next/server/app/api/files/remote/route_client-reference-manifest.js +1 -0
  123. package/.next/standalone/apps/web/.next/server/app/api/firecrawl/local/route.js +1 -0
  124. package/.next/standalone/apps/web/.next/server/app/api/firecrawl/local/route.js.nft.json +1 -0
  125. package/.next/standalone/apps/web/.next/server/app/api/firecrawl/local/route_client-reference-manifest.js +1 -0
  126. package/.next/standalone/apps/web/.next/server/app/api/gpu-activity/route.js +1 -0
  127. package/.next/standalone/apps/web/.next/server/app/api/gpu-activity/route.js.nft.json +1 -0
  128. package/.next/standalone/apps/web/.next/server/app/api/gpu-activity/route_client-reference-manifest.js +1 -0
  129. package/.next/standalone/apps/web/.next/server/app/api/groups/route.js +1 -0
  130. package/.next/standalone/apps/web/.next/server/app/api/groups/route.js.nft.json +1 -0
  131. package/.next/standalone/apps/web/.next/server/app/api/groups/route_client-reference-manifest.js +1 -0
  132. package/.next/standalone/apps/web/.next/server/app/api/index/route.js +1 -0
  133. package/.next/standalone/apps/web/.next/server/app/api/index/route.js.nft.json +1 -0
  134. package/.next/standalone/apps/web/.next/server/app/api/index/route_client-reference-manifest.js +1 -0
  135. package/.next/standalone/apps/web/.next/server/app/api/integrations/[integration]/callback/route.js +4 -0
  136. package/.next/standalone/apps/web/.next/server/app/api/integrations/[integration]/callback/route.js.nft.json +1 -0
  137. package/.next/standalone/apps/web/.next/server/app/api/integrations/[integration]/callback/route_client-reference-manifest.js +1 -0
  138. package/.next/standalone/apps/web/.next/server/app/api/integrations/[integration]/route.js +1 -0
  139. package/.next/standalone/apps/web/.next/server/app/api/integrations/[integration]/route.js.nft.json +1 -0
  140. package/.next/standalone/apps/web/.next/server/app/api/integrations/[integration]/route_client-reference-manifest.js +1 -0
  141. package/.next/standalone/apps/web/.next/server/app/api/integrations/notion/callback/route.js +19 -0
  142. package/.next/standalone/apps/web/.next/server/app/api/integrations/notion/callback/route.js.nft.json +1 -0
  143. package/.next/standalone/apps/web/.next/server/app/api/integrations/notion/callback/route_client-reference-manifest.js +1 -0
  144. package/.next/standalone/apps/web/.next/server/app/api/integrations/notion/route.js +11 -0
  145. package/.next/standalone/apps/web/.next/server/app/api/integrations/notion/route.js.nft.json +1 -0
  146. package/.next/standalone/apps/web/.next/server/app/api/integrations/notion/route_client-reference-manifest.js +1 -0
  147. package/.next/standalone/apps/web/.next/server/app/api/integrations/route.js +1 -0
  148. package/.next/standalone/apps/web/.next/server/app/api/integrations/route.js.nft.json +1 -0
  149. package/.next/standalone/apps/web/.next/server/app/api/integrations/route_client-reference-manifest.js +1 -0
  150. package/.next/standalone/apps/web/.next/server/app/api/jobs/[id]/route.js +1 -0
  151. package/.next/standalone/apps/web/.next/server/app/api/jobs/[id]/route.js.nft.json +1 -0
  152. package/.next/standalone/apps/web/.next/server/app/api/jobs/[id]/route_client-reference-manifest.js +1 -0
  153. package/.next/standalone/apps/web/.next/server/app/api/jobs/route.js +1 -0
  154. package/.next/standalone/apps/web/.next/server/app/api/jobs/route.js.nft.json +1 -0
  155. package/.next/standalone/apps/web/.next/server/app/api/jobs/route_client-reference-manifest.js +1 -0
  156. package/.next/standalone/apps/web/.next/server/app/api/marketplace/[toolId]/route.js +1 -0
  157. package/.next/standalone/apps/web/.next/server/app/api/marketplace/[toolId]/route.js.nft.json +1 -0
  158. package/.next/standalone/apps/web/.next/server/app/api/marketplace/[toolId]/route_client-reference-manifest.js +1 -0
  159. package/.next/standalone/apps/web/.next/server/app/api/marketplace/route.js +1 -0
  160. package/.next/standalone/apps/web/.next/server/app/api/marketplace/route.js.nft.json +1 -0
  161. package/.next/standalone/apps/web/.next/server/app/api/marketplace/route_client-reference-manifest.js +1 -0
  162. package/.next/standalone/apps/web/.next/server/app/api/mcp/[connectionId]/route.js +1 -0
  163. package/.next/standalone/apps/web/.next/server/app/api/mcp/[connectionId]/route.js.nft.json +1 -0
  164. package/.next/standalone/apps/web/.next/server/app/api/mcp/[connectionId]/route_client-reference-manifest.js +1 -0
  165. package/.next/standalone/apps/web/.next/server/app/api/mcp/[connectionId]/test/route.js +1 -0
  166. package/.next/standalone/apps/web/.next/server/app/api/mcp/[connectionId]/test/route.js.nft.json +1 -0
  167. package/.next/standalone/apps/web/.next/server/app/api/mcp/[connectionId]/test/route_client-reference-manifest.js +1 -0
  168. package/.next/standalone/apps/web/.next/server/app/api/mcp/route.js +1 -0
  169. package/.next/standalone/apps/web/.next/server/app/api/mcp/route.js.nft.json +1 -0
  170. package/.next/standalone/apps/web/.next/server/app/api/mcp/route_client-reference-manifest.js +1 -0
  171. package/.next/standalone/apps/web/.next/server/app/api/media/[id]/frame/route.js +1 -0
  172. package/.next/standalone/apps/web/.next/server/app/api/media/[id]/frame/route.js.nft.json +1 -0
  173. package/.next/standalone/apps/web/.next/server/app/api/media/[id]/frame/route_client-reference-manifest.js +1 -0
  174. package/.next/standalone/apps/web/.next/server/app/api/media/[id]/route.js +1 -0
  175. package/.next/standalone/apps/web/.next/server/app/api/media/[id]/route.js.nft.json +1 -0
  176. package/.next/standalone/apps/web/.next/server/app/api/media/[id]/route_client-reference-manifest.js +1 -0
  177. package/.next/standalone/apps/web/.next/server/app/api/media/inspect/route.js +1 -0
  178. package/.next/standalone/apps/web/.next/server/app/api/media/inspect/route.js.nft.json +1 -0
  179. package/.next/standalone/apps/web/.next/server/app/api/media/inspect/route_client-reference-manifest.js +1 -0
  180. package/.next/standalone/apps/web/.next/server/app/api/media/jobs/[id]/approval/route.js +1 -0
  181. package/.next/standalone/apps/web/.next/server/app/api/media/jobs/[id]/approval/route.js.nft.json +1 -0
  182. package/.next/standalone/apps/web/.next/server/app/api/media/jobs/[id]/approval/route_client-reference-manifest.js +1 -0
  183. package/.next/standalone/apps/web/.next/server/app/api/media/jobs/[id]/route.js +1 -0
  184. package/.next/standalone/apps/web/.next/server/app/api/media/jobs/[id]/route.js.nft.json +1 -0
  185. package/.next/standalone/apps/web/.next/server/app/api/media/jobs/[id]/route_client-reference-manifest.js +1 -0
  186. package/.next/standalone/apps/web/.next/server/app/api/media/process/route.js +2 -0
  187. package/.next/standalone/apps/web/.next/server/app/api/media/process/route.js.nft.json +1 -0
  188. package/.next/standalone/apps/web/.next/server/app/api/media/process/route_client-reference-manifest.js +1 -0
  189. package/.next/standalone/apps/web/.next/server/app/api/media/route.js +1 -0
  190. package/.next/standalone/apps/web/.next/server/app/api/media/route.js.nft.json +1 -0
  191. package/.next/standalone/apps/web/.next/server/app/api/media/route_client-reference-manifest.js +1 -0
  192. package/.next/standalone/apps/web/.next/server/app/api/media/stream/route.js +5 -0
  193. package/.next/standalone/apps/web/.next/server/app/api/media/stream/route.js.nft.json +1 -0
  194. package/.next/standalone/apps/web/.next/server/app/api/media/stream/route_client-reference-manifest.js +1 -0
  195. package/.next/standalone/apps/web/.next/server/app/api/models/route.js +1 -0
  196. package/.next/standalone/apps/web/.next/server/app/api/models/route.js.nft.json +1 -0
  197. package/.next/standalone/apps/web/.next/server/app/api/models/route_client-reference-manifest.js +1 -0
  198. package/.next/standalone/apps/web/.next/server/app/api/parse-file/route.js +1 -0
  199. package/.next/standalone/apps/web/.next/server/app/api/parse-file/route.js.nft.json +1 -0
  200. package/.next/standalone/apps/web/.next/server/app/api/parse-file/route_client-reference-manifest.js +1 -0
  201. package/.next/standalone/apps/web/.next/server/app/api/pdf-page/route.js +1 -0
  202. package/.next/standalone/apps/web/.next/server/app/api/pdf-page/route.js.nft.json +1 -0
  203. package/.next/standalone/apps/web/.next/server/app/api/pdf-page/route_client-reference-manifest.js +1 -0
  204. package/.next/standalone/apps/web/.next/server/app/api/projects/deployments/route.js +1 -0
  205. package/.next/standalone/apps/web/.next/server/app/api/projects/deployments/route.js.nft.json +1 -0
  206. package/.next/standalone/apps/web/.next/server/app/api/projects/deployments/route_client-reference-manifest.js +1 -0
  207. package/.next/standalone/apps/web/.next/server/app/api/projects/route.js +1 -0
  208. package/.next/standalone/apps/web/.next/server/app/api/projects/route.js.nft.json +1 -0
  209. package/.next/standalone/apps/web/.next/server/app/api/projects/route_client-reference-manifest.js +1 -0
  210. package/.next/standalone/apps/web/.next/server/app/api/projects/runtime/route.js +1 -0
  211. package/.next/standalone/apps/web/.next/server/app/api/projects/runtime/route.js.nft.json +1 -0
  212. package/.next/standalone/apps/web/.next/server/app/api/projects/runtime/route_client-reference-manifest.js +1 -0
  213. package/.next/standalone/apps/web/.next/server/app/api/proxy/verify/route.js +1 -0
  214. package/.next/standalone/apps/web/.next/server/app/api/proxy/verify/route.js.nft.json +1 -0
  215. package/.next/standalone/apps/web/.next/server/app/api/proxy/verify/route_client-reference-manifest.js +1 -0
  216. package/.next/standalone/apps/web/.next/server/app/api/sandbox/route.js +1 -0
  217. package/.next/standalone/apps/web/.next/server/app/api/sandbox/route.js.nft.json +1 -0
  218. package/.next/standalone/apps/web/.next/server/app/api/sandbox/route_client-reference-manifest.js +1 -0
  219. package/.next/standalone/apps/web/.next/server/app/api/sandbox/verify/route.js +1 -0
  220. package/.next/standalone/apps/web/.next/server/app/api/sandbox/verify/route.js.nft.json +1 -0
  221. package/.next/standalone/apps/web/.next/server/app/api/sandbox/verify/route_client-reference-manifest.js +1 -0
  222. package/.next/standalone/apps/web/.next/server/app/api/search/bing/route.js +1 -0
  223. package/.next/standalone/apps/web/.next/server/app/api/search/bing/route.js.nft.json +1 -0
  224. package/.next/standalone/apps/web/.next/server/app/api/search/bing/route_client-reference-manifest.js +1 -0
  225. package/.next/standalone/apps/web/.next/server/app/api/search/brave/route.js +1 -0
  226. package/.next/standalone/apps/web/.next/server/app/api/search/brave/route.js.nft.json +1 -0
  227. package/.next/standalone/apps/web/.next/server/app/api/search/brave/route_client-reference-manifest.js +1 -0
  228. package/.next/standalone/apps/web/.next/server/app/api/search/exa/route.js +1 -0
  229. package/.next/standalone/apps/web/.next/server/app/api/search/exa/route.js.nft.json +1 -0
  230. package/.next/standalone/apps/web/.next/server/app/api/search/exa/route_client-reference-manifest.js +1 -0
  231. package/.next/standalone/apps/web/.next/server/app/api/search/google/route.js +1 -0
  232. package/.next/standalone/apps/web/.next/server/app/api/search/google/route.js.nft.json +1 -0
  233. package/.next/standalone/apps/web/.next/server/app/api/search/google/route_client-reference-manifest.js +1 -0
  234. package/.next/standalone/apps/web/.next/server/app/api/search/route.js +1 -0
  235. package/.next/standalone/apps/web/.next/server/app/api/search/route.js.nft.json +1 -0
  236. package/.next/standalone/apps/web/.next/server/app/api/search/route_client-reference-manifest.js +1 -0
  237. package/.next/standalone/apps/web/.next/server/app/api/search/tavily/route.js +1 -0
  238. package/.next/standalone/apps/web/.next/server/app/api/search/tavily/route.js.nft.json +1 -0
  239. package/.next/standalone/apps/web/.next/server/app/api/search/tavily/route_client-reference-manifest.js +1 -0
  240. package/.next/standalone/apps/web/.next/server/app/api/search/verify/route.js +1 -0
  241. package/.next/standalone/apps/web/.next/server/app/api/search/verify/route.js.nft.json +1 -0
  242. package/.next/standalone/apps/web/.next/server/app/api/search/verify/route_client-reference-manifest.js +1 -0
  243. package/.next/standalone/apps/web/.next/server/app/api/system/cache/route.js +2 -0
  244. package/.next/standalone/apps/web/.next/server/app/api/system/cache/route.js.nft.json +1 -0
  245. package/.next/standalone/apps/web/.next/server/app/api/system/cache/route_client-reference-manifest.js +1 -0
  246. package/.next/standalone/apps/web/.next/server/app/api/tabular/query/route.js +1 -0
  247. package/.next/standalone/apps/web/.next/server/app/api/tabular/query/route.js.nft.json +1 -0
  248. package/.next/standalone/apps/web/.next/server/app/api/tabular/query/route_client-reference-manifest.js +1 -0
  249. package/.next/standalone/apps/web/.next/server/app/api/tabular/route.js +1 -0
  250. package/.next/standalone/apps/web/.next/server/app/api/tabular/route.js.nft.json +1 -0
  251. package/.next/standalone/apps/web/.next/server/app/api/tabular/route_client-reference-manifest.js +1 -0
  252. package/.next/standalone/apps/web/.next/server/app/api/tools/[toolId]/host/route.js +1 -0
  253. package/.next/standalone/apps/web/.next/server/app/api/tools/[toolId]/host/route.js.nft.json +1 -0
  254. package/.next/standalone/apps/web/.next/server/app/api/tools/[toolId]/host/route_client-reference-manifest.js +1 -0
  255. package/.next/standalone/apps/web/.next/server/app/api/tools/[toolId]/runtime/route.js +1 -0
  256. package/.next/standalone/apps/web/.next/server/app/api/tools/[toolId]/runtime/route.js.nft.json +1 -0
  257. package/.next/standalone/apps/web/.next/server/app/api/tools/[toolId]/runtime/route_client-reference-manifest.js +1 -0
  258. package/.next/standalone/apps/web/.next/server/app/api/tools/[toolId]/usage/route.js +1 -0
  259. package/.next/standalone/apps/web/.next/server/app/api/tools/[toolId]/usage/route.js.nft.json +1 -0
  260. package/.next/standalone/apps/web/.next/server/app/api/tools/[toolId]/usage/route_client-reference-manifest.js +1 -0
  261. package/.next/standalone/apps/web/.next/server/app/api/tools/[toolId]/usage-request/route.js +1 -0
  262. package/.next/standalone/apps/web/.next/server/app/api/tools/[toolId]/usage-request/route.js.nft.json +1 -0
  263. package/.next/standalone/apps/web/.next/server/app/api/tools/[toolId]/usage-request/route_client-reference-manifest.js +1 -0
  264. package/.next/standalone/apps/web/.next/server/app/api/tools/[toolId]/verify/route.js +1 -0
  265. package/.next/standalone/apps/web/.next/server/app/api/tools/[toolId]/verify/route.js.nft.json +1 -0
  266. package/.next/standalone/apps/web/.next/server/app/api/tools/[toolId]/verify/route_client-reference-manifest.js +1 -0
  267. package/.next/standalone/apps/web/.next/server/app/api/tools/video-intelligence/connection/route.js +1 -0
  268. package/.next/standalone/apps/web/.next/server/app/api/tools/video-intelligence/connection/route.js.nft.json +1 -0
  269. package/.next/standalone/apps/web/.next/server/app/api/tools/video-intelligence/connection/route_client-reference-manifest.js +1 -0
  270. package/.next/standalone/apps/web/.next/server/app/api/tools/video-intelligence/usage/route.js +1 -0
  271. package/.next/standalone/apps/web/.next/server/app/api/tools/video-intelligence/usage/route.js.nft.json +1 -0
  272. package/.next/standalone/apps/web/.next/server/app/api/tools/video-intelligence/usage/route_client-reference-manifest.js +1 -0
  273. package/.next/standalone/apps/web/.next/server/app/api/tools/video-intelligence/usage-request/route.js +1 -0
  274. package/.next/standalone/apps/web/.next/server/app/api/tools/video-intelligence/usage-request/route.js.nft.json +1 -0
  275. package/.next/standalone/apps/web/.next/server/app/api/tools/video-intelligence/usage-request/route_client-reference-manifest.js +1 -0
  276. package/.next/standalone/apps/web/.next/server/app/api/upload-file/route.js +1 -0
  277. package/.next/standalone/apps/web/.next/server/app/api/upload-file/route.js.nft.json +1 -0
  278. package/.next/standalone/apps/web/.next/server/app/api/upload-file/route_client-reference-manifest.js +1 -0
  279. package/.next/standalone/apps/web/.next/server/app/api/uploads/[...slug]/route.js +1 -0
  280. package/.next/standalone/apps/web/.next/server/app/api/uploads/[...slug]/route.js.nft.json +1 -0
  281. package/.next/standalone/apps/web/.next/server/app/api/uploads/[...slug]/route_client-reference-manifest.js +1 -0
  282. package/.next/standalone/apps/web/.next/server/app/api/vector-stores/install/route.js +1 -0
  283. package/.next/standalone/apps/web/.next/server/app/api/vector-stores/install/route.js.nft.json +1 -0
  284. package/.next/standalone/apps/web/.next/server/app/api/vector-stores/install/route_client-reference-manifest.js +1 -0
  285. package/.next/standalone/apps/web/.next/server/app/api/vector-stores/status/route.js +1 -0
  286. package/.next/standalone/apps/web/.next/server/app/api/vector-stores/status/route.js.nft.json +1 -0
  287. package/.next/standalone/apps/web/.next/server/app/api/vector-stores/status/route_client-reference-manifest.js +1 -0
  288. package/.next/standalone/apps/web/.next/server/app/chat/[id]/page.js +1 -0
  289. package/.next/standalone/apps/web/.next/server/app/chat/[id]/page.js.nft.json +1 -0
  290. package/.next/standalone/apps/web/.next/server/app/chat/[id]/page_client-reference-manifest.js +1 -0
  291. package/.next/standalone/apps/web/.next/server/app/chat/page.js +1 -0
  292. package/.next/standalone/apps/web/.next/server/app/chat/page.js.nft.json +1 -0
  293. package/.next/standalone/apps/web/.next/server/app/chat/page_client-reference-manifest.js +1 -0
  294. package/.next/standalone/apps/web/.next/server/app/chat.html +1 -0
  295. package/.next/standalone/apps/web/.next/server/app/chat.meta +34 -0
  296. package/.next/standalone/apps/web/.next/server/app/chat.rsc +28 -0
  297. package/.next/standalone/apps/web/.next/server/app/chat.segments/_full.segment.rsc +28 -0
  298. package/.next/standalone/apps/web/.next/server/app/chat.segments/_tree.segment.rsc +3 -0
  299. package/.next/standalone/apps/web/.next/server/app/chat.segments/chat/__PAGE__.segment.rsc +34 -0
  300. package/.next/standalone/apps/web/.next/server/app/data/page.js +1 -0
  301. package/.next/standalone/apps/web/.next/server/app/data/page.js.nft.json +1 -0
  302. package/.next/standalone/apps/web/.next/server/app/data/page_client-reference-manifest.js +1 -0
  303. package/.next/standalone/apps/web/.next/server/app/data.html +1 -0
  304. package/.next/standalone/apps/web/.next/server/app/data.meta +34 -0
  305. package/.next/standalone/apps/web/.next/server/app/data.rsc +27 -0
  306. package/.next/standalone/apps/web/.next/server/app/data.segments/_full.segment.rsc +27 -0
  307. package/.next/standalone/apps/web/.next/server/app/data.segments/_tree.segment.rsc +2 -0
  308. package/.next/standalone/apps/web/.next/server/app/data.segments/data/__PAGE__.segment.rsc +33 -0
  309. package/.next/standalone/apps/web/.next/server/app/favicon.ico/route.js +1 -0
  310. package/.next/standalone/apps/web/.next/server/app/favicon.ico/route.js.nft.json +1 -0
  311. package/.next/standalone/apps/web/.next/server/app/favicon.ico.body +0 -0
  312. package/.next/standalone/apps/web/.next/server/app/favicon.ico.meta +1 -0
  313. package/.next/standalone/apps/web/.next/server/app/index.html +1 -0
  314. package/.next/standalone/apps/web/.next/server/app/index.meta +29 -0
  315. package/.next/standalone/apps/web/.next/server/app/index.rsc +25 -0
  316. package/.next/standalone/apps/web/.next/server/app/index.segments/__PAGE__.segment.rsc +30 -0
  317. package/.next/standalone/apps/web/.next/server/app/index.segments/_full.segment.rsc +25 -0
  318. package/.next/standalone/apps/web/.next/server/app/index.segments/_tree.segment.rsc +2 -0
  319. package/.next/standalone/apps/web/.next/server/app/page.js +1 -0
  320. package/.next/standalone/apps/web/.next/server/app/page.js.nft.json +1 -0
  321. package/.next/standalone/apps/web/.next/server/app/page_client-reference-manifest.js +1 -0
  322. package/.next/standalone/apps/web/.next/server/app/settings/page.js +216 -0
  323. package/.next/standalone/apps/web/.next/server/app/settings/page.js.nft.json +1 -0
  324. package/.next/standalone/apps/web/.next/server/app/settings/page_client-reference-manifest.js +1 -0
  325. package/.next/standalone/apps/web/.next/server/app/settings.html +1 -0
  326. package/.next/standalone/apps/web/.next/server/app/settings.meta +34 -0
  327. package/.next/standalone/apps/web/.next/server/app/settings.rsc +30 -0
  328. package/.next/standalone/apps/web/.next/server/app/settings.segments/_full.segment.rsc +30 -0
  329. package/.next/standalone/apps/web/.next/server/app/settings.segments/_tree.segment.rsc +2 -0
  330. package/.next/standalone/apps/web/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +36 -0
  331. package/.next/standalone/apps/web/.next/server/app-paths-manifest.json +94 -0
  332. package/.next/standalone/apps/web/.next/server/chunks/101.js +24 -0
  333. package/.next/standalone/apps/web/.next/server/chunks/1149.js +1 -0
  334. package/.next/standalone/apps/web/.next/server/chunks/1309.js +1 -0
  335. package/.next/standalone/apps/web/.next/server/chunks/1389.js +5 -0
  336. package/.next/standalone/apps/web/.next/server/chunks/1479.js +1 -0
  337. package/.next/standalone/apps/web/.next/server/chunks/1602.js +1 -0
  338. package/.next/standalone/apps/web/.next/server/chunks/1778.js +1 -0
  339. package/.next/standalone/apps/web/.next/server/chunks/1810.js +1 -0
  340. package/.next/standalone/apps/web/.next/server/chunks/1953.js +1 -0
  341. package/.next/standalone/apps/web/.next/server/chunks/1999.js +6 -0
  342. package/.next/standalone/apps/web/.next/server/chunks/2097.js +1 -0
  343. package/.next/standalone/apps/web/.next/server/chunks/2129.js +47 -0
  344. package/.next/standalone/apps/web/.next/server/chunks/2411.js +193 -0
  345. package/.next/standalone/apps/web/.next/server/chunks/2500.js +1 -0
  346. package/.next/standalone/apps/web/.next/server/chunks/2552.js +1 -0
  347. package/.next/standalone/apps/web/.next/server/chunks/2595.js +45 -0
  348. package/.next/standalone/apps/web/.next/server/chunks/2883.js +1 -0
  349. package/.next/standalone/apps/web/.next/server/chunks/2918.js +212 -0
  350. package/.next/standalone/apps/web/.next/server/chunks/309.js +2 -0
  351. package/.next/standalone/apps/web/.next/server/chunks/3122.js +1 -0
  352. package/.next/standalone/apps/web/.next/server/chunks/3257.js +1 -0
  353. package/.next/standalone/apps/web/.next/server/chunks/3287.js +1 -0
  354. package/.next/standalone/apps/web/.next/server/chunks/3304.js +1 -0
  355. package/.next/standalone/apps/web/.next/server/chunks/340.js +1 -0
  356. package/.next/standalone/apps/web/.next/server/chunks/3545.js +6 -0
  357. package/.next/standalone/apps/web/.next/server/chunks/3577.js +27 -0
  358. package/.next/standalone/apps/web/.next/server/chunks/3609.js +1 -0
  359. package/.next/standalone/apps/web/.next/server/chunks/364.js +36 -0
  360. package/.next/standalone/apps/web/.next/server/chunks/3642.js +1 -0
  361. package/.next/standalone/apps/web/.next/server/chunks/365.js +1 -0
  362. package/.next/standalone/apps/web/.next/server/chunks/4292.js +1 -0
  363. package/.next/standalone/apps/web/.next/server/chunks/4327.js +1 -0
  364. package/.next/standalone/apps/web/.next/server/chunks/4375.js +1 -0
  365. package/.next/standalone/apps/web/.next/server/chunks/4441.js +1 -0
  366. package/.next/standalone/apps/web/.next/server/chunks/4915.js +1 -0
  367. package/.next/standalone/apps/web/.next/server/chunks/5072.js +47 -0
  368. package/.next/standalone/apps/web/.next/server/chunks/5078.js +1 -0
  369. package/.next/standalone/apps/web/.next/server/chunks/5523.js +10 -0
  370. package/.next/standalone/apps/web/.next/server/chunks/5701.js +1 -0
  371. package/.next/standalone/apps/web/.next/server/chunks/5760.js +11 -0
  372. package/.next/standalone/apps/web/.next/server/chunks/5770.js +1 -0
  373. package/.next/standalone/apps/web/.next/server/chunks/588.js +1 -0
  374. package/.next/standalone/apps/web/.next/server/chunks/5884.js +1 -0
  375. package/.next/standalone/apps/web/.next/server/chunks/5937.js +1 -0
  376. package/.next/standalone/apps/web/.next/server/chunks/5995.js +1 -0
  377. package/.next/standalone/apps/web/.next/server/chunks/600.js +1 -0
  378. package/.next/standalone/apps/web/.next/server/chunks/6014.js +1 -0
  379. package/.next/standalone/apps/web/.next/server/chunks/6066.js +1 -0
  380. package/.next/standalone/apps/web/.next/server/chunks/6149.js +1 -0
  381. package/.next/standalone/apps/web/.next/server/chunks/6199.js +1 -0
  382. package/.next/standalone/apps/web/.next/server/chunks/620.js +78 -0
  383. package/.next/standalone/apps/web/.next/server/chunks/6207.js +14 -0
  384. package/.next/standalone/apps/web/.next/server/chunks/63.js +1 -0
  385. package/.next/standalone/apps/web/.next/server/chunks/6457.js +2 -0
  386. package/.next/standalone/apps/web/.next/server/chunks/6479.js +35 -0
  387. package/.next/standalone/apps/web/.next/server/chunks/657.js +84 -0
  388. package/.next/standalone/apps/web/.next/server/chunks/6573.js +1 -0
  389. package/.next/standalone/apps/web/.next/server/chunks/6814.js +18 -0
  390. package/.next/standalone/apps/web/.next/server/chunks/6909.js +1 -0
  391. package/.next/standalone/apps/web/.next/server/chunks/7010.js +1 -0
  392. package/.next/standalone/apps/web/.next/server/chunks/7289.js +1 -0
  393. package/.next/standalone/apps/web/.next/server/chunks/7324.js +1 -0
  394. package/.next/standalone/apps/web/.next/server/chunks/741.js +1 -0
  395. package/.next/standalone/apps/web/.next/server/chunks/7448.js +165 -0
  396. package/.next/standalone/apps/web/.next/server/chunks/7459.js +1 -0
  397. package/.next/standalone/apps/web/.next/server/chunks/7613.js +1 -0
  398. package/.next/standalone/apps/web/.next/server/chunks/7945.js +1 -0
  399. package/.next/standalone/apps/web/.next/server/chunks/7974.js +20 -0
  400. package/.next/standalone/apps/web/.next/server/chunks/8005.js +41 -0
  401. package/.next/standalone/apps/web/.next/server/chunks/8052.js +55 -0
  402. package/.next/standalone/apps/web/.next/server/chunks/8169.js +1 -0
  403. package/.next/standalone/apps/web/.next/server/chunks/8299.js +2 -0
  404. package/.next/standalone/apps/web/.next/server/chunks/8358.js +1 -0
  405. package/.next/standalone/apps/web/.next/server/chunks/843.js +1 -0
  406. package/.next/standalone/apps/web/.next/server/chunks/8437.js +12 -0
  407. package/.next/standalone/apps/web/.next/server/chunks/8840.js +1 -0
  408. package/.next/standalone/apps/web/.next/server/chunks/8952.js +1859 -0
  409. package/.next/standalone/apps/web/.next/server/chunks/9016.js +1 -0
  410. package/.next/standalone/apps/web/.next/server/chunks/9028.js +1 -0
  411. package/.next/standalone/apps/web/.next/server/chunks/9077.js +1 -0
  412. package/.next/standalone/apps/web/.next/server/chunks/915.js +1 -0
  413. package/.next/standalone/apps/web/.next/server/chunks/9248.js +256 -0
  414. package/.next/standalone/apps/web/.next/server/chunks/9301.js +1 -0
  415. package/.next/standalone/apps/web/.next/server/chunks/9319.js +1 -0
  416. package/.next/standalone/apps/web/.next/server/chunks/9439.js +24 -0
  417. package/.next/standalone/apps/web/.next/server/chunks/9480.js +1 -0
  418. package/.next/standalone/apps/web/.next/server/chunks/9579.js +1 -0
  419. package/.next/standalone/apps/web/.next/server/chunks/9768.js +4 -0
  420. package/.next/standalone/apps/web/.next/server/chunks/9837.js +121 -0
  421. package/.next/standalone/apps/web/.next/server/chunks/9851.js +1 -0
  422. package/.next/standalone/apps/web/.next/server/chunks/static/media/pdf.worker.min.63b810cd.mjs +6 -0
  423. package/.next/standalone/apps/web/.next/server/functions-config-manifest.json +82 -0
  424. package/.next/standalone/apps/web/.next/server/middleware-build-manifest.js +1 -0
  425. package/.next/standalone/apps/web/.next/server/middleware-manifest.json +6 -0
  426. package/.next/standalone/apps/web/.next/server/middleware-react-loadable-manifest.js +1 -0
  427. package/.next/standalone/apps/web/.next/server/next-font-manifest.js +1 -0
  428. package/.next/standalone/apps/web/.next/server/next-font-manifest.json +1 -0
  429. package/.next/standalone/apps/web/.next/server/pages/404.html +1 -0
  430. package/.next/standalone/apps/web/.next/server/pages/500.html +1 -0
  431. package/.next/standalone/apps/web/.next/server/pages-manifest.json +4 -0
  432. package/.next/standalone/apps/web/.next/server/prefetch-hints.json +95 -0
  433. package/.next/standalone/apps/web/.next/server/server-reference-manifest.js +1 -0
  434. package/.next/standalone/apps/web/.next/server/server-reference-manifest.json +1 -0
  435. package/.next/standalone/apps/web/.next/server/webpack-runtime.js +1 -0
  436. package/.next/standalone/apps/web/.next/static/chunks/0ed6b8a9-7f39ffa51cd4d7d3.js +1 -0
  437. package/.next/standalone/apps/web/.next/static/chunks/1788-3ec11e3d6d6986e9.js +1 -0
  438. package/.next/standalone/apps/web/.next/static/chunks/1986-2eb6c09f2f556e84.js +1 -0
  439. package/.next/standalone/apps/web/.next/static/chunks/2038-1dc8a3028545edab.js +1 -0
  440. package/.next/standalone/apps/web/.next/static/chunks/217c94bb-b2b832568a17950f.js +1 -0
  441. package/.next/standalone/apps/web/.next/static/chunks/227-7f3dac471f0eb3b0.js +1 -0
  442. package/.next/standalone/apps/web/.next/static/chunks/2634.803b324122bd1d49.js +1 -0
  443. package/.next/standalone/apps/web/.next/static/chunks/2928-8a2d9ed34f45623a.js +1 -0
  444. package/.next/standalone/apps/web/.next/static/chunks/3182.74de4aadefc6e951.js +1 -0
  445. package/.next/standalone/apps/web/.next/static/chunks/3259.41d1a9e21c751dca.js +1 -0
  446. package/.next/standalone/apps/web/.next/static/chunks/3853-f4d7f7a9e7afd752.js +1 -0
  447. package/.next/standalone/apps/web/.next/static/chunks/4112ad79.b782044759df4bc8.js +45 -0
  448. package/.next/standalone/apps/web/.next/static/chunks/4765-48a3b66331719b80.js +1 -0
  449. package/.next/standalone/apps/web/.next/static/chunks/4975-4de53a9574e52468.js +1 -0
  450. package/.next/standalone/apps/web/.next/static/chunks/5833-f7b1cb2153cd52ab.js +1 -0
  451. package/.next/standalone/apps/web/.next/static/chunks/6462-9d67b69d990b1234.js +1 -0
  452. package/.next/standalone/apps/web/.next/static/chunks/6837-67b91a5109edf8a8.js +1 -0
  453. package/.next/standalone/apps/web/.next/static/chunks/6880.4300fd5c0fd7f17a.js +1 -0
  454. package/.next/standalone/apps/web/.next/static/chunks/6904-f77e06e821ecae13.js +52 -0
  455. package/.next/standalone/apps/web/.next/static/chunks/7534-8b910687515b8403.js +6 -0
  456. package/.next/standalone/apps/web/.next/static/chunks/7857.ce5356f660fb54a1.js +1 -0
  457. package/.next/standalone/apps/web/.next/static/chunks/8226-c6f5131375b6df6a.js +3 -0
  458. package/.next/standalone/apps/web/.next/static/chunks/9734-c7b94c9bf40c9b2e.js +1 -0
  459. package/.next/standalone/apps/web/.next/static/chunks/9779-5dc3db110e05c070.js +1 -0
  460. package/.next/standalone/apps/web/.next/static/chunks/9987-45c7dfa599210f7e.js +78 -0
  461. package/.next/standalone/apps/web/.next/static/chunks/app/_global-error/page-0d4f12c4c9cbf85f.js +1 -0
  462. package/.next/standalone/apps/web/.next/static/chunks/app/_not-found/page-7007da1b6a809c3d.js +1 -0
  463. package/.next/standalone/apps/web/.next/static/chunks/app/add/page-d423813ec2556ef0.js +1 -0
  464. package/.next/standalone/apps/web/.next/static/chunks/app/api/analytics/route-0d4f12c4c9cbf85f.js +1 -0
  465. package/.next/standalone/apps/web/.next/static/chunks/app/api/chat/feedback/route-0d4f12c4c9cbf85f.js +1 -0
  466. package/.next/standalone/apps/web/.next/static/chunks/app/api/chat/route-0d4f12c4c9cbf85f.js +1 -0
  467. package/.next/standalone/apps/web/.next/static/chunks/app/api/chat/status/route-0d4f12c4c9cbf85f.js +1 -0
  468. package/.next/standalone/apps/web/.next/static/chunks/app/api/config/route-0d4f12c4c9cbf85f.js +1 -0
  469. package/.next/standalone/apps/web/.next/static/chunks/app/api/config/test/route-0d4f12c4c9cbf85f.js +1 -0
  470. package/.next/standalone/apps/web/.next/static/chunks/app/api/config/test-embedding/route-0d4f12c4c9cbf85f.js +1 -0
  471. package/.next/standalone/apps/web/.next/static/chunks/app/api/config/test-llm/route-0d4f12c4c9cbf85f.js +1 -0
  472. package/.next/standalone/apps/web/.next/static/chunks/app/api/config/test-provider/route-0d4f12c4c9cbf85f.js +1 -0
  473. package/.next/standalone/apps/web/.next/static/chunks/app/api/config/verify/route-0d4f12c4c9cbf85f.js +1 -0
  474. package/.next/standalone/apps/web/.next/static/chunks/app/api/connections/[channelId]/oauth/callback/route-0d4f12c4c9cbf85f.js +1 -0
  475. package/.next/standalone/apps/web/.next/static/chunks/app/api/connections/[channelId]/oauth/start/route-0d4f12c4c9cbf85f.js +1 -0
  476. package/.next/standalone/apps/web/.next/static/chunks/app/api/connections/[channelId]/route-0d4f12c4c9cbf85f.js +1 -0
  477. package/.next/standalone/apps/web/.next/static/chunks/app/api/connections/route-0d4f12c4c9cbf85f.js +1 -0
  478. package/.next/standalone/apps/web/.next/static/chunks/app/api/connections/tunnel/route-0d4f12c4c9cbf85f.js +1 -0
  479. package/.next/standalone/apps/web/.next/static/chunks/app/api/demo/route-0d4f12c4c9cbf85f.js +1 -0
  480. package/.next/standalone/apps/web/.next/static/chunks/app/api/deploy/ssh/route-0d4f12c4c9cbf85f.js +1 -0
  481. package/.next/standalone/apps/web/.next/static/chunks/app/api/deploy/verify/route-0d4f12c4c9cbf85f.js +1 -0
  482. package/.next/standalone/apps/web/.next/static/chunks/app/api/describe-image/route-0d4f12c4c9cbf85f.js +1 -0
  483. package/.next/standalone/apps/web/.next/static/chunks/app/api/doc-editor/edit/route-0d4f12c4c9cbf85f.js +1 -0
  484. package/.next/standalone/apps/web/.next/static/chunks/app/api/doc-editor/export/route-0d4f12c4c9cbf85f.js +1 -0
  485. package/.next/standalone/apps/web/.next/static/chunks/app/api/doc-editor/extract-text/route-0d4f12c4c9cbf85f.js +1 -0
  486. package/.next/standalone/apps/web/.next/static/chunks/app/api/doc-editor/parse/route-0d4f12c4c9cbf85f.js +1 -0
  487. package/.next/standalone/apps/web/.next/static/chunks/app/api/doc-editor/restore/route-0d4f12c4c9cbf85f.js +1 -0
  488. package/.next/standalone/apps/web/.next/static/chunks/app/api/document/sign/route-0d4f12c4c9cbf85f.js +1 -0
  489. package/.next/standalone/apps/web/.next/static/chunks/app/api/documents/move/route-0d4f12c4c9cbf85f.js +1 -0
  490. package/.next/standalone/apps/web/.next/static/chunks/app/api/documents/route-0d4f12c4c9cbf85f.js +1 -0
  491. package/.next/standalone/apps/web/.next/static/chunks/app/api/files/remote/route-0d4f12c4c9cbf85f.js +1 -0
  492. package/.next/standalone/apps/web/.next/static/chunks/app/api/firecrawl/local/route-0d4f12c4c9cbf85f.js +1 -0
  493. package/.next/standalone/apps/web/.next/static/chunks/app/api/gpu-activity/route-0d4f12c4c9cbf85f.js +1 -0
  494. package/.next/standalone/apps/web/.next/static/chunks/app/api/groups/route-0d4f12c4c9cbf85f.js +1 -0
  495. package/.next/standalone/apps/web/.next/static/chunks/app/api/index/route-0d4f12c4c9cbf85f.js +1 -0
  496. package/.next/standalone/apps/web/.next/static/chunks/app/api/integrations/[integration]/callback/route-0d4f12c4c9cbf85f.js +1 -0
  497. package/.next/standalone/apps/web/.next/static/chunks/app/api/integrations/[integration]/route-0d4f12c4c9cbf85f.js +1 -0
  498. package/.next/standalone/apps/web/.next/static/chunks/app/api/integrations/notion/callback/route-0d4f12c4c9cbf85f.js +1 -0
  499. package/.next/standalone/apps/web/.next/static/chunks/app/api/integrations/notion/route-0d4f12c4c9cbf85f.js +1 -0
  500. package/.next/standalone/apps/web/.next/static/chunks/app/api/integrations/route-0d4f12c4c9cbf85f.js +1 -0
  501. package/.next/standalone/apps/web/.next/static/chunks/app/api/jobs/[id]/route-0d4f12c4c9cbf85f.js +1 -0
  502. package/.next/standalone/apps/web/.next/static/chunks/app/api/jobs/route-0d4f12c4c9cbf85f.js +1 -0
  503. package/.next/standalone/apps/web/.next/static/chunks/app/api/marketplace/[toolId]/route-0d4f12c4c9cbf85f.js +1 -0
  504. package/.next/standalone/apps/web/.next/static/chunks/app/api/marketplace/route-0d4f12c4c9cbf85f.js +1 -0
  505. package/.next/standalone/apps/web/.next/static/chunks/app/api/mcp/[connectionId]/route-0d4f12c4c9cbf85f.js +1 -0
  506. package/.next/standalone/apps/web/.next/static/chunks/app/api/mcp/[connectionId]/test/route-0d4f12c4c9cbf85f.js +1 -0
  507. package/.next/standalone/apps/web/.next/static/chunks/app/api/mcp/route-0d4f12c4c9cbf85f.js +1 -0
  508. package/.next/standalone/apps/web/.next/static/chunks/app/api/media/[id]/frame/route-0d4f12c4c9cbf85f.js +1 -0
  509. package/.next/standalone/apps/web/.next/static/chunks/app/api/media/[id]/route-0d4f12c4c9cbf85f.js +1 -0
  510. package/.next/standalone/apps/web/.next/static/chunks/app/api/media/inspect/route-0d4f12c4c9cbf85f.js +1 -0
  511. package/.next/standalone/apps/web/.next/static/chunks/app/api/media/jobs/[id]/approval/route-0d4f12c4c9cbf85f.js +1 -0
  512. package/.next/standalone/apps/web/.next/static/chunks/app/api/media/jobs/[id]/route-0d4f12c4c9cbf85f.js +1 -0
  513. package/.next/standalone/apps/web/.next/static/chunks/app/api/media/process/route-0d4f12c4c9cbf85f.js +1 -0
  514. package/.next/standalone/apps/web/.next/static/chunks/app/api/media/route-0d4f12c4c9cbf85f.js +1 -0
  515. package/.next/standalone/apps/web/.next/static/chunks/app/api/media/stream/route-0d4f12c4c9cbf85f.js +1 -0
  516. package/.next/standalone/apps/web/.next/static/chunks/app/api/models/route-0d4f12c4c9cbf85f.js +1 -0
  517. package/.next/standalone/apps/web/.next/static/chunks/app/api/parse-file/route-0d4f12c4c9cbf85f.js +1 -0
  518. package/.next/standalone/apps/web/.next/static/chunks/app/api/pdf-page/route-0d4f12c4c9cbf85f.js +1 -0
  519. package/.next/standalone/apps/web/.next/static/chunks/app/api/projects/deployments/route-0d4f12c4c9cbf85f.js +1 -0
  520. package/.next/standalone/apps/web/.next/static/chunks/app/api/projects/route-0d4f12c4c9cbf85f.js +1 -0
  521. package/.next/standalone/apps/web/.next/static/chunks/app/api/projects/runtime/route-0d4f12c4c9cbf85f.js +1 -0
  522. package/.next/standalone/apps/web/.next/static/chunks/app/api/proxy/verify/route-0d4f12c4c9cbf85f.js +1 -0
  523. package/.next/standalone/apps/web/.next/static/chunks/app/api/sandbox/route-0d4f12c4c9cbf85f.js +1 -0
  524. package/.next/standalone/apps/web/.next/static/chunks/app/api/sandbox/verify/route-0d4f12c4c9cbf85f.js +1 -0
  525. package/.next/standalone/apps/web/.next/static/chunks/app/api/search/bing/route-0d4f12c4c9cbf85f.js +1 -0
  526. package/.next/standalone/apps/web/.next/static/chunks/app/api/search/brave/route-0d4f12c4c9cbf85f.js +1 -0
  527. package/.next/standalone/apps/web/.next/static/chunks/app/api/search/exa/route-0d4f12c4c9cbf85f.js +1 -0
  528. package/.next/standalone/apps/web/.next/static/chunks/app/api/search/google/route-0d4f12c4c9cbf85f.js +1 -0
  529. package/.next/standalone/apps/web/.next/static/chunks/app/api/search/route-0d4f12c4c9cbf85f.js +1 -0
  530. package/.next/standalone/apps/web/.next/static/chunks/app/api/search/tavily/route-0d4f12c4c9cbf85f.js +1 -0
  531. package/.next/standalone/apps/web/.next/static/chunks/app/api/search/verify/route-0d4f12c4c9cbf85f.js +1 -0
  532. package/.next/standalone/apps/web/.next/static/chunks/app/api/system/cache/route-0d4f12c4c9cbf85f.js +1 -0
  533. package/.next/standalone/apps/web/.next/static/chunks/app/api/tabular/query/route-0d4f12c4c9cbf85f.js +1 -0
  534. package/.next/standalone/apps/web/.next/static/chunks/app/api/tabular/route-0d4f12c4c9cbf85f.js +1 -0
  535. package/.next/standalone/apps/web/.next/static/chunks/app/api/tools/[toolId]/host/route-0d4f12c4c9cbf85f.js +1 -0
  536. package/.next/standalone/apps/web/.next/static/chunks/app/api/tools/[toolId]/runtime/route-0d4f12c4c9cbf85f.js +1 -0
  537. package/.next/standalone/apps/web/.next/static/chunks/app/api/tools/[toolId]/usage/route-0d4f12c4c9cbf85f.js +1 -0
  538. package/.next/standalone/apps/web/.next/static/chunks/app/api/tools/[toolId]/usage-request/route-0d4f12c4c9cbf85f.js +1 -0
  539. package/.next/standalone/apps/web/.next/static/chunks/app/api/tools/[toolId]/verify/route-0d4f12c4c9cbf85f.js +1 -0
  540. package/.next/standalone/apps/web/.next/static/chunks/app/api/tools/video-intelligence/connection/route-0d4f12c4c9cbf85f.js +1 -0
  541. package/.next/standalone/apps/web/.next/static/chunks/app/api/tools/video-intelligence/usage/route-0d4f12c4c9cbf85f.js +1 -0
  542. package/.next/standalone/apps/web/.next/static/chunks/app/api/tools/video-intelligence/usage-request/route-0d4f12c4c9cbf85f.js +1 -0
  543. package/.next/standalone/apps/web/.next/static/chunks/app/api/upload-file/route-0d4f12c4c9cbf85f.js +1 -0
  544. package/.next/standalone/apps/web/.next/static/chunks/app/api/uploads/[...slug]/route-0d4f12c4c9cbf85f.js +1 -0
  545. package/.next/standalone/apps/web/.next/static/chunks/app/api/vector-stores/install/route-0d4f12c4c9cbf85f.js +1 -0
  546. package/.next/standalone/apps/web/.next/static/chunks/app/api/vector-stores/status/route-0d4f12c4c9cbf85f.js +1 -0
  547. package/.next/standalone/apps/web/.next/static/chunks/app/chat/[id]/page-579d3515fee9f89a.js +1 -0
  548. package/.next/standalone/apps/web/.next/static/chunks/app/chat/page-bec03ef7408245b1.js +1 -0
  549. package/.next/standalone/apps/web/.next/static/chunks/app/data/page-02e56e093071379d.js +1 -0
  550. package/.next/standalone/apps/web/.next/static/chunks/app/layout-4b8ce98cb78f7113.js +1 -0
  551. package/.next/standalone/apps/web/.next/static/chunks/app/page-0d4f12c4c9cbf85f.js +1 -0
  552. package/.next/standalone/apps/web/.next/static/chunks/app/settings/page-485ea820c1111580.js +214 -0
  553. package/.next/standalone/apps/web/.next/static/chunks/app/template-6c3f1e7c9216df6c.js +1 -0
  554. package/.next/standalone/apps/web/.next/static/chunks/ca017448-ac5fddb4e8d1ca39.js +1 -0
  555. package/.next/standalone/apps/web/.next/static/chunks/db534642-baa98c214832026c.js +1 -0
  556. package/.next/standalone/apps/web/.next/static/chunks/framework-ae648e3ae9d64766.js +1 -0
  557. package/.next/standalone/apps/web/.next/static/chunks/main-25c6b3b10ba0a4a3.js +5 -0
  558. package/.next/standalone/apps/web/.next/static/chunks/main-app-ecde5d6ff9b76409.js +1 -0
  559. package/.next/standalone/apps/web/.next/static/chunks/next/dist/client/components/builtin/app-error-0d4f12c4c9cbf85f.js +1 -0
  560. package/.next/standalone/apps/web/.next/static/chunks/next/dist/client/components/builtin/forbidden-0d4f12c4c9cbf85f.js +1 -0
  561. package/.next/standalone/apps/web/.next/static/chunks/next/dist/client/components/builtin/global-error-ab826e81c411f616.js +1 -0
  562. package/.next/standalone/apps/web/.next/static/chunks/next/dist/client/components/builtin/not-found-0d4f12c4c9cbf85f.js +1 -0
  563. package/.next/standalone/apps/web/.next/static/chunks/next/dist/client/components/builtin/unauthorized-0d4f12c4c9cbf85f.js +1 -0
  564. package/.next/standalone/apps/web/.next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  565. package/.next/standalone/apps/web/.next/static/chunks/webpack-8c15908ca85a5a46.js +1 -0
  566. package/.next/standalone/apps/web/.next/static/css/063aaab22a52e4b4.css +1 -0
  567. package/.next/standalone/apps/web/.next/static/css/a2d2ae3b76e6a5b6.css +1 -0
  568. package/.next/standalone/apps/web/.next/static/media/KaTeX_AMS-Regular.1608a09b.woff +0 -0
  569. package/.next/standalone/apps/web/.next/static/media/KaTeX_AMS-Regular.4aafdb68.ttf +0 -0
  570. package/.next/standalone/apps/web/.next/static/media/KaTeX_AMS-Regular.a79f1c31.woff2 +0 -0
  571. package/.next/standalone/apps/web/.next/static/media/KaTeX_Caligraphic-Bold.b6770918.woff +0 -0
  572. package/.next/standalone/apps/web/.next/static/media/KaTeX_Caligraphic-Bold.cce5b8ec.ttf +0 -0
  573. package/.next/standalone/apps/web/.next/static/media/KaTeX_Caligraphic-Bold.ec17d132.woff2 +0 -0
  574. package/.next/standalone/apps/web/.next/static/media/KaTeX_Caligraphic-Regular.07ef19e7.ttf +0 -0
  575. package/.next/standalone/apps/web/.next/static/media/KaTeX_Caligraphic-Regular.55fac258.woff2 +0 -0
  576. package/.next/standalone/apps/web/.next/static/media/KaTeX_Caligraphic-Regular.dad44a7f.woff +0 -0
  577. package/.next/standalone/apps/web/.next/static/media/KaTeX_Fraktur-Bold.9f256b85.woff +0 -0
  578. package/.next/standalone/apps/web/.next/static/media/KaTeX_Fraktur-Bold.b18f59e1.ttf +0 -0
  579. package/.next/standalone/apps/web/.next/static/media/KaTeX_Fraktur-Bold.d42a5579.woff2 +0 -0
  580. package/.next/standalone/apps/web/.next/static/media/KaTeX_Fraktur-Regular.7c187121.woff +0 -0
  581. package/.next/standalone/apps/web/.next/static/media/KaTeX_Fraktur-Regular.d3c882a6.woff2 +0 -0
  582. package/.next/standalone/apps/web/.next/static/media/KaTeX_Fraktur-Regular.ed38e79f.ttf +0 -0
  583. package/.next/standalone/apps/web/.next/static/media/KaTeX_Main-Bold.b74a1a8b.ttf +0 -0
  584. package/.next/standalone/apps/web/.next/static/media/KaTeX_Main-Bold.c3fb5ac2.woff2 +0 -0
  585. package/.next/standalone/apps/web/.next/static/media/KaTeX_Main-Bold.d181c465.woff +0 -0
  586. package/.next/standalone/apps/web/.next/static/media/KaTeX_Main-BoldItalic.6f2bb1df.woff2 +0 -0
  587. package/.next/standalone/apps/web/.next/static/media/KaTeX_Main-BoldItalic.70d8b0a5.ttf +0 -0
  588. package/.next/standalone/apps/web/.next/static/media/KaTeX_Main-BoldItalic.e3f82f9d.woff +0 -0
  589. package/.next/standalone/apps/web/.next/static/media/KaTeX_Main-Italic.47373d1e.ttf +0 -0
  590. package/.next/standalone/apps/web/.next/static/media/KaTeX_Main-Italic.8916142b.woff2 +0 -0
  591. package/.next/standalone/apps/web/.next/static/media/KaTeX_Main-Italic.9024d815.woff +0 -0
  592. package/.next/standalone/apps/web/.next/static/media/KaTeX_Main-Regular.0462f03b.woff2 +0 -0
  593. package/.next/standalone/apps/web/.next/static/media/KaTeX_Main-Regular.7f51fe03.woff +0 -0
  594. package/.next/standalone/apps/web/.next/static/media/KaTeX_Main-Regular.b7f8fe9b.ttf +0 -0
  595. package/.next/standalone/apps/web/.next/static/media/KaTeX_Math-BoldItalic.572d331f.woff2 +0 -0
  596. package/.next/standalone/apps/web/.next/static/media/KaTeX_Math-BoldItalic.a879cf83.ttf +0 -0
  597. package/.next/standalone/apps/web/.next/static/media/KaTeX_Math-BoldItalic.f1035d8d.woff +0 -0
  598. package/.next/standalone/apps/web/.next/static/media/KaTeX_Math-Italic.5295ba48.woff +0 -0
  599. package/.next/standalone/apps/web/.next/static/media/KaTeX_Math-Italic.939bc644.ttf +0 -0
  600. package/.next/standalone/apps/web/.next/static/media/KaTeX_Math-Italic.f28c23ac.woff2 +0 -0
  601. package/.next/standalone/apps/web/.next/static/media/KaTeX_SansSerif-Bold.8c5b5494.woff2 +0 -0
  602. package/.next/standalone/apps/web/.next/static/media/KaTeX_SansSerif-Bold.94e1e8dc.ttf +0 -0
  603. package/.next/standalone/apps/web/.next/static/media/KaTeX_SansSerif-Bold.bf59d231.woff +0 -0
  604. package/.next/standalone/apps/web/.next/static/media/KaTeX_SansSerif-Italic.3b1e59b3.woff2 +0 -0
  605. package/.next/standalone/apps/web/.next/static/media/KaTeX_SansSerif-Italic.7c9bc82b.woff +0 -0
  606. package/.next/standalone/apps/web/.next/static/media/KaTeX_SansSerif-Italic.b4c20c84.ttf +0 -0
  607. package/.next/standalone/apps/web/.next/static/media/KaTeX_SansSerif-Regular.74048478.woff +0 -0
  608. package/.next/standalone/apps/web/.next/static/media/KaTeX_SansSerif-Regular.ba21ed5f.woff2 +0 -0
  609. package/.next/standalone/apps/web/.next/static/media/KaTeX_SansSerif-Regular.d4d7ba48.ttf +0 -0
  610. package/.next/standalone/apps/web/.next/static/media/KaTeX_Script-Regular.03e9641d.woff2 +0 -0
  611. package/.next/standalone/apps/web/.next/static/media/KaTeX_Script-Regular.07505710.woff +0 -0
  612. package/.next/standalone/apps/web/.next/static/media/KaTeX_Script-Regular.fe9cbbe1.ttf +0 -0
  613. package/.next/standalone/apps/web/.next/static/media/KaTeX_Size1-Regular.e1e279cb.woff +0 -0
  614. package/.next/standalone/apps/web/.next/static/media/KaTeX_Size1-Regular.eae34984.woff2 +0 -0
  615. package/.next/standalone/apps/web/.next/static/media/KaTeX_Size1-Regular.fabc004a.ttf +0 -0
  616. package/.next/standalone/apps/web/.next/static/media/KaTeX_Size2-Regular.57727022.woff +0 -0
  617. package/.next/standalone/apps/web/.next/static/media/KaTeX_Size2-Regular.5916a24f.woff2 +0 -0
  618. package/.next/standalone/apps/web/.next/static/media/KaTeX_Size2-Regular.d6b476ec.ttf +0 -0
  619. package/.next/standalone/apps/web/.next/static/media/KaTeX_Size3-Regular.9acaf01c.woff +0 -0
  620. package/.next/standalone/apps/web/.next/static/media/KaTeX_Size3-Regular.a144ef58.ttf +0 -0
  621. package/.next/standalone/apps/web/.next/static/media/KaTeX_Size3-Regular.b4230e7e.woff2 +0 -0
  622. package/.next/standalone/apps/web/.next/static/media/KaTeX_Size4-Regular.10d95fd3.woff2 +0 -0
  623. package/.next/standalone/apps/web/.next/static/media/KaTeX_Size4-Regular.7a996c9d.woff +0 -0
  624. package/.next/standalone/apps/web/.next/static/media/KaTeX_Size4-Regular.fbccdabe.ttf +0 -0
  625. package/.next/standalone/apps/web/.next/static/media/KaTeX_Typewriter-Regular.6258592b.woff +0 -0
  626. package/.next/standalone/apps/web/.next/static/media/KaTeX_Typewriter-Regular.a8709e36.woff2 +0 -0
  627. package/.next/standalone/apps/web/.next/static/media/KaTeX_Typewriter-Regular.d97aaf4a.ttf +0 -0
  628. package/.next/standalone/apps/web/.next/static/media/pdf.worker.min.b6d469c6.mjs +6 -0
  629. package/.next/standalone/apps/web/.next/static/omDbbCzcQ9kxlZ8Gz0yln/_buildManifest.js +1 -0
  630. package/.next/standalone/apps/web/.next/static/omDbbCzcQ9kxlZ8Gz0yln/_ssgManifest.js +1 -0
  631. package/.next/standalone/apps/web/.next/types/cache-life.d.ts +146 -0
  632. package/.next/standalone/apps/web/.next/types/root-params.d.ts +3 -0
  633. package/.next/standalone/apps/web/.next/types/routes.d.ts +161 -0
  634. package/.next/standalone/apps/web/.next/types/validator.ts +862 -0
  635. package/.next/standalone/apps/web/AGENTS.md +9 -0
  636. package/.next/standalone/apps/web/CLAUDE.md +1 -0
  637. package/.next/standalone/apps/web/app/api/groups/route.test.ts +86 -0
  638. package/.next/standalone/apps/web/app/api/index/route.test.ts +55 -0
  639. package/.next/standalone/apps/web/app/api/marketplace/[toolId]/route.test.ts +83 -0
  640. package/.next/standalone/apps/web/app/api/marketplace/route.test.ts +117 -0
  641. package/.next/standalone/apps/web/app/api/tools/[toolId]/verify/route.test.ts +66 -0
  642. package/.next/standalone/apps/web/app/favicon.ico +0 -0
  643. package/.next/standalone/apps/web/app/globals.css +406 -0
  644. package/.next/standalone/apps/web/app/themes.css +234 -0
  645. package/.next/standalone/apps/web/bin/larkup.js +528 -0
  646. package/.next/standalone/apps/web/components/alerts/generic-alert.tsx +76 -0
  647. package/.next/standalone/apps/web/components/analytics/analytics-dashboard.tsx +517 -0
  648. package/.next/standalone/apps/web/components/chat/canvas/doc-editor-provider.tsx +331 -0
  649. package/.next/standalone/apps/web/components/chat/canvas/document-canvas.tsx +98 -0
  650. package/.next/standalone/apps/web/components/chat/canvas/document-field.tsx +167 -0
  651. package/.next/standalone/apps/web/components/chat/canvas/document-viewer.tsx +446 -0
  652. package/.next/standalone/apps/web/components/chat/canvas/file-attachment-button.tsx +88 -0
  653. package/.next/standalone/apps/web/components/chat/canvas/file-chip.tsx +147 -0
  654. package/.next/standalone/apps/web/components/chat/message-actions.tsx +96 -0
  655. package/.next/standalone/apps/web/components/chat/message-item.tsx +1404 -0
  656. package/.next/standalone/apps/web/components/chat/message-queue.tsx +86 -0
  657. package/.next/standalone/apps/web/components/chat/reasoning.tsx +182 -0
  658. package/.next/standalone/apps/web/components/chat/tools/chat-card.tsx +97 -0
  659. package/.next/standalone/apps/web/components/chat/tools/chat-chart.tsx +554 -0
  660. package/.next/standalone/apps/web/components/chat/tools/chat-citations.tsx +152 -0
  661. package/.next/standalone/apps/web/components/chat/tools/chat-data-table.tsx +377 -0
  662. package/.next/standalone/apps/web/components/chat/tools/chat-file-export.tsx +49 -0
  663. package/.next/standalone/apps/web/components/chat/tools/chat-grid.tsx +99 -0
  664. package/.next/standalone/apps/web/components/chat/tools/chat-media-preview.tsx +465 -0
  665. package/.next/standalone/apps/web/components/chat/tools/chat-metrics.tsx +76 -0
  666. package/.next/standalone/apps/web/components/chat/tools/chat-sandbox-result.tsx +130 -0
  667. package/.next/standalone/apps/web/components/chat/tools/chat-signature-request.tsx +809 -0
  668. package/.next/standalone/apps/web/components/chat/tools/chat-tabs.tsx +59 -0
  669. package/.next/standalone/apps/web/components/chat/tools/corpus-data-result.tsx +194 -0
  670. package/.next/standalone/apps/web/components/chat/tools/knowledge-base-result.tsx +345 -0
  671. package/.next/standalone/apps/web/components/chat/tools/visual-placement-modal.tsx +314 -0
  672. package/.next/standalone/apps/web/components/chat/tools/visualization-tabs.tsx +37 -0
  673. package/.next/standalone/apps/web/components/configure/custom-model-modal.tsx +214 -0
  674. package/.next/standalone/apps/web/components/configure/store-fields.tsx +129 -0
  675. package/.next/standalone/apps/web/components/data/corpus-panel.tsx +1124 -0
  676. package/.next/standalone/apps/web/components/data/data-entry-mode-switch.tsx +53 -0
  677. package/.next/standalone/apps/web/components/data/data-primary-action.ts +6 -0
  678. package/.next/standalone/apps/web/components/data/groups-panel.tsx +526 -0
  679. package/.next/standalone/apps/web/components/data/integration-resources-panel.tsx +281 -0
  680. package/.next/standalone/apps/web/components/data/integrations-panel.tsx +397 -0
  681. package/.next/standalone/apps/web/components/data/jobs-panel.tsx +487 -0
  682. package/.next/standalone/apps/web/components/data/jobs-tracking-button.tsx +221 -0
  683. package/.next/standalone/apps/web/components/data/live-media-progress.tsx +79 -0
  684. package/.next/standalone/apps/web/components/data/media-indexing-jobs-panel.tsx +190 -0
  685. package/.next/standalone/apps/web/components/data/media-panel.tsx +2883 -0
  686. package/.next/standalone/apps/web/components/data/notion-panel.tsx +405 -0
  687. package/.next/standalone/apps/web/components/data/paste-panel.tsx +100 -0
  688. package/.next/standalone/apps/web/components/data/scrape-panel.tsx +1275 -0
  689. package/.next/standalone/apps/web/components/data/tabular-preview.tsx +205 -0
  690. package/.next/standalone/apps/web/components/data/tool-indexing-dialog.tsx +210 -0
  691. package/.next/standalone/apps/web/components/data/upload-panel.tsx +1306 -0
  692. package/.next/standalone/apps/web/components/data/web-crawler-status.tsx +131 -0
  693. package/.next/standalone/apps/web/components/index/index-action-dialog.tsx +545 -0
  694. package/.next/standalone/apps/web/components/index/index-workspace.tsx +406 -0
  695. package/.next/standalone/apps/web/components/onboarding/welcome-screen.tsx +596 -0
  696. package/.next/standalone/apps/web/components/projects/delete-project-dialog.tsx +63 -0
  697. package/.next/standalone/apps/web/components/projects/project-form-dialog.tsx +97 -0
  698. package/.next/standalone/apps/web/components/projects/project-switcher.tsx +136 -0
  699. package/.next/standalone/apps/web/components/settings/general/agent-customization-section.tsx +619 -0
  700. package/.next/standalone/apps/web/components/settings/general/cache-management-card.tsx +176 -0
  701. package/.next/standalone/apps/web/components/settings/general/general-section.tsx +333 -0
  702. package/.next/standalone/apps/web/components/settings/general/mcp-connections-section.tsx +893 -0
  703. package/.next/standalone/apps/web/components/settings/general/model-combobox.tsx +235 -0
  704. package/.next/standalone/apps/web/components/settings/general/models-section.tsx +918 -0
  705. package/.next/standalone/apps/web/components/settings/general/sandbox-section.tsx +382 -0
  706. package/.next/standalone/apps/web/components/settings/general/search-scraping-section.tsx +749 -0
  707. package/.next/standalone/apps/web/components/settings/general/storage-indexing-section.tsx +389 -0
  708. package/.next/standalone/apps/web/components/settings/hub/marketplace-section.tsx +574 -0
  709. package/.next/standalone/apps/web/components/settings/hub/marketplace-tools-settings.tsx +1247 -0
  710. package/.next/standalone/apps/web/components/settings/runtime/connections-tab.tsx +1045 -0
  711. package/.next/standalone/apps/web/components/settings/runtime/deploy/index.ts +4 -0
  712. package/.next/standalone/apps/web/components/settings/runtime/deploy/project-deploy-button.tsx +245 -0
  713. package/.next/standalone/apps/web/components/settings/runtime/deploy/project-deploy-view.tsx +1592 -0
  714. package/.next/standalone/apps/web/components/settings/runtime/deploy/use-vps-deploy.ts +114 -0
  715. package/.next/standalone/apps/web/components/settings/runtime/deploy/vps-terminal-dialog.tsx +391 -0
  716. package/.next/standalone/apps/web/components/settings/runtime/playground-tab.tsx +359 -0
  717. package/.next/standalone/apps/web/components/settings/runtime/runtime-section.tsx +1001 -0
  718. package/.next/standalone/apps/web/components/settings/runtime/widget-snippets.ts +15 -0
  719. package/.next/standalone/apps/web/components/settings/runtime/widget-tab.tsx +426 -0
  720. package/.next/standalone/apps/web/components/settings/settings-layout.tsx +123 -0
  721. package/.next/standalone/apps/web/components/sidebar.tsx +208 -0
  722. package/.next/standalone/apps/web/components/topnav.tsx +92 -0
  723. package/.next/standalone/apps/web/components/ui/alert-dialog.tsx +187 -0
  724. package/.next/standalone/apps/web/components/ui/alert.tsx +76 -0
  725. package/.next/standalone/apps/web/components/ui/badge.tsx +52 -0
  726. package/.next/standalone/apps/web/components/ui/button.tsx +58 -0
  727. package/.next/standalone/apps/web/components/ui/card.tsx +92 -0
  728. package/.next/standalone/apps/web/components/ui/checkbox.tsx +28 -0
  729. package/.next/standalone/apps/web/components/ui/collapsible.tsx +21 -0
  730. package/.next/standalone/apps/web/components/ui/command.tsx +181 -0
  731. package/.next/standalone/apps/web/components/ui/dialog.tsx +138 -0
  732. package/.next/standalone/apps/web/components/ui/dropdown-menu.tsx +267 -0
  733. package/.next/standalone/apps/web/components/ui/input-group.tsx +146 -0
  734. package/.next/standalone/apps/web/components/ui/input.tsx +20 -0
  735. package/.next/standalone/apps/web/components/ui/label.tsx +20 -0
  736. package/.next/standalone/apps/web/components/ui/line-tabs.tsx +59 -0
  737. package/.next/standalone/apps/web/components/ui/popover.tsx +77 -0
  738. package/.next/standalone/apps/web/components/ui/progress.tsx +83 -0
  739. package/.next/standalone/apps/web/components/ui/provider-icon.tsx +165 -0
  740. package/.next/standalone/apps/web/components/ui/scroll-area.tsx +55 -0
  741. package/.next/standalone/apps/web/components/ui/select.tsx +231 -0
  742. package/.next/standalone/apps/web/components/ui/separator.tsx +25 -0
  743. package/.next/standalone/apps/web/components/ui/sheet.tsx +125 -0
  744. package/.next/standalone/apps/web/components/ui/skeleton.tsx +14 -0
  745. package/.next/standalone/apps/web/components/ui/slider.tsx +52 -0
  746. package/.next/standalone/apps/web/components/ui/switch.tsx +32 -0
  747. package/.next/standalone/apps/web/components/ui/table.tsx +116 -0
  748. package/.next/standalone/apps/web/components/ui/tabs.tsx +77 -0
  749. package/.next/standalone/apps/web/components/ui/textarea.tsx +18 -0
  750. package/.next/standalone/apps/web/components/ui/tooltip.tsx +54 -0
  751. package/.next/standalone/apps/web/components.json +21 -0
  752. package/.next/standalone/apps/web/hooks/use-channel-oauth.ts +42 -0
  753. package/.next/standalone/apps/web/hooks/use-copy-to-clipboard.ts +25 -0
  754. package/.next/standalone/apps/web/hooks/use-integration-auth.ts +37 -0
  755. package/.next/standalone/apps/web/hooks/use-live-media-progress.ts +71 -0
  756. package/.next/standalone/apps/web/hooks/use-notion-auth.ts +63 -0
  757. package/.next/standalone/apps/web/lib/browser-cache.test.ts +32 -0
  758. package/.next/standalone/apps/web/lib/browser-cache.ts +17 -0
  759. package/.next/standalone/apps/web/lib/cache-size.test.ts +15 -0
  760. package/.next/standalone/apps/web/lib/cache-size.ts +11 -0
  761. package/.next/standalone/apps/web/lib/chat/assistant-source-scope.test.ts +43 -0
  762. package/.next/standalone/apps/web/lib/chat/chart-config.test.ts +144 -0
  763. package/.next/standalone/apps/web/lib/chat/chat-media-preview.test.ts +31 -0
  764. package/.next/standalone/apps/web/lib/chat/conversation-memory.test.ts +390 -0
  765. package/.next/standalone/apps/web/lib/chat/data-export.test.ts +224 -0
  766. package/.next/standalone/apps/web/lib/chat/live-tool-progress.test.ts +76 -0
  767. package/.next/standalone/apps/web/lib/chat/live-tool-progress.ts +69 -0
  768. package/.next/standalone/apps/web/lib/chat/media-retrieval-routing.test.ts +42 -0
  769. package/.next/standalone/apps/web/lib/chat/media-source-routing.test.ts +118 -0
  770. package/.next/standalone/apps/web/lib/chat/message-feedback.test.ts +102 -0
  771. package/.next/standalone/apps/web/lib/chat/message-input.test.ts +30 -0
  772. package/.next/standalone/apps/web/lib/chat/retrieval-ranking.test.ts +62 -0
  773. package/.next/standalone/apps/web/lib/chat/retrieval-routing.test.ts +80 -0
  774. package/.next/standalone/apps/web/lib/chat/tabular-dataset-routing.test.ts +83 -0
  775. package/.next/standalone/apps/web/lib/chat/tabular-query-plan.test.ts +148 -0
  776. package/.next/standalone/apps/web/lib/chat/tabular-routing.test.ts +109 -0
  777. package/.next/standalone/apps/web/lib/chat/tabular-sandbox-files.test.ts +100 -0
  778. package/.next/standalone/apps/web/lib/chat/tabular-visualization.test.ts +89 -0
  779. package/.next/standalone/apps/web/lib/chat/tool-call-repair.test.ts +64 -0
  780. package/.next/standalone/apps/web/lib/chat/tool-context.test.ts +978 -0
  781. package/.next/standalone/apps/web/lib/chat/tool-output.test.ts +23 -0
  782. package/.next/standalone/apps/web/lib/chat/tool-output.ts +14 -0
  783. package/.next/standalone/apps/web/lib/chat/tool-registry.test.ts +19 -0
  784. package/.next/standalone/apps/web/lib/chat/video-rag-routing.test.ts +158 -0
  785. package/.next/standalone/apps/web/lib/chat/visual-routing.test.ts +140 -0
  786. package/.next/standalone/apps/web/lib/chat-supporting-clip.test.ts +16 -0
  787. package/.next/standalone/apps/web/lib/chat-supporting-clip.ts +16 -0
  788. package/.next/standalone/apps/web/lib/constants/stores.ts +12 -0
  789. package/.next/standalone/apps/web/lib/constants/tools.test.ts +26 -0
  790. package/.next/standalone/apps/web/lib/constants/tools.ts +178 -0
  791. package/.next/standalone/apps/web/lib/error-formatter.ts +30 -0
  792. package/.next/standalone/apps/web/lib/jobs-client.ts +25 -0
  793. package/.next/standalone/apps/web/lib/marketplace/tool-runtime-config.test.ts +217 -0
  794. package/.next/standalone/apps/web/lib/media/knowledge.test.ts +36 -0
  795. package/.next/standalone/apps/web/lib/media/pdf-inspection.test.ts +63 -0
  796. package/.next/standalone/apps/web/lib/media/pdf.ts +57 -0
  797. package/.next/standalone/apps/web/lib/media/progress.test.ts +208 -0
  798. package/.next/standalone/apps/web/lib/media/progress.ts +209 -0
  799. package/.next/standalone/apps/web/lib/media/source-identity.test.ts +33 -0
  800. package/.next/standalone/apps/web/lib/media/source-selection.test.ts +36 -0
  801. package/.next/standalone/apps/web/lib/media/source-selection.ts +47 -0
  802. package/.next/standalone/apps/web/lib/media/source-utils.test.ts +231 -0
  803. package/.next/standalone/apps/web/lib/media/tool-indexing-estimate.test.ts +28 -0
  804. package/.next/standalone/apps/web/lib/media/tool-indexing-estimate.ts +39 -0
  805. package/.next/standalone/apps/web/lib/media/video/quick-look.test.ts +81 -0
  806. package/.next/standalone/apps/web/lib/media/video-intelligence-adapter.test.ts +739 -0
  807. package/.next/standalone/apps/web/lib/media/video-intelligence-capacity.test.ts +104 -0
  808. package/.next/standalone/apps/web/lib/media/video-runtime-scope.test.ts +43 -0
  809. package/.next/standalone/apps/web/lib/release-metadata.test.ts +118 -0
  810. package/.next/standalone/apps/web/lib/remote-files.test.ts +53 -0
  811. package/.next/standalone/apps/web/lib/system-cache.test.ts +173 -0
  812. package/.next/standalone/apps/web/lib/utils.ts +6 -0
  813. package/.next/standalone/apps/web/next-env.d.ts +7 -0
  814. package/.next/standalone/apps/web/next.config.mjs +82 -0
  815. package/.next/standalone/apps/web/package.json +96 -0
  816. package/.next/standalone/apps/web/parse_log.mjs +67 -0
  817. package/.next/standalone/apps/web/postcss.config.mjs +8 -0
  818. package/.next/standalone/apps/web/public/docker.png +0 -0
  819. package/.next/standalone/apps/web/public/favicon.ico +0 -0
  820. package/.next/standalone/apps/web/public/github.svg +3 -0
  821. package/.next/standalone/apps/web/public/hetzner.svg +1 -0
  822. package/.next/standalone/apps/web/public/icons/Confluence.png +0 -0
  823. package/.next/standalone/apps/web/public/icons/Instagram.png +0 -0
  824. package/.next/standalone/apps/web/public/icons/Northflank.png +0 -0
  825. package/.next/standalone/apps/web/public/icons/Salesforce.png +0 -0
  826. package/.next/standalone/apps/web/public/icons/agentskills.png +0 -0
  827. package/.next/standalone/apps/web/public/icons/airtable.png +0 -0
  828. package/.next/standalone/apps/web/public/icons/asana.png +0 -0
  829. package/.next/standalone/apps/web/public/icons/ashby.png +0 -0
  830. package/.next/standalone/apps/web/public/icons/audio.png +0 -0
  831. package/.next/standalone/apps/web/public/icons/aws-kendra.png +0 -0
  832. package/.next/standalone/apps/web/public/icons/aws.svg +38 -0
  833. package/.next/standalone/apps/web/public/icons/azure-ai-search.png +0 -0
  834. package/.next/standalone/apps/web/public/icons/azure.svg +1 -0
  835. package/.next/standalone/apps/web/public/icons/bigquery.png +0 -0
  836. package/.next/standalone/apps/web/public/icons/bing.png +0 -0
  837. package/.next/standalone/apps/web/public/icons/bitbucket.png +0 -0
  838. package/.next/standalone/apps/web/public/icons/brave.png +0 -0
  839. package/.next/standalone/apps/web/public/icons/browserbase.png +0 -0
  840. package/.next/standalone/apps/web/public/icons/calendly.png +0 -0
  841. package/.next/standalone/apps/web/public/icons/chroma.png +0 -0
  842. package/.next/standalone/apps/web/public/icons/cloudflare.png +0 -0
  843. package/.next/standalone/apps/web/public/icons/cohere.svg +30 -0
  844. package/.next/standalone/apps/web/public/icons/databricks.png +0 -0
  845. package/.next/standalone/apps/web/public/icons/daytonaio.png +0 -0
  846. package/.next/standalone/apps/web/public/icons/daytonaio2.png +0 -0
  847. package/.next/standalone/apps/web/public/icons/deepgram.png +0 -0
  848. package/.next/standalone/apps/web/public/icons/deepl.png +0 -0
  849. package/.next/standalone/apps/web/public/icons/digital-ocean.webp +0 -0
  850. package/.next/standalone/apps/web/public/icons/discord.png +0 -0
  851. package/.next/standalone/apps/web/public/icons/e2b-2.png +0 -0
  852. package/.next/standalone/apps/web/public/icons/e2b.png +0 -0
  853. package/.next/standalone/apps/web/public/icons/elevenlabs.png +0 -0
  854. package/.next/standalone/apps/web/public/icons/email.png +0 -0
  855. package/.next/standalone/apps/web/public/icons/exa.png +0 -0
  856. package/.next/standalone/apps/web/public/icons/excel.png +0 -0
  857. package/.next/standalone/apps/web/public/icons/fal.png +0 -0
  858. package/.next/standalone/apps/web/public/icons/firecrawl.png +0 -0
  859. package/.next/standalone/apps/web/public/icons/firecrawl2.png +0 -0
  860. package/.next/standalone/apps/web/public/icons/flyio.jpeg +0 -0
  861. package/.next/standalone/apps/web/public/icons/gcp.svg +1 -0
  862. package/.next/standalone/apps/web/public/icons/gemini.svg +1 -0
  863. package/.next/standalone/apps/web/public/icons/gmail.png +0 -0
  864. package/.next/standalone/apps/web/public/icons/google-analytics.png +0 -0
  865. package/.next/standalone/apps/web/public/icons/google-calender.png +0 -0
  866. package/.next/standalone/apps/web/public/icons/google-docs.png +0 -0
  867. package/.next/standalone/apps/web/public/icons/google-drive.png +0 -0
  868. package/.next/standalone/apps/web/public/icons/google-maps.png +0 -0
  869. package/.next/standalone/apps/web/public/icons/google-meet.png +0 -0
  870. package/.next/standalone/apps/web/public/icons/google-sheets.png +0 -0
  871. package/.next/standalone/apps/web/public/icons/google-slides.png +0 -0
  872. package/.next/standalone/apps/web/public/icons/google-tasks.png +0 -0
  873. package/.next/standalone/apps/web/public/icons/google.png +0 -0
  874. package/.next/standalone/apps/web/public/icons/grok.png +0 -0
  875. package/.next/standalone/apps/web/public/icons/hubspot.png +0 -0
  876. package/.next/standalone/apps/web/public/icons/image.png +0 -0
  877. package/.next/standalone/apps/web/public/icons/jina.svg +1 -0
  878. package/.next/standalone/apps/web/public/icons/jira.png +0 -0
  879. package/.next/standalone/apps/web/public/icons/lancedb2.png +0 -0
  880. package/.next/standalone/apps/web/public/icons/linear.png +0 -0
  881. package/.next/standalone/apps/web/public/icons/linux.png +0 -0
  882. package/.next/standalone/apps/web/public/icons/looker.png +0 -0
  883. package/.next/standalone/apps/web/public/icons/luma.png +0 -0
  884. package/.next/standalone/apps/web/public/icons/mac.png +0 -0
  885. package/.next/standalone/apps/web/public/icons/markdown.png +0 -0
  886. package/.next/standalone/apps/web/public/icons/mcp.png +0 -0
  887. package/.next/standalone/apps/web/public/icons/mcp.svg +1 -0
  888. package/.next/standalone/apps/web/public/icons/messenger.svg +1 -0
  889. package/.next/standalone/apps/web/public/icons/microsoft-intra.png +0 -0
  890. package/.next/standalone/apps/web/public/icons/microsoft-onenote.png +0 -0
  891. package/.next/standalone/apps/web/public/icons/microsoft-planner.png +0 -0
  892. package/.next/standalone/apps/web/public/icons/microsoft-teams.png +0 -0
  893. package/.next/standalone/apps/web/public/icons/miro.png +0 -0
  894. package/.next/standalone/apps/web/public/icons/mistral.svg +469 -0
  895. package/.next/standalone/apps/web/public/icons/modal.png +0 -0
  896. package/.next/standalone/apps/web/public/icons/ngrok.png +0 -0
  897. package/.next/standalone/apps/web/public/icons/nomic.png +0 -0
  898. package/.next/standalone/apps/web/public/icons/onedrive.png +0 -0
  899. package/.next/standalone/apps/web/public/icons/openai.svg +1 -0
  900. package/.next/standalone/apps/web/public/icons/outlook-calendar.png +0 -0
  901. package/.next/standalone/apps/web/public/icons/outlook-email.png +0 -0
  902. package/.next/standalone/apps/web/public/icons/outlook.png +0 -0
  903. package/.next/standalone/apps/web/public/icons/pdf.png +0 -0
  904. package/.next/standalone/apps/web/public/icons/personio.png +0 -0
  905. package/.next/standalone/apps/web/public/icons/pgvector2.png +0 -0
  906. package/.next/standalone/apps/web/public/icons/phone.png +0 -0
  907. package/.next/standalone/apps/web/public/icons/pinecone.png +0 -0
  908. package/.next/standalone/apps/web/public/icons/pipedrive.png +0 -0
  909. package/.next/standalone/apps/web/public/icons/power-pi.png +0 -0
  910. package/.next/standalone/apps/web/public/icons/pylon.png +0 -0
  911. package/.next/standalone/apps/web/public/icons/python.png +0 -0
  912. package/.next/standalone/apps/web/public/icons/qdrant.svg +35 -0
  913. package/.next/standalone/apps/web/public/icons/revai.png +0 -0
  914. package/.next/standalone/apps/web/public/icons/revai.svg +1 -0
  915. package/.next/standalone/apps/web/public/icons/sap.png +0 -0
  916. package/.next/standalone/apps/web/public/icons/serpapi.svg +34 -0
  917. package/.next/standalone/apps/web/public/icons/serper.png +0 -0
  918. package/.next/standalone/apps/web/public/icons/servicenow.png +0 -0
  919. package/.next/standalone/apps/web/public/icons/sharepoint.png +0 -0
  920. package/.next/standalone/apps/web/public/icons/slack.png +0 -0
  921. package/.next/standalone/apps/web/public/icons/snowflake.png +0 -0
  922. package/.next/standalone/apps/web/public/icons/statistia.png +0 -0
  923. package/.next/standalone/apps/web/public/icons/stripe.png +0 -0
  924. package/.next/standalone/apps/web/public/icons/supabase.png +0 -0
  925. package/.next/standalone/apps/web/public/icons/tableau.png +0 -0
  926. package/.next/standalone/apps/web/public/icons/tavily.png +0 -0
  927. package/.next/standalone/apps/web/public/icons/telegram.png +0 -0
  928. package/.next/standalone/apps/web/public/icons/typescript.png +0 -0
  929. package/.next/standalone/apps/web/public/icons/vercel copy.svg +1 -0
  930. package/.next/standalone/apps/web/public/icons/vercel.svg +1 -0
  931. package/.next/standalone/apps/web/public/icons/vertex-ai.png +0 -0
  932. package/.next/standalone/apps/web/public/icons/video.png +0 -0
  933. package/.next/standalone/apps/web/public/icons/voyage-light.png +0 -0
  934. package/.next/standalone/apps/web/public/icons/weaviate.webp +0 -0
  935. package/.next/standalone/apps/web/public/icons/webcontainers.svg +11 -0
  936. package/.next/standalone/apps/web/public/icons/webhook.png +0 -0
  937. package/.next/standalone/apps/web/public/icons/whatsapp copy.png +0 -0
  938. package/.next/standalone/apps/web/public/icons/whatsapp.png +0 -0
  939. package/.next/standalone/apps/web/public/icons/windows.png +0 -0
  940. package/.next/standalone/apps/web/public/icons/word.png +0 -0
  941. package/.next/standalone/apps/web/public/icons/zendesk.png +0 -0
  942. package/.next/standalone/apps/web/public/icons/zoom.png +0 -0
  943. package/.next/standalone/apps/web/public/logo-light.png +0 -0
  944. package/.next/standalone/apps/web/public/logo-light2.png +0 -0
  945. package/.next/standalone/apps/web/public/logo.png +0 -0
  946. package/.next/standalone/apps/web/public/logo9.png +0 -0
  947. package/.next/standalone/apps/web/public/notion-white.png +0 -0
  948. package/.next/standalone/apps/web/public/notion.png +0 -0
  949. package/.next/standalone/apps/web/public/vercel.svg +1 -0
  950. package/.next/standalone/apps/web/scripts/prepare-standalone.mjs +153 -0
  951. package/.next/standalone/apps/web/server.js +44 -0
  952. package/.next/standalone/apps/web/store/chat-store.ts +19 -0
  953. package/.next/standalone/apps/web/store/connections-store.ts +276 -0
  954. package/.next/standalone/apps/web/store/deploy-store.ts +90 -0
  955. package/.next/standalone/apps/web/store/scrape-store.ts +76 -0
  956. package/.next/standalone/apps/web/tsconfig.json +41 -0
  957. package/.next/standalone/apps/web/verify-models.mjs +133 -0
  958. package/.next/standalone/apps/web/vitest.config.ts +15 -0
  959. package/package.json +1 -1
@@ -0,0 +1,1275 @@
1
+ 'use client';
2
+
3
+ import { useMemo, useState, useEffect, useRef } from 'react';
4
+ import { toast } from 'sonner';
5
+ import {
6
+ RECENT_ADD_HISTORY_CLEARED_EVENT,
7
+ SCRAPE_RECENT_QUERIES_STORAGE_KEY,
8
+ } from '@/lib/browser-cache';
9
+ import { formatErrorMessage } from '@/lib/shared/error-formatter';
10
+ import {
11
+ Globe,
12
+ Loader2,
13
+ Search,
14
+ ChevronDown,
15
+ ChevronsDown,
16
+ Info,
17
+ Clock,
18
+ X,
19
+ Trash2,
20
+ Settings,
21
+ Plus,
22
+ ChevronLeft,
23
+ ChevronRight,
24
+ } from 'lucide-react';
25
+ import { useScrapeStore, type SearchState } from '@/store/scrape-store';
26
+ import type { CrawlJob, CrawlScope, SearchResultItem } from '@larkup/core/types';
27
+ import { Button } from '@/components/ui/button';
28
+ import { Input } from '@/components/ui/input';
29
+ import { Label } from '@/components/ui/label';
30
+ import { Checkbox } from '@/components/ui/checkbox';
31
+
32
+ import { Switch } from '@/components/ui/switch';
33
+ import {
34
+ Select,
35
+ SelectContent,
36
+ SelectItem,
37
+ SelectTrigger,
38
+ SelectValue,
39
+ } from '@/components/ui/select';
40
+ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';
41
+ import { cn } from '@/lib/utils';
42
+ import useSWR from 'swr';
43
+ import { useRouter } from 'next/navigation';
44
+ import type { RagConfig } from '@larkup/core/types';
45
+ import type { DataPrimaryAction } from '@/components/data/data-primary-action';
46
+ import { DataEntryModeSwitch } from '@/components/data/data-entry-mode-switch';
47
+
48
+ const fetcher = (url: string) => fetch(url).then((r) => r.json() as Promise<{ config: RagConfig }>);
49
+
50
+ type LocalCrawlerState = {
51
+ running: boolean;
52
+ mode?: 'native' | 'firecrawl';
53
+ lastError?: string;
54
+ };
55
+
56
+ type LocalCrawlerResponse = {
57
+ state: LocalCrawlerState;
58
+ starting?: boolean;
59
+ };
60
+
61
+ function domainOf(url: string) {
62
+ try {
63
+ return new URL(url).hostname;
64
+ } catch {
65
+ return url;
66
+ }
67
+ }
68
+
69
+ function formatDuration(seconds: number): string {
70
+ if (seconds < 60) return `~${Math.ceil(seconds)}s`;
71
+ if (seconds < 3600) return `~${Math.ceil(seconds / 60)}min`;
72
+ const h = Math.floor(seconds / 3600);
73
+ const m = Math.ceil((seconds % 3600) / 60);
74
+ return `~${h}h ${m}min`;
75
+ }
76
+
77
+ /** Estimate ETL duration based on URL count, scope, and page limit */
78
+ function estimateEtlDuration(
79
+ urlCount: number,
80
+ scope: CrawlScope,
81
+ pageLimit: number,
82
+ ): { totalPages: number; estimatedSeconds: number } {
83
+ const pagesPerUrl = scope === 'domain' ? pageLimit : 1;
84
+ const totalPages = urlCount * pagesPerUrl;
85
+ const perPageSeconds = scope === 'domain' ? 5 : 3;
86
+ const estimatedSeconds = totalPages * perPageSeconds;
87
+ return { totalPages, estimatedSeconds };
88
+ }
89
+
90
+ export function ScrapePanel({
91
+ disabled,
92
+ onStarted,
93
+ onActionChange,
94
+ groupId,
95
+ }: {
96
+ disabled?: boolean;
97
+ onStarted: (job: CrawlJob) => void;
98
+ onActionChange?: (action: DataPrimaryAction | null) => void;
99
+ groupId?: string;
100
+ }) {
101
+ const groupIdRef = useRef(groupId ?? 'default');
102
+ groupIdRef.current = groupId ?? 'default';
103
+ const router = useRouter();
104
+ const {
105
+ query,
106
+ setQuery,
107
+ searchState,
108
+ setSearchState,
109
+ selected,
110
+ setSelected,
111
+ scope,
112
+ setScope,
113
+ pageLimit,
114
+ setPageLimit,
115
+ searchLimit,
116
+ setSearchLimit,
117
+ showAdvanced,
118
+ setShowAdvanced,
119
+ serperTotalForQuery,
120
+ setSerperTotalForQuery,
121
+ flush: flushSearch,
122
+ } = useScrapeStore();
123
+
124
+ const [searching, setSearching] = useState(false);
125
+ const [loadingMore, setLoadingMore] = useState(false);
126
+ const [gatheringAll, setGatheringAll] = useState(false);
127
+ const [gatherProgress, setGatherProgress] = useState(0);
128
+ const [manualUrl, setManualUrl] = useState('');
129
+ const [manualUrlList, setManualUrlList] = useState<string[]>([]);
130
+ const [starting, setStarting] = useState(false);
131
+ /** When true: only the exact custom URLs are scraped — no deep crawl/pagination */
132
+ const [specificUrls, setSpecificUrls] = useState(false);
133
+ const [firecrawlConfigured, setFirecrawlConfigured] = useState<boolean | null>(null);
134
+ const [crawlerState, setCrawlerState] = useState<LocalCrawlerState | null>(null);
135
+ const [crawlerStarting, setCrawlerStarting] = useState(false);
136
+ const crawlerPolling = useRef<Promise<boolean> | null>(null);
137
+ const { data: configData } = useSWR('/api/config', fetcher);
138
+ const activeProvider = configData?.config?.webSearchProvider || 'tavily';
139
+ const crawlerProvider = configData?.config?.webCrawlerProvider || 'local';
140
+ const [cachedQueries, setCachedQueries] = useState<string[]>([]);
141
+ const [showDropdown, setShowDropdown] = useState(false);
142
+ const [displayPage, setDisplayPage] = useState(1);
143
+ const inputRef = useRef<HTMLInputElement>(null);
144
+ const dropdownRef = useRef<HTMLDivElement>(null);
145
+
146
+ function showCrawlerSettings() {
147
+ toast.error('Web crawler is not available. Choose a crawler provider in Settings.', {
148
+ action: {
149
+ label: 'Open settings',
150
+ onClick: () => router.push('/settings?section=general#web-crawler'),
151
+ },
152
+ });
153
+ }
154
+
155
+ async function readCrawlerStatus(): Promise<LocalCrawlerResponse> {
156
+ const res = await fetch('/api/firecrawl/local', { cache: 'no-store' });
157
+ const body = (await res.json()) as LocalCrawlerResponse & { error?: string };
158
+ if (!res.ok) throw new Error(body.error || 'Could not read crawler status.');
159
+ setCrawlerState(body.state);
160
+ setCrawlerStarting(Boolean(body.starting));
161
+ return body;
162
+ }
163
+
164
+ function pollCrawlerUntilReady(): Promise<boolean> {
165
+ if (crawlerPolling.current) return crawlerPolling.current;
166
+
167
+ crawlerPolling.current = (async () => {
168
+ for (let attempt = 0; attempt < 45; attempt++) {
169
+ await new Promise((resolve) => setTimeout(resolve, 2_000));
170
+ const status = await readCrawlerStatus();
171
+ if (status.state.running) return true;
172
+ if (!status.starting) return false;
173
+ }
174
+ setCrawlerStarting(false);
175
+ setCrawlerState((current) => ({
176
+ ...(current ?? { running: false }),
177
+ lastError: 'The website crawler is still starting. Try again in a moment.',
178
+ }));
179
+ return false;
180
+ })().finally(() => {
181
+ crawlerPolling.current = null;
182
+ });
183
+
184
+ return crawlerPolling.current;
185
+ }
186
+
187
+ async function warmCrawler(): Promise<LocalCrawlerResponse | null> {
188
+ if (crawlerProvider === 'cloud') return null;
189
+ try {
190
+ const res = await fetch('/api/firecrawl/local', {
191
+ method: 'POST',
192
+ headers: { 'Content-Type': 'application/json' },
193
+ body: JSON.stringify({ action: 'start' }),
194
+ });
195
+ const body = (await res.json()) as LocalCrawlerResponse & { error?: string };
196
+ if (!res.ok) throw new Error(body.error || 'Could not prepare the crawler.');
197
+ setCrawlerState(body.state);
198
+ setCrawlerStarting(Boolean(body.starting));
199
+ if (body.starting) void pollCrawlerUntilReady();
200
+ return body;
201
+ } catch (error) {
202
+ setCrawlerStarting(false);
203
+ setCrawlerState((current) => ({
204
+ ...(current ?? { running: false }),
205
+ lastError: formatErrorMessage(error),
206
+ }));
207
+ return null;
208
+ }
209
+ }
210
+
211
+ async function ensureCrawlerReady() {
212
+ if (crawlerProvider === 'cloud') return true;
213
+ if (crawlerState?.running) return true;
214
+
215
+ const started = await warmCrawler();
216
+ if (!started) return false;
217
+ if (started.state.running) return true;
218
+ // Keep a slow runtime startup in the background without making the Add
219
+ // website action look frozen. The built-in crawler normally starts at once.
220
+ const ready = started.starting
221
+ ? await Promise.race([
222
+ pollCrawlerUntilReady(),
223
+ new Promise<false>((resolve) => setTimeout(() => resolve(false), 8_000)),
224
+ ])
225
+ : false;
226
+ if (!ready && started.starting) return true;
227
+ if (!ready) {
228
+ toast.error(started.state.lastError || 'The website crawler is not ready yet.');
229
+ }
230
+ return ready;
231
+ }
232
+
233
+ useEffect(() => {
234
+ function handleClickOutside(event: MouseEvent) {
235
+ if (
236
+ inputRef.current &&
237
+ !inputRef.current.contains(event.target as Node) &&
238
+ dropdownRef.current &&
239
+ !dropdownRef.current.contains(event.target as Node)
240
+ ) {
241
+ setShowDropdown(false);
242
+ }
243
+ }
244
+ document.addEventListener('mousedown', handleClickOutside);
245
+ return () => document.removeEventListener('mousedown', handleClickOutside);
246
+ }, []);
247
+
248
+ useEffect(() => {
249
+ try {
250
+ const saved = localStorage.getItem(SCRAPE_RECENT_QUERIES_STORAGE_KEY);
251
+ if (saved) setCachedQueries(JSON.parse(saved));
252
+ } catch {
253
+ // ignore
254
+ }
255
+ }, []);
256
+
257
+ useEffect(() => {
258
+ const clearRecentQueries = () => {
259
+ setCachedQueries([]);
260
+ setShowDropdown(false);
261
+ };
262
+ const handleStorage = (event: StorageEvent) => {
263
+ if (event.key === SCRAPE_RECENT_QUERIES_STORAGE_KEY || event.key === null) {
264
+ clearRecentQueries();
265
+ }
266
+ };
267
+ window.addEventListener(RECENT_ADD_HISTORY_CLEARED_EVENT, clearRecentQueries);
268
+ window.addEventListener('storage', handleStorage);
269
+ return () => {
270
+ window.removeEventListener(RECENT_ADD_HISTORY_CLEARED_EVENT, clearRecentQueries);
271
+ window.removeEventListener('storage', handleStorage);
272
+ };
273
+ }, []);
274
+
275
+ function saveQuery(q: string) {
276
+ const trimmed = q.trim();
277
+ if (!trimmed) return;
278
+ setCachedQueries((prev) => {
279
+ const newCache = [trimmed, ...prev.filter((item) => item !== trimmed)].slice(0, 10);
280
+ try {
281
+ localStorage.setItem(SCRAPE_RECENT_QUERIES_STORAGE_KEY, JSON.stringify(newCache));
282
+ } catch {
283
+ // ignore
284
+ }
285
+ return newCache;
286
+ });
287
+ }
288
+
289
+ function removeQuery(q: string, e: React.MouseEvent) {
290
+ e.stopPropagation();
291
+ setCachedQueries((prev) => {
292
+ const newCache = prev.filter((item) => item !== q);
293
+ try {
294
+ localStorage.setItem(SCRAPE_RECENT_QUERIES_STORAGE_KEY, JSON.stringify(newCache));
295
+ } catch {
296
+ // ignore
297
+ }
298
+ return newCache;
299
+ });
300
+ }
301
+
302
+ useEffect(() => {
303
+ // Check the selected web-search provider.
304
+ fetch('/api/search')
305
+ .then((r) => r.json())
306
+ .then((d) => setFirecrawlConfigured(d.configured ?? false))
307
+ .catch(() => setFirecrawlConfigured(false));
308
+ }, []);
309
+
310
+ useEffect(() => {
311
+ if (crawlerProvider !== 'local') return;
312
+ void (async () => {
313
+ try {
314
+ const status = await readCrawlerStatus();
315
+ if (!status.state.running) await warmCrawler();
316
+ } catch {
317
+ await warmCrawler();
318
+ }
319
+ })();
320
+ }, [crawlerProvider]);
321
+
322
+ const selectedUrls = useMemo(() => Object.keys(selected).filter((u) => selected[u]), [selected]);
323
+
324
+ /** Search through the configured crawler endpoint. */
325
+ async function searchFirecrawl(q: string, isMulti: boolean) {
326
+ try {
327
+ const res = await fetch('/api/search', {
328
+ method: 'POST',
329
+ headers: { 'Content-Type': 'application/json' },
330
+ body: JSON.stringify({ query: q, limit: searchLimit }),
331
+ });
332
+ const data = await res.json();
333
+ if (!res.ok) throw new Error(data.error ?? 'Search failed');
334
+ const newItems = (data.results as SearchResultItem[]) ?? [];
335
+
336
+ setSearchState((prev) => {
337
+ const existingResults = prev ? prev.results : [];
338
+ const existingUrls = new Set(existingResults.map((r) => r.url));
339
+ const fresh = newItems.filter((r) => !existingUrls.has(r.url));
340
+ return {
341
+ results: [...existingResults, ...fresh],
342
+ totalResults: isMulti ? (prev?.totalResults ?? 0) + fresh.length : fresh.length,
343
+ totalResultsIsEstimate: false,
344
+ currentPage: 1,
345
+ totalPages: 1,
346
+ hasMore: false,
347
+ query: isMulti ? 'Multiple queries' : q,
348
+ searchProvider: 'firecrawl',
349
+ };
350
+ });
351
+
352
+ const newSelected = Object.fromEntries(newItems.map((r) => [r.url, true]));
353
+ setSelected((prev) => ({ ...prev, ...newSelected }));
354
+
355
+ if (newItems.length === 0 && !isMulti) toast.message('No results. Try different keywords.');
356
+
357
+ if (activeProvider && !isMulti) {
358
+ fetchProviderTotalCount(q, activeProvider);
359
+ }
360
+ } catch (err) {
361
+ const message = formatErrorMessage(err);
362
+ if (/crawler|firecrawl|not running|api key/i.test(message)) {
363
+ showCrawlerSettings();
364
+ } else {
365
+ toast.error(message);
366
+ }
367
+ }
368
+ }
369
+
370
+ /** Search using generic provider. */
371
+ async function searchGeneric(
372
+ q: string,
373
+ provider: string,
374
+ page: number,
375
+ isMulti: boolean,
376
+ appendPagination = false,
377
+ ) {
378
+ if (appendPagination) {
379
+ setLoadingMore(true);
380
+ }
381
+
382
+ const endpoint =
383
+ provider === 'serper' || provider === 'google'
384
+ ? '/api/search/google'
385
+ : provider === 'brave'
386
+ ? '/api/search/brave'
387
+ : provider === 'bing'
388
+ ? '/api/search/bing'
389
+ : provider === 'tavily'
390
+ ? '/api/search/tavily'
391
+ : provider === 'exa'
392
+ ? '/api/search/exa'
393
+ : null;
394
+
395
+ if (!endpoint) {
396
+ toast.error('Invalid search provider');
397
+ if (appendPagination) setLoadingMore(false);
398
+ return;
399
+ }
400
+
401
+ try {
402
+ const res = await fetch(endpoint, {
403
+ method: 'POST',
404
+ headers: { 'Content-Type': 'application/json' },
405
+ body: JSON.stringify({ query: q, page }),
406
+ });
407
+ const data = await res.json();
408
+
409
+ if (!res.ok) throw new Error(data.error ?? 'Search failed');
410
+
411
+ const newItems: SearchResultItem[] = (data.items ?? []).map(
412
+ (item: { url: string; title: string; description?: string }) => ({
413
+ url: item.url,
414
+ title: item.title || item.url,
415
+ description: item.description,
416
+ }),
417
+ );
418
+
419
+ setSearchState((prev) => {
420
+ const existingResults = prev ? prev.results : [];
421
+ const existingUrls = new Set(existingResults.map((r) => r.url));
422
+ const fresh = newItems.filter((r) => !existingUrls.has(r.url));
423
+ return {
424
+ results: [...existingResults, ...fresh],
425
+ totalResults: (prev?.totalResults ?? 0) + (data.totalResults ?? 0),
426
+ totalResultsIsEstimate: data.totalResultsIsEstimate ?? true,
427
+ currentPage: data.currentPage ?? page,
428
+ totalPages: data.totalPages ?? 1,
429
+ hasMore: data.hasMore ?? false,
430
+ query: data.query ?? q,
431
+ searchProvider: provider as any,
432
+ };
433
+ });
434
+
435
+ const newSelected = Object.fromEntries(newItems.map((r) => [r.url, true]));
436
+ setSelected((prev) => ({ ...prev, ...newSelected }));
437
+
438
+ if (!isMulti) {
439
+ // Update total
440
+ setSerperTotalForQuery({
441
+ query: q,
442
+ total: data.totalResults ?? 0,
443
+ totalPages: data.totalPages ?? 1,
444
+ });
445
+ }
446
+
447
+ if (page === 1 && newItems.length === 0 && !isMulti) {
448
+ toast.message('No results. Try different keywords.');
449
+ }
450
+ } catch (err) {
451
+ if (page === 1) throw err;
452
+ toast.error(formatErrorMessage(err));
453
+ } finally {
454
+ if (appendPagination) setLoadingMore(false);
455
+ }
456
+ }
457
+
458
+ /** Fetch total count from provider without using it for results (saves on Firecrawl credits) */
459
+ async function fetchProviderTotalCount(q: string, provider: string) {
460
+ const endpoint =
461
+ provider === 'serper' || provider === 'google'
462
+ ? '/api/search/google'
463
+ : provider === 'brave'
464
+ ? '/api/search/brave'
465
+ : provider === 'bing'
466
+ ? '/api/search/bing'
467
+ : provider === 'tavily'
468
+ ? '/api/search/tavily'
469
+ : provider === 'exa'
470
+ ? '/api/search/exa'
471
+ : null;
472
+
473
+ if (!endpoint) return;
474
+
475
+ try {
476
+ const res = await fetch(endpoint, {
477
+ method: 'POST',
478
+ headers: { 'Content-Type': 'application/json' },
479
+ body: JSON.stringify({ query: q, page: 1 }),
480
+ });
481
+ const data = await res.json();
482
+ if (res.ok) {
483
+ setSerperTotalForQuery({
484
+ query: q,
485
+ total: data.totalResults ?? 0,
486
+ totalPages: data.totalPages ?? 1,
487
+ });
488
+ }
489
+ } catch {
490
+ // Silent fail — count is optional
491
+ }
492
+ }
493
+
494
+ async function runSearch() {
495
+ setShowDropdown(false);
496
+ if (!query.trim()) {
497
+ toast.error('Enter one or more keywords to search.');
498
+ return;
499
+ }
500
+
501
+ setSerperTotalForQuery(null);
502
+ saveQuery(query);
503
+
504
+ const queries = query
505
+ .split(',')
506
+ .map((q) => q.trim())
507
+ .filter(Boolean);
508
+ if (queries.length === 0) return;
509
+
510
+ setSearching(true);
511
+ setDisplayPage(1);
512
+ // Removed setSearchState(null) so we append instead of clear
513
+
514
+ try {
515
+ if (activeProvider === 'local' || !activeProvider) {
516
+ if (!(await ensureCrawlerReady())) return;
517
+ await Promise.all(queries.map((q) => searchFirecrawl(q, queries.length > 1)));
518
+ } else {
519
+ try {
520
+ await Promise.all(
521
+ queries.map((q) => searchGeneric(q, activeProvider, 1, queries.length > 1, false)),
522
+ );
523
+ } catch (err) {
524
+ toast.info('Using local crawler…');
525
+ if (!(await ensureCrawlerReady())) return;
526
+ await Promise.all(queries.map((q) => searchFirecrawl(q, queries.length > 1)));
527
+ }
528
+ }
529
+ } finally {
530
+ setSearching(false);
531
+ }
532
+ }
533
+
534
+ async function loadNextPage() {
535
+ if (!searchState?.hasMore || loadingMore) return;
536
+ if (searchState.searchProvider !== 'firecrawl') {
537
+ await searchGeneric(
538
+ searchState.query,
539
+ searchState.searchProvider,
540
+ searchState.currentPage + 1,
541
+ false,
542
+ true,
543
+ );
544
+ }
545
+ }
546
+
547
+ /** Automatically paginate through ALL available provider results. */
548
+ async function gatherAll() {
549
+ if (!searchState || searchState.searchProvider === 'firecrawl') return;
550
+ setGatheringAll(true);
551
+ setGatherProgress(searchState.currentPage);
552
+
553
+ let page = searchState.currentPage + 1;
554
+ const total = searchState.totalPages;
555
+ const provider = searchState.searchProvider;
556
+
557
+ const endpoint =
558
+ provider === 'serper' || provider === 'google'
559
+ ? '/api/search/google'
560
+ : provider === 'brave'
561
+ ? '/api/search/brave'
562
+ : provider === 'bing'
563
+ ? '/api/search/bing'
564
+ : provider === 'tavily'
565
+ ? '/api/search/tavily'
566
+ : provider === 'exa'
567
+ ? '/api/search/exa'
568
+ : null;
569
+
570
+ try {
571
+ while (page <= total) {
572
+ setGatherProgress(page);
573
+ if (!endpoint) break;
574
+ const res = await fetch(endpoint, {
575
+ method: 'POST',
576
+ headers: { 'Content-Type': 'application/json' },
577
+ body: JSON.stringify({ query: query.trim(), page }),
578
+ });
579
+ const data = await res.json();
580
+ if (!res.ok) throw new Error(data.error ?? 'Search failed');
581
+
582
+ const newItems: SearchResultItem[] = (data.items ?? []).map(
583
+ (item: { url: string; title: string; description?: string }) => ({
584
+ url: item.url,
585
+ title: item.title || item.url,
586
+ description: item.description,
587
+ }),
588
+ );
589
+
590
+ setSearchState((prev) => {
591
+ if (!prev) return prev;
592
+ const existingUrls = new Set(prev.results.map((r) => r.url));
593
+ const fresh = newItems.filter((r) => !existingUrls.has(r.url));
594
+ return {
595
+ ...prev,
596
+ results: [...prev.results, ...fresh],
597
+ totalResultsIsEstimate: data.totalResultsIsEstimate ?? prev.totalResultsIsEstimate,
598
+ currentPage: data.currentPage ?? page,
599
+ totalPages: data.totalPages ?? prev.totalPages,
600
+ hasMore: data.hasMore ?? false,
601
+ };
602
+ });
603
+
604
+ const newSelected = Object.fromEntries(newItems.map((r) => [r.url, true]));
605
+ setSelected((prev) => ({ ...prev, ...newSelected }));
606
+
607
+ if (!data.hasMore) break;
608
+ page++;
609
+ await new Promise((r) => setTimeout(r, 300));
610
+ }
611
+ toast.success('All available results gathered!');
612
+ } catch (err) {
613
+ toast.error(formatErrorMessage(err));
614
+ } finally {
615
+ setGatheringAll(false);
616
+ setGatherProgress(0);
617
+ }
618
+ }
619
+
620
+ function appendManualUrl() {
621
+ const urls = manualUrl
622
+ .split(/[\s,]+/)
623
+ .map((u) => u.trim())
624
+ .filter((u) => /^https?:\/\//i.test(u));
625
+
626
+ if (urls.length > 0) {
627
+ setManualUrlList((prev) => Array.from(new Set([...prev, ...urls])));
628
+ setManualUrl('');
629
+ } else {
630
+ toast.error('Enter at least one full URL starting with http(s)://');
631
+ }
632
+ }
633
+
634
+ function addManual() {
635
+ const currentUrls = manualUrl
636
+ .split(/[\s,]+/)
637
+ .map((u) => u.trim())
638
+ .filter((u) => /^https?:\/\//i.test(u));
639
+
640
+ const allUrls = Array.from(new Set([...manualUrlList, ...currentUrls]));
641
+
642
+ if (allUrls.length === 0) {
643
+ toast.error('Enter at least one full URL starting with http(s)://');
644
+ return;
645
+ }
646
+
647
+ void startJob(allUrls, true).then((success) => {
648
+ if (success) {
649
+ setManualUrl('');
650
+ setManualUrlList([]);
651
+ }
652
+ });
653
+ }
654
+
655
+ const handleFileUpload = (e: React.ChangeEvent<HTMLInputElement>) => {
656
+ const file = e.target.files?.[0];
657
+ if (!file) return;
658
+ const reader = new FileReader();
659
+ reader.onload = (e) => {
660
+ const text = e.target?.result as string;
661
+ if (text) {
662
+ setManualUrl((prev) => prev + (prev ? '\n' : '') + text);
663
+ }
664
+ };
665
+ reader.readAsText(file);
666
+ e.target.value = ''; // reset input
667
+ };
668
+
669
+ /** Open confirm modal before starting ETL */
670
+ function handleStartClick() {
671
+ if (selectedUrls.length === 0) {
672
+ toast.error('Select at least one URL to scrape.');
673
+ return;
674
+ }
675
+ void startJob();
676
+ }
677
+
678
+ async function startJob(urls = selectedUrls, exactUrls = false) {
679
+ setStarting(true);
680
+ const effectiveScope: CrawlScope = specificUrls || exactUrls ? 'page' : scope;
681
+ try {
682
+ if (!(await ensureCrawlerReady())) return;
683
+ const res = await fetch('/api/jobs', {
684
+ method: 'POST',
685
+ headers: { 'Content-Type': 'application/json' },
686
+ body: JSON.stringify({
687
+ keywords: query || urls[0],
688
+ pageLimit: specificUrls || exactUrls ? 1 : pageLimit,
689
+ targets: urls.map((url) => ({ url, scope: effectiveScope })),
690
+ groupId: groupIdRef.current,
691
+ }),
692
+ });
693
+ const data = await res.json();
694
+ if (!res.ok) {
695
+ if (res.status === 409 && data.code === 'already_scraped') {
696
+ toast.info('Already in your knowledge base', {
697
+ description: 'This URL has already been scraped and added.',
698
+ });
699
+ return false;
700
+ }
701
+ throw new Error(data.error ?? 'Could not start job');
702
+ }
703
+
704
+ toast.success('Website added', {
705
+ description: 'We’ll finish it in the background.',
706
+ duration: 8000,
707
+ });
708
+
709
+ setSelected({});
710
+ setSearchState((prev) => {
711
+ if (!prev) return prev;
712
+ const urlSet = new Set(urls);
713
+ return {
714
+ ...prev,
715
+ results: prev.results.filter((r) => !urlSet.has(r.url)),
716
+ };
717
+ });
718
+ onStarted(data.job as CrawlJob);
719
+ return true;
720
+ } catch (err) {
721
+ toast.error(formatErrorMessage(err));
722
+ return false;
723
+ } finally {
724
+ setStarting(false);
725
+ }
726
+ }
727
+
728
+ const results = searchState?.results ?? [];
729
+ const gatherAllAvailable =
730
+ searchState?.searchProvider !== 'firecrawl' && searchState?.hasMore && !gatheringAll;
731
+
732
+ const ITEMS_PER_PAGE = 5;
733
+ const totalDisplayPages = Math.max(1, Math.ceil(results.length / ITEMS_PER_PAGE));
734
+ const currentDisplayResults = results.slice(
735
+ (displayPage - 1) * ITEMS_PER_PAGE,
736
+ displayPage * ITEMS_PER_PAGE,
737
+ );
738
+
739
+ useEffect(() => {
740
+ if (displayPage > totalDisplayPages && totalDisplayPages > 0) {
741
+ setDisplayPage(totalDisplayPages);
742
+ }
743
+ }, [totalDisplayPages, displayPage]);
744
+
745
+ const [manualUrlPage, setManualUrlPage] = useState(1);
746
+ const MANUAL_URL_PAGE_SIZE = 10;
747
+ const totalManualPages = Math.max(1, Math.ceil(manualUrlList.length / MANUAL_URL_PAGE_SIZE));
748
+ const currentManualUrls = manualUrlList.slice(
749
+ (manualUrlPage - 1) * MANUAL_URL_PAGE_SIZE,
750
+ manualUrlPage * MANUAL_URL_PAGE_SIZE,
751
+ );
752
+
753
+ useEffect(() => {
754
+ if (manualUrlPage > totalManualPages && totalManualPages > 0) {
755
+ setManualUrlPage(totalManualPages);
756
+ }
757
+ }, [totalManualPages, manualUrlPage]);
758
+
759
+ // Estimate for confirmation modal
760
+ const effectiveScopeForEstimate: CrawlScope = specificUrls ? 'page' : scope;
761
+ const estimate = useMemo(
762
+ () =>
763
+ estimateEtlDuration(
764
+ selectedUrls.length,
765
+ effectiveScopeForEstimate,
766
+ specificUrls ? 1 : pageLimit,
767
+ ),
768
+ [selectedUrls.length, effectiveScopeForEstimate, specificUrls, pageLimit],
769
+ );
770
+
771
+ const [inputMode, setInputMode] = useState<'search' | 'url'>('url');
772
+
773
+ useEffect(() => {
774
+ const hasSelection = selectedUrls.length > 0;
775
+ const isUrl = inputMode === 'url';
776
+ const currentUrls = manualUrl.split(/[\s,]+/).filter((u) => /^https?:\/\//i.test(u));
777
+ const allUrls = Array.from(new Set([...manualUrlList, ...currentUrls]));
778
+ const urlCount = allUrls.length;
779
+
780
+ onActionChange?.({
781
+ label: isUrl
782
+ ? urlCount > 1
783
+ ? 'Add websites'
784
+ : 'Add website'
785
+ : hasSelection
786
+ ? 'Add selected'
787
+ : 'Search topic',
788
+ onClick: () => {
789
+ if (isUrl) void addManual();
790
+ else if (hasSelection) handleStartClick();
791
+ else void runSearch();
792
+ },
793
+ disabled: disabled || (isUrl ? urlCount === 0 : !hasSelection && !query.trim()),
794
+ loading: searching || starting,
795
+ });
796
+ return () => onActionChange?.(null);
797
+ }, [
798
+ disabled,
799
+ inputMode,
800
+ manualUrl,
801
+ manualUrlList,
802
+ query,
803
+ searching,
804
+ starting,
805
+ selectedUrls.length,
806
+ groupId,
807
+ onActionChange,
808
+ ]);
809
+
810
+ return (
811
+ <div className="space-y-4">
812
+ {/* Unified input area */}
813
+ <div className="space-y-3">
814
+ {/* Mode toggle + input */}
815
+ <div className="flex items-center gap-2">
816
+ <DataEntryModeSwitch
817
+ label="Website source"
818
+ value={inputMode}
819
+ onValueChange={(value) => setInputMode(value as 'search' | 'url')}
820
+ options={[
821
+ { value: 'url', label: 'Direct URL', icon: Globe },
822
+ { value: 'search', label: 'Search', icon: Search },
823
+ ]}
824
+ />
825
+
826
+ {/* Input field */}
827
+ <div className="relative flex-1 flex items-center gap-2">
828
+ {inputMode === 'search' ? (
829
+ <div className="relative flex-1">
830
+ <Search className="absolute left-3 top-1/2 -translate-y-1/2 size-4 text-muted-foreground z-10 pointer-events-none" />
831
+ <Input
832
+ ref={inputRef}
833
+ id="kw"
834
+ autoComplete="off"
835
+ placeholder='Search for websites, e.g. "Who is the best player in the world?"'
836
+ value={query}
837
+ disabled={disabled}
838
+ className="pl-9 h-11 pr-22 bg-white"
839
+ onChange={(e) => {
840
+ setQuery(e.target.value);
841
+ setShowDropdown(true);
842
+ }}
843
+ onFocus={() => {
844
+ setShowDropdown(true);
845
+ void warmCrawler();
846
+ }}
847
+ onKeyDown={(e) => {
848
+ if (e.key === 'Enter') {
849
+ setShowDropdown(false);
850
+ runSearch();
851
+ }
852
+ }}
853
+ />
854
+ {showDropdown && cachedQueries.length > 0 && (
855
+ <div
856
+ ref={dropdownRef}
857
+ className="absolute z-10 top-full left-0 mt-1 w-full rounded-md border border-border bg-popover overflow-hidden"
858
+ >
859
+ <div className="py-1">
860
+ {cachedQueries.map((cq) => (
861
+ <div
862
+ key={cq}
863
+ className="flex items-center justify-between px-3 py-1.5 text-sm hover:bg-muted cursor-pointer group"
864
+ onClick={() => {
865
+ setQuery(cq);
866
+ setShowDropdown(false);
867
+ }}
868
+ >
869
+ <div className="flex items-center gap-2 truncate mr-2">
870
+ <Clock className="size-3 text-muted-foreground shrink-0" />
871
+ <span className="truncate text-xs">{cq}</span>
872
+ </div>
873
+ <button
874
+ className="text-muted-foreground hover:text-foreground opacity-0 group-hover:opacity-100 transition-opacity p-0.5"
875
+ onClick={(e) => removeQuery(cq, e)}
876
+ >
877
+ <X className="size-3" />
878
+ </button>
879
+ </div>
880
+ ))}
881
+ </div>
882
+ </div>
883
+ )}
884
+ </div>
885
+ ) : (
886
+ <>
887
+ <div className="relative flex-1 flex flex-col gap-2">
888
+ <div className="flex items-center gap-2">
889
+ <div className="relative flex-1">
890
+ <Globe className="absolute left-3 top-1/2 -translate-y-1/2 size-4 text-muted-foreground z-10 pointer-events-none" />
891
+ <Input
892
+ placeholder="Paste URLs (comma or space separated)"
893
+ value={manualUrl}
894
+ disabled={disabled}
895
+ className="pl-9 h-11 pr-16 bg-white"
896
+ onChange={(e) => setManualUrl(e.target.value)}
897
+ onFocus={() => void warmCrawler()}
898
+ onKeyDown={(e) => e.key === 'Enter' && appendManualUrl()}
899
+ />
900
+ </div>
901
+ <Button
902
+ size="icon"
903
+ className="h-11 w-11 shrink-0"
904
+ variant="outline"
905
+ onClick={() => appendManualUrl()}
906
+ disabled={disabled || !manualUrl.trim()}
907
+ >
908
+ <Plus className="size-4" />
909
+ </Button>
910
+ </div>
911
+ </div>
912
+ </>
913
+ )}
914
+ </div>
915
+ </div>
916
+ </div>
917
+
918
+ {/* No provider configured hint */}
919
+ {firecrawlConfigured === false && !activeProvider && (
920
+ <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">
921
+ <Info className="mt-0.5 size-3.5 shrink-0" />
922
+ <span>
923
+ <strong className="text-foreground">No search provider configured.</strong> Set up Use
924
+ Larkup’s built-in crawler or configure a Web Search provider in Settings.
925
+ </span>
926
+ </div>
927
+ )}
928
+
929
+ {/* Minimal Action Row */}
930
+ <div className="flex items-center justify-between mt-2">
931
+ <div className="flex items-center gap-2">
932
+ <button
933
+ type="button"
934
+ onClick={() => setShowAdvanced(!showAdvanced)}
935
+ className="flex items-center gap-1.5 text-xs text-muted-foreground hover:text-foreground transition-colors"
936
+ >
937
+ {showAdvanced ? (
938
+ <ChevronDown className="size-3.5" />
939
+ ) : (
940
+ <ChevronsDown className="size-3.5" />
941
+ )}
942
+ {showAdvanced ? 'Hide advanced settings' : 'Advanced settings'}
943
+ </button>
944
+ </div>
945
+
946
+ {/* Estimation inline */}
947
+ {selectedUrls.length > 0 && (
948
+ <span className="text-xs text-muted-foreground flex items-center gap-1.5 ml-auto">
949
+ <Clock className="size-3" />
950
+ {specificUrls
951
+ ? `${selectedUrls.length} URL${selectedUrls.length !== 1 ? 's' : ''}`
952
+ : `~${estimate.totalPages.toLocaleString()} pages · ${formatDuration(
953
+ estimate.estimatedSeconds,
954
+ )}`}
955
+ </span>
956
+ )}
957
+ </div>
958
+
959
+ {/* Advanced Settings Collapsible */}
960
+ {showAdvanced && (
961
+ <div className="flex flex-col gap-4 w-full rounded-lg border border-border bg-muted/30 p-3 mt-2 animate-in slide-in-from-top-2 fade-in duration-200">
962
+ <div className="flex flex-wrap items-center justify-between gap-4">
963
+ <div className="flex ">
964
+ <div className="flex items-center gap-2">
965
+ <Label className="text-xs text-muted-foreground">Scope</Label>
966
+ <Select
967
+ defaultValue={scope}
968
+ value={scope}
969
+ onValueChange={(v) => setScope(v as CrawlScope)}
970
+ disabled={specificUrls || disabled}
971
+ >
972
+ <SelectTrigger className="w-52 bg-white h-8 text-xs">
973
+ <SelectValue />
974
+ </SelectTrigger>
975
+ <SelectContent>
976
+ <SelectItem value="page">Scrape pages only</SelectItem>
977
+ <SelectItem value="domain">Crawl whole domain</SelectItem>
978
+ </SelectContent>
979
+ </Select>
980
+ </div>
981
+
982
+ {scope === 'domain' && !specificUrls && (
983
+ <div className="flex items-center gap-2">
984
+ <Label htmlFor="limit" className="text-xs text-muted-foreground ml-4">
985
+ Max pages
986
+ </Label>
987
+ <Input
988
+ id="limit"
989
+ type="number"
990
+ min={1}
991
+ max={500}
992
+ value={pageLimit}
993
+ disabled={specificUrls || disabled}
994
+ onChange={(e) => setPageLimit(Number(e.target.value) || 1)}
995
+ className="w-20 h-8 tabular-nums text-xs ml-2"
996
+ />
997
+ </div>
998
+ )}
999
+
1000
+ {inputMode === 'search' && (
1001
+ <div className="flex items-center gap-2">
1002
+ <Label htmlFor="search-limit" className="text-xs text-muted-foreground ml-4">
1003
+ Max results
1004
+ </Label>
1005
+ <Input
1006
+ id="search-limit"
1007
+ type="number"
1008
+ min={1}
1009
+ max={100}
1010
+ value={searchLimit}
1011
+ disabled={disabled}
1012
+ onChange={(e) => setSearchLimit(Number(e.target.value) || 1)}
1013
+ className="w-20 h-8 tabular-nums text-xs ml-2"
1014
+ />
1015
+ </div>
1016
+ )}
1017
+
1018
+ <div className="flex items-center gap-2 ml-4">
1019
+ <Switch
1020
+ id="specific-urls-inline"
1021
+ checked={specificUrls}
1022
+ onCheckedChange={setSpecificUrls}
1023
+ disabled={disabled}
1024
+ size="sm"
1025
+ />
1026
+ <Label
1027
+ htmlFor="specific-urls-inline"
1028
+ className="text-xs font-medium cursor-pointer flex items-center gap-1"
1029
+ >
1030
+ Exact URLs only
1031
+ <TooltipProvider delay={0}>
1032
+ <Tooltip>
1033
+ <TooltipTrigger
1034
+ type="button"
1035
+ className="text-muted-foreground hover:text-foreground"
1036
+ onClick={(e) => e.preventDefault()}
1037
+ >
1038
+ <Info className="size-3" />
1039
+ </TooltipTrigger>
1040
+ <TooltipContent>
1041
+ <p className="max-w-50 text-center">
1042
+ Scrape exact URLs only — no deep crawl or pagination.
1043
+ </p>
1044
+ </TooltipContent>
1045
+ </Tooltip>
1046
+ </TooltipProvider>
1047
+ </Label>
1048
+ </div>
1049
+ </div>
1050
+ <TooltipProvider delay={0}>
1051
+ <Tooltip>
1052
+ <TooltipTrigger
1053
+ type="button"
1054
+ className="text-muted-foreground hover:text-foreground p-1 rounded-md hover:bg-muted transition-colors"
1055
+ onClick={() => router.push('/settings?section=search-web')}
1056
+ >
1057
+ <Settings className="size-3.5" />
1058
+ </TooltipTrigger>
1059
+ <TooltipContent className="max-w-xs text-xs">
1060
+ <p>
1061
+ Customize your web search provider, or set up a custom proxy to help bypass
1062
+ scraping blocks.
1063
+ </p>
1064
+ </TooltipContent>
1065
+ </Tooltip>
1066
+ </TooltipProvider>
1067
+ </div>
1068
+ </div>
1069
+ )}
1070
+
1071
+ {manualUrlList.length > 0 && inputMode === 'url' && (
1072
+ <div className="rounded-md border border-border bg-card overflow-hidden mt-2 animate-in slide-in-from-top-2 fade-in duration-200">
1073
+ <table className="w-full text-xs">
1074
+ <thead>
1075
+ <tr className="border-b border-border bg-muted/50">
1076
+ <th className="py-2 pl-3 text-left font-medium text-muted-foreground">URL</th>
1077
+ <th className="py-2 pr-3 text-right font-medium text-muted-foreground w-12">
1078
+ Action
1079
+ </th>
1080
+ </tr>
1081
+ </thead>
1082
+ <tbody>
1083
+ {currentManualUrls.map((url) => (
1084
+ <tr
1085
+ key={url}
1086
+ className="border-b border-border/50 last:border-0 hover:bg-muted/30 transition-colors"
1087
+ >
1088
+ <td className="py-2 pl-3">
1089
+ <span className="truncate max-w-100 inline-block">{url}</span>
1090
+ </td>
1091
+ <td className="py-2 pr-3 text-right">
1092
+ <button
1093
+ type="button"
1094
+ onClick={() => setManualUrlList((prev) => prev.filter((u) => u !== url))}
1095
+ className="text-muted-foreground hover:text-destructive transition-colors rounded p-1"
1096
+ title="Remove URL"
1097
+ >
1098
+ <Trash2 className="size-3.5" />
1099
+ </button>
1100
+ </td>
1101
+ </tr>
1102
+ ))}
1103
+ </tbody>
1104
+ </table>
1105
+ {totalManualPages > 1 && (
1106
+ <div className="flex items-center justify-between border-t border-border px-3 py-2 text-xs text-muted-foreground bg-muted/20">
1107
+ <span>
1108
+ {(manualUrlPage - 1) * MANUAL_URL_PAGE_SIZE + 1}–
1109
+ {Math.min(manualUrlPage * MANUAL_URL_PAGE_SIZE, manualUrlList.length)} of{' '}
1110
+ {manualUrlList.length}
1111
+ </span>
1112
+ <div className="flex items-center gap-1">
1113
+ <button
1114
+ disabled={manualUrlPage === 1}
1115
+ onClick={() => setManualUrlPage((p) => Math.max(1, p - 1))}
1116
+ className="rounded p-1 hover:bg-muted disabled:opacity-40 transition-colors cursor-pointer"
1117
+ >
1118
+ <ChevronLeft className="size-3.5" />
1119
+ </button>
1120
+ <span className="tabular-nums font-medium mx-1">
1121
+ {manualUrlPage} / {totalManualPages}
1122
+ </span>
1123
+ <button
1124
+ disabled={manualUrlPage >= totalManualPages}
1125
+ onClick={() => setManualUrlPage((p) => Math.min(totalManualPages, p + 1))}
1126
+ className="rounded p-1 hover:bg-muted disabled:opacity-40 transition-colors cursor-pointer"
1127
+ >
1128
+ <ChevronRight className="size-3.5" />
1129
+ </button>
1130
+ </div>
1131
+ </div>
1132
+ )}
1133
+ </div>
1134
+ )}
1135
+
1136
+ {/* Results list */}
1137
+ {results.length > 0 && (
1138
+ <div className="rounded-lg border border-border mb-9">
1139
+ <div className="flex items-center justify-between border-b border-border px-3 py-2">
1140
+ <span className="text-xs font-medium text-muted-foreground">
1141
+ {results.length} source{results.length === 1 ? '' : 's'} · {selectedUrls.length}{' '}
1142
+ selected
1143
+ </span>
1144
+ <div className="flex items-center gap-4">
1145
+ <button
1146
+ type="button"
1147
+ className="text-xs text-primary hover:underline"
1148
+ onClick={() => {
1149
+ const all = selectedUrls.length !== results.length;
1150
+ setSelected(all ? Object.fromEntries(results.map((r) => [r.url, true])) : {});
1151
+ }}
1152
+ >
1153
+ {selectedUrls.length === results.length ? 'Deselect all' : 'Select all'}
1154
+ </button>
1155
+ <button
1156
+ type="button"
1157
+ className="flex items-center gap-1 text-xs text-destructive hover:underline"
1158
+ onClick={flushSearch}
1159
+ >
1160
+ <Trash2 className="size-3.5" />
1161
+ Clear
1162
+ </button>
1163
+ </div>
1164
+ </div>
1165
+ <ul className="divide-y divide-border overflow-y-auto">
1166
+ {currentDisplayResults.map((r) => {
1167
+ const checked = !!selected[r.url];
1168
+ return (
1169
+ <li key={r.url}>
1170
+ <label
1171
+ className={cn(
1172
+ 'flex cursor-pointer items-start gap-3 px-3 py-2.5 transition-colors hover:bg-muted/50',
1173
+ 'bg-white',
1174
+ checked && 'bg-accent/50',
1175
+ )}
1176
+ >
1177
+ <Checkbox
1178
+ checked={checked}
1179
+ onCheckedChange={(v) => setSelected((prev) => ({ ...prev, [r.url]: !!v }))}
1180
+ className="mt-0.5"
1181
+ />
1182
+ <span className="min-w-0 flex-1">
1183
+ <span className="block truncate text-sm font-medium">{r.title}</span>
1184
+ <span className="flex items-center gap-1 truncate text-xs text-muted-foreground">
1185
+ <Globe className="size-3 shrink-0" />
1186
+ {domainOf(r.url)}
1187
+ </span>
1188
+ {r.description && (
1189
+ <span className="mt-0.5 line-clamp-1 block text-xs text-muted-foreground/80">
1190
+ {r.description}
1191
+ </span>
1192
+ )}
1193
+ </span>
1194
+ </label>
1195
+ </li>
1196
+ );
1197
+ })}
1198
+ </ul>
1199
+
1200
+ {/* Local Pagination footer */}
1201
+ {results.length > ITEMS_PER_PAGE && (
1202
+ <div className="flex items-center justify-between border-t border-border px-3 py-2 bg-muted/20">
1203
+ <span className="text-xs text-muted-foreground">
1204
+ Showing {(displayPage - 1) * ITEMS_PER_PAGE + 1} to{' '}
1205
+ {Math.min(displayPage * ITEMS_PER_PAGE, results.length)} of {results.length} sources
1206
+ </span>
1207
+ <div className="flex items-center gap-1">
1208
+ <Button
1209
+ variant="outline"
1210
+ size="sm"
1211
+ className="h-7 px-2 text-xs"
1212
+ disabled={displayPage === 1}
1213
+ onClick={() => setDisplayPage((p) => Math.max(1, p - 1))}
1214
+ >
1215
+ Previous
1216
+ </Button>
1217
+ <div className="flex items-center gap-2 px-2 text-xs font-medium">
1218
+ {displayPage} / {totalDisplayPages}
1219
+ </div>
1220
+ <Button
1221
+ variant="outline"
1222
+ size="sm"
1223
+ className="h-7 px-2 text-xs"
1224
+ disabled={displayPage === totalDisplayPages}
1225
+ onClick={() => setDisplayPage((p) => Math.min(totalDisplayPages, p + 1))}
1226
+ >
1227
+ Next
1228
+ </Button>
1229
+ </div>
1230
+ </div>
1231
+ )}
1232
+
1233
+ {/* API Pagination footer */}
1234
+ {searchState?.searchProvider === 'serper' &&
1235
+ (searchState.hasMore || loadingMore || gatheringAll) && (
1236
+ <div className="flex items-center justify-between border-t border-border px-3 py-2">
1237
+ <span className="text-xs text-muted-foreground">
1238
+ {gatheringAll
1239
+ ? `Gathering page ${gatherProgress} of ${searchState.totalPages}…`
1240
+ : `Page ${searchState.currentPage} of ${searchState.totalPages}`}
1241
+ </span>
1242
+ <div className="flex items-center gap-2">
1243
+ {gatherAllAvailable && (
1244
+ <Button
1245
+ size="sm"
1246
+ variant="ghost"
1247
+ className="h-7 gap-1 text-xs"
1248
+ onClick={gatherAll}
1249
+ >
1250
+ <ChevronsDown className="size-3.5" />
1251
+ Gather all ({searchState.totalPages - searchState.currentPage} more pages)
1252
+ </Button>
1253
+ )}
1254
+ <Button
1255
+ size="sm"
1256
+ variant="outline"
1257
+ className="h-7 gap-1 text-xs"
1258
+ onClick={loadNextPage}
1259
+ disabled={!searchState?.hasMore || loadingMore || gatheringAll}
1260
+ >
1261
+ {loadingMore ? (
1262
+ <Loader2 className="size-3.5 animate-spin" />
1263
+ ) : (
1264
+ <ChevronDown className="size-3.5" />
1265
+ )}
1266
+ Load next page
1267
+ </Button>
1268
+ </div>
1269
+ </div>
1270
+ )}
1271
+ </div>
1272
+ )}
1273
+ </div>
1274
+ );
1275
+ }