larkup 0.1.39 → 0.1.41

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 (248) 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 +22 -21
  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.js.nft.json +1 -1
  15. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  16. package/.next/server/app/_not-found.html +1 -1
  17. package/.next/server/app/_not-found.rsc +18 -18
  18. package/.next/server/app/_not-found.segments/_full.segment.rsc +18 -18
  19. package/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
  20. package/.next/server/app/_not-found.segments/_index.segment.rsc +12 -12
  21. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  22. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  23. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  24. package/.next/server/app/analytics/page.js.nft.json +1 -1
  25. package/.next/server/app/analytics/page_client-reference-manifest.js +1 -1
  26. package/.next/server/app/analytics.html +1 -1
  27. package/.next/server/app/analytics.rsc +19 -19
  28. package/.next/server/app/analytics.segments/_full.segment.rsc +19 -19
  29. package/.next/server/app/analytics.segments/_head.segment.rsc +4 -4
  30. package/.next/server/app/analytics.segments/_index.segment.rsc +12 -12
  31. package/.next/server/app/analytics.segments/_tree.segment.rsc +2 -2
  32. package/.next/server/app/analytics.segments/analytics/__PAGE__.segment.rsc +3 -3
  33. package/.next/server/app/analytics.segments/analytics.segment.rsc +3 -3
  34. package/.next/server/app/chat/page.js.nft.json +1 -1
  35. package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  36. package/.next/server/app/chat.html +1 -1
  37. package/.next/server/app/chat.rsc +19 -19
  38. package/.next/server/app/chat.segments/_full.segment.rsc +19 -19
  39. package/.next/server/app/chat.segments/_head.segment.rsc +4 -4
  40. package/.next/server/app/chat.segments/_index.segment.rsc +12 -12
  41. package/.next/server/app/chat.segments/_tree.segment.rsc +2 -2
  42. package/.next/server/app/chat.segments/chat/__PAGE__.segment.rsc +3 -3
  43. package/.next/server/app/chat.segments/chat.segment.rsc +3 -3
  44. package/.next/server/app/data/page.js.nft.json +1 -1
  45. package/.next/server/app/data/page_client-reference-manifest.js +1 -1
  46. package/.next/server/app/data.html +1 -1
  47. package/.next/server/app/data.rsc +25 -26
  48. package/.next/server/app/data.segments/_full.segment.rsc +25 -26
  49. package/.next/server/app/data.segments/_head.segment.rsc +4 -4
  50. package/.next/server/app/data.segments/_index.segment.rsc +12 -12
  51. package/.next/server/app/data.segments/_tree.segment.rsc +2 -2
  52. package/.next/server/app/data.segments/data/__PAGE__.segment.rsc +3 -3
  53. package/.next/server/app/data.segments/data.segment.rsc +3 -3
  54. package/.next/server/app/index.html +1 -1
  55. package/.next/server/app/index.rsc +17 -17
  56. package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  57. package/.next/server/app/index.segments/_full.segment.rsc +17 -17
  58. package/.next/server/app/index.segments/_head.segment.rsc +4 -4
  59. package/.next/server/app/index.segments/_index.segment.rsc +12 -12
  60. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  61. package/.next/server/app/page.js.nft.json +1 -1
  62. package/.next/server/app/page_client-reference-manifest.js +1 -1
  63. package/.next/server/app/settings/page.js.nft.json +1 -1
  64. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  65. package/.next/server/app/settings.html +1 -1
  66. package/.next/server/app/settings.rsc +19 -19
  67. package/.next/server/app/settings.segments/_full.segment.rsc +19 -19
  68. package/.next/server/app/settings.segments/_head.segment.rsc +4 -4
  69. package/.next/server/app/settings.segments/_index.segment.rsc +12 -12
  70. package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  71. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +4 -4
  72. package/.next/server/app/settings.segments/settings.segment.rsc +3 -3
  73. package/.next/server/chunks/0598_next_dist_esm_build_templates_app-route_0kbcuk-.js +8 -7
  74. package/.next/server/chunks/0598_next_dist_esm_build_templates_app-route_0sbf4ny.js +2 -2
  75. package/.next/server/chunks/[root-of-the-server]__0j2l54r._.js +1 -1
  76. package/.next/server/chunks/packages_scraper_src_0kkcv_v._.js +1 -1
  77. package/.next/server/chunks/ssr/{[root-of-the-server]__0m21fli._.js → [root-of-the-server]__0pgotbk._.js} +2 -2
  78. package/.next/server/chunks/ssr/[root-of-the-server]__1k1mxo2._.js +3 -0
  79. package/.next/server/chunks/ssr/_169pdlf._.js +5 -5
  80. package/.next/server/chunks/ssr/_18jagqc._.js +2 -2
  81. package/.next/server/chunks/ssr/_1hetwwu._.js +2 -2
  82. package/.next/{standalone/apps/web/.next/server/chunks/ssr/_0s8403d._.js → server/chunks/ssr/_1p6lb7s._.js} +2 -2
  83. package/.next/server/chunks/ssr/_1yqlx1m._.js +1 -1
  84. package/.next/server/chunks/ssr/apps_web_components_analytics_analytics-dashboard_tsx_1056-z3._.js +1 -1
  85. package/.next/server/middleware-build-manifest.js +3 -3
  86. package/.next/server/pages/404.html +1 -1
  87. package/.next/server/pages/500.html +1 -1
  88. package/.next/standalone/apps/web/.next/BUILD_ID +1 -1
  89. package/.next/standalone/apps/web/.next/build-manifest.json +3 -3
  90. package/.next/standalone/apps/web/.next/required-server-files.json +1 -1
  91. package/.next/standalone/apps/web/.next/server/app/_global-error.html +1 -1
  92. package/.next/standalone/apps/web/.next/server/app/_global-error.rsc +1 -1
  93. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  94. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  95. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  96. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  97. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  98. package/.next/standalone/apps/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  99. package/.next/standalone/apps/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  100. package/.next/standalone/apps/web/.next/server/app/_not-found.html +1 -1
  101. package/.next/standalone/apps/web/.next/server/app/_not-found.rsc +18 -18
  102. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_full.segment.rsc +18 -18
  103. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
  104. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_index.segment.rsc +12 -12
  105. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  106. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  107. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  108. package/.next/standalone/apps/web/.next/server/app/analytics/page.js.nft.json +1 -1
  109. package/.next/standalone/apps/web/.next/server/app/analytics/page_client-reference-manifest.js +1 -1
  110. package/.next/standalone/apps/web/.next/server/app/analytics.html +1 -1
  111. package/.next/standalone/apps/web/.next/server/app/analytics.rsc +19 -19
  112. package/.next/standalone/apps/web/.next/server/app/analytics.segments/_full.segment.rsc +19 -19
  113. package/.next/standalone/apps/web/.next/server/app/analytics.segments/_head.segment.rsc +4 -4
  114. package/.next/standalone/apps/web/.next/server/app/analytics.segments/_index.segment.rsc +12 -12
  115. package/.next/standalone/apps/web/.next/server/app/analytics.segments/_tree.segment.rsc +2 -2
  116. package/.next/standalone/apps/web/.next/server/app/analytics.segments/analytics/__PAGE__.segment.rsc +3 -3
  117. package/.next/standalone/apps/web/.next/server/app/analytics.segments/analytics.segment.rsc +3 -3
  118. package/.next/standalone/apps/web/.next/server/app/chat/page.js.nft.json +1 -1
  119. package/.next/standalone/apps/web/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  120. package/.next/standalone/apps/web/.next/server/app/chat.html +1 -1
  121. package/.next/standalone/apps/web/.next/server/app/chat.rsc +19 -19
  122. package/.next/standalone/apps/web/.next/server/app/chat.segments/_full.segment.rsc +19 -19
  123. package/.next/standalone/apps/web/.next/server/app/chat.segments/_head.segment.rsc +4 -4
  124. package/.next/standalone/apps/web/.next/server/app/chat.segments/_index.segment.rsc +12 -12
  125. package/.next/standalone/apps/web/.next/server/app/chat.segments/_tree.segment.rsc +2 -2
  126. package/.next/standalone/apps/web/.next/server/app/chat.segments/chat/__PAGE__.segment.rsc +3 -3
  127. package/.next/standalone/apps/web/.next/server/app/chat.segments/chat.segment.rsc +3 -3
  128. package/.next/standalone/apps/web/.next/server/app/data/page.js.nft.json +1 -1
  129. package/.next/standalone/apps/web/.next/server/app/data/page_client-reference-manifest.js +1 -1
  130. package/.next/standalone/apps/web/.next/server/app/data.html +1 -1
  131. package/.next/standalone/apps/web/.next/server/app/data.rsc +25 -26
  132. package/.next/standalone/apps/web/.next/server/app/data.segments/_full.segment.rsc +25 -26
  133. package/.next/standalone/apps/web/.next/server/app/data.segments/_head.segment.rsc +4 -4
  134. package/.next/standalone/apps/web/.next/server/app/data.segments/_index.segment.rsc +12 -12
  135. package/.next/standalone/apps/web/.next/server/app/data.segments/_tree.segment.rsc +2 -2
  136. package/.next/standalone/apps/web/.next/server/app/data.segments/data/__PAGE__.segment.rsc +3 -3
  137. package/.next/standalone/apps/web/.next/server/app/data.segments/data.segment.rsc +3 -3
  138. package/.next/standalone/apps/web/.next/server/app/index.html +1 -1
  139. package/.next/standalone/apps/web/.next/server/app/index.rsc +17 -17
  140. package/.next/standalone/apps/web/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  141. package/.next/standalone/apps/web/.next/server/app/index.segments/_full.segment.rsc +17 -17
  142. package/.next/standalone/apps/web/.next/server/app/index.segments/_head.segment.rsc +4 -4
  143. package/.next/standalone/apps/web/.next/server/app/index.segments/_index.segment.rsc +12 -12
  144. package/.next/standalone/apps/web/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  145. package/.next/standalone/apps/web/.next/server/app/page.js.nft.json +1 -1
  146. package/.next/standalone/apps/web/.next/server/app/page_client-reference-manifest.js +1 -1
  147. package/.next/standalone/apps/web/.next/server/app/settings/page.js.nft.json +1 -1
  148. package/.next/standalone/apps/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  149. package/.next/standalone/apps/web/.next/server/app/settings.html +1 -1
  150. package/.next/standalone/apps/web/.next/server/app/settings.rsc +19 -19
  151. package/.next/standalone/apps/web/.next/server/app/settings.segments/_full.segment.rsc +19 -19
  152. package/.next/standalone/apps/web/.next/server/app/settings.segments/_head.segment.rsc +4 -4
  153. package/.next/standalone/apps/web/.next/server/app/settings.segments/_index.segment.rsc +12 -12
  154. package/.next/standalone/apps/web/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  155. package/.next/standalone/apps/web/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +4 -4
  156. package/.next/standalone/apps/web/.next/server/app/settings.segments/settings.segment.rsc +3 -3
  157. package/.next/standalone/apps/web/.next/server/chunks/0598_next_dist_esm_build_templates_app-route_0kbcuk-.js +8 -7
  158. package/.next/standalone/apps/web/.next/server/chunks/0598_next_dist_esm_build_templates_app-route_0sbf4ny.js +2 -2
  159. package/.next/standalone/apps/web/.next/server/chunks/[root-of-the-server]__0j2l54r._.js +1 -1
  160. package/.next/standalone/apps/web/.next/server/chunks/packages_scraper_src_0kkcv_v._.js +1 -1
  161. package/.next/standalone/apps/web/.next/server/chunks/ssr/{[root-of-the-server]__0m21fli._.js → [root-of-the-server]__0pgotbk._.js} +2 -2
  162. package/.next/standalone/apps/web/.next/server/chunks/ssr/[root-of-the-server]__1k1mxo2._.js +3 -0
  163. package/.next/standalone/apps/web/.next/server/chunks/ssr/_169pdlf._.js +5 -5
  164. package/.next/standalone/apps/web/.next/server/chunks/ssr/_18jagqc._.js +2 -2
  165. package/.next/standalone/apps/web/.next/server/chunks/ssr/_1hetwwu._.js +2 -2
  166. package/.next/{server/chunks/ssr/_0s8403d._.js → standalone/apps/web/.next/server/chunks/ssr/_1p6lb7s._.js} +2 -2
  167. package/.next/standalone/apps/web/.next/server/chunks/ssr/_1yqlx1m._.js +1 -1
  168. package/.next/standalone/apps/web/.next/server/chunks/ssr/apps_web_components_analytics_analytics-dashboard_tsx_1056-z3._.js +1 -1
  169. package/.next/standalone/apps/web/.next/server/middleware-build-manifest.js +3 -3
  170. package/.next/standalone/apps/web/.next/server/pages/404.html +1 -1
  171. package/.next/standalone/apps/web/.next/server/pages/500.html +1 -1
  172. package/.next/standalone/apps/web/.next/static/chunks/0f_k7h1yraes3.js +1 -0
  173. package/.next/standalone/apps/web/.next/static/chunks/1j_-mc43_9-b3.js +121 -0
  174. package/.next/standalone/apps/web/.next/static/chunks/23efo4rpc31kr.js +1 -0
  175. package/.next/standalone/apps/web/.next/static/chunks/2dvtyg2k2op4x.js +11 -0
  176. package/.next/standalone/apps/web/.next/static/chunks/{2ljwki2xxnblc.js → 2h-80z3n8mi3d.js} +7 -7
  177. package/.next/{static/chunks/1ov69q-i9ybqi.js → standalone/apps/web/.next/static/chunks/2x1t8sqst0ipu.js} +1 -1
  178. package/.next/standalone/apps/web/.next/static/chunks/37j20in7beze4.js +1 -0
  179. package/.next/standalone/apps/web/.next/static/chunks/{1cxabi5yzqz57.js → 38f3p67a1uufx.js} +1 -1
  180. package/.next/standalone/apps/web/.next/static/chunks/3fe06cefiv690.css +1 -0
  181. package/.next/standalone/apps/web/CHANGELOG.md +21 -0
  182. package/.next/standalone/apps/web/app/api/chat/route.ts +34 -13
  183. package/.next/standalone/apps/web/app/api/chat/tools.ts +10 -1
  184. package/.next/standalone/apps/web/app/api/media/process/route.ts +34 -1
  185. package/.next/standalone/apps/web/app/settings/page.tsx +16 -5
  186. package/.next/standalone/apps/web/bin/larkup.js +12 -1
  187. package/.next/standalone/apps/web/components/chat/message-item.tsx +68 -3
  188. package/.next/standalone/apps/web/components/data/data-workspace.tsx +53 -120
  189. package/.next/standalone/apps/web/components/data/firecrawl-notice.tsx +3 -13
  190. package/.next/standalone/apps/web/components/data/media-panel.tsx +182 -25
  191. package/.next/standalone/apps/web/components/data/scrape-panel.tsx +4 -12
  192. package/.next/standalone/apps/web/components/data/upload-panel.tsx +0 -1
  193. package/.next/standalone/apps/web/components/index/index-workspace.tsx +48 -25
  194. package/.next/standalone/apps/web/components/settings/marketplace-section.tsx +1 -1
  195. package/.next/standalone/apps/web/components/settings/settings-layout.tsx +1 -2
  196. package/.next/standalone/apps/web/package.json +1 -1
  197. package/.next/standalone/apps/web/server.js +1 -1
  198. package/.next/standalone/packages/tools/doc-editor/CHANGELOG.md +7 -0
  199. package/.next/standalone/packages/tools/doc-editor/dist/editor.js +1 -15
  200. package/.next/standalone/packages/tools/doc-editor/package.json +1 -1
  201. package/.next/standalone/packages/tools/doc-editor/src/editor.ts +1 -15
  202. package/.next/standalone/packages/tools/video-audio/CHANGELOG.md +6 -0
  203. package/.next/standalone/packages/tools/video-audio/dist/url-importer.js +37 -5
  204. package/.next/standalone/packages/tools/video-audio/package.json +1 -1
  205. package/.next/standalone/packages/tools/video-audio/src/url-importer.ts +61 -25
  206. package/.next/static/chunks/0f_k7h1yraes3.js +1 -0
  207. package/.next/static/chunks/1j_-mc43_9-b3.js +121 -0
  208. package/.next/static/chunks/23efo4rpc31kr.js +1 -0
  209. package/.next/static/chunks/2dvtyg2k2op4x.js +11 -0
  210. package/.next/static/chunks/{2ljwki2xxnblc.js → 2h-80z3n8mi3d.js} +7 -7
  211. package/.next/{standalone/apps/web/.next/static/chunks/1ov69q-i9ybqi.js → static/chunks/2x1t8sqst0ipu.js} +1 -1
  212. package/.next/static/chunks/37j20in7beze4.js +1 -0
  213. package/.next/static/chunks/{1cxabi5yzqz57.js → 38f3p67a1uufx.js} +1 -1
  214. package/.next/static/chunks/3fe06cefiv690.css +1 -0
  215. package/CHANGELOG.md +21 -0
  216. package/app/api/chat/route.ts +34 -13
  217. package/app/api/chat/tools.ts +10 -1
  218. package/app/api/media/process/route.ts +34 -1
  219. package/app/settings/page.tsx +16 -5
  220. package/bin/larkup.js +12 -1
  221. package/components/chat/message-item.tsx +68 -3
  222. package/components/data/data-workspace.tsx +53 -120
  223. package/components/data/firecrawl-notice.tsx +3 -13
  224. package/components/data/media-panel.tsx +182 -25
  225. package/components/data/scrape-panel.tsx +4 -12
  226. package/components/data/upload-panel.tsx +0 -1
  227. package/components/index/index-workspace.tsx +48 -25
  228. package/components/settings/marketplace-section.tsx +1 -1
  229. package/components/settings/settings-layout.tsx +1 -2
  230. package/package.json +6 -6
  231. package/.next/server/chunks/ssr/[root-of-the-server]__0t8ud_u._.js +0 -3
  232. package/.next/standalone/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0t8ud_u._.js +0 -3
  233. package/.next/standalone/apps/web/.next/static/chunks/03ju_837pa9ul.js +0 -11
  234. package/.next/standalone/apps/web/.next/static/chunks/0ge3nirnmx_np.js +0 -1
  235. package/.next/standalone/apps/web/.next/static/chunks/19krxv-ou9c8c.js +0 -121
  236. package/.next/standalone/apps/web/.next/static/chunks/1_nk3imchwn8a.css +0 -1
  237. package/.next/standalone/apps/web/.next/static/chunks/25rt2v27sz0io.js +0 -1
  238. package/.next/static/chunks/03ju_837pa9ul.js +0 -11
  239. package/.next/static/chunks/0ge3nirnmx_np.js +0 -1
  240. package/.next/static/chunks/19krxv-ou9c8c.js +0 -121
  241. package/.next/static/chunks/1_nk3imchwn8a.css +0 -1
  242. package/.next/static/chunks/25rt2v27sz0io.js +0 -1
  243. /package/.next/standalone/apps/web/.next/static/{iCALZzxFfElF4z3wYZwsC → whR5PvI0kapiCtaze5Lb0}/_buildManifest.js +0 -0
  244. /package/.next/standalone/apps/web/.next/static/{iCALZzxFfElF4z3wYZwsC → whR5PvI0kapiCtaze5Lb0}/_clientMiddlewareManifest.js +0 -0
  245. /package/.next/standalone/apps/web/.next/static/{iCALZzxFfElF4z3wYZwsC → whR5PvI0kapiCtaze5Lb0}/_ssgManifest.js +0 -0
  246. /package/.next/static/{iCALZzxFfElF4z3wYZwsC → whR5PvI0kapiCtaze5Lb0}/_buildManifest.js +0 -0
  247. /package/.next/static/{iCALZzxFfElF4z3wYZwsC → whR5PvI0kapiCtaze5Lb0}/_clientMiddlewareManifest.js +0 -0
  248. /package/.next/static/{iCALZzxFfElF4z3wYZwsC → whR5PvI0kapiCtaze5Lb0}/_ssgManifest.js +0 -0
