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.
Files changed (282) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +3 -3
  3. package/.next/diagnostics/route-bundle-stats.json +12 -12
  4. package/.next/fallback-build-manifest.json +3 -3
  5. package/.next/required-server-files.js +1 -1
  6. package/.next/required-server-files.json +1 -1
  7. package/.next/server/app/_global-error.html +1 -1
  8. package/.next/server/app/_global-error.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  13. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  14. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  15. package/.next/server/app/_not-found.html +1 -1
  16. package/.next/server/app/_not-found.rsc +18 -18
  17. package/.next/server/app/_not-found.segments/_full.segment.rsc +18 -18
  18. package/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
  19. package/.next/server/app/_not-found.segments/_index.segment.rsc +12 -12
  20. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  21. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  22. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  23. package/.next/server/app/analytics/page_client-reference-manifest.js +1 -1
  24. package/.next/server/app/analytics.html +1 -1
  25. package/.next/server/app/analytics.rsc +19 -19
  26. package/.next/server/app/analytics.segments/_full.segment.rsc +19 -19
  27. package/.next/server/app/analytics.segments/_head.segment.rsc +4 -4
  28. package/.next/server/app/analytics.segments/_index.segment.rsc +12 -12
  29. package/.next/server/app/analytics.segments/_tree.segment.rsc +2 -2
  30. package/.next/server/app/analytics.segments/analytics/__PAGE__.segment.rsc +3 -3
  31. package/.next/server/app/analytics.segments/analytics.segment.rsc +3 -3
  32. package/.next/server/app/api/analytics/route.js.nft.json +1 -1
  33. package/.next/server/app/api/chat/route.js.nft.json +1 -1
  34. package/.next/server/app/api/chat/status/route.js.nft.json +1 -1
  35. package/.next/server/app/api/chat/suggestions/route.js.nft.json +1 -1
  36. package/.next/server/app/api/config/route.js.nft.json +1 -1
  37. package/.next/server/app/api/config/test/route.js.nft.json +1 -1
  38. package/.next/server/app/api/connections/route.js.nft.json +1 -1
  39. package/.next/server/app/api/connections/webhook/route.js.nft.json +1 -1
  40. package/.next/server/app/api/demo/route.js.nft.json +1 -1
  41. package/.next/server/app/api/deploy/cloud-project/route.js.nft.json +1 -1
  42. package/.next/server/app/api/deploy/ssh/route.js.nft.json +1 -1
  43. package/.next/server/app/api/deployment/blob-setup/route.js.nft.json +1 -1
  44. package/.next/server/app/api/deployment/config/route.js.nft.json +1 -1
  45. package/.next/server/app/api/describe-image/route.js.nft.json +1 -1
  46. package/.next/server/app/api/documents/route.js.nft.json +1 -1
  47. package/.next/server/app/api/firecrawl/local/route.js.nft.json +1 -1
  48. package/.next/server/app/api/index/route.js.nft.json +1 -1
  49. package/.next/server/app/api/jobs/[id]/route.js.nft.json +1 -1
  50. package/.next/server/app/api/jobs/route.js.nft.json +1 -1
  51. package/.next/server/app/api/media/[id]/route.js.nft.json +1 -1
  52. package/.next/server/app/api/media/process/route.js.nft.json +1 -1
  53. package/.next/server/app/api/media/route.js.nft.json +1 -1
  54. package/.next/server/app/api/media/stream/route.js.nft.json +1 -1
  55. package/.next/server/app/api/search/bing/route.js.nft.json +1 -1
  56. package/.next/server/app/api/search/brave/route.js.nft.json +1 -1
  57. package/.next/server/app/api/search/exa/route.js.nft.json +1 -1
  58. package/.next/server/app/api/search/google/route.js.nft.json +1 -1
  59. package/.next/server/app/api/search/route.js.nft.json +1 -1
  60. package/.next/server/app/api/search/tavily/route.js.nft.json +1 -1
  61. package/.next/server/app/api/server/agent/route.js.nft.json +1 -1
  62. package/.next/server/app/api/server/download/route.js.nft.json +1 -1
  63. package/.next/server/app/api/server/generate/route.js.nft.json +1 -1
  64. package/.next/server/app/api/server/local/route.js.nft.json +1 -1
  65. package/.next/server/app/api/servers/route.js.nft.json +1 -1
  66. package/.next/server/app/api/tabular/query/route.js.nft.json +1 -1
  67. package/.next/server/app/api/tabular/route.js.nft.json +1 -1
  68. package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  69. package/.next/server/app/chat.html +1 -1
  70. package/.next/server/app/chat.rsc +19 -19
  71. package/.next/server/app/chat.segments/_full.segment.rsc +19 -19
  72. package/.next/server/app/chat.segments/_head.segment.rsc +4 -4
  73. package/.next/server/app/chat.segments/_index.segment.rsc +12 -12
  74. package/.next/server/app/chat.segments/_tree.segment.rsc +2 -2
  75. package/.next/server/app/chat.segments/chat/__PAGE__.segment.rsc +3 -3
  76. package/.next/server/app/chat.segments/chat.segment.rsc +3 -3
  77. package/.next/server/app/data/page_client-reference-manifest.js +1 -1
  78. package/.next/server/app/data.html +1 -1
  79. package/.next/server/app/data.rsc +19 -19
  80. package/.next/server/app/data.segments/_full.segment.rsc +19 -19
  81. package/.next/server/app/data.segments/_head.segment.rsc +4 -4
  82. package/.next/server/app/data.segments/_index.segment.rsc +12 -12
  83. package/.next/server/app/data.segments/_tree.segment.rsc +2 -2
  84. package/.next/server/app/data.segments/data/__PAGE__.segment.rsc +3 -3
  85. package/.next/server/app/data.segments/data.segment.rsc +3 -3
  86. package/.next/server/app/index.html +1 -1
  87. package/.next/server/app/index.rsc +17 -17
  88. package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  89. package/.next/server/app/index.segments/_full.segment.rsc +17 -17
  90. package/.next/server/app/index.segments/_head.segment.rsc +4 -4
  91. package/.next/server/app/index.segments/_index.segment.rsc +12 -12
  92. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  93. package/.next/server/app/page_client-reference-manifest.js +1 -1
  94. package/.next/server/app/settings/page.js.nft.json +1 -1
  95. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  96. package/.next/server/app/settings.html +1 -1
  97. package/.next/server/app/settings.rsc +19 -19
  98. package/.next/server/app/settings.segments/_full.segment.rsc +19 -19
  99. package/.next/server/app/settings.segments/_head.segment.rsc +4 -4
  100. package/.next/server/app/settings.segments/_index.segment.rsc +12 -12
  101. package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  102. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +4 -4
  103. package/.next/server/app/settings.segments/settings.segment.rsc +3 -3
  104. package/.next/server/chunks/0598_next_dist_esm_build_templates_app-route_0kbcuk-.js +23 -24
  105. package/.next/server/chunks/0598_next_dist_esm_build_templates_app-route_0sbf4ny.js +1 -1
  106. package/.next/server/chunks/[root-of-the-server]__1jc54o2._.js +1 -1
  107. package/.next/server/chunks/_1twj5f0._.js +3 -3
  108. package/.next/server/chunks/packages_marketplace_src_125_g2p._.js +1 -1
  109. package/.next/server/chunks/packages_scraper_src_0kkcv_v._.js +1 -1
  110. package/.next/server/chunks/ssr/_169pdlf._.js +1 -1
  111. package/.next/server/chunks/ssr/_18jagqc._.js +2 -2
  112. package/.next/server/chunks/ssr/_1hetwwu._.js +1 -1
  113. package/.next/server/chunks/ssr/_1yqlx1m._.js +1 -1
  114. package/.next/server/middleware-build-manifest.js +3 -3
  115. package/.next/server/pages/404.html +1 -1
  116. package/.next/server/pages/500.html +1 -1
  117. package/.next/standalone/apps/web/.next/BUILD_ID +1 -1
  118. package/.next/standalone/apps/web/.next/build-manifest.json +3 -3
  119. package/.next/standalone/apps/web/.next/required-server-files.json +1 -1
  120. package/.next/standalone/apps/web/.next/server/app/_global-error.html +1 -1
  121. package/.next/standalone/apps/web/.next/server/app/_global-error.rsc +1 -1
  122. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  123. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  124. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  125. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  126. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  127. package/.next/standalone/apps/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  128. package/.next/standalone/apps/web/.next/server/app/_not-found.html +1 -1
  129. package/.next/standalone/apps/web/.next/server/app/_not-found.rsc +18 -18
  130. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_full.segment.rsc +18 -18
  131. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
  132. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_index.segment.rsc +12 -12
  133. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  134. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  135. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  136. package/.next/standalone/apps/web/.next/server/app/analytics/page_client-reference-manifest.js +1 -1
  137. package/.next/standalone/apps/web/.next/server/app/analytics.html +1 -1
  138. package/.next/standalone/apps/web/.next/server/app/analytics.rsc +19 -19
  139. package/.next/standalone/apps/web/.next/server/app/analytics.segments/_full.segment.rsc +19 -19
  140. package/.next/standalone/apps/web/.next/server/app/analytics.segments/_head.segment.rsc +4 -4
  141. package/.next/standalone/apps/web/.next/server/app/analytics.segments/_index.segment.rsc +12 -12
  142. package/.next/standalone/apps/web/.next/server/app/analytics.segments/_tree.segment.rsc +2 -2
  143. package/.next/standalone/apps/web/.next/server/app/analytics.segments/analytics/__PAGE__.segment.rsc +3 -3
  144. package/.next/standalone/apps/web/.next/server/app/analytics.segments/analytics.segment.rsc +3 -3
  145. package/.next/standalone/apps/web/.next/server/app/api/analytics/route.js.nft.json +1 -1
  146. package/.next/standalone/apps/web/.next/server/app/api/chat/route.js.nft.json +1 -1
  147. package/.next/standalone/apps/web/.next/server/app/api/chat/status/route.js.nft.json +1 -1
  148. package/.next/standalone/apps/web/.next/server/app/api/chat/suggestions/route.js.nft.json +1 -1
  149. package/.next/standalone/apps/web/.next/server/app/api/config/route.js.nft.json +1 -1
  150. package/.next/standalone/apps/web/.next/server/app/api/config/test/route.js.nft.json +1 -1
  151. package/.next/standalone/apps/web/.next/server/app/api/connections/route.js.nft.json +1 -1
  152. package/.next/standalone/apps/web/.next/server/app/api/connections/webhook/route.js.nft.json +1 -1
  153. package/.next/standalone/apps/web/.next/server/app/api/demo/route.js.nft.json +1 -1
  154. package/.next/standalone/apps/web/.next/server/app/api/deploy/cloud-project/route.js.nft.json +1 -1
  155. package/.next/standalone/apps/web/.next/server/app/api/deploy/ssh/route.js.nft.json +1 -1
  156. package/.next/standalone/apps/web/.next/server/app/api/deployment/blob-setup/route.js.nft.json +1 -1
  157. package/.next/standalone/apps/web/.next/server/app/api/deployment/config/route.js.nft.json +1 -1
  158. package/.next/standalone/apps/web/.next/server/app/api/describe-image/route.js.nft.json +1 -1
  159. package/.next/standalone/apps/web/.next/server/app/api/documents/route.js.nft.json +1 -1
  160. package/.next/standalone/apps/web/.next/server/app/api/firecrawl/local/route.js.nft.json +1 -1
  161. package/.next/standalone/apps/web/.next/server/app/api/index/route.js.nft.json +1 -1
  162. package/.next/standalone/apps/web/.next/server/app/api/jobs/[id]/route.js.nft.json +1 -1
  163. package/.next/standalone/apps/web/.next/server/app/api/jobs/route.js.nft.json +1 -1
  164. package/.next/standalone/apps/web/.next/server/app/api/media/[id]/route.js.nft.json +1 -1
  165. package/.next/standalone/apps/web/.next/server/app/api/media/process/route.js.nft.json +1 -1
  166. package/.next/standalone/apps/web/.next/server/app/api/media/route.js.nft.json +1 -1
  167. package/.next/standalone/apps/web/.next/server/app/api/media/stream/route.js.nft.json +1 -1
  168. package/.next/standalone/apps/web/.next/server/app/api/search/bing/route.js.nft.json +1 -1
  169. package/.next/standalone/apps/web/.next/server/app/api/search/brave/route.js.nft.json +1 -1
  170. package/.next/standalone/apps/web/.next/server/app/api/search/exa/route.js.nft.json +1 -1
  171. package/.next/standalone/apps/web/.next/server/app/api/search/google/route.js.nft.json +1 -1
  172. package/.next/standalone/apps/web/.next/server/app/api/search/route.js.nft.json +1 -1
  173. package/.next/standalone/apps/web/.next/server/app/api/search/tavily/route.js.nft.json +1 -1
  174. package/.next/standalone/apps/web/.next/server/app/api/server/agent/route.js.nft.json +1 -1
  175. package/.next/standalone/apps/web/.next/server/app/api/server/download/route.js.nft.json +1 -1
  176. package/.next/standalone/apps/web/.next/server/app/api/server/generate/route.js.nft.json +1 -1
  177. package/.next/standalone/apps/web/.next/server/app/api/server/local/route.js.nft.json +1 -1
  178. package/.next/standalone/apps/web/.next/server/app/api/servers/route.js.nft.json +1 -1
  179. package/.next/standalone/apps/web/.next/server/app/api/tabular/query/route.js.nft.json +1 -1
  180. package/.next/standalone/apps/web/.next/server/app/api/tabular/route.js.nft.json +1 -1
  181. package/.next/standalone/apps/web/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  182. package/.next/standalone/apps/web/.next/server/app/chat.html +1 -1
  183. package/.next/standalone/apps/web/.next/server/app/chat.rsc +19 -19
  184. package/.next/standalone/apps/web/.next/server/app/chat.segments/_full.segment.rsc +19 -19
  185. package/.next/standalone/apps/web/.next/server/app/chat.segments/_head.segment.rsc +4 -4
  186. package/.next/standalone/apps/web/.next/server/app/chat.segments/_index.segment.rsc +12 -12
  187. package/.next/standalone/apps/web/.next/server/app/chat.segments/_tree.segment.rsc +2 -2
  188. package/.next/standalone/apps/web/.next/server/app/chat.segments/chat/__PAGE__.segment.rsc +3 -3
  189. package/.next/standalone/apps/web/.next/server/app/chat.segments/chat.segment.rsc +3 -3
  190. package/.next/standalone/apps/web/.next/server/app/data/page_client-reference-manifest.js +1 -1
  191. package/.next/standalone/apps/web/.next/server/app/data.html +1 -1
  192. package/.next/standalone/apps/web/.next/server/app/data.rsc +19 -19
  193. package/.next/standalone/apps/web/.next/server/app/data.segments/_full.segment.rsc +19 -19
  194. package/.next/standalone/apps/web/.next/server/app/data.segments/_head.segment.rsc +4 -4
  195. package/.next/standalone/apps/web/.next/server/app/data.segments/_index.segment.rsc +12 -12
  196. package/.next/standalone/apps/web/.next/server/app/data.segments/_tree.segment.rsc +2 -2
  197. package/.next/standalone/apps/web/.next/server/app/data.segments/data/__PAGE__.segment.rsc +3 -3
  198. package/.next/standalone/apps/web/.next/server/app/data.segments/data.segment.rsc +3 -3
  199. package/.next/standalone/apps/web/.next/server/app/index.html +1 -1
  200. package/.next/standalone/apps/web/.next/server/app/index.rsc +17 -17
  201. package/.next/standalone/apps/web/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  202. package/.next/standalone/apps/web/.next/server/app/index.segments/_full.segment.rsc +17 -17
  203. package/.next/standalone/apps/web/.next/server/app/index.segments/_head.segment.rsc +4 -4
  204. package/.next/standalone/apps/web/.next/server/app/index.segments/_index.segment.rsc +12 -12
  205. package/.next/standalone/apps/web/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  206. package/.next/standalone/apps/web/.next/server/app/page_client-reference-manifest.js +1 -1
  207. package/.next/standalone/apps/web/.next/server/app/settings/page.js.nft.json +1 -1
  208. package/.next/standalone/apps/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  209. package/.next/standalone/apps/web/.next/server/app/settings.html +1 -1
  210. package/.next/standalone/apps/web/.next/server/app/settings.rsc +19 -19
  211. package/.next/standalone/apps/web/.next/server/app/settings.segments/_full.segment.rsc +19 -19
  212. package/.next/standalone/apps/web/.next/server/app/settings.segments/_head.segment.rsc +4 -4
  213. package/.next/standalone/apps/web/.next/server/app/settings.segments/_index.segment.rsc +12 -12
  214. package/.next/standalone/apps/web/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  215. package/.next/standalone/apps/web/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +4 -4
  216. package/.next/standalone/apps/web/.next/server/app/settings.segments/settings.segment.rsc +3 -3
  217. package/.next/standalone/apps/web/.next/server/chunks/0598_next_dist_esm_build_templates_app-route_0kbcuk-.js +23 -24
  218. package/.next/standalone/apps/web/.next/server/chunks/0598_next_dist_esm_build_templates_app-route_0sbf4ny.js +1 -1
  219. package/.next/standalone/apps/web/.next/server/chunks/[root-of-the-server]__1jc54o2._.js +1 -1
  220. package/.next/standalone/apps/web/.next/server/chunks/_1twj5f0._.js +3 -3
  221. package/.next/standalone/apps/web/.next/server/chunks/packages_marketplace_src_125_g2p._.js +1 -1
  222. package/.next/standalone/apps/web/.next/server/chunks/packages_scraper_src_0kkcv_v._.js +1 -1
  223. package/.next/standalone/apps/web/.next/server/chunks/ssr/_169pdlf._.js +1 -1
  224. package/.next/standalone/apps/web/.next/server/chunks/ssr/_18jagqc._.js +2 -2
  225. package/.next/standalone/apps/web/.next/server/chunks/ssr/_1hetwwu._.js +1 -1
  226. package/.next/standalone/apps/web/.next/server/chunks/ssr/_1yqlx1m._.js +1 -1
  227. package/.next/standalone/apps/web/.next/server/middleware-build-manifest.js +3 -3
  228. package/.next/standalone/apps/web/.next/server/pages/404.html +1 -1
  229. package/.next/standalone/apps/web/.next/server/pages/500.html +1 -1
  230. package/.next/standalone/apps/web/.next/static/chunks/{2-st4vd5971ry.js → 06u04tzgkz4_f.js} +1 -1
  231. package/.next/standalone/apps/web/.next/static/chunks/{3q4k1i384p4oi.js → 19k_g3af0cf7b.js} +1 -1
  232. package/.next/standalone/apps/web/.next/static/chunks/{3mp3jya53i-g-.js → 19krxv-ou9c8c.js} +6 -6
  233. package/.next/standalone/apps/web/.next/static/chunks/1_nk3imchwn8a.css +1 -0
  234. package/.next/standalone/apps/web/.next/static/chunks/{0qyuw19snetjl.js → 2ljwki2xxnblc.js} +2 -2
  235. package/.next/standalone/apps/web/CHANGELOG.md +17 -0
  236. package/.next/standalone/apps/web/app/api/chat/route.ts +62 -33
  237. package/.next/standalone/apps/web/app/api/media/process/route.ts +6 -0
  238. package/.next/standalone/apps/web/app/api/media/route.ts +3 -2
  239. package/.next/standalone/apps/web/app/api/media/stream/route.ts +19 -3
  240. package/.next/standalone/apps/web/app/settings/page.tsx +8 -17
  241. package/.next/standalone/apps/web/components/chat/chat-workspace.tsx +11 -4
  242. package/.next/standalone/apps/web/components/chat/message-item.tsx +18 -6
  243. package/.next/standalone/apps/web/components/chat/tools/knowledge-base-result.tsx +3 -4
  244. package/.next/standalone/apps/web/components/data/data-workspace.tsx +6 -2
  245. package/.next/standalone/apps/web/components/data/jobs-panel.tsx +22 -2
  246. package/.next/standalone/apps/web/components/data/media-panel.tsx +117 -91
  247. package/.next/standalone/apps/web/components/settings/marketplace-section.tsx +5 -0
  248. package/.next/standalone/apps/web/components/settings/prompts-section.tsx +13 -3
  249. package/.next/standalone/apps/web/package.json +1 -1
  250. package/.next/standalone/apps/web/server.js +1 -1
  251. package/.next/standalone/packages/tools/video-audio/CHANGELOG.md +6 -0
  252. package/.next/standalone/packages/tools/video-audio/dist/url-importer.js +34 -8
  253. package/.next/standalone/packages/tools/video-audio/package.json +1 -1
  254. package/.next/standalone/packages/tools/video-audio/src/url-importer.ts +56 -21
  255. package/.next/static/chunks/{2-st4vd5971ry.js → 06u04tzgkz4_f.js} +1 -1
  256. package/.next/static/chunks/{3q4k1i384p4oi.js → 19k_g3af0cf7b.js} +1 -1
  257. package/.next/static/chunks/{3mp3jya53i-g-.js → 19krxv-ou9c8c.js} +6 -6
  258. package/.next/static/chunks/1_nk3imchwn8a.css +1 -0
  259. package/.next/static/chunks/{0qyuw19snetjl.js → 2ljwki2xxnblc.js} +2 -2
  260. package/CHANGELOG.md +17 -0
  261. package/app/api/chat/route.ts +62 -33
  262. package/app/api/media/process/route.ts +6 -0
  263. package/app/api/media/route.ts +3 -2
  264. package/app/api/media/stream/route.ts +19 -3
  265. package/app/settings/page.tsx +8 -17
  266. package/components/chat/chat-workspace.tsx +11 -4
  267. package/components/chat/message-item.tsx +18 -6
  268. package/components/chat/tools/knowledge-base-result.tsx +3 -4
  269. package/components/data/data-workspace.tsx +6 -2
  270. package/components/data/jobs-panel.tsx +22 -2
  271. package/components/data/media-panel.tsx +117 -91
  272. package/components/settings/marketplace-section.tsx +5 -0
  273. package/components/settings/prompts-section.tsx +13 -3
  274. package/package.json +6 -6
  275. package/.next/standalone/apps/web/.next/static/chunks/0fa79dhcoeytz.css +0 -1
  276. package/.next/static/chunks/0fa79dhcoeytz.css +0 -1
  277. /package/.next/standalone/apps/web/.next/static/{ZV6fJc5ZoZ_a-UPNhgKZS → IOngxM7BWde96UQMAebFB}/_buildManifest.js +0 -0
  278. /package/.next/standalone/apps/web/.next/static/{ZV6fJc5ZoZ_a-UPNhgKZS → IOngxM7BWde96UQMAebFB}/_clientMiddlewareManifest.js +0 -0
  279. /package/.next/standalone/apps/web/.next/static/{ZV6fJc5ZoZ_a-UPNhgKZS → IOngxM7BWde96UQMAebFB}/_ssgManifest.js +0 -0
  280. /package/.next/static/{ZV6fJc5ZoZ_a-UPNhgKZS → IOngxM7BWde96UQMAebFB}/_buildManifest.js +0 -0
  281. /package/.next/static/{ZV6fJc5ZoZ_a-UPNhgKZS → IOngxM7BWde96UQMAebFB}/_clientMiddlewareManifest.js +0 -0
  282. /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
