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