@@ -144,19 +144,13 @@ export async function applyFieldEdits(sessionId: string, edits: FieldEdit[]): Pr
144
144
  let resultBuffer: Buffer;
145
145
  let updatedFields: string[] = [];
146
146
 
147
- // Map field IDs to actual field names for native PDF filling and sandbox scripts.
148
- // The LLM sends field IDs like "pdf_field_0"; we resolve them to the actual PDF field names.
149
- // If the ID doesn't match any field, try matching by name directly (case-insensitive).
150
147
  const resolvedEdits = edits.map((edit) => {
151
- // Primary: look up by ID
152
148
  let field = session.parsed.fields.find((f) => f.id === edit.fieldId);
153
149
  if (!field) {
154
- // Fallback: match by name (case-insensitive, trimmed)
155
150
  const needle = edit.fieldId.trim().toLowerCase();
156
151
  field = session.parsed.fields.find((f) => f.name.trim().toLowerCase() === needle);
157
152
  }
158
153
  if (!field) {
159
- // Fallback: match by partial name containment
160
154
  const needle = edit.fieldId.trim().toLowerCase();
161
155
  field = session.parsed.fields.find(
162
156
  (f) =>
@@ -575,26 +569,18 @@ export async function applySignature(sessionId: string, data: SignatureData): Pr
575
569
 
576
570
  if (data.detectedContext) {
577
571
  try {
578
- // Use sandbox PyPDF to find text coordinates on this page
579
572
  const coords = await findTextPositionOnPage(buffer, pageIndex, data.detectedContext);
580
573
  if (coords) {
581
- // Place signature right below the detected text line
582
574
  resolvedX = coords.x;
583
- // coords.y is the bottom of the text in PDF coordinate system
584
- // Place signature just below (subtract a small offset for spacing)
585
575
  resolvedY = coords.y - 10;
586
576
  }
587
- } catch {
588
- // Fallback to UI-provided coordinates
589
- }
577
+ } catch {}
590
578
  }
591
579
 
592
- // Fall back to user-specified percentages
593
580
  if (resolvedX === null || resolvedY === null) {
594
581
  const xPct = data.x ?? 50;
595
582
  const yPct = data.y ?? 50;
596
583
  resolvedX = (xPct / 100) * width;
597
- // Invert Y: UI treats y=0 as top, PDF treats y=0 as bottom
598
584
  resolvedY = height - (yPct / 100) * height;
599
585
  }
600
586
 
@@ -1,5 +1,11 @@
1
1
  # @larkup/tool-video-audio
2
2
 
3
+ ## 0.2.4
4
+
5
+ ### Patch Changes
6
+
7
+ - 0ff7dec: Stabilize native crawl state, prioritise local knowledge retrieval, and improve media-import progress and source-download recovery.
8
+
3
9
  ## 0.2.3
4
10
 
5
11
  ### Patch Changes
@@ -57,7 +57,7 @@ export async function importMediaUrl(url, options) {
57
57
  if (isYouTube(parsed)) {
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
- const output = await runYtDlp([
60
+ const commonArgs = [
61
61
  '--no-playlist',
62
62
  '--playlist-end',
63
63
  String(options.playlistMax ?? 10),
@@ -67,8 +67,6 @@ export async function importMediaUrl(url, options) {
67
67
  '2',
68
68
  '--fragment-retries',
69
69
  '2',
70
- '--concurrent-fragments',
71
- '4',
72
70
  '--format',
73
71
  'best[height<=360]/bestvideo[height<=360]+bestaudio/best',
74
72
  '--merge-output-format',
@@ -77,8 +75,32 @@ export async function importMediaUrl(url, options) {
77
75
  template,
78
76
  '--print',
79
77
  `after_move:${print}`,
80
- url,
81
- ], options.onProgress);
78
+ ];
79
+ let output;
80
+ try {
81
+ output = await runYtDlp([...commonArgs, '--concurrent-fragments', '4', url], options.onProgress);
82
+ }
83
+ catch (error) {
84
+ if (!isVideoHostForbidden(error))
85
+ throw error;
86
+ // Video hosts occasionally reject a freshly-issued media URL. Re-extract
87
+ // it with a conservative one-fragment retry before failing the asset.
88
+ options.onProgress?.({ message: 'Source rejected the download; refreshing the video link…' });
89
+ try {
90
+ output = await runYtDlp([
91
+ ...commonArgs,
92
+ '--force-ipv4',
93
+ '--extractor-retries',
94
+ '3',
95
+ '--concurrent-fragments',
96
+ '1',
97
+ url,
98
+ ], options.onProgress);
99
+ }
100
+ catch (retryError) {
101
+ throw friendlyVideoDownloadError(retryError);
102
+ }
103
+ }
82
104
  const imported = output
83
105
  .split('\n')
84
106
  .filter(Boolean)
@@ -135,6 +157,16 @@ export async function importMediaUrl(url, options) {
135
157
  },
136
158
  ];
137
159
  }
160
+ function isVideoHostForbidden(error) {
161
+ return error instanceof Error && /\b(?:403|forbidden)\b/i.test(error.message);
162
+ }
163
+ /** Keep upstream yt-dlp output out of the end-user status while retaining a useful cause. */
164
+ function friendlyVideoDownloadError(error) {
165
+ if (isVideoHostForbidden(error)) {
166
+ return new Error('The video host refused this download (HTTP 403) after a safe retry. This is a temporary source restriction, not a problem with your existing index. Try again later, or upload the original video file directly.');
167
+ }
168
+ return error instanceof Error ? error : new Error('Video download failed. Please try again.');
169
+ }
138
170
  /**
139
171
  * Read the video's own manual or automatic captions through yt-dlp. This is
140
172
  * both faster and usually more accurate than transcribing compressed audio,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@larkup/tool-video-audio",
3
- "version": "0.2.3",
3
+ "version": "0.2.4",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -99,31 +99,53 @@ export async function importMediaUrl(
99
99
  const template = path.join(options.outputDir, '%(title).120B [%(id)s].%(ext)s');
100
100
  const print =
101
101
  '{"path":%(filepath)j,"title":%(title)j,"originalUrl":%(webpage_url)j,"ext":%(ext)j}';
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
- );
102
+ const commonArgs = [
103
+ '--no-playlist',
104
+ '--playlist-end',
105
+ String(options.playlistMax ?? 10),
106
+ '--socket-timeout',
107
+ '20',
108
+ '--retries',
109
+ '2',
110
+ '--fragment-retries',
111
+ '2',
112
+ '--format',
113
+ 'best[height<=360]/bestvideo[height<=360]+bestaudio/best',
114
+ '--merge-output-format',
115
+ 'mp4',
116
+ '-o',
117
+ template,
118
+ '--print',
119
+ `after_move:${print}`,
120
+ ];
121
+ let output: string;
122
+ try {
123
+ output = await runYtDlp(
124
+ [...commonArgs, '--concurrent-fragments', '4', url],
125
+ options.onProgress,
126
+ );
127
+ } catch (error) {
128
+ if (!isVideoHostForbidden(error)) throw error;
129
+ // Video hosts occasionally reject a freshly-issued media URL. Re-extract
130
+ // it with a conservative one-fragment retry before failing the asset.
131
+ options.onProgress?.({ message: 'Source rejected the download; refreshing the video link…' });
132
+ try {
133
+ output = await runYtDlp(
134
+ [
135
+ ...commonArgs,
136
+ '--force-ipv4',
137
+ '--extractor-retries',
138
+ '3',
139
+ '--concurrent-fragments',
140
+ '1',
141
+ url,
142
+ ],
143
+ options.onProgress,
144
+ );
145
+ } catch (retryError) {
146
+ throw friendlyVideoDownloadError(retryError);
147
+ }
148
+ }
127
149
  const imported = output
128
150
  .split('\n')
129
151
  .filter(Boolean)
@@ -186,6 +208,20 @@ export async function importMediaUrl(
186
208
  ];
187
209
  }
188
210
 
211
+ function isVideoHostForbidden(error: unknown): boolean {
212
+ return error instanceof Error && /\b(?:403|forbidden)\b/i.test(error.message);
213
+ }
214
+
215
+ /** Keep upstream yt-dlp output out of the end-user status while retaining a useful cause. */
216
+ function friendlyVideoDownloadError(error: unknown): Error {
217
+ if (isVideoHostForbidden(error)) {
218
+ return new Error(
219
+ 'The video host refused this download (HTTP 403) after a safe retry. This is a temporary source restriction, not a problem with your existing index. Try again later, or upload the original video file directly.',
220
+ );
221
+ }
222
+ return error instanceof Error ? error : new Error('Video download failed. Please try again.');
223
+ }
224
+
189
225
  /**
190
226
  * Read the video's own manual or automatic captions through yt-dlp. This is
191
227
  * both faster and usually more accurate than transcribing compressed audio,
@@ -0,0 +1 @@
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,1717,e=>{"use strict";var t=e.i(523829),s=e.i(178328),a=e.i(668548),r=e.i(831892),i=e.i(501375),n=e.i(887216),o=e.i(112786),l=e.i(104872),d=e.i(597343),c=e.i(7544),x=e.i(794189),u=e.i(370317),m=e.i(134018),h=e.i(300033),p=e.i(874822);let f=(0,p.default)("activity",[["path",{d:"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2",key:"169zse"}]]);var j=e.i(518864),g=e.i(501706);let y=(0,p.default)("message-square",[["path",{d:"M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z",key:"18887p"}]]),v=(0,p.default)("zap",[["path",{d:"M15.914 4a1.5 1.5 0 00-2.474-1.561l-9 9A1.5 1.5 0 005.5 14h4.002a.5.5 0 01.471.666L8.086 20a1.5 1.5 0 002.475 1.56l9-9A1.5 1.5 0 0018.5 10h-3.997a.5.5 0 01-.472-.667z",key:"1v7up4"}]]);var C=e.i(842646);let b=e=>fetch(e).then(e=>e.json());function k(e,t,s){if("all"===t||!e)return e||[];let a=30;"7d"===t?a=7:"14d"===t?a=14:"30d"===t?a=30:"90d"===t&&(a=90);let r=[],i=new Date,n=new Map(e.map(e=>[e.date,e]));for(let e=a-1;e>=0;e--){let t=new Date(i);t.setDate(t.getDate()-e);let a=t.toISOString().split("T")[0];n.has(a)?r.push(n.get(a)):r.push({date:a,...s()})}return r}function N(e){return e<1e3?e.toLocaleString():e<1e6?`${(e/1e3).toFixed(+(e<1e4))}K`:`${(e/1e6).toFixed(2)}M`}e.s(["AnalyticsDashboard",0,function(){var e;let[p,w]=(0,s.useState)("indexing"),[T,S]=(0,s.useState)("14d"),{data:L,isLoading:D,error:A}=(0,C.default)(`/api/analytics?timeframe=${T}`,b);if(D)return(0,t.jsxs)("div",{className:"p-8 flex-col gap-2 text-center text-muted-foreground animate-pulse flex items-center justify-center h-full",children:[(0,t.jsx)(g.Loader2,{className:"size-6 animate-spin"}),(0,t.jsx)("span",{className:"text-[15px]",children:"Loading analytics data..."})]});if(A||!L)return(0,t.jsx)("div",{className:"p-8 text-center text-destructive",children:"Failed to load analytics data."});let z=!L.serverTimeSeries?.length||L.serverTimeSeries.every(e=>0===e.requests),I=!L.embeddingTimeSeries?.length||L.embeddingTimeSeries.every(e=>0===e.tokens),O=!L.chatTimeSeries?.length||L.chatTimeSeries.every(e=>0===e.tokens),R=({title:e,description:s})=>(0,t.jsx)("div",{className:"absolute inset-0 z-10 flex items-center justify-center rounded-md",children:(0,t.jsxs)("div",{className:"flex flex-col items-center space-y-2 dark:bg-zinc-900/90 px-5 py-4 rounded-lg max-w-xl text-center",children:[(0,t.jsx)("div",{className:"p-2 border border-border/70 rounded-lg bg-white",children:(0,t.jsx)(f,{className:"size-6 text-black/80"})}),(0,t.jsxs)("div",{className:"space-y-1",children:[(0,t.jsx)("p",{className:"text-[16px] font-semibold text-foreground",children:e}),(0,t.jsx)("p",{className:"text-[13px] text-muted-foreground",children:s})]})]})});return(0,t.jsxs)("div",{className:"space-y-6",children:[(0,t.jsxs)("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4",children:[(0,t.jsxs)(u.Card,{className:"shadow-none rounded-xl",children:[(0,t.jsxs)(u.CardHeader,{className:"flex flex-row items-center justify-between space-y-0 pb-2",children:[(0,t.jsx)(u.CardTitle,{className:"text-sm font-medium",children:"Total Cost"}),(0,t.jsx)(f,{className:"size-4 text-muted-foreground"})]}),(0,t.jsxs)(u.CardContent,{children:[(0,t.jsx)("div",{className:"text-2xl font-bold",children:0===(e=L.totalCost)?"$0.00":e<.01?e<1e-4?"<$0.0001":`$${e.toFixed(4)}`:`$${e.toFixed(2)}`}),(0,t.jsx)("p",{className:"text-xs text-muted-foreground",children:"Across all paid models"})]})]}),(0,t.jsxs)(u.Card,{className:"shadow-none rounded-xl",children:[(0,t.jsxs)(u.CardHeader,{className:"flex flex-row items-center justify-between space-y-0 pb-2",children:[(0,t.jsx)(u.CardTitle,{className:"text-sm font-medium",children:"Chat Tokens"}),(0,t.jsx)(y,{className:"size-4 text-muted-foreground"})]}),(0,t.jsxs)(u.CardContent,{children:[(0,t.jsx)("div",{className:"text-2xl font-bold",children:N(L.totalChatTokens)}),(0,t.jsx)("p",{className:"text-xs text-muted-foreground",children:"Processed in conversations"})]})]}),(0,t.jsxs)(u.Card,{className:"shadow-none rounded-xl",children:[(0,t.jsxs)(u.CardHeader,{className:"flex flex-row items-center justify-between space-y-0 pb-2",children:[(0,t.jsx)(u.CardTitle,{className:"text-sm font-medium",children:"Embedding Tokens"}),(0,t.jsx)(j.Database,{className:"size-4 text-muted-foreground"})]}),(0,t.jsxs)(u.CardContent,{children:[(0,t.jsx)("div",{className:"text-2xl font-bold",children:N(L.totalEmbeddingTokens)}),(0,t.jsx)("p",{className:"text-xs text-muted-foreground",children:"Processed during indexing"})]})]}),(0,t.jsxs)(u.Card,{className:"shadow-none rounded-xl",children:[(0,t.jsxs)(u.CardHeader,{className:"flex flex-row items-center justify-between space-y-0 pb-2",children:[(0,t.jsx)(u.CardTitle,{className:"text-sm font-medium",children:"Total Requests"}),(0,t.jsx)(v,{className:"size-4 text-muted-foreground"})]}),(0,t.jsxs)(u.CardContent,{children:[(0,t.jsx)("div",{className:"text-2xl font-bold",children:L.totalRequests.toLocaleString()}),(0,t.jsx)("p",{className:"text-xs text-muted-foreground",children:"To local RAG server this week"})]})]})]}),(0,t.jsxs)(m.Tabs,{value:p,onValueChange:w,className:"space-y-4",children:[(0,t.jsxs)("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-4",children:[(0,t.jsxs)(m.TabsList,{className:"inline-flex bg-white/70 dark:bg-muted/70 h-9 items-center justify-center rounded-lg border border-border p-0.5 text-muted-foreground",children:[(0,t.jsxs)(m.TabsTrigger,{value:"indexing",className:"inline-flex items-center h-9 justify-center whitespace-nowrap rounded-md px-3 py-1 text-xs font-medium transition-all focus-visible:outline-none data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]: hover:text-foreground",children:[(0,t.jsx)(j.Database,{className:"size-3.5 mr-1.5"}),"Indexing Usage"]}),(0,t.jsxs)(m.TabsTrigger,{value:"chat",className:"inline-flex items-center h-9 justify-center whitespace-nowrap rounded-md px-3 py-1 text-xs font-medium transition-all focus-visible:outline-none data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]: hover:text-foreground",children:[(0,t.jsx)(y,{className:"size-3.5 mr-1.5"}),"Chat Usage"]}),(0,t.jsxs)(m.TabsTrigger,{value:"overview",className:"inline-flex items-center h-9 justify-center whitespace-nowrap rounded-md px-3 py-1 text-xs font-medium transition-all focus-visible:outline-none data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]: hover:text-foreground",children:[(0,t.jsx)(f,{className:"size-3.5 mr-1.5"}),"Server Traffic"]})]}),(0,t.jsx)("div",{className:"flex items-center",children:(0,t.jsxs)(h.Select,{value:T,onValueChange:e=>e&&S(e),children:[(0,t.jsx)(h.SelectTrigger,{className:"w-[140px] h-10! text-sm bg-white dark:bg-background focus:ring-0 focus:border-input data-[state=open]:ring-0 data-[state=open]:border-input outline-none focus:outline-none",children:(0,t.jsxs)(h.SelectValue,{placeholder:"Select timeframe",children:["7d"===T&&"Last 7 days","14d"===T&&"Last 14 days","30d"===T&&"Last 30 days","90d"===T&&"Last 90 days","all"===T&&"All time"]})}),(0,t.jsxs)(h.SelectContent,{children:[(0,t.jsx)(h.SelectItem,{value:"7d",children:"Last 7 days"}),(0,t.jsx)(h.SelectItem,{value:"14d",children:"Last 14 days"}),(0,t.jsx)(h.SelectItem,{value:"30d",children:"Last 30 days"}),(0,t.jsx)(h.SelectItem,{value:"90d",children:"Last 90 days"}),(0,t.jsx)(h.SelectItem,{value:"all",children:"All time"})]})]})})]}),(0,t.jsx)(m.TabsContent,{value:"overview",className:"space-y-4",children:(0,t.jsxs)(u.Card,{className:"shadow-none! rounded-xl",children:[(0,t.jsxs)(u.CardHeader,{children:[(0,t.jsx)(u.CardTitle,{children:"Requests to RAG Server"}),(0,t.jsx)(u.CardDescription,{children:"Daily requests sent to your local or remote deployed RAG endpoints."})]}),(0,t.jsx)(u.CardContent,{className:"px-2 sm:p-6",children:(0,t.jsxs)("div",{className:"h-[300px] w-full relative",children:[z&&(0,t.jsx)(R,{title:"No Server Traffic Yet",description:"Once you start sending requests to the RAG server, usage will appear here."}),(0,t.jsx)(l.ResponsiveContainer,{width:"100%",height:"100%",className:"[&_.recharts-surface]:outline-none [&_.recharts-wrapper]:outline-none",children:(0,t.jsxs)(n.BarChart,{data:k(L.serverTimeSeries,T,()=>({requests:0,avgLatencyMs:0})),margin:{top:10,right:30,left:0,bottom:0},children:[(0,t.jsx)(o.CartesianGrid,{strokeDasharray:"3 3",vertical:!1,stroke:"currentColor",strokeOpacity:.1}),(0,t.jsx)(c.XAxis,{dataKey:"date",stroke:"currentColor",strokeOpacity:.5,fontSize:12,tickLine:!1,axisLine:!1,minTickGap:20,tickFormatter:e=>{if(!e.includes("-"))return e;let[t,s,a]=e.split("-");return new Date(parseInt(t,10),parseInt(s,10)-1,parseInt(a,10)).toLocaleDateString("en-US",{month:"short",day:"numeric"})}}),(0,t.jsx)(x.YAxis,{allowDecimals:!1,stroke:"currentColor",strokeOpacity:.5,fontSize:12,tickLine:!1,axisLine:!1,tickFormatter:e=>`${e}`}),(0,t.jsx)(d.Tooltip,{contentStyle:{backgroundColor:"var(--color-background)",borderColor:"var(--color-border)",borderRadius:"8px"},itemStyle:{color:"var(--color-foreground)"},cursor:{fill:"var(--color-muted)",opacity:.4}}),(0,t.jsx)(i.Bar,{dataKey:"requests",fill:"#3b82f6",radius:[4,4,0,0],maxBarSize:40,activeBar:{className:"outline-none focus:outline-none"}})]})})]})})]})}),(0,t.jsx)(m.TabsContent,{value:"indexing",className:"space-y-4",children:(0,t.jsxs)(u.Card,{className:"shadow-none rounded-xl",children:[(0,t.jsxs)(u.CardHeader,{children:[(0,t.jsx)(u.CardTitle,{children:"Indexing Token Usage"}),(0,t.jsx)(u.CardDescription,{children:"Daily tokens processed for document indexing."})]}),(0,t.jsx)(u.CardContent,{className:"px-2 sm:p-6",children:(0,t.jsxs)("div",{className:"h-[300px] w-full relative",children:[I&&(0,t.jsx)(R,{title:"No Indexing Data Yet",description:"Add documents to your knowledge bases to see embedding token usage here."}),(0,t.jsx)(l.ResponsiveContainer,{width:"100%",height:"100%",className:"[&_.recharts-surface]:outline-none [&_.recharts-wrapper]:outline-none",children:(0,t.jsxs)(r.AreaChart,{data:k(L.embeddingTimeSeries,T,()=>({tokens:0,cost:0,requests:0})),margin:{top:10,right:30,left:0,bottom:0},children:[(0,t.jsx)("defs",{children:(0,t.jsxs)("linearGradient",{id:"colorIndexing",x1:"0",y1:"0",x2:"0",y2:"1",children:[(0,t.jsx)("stop",{offset:"5%",stopColor:"#f97316",stopOpacity:.3}),(0,t.jsx)("stop",{offset:"95%",stopColor:"#f97316",stopOpacity:0})]})}),(0,t.jsx)(o.CartesianGrid,{strokeDasharray:"3 3",vertical:!1,stroke:"currentColor",strokeOpacity:.1}),(0,t.jsx)(c.XAxis,{dataKey:"date",stroke:"currentColor",strokeOpacity:.5,fontSize:12,tickLine:!1,axisLine:!1,minTickGap:20,tickFormatter:e=>{if(!e.includes("-"))return e;let[t,s,a]=e.split("-");return new Date(parseInt(t,10),parseInt(s,10)-1,parseInt(a,10)).toLocaleDateString("en-US",{month:"short",day:"numeric"})}}),(0,t.jsx)(x.YAxis,{allowDecimals:!1,stroke:"currentColor",strokeOpacity:.5,fontSize:12,tickLine:!1,axisLine:!1,tickFormatter:e=>`${e>=1e3?e/1e3+"k":e}`}),(0,t.jsx)(d.Tooltip,{contentStyle:{backgroundColor:"var(--color-background)",borderColor:"var(--color-border)",borderRadius:"8px"},itemStyle:{color:"var(--color-foreground)"}}),(0,t.jsx)(a.Area,{type:"monotone",dataKey:"tokens",stroke:"#f97316",strokeWidth:2,fillOpacity:1,fill:"url(#colorIndexing)",activeDot:{r:4,className:"outline-none focus:outline-none",strokeWidth:0}})]})})]})})]})}),(0,t.jsx)(m.TabsContent,{value:"chat",className:"space-y-4",children:(0,t.jsxs)(u.Card,{className:"shadow-none rounded-xl",children:[(0,t.jsxs)(u.CardHeader,{children:[(0,t.jsx)(u.CardTitle,{children:"Chat Token Usage"}),(0,t.jsx)(u.CardDescription,{children:"Daily tokens processed for chat completions."})]}),(0,t.jsx)(u.CardContent,{className:"px-2 sm:p-6",children:(0,t.jsxs)("div",{className:"h-[300px] w-full relative",children:[O&&(0,t.jsx)(R,{title:"No Chat Data Yet",description:"Chat with the AI to see your token usage metrics here."}),(0,t.jsx)(l.ResponsiveContainer,{width:"100%",height:"100%",className:"[&_.recharts-surface]:outline-none [&_.recharts-wrapper]:outline-none",children:(0,t.jsxs)(r.AreaChart,{data:k(L.chatTimeSeries,T,()=>({tokens:0,cost:0,requests:0})),margin:{top:10,right:30,left:0,bottom:0},children:[(0,t.jsx)("defs",{children:(0,t.jsxs)("linearGradient",{id:"colorChat",x1:"0",y1:"0",x2:"0",y2:"1",children:[(0,t.jsx)("stop",{offset:"5%",stopColor:"#3b82f6",stopOpacity:.3}),(0,t.jsx)("stop",{offset:"95%",stopColor:"#3b82f6",stopOpacity:0})]})}),(0,t.jsx)(o.CartesianGrid,{strokeDasharray:"3 3",vertical:!1,stroke:"currentColor",strokeOpacity:.1}),(0,t.jsx)(c.XAxis,{dataKey:"date",stroke:"currentColor",strokeOpacity:.5,fontSize:12,tickLine:!1,axisLine:!1,minTickGap:20,tickFormatter:e=>{if(!e.includes("-"))return e;let[t,s,a]=e.split("-");return new Date(parseInt(t,10),parseInt(s,10)-1,parseInt(a,10)).toLocaleDateString("en-US",{month:"short",day:"numeric"})}}),(0,t.jsx)(x.YAxis,{allowDecimals:!1,stroke:"currentColor",strokeOpacity:.5,fontSize:12,tickLine:!1,axisLine:!1,tickFormatter:e=>`${e>=1e3?e/1e3+"k":e}`}),(0,t.jsx)(d.Tooltip,{contentStyle:{backgroundColor:"var(--color-background)",borderColor:"var(--color-border)",borderRadius:"8px"},itemStyle:{color:"var(--color-foreground)"}}),(0,t.jsx)(a.Area,{type:"monotone",dataKey:"tokens",stroke:"#3b82f6",strokeWidth:2,fillOpacity:1,fill:"url(#colorChat)",activeDot:{r:4,className:"outline-none focus:outline-none",strokeWidth:0}})]})})]})})]})})]})]})}],1717)}]);