larkup 0.1.36 → 0.1.38
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 -1
- package/.next/build-manifest.json +3 -3
- package/.next/diagnostics/route-bundle-stats.json +12 -12
- package/.next/fallback-build-manifest.json +3 -3
- package/.next/required-server-files.js +1 -1
- package/.next/required-server-files.json +1 -1
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +18 -18
- package/.next/server/app/_not-found.segments/_full.segment.rsc +18 -18
- package/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
- package/.next/server/app/_not-found.segments/_index.segment.rsc +12 -12
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/analytics/page_client-reference-manifest.js +1 -1
- package/.next/server/app/analytics.html +1 -1
- package/.next/server/app/analytics.rsc +19 -19
- package/.next/server/app/analytics.segments/_full.segment.rsc +19 -19
- package/.next/server/app/analytics.segments/_head.segment.rsc +4 -4
- package/.next/server/app/analytics.segments/_index.segment.rsc +12 -12
- package/.next/server/app/analytics.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/analytics.segments/analytics/__PAGE__.segment.rsc +3 -3
- package/.next/server/app/analytics.segments/analytics.segment.rsc +3 -3
- package/.next/server/app/api/analytics/route.js.nft.json +1 -1
- package/.next/server/app/api/chat/route.js.nft.json +1 -1
- package/.next/server/app/api/chat/status/route.js.nft.json +1 -1
- package/.next/server/app/api/chat/suggestions/route.js.nft.json +1 -1
- package/.next/server/app/api/config/route.js.nft.json +1 -1
- package/.next/server/app/api/config/test/route.js.nft.json +1 -1
- package/.next/server/app/api/connections/route.js.nft.json +1 -1
- package/.next/server/app/api/connections/webhook/route.js.nft.json +1 -1
- package/.next/server/app/api/demo/route.js.nft.json +1 -1
- package/.next/server/app/api/deploy/cloud-project/route.js.nft.json +1 -1
- package/.next/server/app/api/deploy/ssh/route.js.nft.json +1 -1
- package/.next/server/app/api/deployment/blob-setup/route.js.nft.json +1 -1
- package/.next/server/app/api/deployment/config/route.js.nft.json +1 -1
- package/.next/server/app/api/describe-image/route.js.nft.json +1 -1
- package/.next/server/app/api/documents/route.js.nft.json +1 -1
- package/.next/server/app/api/firecrawl/local/route.js.nft.json +1 -1
- package/.next/server/app/api/index/route.js.nft.json +1 -1
- package/.next/server/app/api/jobs/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/jobs/route.js.nft.json +1 -1
- package/.next/server/app/api/media/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/media/process/route.js.nft.json +1 -1
- package/.next/server/app/api/media/route.js.nft.json +1 -1
- package/.next/server/app/api/media/stream/route.js.nft.json +1 -1
- package/.next/server/app/api/search/bing/route.js.nft.json +1 -1
- package/.next/server/app/api/search/brave/route.js.nft.json +1 -1
- package/.next/server/app/api/search/exa/route.js.nft.json +1 -1
- package/.next/server/app/api/search/google/route.js.nft.json +1 -1
- package/.next/server/app/api/search/route.js.nft.json +1 -1
- package/.next/server/app/api/search/tavily/route.js.nft.json +1 -1
- package/.next/server/app/api/server/agent/route.js.nft.json +1 -1
- package/.next/server/app/api/server/download/route.js.nft.json +1 -1
- package/.next/server/app/api/server/generate/route.js.nft.json +1 -1
- package/.next/server/app/api/server/local/route.js.nft.json +1 -1
- package/.next/server/app/api/servers/route.js.nft.json +1 -1
- package/.next/server/app/api/tabular/query/route.js.nft.json +1 -1
- package/.next/server/app/api/tabular/route.js.nft.json +1 -1
- package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
- package/.next/server/app/chat.html +1 -1
- package/.next/server/app/chat.rsc +19 -19
- package/.next/server/app/chat.segments/_full.segment.rsc +19 -19
- package/.next/server/app/chat.segments/_head.segment.rsc +4 -4
- package/.next/server/app/chat.segments/_index.segment.rsc +12 -12
- package/.next/server/app/chat.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/chat.segments/chat/__PAGE__.segment.rsc +3 -3
- package/.next/server/app/chat.segments/chat.segment.rsc +3 -3
- package/.next/server/app/data/page_client-reference-manifest.js +1 -1
- package/.next/server/app/data.html +1 -1
- package/.next/server/app/data.rsc +19 -19
- package/.next/server/app/data.segments/_full.segment.rsc +19 -19
- package/.next/server/app/data.segments/_head.segment.rsc +4 -4
- package/.next/server/app/data.segments/_index.segment.rsc +12 -12
- package/.next/server/app/data.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/data.segments/data/__PAGE__.segment.rsc +3 -3
- package/.next/server/app/data.segments/data.segment.rsc +3 -3
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +17 -17
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/index.segments/_full.segment.rsc +17 -17
- package/.next/server/app/index.segments/_head.segment.rsc +4 -4
- package/.next/server/app/index.segments/_index.segment.rsc +12 -12
- package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/page.js.nft.json +1 -1
- package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings.html +1 -1
- package/.next/server/app/settings.rsc +19 -19
- package/.next/server/app/settings.segments/_full.segment.rsc +19 -19
- package/.next/server/app/settings.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings.segments/_index.segment.rsc +12 -12
- package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/settings.segments/settings.segment.rsc +3 -3
- package/.next/server/chunks/0598_next_dist_esm_build_templates_app-route_0kbcuk-.js +23 -24
- package/.next/server/chunks/0598_next_dist_esm_build_templates_app-route_0sbf4ny.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__1jc54o2._.js +1 -1
- package/.next/server/chunks/_1twj5f0._.js +3 -3
- package/.next/server/chunks/packages_marketplace_src_125_g2p._.js +1 -1
- package/.next/server/chunks/packages_scraper_src_0kkcv_v._.js +1 -1
- package/.next/server/chunks/ssr/_169pdlf._.js +1 -1
- package/.next/server/chunks/ssr/_18jagqc._.js +2 -2
- package/.next/server/chunks/ssr/_1hetwwu._.js +1 -1
- package/.next/server/chunks/ssr/_1yqlx1m._.js +1 -1
- package/.next/server/middleware-build-manifest.js +3 -3
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/standalone/apps/web/.next/BUILD_ID +1 -1
- package/.next/standalone/apps/web/.next/build-manifest.json +3 -3
- package/.next/standalone/apps/web/.next/required-server-files.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/_global-error.html +1 -1
- package/.next/standalone/apps/web/.next/server/app/_global-error.rsc +1 -1
- package/.next/standalone/apps/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/apps/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/apps/web/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/apps/web/.next/server/app/_not-found.rsc +18 -18
- package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_full.segment.rsc +18 -18
- package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
- package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_index.segment.rsc +12 -12
- package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
- package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/apps/web/.next/server/app/analytics/page_client-reference-manifest.js +1 -1
- package/.next/standalone/apps/web/.next/server/app/analytics.html +1 -1
- package/.next/standalone/apps/web/.next/server/app/analytics.rsc +19 -19
- package/.next/standalone/apps/web/.next/server/app/analytics.segments/_full.segment.rsc +19 -19
- package/.next/standalone/apps/web/.next/server/app/analytics.segments/_head.segment.rsc +4 -4
- package/.next/standalone/apps/web/.next/server/app/analytics.segments/_index.segment.rsc +12 -12
- package/.next/standalone/apps/web/.next/server/app/analytics.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/apps/web/.next/server/app/analytics.segments/analytics/__PAGE__.segment.rsc +3 -3
- package/.next/standalone/apps/web/.next/server/app/analytics.segments/analytics.segment.rsc +3 -3
- package/.next/standalone/apps/web/.next/server/app/api/analytics/route.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/api/chat/route.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/api/chat/status/route.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/api/chat/suggestions/route.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/api/config/route.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/api/config/test/route.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/api/connections/route.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/api/connections/webhook/route.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/api/demo/route.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/api/deploy/cloud-project/route.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/api/deploy/ssh/route.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/api/deployment/blob-setup/route.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/api/deployment/config/route.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/api/describe-image/route.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/api/documents/route.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/api/firecrawl/local/route.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/api/index/route.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/api/jobs/[id]/route.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/api/jobs/route.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/api/media/[id]/route.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/api/media/process/route.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/api/media/route.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/api/media/stream/route.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/api/search/bing/route.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/api/search/brave/route.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/api/search/exa/route.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/api/search/google/route.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/api/search/route.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/api/search/tavily/route.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/api/server/agent/route.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/api/server/download/route.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/api/server/generate/route.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/api/server/local/route.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/api/servers/route.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/api/tabular/query/route.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/api/tabular/route.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/chat/page_client-reference-manifest.js +1 -1
- package/.next/standalone/apps/web/.next/server/app/chat.html +1 -1
- package/.next/standalone/apps/web/.next/server/app/chat.rsc +19 -19
- package/.next/standalone/apps/web/.next/server/app/chat.segments/_full.segment.rsc +19 -19
- package/.next/standalone/apps/web/.next/server/app/chat.segments/_head.segment.rsc +4 -4
- package/.next/standalone/apps/web/.next/server/app/chat.segments/_index.segment.rsc +12 -12
- package/.next/standalone/apps/web/.next/server/app/chat.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/apps/web/.next/server/app/chat.segments/chat/__PAGE__.segment.rsc +3 -3
- package/.next/standalone/apps/web/.next/server/app/chat.segments/chat.segment.rsc +3 -3
- package/.next/standalone/apps/web/.next/server/app/data/page_client-reference-manifest.js +1 -1
- package/.next/standalone/apps/web/.next/server/app/data.html +1 -1
- package/.next/standalone/apps/web/.next/server/app/data.rsc +19 -19
- package/.next/standalone/apps/web/.next/server/app/data.segments/_full.segment.rsc +19 -19
- package/.next/standalone/apps/web/.next/server/app/data.segments/_head.segment.rsc +4 -4
- package/.next/standalone/apps/web/.next/server/app/data.segments/_index.segment.rsc +12 -12
- package/.next/standalone/apps/web/.next/server/app/data.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/apps/web/.next/server/app/data.segments/data/__PAGE__.segment.rsc +3 -3
- package/.next/standalone/apps/web/.next/server/app/data.segments/data.segment.rsc +3 -3
- package/.next/standalone/apps/web/.next/server/app/index.html +1 -1
- package/.next/standalone/apps/web/.next/server/app/index.rsc +17 -17
- package/.next/standalone/apps/web/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/apps/web/.next/server/app/index.segments/_full.segment.rsc +17 -17
- package/.next/standalone/apps/web/.next/server/app/index.segments/_head.segment.rsc +4 -4
- package/.next/standalone/apps/web/.next/server/app/index.segments/_index.segment.rsc +12 -12
- package/.next/standalone/apps/web/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/apps/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/apps/web/.next/server/app/settings/page.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/apps/web/.next/server/app/settings.html +1 -1
- package/.next/standalone/apps/web/.next/server/app/settings.rsc +19 -19
- package/.next/standalone/apps/web/.next/server/app/settings.segments/_full.segment.rsc +19 -19
- package/.next/standalone/apps/web/.next/server/app/settings.segments/_head.segment.rsc +4 -4
- package/.next/standalone/apps/web/.next/server/app/settings.segments/_index.segment.rsc +12 -12
- package/.next/standalone/apps/web/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/apps/web/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +4 -4
- package/.next/standalone/apps/web/.next/server/app/settings.segments/settings.segment.rsc +3 -3
- package/.next/standalone/apps/web/.next/server/chunks/0598_next_dist_esm_build_templates_app-route_0kbcuk-.js +23 -24
- package/.next/standalone/apps/web/.next/server/chunks/0598_next_dist_esm_build_templates_app-route_0sbf4ny.js +1 -1
- package/.next/standalone/apps/web/.next/server/chunks/[root-of-the-server]__1jc54o2._.js +1 -1
- package/.next/standalone/apps/web/.next/server/chunks/_1twj5f0._.js +3 -3
- package/.next/standalone/apps/web/.next/server/chunks/packages_marketplace_src_125_g2p._.js +1 -1
- package/.next/standalone/apps/web/.next/server/chunks/packages_scraper_src_0kkcv_v._.js +1 -1
- package/.next/standalone/apps/web/.next/server/chunks/ssr/_169pdlf._.js +1 -1
- package/.next/standalone/apps/web/.next/server/chunks/ssr/_18jagqc._.js +2 -2
- package/.next/standalone/apps/web/.next/server/chunks/ssr/_1hetwwu._.js +1 -1
- package/.next/standalone/apps/web/.next/server/chunks/ssr/_1yqlx1m._.js +1 -1
- package/.next/standalone/apps/web/.next/server/middleware-build-manifest.js +3 -3
- package/.next/standalone/apps/web/.next/server/pages/404.html +1 -1
- package/.next/standalone/apps/web/.next/server/pages/500.html +1 -1
- package/.next/standalone/apps/web/.next/static/chunks/{2-st4vd5971ry.js → 06u04tzgkz4_f.js} +1 -1
- package/.next/standalone/apps/web/.next/static/chunks/{3q4k1i384p4oi.js → 19k_g3af0cf7b.js} +1 -1
- package/.next/standalone/apps/web/.next/static/chunks/{3mp3jya53i-g-.js → 19krxv-ou9c8c.js} +6 -6
- package/.next/standalone/apps/web/.next/static/chunks/1_nk3imchwn8a.css +1 -0
- package/.next/standalone/apps/web/.next/static/chunks/{0qyuw19snetjl.js → 2ljwki2xxnblc.js} +2 -2
- package/.next/standalone/apps/web/CHANGELOG.md +17 -0
- package/.next/standalone/apps/web/app/api/chat/route.ts +62 -33
- package/.next/standalone/apps/web/app/api/media/process/route.ts +6 -0
- package/.next/standalone/apps/web/app/api/media/route.ts +3 -2
- package/.next/standalone/apps/web/app/api/media/stream/route.ts +19 -3
- package/.next/standalone/apps/web/app/settings/page.tsx +8 -17
- package/.next/standalone/apps/web/components/chat/chat-workspace.tsx +11 -4
- package/.next/standalone/apps/web/components/chat/message-item.tsx +18 -6
- package/.next/standalone/apps/web/components/chat/tools/knowledge-base-result.tsx +3 -4
- package/.next/standalone/apps/web/components/data/data-workspace.tsx +6 -2
- package/.next/standalone/apps/web/components/data/jobs-panel.tsx +22 -2
- package/.next/standalone/apps/web/components/data/media-panel.tsx +117 -91
- package/.next/standalone/apps/web/components/settings/marketplace-section.tsx +5 -0
- package/.next/standalone/apps/web/components/settings/prompts-section.tsx +13 -3
- package/.next/standalone/apps/web/package.json +1 -1
- package/.next/standalone/apps/web/server.js +1 -1
- package/.next/standalone/packages/tools/video-audio/CHANGELOG.md +6 -0
- package/.next/standalone/packages/tools/video-audio/dist/url-importer.js +34 -8
- package/.next/standalone/packages/tools/video-audio/package.json +1 -1
- package/.next/standalone/packages/tools/video-audio/src/url-importer.ts +56 -21
- package/.next/static/chunks/{2-st4vd5971ry.js → 06u04tzgkz4_f.js} +1 -1
- package/.next/static/chunks/{3q4k1i384p4oi.js → 19k_g3af0cf7b.js} +1 -1
- package/.next/static/chunks/{3mp3jya53i-g-.js → 19krxv-ou9c8c.js} +6 -6
- package/.next/static/chunks/1_nk3imchwn8a.css +1 -0
- package/.next/static/chunks/{0qyuw19snetjl.js → 2ljwki2xxnblc.js} +2 -2
- package/CHANGELOG.md +17 -0
- package/app/api/chat/route.ts +62 -33
- package/app/api/media/process/route.ts +6 -0
- package/app/api/media/route.ts +3 -2
- package/app/api/media/stream/route.ts +19 -3
- package/app/settings/page.tsx +8 -17
- package/components/chat/chat-workspace.tsx +11 -4
- package/components/chat/message-item.tsx +18 -6
- package/components/chat/tools/knowledge-base-result.tsx +3 -4
- package/components/data/data-workspace.tsx +6 -2
- package/components/data/jobs-panel.tsx +22 -2
- package/components/data/media-panel.tsx +117 -91
- package/components/settings/marketplace-section.tsx +5 -0
- package/components/settings/prompts-section.tsx +13 -3
- package/package.json +6 -6
- package/.next/standalone/apps/web/.next/static/chunks/0fa79dhcoeytz.css +0 -1
- package/.next/static/chunks/0fa79dhcoeytz.css +0 -1
- /package/.next/standalone/apps/web/.next/static/{ZV6fJc5ZoZ_a-UPNhgKZS → IOngxM7BWde96UQMAebFB}/_buildManifest.js +0 -0
- /package/.next/standalone/apps/web/.next/static/{ZV6fJc5ZoZ_a-UPNhgKZS → IOngxM7BWde96UQMAebFB}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/apps/web/.next/static/{ZV6fJc5ZoZ_a-UPNhgKZS → IOngxM7BWde96UQMAebFB}/_ssgManifest.js +0 -0
- /package/.next/static/{ZV6fJc5ZoZ_a-UPNhgKZS → IOngxM7BWde96UQMAebFB}/_buildManifest.js +0 -0
- /package/.next/static/{ZV6fJc5ZoZ_a-UPNhgKZS → IOngxM7BWde96UQMAebFB}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{ZV6fJc5ZoZ_a-UPNhgKZS → IOngxM7BWde96UQMAebFB}/_ssgManifest.js +0 -0
|
@@ -428,6 +428,9 @@ function InstallPrompt({
|
|
|
428
428
|
|
|
429
429
|
const handleInstall = async () => {
|
|
430
430
|
setInstalling(true);
|
|
431
|
+
const toastId = toast.loading('Downloading and installing tool…', {
|
|
432
|
+
description: 'This may take a moment on first install.',
|
|
433
|
+
});
|
|
431
434
|
try {
|
|
432
435
|
const res = await fetch(`/api/marketplace/${toolId}`, {
|
|
433
436
|
method: 'POST',
|
|
@@ -436,6 +439,7 @@ function InstallPrompt({
|
|
|
436
439
|
const err = await res.json();
|
|
437
440
|
throw new Error(err.error || 'Install failed');
|
|
438
441
|
}
|
|
442
|
+
toast.dismiss(toastId);
|
|
439
443
|
toast.success('Video & Audio installed', {
|
|
440
444
|
description: 'Choose an audio provider before indexing video or audio.',
|
|
441
445
|
action: {
|
|
@@ -445,6 +449,7 @@ function InstallPrompt({
|
|
|
445
449
|
});
|
|
446
450
|
onInstallComplete();
|
|
447
451
|
} catch (err) {
|
|
452
|
+
toast.dismiss(toastId);
|
|
448
453
|
toast.error(err instanceof Error ? err.message : 'Failed to install tool');
|
|
449
454
|
} finally {
|
|
450
455
|
setInstalling(false);
|
|
@@ -772,7 +777,7 @@ function MediaContent({
|
|
|
772
777
|
|
|
773
778
|
async function handleDelete(assetId: string) {
|
|
774
779
|
try {
|
|
775
|
-
const query = new URLSearchParams({ id: assetId });
|
|
780
|
+
const query = new URLSearchParams({ id: assetId, force: 'true' });
|
|
776
781
|
if (serverId) query.set('serverId', serverId);
|
|
777
782
|
const response = await fetch(`/api/media?${query.toString()}`, { method: 'DELETE' });
|
|
778
783
|
if (!response.ok) {
|
|
@@ -912,93 +917,114 @@ function MediaContent({
|
|
|
912
917
|
{mediaType === 'video' ? ', YouTube videos, or playlists' : ''}. Add up to 10 URLs
|
|
913
918
|
separated by commas.
|
|
914
919
|
</p>
|
|
915
|
-
{remoteEstimates
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
remoteDuration
|
|
931
|
-
? `~${remoteEstimate.processingMinutes} min`
|
|
932
|
-
: 'Calculated during import'
|
|
933
|
-
}
|
|
934
|
-
/>
|
|
935
|
-
<EstimateMetric
|
|
936
|
-
label="Estimated API cost"
|
|
937
|
-
value={
|
|
938
|
-
remoteDuration
|
|
939
|
-
? `~$${remoteEstimate.transcriptionCost.toFixed(2)} +`
|
|
940
|
-
: 'Model-dependent'
|
|
941
|
-
}
|
|
942
|
-
/>
|
|
943
|
-
</div>
|
|
944
|
-
|
|
945
|
-
{(mediaType === 'audio'
|
|
946
|
-
? remoteEstimates.slice(0, 1)
|
|
947
|
-
: remoteEstimates.filter((est: any) => est.mediaType === 'video').slice(0, 1)
|
|
948
|
-
).map((est: any, i: number) => {
|
|
949
|
-
if (mediaType === 'audio') {
|
|
950
|
-
return (
|
|
951
|
-
<div key={i} className="rounded-xl border border-border/70 bg-muted/20 p-3">
|
|
952
|
-
<p className="mb-2 truncate text-[11px] font-medium text-foreground">
|
|
953
|
-
Preview before importing
|
|
954
|
-
</p>
|
|
955
|
-
<audio
|
|
956
|
-
controls
|
|
957
|
-
preload="metadata"
|
|
958
|
-
src={est.originalUrl}
|
|
959
|
-
className="h-9 w-full"
|
|
920
|
+
{remoteEstimates
|
|
921
|
+
? (() => {
|
|
922
|
+
const totalEntries = remoteEstimates.reduce(
|
|
923
|
+
(sum: number, item: any) => sum + (item.entryCount ?? 1),
|
|
924
|
+
0,
|
|
925
|
+
);
|
|
926
|
+
const isPlaylist = totalEntries > 1;
|
|
927
|
+
return (
|
|
928
|
+
<div className="mt-4 flex flex-col gap-4 border-t border-border/70 pt-4">
|
|
929
|
+
<div className="grid gap-2 sm:grid-cols-3">
|
|
930
|
+
<EstimateMetric
|
|
931
|
+
label="Media"
|
|
932
|
+
value={`${totalEntries} item(s) · ${
|
|
933
|
+
remoteDuration ? formatDuration(remoteDuration) : 'duration unavailable'
|
|
934
|
+
}`}
|
|
960
935
|
/>
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
<div
|
|
977
|
-
key={i}
|
|
978
|
-
className="relative w-full overflow-hidden rounded-xl aspect-video shadow-md border border-border/50 ring-1 ring-border/20 bg-black"
|
|
979
|
-
>
|
|
980
|
-
<iframe
|
|
981
|
-
src={embedUrl}
|
|
982
|
-
className="absolute inset-0 w-full h-full"
|
|
983
|
-
frameBorder="0"
|
|
984
|
-
allowFullScreen
|
|
985
|
-
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
|
|
936
|
+
<EstimateMetric
|
|
937
|
+
label="Expected time"
|
|
938
|
+
value={
|
|
939
|
+
remoteDuration
|
|
940
|
+
? `~${remoteEstimate.processingMinutes} min`
|
|
941
|
+
: 'Calculated during import'
|
|
942
|
+
}
|
|
943
|
+
/>
|
|
944
|
+
<EstimateMetric
|
|
945
|
+
label="Estimated API cost"
|
|
946
|
+
value={
|
|
947
|
+
remoteDuration
|
|
948
|
+
? `~$${remoteEstimate.transcriptionCost.toFixed(2)} +`
|
|
949
|
+
: 'Model-dependent'
|
|
950
|
+
}
|
|
986
951
|
/>
|
|
987
952
|
</div>
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
953
|
+
|
|
954
|
+
{isPlaylist ? (
|
|
955
|
+
<div className="flex items-start gap-2 rounded-lg border border-amber-200 bg-amber-50/60 dark:border-amber-800/50 dark:bg-amber-950/30 px-3 py-2.5">
|
|
956
|
+
<AlertCircle className="size-3.5 shrink-0 mt-0.5 text-amber-600 dark:text-amber-400" />
|
|
957
|
+
<p className="text-[11px] text-amber-800 dark:text-amber-300 leading-relaxed">
|
|
958
|
+
<span className="font-medium">Playlist detected</span> — this will
|
|
959
|
+
download and index{' '}
|
|
960
|
+
<span className="font-semibold">{totalEntries} items</span> (max 10). Each
|
|
961
|
+
item is transcribed and analyzed separately.
|
|
962
|
+
</p>
|
|
963
|
+
</div>
|
|
964
|
+
) : null}
|
|
965
|
+
|
|
966
|
+
{(mediaType === 'audio'
|
|
967
|
+
? remoteEstimates.slice(0, 1)
|
|
968
|
+
: remoteEstimates.filter((est: any) => est.mediaType === 'video').slice(0, 1)
|
|
969
|
+
).map((est: any, i: number) => {
|
|
970
|
+
if (mediaType === 'audio') {
|
|
971
|
+
return (
|
|
972
|
+
<div
|
|
973
|
+
key={i}
|
|
974
|
+
className="rounded-xl border border-border/70 bg-muted/20 p-3"
|
|
975
|
+
>
|
|
976
|
+
<p className="mb-2 truncate text-[11px] font-medium text-foreground">
|
|
977
|
+
Preview before importing
|
|
978
|
+
</p>
|
|
979
|
+
<audio
|
|
980
|
+
controls
|
|
981
|
+
preload="metadata"
|
|
982
|
+
src={est.originalUrl}
|
|
983
|
+
className="h-9 w-full"
|
|
984
|
+
/>
|
|
985
|
+
</div>
|
|
986
|
+
);
|
|
987
|
+
}
|
|
988
|
+
let embedUrl = est.originalUrl;
|
|
989
|
+
if (est.isYouTube) {
|
|
990
|
+
try {
|
|
991
|
+
const u = new URL(est.originalUrl);
|
|
992
|
+
const v = u.hostname.includes('youtu.be')
|
|
993
|
+
? u.pathname.slice(1)
|
|
994
|
+
: u.searchParams.get('v');
|
|
995
|
+
embedUrl = `https://www.youtube.com/embed/${v}`;
|
|
996
|
+
} catch (e) {
|
|
997
|
+
// ignore
|
|
998
|
+
}
|
|
999
|
+
return (
|
|
1000
|
+
<div
|
|
1001
|
+
key={i}
|
|
1002
|
+
className="relative w-full overflow-hidden rounded-xl aspect-video shadow-md border border-border/50 ring-1 ring-border/20 bg-black"
|
|
1003
|
+
>
|
|
1004
|
+
<iframe
|
|
1005
|
+
src={embedUrl}
|
|
1006
|
+
className="absolute inset-0 w-full h-full"
|
|
1007
|
+
frameBorder="0"
|
|
1008
|
+
allowFullScreen
|
|
1009
|
+
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
|
|
1010
|
+
/>
|
|
1011
|
+
</div>
|
|
1012
|
+
);
|
|
1013
|
+
} else {
|
|
1014
|
+
return (
|
|
1015
|
+
<video
|
|
1016
|
+
key={i}
|
|
1017
|
+
src={embedUrl}
|
|
1018
|
+
controls
|
|
1019
|
+
className="w-full max-w-sm rounded-md aspect-video bg-muted object-cover shadow-sm border border-border"
|
|
1020
|
+
/>
|
|
1021
|
+
);
|
|
1022
|
+
}
|
|
1023
|
+
})}
|
|
1024
|
+
</div>
|
|
1025
|
+
);
|
|
1026
|
+
})()
|
|
1027
|
+
: null}
|
|
1002
1028
|
</div>
|
|
1003
1029
|
) : (
|
|
1004
1030
|
<div
|
|
@@ -1233,7 +1259,7 @@ function MediaContent({
|
|
|
1233
1259
|
) : null}
|
|
1234
1260
|
|
|
1235
1261
|
{/* Storage warning */}
|
|
1236
|
-
{storageUsedBytes > 1024 * 1024 * 1024 && (
|
|
1262
|
+
{/* {storageUsedBytes > 1024 * 1024 * 1024 && (
|
|
1237
1263
|
<div className="flex items-start gap-2.5 rounded-lg border border-amber-200 bg-amber-50 px-3.5 py-3">
|
|
1238
1264
|
<AlertCircle className="size-4 mt-0.5 shrink-0 text-amber-600" />
|
|
1239
1265
|
<div>
|
|
@@ -1245,7 +1271,7 @@ function MediaContent({
|
|
|
1245
1271
|
</p>
|
|
1246
1272
|
</div>
|
|
1247
1273
|
</div>
|
|
1248
|
-
)}
|
|
1274
|
+
)} */}
|
|
1249
1275
|
</div>
|
|
1250
1276
|
);
|
|
1251
1277
|
}
|
|
@@ -1582,7 +1608,7 @@ function ActiveIndexingList({
|
|
|
1582
1608
|
<section
|
|
1583
1609
|
aria-live="polite"
|
|
1584
1610
|
aria-label="Active media indexing jobs"
|
|
1585
|
-
className="space-y-3 rounded-xl border border-emerald-
|
|
1611
|
+
className="space-y-3 rounded-xl border border-emerald-500 bg-emerald-50/20 p-3 dark:border-emerald-700/60 dark:bg-emerald-950/20"
|
|
1586
1612
|
>
|
|
1587
1613
|
<div className="flex items-center gap-2">
|
|
1588
1614
|
<Loader2 className="size-3.5 animate-spin text-emerald-600 dark:text-emerald-400" />
|
|
@@ -1634,9 +1660,9 @@ function ActiveIndexingList({
|
|
|
1634
1660
|
{asset.processingMessage || 'Preparing media indexing...'}
|
|
1635
1661
|
</p>
|
|
1636
1662
|
</div>
|
|
1637
|
-
{asset.processingSteps?.length ? (
|
|
1663
|
+
{/* {asset.processingSteps?.length ? (
|
|
1638
1664
|
<PipelineSteps steps={asset.processingSteps} />
|
|
1639
|
-
) : null}
|
|
1665
|
+
) : null} */}
|
|
1640
1666
|
</div>
|
|
1641
1667
|
);
|
|
1642
1668
|
})}
|
|
@@ -1671,7 +1697,7 @@ function PipelineSteps({ steps }: { steps: MediaProcessingStep[] }) {
|
|
|
1671
1697
|
className={cn(
|
|
1672
1698
|
'flex min-w-0 items-center gap-1.5 rounded-md border px-2 py-1 text-[9px]',
|
|
1673
1699
|
isRunning
|
|
1674
|
-
? 'border-emerald-
|
|
1700
|
+
? 'border-emerald-500 bg-emerald-50/70 text-emerald-700 dark:border-emerald-700/70 dark:bg-emerald-950/40 dark:text-emerald-300'
|
|
1675
1701
|
: 'border-border/60 bg-background/40 text-muted-foreground',
|
|
1676
1702
|
)}
|
|
1677
1703
|
>
|
|
@@ -98,6 +98,9 @@ export function MarketplaceSection() {
|
|
|
98
98
|
const handleInstall = useCallback(
|
|
99
99
|
async (toolId: string) => {
|
|
100
100
|
setInstalling(toolId);
|
|
101
|
+
const toastId = toast.loading('Downloading and installing tool…', {
|
|
102
|
+
description: 'This may take a moment on first install.',
|
|
103
|
+
});
|
|
101
104
|
try {
|
|
102
105
|
const res = await fetch(`/api/marketplace/${toolId}`, {
|
|
103
106
|
method: 'POST',
|
|
@@ -106,6 +109,7 @@ export function MarketplaceSection() {
|
|
|
106
109
|
const err = await res.json();
|
|
107
110
|
throw new Error(err.error || 'Install failed');
|
|
108
111
|
}
|
|
112
|
+
toast.dismiss(toastId);
|
|
109
113
|
if (toolId === 'video-audio') {
|
|
110
114
|
toast.success('Video & Audio installed', {
|
|
111
115
|
description: 'Choose an audio provider before you index media.',
|
|
@@ -119,6 +123,7 @@ export function MarketplaceSection() {
|
|
|
119
123
|
}
|
|
120
124
|
mutate();
|
|
121
125
|
} catch (err) {
|
|
126
|
+
toast.dismiss(toastId);
|
|
122
127
|
toast.error(err instanceof Error ? err.message : 'Failed to install tool');
|
|
123
128
|
} finally {
|
|
124
129
|
setInstalling(null);
|
|
@@ -36,13 +36,22 @@ export function PromptsSection() {
|
|
|
36
36
|
if (data?.config) {
|
|
37
37
|
setForm({
|
|
38
38
|
...data.config,
|
|
39
|
-
|
|
39
|
+
// The generated prompt (tools, retrieval policy, and safety rules) is
|
|
40
|
+
// an implementation detail. This editor contains only the user's
|
|
41
|
+
// optional addition, so first use starts with a clean canvas.
|
|
42
|
+
systemPrompt:
|
|
43
|
+
data.config.systemPrompt && data.config.systemPrompt !== DEFAULT_SYSTEM_PROMPT
|
|
44
|
+
? data.config.systemPrompt
|
|
45
|
+
: '',
|
|
40
46
|
});
|
|
41
47
|
}
|
|
42
48
|
}, [data]);
|
|
43
49
|
|
|
44
50
|
const dirty =
|
|
45
|
-
(form.systemPrompt || '') !==
|
|
51
|
+
(form.systemPrompt || '') !==
|
|
52
|
+
(data?.config?.systemPrompt === DEFAULT_SYSTEM_PROMPT
|
|
53
|
+
? ''
|
|
54
|
+
: data?.config?.systemPrompt || '') ||
|
|
46
55
|
JSON.stringify(form.enabledTools || []) !== JSON.stringify(data?.config?.enabledTools || []);
|
|
47
56
|
|
|
48
57
|
async function handleSave() {
|
|
@@ -92,7 +101,8 @@ export function PromptsSection() {
|
|
|
92
101
|
<CardHeader className="pb-3">
|
|
93
102
|
<CardTitle className="text-sm">System Prompt</CardTitle>
|
|
94
103
|
<CardDescription className="text-xs">
|
|
95
|
-
|
|
104
|
+
Add your own instructions. Larkup keeps its generated tool and retrieval instructions
|
|
105
|
+
separate and combines them automatically.
|
|
96
106
|
</CardDescription>
|
|
97
107
|
</CardHeader>
|
|
98
108
|
<CardContent>
|
|
@@ -15,7 +15,7 @@ const currentPort = parseInt(process.env.PORT, 10) || 3000
|
|
|
15
15
|
const hostname = process.env.HOSTNAME || '0.0.0.0'
|
|
16
16
|
|
|
17
17
|
let keepAliveTimeout = parseInt(process.env.KEEP_ALIVE_TIMEOUT, 10)
|
|
18
|
-
const nextConfig = {"env":{"NEXT_PUBLIC_APP_VERSION":"0.1.
|
|
18
|
+
const nextConfig = {"env":{"NEXT_PUBLIC_APP_VERSION":"0.1.38"},"webpack":null,"typescript":{"ignoreBuildErrors":true},"typedRoutes":false,"distDir":"./.next","cleanDistDir":true,"assetPrefix":"","cacheMaxMemorySize":52428800,"configOrigin":"next.config.mjs","useFileSystemPublicRoutes":true,"generateEtags":true,"pageExtensions":["tsx","ts","jsx","js"],"poweredByHeader":true,"compress":true,"images":{"deviceSizes":[640,750,828,1080,1200,1920,2048,3840],"imageSizes":[32,48,64,96,128,256,384],"path":"/_next/image","loader":"default","loaderFile":"","domains":[],"disableStaticImages":false,"minimumCacheTTL":14400,"formats":["image/webp"],"maximumRedirects":3,"maximumResponseBody":50000000,"dangerouslyAllowLocalIP":false,"dangerouslyAllowSVG":false,"contentSecurityPolicy":"script-src 'none'; frame-src 'none'; sandbox;","contentDispositionType":"attachment","localPatterns":[{"pathname":"**","search":""}],"remotePatterns":[],"qualities":[75],"unoptimized":true,"customCacheHandler":false},"devIndicators":{"position":"bottom-left"},"onDemandEntries":{"maxInactiveAge":60000,"pagesBufferLength":5},"basePath":"","sassOptions":{},"trailingSlash":false,"i18n":null,"productionBrowserSourceMaps":false,"excludeDefaultMomentLocales":true,"reactProductionProfiling":false,"reactStrictMode":null,"reactMaxHeadersLength":6000,"httpAgentOptions":{"keepAlive":true},"logging":{"serverFunctions":true,"browserToTerminal":"warn"},"compiler":{},"expireTime":31536000,"staticPageGenerationTimeout":60,"output":"standalone","modularizeImports":{"@mui/icons-material":{"transform":"@mui/icons-material/{{member}}"},"lodash":{"transform":"lodash/{{member}}"}},"outputFileTracingRoot":"/Users/abdelrahmanabounida/Desktop/my-ai-startup/larkup/larkup","cacheComponents":false,"cacheLife":{"default":{"stale":300,"revalidate":900,"expire":4294967294},"seconds":{"stale":30,"revalidate":1,"expire":60},"minutes":{"stale":300,"revalidate":60,"expire":3600},"hours":{"stale":300,"revalidate":3600,"expire":86400},"days":{"stale":300,"revalidate":86400,"expire":604800},"weeks":{"stale":300,"revalidate":604800,"expire":2592000},"max":{"stale":300,"revalidate":2592000,"expire":31536000}},"cacheHandlers":{},"experimental":{"appNewScrollHandler":false,"useSkewCookie":false,"cssChunking":true,"multiZoneDraftMode":false,"appNavFailHandling":false,"prerenderEarlyExit":true,"serverMinification":true,"linkNoTouchStart":false,"caseSensitiveRoutes":false,"cachedNavigations":false,"partialFallbacks":false,"dynamicOnHover":false,"varyParams":false,"prefetchInlining":false,"preloadEntriesOnStart":true,"clientRouterFilter":true,"clientRouterFilterRedirects":false,"fetchCacheKeyPrefix":"","proxyPrefetch":"flexible","optimisticClientCache":true,"manualClientBasePath":false,"cpus":9,"memoryBasedWorkersCount":false,"imgOptConcurrency":null,"imgOptTimeoutInSeconds":7,"imgOptMaxInputPixels":268402689,"imgOptSequentialRead":null,"isrFlushToDisk":true,"workerThreads":false,"optimizeCss":false,"nextScriptWorkers":false,"scrollRestoration":false,"externalDir":false,"disableOptimizedLoading":false,"gzipSize":true,"craCompat":false,"esmExternals":true,"fullySpecified":false,"swcTraceProfiling":false,"forceSwcTransforms":false,"largePageDataBytes":128000,"typedEnv":false,"parallelServerCompiles":false,"parallelServerBuildTraces":false,"ppr":false,"authInterrupts":false,"webpackMemoryOptimizations":false,"optimizeServerReact":true,"strictRouteTypes":false,"useTypeScriptCli":false,"viewTransition":false,"removeUncaughtErrorAndRejectionListeners":false,"validateRSCRequestHeaders":false,"staleTimes":{"dynamic":0,"static":300},"reactDebugChannel":true,"serverComponentsHmrCache":true,"staticGenerationMaxConcurrency":8,"staticGenerationMinPagesPerWorker":25,"transitionIndicator":false,"gestureTransition":false,"inlineCss":false,"useCache":false,"globalNotFound":false,"browserDebugInfoInTerminal":"warn","lockDistDir":true,"proxyClientMaxBodySize":10485760,"hideLogsAfterAbort":false,"mcpServer":true,"turbopackFileSystemCacheForDev":true,"turbopackFileSystemCacheForBuild":false,"turbopackInferModuleSideEffects":true,"turbopackPluginRuntimeStrategy":"childProcesses","optimizePackageImports":["lucide-react","date-fns","lodash-es","ramda","antd","react-bootstrap","ahooks","@ant-design/icons","@headlessui/react","@headlessui-float/react","@heroicons/react/20/solid","@heroicons/react/24/solid","@heroicons/react/24/outline","@visx/visx","@tremor/react","rxjs","@mui/material","@mui/icons-material","recharts","react-use","effect","@effect/schema","@effect/platform","@effect/platform-node","@effect/platform-browser","@effect/platform-bun","@effect/sql","@effect/sql-mssql","@effect/sql-mysql2","@effect/sql-pg","@effect/sql-sqlite-node","@effect/sql-sqlite-bun","@effect/sql-sqlite-wasm","@effect/sql-sqlite-react-native","@effect/rpc","@effect/rpc-http","@effect/typeclass","@effect/experimental","@effect/opentelemetry","@material-ui/core","@material-ui/icons","@tabler/icons-react","mui-core","react-icons/ai","react-icons/bi","react-icons/bs","react-icons/cg","react-icons/ci","react-icons/di","react-icons/fa","react-icons/fa6","react-icons/fc","react-icons/fi","react-icons/gi","react-icons/go","react-icons/gr","react-icons/hi","react-icons/hi2","react-icons/im","react-icons/io","react-icons/io5","react-icons/lia","react-icons/lib","react-icons/lu","react-icons/md","react-icons/pi","react-icons/ri","react-icons/rx","react-icons/si","react-icons/sl","react-icons/tb","react-icons/tfi","react-icons/ti","react-icons/vsc","react-icons/wi"],"trustHostHeader":false,"isExperimentalCompile":false},"htmlLimitedBots":"[\\w-]+-Google|Google-[\\w-]+|Chrome-Lighthouse|Slurp|DuckDuckBot|baiduspider|yandex|sogou|bitlybot|tumblr|vkShare|quora link preview|redditbot|ia_archiver|Bingbot|BingPreview|applebot|facebookexternalhit|facebookcatalog|Twitterbot|LinkedInBot|Slackbot|Discordbot|WhatsApp|SkypeUriPreview|Yeti|googleweblight","bundlePagesRouterDependencies":false,"configFileName":"next.config.mjs","transpilePackages":["@larkup/core","@larkup/vector-stores","@larkup/scraper","@larkup/marketplace"],"serverExternalPackages":["@lancedb/lancedb","chromadb","dockerode","@larkup/sandbox"],"turbopack":{"root":"/Users/abdelrahmanabounida/Desktop/my-ai-startup/larkup/larkup"},"distDirRoot":".next","_originalRewrites":{"beforeFiles":[],"afterFiles":[{"source":"/uploads/:path*","destination":"/api/uploads/:path*"}],"fallback":[]}}
|
|
19
19
|
|
|
20
20
|
process.env.__NEXT_PRIVATE_STANDALONE_CONFIG = JSON.stringify(nextConfig)
|
|
21
21
|
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# @larkup/tool-video-audio
|
|
2
2
|
|
|
3
|
+
## 0.2.3
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- c1b12cb: Restore reliable no-Docker local crawler search with a resilient public-search fallback, make current-event chat questions use enabled web search, speed up first-party tool installation, and improve media URL progress handling. Simplify settings and prompt UX, and make failed-crawl URL copying reliable.
|
|
8
|
+
|
|
3
9
|
## 0.2.2
|
|
4
10
|
|
|
5
11
|
### Patch Changes
|
|
@@ -58,11 +58,19 @@ export async function importMediaUrl(url, options) {
|
|
|
58
58
|
const template = path.join(options.outputDir, '%(title).120B [%(id)s].%(ext)s');
|
|
59
59
|
const print = '{"path":%(filepath)j,"title":%(title)j,"originalUrl":%(webpage_url)j,"ext":%(ext)j}';
|
|
60
60
|
const output = await runYtDlp([
|
|
61
|
-
'--no-
|
|
61
|
+
'--no-playlist',
|
|
62
62
|
'--playlist-end',
|
|
63
63
|
String(options.playlistMax ?? 10),
|
|
64
|
+
'--socket-timeout',
|
|
65
|
+
'20',
|
|
66
|
+
'--retries',
|
|
67
|
+
'2',
|
|
68
|
+
'--fragment-retries',
|
|
69
|
+
'2',
|
|
70
|
+
'--concurrent-fragments',
|
|
71
|
+
'4',
|
|
64
72
|
'--format',
|
|
65
|
-
'
|
|
73
|
+
'best[height<=360]/bestvideo[height<=360]+bestaudio/best',
|
|
66
74
|
'--merge-output-format',
|
|
67
75
|
'mp4',
|
|
68
76
|
'-o',
|
|
@@ -70,7 +78,7 @@ export async function importMediaUrl(url, options) {
|
|
|
70
78
|
'--print',
|
|
71
79
|
`after_move:${print}`,
|
|
72
80
|
url,
|
|
73
|
-
]);
|
|
81
|
+
], options.onProgress);
|
|
74
82
|
const imported = output
|
|
75
83
|
.split('\n')
|
|
76
84
|
.filter(Boolean)
|
|
@@ -270,7 +278,7 @@ function mimeFromExtension(ext) {
|
|
|
270
278
|
flac: 'audio/flac',
|
|
271
279
|
}[ext.toLowerCase()];
|
|
272
280
|
}
|
|
273
|
-
function runYtDlp(args) {
|
|
281
|
+
function runYtDlp(args, onProgress) {
|
|
274
282
|
return new Promise((resolve, reject) => {
|
|
275
283
|
// Ensure yt-dlp can find Node.js as a JS runtime (required inside Docker
|
|
276
284
|
// containers that ship node but not deno).
|
|
@@ -278,17 +286,35 @@ function runYtDlp(args) {
|
|
|
278
286
|
const child = spawn('yt-dlp', fullArgs, { shell: false });
|
|
279
287
|
let stdout = '';
|
|
280
288
|
let stderr = '';
|
|
289
|
+
let timedOut = false;
|
|
290
|
+
const timeout = setTimeout(() => {
|
|
291
|
+
timedOut = true;
|
|
292
|
+
child.kill('SIGTERM');
|
|
293
|
+
}, 120_000);
|
|
281
294
|
child.stdout.on('data', (data) => {
|
|
282
295
|
stdout += String(data);
|
|
283
296
|
});
|
|
284
297
|
child.stderr.on('data', (data) => {
|
|
285
|
-
|
|
298
|
+
const text = String(data);
|
|
299
|
+
stderr += text;
|
|
300
|
+
const percent = text.match(/(\d+(?:\.\d+)?)%/);
|
|
301
|
+
if (percent) {
|
|
302
|
+
onProgress?.({
|
|
303
|
+
percent: Math.min(99, Math.max(1, Math.round(Number(percent[1])))),
|
|
304
|
+
message: `Downloading video… ${percent[1]}%`,
|
|
305
|
+
});
|
|
306
|
+
}
|
|
286
307
|
});
|
|
287
308
|
child.on('error', (error) => reject(error.code === 'ENOENT'
|
|
288
309
|
? new Error('yt-dlp is required for YouTube URLs. Install it from https://github.com/yt-dlp/yt-dlp#installation')
|
|
289
310
|
: error));
|
|
290
|
-
child.on('close', (code) =>
|
|
291
|
-
|
|
292
|
-
|
|
311
|
+
child.on('close', (code) => {
|
|
312
|
+
clearTimeout(timeout);
|
|
313
|
+
if (code === 0)
|
|
314
|
+
return resolve(stdout.trim());
|
|
315
|
+
if (timedOut)
|
|
316
|
+
return reject(new Error('Video download timed out after 2 minutes. Try a shorter video or a direct media link.'));
|
|
317
|
+
return reject(new Error(`yt-dlp failed (${code}): ${stderr.trim()}`));
|
|
318
|
+
});
|
|
293
319
|
});
|
|
294
320
|
}
|
|
@@ -25,6 +25,8 @@ export interface UrlImportOptions {
|
|
|
25
25
|
maxBytes?: number;
|
|
26
26
|
/** Maximum YouTube playlist entries (default: 10). */
|
|
27
27
|
playlistMax?: number;
|
|
28
|
+
/** Surface download activity to the lightweight media job status. */
|
|
29
|
+
onProgress?: (progress: { percent?: number; message: string }) => void;
|
|
28
30
|
}
|
|
29
31
|
export interface UrlInspection {
|
|
30
32
|
originalUrl: string;
|
|
@@ -97,20 +99,31 @@ export async function importMediaUrl(
|
|
|
97
99
|
const template = path.join(options.outputDir, '%(title).120B [%(id)s].%(ext)s');
|
|
98
100
|
const print =
|
|
99
101
|
'{"path":%(filepath)j,"title":%(title)j,"originalUrl":%(webpage_url)j,"ext":%(ext)j}';
|
|
100
|
-
const output = await runYtDlp(
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
102
|
+
const output = await runYtDlp(
|
|
103
|
+
[
|
|
104
|
+
'--no-playlist',
|
|
105
|
+
'--playlist-end',
|
|
106
|
+
String(options.playlistMax ?? 10),
|
|
107
|
+
'--socket-timeout',
|
|
108
|
+
'20',
|
|
109
|
+
'--retries',
|
|
110
|
+
'2',
|
|
111
|
+
'--fragment-retries',
|
|
112
|
+
'2',
|
|
113
|
+
'--concurrent-fragments',
|
|
114
|
+
'4',
|
|
115
|
+
'--format',
|
|
116
|
+
'best[height<=360]/bestvideo[height<=360]+bestaudio/best',
|
|
117
|
+
'--merge-output-format',
|
|
118
|
+
'mp4',
|
|
119
|
+
'-o',
|
|
120
|
+
template,
|
|
121
|
+
'--print',
|
|
122
|
+
`after_move:${print}`,
|
|
123
|
+
url,
|
|
124
|
+
],
|
|
125
|
+
options.onProgress,
|
|
126
|
+
);
|
|
114
127
|
const imported = output
|
|
115
128
|
.split('\n')
|
|
116
129
|
.filter(Boolean)
|
|
@@ -342,7 +355,10 @@ function mimeFromExtension(ext: string): string | undefined {
|
|
|
342
355
|
} as Record<string, string>
|
|
343
356
|
)[ext.toLowerCase()];
|
|
344
357
|
}
|
|
345
|
-
function runYtDlp(
|
|
358
|
+
function runYtDlp(
|
|
359
|
+
args: string[],
|
|
360
|
+
onProgress?: (progress: { percent?: number; message: string }) => void,
|
|
361
|
+
): Promise<string> {
|
|
346
362
|
return new Promise((resolve, reject) => {
|
|
347
363
|
// Ensure yt-dlp can find Node.js as a JS runtime (required inside Docker
|
|
348
364
|
// containers that ship node but not deno).
|
|
@@ -350,11 +366,24 @@ function runYtDlp(args: string[]): Promise<string> {
|
|
|
350
366
|
const child = spawn('yt-dlp', fullArgs, { shell: false });
|
|
351
367
|
let stdout = '';
|
|
352
368
|
let stderr = '';
|
|
369
|
+
let timedOut = false;
|
|
370
|
+
const timeout = setTimeout(() => {
|
|
371
|
+
timedOut = true;
|
|
372
|
+
child.kill('SIGTERM');
|
|
373
|
+
}, 120_000);
|
|
353
374
|
child.stdout.on('data', (data) => {
|
|
354
375
|
stdout += String(data);
|
|
355
376
|
});
|
|
356
377
|
child.stderr.on('data', (data) => {
|
|
357
|
-
|
|
378
|
+
const text = String(data);
|
|
379
|
+
stderr += text;
|
|
380
|
+
const percent = text.match(/(\d+(?:\.\d+)?)%/);
|
|
381
|
+
if (percent) {
|
|
382
|
+
onProgress?.({
|
|
383
|
+
percent: Math.min(99, Math.max(1, Math.round(Number(percent[1])))),
|
|
384
|
+
message: `Downloading video… ${percent[1]}%`,
|
|
385
|
+
});
|
|
386
|
+
}
|
|
358
387
|
});
|
|
359
388
|
(child as any).on('error', (error: NodeJS.ErrnoException) =>
|
|
360
389
|
reject(
|
|
@@ -365,10 +394,16 @@ function runYtDlp(args: string[]): Promise<string> {
|
|
|
365
394
|
: error,
|
|
366
395
|
),
|
|
367
396
|
);
|
|
368
|
-
(child as any).on('close', (code: number | null) =>
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
397
|
+
(child as any).on('close', (code: number | null) => {
|
|
398
|
+
clearTimeout(timeout);
|
|
399
|
+
if (code === 0) return resolve(stdout.trim());
|
|
400
|
+
if (timedOut)
|
|
401
|
+
return reject(
|
|
402
|
+
new Error(
|
|
403
|
+
'Video download timed out after 2 minutes. Try a shorter video or a direct media link.',
|
|
404
|
+
),
|
|
405
|
+
);
|
|
406
|
+
return reject(new Error(`yt-dlp failed (${code}): ${stderr.trim()}`));
|
|
407
|
+
});
|
|
373
408
|
});
|
|
374
409
|
}
|