- <div className="mt-4 flex flex-col gap-4 border-t border-border/70 pt-4">
917
- <div className="grid gap-2 sm:grid-cols-3">
918
- <EstimateMetric
919
- label="Media"
920
- value={`${remoteEstimates.reduce(
921
- (sum: any, item: any) => sum + (item.entryCount ?? 1),
922
- 0,
923
- )} item(s) · ${
924
- remoteDuration ? formatDuration(remoteDuration) : 'duration unavailable'
925
- }`}
926
- />
927
- <EstimateMetric
928
- label="Expected time"
929
- value={
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
- </div>
962
- );
963
- }
964
- let embedUrl = est.originalUrl;
965
- if (est.isYouTube) {
966
- try {
967
- const u = new URL(est.originalUrl);
968
- const v = u.hostname.includes('youtu.be')
969
- ? u.pathname.slice(1)
970
- : u.searchParams.get('v');
971
- embedUrl = `https://www.youtube.com/embed/${v}`;
972
- } catch (e) {
973
- // ignore
974
- }
975
- return (
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
- } else {
990
- return (
991
- <video
992
- key={i}
993
- src={embedUrl}
994
- controls
995
- className="w-full max-w-sm rounded-md aspect-video bg-muted object-cover shadow-sm border border-border"
996
- />
997
- );
998
- }
999
- })}
1000
- </div>
1001
- ) : null}
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-300 bg-emerald-50/20 p-3 dark:border-emerald-700/60 dark:bg-emerald-950/20"
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-300 bg-emerald-50/70 text-emerald-700 dark:border-emerald-700/70 dark:bg-emerald-950/40 dark:text-emerald-300'
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
- systemPrompt: data.config.systemPrompt || DEFAULT_SYSTEM_PROMPT,
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 || '') !== (data?.config?.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
- Override the default instructions given to the AI. Leave blank for the default behavior.
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>
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "larkup",
3
- "version": "0.1.36",
3
+ "version": "0.1.38",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "larkup": "./bin/larkup.js"
@@ -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.36"},"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":[]}}
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-progress',
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
- 'bestvideo[height<=480]+bestaudio/best[height<=480]/best',
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
- stderr += String(data);
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) => code === 0
291
- ? resolve(stdout.trim())
292
- : reject(new Error(`yt-dlp failed (${code}): ${stderr.trim()}`)));
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
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@larkup/tool-video-audio",
3
- "version": "0.2.2",
3
+ "version": "0.2.3",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -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
- '--no-progress',
102
- '--playlist-end',
103
- String(options.playlistMax ?? 10),
104
- '--format',
105
- 'bestvideo[height<=480]+bestaudio/best[height<=480]/best',
106
- '--merge-output-format',
107
- 'mp4',
108
- '-o',
109
- template,
110
- '--print',
111
- `after_move:${print}`,
112
- url,
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(args: string[]): Promise<string> {
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
- stderr += String(data);
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
- code === 0
370
- ? resolve(stdout.trim())
371
- : reject(new Error(`yt-dlp failed (${code}): ${stderr.trim()}`)),
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
  }