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.
- package/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +3 -3
- package/.next/diagnostics/route-bundle-stats.json +22 -21
- package/.next/fallback-build-manifest.json +3 -3
- package/.next/required-server-files.js +1 -1
- package/.next/required-server-files.json +1 -1
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +18 -18
- package/.next/server/app/_not-found.segments/_full.segment.rsc +18 -18
- package/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
- package/.next/server/app/_not-found.segments/_index.segment.rsc +12 -12
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/analytics/page.js.nft.json +1 -1
- package/.next/server/app/analytics/page_client-reference-manifest.js +1 -1
- package/.next/server/app/analytics.html +1 -1
- package/.next/server/app/analytics.rsc +19 -19
- package/.next/server/app/analytics.segments/_full.segment.rsc +19 -19
- package/.next/server/app/analytics.segments/_head.segment.rsc +4 -4
- package/.next/server/app/analytics.segments/_index.segment.rsc +12 -12
- package/.next/server/app/analytics.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/analytics.segments/analytics/__PAGE__.segment.rsc +3 -3
- package/.next/server/app/analytics.segments/analytics.segment.rsc +3 -3
- package/.next/server/app/chat/page.js.nft.json +1 -1
- package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
- package/.next/server/app/chat.html +1 -1
- package/.next/server/app/chat.rsc +19 -19
- package/.next/server/app/chat.segments/_full.segment.rsc +19 -19
- package/.next/server/app/chat.segments/_head.segment.rsc +4 -4
- package/.next/server/app/chat.segments/_index.segment.rsc +12 -12
- package/.next/server/app/chat.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/chat.segments/chat/__PAGE__.segment.rsc +3 -3
- package/.next/server/app/chat.segments/chat.segment.rsc +3 -3
- package/.next/server/app/data/page.js.nft.json +1 -1
- package/.next/server/app/data/page_client-reference-manifest.js +1 -1
- package/.next/server/app/data.html +1 -1
- package/.next/server/app/data.rsc +25 -26
- package/.next/server/app/data.segments/_full.segment.rsc +25 -26
- package/.next/server/app/data.segments/_head.segment.rsc +4 -4
- package/.next/server/app/data.segments/_index.segment.rsc +12 -12
- package/.next/server/app/data.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/data.segments/data/__PAGE__.segment.rsc +3 -3
- package/.next/server/app/data.segments/data.segment.rsc +3 -3
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +17 -17
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/index.segments/_full.segment.rsc +17 -17
- package/.next/server/app/index.segments/_head.segment.rsc +4 -4
- package/.next/server/app/index.segments/_index.segment.rsc +12 -12
- package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/page.js.nft.json +1 -1
- package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings.html +1 -1
- package/.next/server/app/settings.rsc +19 -19
- package/.next/server/app/settings.segments/_full.segment.rsc +19 -19
- package/.next/server/app/settings.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings.segments/_index.segment.rsc +12 -12
- package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/settings.segments/settings.segment.rsc +3 -3
- package/.next/server/chunks/0598_next_dist_esm_build_templates_app-route_0kbcuk-.js +8 -7
- package/.next/server/chunks/0598_next_dist_esm_build_templates_app-route_0sbf4ny.js +2 -2
- package/.next/server/chunks/[root-of-the-server]__0j2l54r._.js +1 -1
- package/.next/server/chunks/packages_scraper_src_0kkcv_v._.js +1 -1
- package/.next/server/chunks/ssr/{[root-of-the-server]__0m21fli._.js → [root-of-the-server]__0pgotbk._.js} +2 -2
- package/.next/server/chunks/ssr/[root-of-the-server]__1k1mxo2._.js +3 -0
- package/.next/server/chunks/ssr/_169pdlf._.js +5 -5
- package/.next/server/chunks/ssr/_18jagqc._.js +2 -2
- package/.next/server/chunks/ssr/_1hetwwu._.js +2 -2
- package/.next/{standalone/apps/web/.next/server/chunks/ssr/_0s8403d._.js → server/chunks/ssr/_1p6lb7s._.js} +2 -2
- package/.next/server/chunks/ssr/_1yqlx1m._.js +1 -1
- package/.next/server/chunks/ssr/apps_web_components_analytics_analytics-dashboard_tsx_1056-z3._.js +1 -1
- package/.next/server/middleware-build-manifest.js +3 -3
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/standalone/apps/web/.next/BUILD_ID +1 -1
- package/.next/standalone/apps/web/.next/build-manifest.json +3 -3
- package/.next/standalone/apps/web/.next/required-server-files.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/_global-error.html +1 -1
- package/.next/standalone/apps/web/.next/server/app/_global-error.rsc +1 -1
- package/.next/standalone/apps/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/apps/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/apps/web/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/apps/web/.next/server/app/_not-found.rsc +18 -18
- package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_full.segment.rsc +18 -18
- package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
- package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_index.segment.rsc +12 -12
- package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
- package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/apps/web/.next/server/app/analytics/page.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/analytics/page_client-reference-manifest.js +1 -1
- package/.next/standalone/apps/web/.next/server/app/analytics.html +1 -1
- package/.next/standalone/apps/web/.next/server/app/analytics.rsc +19 -19
- package/.next/standalone/apps/web/.next/server/app/analytics.segments/_full.segment.rsc +19 -19
- package/.next/standalone/apps/web/.next/server/app/analytics.segments/_head.segment.rsc +4 -4
- package/.next/standalone/apps/web/.next/server/app/analytics.segments/_index.segment.rsc +12 -12
- package/.next/standalone/apps/web/.next/server/app/analytics.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/apps/web/.next/server/app/analytics.segments/analytics/__PAGE__.segment.rsc +3 -3
- package/.next/standalone/apps/web/.next/server/app/analytics.segments/analytics.segment.rsc +3 -3
- package/.next/standalone/apps/web/.next/server/app/chat/page.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/chat/page_client-reference-manifest.js +1 -1
- package/.next/standalone/apps/web/.next/server/app/chat.html +1 -1
- package/.next/standalone/apps/web/.next/server/app/chat.rsc +19 -19
- package/.next/standalone/apps/web/.next/server/app/chat.segments/_full.segment.rsc +19 -19
- package/.next/standalone/apps/web/.next/server/app/chat.segments/_head.segment.rsc +4 -4
- package/.next/standalone/apps/web/.next/server/app/chat.segments/_index.segment.rsc +12 -12
- package/.next/standalone/apps/web/.next/server/app/chat.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/apps/web/.next/server/app/chat.segments/chat/__PAGE__.segment.rsc +3 -3
- package/.next/standalone/apps/web/.next/server/app/chat.segments/chat.segment.rsc +3 -3
- package/.next/standalone/apps/web/.next/server/app/data/page.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/data/page_client-reference-manifest.js +1 -1
- package/.next/standalone/apps/web/.next/server/app/data.html +1 -1
- package/.next/standalone/apps/web/.next/server/app/data.rsc +25 -26
- package/.next/standalone/apps/web/.next/server/app/data.segments/_full.segment.rsc +25 -26
- package/.next/standalone/apps/web/.next/server/app/data.segments/_head.segment.rsc +4 -4
- package/.next/standalone/apps/web/.next/server/app/data.segments/_index.segment.rsc +12 -12
- package/.next/standalone/apps/web/.next/server/app/data.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/apps/web/.next/server/app/data.segments/data/__PAGE__.segment.rsc +3 -3
- package/.next/standalone/apps/web/.next/server/app/data.segments/data.segment.rsc +3 -3
- package/.next/standalone/apps/web/.next/server/app/index.html +1 -1
- package/.next/standalone/apps/web/.next/server/app/index.rsc +17 -17
- package/.next/standalone/apps/web/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/apps/web/.next/server/app/index.segments/_full.segment.rsc +17 -17
- package/.next/standalone/apps/web/.next/server/app/index.segments/_head.segment.rsc +4 -4
- package/.next/standalone/apps/web/.next/server/app/index.segments/_index.segment.rsc +12 -12
- package/.next/standalone/apps/web/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/apps/web/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/apps/web/.next/server/app/settings/page.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/apps/web/.next/server/app/settings.html +1 -1
- package/.next/standalone/apps/web/.next/server/app/settings.rsc +19 -19
- package/.next/standalone/apps/web/.next/server/app/settings.segments/_full.segment.rsc +19 -19
- package/.next/standalone/apps/web/.next/server/app/settings.segments/_head.segment.rsc +4 -4
- package/.next/standalone/apps/web/.next/server/app/settings.segments/_index.segment.rsc +12 -12
- package/.next/standalone/apps/web/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/apps/web/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +4 -4
- package/.next/standalone/apps/web/.next/server/app/settings.segments/settings.segment.rsc +3 -3
- package/.next/standalone/apps/web/.next/server/chunks/0598_next_dist_esm_build_templates_app-route_0kbcuk-.js +8 -7
- package/.next/standalone/apps/web/.next/server/chunks/0598_next_dist_esm_build_templates_app-route_0sbf4ny.js +2 -2
- package/.next/standalone/apps/web/.next/server/chunks/[root-of-the-server]__0j2l54r._.js +1 -1
- package/.next/standalone/apps/web/.next/server/chunks/packages_scraper_src_0kkcv_v._.js +1 -1
- package/.next/standalone/apps/web/.next/server/chunks/ssr/{[root-of-the-server]__0m21fli._.js → [root-of-the-server]__0pgotbk._.js} +2 -2
- package/.next/standalone/apps/web/.next/server/chunks/ssr/[root-of-the-server]__1k1mxo2._.js +3 -0
- package/.next/standalone/apps/web/.next/server/chunks/ssr/_169pdlf._.js +5 -5
- package/.next/standalone/apps/web/.next/server/chunks/ssr/_18jagqc._.js +2 -2
- package/.next/standalone/apps/web/.next/server/chunks/ssr/_1hetwwu._.js +2 -2
- package/.next/{server/chunks/ssr/_0s8403d._.js → standalone/apps/web/.next/server/chunks/ssr/_1p6lb7s._.js} +2 -2
- package/.next/standalone/apps/web/.next/server/chunks/ssr/_1yqlx1m._.js +1 -1
- package/.next/standalone/apps/web/.next/server/chunks/ssr/apps_web_components_analytics_analytics-dashboard_tsx_1056-z3._.js +1 -1
- package/.next/standalone/apps/web/.next/server/middleware-build-manifest.js +3 -3
- package/.next/standalone/apps/web/.next/server/pages/404.html +1 -1
- package/.next/standalone/apps/web/.next/server/pages/500.html +1 -1
- package/.next/standalone/apps/web/.next/static/chunks/0f_k7h1yraes3.js +1 -0
- package/.next/standalone/apps/web/.next/static/chunks/1j_-mc43_9-b3.js +121 -0
- package/.next/standalone/apps/web/.next/static/chunks/23efo4rpc31kr.js +1 -0
- package/.next/standalone/apps/web/.next/static/chunks/2dvtyg2k2op4x.js +11 -0
- package/.next/standalone/apps/web/.next/static/chunks/{2ljwki2xxnblc.js → 2h-80z3n8mi3d.js} +7 -7
- package/.next/{static/chunks/1ov69q-i9ybqi.js → standalone/apps/web/.next/static/chunks/2x1t8sqst0ipu.js} +1 -1
- package/.next/standalone/apps/web/.next/static/chunks/37j20in7beze4.js +1 -0
- package/.next/standalone/apps/web/.next/static/chunks/{1cxabi5yzqz57.js → 38f3p67a1uufx.js} +1 -1
- package/.next/standalone/apps/web/.next/static/chunks/3fe06cefiv690.css +1 -0
- package/.next/standalone/apps/web/CHANGELOG.md +21 -0
- package/.next/standalone/apps/web/app/api/chat/route.ts +34 -13
- package/.next/standalone/apps/web/app/api/chat/tools.ts +10 -1
- package/.next/standalone/apps/web/app/api/media/process/route.ts +34 -1
- package/.next/standalone/apps/web/app/settings/page.tsx +16 -5
- package/.next/standalone/apps/web/bin/larkup.js +12 -1
- package/.next/standalone/apps/web/components/chat/message-item.tsx +68 -3
- package/.next/standalone/apps/web/components/data/data-workspace.tsx +53 -120
- package/.next/standalone/apps/web/components/data/firecrawl-notice.tsx +3 -13
- package/.next/standalone/apps/web/components/data/media-panel.tsx +182 -25
- package/.next/standalone/apps/web/components/data/scrape-panel.tsx +4 -12
- package/.next/standalone/apps/web/components/data/upload-panel.tsx +0 -1
- package/.next/standalone/apps/web/components/index/index-workspace.tsx +48 -25
- package/.next/standalone/apps/web/components/settings/marketplace-section.tsx +1 -1
- package/.next/standalone/apps/web/components/settings/settings-layout.tsx +1 -2
- package/.next/standalone/apps/web/package.json +1 -1
- package/.next/standalone/apps/web/server.js +1 -1
- package/.next/standalone/packages/tools/doc-editor/CHANGELOG.md +7 -0
- package/.next/standalone/packages/tools/doc-editor/dist/editor.js +1 -15
- package/.next/standalone/packages/tools/doc-editor/package.json +1 -1
- package/.next/standalone/packages/tools/doc-editor/src/editor.ts +1 -15
- package/.next/standalone/packages/tools/video-audio/CHANGELOG.md +6 -0
- package/.next/standalone/packages/tools/video-audio/dist/url-importer.js +37 -5
- package/.next/standalone/packages/tools/video-audio/package.json +1 -1
- package/.next/standalone/packages/tools/video-audio/src/url-importer.ts +61 -25
- package/.next/static/chunks/0f_k7h1yraes3.js +1 -0
- package/.next/static/chunks/1j_-mc43_9-b3.js +121 -0
- package/.next/static/chunks/23efo4rpc31kr.js +1 -0
- package/.next/static/chunks/2dvtyg2k2op4x.js +11 -0
- package/.next/static/chunks/{2ljwki2xxnblc.js → 2h-80z3n8mi3d.js} +7 -7
- package/.next/{standalone/apps/web/.next/static/chunks/1ov69q-i9ybqi.js → static/chunks/2x1t8sqst0ipu.js} +1 -1
- package/.next/static/chunks/37j20in7beze4.js +1 -0
- package/.next/static/chunks/{1cxabi5yzqz57.js → 38f3p67a1uufx.js} +1 -1
- package/.next/static/chunks/3fe06cefiv690.css +1 -0
- package/CHANGELOG.md +21 -0
- package/app/api/chat/route.ts +34 -13
- package/app/api/chat/tools.ts +10 -1
- package/app/api/media/process/route.ts +34 -1
- package/app/settings/page.tsx +16 -5
- package/bin/larkup.js +12 -1
- package/components/chat/message-item.tsx +68 -3
- package/components/data/data-workspace.tsx +53 -120
- package/components/data/firecrawl-notice.tsx +3 -13
- package/components/data/media-panel.tsx +182 -25
- package/components/data/scrape-panel.tsx +4 -12
- package/components/data/upload-panel.tsx +0 -1
- package/components/index/index-workspace.tsx +48 -25
- package/components/settings/marketplace-section.tsx +1 -1
- package/components/settings/settings-layout.tsx +1 -2
- package/package.json +6 -6
- package/.next/server/chunks/ssr/[root-of-the-server]__0t8ud_u._.js +0 -3
- package/.next/standalone/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0t8ud_u._.js +0 -3
- package/.next/standalone/apps/web/.next/static/chunks/03ju_837pa9ul.js +0 -11
- package/.next/standalone/apps/web/.next/static/chunks/0ge3nirnmx_np.js +0 -1
- package/.next/standalone/apps/web/.next/static/chunks/19krxv-ou9c8c.js +0 -121
- package/.next/standalone/apps/web/.next/static/chunks/1_nk3imchwn8a.css +0 -1
- package/.next/standalone/apps/web/.next/static/chunks/25rt2v27sz0io.js +0 -1
- package/.next/static/chunks/03ju_837pa9ul.js +0 -11
- package/.next/static/chunks/0ge3nirnmx_np.js +0 -1
- package/.next/static/chunks/19krxv-ou9c8c.js +0 -121
- package/.next/static/chunks/1_nk3imchwn8a.css +0 -1
- package/.next/static/chunks/25rt2v27sz0io.js +0 -1
- /package/.next/standalone/apps/web/.next/static/{iCALZzxFfElF4z3wYZwsC → whR5PvI0kapiCtaze5Lb0}/_buildManifest.js +0 -0
- /package/.next/standalone/apps/web/.next/static/{iCALZzxFfElF4z3wYZwsC → whR5PvI0kapiCtaze5Lb0}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/apps/web/.next/static/{iCALZzxFfElF4z3wYZwsC → whR5PvI0kapiCtaze5Lb0}/_ssgManifest.js +0 -0
- /package/.next/static/{iCALZzxFfElF4z3wYZwsC → whR5PvI0kapiCtaze5Lb0}/_buildManifest.js +0 -0
- /package/.next/static/{iCALZzxFfElF4z3wYZwsC → whR5PvI0kapiCtaze5Lb0}/_clientMiddlewareManifest.js +0 -0
- /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
|
|
|
@@ -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
|
|
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
|
-
|
|
81
|
-
|
|
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,
|
|
@@ -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
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
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)}]);
|