llmtap 0.1.1 → 0.1.4

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 (39) hide show
  1. package/dist/dashboard/assets/BarChart-C6HDCruv.js +1 -0
  2. package/dist/dashboard/assets/Costs-CbzbCKu_.js +4 -0
  3. package/dist/dashboard/assets/Dashboard-CnMusiwU.js +9 -0
  4. package/dist/dashboard/assets/Models-C1x1xboT.js +1 -0
  5. package/dist/dashboard/assets/{Sessions-IXJPYjKe.js → Sessions-Bh-4XfWy.js} +1 -1
  6. package/dist/dashboard/assets/{Settings-kxBLuIHe.js → Settings-DzwivrGY.js} +2 -2
  7. package/dist/dashboard/assets/StatusDot-CjYDb6xj.js +1 -0
  8. package/dist/dashboard/assets/TraceDetail-C0tQsZ-6.js +17 -0
  9. package/dist/dashboard/assets/Traces-D6m-Ef3q.js +1 -0
  10. package/dist/dashboard/assets/{generateCategoricalChart-CylgFInn.js → chart-styles-BD7W97c9.js} +32 -32
  11. package/dist/dashboard/assets/{clock-CSGov78l.js → clock-BEYeaSdD.js} +1 -1
  12. package/dist/dashboard/assets/{coins-RIVI5-1a.js → coins-BmXTNwva.js} +1 -1
  13. package/dist/dashboard/assets/constants-BzCnW506.js +1 -0
  14. package/dist/dashboard/assets/content-DqloWqre.js +2 -0
  15. package/dist/dashboard/assets/{download-PygxZ--5.js → download-B-39NUBC.js} +1 -1
  16. package/dist/dashboard/assets/format-CNuIwzac.js +1 -0
  17. package/dist/dashboard/assets/{gauge-BBNKtqFH.js → gauge-CfqhcKwk.js} +1 -1
  18. package/dist/dashboard/assets/index-BuSUiwyD.css +1 -0
  19. package/dist/dashboard/assets/index-M3DwcRrc.js +66 -0
  20. package/dist/dashboard/assets/{layers--K2XRXAx.js → layers-BQ0MpYqk.js} +1 -1
  21. package/dist/dashboard/assets/{orbit-2k6lSwt7.js → orbit-eg7lcPsM.js} +1 -1
  22. package/dist/dashboard/assets/provider-colors-DcHYMgVv.js +1 -0
  23. package/dist/dashboard/assets/{zap-Ccrxhk2Q.js → zap-DjNN7wJp.js} +1 -1
  24. package/dist/dashboard/index.html +2 -2
  25. package/dist/index.js +15 -1
  26. package/dist/index.js.map +1 -1
  27. package/package.json +17 -25
  28. package/dist/dashboard/assets/BarChart-N8X7TKRf.js +0 -1
  29. package/dist/dashboard/assets/Costs-BhWdS2kw.js +0 -4
  30. package/dist/dashboard/assets/Dashboard-DnHLwJsN.js +0 -9
  31. package/dist/dashboard/assets/Models-5jWcyfAk.js +0 -1
  32. package/dist/dashboard/assets/TraceDetail-DdKFps7x.js +0 -18
  33. package/dist/dashboard/assets/Traces-Cv9L_xTe.js +0 -2
  34. package/dist/dashboard/assets/chevron-down-B0xosrpl.js +0 -1
  35. package/dist/dashboard/assets/format-BiBDo3KS.js +0 -1
  36. package/dist/dashboard/assets/index-BBr9_AHg.js +0 -22
  37. package/dist/dashboard/assets/index-CIGK6hiV.css +0 -1
  38. package/dist/dashboard/assets/message-square-DdcqfsnD.js +0 -1
  39. package/dist/dashboard/assets/search-BwbP84dP.js +0 -1
@@ -1 +1 @@
1
- import{c as a}from"./index-BBr9_AHg.js";const e=[["path",{d:"M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z",key:"zw3jo"}],["path",{d:"M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12",key:"1wduqc"}],["path",{d:"M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17",key:"kqbvx6"}]],c=a("layers",e);export{c as L};
1
+ import{c as a}from"./index-M3DwcRrc.js";const e=[["path",{d:"M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z",key:"zw3jo"}],["path",{d:"M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12",key:"1wduqc"}],["path",{d:"M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17",key:"kqbvx6"}]],c=a("layers",e);export{c as L};
@@ -1 +1 @@
1
- import{c}from"./index-BBr9_AHg.js";const e=[["path",{d:"M20.341 6.484A10 10 0 0 1 10.266 21.85",key:"1enhxb"}],["path",{d:"M3.659 17.516A10 10 0 0 1 13.74 2.152",key:"1crzgf"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}],["circle",{cx:"19",cy:"5",r:"2",key:"mhkx31"}],["circle",{cx:"5",cy:"19",r:"2",key:"v8kfzx"}]],o=c("orbit",e);export{o as O};
1
+ import{c}from"./index-M3DwcRrc.js";const e=[["path",{d:"M20.341 6.484A10 10 0 0 1 10.266 21.85",key:"1enhxb"}],["path",{d:"M3.659 17.516A10 10 0 0 1 13.74 2.152",key:"1crzgf"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}],["circle",{cx:"19",cy:"5",r:"2",key:"mhkx31"}],["circle",{cx:"5",cy:"19",r:"2",key:"v8kfzx"}]],o=c("orbit",e);export{o as O};
@@ -0,0 +1 @@
1
+ const e={openai:"#10B981",anthropic:"#F59E0B",google:"#3B82F6",deepseek:"#8B5CF6",groq:"#F97316",xai:"#EC4899"},r={openai:{bg:"bg-emerald-500/12",text:"text-emerald-400",border:"border-emerald-500/20"},anthropic:{bg:"bg-amber-500/12",text:"text-amber-400",border:"border-amber-500/20"},google:{bg:"bg-blue-500/12",text:"text-blue-400",border:"border-blue-500/20"},deepseek:{bg:"bg-violet-500/12",text:"text-violet-400",border:"border-violet-500/20"},groq:{bg:"bg-orange-500/12",text:"text-orange-400",border:"border-orange-500/20"},xai:{bg:"bg-pink-500/12",text:"text-pink-400",border:"border-pink-500/20"}},t={bg:"bg-slate-500/12",text:"text-slate-400",border:"border-slate-500/20"};export{e as a,t as d,r as p};
@@ -1 +1 @@
1
- import{c as a}from"./index-BBr9_AHg.js";const o=[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]],e=a("zap",o);export{e as Z};
1
+ import{c as a}from"./index-M3DwcRrc.js";const o=[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]],e=a("zap",o);export{e as Z};
@@ -4,8 +4,8 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>LLMTap — LLM Observability</title>
7
- <script type="module" crossorigin src="/assets/index-BBr9_AHg.js"></script>
8
- <link rel="stylesheet" crossorigin href="/assets/index-CIGK6hiV.css">
7
+ <script type="module" crossorigin src="/assets/index-M3DwcRrc.js"></script>
8
+ <link rel="stylesheet" crossorigin href="/assets/index-BuSUiwyD.css">
9
9
  </head>
10
10
  <body>
11
11
  <div id="root"></div>
package/dist/index.js CHANGED
@@ -14,7 +14,7 @@ var __dirname = path.dirname(fileURLToPath(import.meta.url));
14
14
  async function startCommand(options) {
15
15
  const port = parseInt(options.port, 10);
16
16
  const retentionDays = options.retention ? parseInt(options.retention, 10) : void 0;
17
- const bundledPath = path.resolve(__dirname, "..", "dashboard");
17
+ const bundledPath = path.resolve(__dirname, "dashboard");
18
18
  const monorepoPath = path.resolve(__dirname, "..", "..", "dashboard", "dist");
19
19
  const dashboardPath = fs.existsSync(bundledPath) ? bundledPath : monorepoPath;
20
20
  console.log("");
@@ -61,6 +61,20 @@ async function startCommand(options) {
61
61
  if (error.message?.includes("EADDRINUSE")) {
62
62
  console.error(chalk.red(` Port ${port} is already in use.`));
63
63
  console.error(chalk.gray(` Try: npx llmtap --port ${port + 1}`));
64
+ } else if (error.message?.includes("better-sqlite3") || error.message?.includes("MODULE_NOT_FOUND") || error.message?.includes("node-gyp") || error.message?.includes("prebuild-install") || error.message?.includes("Cannot find module")) {
65
+ console.error(chalk.red(" Failed to load native SQLite module (better-sqlite3)."));
66
+ console.error("");
67
+ console.error(chalk.yellow(" This usually means your Node.js version doesn't have prebuilt binaries."));
68
+ console.error("");
69
+ console.error(chalk.white(" How to fix:"));
70
+ console.error(chalk.gray(" 1. Use Node.js LTS (v18, v20, or v22) \u2014 prebuilt binaries are available"));
71
+ console.error(chalk.gray(" \u2192 nvm install --lts && nvm use --lts"));
72
+ console.error(chalk.gray(" 2. Or install C++ build tools for your platform:"));
73
+ console.error(chalk.gray(" \u2192 Windows: npm install -g windows-build-tools"));
74
+ console.error(chalk.gray(" \u2192 macOS: xcode-select --install"));
75
+ console.error(chalk.gray(" \u2192 Linux: sudo apt install build-essential python3"));
76
+ console.error("");
77
+ console.error(chalk.gray(` Your Node.js version: ${process.version}`));
64
78
  } else {
65
79
  console.error(chalk.red(` Failed to start: ${error.message}`));
66
80
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/commands/start.ts","../src/commands/reset.ts","../src/commands/export.ts","../src/commands/status.ts","../src/commands/tail.ts","../src/commands/doctor.ts","../src/commands/stats.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { startCommand } from \"./commands/start.js\";\nimport { resetCommand } from \"./commands/reset.js\";\nimport { exportCommand } from \"./commands/export.js\";\nimport { statusCommand } from \"./commands/status.js\";\nimport { tailCommand } from \"./commands/tail.js\";\nimport { doctorCommand } from \"./commands/doctor.js\";\nimport { statsCommand } from \"./commands/stats.js\";\nimport { VERSION } from \"@llmtap/shared\";\n\nconst program = new Command();\n\nprogram\n .name(\"llmtap\")\n .description(\"DevTools for AI Agents - See every LLM call, trace agent workflows, track costs\")\n .version(VERSION);\n\nprogram\n .command(\"start\", { isDefault: true })\n .description(\"Start the LLMTap collector and dashboard\")\n .option(\"-p, --port <port>\", \"Port number\", \"4781\")\n .option(\"-H, --host <host>\", \"Host to bind to (use 0.0.0.0 to expose to network)\", \"127.0.0.1\")\n .option(\"-q, --quiet\", \"Suppress server logs\")\n .option(\"--demo\", \"Seed demo data on startup\")\n .option(\"--no-open\", \"Don't open browser automatically\")\n .option(\"-r, --retention <days>\", \"Auto-delete data older than N days (0 = keep forever)\")\n .action(startCommand);\n\nprogram\n .command(\"status\")\n .description(\"Show collector status, database info, and span count\")\n .action(statusCommand);\n\nprogram\n .command(\"reset\")\n .description(\"Clear all stored data\")\n .action(resetCommand);\n\nprogram\n .command(\"export\")\n .description(\"Export traces as JSON, CSV, or OTLP\")\n .option(\"-o, --output <path>\", \"Output file path\", \"llmtap-export.json\")\n .option(\"-f, --format <format>\", \"Output format (json, csv, or otlp)\", \"json\")\n .option(\"-l, --limit <count>\", \"Number of traces/spans to export\", \"100\")\n .option(\"-e, --endpoint <url>\", \"OTLP endpoint to forward spans to (e.g. http://localhost:4318/v1/traces)\")\n .option(\"-s, --service <name>\", \"service.name for OTLP export\", \"llmtap\")\n .action(exportCommand);\n\nprogram\n .command(\"tail\")\n .description(\"Stream traces to terminal in real-time\")\n .option(\"-f, --format <format>\", \"Output format (pretty or json)\", \"pretty\")\n .action(tailCommand);\n\nprogram\n .command(\"doctor\")\n .description(\"Diagnose common setup issues\")\n .action(doctorCommand);\n\nprogram\n .command(\"stats\")\n .description(\"Show quick terminal stats (cost, models, errors)\")\n .option(\"-p, --period <hours>\", \"Time period in hours\", \"24\")\n .option(\"--host <url>\", \"Collector URL\", \"http://localhost:4781\")\n .action(statsCommand);\n\nprogram.parse();\n","import path from \"node:path\";\nimport fs from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport chalk from \"chalk\";\nimport open from \"open\";\nimport { startServer, getOtlpEndpoint } from \"@llmtap/collector\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\ninterface StartOptions {\n port: string;\n host: string;\n quiet?: boolean;\n open?: boolean;\n demo?: boolean;\n retention?: string;\n}\n\nexport async function startCommand(options: StartOptions): Promise<void> {\n const port = parseInt(options.port, 10);\n const retentionDays = options.retention\n ? parseInt(options.retention, 10)\n : undefined;\n\n // Resolve dashboard dist path\n // 1. Bundled inside CLI dist (for npm publish): dist/dashboard/\n // 2. Monorepo sibling (for local dev): ../dashboard/dist/\n const bundledPath = path.resolve(__dirname, \"..\", \"dashboard\");\n const monorepoPath = path.resolve(__dirname, \"..\", \"..\", \"dashboard\", \"dist\");\n const dashboardPath = fs.existsSync(bundledPath) ? bundledPath : monorepoPath;\n\n console.log(\"\");\n console.log(chalk.bold.hex(\"#6366f1\")(\" LLMTap\") + chalk.gray(\" - DevTools for AI Agents\"));\n console.log(\"\");\n\n try {\n const host = options.host;\n\n if (host === \"0.0.0.0\") {\n console.log(chalk.yellow(\" ⚠ Binding to 0.0.0.0 — the collector will be accessible from your network\"));\n console.log(\"\");\n }\n\n const address = await startServer({\n port,\n host,\n dashboardPath,\n quiet: options.quiet,\n demo: options.demo,\n retentionDays,\n });\n\n const url = `http://${host === \"0.0.0.0\" ? \"localhost\" : host}:${port}`;\n\n console.log(chalk.green(\" Ready!\"));\n console.log(\"\");\n console.log(` ${chalk.gray(\"Dashboard:\")} ${chalk.cyan(url)}`);\n console.log(` ${chalk.gray(\"API:\")} ${chalk.cyan(`${url}/v1`)}`);\n console.log(` ${chalk.gray(\"Health:\")} ${chalk.cyan(`${url}/health`)}`);\n if (retentionDays && retentionDays > 0) {\n console.log(` ${chalk.gray(\"Retention:\")} ${chalk.yellow(`${retentionDays} days`)}`);\n }\n const otlpTarget = getOtlpEndpoint();\n if (otlpTarget) {\n console.log(` ${chalk.gray(\"OTLP:\")} ${chalk.cyan(otlpTarget)} ${chalk.green(\"(auto-forwarding)\")}`);\n }\n console.log(\"\");\n console.log(chalk.gray(\" Press Ctrl+C to stop\"));\n console.log(\"\");\n\n // Open browser\n if (options.open !== false) {\n try {\n await open(url);\n } catch {\n // Ignore if browser can't be opened\n }\n }\n } catch (err: unknown) {\n const error = err as Error;\n if (error.message?.includes(\"EADDRINUSE\")) {\n console.error(chalk.red(` Port ${port} is already in use.`));\n console.error(chalk.gray(` Try: npx llmtap --port ${port + 1}`));\n } else {\n console.error(chalk.red(` Failed to start: ${error.message}`));\n }\n process.exit(1);\n }\n}\n","import chalk from \"chalk\";\nimport { resetDb } from \"@llmtap/collector\";\n\nexport async function resetCommand(): Promise<void> {\n try {\n resetDb();\n console.log(chalk.green(\" Data cleared successfully.\"));\n } catch (err: unknown) {\n const error = err as Error;\n console.error(chalk.red(` Failed to reset: ${error.message}`));\n process.exit(1);\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport chalk from \"chalk\";\nimport { getDb } from \"@llmtap/collector\";\nimport { spansToOtlp } from \"@llmtap/shared\";\nimport type { Span } from \"@llmtap/shared\";\n\ninterface ExportOptions {\n output: string;\n limit: string;\n format: string;\n endpoint?: string;\n service?: string;\n}\n\nfunction safeParse(v: unknown): unknown {\n if (!v || typeof v !== \"string\") return undefined;\n try { return JSON.parse(v); } catch { return undefined; }\n}\n\nfunction rowToSpan(row: Record<string, unknown>): Span {\n return {\n ...row,\n parentSpanId: (row.parentSpanId as string) ?? undefined,\n endTime: (row.endTime as number) ?? undefined,\n duration: (row.duration as number) ?? undefined,\n responseModel: (row.responseModel as string) ?? undefined,\n temperature: (row.temperature as number) ?? undefined,\n maxTokens: (row.maxTokens as number) ?? undefined,\n topP: (row.topP as number) ?? undefined,\n inputMessages: safeParse(row.inputMessages) as Span[\"inputMessages\"],\n outputMessages: safeParse(row.outputMessages) as Span[\"outputMessages\"],\n toolCalls: safeParse(row.toolCalls) as Span[\"toolCalls\"],\n tags: safeParse(row.tags) as Record<string, string> | undefined,\n errorType: (row.errorType as string) ?? undefined,\n errorMessage: (row.errorMessage as string) ?? undefined,\n sessionId: (row.sessionId as string) ?? undefined,\n userId: (row.userId as string) ?? undefined,\n } as Span;\n}\n\nexport async function exportCommand(options: ExportOptions): Promise<void> {\n try {\n const db = getDb();\n const limit = parseInt(options.limit, 10);\n const format = options.format ?? \"json\";\n\n if (format === \"otlp\") {\n return await exportOtlp(db, limit, options);\n }\n\n // Get traces\n const traces = db\n .prepare(\n `\n SELECT\n traceId,\n MIN(name) as name,\n MIN(startTime) as startTime,\n MAX(endTime) as endTime,\n CASE WHEN SUM(CASE WHEN status = 'error' THEN 1 ELSE 0 END) > 0\n THEN 'error' ELSE 'ok' END as status,\n COUNT(*) as spanCount,\n COALESCE(SUM(totalTokens), 0) as totalTokens,\n COALESCE(SUM(totalCost), 0) as totalCost\n FROM spans\n GROUP BY traceId\n ORDER BY startTime DESC\n LIMIT ?\n `\n )\n .all(limit) as Array<Record<string, unknown>>;\n\n // Get spans for each trace\n const getSpans = db.prepare(\"SELECT * FROM spans WHERE traceId = ? ORDER BY startTime ASC\");\n const exportData = traces.map((trace) => ({\n ...trace,\n spans: (getSpans.all(trace.traceId) as Array<Record<string, unknown>>).map((span) => ({\n ...span,\n inputMessages: safeParse(span.inputMessages),\n outputMessages: safeParse(span.outputMessages),\n toolCalls: safeParse(span.toolCalls),\n tags: safeParse(span.tags),\n })),\n }));\n\n let output: string;\n let ext: string;\n\n if (format === \"csv\") {\n ext = \"csv\";\n const headers = [\n \"traceId\", \"name\", \"status\", \"spanCount\", \"totalTokens\", \"totalCost\",\n \"startTime\", \"endTime\",\n ];\n const rows = traces.map((t) =>\n headers.map((h) => {\n const val = t[h];\n const s = String(val ?? \"\");\n return s.includes(\",\") || s.includes('\"') || s.includes(\"\\n\") ? `\"${s.replace(/\"/g, '\"\"')}\"` : s;\n }).join(\",\")\n );\n output = [headers.join(\",\"), ...rows].join(\"\\n\");\n } else {\n ext = \"json\";\n output = JSON.stringify(exportData, null, 2);\n }\n\n const defaultOutput = options.output === \"llmtap-export.json\" && format === \"csv\"\n ? \"llmtap-export.csv\"\n : options.output;\n const outputPath = path.resolve(defaultOutput);\n fs.writeFileSync(outputPath, output);\n\n console.log(chalk.green(` Exported ${traces.length} traces as ${ext.toUpperCase()} to ${outputPath}`));\n } catch (err: unknown) {\n const error = err as Error;\n console.error(chalk.red(` Export failed: ${error.message}`));\n process.exit(1);\n }\n}\n\nasync function exportOtlp(\n db: ReturnType<typeof getDb>,\n limit: number,\n options: ExportOptions\n): Promise<void> {\n const rows = db\n .prepare(\"SELECT * FROM spans ORDER BY startTime DESC LIMIT ?\")\n .all(limit) as Array<Record<string, unknown>>;\n\n const spans = rows.map(rowToSpan);\n const otlp = spansToOtlp(spans, options.service ?? \"llmtap\");\n\n // If --endpoint is provided, forward to OTLP collector\n if (options.endpoint) {\n console.log(chalk.blue(` Forwarding ${spans.length} spans to ${options.endpoint}...`));\n try {\n const res = await fetch(options.endpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(otlp),\n signal: AbortSignal.timeout(30000),\n });\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n console.error(chalk.red(` OTLP endpoint returned ${res.status}: ${body.slice(0, 200)}`));\n process.exit(1);\n }\n console.log(chalk.green(` Successfully forwarded ${spans.length} spans to OTLP endpoint`));\n } catch (err) {\n console.error(chalk.red(` Failed to reach OTLP endpoint: ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n return;\n }\n\n // Otherwise write to file\n const outputPath = path.resolve(\n options.output === \"llmtap-export.json\" ? \"llmtap-export.otlp.json\" : options.output\n );\n fs.writeFileSync(outputPath, JSON.stringify(otlp, null, 2));\n console.log(chalk.green(` Exported ${spans.length} spans as OTLP JSON to ${outputPath}`));\n console.log(chalk.dim(` Import into Jaeger, Grafana Tempo, Datadog, or any OTLP-compatible backend`));\n}\n","import chalk from \"chalk\";\r\n\r\nexport async function statusCommand(): Promise<void> {\r\n try {\r\n const res = await fetch(\"http://localhost:4781/v1/db-info\", {\r\n signal: AbortSignal.timeout(3000),\r\n });\r\n\r\n if (!res.ok) {\r\n console.error(chalk.red(\" Collector responded with an error.\"));\r\n process.exit(1);\r\n }\r\n\r\n const info = (await res.json()) as {\r\n path: string;\r\n sizeBytes: number;\r\n spanCount: number;\r\n traceCount: number;\r\n oldestSpan: number | null;\r\n newestSpan: number | null;\r\n walMode: string;\r\n };\r\n\r\n const formatBytes = (bytes: number) => {\r\n if (bytes === 0) return \"0 B\";\r\n const units = [\"B\", \"KB\", \"MB\", \"GB\"];\r\n const i = Math.min(Math.floor(Math.log(bytes) / Math.log(1024)), units.length - 1);\r\n return `${(bytes / Math.pow(1024, i)).toFixed(i === 0 ? 0 : 1)} ${units[i]}`;\r\n };\r\n\r\n console.log(\"\");\r\n console.log(chalk.bold.hex(\"#6366f1\")(\" LLMTap\") + chalk.green(\" — Running\"));\r\n console.log(\"\");\r\n console.log(` ${chalk.gray(\"Spans:\")} ${chalk.white(info.spanCount.toLocaleString())}`);\r\n console.log(` ${chalk.gray(\"Traces:\")} ${chalk.white(info.traceCount.toLocaleString())}`);\r\n console.log(` ${chalk.gray(\"DB size:\")} ${chalk.white(formatBytes(info.sizeBytes))}`);\r\n console.log(` ${chalk.gray(\"WAL mode:\")} ${chalk.white(info.walMode.toUpperCase())}`);\r\n console.log(` ${chalk.gray(\"DB path:\")} ${chalk.white(info.path)}`);\r\n\r\n if (info.oldestSpan && info.newestSpan) {\r\n const oldest = new Date(info.oldestSpan).toLocaleString();\r\n const newest = new Date(info.newestSpan).toLocaleString();\r\n console.log(` ${chalk.gray(\"Data range:\")} ${chalk.white(`${oldest} — ${newest}`)}`);\r\n }\r\n console.log(\"\");\r\n } catch {\r\n console.log(\"\");\r\n console.log(chalk.bold.hex(\"#6366f1\")(\" LLMTap\") + chalk.red(\" — Not running\"));\r\n console.log(\"\");\r\n console.log(chalk.gray(\" Start the collector with: \") + chalk.cyan(\"npx llmtap\"));\r\n console.log(\"\");\r\n }\r\n}\r\n","import chalk from \"chalk\";\r\n\r\ninterface TailOptions {\r\n format: string;\r\n}\r\n\r\nexport async function tailCommand(options: TailOptions): Promise<void> {\r\n const format = options.format ?? \"pretty\";\r\n const url = \"http://localhost:4781/v1/stream\";\r\n\r\n console.log(\"\");\r\n console.log(\r\n chalk.bold.hex(\"#6366f1\")(\" LLMTap\") +\r\n chalk.gray(\" — Streaming traces in real-time\")\r\n );\r\n console.log(chalk.gray(\" Press Ctrl+C to stop\"));\r\n console.log(\"\");\r\n\r\n try {\r\n const res = await fetch(url, {\r\n headers: { Accept: \"text/event-stream\" },\r\n });\r\n\r\n if (!res.ok || !res.body) {\r\n console.error(chalk.red(\" Could not connect to collector.\"));\r\n console.error(chalk.gray(\" Make sure the collector is running: npx llmtap\"));\r\n process.exit(1);\r\n }\r\n\r\n const decoder = new TextDecoder();\r\n const reader = res.body.getReader();\r\n let buffer = \"\";\r\n\r\n while (true) {\r\n const { done, value } = await reader.read();\r\n if (done) break;\r\n\r\n buffer += decoder.decode(value, { stream: true });\r\n const lines = buffer.split(\"\\n\");\r\n buffer = lines.pop() ?? \"\";\r\n\r\n for (const line of lines) {\r\n if (!line.startsWith(\"data: \")) continue;\r\n const json = line.slice(6).trim();\r\n if (!json) continue;\r\n\r\n try {\r\n const span = JSON.parse(json) as {\r\n spanId: string;\r\n traceId: string;\r\n name: string;\r\n providerName: string;\r\n requestModel: string;\r\n duration?: number;\r\n totalTokens: number;\r\n totalCost: number;\r\n status: string;\r\n errorMessage?: string;\r\n };\r\n\r\n if (format === \"json\") {\r\n console.log(json);\r\n } else {\r\n const dur = span.duration ? `${span.duration}ms` : \"...\";\r\n const cost =\r\n span.totalCost > 0 ? `$${span.totalCost.toFixed(4)}` : \"$0\";\r\n const statusIcon =\r\n span.status === \"error\" ? chalk.red(\"ERR\") : chalk.green(\"OK \");\r\n\r\n console.log(\r\n ` ${statusIcon} ${chalk.gray(dur.padStart(7))} ${chalk.cyan(span.providerName.padEnd(10))} ${chalk.white(span.requestModel.padEnd(24))} ${chalk.yellow(String(span.totalTokens).padStart(6) + \" tok\")} ${chalk.green(cost.padStart(8))} ${chalk.gray(span.name)}`\r\n );\r\n if (span.errorMessage) {\r\n console.log(\r\n ` ${chalk.red(\"→ \" + span.errorMessage.slice(0, 120))}`\r\n );\r\n }\r\n }\r\n } catch {\r\n // Skip malformed events\r\n }\r\n }\r\n }\r\n } catch {\r\n console.error(chalk.red(\" Could not connect to collector.\"));\r\n console.error(chalk.gray(\" Make sure the collector is running: npx llmtap\"));\r\n process.exit(1);\r\n }\r\n}\r\n","import chalk from \"chalk\";\r\n\r\nexport async function doctorCommand(): Promise<void> {\r\n console.log(\"\");\r\n console.log(chalk.bold.hex(\"#6366f1\")(\" LLMTap Doctor\"));\r\n console.log(chalk.gray(\" Checking your setup...\"));\r\n console.log(\"\");\r\n\r\n const checks: { label: string; status: \"ok\" | \"warn\" | \"fail\"; detail: string }[] = [];\r\n\r\n // Check 1: Node.js version\r\n const nodeVersion = process.version;\r\n const major = parseInt(nodeVersion.slice(1), 10);\r\n if (major >= 18) {\r\n checks.push({ label: \"Node.js version\", status: \"ok\", detail: nodeVersion });\r\n } else {\r\n checks.push({ label: \"Node.js version\", status: \"fail\", detail: `${nodeVersion} (requires >= 18)` });\r\n }\r\n\r\n // Check 2: Collector running\r\n try {\r\n const res = await fetch(\"http://localhost:4781/health\", {\r\n signal: AbortSignal.timeout(3000),\r\n });\r\n if (res.ok) {\r\n checks.push({ label: \"Collector\", status: \"ok\", detail: \"Running on port 4781\" });\r\n } else {\r\n checks.push({ label: \"Collector\", status: \"fail\", detail: `Responded with HTTP ${res.status}` });\r\n }\r\n } catch {\r\n checks.push({ label: \"Collector\", status: \"warn\", detail: \"Not running (start with: npx llmtap)\" });\r\n }\r\n\r\n // Check 3: Database accessible\r\n try {\r\n const res = await fetch(\"http://localhost:4781/v1/db-info\", {\r\n signal: AbortSignal.timeout(3000),\r\n });\r\n if (res.ok) {\r\n const info = (await res.json()) as { sizeBytes: number; spanCount: number; walMode: string };\r\n checks.push({\r\n label: \"Database\",\r\n status: info.walMode === \"wal\" ? \"ok\" : \"warn\",\r\n detail: `${info.spanCount} spans, WAL=${info.walMode.toUpperCase()}`,\r\n });\r\n }\r\n } catch {\r\n checks.push({ label: \"Database\", status: \"warn\", detail: \"Cannot check (collector not running)\" });\r\n }\r\n\r\n // Check 4: SDK installed\r\n try {\r\n await import(\"@llmtap/sdk\");\r\n checks.push({ label: \"@llmtap/sdk\", status: \"ok\", detail: \"Installed\" });\r\n } catch {\r\n checks.push({ label: \"@llmtap/sdk\", status: \"warn\", detail: \"Not found in current project (install with: npm i @llmtap/sdk)\" });\r\n }\r\n\r\n // Check 5: Port available\r\n if (checks.find((c) => c.label === \"Collector\")?.status !== \"ok\") {\r\n try {\r\n // Try connecting to port 4781 to see if something else is using it\r\n const res = await fetch(\"http://localhost:4781\", {\r\n signal: AbortSignal.timeout(1000),\r\n });\r\n if (!res.ok) {\r\n checks.push({ label: \"Port 4781\", status: \"warn\", detail: \"Something is running but not LLMTap\" });\r\n }\r\n } catch {\r\n checks.push({ label: \"Port 4781\", status: \"ok\", detail: \"Available\" });\r\n }\r\n }\r\n\r\n // Display results\r\n for (const check of checks) {\r\n const icon =\r\n check.status === \"ok\"\r\n ? chalk.green(\" ✓\")\r\n : check.status === \"warn\"\r\n ? chalk.yellow(\" !\")\r\n : chalk.red(\" ✗\");\r\n const label = chalk.white(check.label.padEnd(20));\r\n const detail =\r\n check.status === \"ok\"\r\n ? chalk.gray(check.detail)\r\n : check.status === \"warn\"\r\n ? chalk.yellow(check.detail)\r\n : chalk.red(check.detail);\r\n console.log(`${icon} ${label} ${detail}`);\r\n }\r\n\r\n const failCount = checks.filter((c) => c.status === \"fail\").length;\r\n const warnCount = checks.filter((c) => c.status === \"warn\").length;\r\n console.log(\"\");\r\n if (failCount > 0) {\r\n console.log(chalk.red(` ${failCount} issue(s) found. Fix them to use LLMTap.`));\r\n } else if (warnCount > 0) {\r\n console.log(chalk.yellow(` ${warnCount} warning(s). Everything should still work.`));\r\n } else {\r\n console.log(chalk.green(\" All checks passed!\"));\r\n }\r\n console.log(\"\");\r\n}\r\n","import chalk from \"chalk\";\r\n\r\ninterface StatsResponse {\r\n totalTraces: number;\r\n totalSpans: number;\r\n totalTokens: number;\r\n totalCost: number;\r\n avgDuration: number;\r\n errorCount: number;\r\n errorRate: number;\r\n byProvider: { provider: string; spanCount: number; totalTokens: number; totalCost: number; avgDuration: number }[];\r\n byModel: { model: string; provider: string; spanCount: number; totalTokens: number; totalCost: number; avgDuration: number }[];\r\n}\r\n\r\nexport async function statsCommand(options: { period?: string; host?: string }): Promise<void> {\r\n const period = Number(options.period ?? \"24\");\r\n const host = options.host ?? \"http://localhost:4781\";\r\n\r\n try {\r\n const res = await fetch(`${host}/v1/stats?period=${period}`);\r\n if (!res.ok) {\r\n console.error(chalk.red(`Error: Collector returned HTTP ${res.status}`));\r\n console.error(chalk.dim(\"Is the collector running? Try: npx llmtap start\"));\r\n process.exit(1);\r\n }\r\n\r\n const stats = (await res.json()) as StatsResponse;\r\n\r\n console.log(\"\");\r\n console.log(chalk.bold.white(` LLMTap Stats — Last ${period}h`));\r\n console.log(chalk.dim(\" ─────────────────────────────────\"));\r\n console.log(\"\");\r\n\r\n // Summary\r\n const errorPct = (stats.errorRate * 100).toFixed(1);\r\n console.log(` ${chalk.dim(\"Traces\")} ${chalk.bold.white(String(stats.totalTraces))}`);\r\n console.log(` ${chalk.dim(\"Spans\")} ${chalk.bold.white(String(stats.totalSpans))}`);\r\n console.log(` ${chalk.dim(\"Tokens\")} ${chalk.bold.white(stats.totalTokens.toLocaleString())}`);\r\n console.log(` ${chalk.dim(\"Total Cost\")} ${chalk.bold.green(\"$\" + stats.totalCost.toFixed(4))}`);\r\n console.log(` ${chalk.dim(\"Avg Latency\")} ${chalk.white(formatMs(stats.avgDuration))}`);\r\n console.log(\r\n ` ${chalk.dim(\"Error Rate\")} ${\r\n stats.errorRate > 0.05\r\n ? chalk.bold.red(errorPct + \"%\")\r\n : chalk.green(errorPct + \"%\")\r\n } ${chalk.dim(`(${stats.errorCount} errors)`)}`\r\n );\r\n\r\n // Top providers\r\n if (stats.byProvider.length > 0) {\r\n console.log(\"\");\r\n console.log(chalk.bold.white(\" Top Providers\"));\r\n console.log(chalk.dim(\" ─────────────────────────────────\"));\r\n for (const p of stats.byProvider.slice(0, 5)) {\r\n const bar = makeBar(p.totalCost, stats.totalCost, 20);\r\n console.log(\r\n ` ${chalk.cyan(p.provider.padEnd(12))} ${chalk.dim(String(p.spanCount).padStart(5) + \" calls\")} ${chalk.green(\"$\" + p.totalCost.toFixed(4).padStart(8))} ${chalk.dim(bar)}`\r\n );\r\n }\r\n }\r\n\r\n // Top models\r\n if (stats.byModel.length > 0) {\r\n console.log(\"\");\r\n console.log(chalk.bold.white(\" Top Models\"));\r\n console.log(chalk.dim(\" ─────────────────────────────────\"));\r\n for (const m of stats.byModel.slice(0, 8)) {\r\n const bar = makeBar(m.totalCost, stats.totalCost, 20);\r\n console.log(\r\n ` ${chalk.white(m.model.padEnd(28).slice(0, 28))} ${chalk.dim(String(m.spanCount).padStart(5) + \" calls\")} ${chalk.green(\"$\" + m.totalCost.toFixed(4).padStart(8))} ${chalk.dim(bar)}`\r\n );\r\n }\r\n }\r\n\r\n console.log(\"\");\r\n } catch (err) {\r\n if (err instanceof TypeError && (err as NodeJS.ErrnoException).cause) {\r\n console.error(chalk.red(\"Error: Cannot connect to collector\"));\r\n console.error(chalk.dim(\"Is the collector running? Try: npx llmtap start\"));\r\n } else {\r\n console.error(chalk.red(\"Error:\"), err instanceof Error ? err.message : err);\r\n }\r\n process.exit(1);\r\n }\r\n}\r\n\r\nfunction formatMs(ms: number): string {\r\n if (ms < 1000) return `${Math.round(ms)}ms`;\r\n return `${(ms / 1000).toFixed(2)}s`;\r\n}\r\n\r\nfunction makeBar(value: number, total: number, width: number): string {\r\n if (total <= 0) return \"\";\r\n const filled = Math.max(Math.round((value / total) * width), 1);\r\n return \"█\".repeat(filled) + \"░\".repeat(width - filled);\r\n}\r\n"],"mappings":"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","names":["chalk","fs","path","chalk","chalk","chalk","chalk","chalk"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/start.ts","../src/commands/reset.ts","../src/commands/export.ts","../src/commands/status.ts","../src/commands/tail.ts","../src/commands/doctor.ts","../src/commands/stats.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { startCommand } from \"./commands/start.js\";\nimport { resetCommand } from \"./commands/reset.js\";\nimport { exportCommand } from \"./commands/export.js\";\nimport { statusCommand } from \"./commands/status.js\";\nimport { tailCommand } from \"./commands/tail.js\";\nimport { doctorCommand } from \"./commands/doctor.js\";\nimport { statsCommand } from \"./commands/stats.js\";\nimport { VERSION } from \"@llmtap/shared\";\n\nconst program = new Command();\n\nprogram\n .name(\"llmtap\")\n .description(\"DevTools for AI Agents - See every LLM call, trace agent workflows, track costs\")\n .version(VERSION);\n\nprogram\n .command(\"start\", { isDefault: true })\n .description(\"Start the LLMTap collector and dashboard\")\n .option(\"-p, --port <port>\", \"Port number\", \"4781\")\n .option(\"-H, --host <host>\", \"Host to bind to (use 0.0.0.0 to expose to network)\", \"127.0.0.1\")\n .option(\"-q, --quiet\", \"Suppress server logs\")\n .option(\"--demo\", \"Seed demo data on startup\")\n .option(\"--no-open\", \"Don't open browser automatically\")\n .option(\"-r, --retention <days>\", \"Auto-delete data older than N days (0 = keep forever)\")\n .action(startCommand);\n\nprogram\n .command(\"status\")\n .description(\"Show collector status, database info, and span count\")\n .action(statusCommand);\n\nprogram\n .command(\"reset\")\n .description(\"Clear all stored data\")\n .action(resetCommand);\n\nprogram\n .command(\"export\")\n .description(\"Export traces as JSON, CSV, or OTLP\")\n .option(\"-o, --output <path>\", \"Output file path\", \"llmtap-export.json\")\n .option(\"-f, --format <format>\", \"Output format (json, csv, or otlp)\", \"json\")\n .option(\"-l, --limit <count>\", \"Number of traces/spans to export\", \"100\")\n .option(\"-e, --endpoint <url>\", \"OTLP endpoint to forward spans to (e.g. http://localhost:4318/v1/traces)\")\n .option(\"-s, --service <name>\", \"service.name for OTLP export\", \"llmtap\")\n .action(exportCommand);\n\nprogram\n .command(\"tail\")\n .description(\"Stream traces to terminal in real-time\")\n .option(\"-f, --format <format>\", \"Output format (pretty or json)\", \"pretty\")\n .action(tailCommand);\n\nprogram\n .command(\"doctor\")\n .description(\"Diagnose common setup issues\")\n .action(doctorCommand);\n\nprogram\n .command(\"stats\")\n .description(\"Show quick terminal stats (cost, models, errors)\")\n .option(\"-p, --period <hours>\", \"Time period in hours\", \"24\")\n .option(\"--host <url>\", \"Collector URL\", \"http://localhost:4781\")\n .action(statsCommand);\n\nprogram.parse();\n","import path from \"node:path\";\nimport fs from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport chalk from \"chalk\";\nimport open from \"open\";\nimport { startServer, getOtlpEndpoint } from \"@llmtap/collector\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\ninterface StartOptions {\n port: string;\n host: string;\n quiet?: boolean;\n open?: boolean;\n demo?: boolean;\n retention?: string;\n}\n\nexport async function startCommand(options: StartOptions): Promise<void> {\n const port = parseInt(options.port, 10);\n const retentionDays = options.retention\n ? parseInt(options.retention, 10)\n : undefined;\n\n // Resolve dashboard dist path\n // 1. Bundled inside CLI dist (for npm publish): dist/dashboard/\n // 2. Monorepo sibling (for local dev): ../../dashboard/dist/\n const bundledPath = path.resolve(__dirname, \"dashboard\");\n const monorepoPath = path.resolve(__dirname, \"..\", \"..\", \"dashboard\", \"dist\");\n const dashboardPath = fs.existsSync(bundledPath) ? bundledPath : monorepoPath;\n\n console.log(\"\");\n console.log(chalk.bold.hex(\"#6366f1\")(\" LLMTap\") + chalk.gray(\" - DevTools for AI Agents\"));\n console.log(\"\");\n\n try {\n const host = options.host;\n\n if (host === \"0.0.0.0\") {\n console.log(chalk.yellow(\" ⚠ Binding to 0.0.0.0 — the collector will be accessible from your network\"));\n console.log(\"\");\n }\n\n const address = await startServer({\n port,\n host,\n dashboardPath,\n quiet: options.quiet,\n demo: options.demo,\n retentionDays,\n });\n\n const url = `http://${host === \"0.0.0.0\" ? \"localhost\" : host}:${port}`;\n\n console.log(chalk.green(\" Ready!\"));\n console.log(\"\");\n console.log(` ${chalk.gray(\"Dashboard:\")} ${chalk.cyan(url)}`);\n console.log(` ${chalk.gray(\"API:\")} ${chalk.cyan(`${url}/v1`)}`);\n console.log(` ${chalk.gray(\"Health:\")} ${chalk.cyan(`${url}/health`)}`);\n if (retentionDays && retentionDays > 0) {\n console.log(` ${chalk.gray(\"Retention:\")} ${chalk.yellow(`${retentionDays} days`)}`);\n }\n const otlpTarget = getOtlpEndpoint();\n if (otlpTarget) {\n console.log(` ${chalk.gray(\"OTLP:\")} ${chalk.cyan(otlpTarget)} ${chalk.green(\"(auto-forwarding)\")}`);\n }\n console.log(\"\");\n console.log(chalk.gray(\" Press Ctrl+C to stop\"));\n console.log(\"\");\n\n // Open browser\n if (options.open !== false) {\n try {\n await open(url);\n } catch {\n // Ignore if browser can't be opened\n }\n }\n } catch (err: unknown) {\n const error = err as Error;\n if (error.message?.includes(\"EADDRINUSE\")) {\n console.error(chalk.red(` Port ${port} is already in use.`));\n console.error(chalk.gray(` Try: npx llmtap --port ${port + 1}`));\n } else if (\n error.message?.includes(\"better-sqlite3\") ||\n error.message?.includes(\"MODULE_NOT_FOUND\") ||\n error.message?.includes(\"node-gyp\") ||\n error.message?.includes(\"prebuild-install\") ||\n error.message?.includes(\"Cannot find module\")\n ) {\n console.error(chalk.red(\" Failed to load native SQLite module (better-sqlite3).\"));\n console.error(\"\");\n console.error(chalk.yellow(\" This usually means your Node.js version doesn't have prebuilt binaries.\"));\n console.error(\"\");\n console.error(chalk.white(\" How to fix:\"));\n console.error(chalk.gray(\" 1. Use Node.js LTS (v18, v20, or v22) — prebuilt binaries are available\"));\n console.error(chalk.gray(\" → nvm install --lts && nvm use --lts\"));\n console.error(chalk.gray(\" 2. Or install C++ build tools for your platform:\"));\n console.error(chalk.gray(\" → Windows: npm install -g windows-build-tools\"));\n console.error(chalk.gray(\" → macOS: xcode-select --install\"));\n console.error(chalk.gray(\" → Linux: sudo apt install build-essential python3\"));\n console.error(\"\");\n console.error(chalk.gray(` Your Node.js version: ${process.version}`));\n } else {\n console.error(chalk.red(` Failed to start: ${error.message}`));\n }\n process.exit(1);\n }\n}\n","import chalk from \"chalk\";\nimport { resetDb } from \"@llmtap/collector\";\n\nexport async function resetCommand(): Promise<void> {\n try {\n resetDb();\n console.log(chalk.green(\" Data cleared successfully.\"));\n } catch (err: unknown) {\n const error = err as Error;\n console.error(chalk.red(` Failed to reset: ${error.message}`));\n process.exit(1);\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport chalk from \"chalk\";\nimport { getDb } from \"@llmtap/collector\";\nimport { spansToOtlp } from \"@llmtap/shared\";\nimport type { Span } from \"@llmtap/shared\";\n\ninterface ExportOptions {\n output: string;\n limit: string;\n format: string;\n endpoint?: string;\n service?: string;\n}\n\nfunction safeParse(v: unknown): unknown {\n if (!v || typeof v !== \"string\") return undefined;\n try { return JSON.parse(v); } catch { return undefined; }\n}\n\nfunction rowToSpan(row: Record<string, unknown>): Span {\n return {\n ...row,\n parentSpanId: (row.parentSpanId as string) ?? undefined,\n endTime: (row.endTime as number) ?? undefined,\n duration: (row.duration as number) ?? undefined,\n responseModel: (row.responseModel as string) ?? undefined,\n temperature: (row.temperature as number) ?? undefined,\n maxTokens: (row.maxTokens as number) ?? undefined,\n topP: (row.topP as number) ?? undefined,\n inputMessages: safeParse(row.inputMessages) as Span[\"inputMessages\"],\n outputMessages: safeParse(row.outputMessages) as Span[\"outputMessages\"],\n toolCalls: safeParse(row.toolCalls) as Span[\"toolCalls\"],\n tags: safeParse(row.tags) as Record<string, string> | undefined,\n errorType: (row.errorType as string) ?? undefined,\n errorMessage: (row.errorMessage as string) ?? undefined,\n sessionId: (row.sessionId as string) ?? undefined,\n userId: (row.userId as string) ?? undefined,\n } as Span;\n}\n\nexport async function exportCommand(options: ExportOptions): Promise<void> {\n try {\n const db = getDb();\n const limit = parseInt(options.limit, 10);\n const format = options.format ?? \"json\";\n\n if (format === \"otlp\") {\n return await exportOtlp(db, limit, options);\n }\n\n // Get traces\n const traces = db\n .prepare(\n `\n SELECT\n traceId,\n MIN(name) as name,\n MIN(startTime) as startTime,\n MAX(endTime) as endTime,\n CASE WHEN SUM(CASE WHEN status = 'error' THEN 1 ELSE 0 END) > 0\n THEN 'error' ELSE 'ok' END as status,\n COUNT(*) as spanCount,\n COALESCE(SUM(totalTokens), 0) as totalTokens,\n COALESCE(SUM(totalCost), 0) as totalCost\n FROM spans\n GROUP BY traceId\n ORDER BY startTime DESC\n LIMIT ?\n `\n )\n .all(limit) as Array<Record<string, unknown>>;\n\n // Get spans for each trace\n const getSpans = db.prepare(\"SELECT * FROM spans WHERE traceId = ? ORDER BY startTime ASC\");\n const exportData = traces.map((trace) => ({\n ...trace,\n spans: (getSpans.all(trace.traceId) as Array<Record<string, unknown>>).map((span) => ({\n ...span,\n inputMessages: safeParse(span.inputMessages),\n outputMessages: safeParse(span.outputMessages),\n toolCalls: safeParse(span.toolCalls),\n tags: safeParse(span.tags),\n })),\n }));\n\n let output: string;\n let ext: string;\n\n if (format === \"csv\") {\n ext = \"csv\";\n const headers = [\n \"traceId\", \"name\", \"status\", \"spanCount\", \"totalTokens\", \"totalCost\",\n \"startTime\", \"endTime\",\n ];\n const rows = traces.map((t) =>\n headers.map((h) => {\n const val = t[h];\n const s = String(val ?? \"\");\n return s.includes(\",\") || s.includes('\"') || s.includes(\"\\n\") ? `\"${s.replace(/\"/g, '\"\"')}\"` : s;\n }).join(\",\")\n );\n output = [headers.join(\",\"), ...rows].join(\"\\n\");\n } else {\n ext = \"json\";\n output = JSON.stringify(exportData, null, 2);\n }\n\n const defaultOutput = options.output === \"llmtap-export.json\" && format === \"csv\"\n ? \"llmtap-export.csv\"\n : options.output;\n const outputPath = path.resolve(defaultOutput);\n fs.writeFileSync(outputPath, output);\n\n console.log(chalk.green(` Exported ${traces.length} traces as ${ext.toUpperCase()} to ${outputPath}`));\n } catch (err: unknown) {\n const error = err as Error;\n console.error(chalk.red(` Export failed: ${error.message}`));\n process.exit(1);\n }\n}\n\nasync function exportOtlp(\n db: ReturnType<typeof getDb>,\n limit: number,\n options: ExportOptions\n): Promise<void> {\n const rows = db\n .prepare(\"SELECT * FROM spans ORDER BY startTime DESC LIMIT ?\")\n .all(limit) as Array<Record<string, unknown>>;\n\n const spans = rows.map(rowToSpan);\n const otlp = spansToOtlp(spans, options.service ?? \"llmtap\");\n\n // If --endpoint is provided, forward to OTLP collector\n if (options.endpoint) {\n console.log(chalk.blue(` Forwarding ${spans.length} spans to ${options.endpoint}...`));\n try {\n const res = await fetch(options.endpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(otlp),\n signal: AbortSignal.timeout(30000),\n });\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n console.error(chalk.red(` OTLP endpoint returned ${res.status}: ${body.slice(0, 200)}`));\n process.exit(1);\n }\n console.log(chalk.green(` Successfully forwarded ${spans.length} spans to OTLP endpoint`));\n } catch (err) {\n console.error(chalk.red(` Failed to reach OTLP endpoint: ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n return;\n }\n\n // Otherwise write to file\n const outputPath = path.resolve(\n options.output === \"llmtap-export.json\" ? \"llmtap-export.otlp.json\" : options.output\n );\n fs.writeFileSync(outputPath, JSON.stringify(otlp, null, 2));\n console.log(chalk.green(` Exported ${spans.length} spans as OTLP JSON to ${outputPath}`));\n console.log(chalk.dim(` Import into Jaeger, Grafana Tempo, Datadog, or any OTLP-compatible backend`));\n}\n","import chalk from \"chalk\";\r\n\r\nexport async function statusCommand(): Promise<void> {\r\n try {\r\n const res = await fetch(\"http://localhost:4781/v1/db-info\", {\r\n signal: AbortSignal.timeout(3000),\r\n });\r\n\r\n if (!res.ok) {\r\n console.error(chalk.red(\" Collector responded with an error.\"));\r\n process.exit(1);\r\n }\r\n\r\n const info = (await res.json()) as {\r\n path: string;\r\n sizeBytes: number;\r\n spanCount: number;\r\n traceCount: number;\r\n oldestSpan: number | null;\r\n newestSpan: number | null;\r\n walMode: string;\r\n };\r\n\r\n const formatBytes = (bytes: number) => {\r\n if (bytes === 0) return \"0 B\";\r\n const units = [\"B\", \"KB\", \"MB\", \"GB\"];\r\n const i = Math.min(Math.floor(Math.log(bytes) / Math.log(1024)), units.length - 1);\r\n return `${(bytes / Math.pow(1024, i)).toFixed(i === 0 ? 0 : 1)} ${units[i]}`;\r\n };\r\n\r\n console.log(\"\");\r\n console.log(chalk.bold.hex(\"#6366f1\")(\" LLMTap\") + chalk.green(\" — Running\"));\r\n console.log(\"\");\r\n console.log(` ${chalk.gray(\"Spans:\")} ${chalk.white(info.spanCount.toLocaleString())}`);\r\n console.log(` ${chalk.gray(\"Traces:\")} ${chalk.white(info.traceCount.toLocaleString())}`);\r\n console.log(` ${chalk.gray(\"DB size:\")} ${chalk.white(formatBytes(info.sizeBytes))}`);\r\n console.log(` ${chalk.gray(\"WAL mode:\")} ${chalk.white(info.walMode.toUpperCase())}`);\r\n console.log(` ${chalk.gray(\"DB path:\")} ${chalk.white(info.path)}`);\r\n\r\n if (info.oldestSpan && info.newestSpan) {\r\n const oldest = new Date(info.oldestSpan).toLocaleString();\r\n const newest = new Date(info.newestSpan).toLocaleString();\r\n console.log(` ${chalk.gray(\"Data range:\")} ${chalk.white(`${oldest} — ${newest}`)}`);\r\n }\r\n console.log(\"\");\r\n } catch {\r\n console.log(\"\");\r\n console.log(chalk.bold.hex(\"#6366f1\")(\" LLMTap\") + chalk.red(\" — Not running\"));\r\n console.log(\"\");\r\n console.log(chalk.gray(\" Start the collector with: \") + chalk.cyan(\"npx llmtap\"));\r\n console.log(\"\");\r\n }\r\n}\r\n","import chalk from \"chalk\";\r\n\r\ninterface TailOptions {\r\n format: string;\r\n}\r\n\r\nexport async function tailCommand(options: TailOptions): Promise<void> {\r\n const format = options.format ?? \"pretty\";\r\n const url = \"http://localhost:4781/v1/stream\";\r\n\r\n console.log(\"\");\r\n console.log(\r\n chalk.bold.hex(\"#6366f1\")(\" LLMTap\") +\r\n chalk.gray(\" — Streaming traces in real-time\")\r\n );\r\n console.log(chalk.gray(\" Press Ctrl+C to stop\"));\r\n console.log(\"\");\r\n\r\n try {\r\n const res = await fetch(url, {\r\n headers: { Accept: \"text/event-stream\" },\r\n });\r\n\r\n if (!res.ok || !res.body) {\r\n console.error(chalk.red(\" Could not connect to collector.\"));\r\n console.error(chalk.gray(\" Make sure the collector is running: npx llmtap\"));\r\n process.exit(1);\r\n }\r\n\r\n const decoder = new TextDecoder();\r\n const reader = res.body.getReader();\r\n let buffer = \"\";\r\n\r\n while (true) {\r\n const { done, value } = await reader.read();\r\n if (done) break;\r\n\r\n buffer += decoder.decode(value, { stream: true });\r\n const lines = buffer.split(\"\\n\");\r\n buffer = lines.pop() ?? \"\";\r\n\r\n for (const line of lines) {\r\n if (!line.startsWith(\"data: \")) continue;\r\n const json = line.slice(6).trim();\r\n if (!json) continue;\r\n\r\n try {\r\n const span = JSON.parse(json) as {\r\n spanId: string;\r\n traceId: string;\r\n name: string;\r\n providerName: string;\r\n requestModel: string;\r\n duration?: number;\r\n totalTokens: number;\r\n totalCost: number;\r\n status: string;\r\n errorMessage?: string;\r\n };\r\n\r\n if (format === \"json\") {\r\n console.log(json);\r\n } else {\r\n const dur = span.duration ? `${span.duration}ms` : \"...\";\r\n const cost =\r\n span.totalCost > 0 ? `$${span.totalCost.toFixed(4)}` : \"$0\";\r\n const statusIcon =\r\n span.status === \"error\" ? chalk.red(\"ERR\") : chalk.green(\"OK \");\r\n\r\n console.log(\r\n ` ${statusIcon} ${chalk.gray(dur.padStart(7))} ${chalk.cyan(span.providerName.padEnd(10))} ${chalk.white(span.requestModel.padEnd(24))} ${chalk.yellow(String(span.totalTokens).padStart(6) + \" tok\")} ${chalk.green(cost.padStart(8))} ${chalk.gray(span.name)}`\r\n );\r\n if (span.errorMessage) {\r\n console.log(\r\n ` ${chalk.red(\"→ \" + span.errorMessage.slice(0, 120))}`\r\n );\r\n }\r\n }\r\n } catch {\r\n // Skip malformed events\r\n }\r\n }\r\n }\r\n } catch {\r\n console.error(chalk.red(\" Could not connect to collector.\"));\r\n console.error(chalk.gray(\" Make sure the collector is running: npx llmtap\"));\r\n process.exit(1);\r\n }\r\n}\r\n","import chalk from \"chalk\";\r\n\r\nexport async function doctorCommand(): Promise<void> {\r\n console.log(\"\");\r\n console.log(chalk.bold.hex(\"#6366f1\")(\" LLMTap Doctor\"));\r\n console.log(chalk.gray(\" Checking your setup...\"));\r\n console.log(\"\");\r\n\r\n const checks: { label: string; status: \"ok\" | \"warn\" | \"fail\"; detail: string }[] = [];\r\n\r\n // Check 1: Node.js version\r\n const nodeVersion = process.version;\r\n const major = parseInt(nodeVersion.slice(1), 10);\r\n if (major >= 18) {\r\n checks.push({ label: \"Node.js version\", status: \"ok\", detail: nodeVersion });\r\n } else {\r\n checks.push({ label: \"Node.js version\", status: \"fail\", detail: `${nodeVersion} (requires >= 18)` });\r\n }\r\n\r\n // Check 2: Collector running\r\n try {\r\n const res = await fetch(\"http://localhost:4781/health\", {\r\n signal: AbortSignal.timeout(3000),\r\n });\r\n if (res.ok) {\r\n checks.push({ label: \"Collector\", status: \"ok\", detail: \"Running on port 4781\" });\r\n } else {\r\n checks.push({ label: \"Collector\", status: \"fail\", detail: `Responded with HTTP ${res.status}` });\r\n }\r\n } catch {\r\n checks.push({ label: \"Collector\", status: \"warn\", detail: \"Not running (start with: npx llmtap)\" });\r\n }\r\n\r\n // Check 3: Database accessible\r\n try {\r\n const res = await fetch(\"http://localhost:4781/v1/db-info\", {\r\n signal: AbortSignal.timeout(3000),\r\n });\r\n if (res.ok) {\r\n const info = (await res.json()) as { sizeBytes: number; spanCount: number; walMode: string };\r\n checks.push({\r\n label: \"Database\",\r\n status: info.walMode === \"wal\" ? \"ok\" : \"warn\",\r\n detail: `${info.spanCount} spans, WAL=${info.walMode.toUpperCase()}`,\r\n });\r\n }\r\n } catch {\r\n checks.push({ label: \"Database\", status: \"warn\", detail: \"Cannot check (collector not running)\" });\r\n }\r\n\r\n // Check 4: SDK installed\r\n try {\r\n await import(\"@llmtap/sdk\");\r\n checks.push({ label: \"@llmtap/sdk\", status: \"ok\", detail: \"Installed\" });\r\n } catch {\r\n checks.push({ label: \"@llmtap/sdk\", status: \"warn\", detail: \"Not found in current project (install with: npm i @llmtap/sdk)\" });\r\n }\r\n\r\n // Check 5: Port available\r\n if (checks.find((c) => c.label === \"Collector\")?.status !== \"ok\") {\r\n try {\r\n // Try connecting to port 4781 to see if something else is using it\r\n const res = await fetch(\"http://localhost:4781\", {\r\n signal: AbortSignal.timeout(1000),\r\n });\r\n if (!res.ok) {\r\n checks.push({ label: \"Port 4781\", status: \"warn\", detail: \"Something is running but not LLMTap\" });\r\n }\r\n } catch {\r\n checks.push({ label: \"Port 4781\", status: \"ok\", detail: \"Available\" });\r\n }\r\n }\r\n\r\n // Display results\r\n for (const check of checks) {\r\n const icon =\r\n check.status === \"ok\"\r\n ? chalk.green(\" ✓\")\r\n : check.status === \"warn\"\r\n ? chalk.yellow(\" !\")\r\n : chalk.red(\" ✗\");\r\n const label = chalk.white(check.label.padEnd(20));\r\n const detail =\r\n check.status === \"ok\"\r\n ? chalk.gray(check.detail)\r\n : check.status === \"warn\"\r\n ? chalk.yellow(check.detail)\r\n : chalk.red(check.detail);\r\n console.log(`${icon} ${label} ${detail}`);\r\n }\r\n\r\n const failCount = checks.filter((c) => c.status === \"fail\").length;\r\n const warnCount = checks.filter((c) => c.status === \"warn\").length;\r\n console.log(\"\");\r\n if (failCount > 0) {\r\n console.log(chalk.red(` ${failCount} issue(s) found. Fix them to use LLMTap.`));\r\n } else if (warnCount > 0) {\r\n console.log(chalk.yellow(` ${warnCount} warning(s). Everything should still work.`));\r\n } else {\r\n console.log(chalk.green(\" All checks passed!\"));\r\n }\r\n console.log(\"\");\r\n}\r\n","import chalk from \"chalk\";\r\n\r\ninterface StatsResponse {\r\n totalTraces: number;\r\n totalSpans: number;\r\n totalTokens: number;\r\n totalCost: number;\r\n avgDuration: number;\r\n errorCount: number;\r\n errorRate: number;\r\n byProvider: { provider: string; spanCount: number; totalTokens: number; totalCost: number; avgDuration: number }[];\r\n byModel: { model: string; provider: string; spanCount: number; totalTokens: number; totalCost: number; avgDuration: number }[];\r\n}\r\n\r\nexport async function statsCommand(options: { period?: string; host?: string }): Promise<void> {\r\n const period = Number(options.period ?? \"24\");\r\n const host = options.host ?? \"http://localhost:4781\";\r\n\r\n try {\r\n const res = await fetch(`${host}/v1/stats?period=${period}`);\r\n if (!res.ok) {\r\n console.error(chalk.red(`Error: Collector returned HTTP ${res.status}`));\r\n console.error(chalk.dim(\"Is the collector running? Try: npx llmtap start\"));\r\n process.exit(1);\r\n }\r\n\r\n const stats = (await res.json()) as StatsResponse;\r\n\r\n console.log(\"\");\r\n console.log(chalk.bold.white(` LLMTap Stats — Last ${period}h`));\r\n console.log(chalk.dim(\" ─────────────────────────────────\"));\r\n console.log(\"\");\r\n\r\n // Summary\r\n const errorPct = (stats.errorRate * 100).toFixed(1);\r\n console.log(` ${chalk.dim(\"Traces\")} ${chalk.bold.white(String(stats.totalTraces))}`);\r\n console.log(` ${chalk.dim(\"Spans\")} ${chalk.bold.white(String(stats.totalSpans))}`);\r\n console.log(` ${chalk.dim(\"Tokens\")} ${chalk.bold.white(stats.totalTokens.toLocaleString())}`);\r\n console.log(` ${chalk.dim(\"Total Cost\")} ${chalk.bold.green(\"$\" + stats.totalCost.toFixed(4))}`);\r\n console.log(` ${chalk.dim(\"Avg Latency\")} ${chalk.white(formatMs(stats.avgDuration))}`);\r\n console.log(\r\n ` ${chalk.dim(\"Error Rate\")} ${\r\n stats.errorRate > 0.05\r\n ? chalk.bold.red(errorPct + \"%\")\r\n : chalk.green(errorPct + \"%\")\r\n } ${chalk.dim(`(${stats.errorCount} errors)`)}`\r\n );\r\n\r\n // Top providers\r\n if (stats.byProvider.length > 0) {\r\n console.log(\"\");\r\n console.log(chalk.bold.white(\" Top Providers\"));\r\n console.log(chalk.dim(\" ─────────────────────────────────\"));\r\n for (const p of stats.byProvider.slice(0, 5)) {\r\n const bar = makeBar(p.totalCost, stats.totalCost, 20);\r\n console.log(\r\n ` ${chalk.cyan(p.provider.padEnd(12))} ${chalk.dim(String(p.spanCount).padStart(5) + \" calls\")} ${chalk.green(\"$\" + p.totalCost.toFixed(4).padStart(8))} ${chalk.dim(bar)}`\r\n );\r\n }\r\n }\r\n\r\n // Top models\r\n if (stats.byModel.length > 0) {\r\n console.log(\"\");\r\n console.log(chalk.bold.white(\" Top Models\"));\r\n console.log(chalk.dim(\" ─────────────────────────────────\"));\r\n for (const m of stats.byModel.slice(0, 8)) {\r\n const bar = makeBar(m.totalCost, stats.totalCost, 20);\r\n console.log(\r\n ` ${chalk.white(m.model.padEnd(28).slice(0, 28))} ${chalk.dim(String(m.spanCount).padStart(5) + \" calls\")} ${chalk.green(\"$\" + m.totalCost.toFixed(4).padStart(8))} ${chalk.dim(bar)}`\r\n );\r\n }\r\n }\r\n\r\n console.log(\"\");\r\n } catch (err) {\r\n if (err instanceof TypeError && (err as NodeJS.ErrnoException).cause) {\r\n console.error(chalk.red(\"Error: Cannot connect to collector\"));\r\n console.error(chalk.dim(\"Is the collector running? Try: npx llmtap start\"));\r\n } else {\r\n console.error(chalk.red(\"Error:\"), err instanceof Error ? err.message : err);\r\n }\r\n process.exit(1);\r\n }\r\n}\r\n\r\nfunction formatMs(ms: number): string {\r\n if (ms < 1000) return `${Math.round(ms)}ms`;\r\n return `${(ms / 1000).toFixed(2)}s`;\r\n}\r\n\r\nfunction makeBar(value: number, total: number, width: number): string {\r\n if (total <= 0) return \"\";\r\n const filled = Math.max(Math.round((value / total) * width), 1);\r\n return \"█\".repeat(filled) + \"░\".repeat(width - filled);\r\n}\r\n"],"mappings":"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","names":["chalk","fs","path","chalk","chalk","chalk","chalk","chalk"]}
package/package.json CHANGED
@@ -1,20 +1,24 @@
1
1
  {
2
2
  "name": "llmtap",
3
- "version": "0.1.1",
3
+ "version": "0.1.4",
4
4
  "description": "DevTools for AI Agents - See every LLM call, trace agent workflows, track costs",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "llmtap": "./dist/index.js"
8
8
  },
9
- "files": [
10
- "dist"
11
- ],
9
+ "files": ["dist"],
10
+ "scripts": {
11
+ "prebuild": "node -e \"\"",
12
+ "build": "tsup",
13
+ "postbuild": "node -e \"const fs=require('fs');const path=require('path');const src=path.resolve(__dirname,'..','dashboard','dist');const dst=path.resolve(__dirname,'dist','dashboard');if(fs.existsSync(src)){fs.cpSync(src,dst,{recursive:true});console.log('Dashboard bundled into CLI dist')}else{console.log('Dashboard dist not found at',src)}\"",
14
+ "clean": "rimraf dist"
15
+ },
12
16
  "dependencies": {
17
+ "@llmtap/collector": "workspace:*",
18
+ "@llmtap/shared": "workspace:*",
13
19
  "chalk": "^5.4.0",
14
20
  "commander": "^13.0.0",
15
- "open": "^10.1.0",
16
- "@llmtap/collector": "0.1.1",
17
- "@llmtap/shared": "0.1.1"
21
+ "open": "^10.1.0"
18
22
  },
19
23
  "devDependencies": {
20
24
  "@types/node": "^25.4.0",
@@ -23,28 +27,16 @@
23
27
  "typescript": "^5.7.0"
24
28
  },
25
29
  "keywords": [
26
- "llm",
27
- "ai",
28
- "agent",
29
- "observability",
30
- "devtools",
31
- "openai",
32
- "anthropic",
33
- "gemini",
34
- "groq",
35
- "tracing",
36
- "debugging"
30
+ "llm", "ai", "agent", "observability", "devtools",
31
+ "openai", "anthropic", "gemini", "groq", "tracing", "debugging"
37
32
  ],
33
+ "engines": {
34
+ "node": ">=18"
35
+ },
38
36
  "license": "MIT",
39
37
  "repository": {
40
38
  "type": "git",
41
39
  "url": "https://github.com/DivyaanshuXD/LLMTap",
42
40
  "directory": "packages/cli"
43
- },
44
- "scripts": {
45
- "prebuild": "node -e \"\"",
46
- "build": "tsup",
47
- "postbuild": "node -e \"const fs=require('fs');const path=require('path');const src=path.resolve(__dirname,'..','dashboard','dist');const dst=path.resolve(__dirname,'dist','dashboard');if(fs.existsSync(src)){fs.cpSync(src,dst,{recursive:true});console.log('Dashboard bundled into CLI dist')}else{console.log('Dashboard dist not found at',src)}\"",
48
- "clean": "rimraf dist"
49
41
  }
50
- }
42
+ }
@@ -1 +0,0 @@
1
- import{n as a,N as i,X as s,Y as t,o as e}from"./generateCategoricalChart-CylgFInn.js";var o=a({chartName:"BarChart",GraphicalChild:i,defaultTooltipEventType:"axis",validateTooltipEventTypes:["axis","item"],axisComponents:[{axisType:"xAxis",AxisComp:s},{axisType:"yAxis",AxisComp:t}],formatAxisMap:e});export{o as B};
@@ -1,4 +0,0 @@
1
- import{c as le,R as f,l as qe,r as be,j as s,m as D,b as it,f as st}from"./index-BBr9_AHg.js";import{u as ot,P as lt,b as I,a as ct,c as ut}from"./format-BiBDo3KS.js";import{C as dt}from"./coins-RIVI5-1a.js";import{Z as ft}from"./zap-Ccrxhk2Q.js";import{e as E,f as j,r as He,q as pt,s as We,t as mt,j as M,v as je,w as S,L as O,x as Ze,y as Ae,z as Ge,D as ht,C as vt,b as Z,k as V,S as xt,A as yt,B as gt,a as Oe,d as bt,i as q,g as jt,u as At,G as kt,E as ne,F as wt,H as Ue,I as Pt,J as re,K as Ne,n as Ot,M as Nt,R as _e,p as _t,X as St,Y as Tt,T as Se,N as Rt}from"./generateCategoricalChart-CylgFInn.js";import{B as Et}from"./BarChart-N8X7TKRf.js";import{O as Lt}from"./orbit-2k6lSwt7.js";import{L as It}from"./layers--K2XRXAx.js";const $t=[["path",{d:"M3 3v16a2 2 0 0 0 2 2h16",key:"c24i48"}],["path",{d:"M18 17V9",key:"2bz60n"}],["path",{d:"M13 17V5",key:"1frdt8"}],["path",{d:"M8 17v-3",key:"17ska0"}]],Te=le("chart-column",$t);const Ct=[["path",{d:"M13 16H8",key:"wsln4y"}],["path",{d:"M14 8H8",key:"1l3xfs"}],["path",{d:"M16 12H8",key:"1fr5h0"}],["path",{d:"M4 3a1 1 0 0 1 1-1 1.3 1.3 0 0 1 .7.2l.933.6a1.3 1.3 0 0 0 1.4 0l.934-.6a1.3 1.3 0 0 1 1.4 0l.933.6a1.3 1.3 0 0 0 1.4 0l.933-.6a1.3 1.3 0 0 1 1.4 0l.934.6a1.3 1.3 0 0 0 1.4 0l.933-.6A1.3 1.3 0 0 1 19 2a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1 1.3 1.3 0 0 1-.7-.2l-.933-.6a1.3 1.3 0 0 0-1.4 0l-.934.6a1.3 1.3 0 0 1-1.4 0l-.933-.6a1.3 1.3 0 0 0-1.4 0l-.933.6a1.3 1.3 0 0 1-1.4 0l-.934-.6a1.3 1.3 0 0 0-1.4 0l-.933.6a1.3 1.3 0 0 1-.7.2 1 1 0 0 1-1-1z",key:"ycz6yz"}]],Dt=le("receipt-text",Ct);const Mt=[["path",{d:"M10 2h4",key:"n1abiw"}],["path",{d:"M12 14v-4",key:"1evpnu"}],["path",{d:"M4 13a8 8 0 0 1 8-7 8 8 0 1 1-5.3 14L4 17.6",key:"1ts96g"}],["path",{d:"M9 17H4v5",key:"8t5av"}]],Bt=le("timer-reset",Mt);const Ft=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M3 9a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2",key:"4125el"}],["path",{d:"M3 11h3c.8 0 1.6.3 2.1.9l1.1.9c1.6 1.6 4.1 1.6 5.7 0l1.1-.9c.5-.5 1.3-.9 2.1-.9H21",key:"1dpki6"}]],Kt=le("wallet-cards",Ft);var zt=["points","className","baseLinePoints","connectNulls"];function H(){return H=Object.assign?Object.assign.bind():function(r){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var t in n)Object.prototype.hasOwnProperty.call(n,t)&&(r[t]=n[t])}return r},H.apply(this,arguments)}function Vt(r,e){if(r==null)return{};var n=qt(r,e),t,a;if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(r);for(a=0;a<o.length;a++)t=o[a],!(e.indexOf(t)>=0)&&Object.prototype.propertyIsEnumerable.call(r,t)&&(n[t]=r[t])}return n}function qt(r,e){if(r==null)return{};var n={};for(var t in r)if(Object.prototype.hasOwnProperty.call(r,t)){if(e.indexOf(t)>=0)continue;n[t]=r[t]}return n}function Re(r){return Gt(r)||Zt(r)||Wt(r)||Ht()}function Ht(){throw new TypeError(`Invalid attempt to spread non-iterable instance.
2
- In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function Wt(r,e){if(r){if(typeof r=="string")return ve(r,e);var n=Object.prototype.toString.call(r).slice(8,-1);if(n==="Object"&&r.constructor&&(n=r.constructor.name),n==="Map"||n==="Set")return Array.from(r);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return ve(r,e)}}function Zt(r){if(typeof Symbol<"u"&&r[Symbol.iterator]!=null||r["@@iterator"]!=null)return Array.from(r)}function Gt(r){if(Array.isArray(r))return ve(r)}function ve(r,e){(e==null||e>r.length)&&(e=r.length);for(var n=0,t=new Array(e);n<e;n++)t[n]=r[n];return t}var Ee=function(e){return e&&e.x===+e.x&&e.y===+e.y},Ut=function(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[],n=[[]];return e.forEach(function(t){Ee(t)?n[n.length-1].push(t):n[n.length-1].length>0&&n.push([])}),Ee(e[0])&&n[n.length-1].push(e[0]),n[n.length-1].length<=0&&(n=n.slice(0,-1)),n},J=function(e,n){var t=Ut(e);n&&(t=[t.reduce(function(o,i){return[].concat(Re(o),Re(i))},[])]);var a=t.map(function(o){return o.reduce(function(i,l,d){return"".concat(i).concat(d===0?"M":"L").concat(l.x,",").concat(l.y)},"")}).join("");return t.length===1?"".concat(a,"Z"):a},Xt=function(e,n,t){var a=J(e,t);return"".concat(a.slice(-1)==="Z"?a.slice(0,-1):a,"L").concat(J(n.reverse(),t).slice(1))},Yt=function(e){var n=e.points,t=e.className,a=e.baseLinePoints,o=e.connectNulls,i=Vt(e,zt);if(!n||!n.length)return null;var l=E("recharts-polygon",t);if(a&&a.length){var d=i.stroke&&i.stroke!=="none",c=Xt(n,a,o);return f.createElement("g",{className:l},f.createElement("path",H({},j(i,!0),{fill:c.slice(-1)==="Z"?i.fill:"none",stroke:"none",d:c})),d?f.createElement("path",H({},j(i,!0),{fill:"none",d:J(n,o)})):null,d?f.createElement("path",H({},j(i,!0),{fill:"none",d:J(a,o)})):null)}var p=J(n,o);return f.createElement("path",H({},j(i,!0),{fill:p.slice(-1)==="Z"?i.fill:"none",className:l,d:p}))},pe,Le;function Jt(){if(Le)return pe;Le=1;var r=He(),e=pt(),n=We();function t(a,o){return a&&a.length?r(a,n(o,2),e):void 0}return pe=t,pe}var Qt=Jt();const er=qe(Qt);var me,Ie;function tr(){if(Ie)return me;Ie=1;var r=He(),e=We(),n=mt();function t(a,o){return a&&a.length?r(a,e(o,2),n):void 0}return me=t,me}var rr=tr();const nr=qe(rr);var ar=["cx","cy","angle","ticks","axisLine"],ir=["ticks","tick","angle","tickFormatter","stroke"];function G(r){"@babel/helpers - typeof";return G=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},G(r)}function Q(){return Q=Object.assign?Object.assign.bind():function(r){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var t in n)Object.prototype.hasOwnProperty.call(n,t)&&(r[t]=n[t])}return r},Q.apply(this,arguments)}function $e(r,e){var n=Object.keys(r);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(r);e&&(t=t.filter(function(a){return Object.getOwnPropertyDescriptor(r,a).enumerable})),n.push.apply(n,t)}return n}function $(r){for(var e=1;e<arguments.length;e++){var n=arguments[e]!=null?arguments[e]:{};e%2?$e(Object(n),!0).forEach(function(t){ce(r,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(n)):$e(Object(n)).forEach(function(t){Object.defineProperty(r,t,Object.getOwnPropertyDescriptor(n,t))})}return r}function Ce(r,e){if(r==null)return{};var n=sr(r,e),t,a;if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(r);for(a=0;a<o.length;a++)t=o[a],!(e.indexOf(t)>=0)&&Object.prototype.propertyIsEnumerable.call(r,t)&&(n[t]=r[t])}return n}function sr(r,e){if(r==null)return{};var n={};for(var t in r)if(Object.prototype.hasOwnProperty.call(r,t)){if(e.indexOf(t)>=0)continue;n[t]=r[t]}return n}function or(r,e){if(!(r instanceof e))throw new TypeError("Cannot call a class as a function")}function De(r,e){for(var n=0;n<e.length;n++){var t=e[n];t.enumerable=t.enumerable||!1,t.configurable=!0,"value"in t&&(t.writable=!0),Object.defineProperty(r,Ye(t.key),t)}}function lr(r,e,n){return e&&De(r.prototype,e),n&&De(r,n),Object.defineProperty(r,"prototype",{writable:!1}),r}function cr(r,e,n){return e=ie(e),ur(r,Xe()?Reflect.construct(e,n||[],ie(r).constructor):e.apply(r,n))}function ur(r,e){if(e&&(G(e)==="object"||typeof e=="function"))return e;if(e!==void 0)throw new TypeError("Derived constructors may only return object or undefined");return dr(r)}function dr(r){if(r===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return r}function Xe(){try{var r=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch{}return(Xe=function(){return!!r})()}function ie(r){return ie=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(n){return n.__proto__||Object.getPrototypeOf(n)},ie(r)}function fr(r,e){if(typeof e!="function"&&e!==null)throw new TypeError("Super expression must either be null or a function");r.prototype=Object.create(e&&e.prototype,{constructor:{value:r,writable:!0,configurable:!0}}),Object.defineProperty(r,"prototype",{writable:!1}),e&&xe(r,e)}function xe(r,e){return xe=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,a){return t.__proto__=a,t},xe(r,e)}function ce(r,e,n){return e=Ye(e),e in r?Object.defineProperty(r,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):r[e]=n,r}function Ye(r){var e=pr(r,"string");return G(e)=="symbol"?e:e+""}function pr(r,e){if(G(r)!="object"||!r)return r;var n=r[Symbol.toPrimitive];if(n!==void 0){var t=n.call(r,e);if(G(t)!="object")return t;throw new TypeError("@@toPrimitive must return a primitive value.")}return(e==="string"?String:Number)(r)}var ue=(function(r){function e(){return or(this,e),cr(this,e,arguments)}return fr(e,r),lr(e,[{key:"getTickValueCoord",value:function(t){var a=t.coordinate,o=this.props,i=o.angle,l=o.cx,d=o.cy;return S(l,d,a,i)}},{key:"getTickTextAnchor",value:function(){var t=this.props.orientation,a;switch(t){case"left":a="end";break;case"right":a="start";break;default:a="middle";break}return a}},{key:"getViewBox",value:function(){var t=this.props,a=t.cx,o=t.cy,i=t.angle,l=t.ticks,d=er(l,function(p){return p.coordinate||0}),c=nr(l,function(p){return p.coordinate||0});return{cx:a,cy:o,startAngle:i,endAngle:i,innerRadius:c.coordinate||0,outerRadius:d.coordinate||0}}},{key:"renderAxisLine",value:function(){var t=this.props,a=t.cx,o=t.cy,i=t.angle,l=t.ticks,d=t.axisLine,c=Ce(t,ar),p=l.reduce(function(m,u){return[Math.min(m[0],u.coordinate),Math.max(m[1],u.coordinate)]},[1/0,-1/0]),h=S(a,o,p[0],i),y=S(a,o,p[1],i),A=$($($({},j(c,!1)),{},{fill:"none"},j(d,!1)),{},{x1:h.x,y1:h.y,x2:y.x,y2:y.y});return f.createElement("line",Q({className:"recharts-polar-radius-axis-line"},A))}},{key:"renderTicks",value:function(){var t=this,a=this.props,o=a.ticks,i=a.tick,l=a.angle,d=a.tickFormatter,c=a.stroke,p=Ce(a,ir),h=this.getTickTextAnchor(),y=j(p,!1),A=j(i,!1),m=o.map(function(u,x){var g=t.getTickValueCoord(u),b=$($($($({textAnchor:h,transform:"rotate(".concat(90-l,", ").concat(g.x,", ").concat(g.y,")")},y),{},{stroke:"none",fill:c},A),{},{index:x},g),{},{payload:u});return f.createElement(O,Q({className:E("recharts-polar-radius-axis-tick",Ze(i)),key:"tick-".concat(u.coordinate)},Ae(t.props,u,x)),e.renderTickItem(i,b,d?d(u.value,x):u.value))});return f.createElement(O,{className:"recharts-polar-radius-axis-ticks"},m)}},{key:"render",value:function(){var t=this.props,a=t.ticks,o=t.axisLine,i=t.tick;return!a||!a.length?null:f.createElement(O,{className:E("recharts-polar-radius-axis",this.props.className)},o&&this.renderAxisLine(),i&&this.renderTicks(),Ge.renderCallByParent(this.props,this.getViewBox()))}}],[{key:"renderTickItem",value:function(t,a,o){var i;return f.isValidElement(t)?i=f.cloneElement(t,a):M(t)?i=t(a):i=f.createElement(je,Q({},a,{className:"recharts-polar-radius-axis-tick-value"}),o),i}}])})(be.PureComponent);ce(ue,"displayName","PolarRadiusAxis");ce(ue,"axisType","radiusAxis");ce(ue,"defaultProps",{type:"number",radiusAxisId:0,cx:0,cy:0,angle:0,orientation:"right",stroke:"#ccc",axisLine:!0,tick:!0,tickCount:5,allowDataOverflow:!1,scale:"auto",allowDuplicatedCategory:!0});function U(r){"@babel/helpers - typeof";return U=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},U(r)}function B(){return B=Object.assign?Object.assign.bind():function(r){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var t in n)Object.prototype.hasOwnProperty.call(n,t)&&(r[t]=n[t])}return r},B.apply(this,arguments)}function Me(r,e){var n=Object.keys(r);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(r);e&&(t=t.filter(function(a){return Object.getOwnPropertyDescriptor(r,a).enumerable})),n.push.apply(n,t)}return n}function C(r){for(var e=1;e<arguments.length;e++){var n=arguments[e]!=null?arguments[e]:{};e%2?Me(Object(n),!0).forEach(function(t){de(r,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(n)):Me(Object(n)).forEach(function(t){Object.defineProperty(r,t,Object.getOwnPropertyDescriptor(n,t))})}return r}function mr(r,e){if(!(r instanceof e))throw new TypeError("Cannot call a class as a function")}function Be(r,e){for(var n=0;n<e.length;n++){var t=e[n];t.enumerable=t.enumerable||!1,t.configurable=!0,"value"in t&&(t.writable=!0),Object.defineProperty(r,Qe(t.key),t)}}function hr(r,e,n){return e&&Be(r.prototype,e),n&&Be(r,n),Object.defineProperty(r,"prototype",{writable:!1}),r}function vr(r,e,n){return e=se(e),xr(r,Je()?Reflect.construct(e,n||[],se(r).constructor):e.apply(r,n))}function xr(r,e){if(e&&(U(e)==="object"||typeof e=="function"))return e;if(e!==void 0)throw new TypeError("Derived constructors may only return object or undefined");return yr(r)}function yr(r){if(r===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return r}function Je(){try{var r=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch{}return(Je=function(){return!!r})()}function se(r){return se=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(n){return n.__proto__||Object.getPrototypeOf(n)},se(r)}function gr(r,e){if(typeof e!="function"&&e!==null)throw new TypeError("Super expression must either be null or a function");r.prototype=Object.create(e&&e.prototype,{constructor:{value:r,writable:!0,configurable:!0}}),Object.defineProperty(r,"prototype",{writable:!1}),e&&ye(r,e)}function ye(r,e){return ye=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,a){return t.__proto__=a,t},ye(r,e)}function de(r,e,n){return e=Qe(e),e in r?Object.defineProperty(r,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):r[e]=n,r}function Qe(r){var e=br(r,"string");return U(e)=="symbol"?e:e+""}function br(r,e){if(U(r)!="object"||!r)return r;var n=r[Symbol.toPrimitive];if(n!==void 0){var t=n.call(r,e);if(U(t)!="object")return t;throw new TypeError("@@toPrimitive must return a primitive value.")}return(e==="string"?String:Number)(r)}var jr=Math.PI/180,Fe=1e-5,fe=(function(r){function e(){return mr(this,e),vr(this,e,arguments)}return gr(e,r),hr(e,[{key:"getTickLineCoord",value:function(t){var a=this.props,o=a.cx,i=a.cy,l=a.radius,d=a.orientation,c=a.tickSize,p=c||8,h=S(o,i,l,t.coordinate),y=S(o,i,l+(d==="inner"?-1:1)*p,t.coordinate);return{x1:h.x,y1:h.y,x2:y.x,y2:y.y}}},{key:"getTickTextAnchor",value:function(t){var a=this.props.orientation,o=Math.cos(-t.coordinate*jr),i;return o>Fe?i=a==="outer"?"start":"end":o<-Fe?i=a==="outer"?"end":"start":i="middle",i}},{key:"renderAxisLine",value:function(){var t=this.props,a=t.cx,o=t.cy,i=t.radius,l=t.axisLine,d=t.axisLineType,c=C(C({},j(this.props,!1)),{},{fill:"none"},j(l,!1));if(d==="circle")return f.createElement(ht,B({className:"recharts-polar-angle-axis-line"},c,{cx:a,cy:o,r:i}));var p=this.props.ticks,h=p.map(function(y){return S(a,o,i,y.coordinate)});return f.createElement(Yt,B({className:"recharts-polar-angle-axis-line"},c,{points:h}))}},{key:"renderTicks",value:function(){var t=this,a=this.props,o=a.ticks,i=a.tick,l=a.tickLine,d=a.tickFormatter,c=a.stroke,p=j(this.props,!1),h=j(i,!1),y=C(C({},p),{},{fill:"none"},j(l,!1)),A=o.map(function(m,u){var x=t.getTickLineCoord(m),g=t.getTickTextAnchor(m),b=C(C(C({textAnchor:g},p),{},{stroke:"none",fill:c},h),{},{index:u,payload:m,x:x.x2,y:x.y2});return f.createElement(O,B({className:E("recharts-polar-angle-axis-tick",Ze(i)),key:"tick-".concat(m.coordinate)},Ae(t.props,m,u)),l&&f.createElement("line",B({className:"recharts-polar-angle-axis-tick-line"},y,x)),i&&e.renderTickItem(i,b,d?d(m.value,u):m.value))});return f.createElement(O,{className:"recharts-polar-angle-axis-ticks"},A)}},{key:"render",value:function(){var t=this.props,a=t.ticks,o=t.radius,i=t.axisLine;return o<=0||!a||!a.length?null:f.createElement(O,{className:E("recharts-polar-angle-axis",this.props.className)},i&&this.renderAxisLine(),this.renderTicks())}}],[{key:"renderTickItem",value:function(t,a,o){var i;return f.isValidElement(t)?i=f.cloneElement(t,a):M(t)?i=t(a):i=f.createElement(je,B({},a,{className:"recharts-polar-angle-axis-tick-value"}),o),i}}])})(be.PureComponent);de(fe,"displayName","PolarAngleAxis");de(fe,"axisType","angleAxis");de(fe,"defaultProps",{type:"category",angleAxisId:0,scale:"auto",cx:0,cy:0,orientation:"outer",axisLine:!0,tickLine:!0,tickSize:8,tick:!0,hide:!1,allowDuplicatedCategory:!0});var ae;function X(r){"@babel/helpers - typeof";return X=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},X(r)}function W(){return W=Object.assign?Object.assign.bind():function(r){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var t in n)Object.prototype.hasOwnProperty.call(n,t)&&(r[t]=n[t])}return r},W.apply(this,arguments)}function Ke(r,e){var n=Object.keys(r);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(r);e&&(t=t.filter(function(a){return Object.getOwnPropertyDescriptor(r,a).enumerable})),n.push.apply(n,t)}return n}function v(r){for(var e=1;e<arguments.length;e++){var n=arguments[e]!=null?arguments[e]:{};e%2?Ke(Object(n),!0).forEach(function(t){w(r,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(n)):Ke(Object(n)).forEach(function(t){Object.defineProperty(r,t,Object.getOwnPropertyDescriptor(n,t))})}return r}function Ar(r,e){if(!(r instanceof e))throw new TypeError("Cannot call a class as a function")}function ze(r,e){for(var n=0;n<e.length;n++){var t=e[n];t.enumerable=t.enumerable||!1,t.configurable=!0,"value"in t&&(t.writable=!0),Object.defineProperty(r,tt(t.key),t)}}function kr(r,e,n){return e&&ze(r.prototype,e),n&&ze(r,n),Object.defineProperty(r,"prototype",{writable:!1}),r}function wr(r,e,n){return e=oe(e),Pr(r,et()?Reflect.construct(e,n||[],oe(r).constructor):e.apply(r,n))}function Pr(r,e){if(e&&(X(e)==="object"||typeof e=="function"))return e;if(e!==void 0)throw new TypeError("Derived constructors may only return object or undefined");return Or(r)}function Or(r){if(r===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return r}function et(){try{var r=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch{}return(et=function(){return!!r})()}function oe(r){return oe=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(n){return n.__proto__||Object.getPrototypeOf(n)},oe(r)}function Nr(r,e){if(typeof e!="function"&&e!==null)throw new TypeError("Super expression must either be null or a function");r.prototype=Object.create(e&&e.prototype,{constructor:{value:r,writable:!0,configurable:!0}}),Object.defineProperty(r,"prototype",{writable:!1}),e&&ge(r,e)}function ge(r,e){return ge=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,a){return t.__proto__=a,t},ge(r,e)}function w(r,e,n){return e=tt(e),e in r?Object.defineProperty(r,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):r[e]=n,r}function tt(r){var e=_r(r,"string");return X(e)=="symbol"?e:e+""}function _r(r,e){if(X(r)!="object"||!r)return r;var n=r[Symbol.toPrimitive];if(n!==void 0){var t=n.call(r,e);if(X(t)!="object")return t;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(r)}var T=(function(r){function e(n){var t;return Ar(this,e),t=wr(this,e,[n]),w(t,"pieRef",null),w(t,"sectorRefs",[]),w(t,"id",At("recharts-pie-")),w(t,"handleAnimationEnd",function(){var a=t.props.onAnimationEnd;t.setState({isAnimationFinished:!0}),M(a)&&a()}),w(t,"handleAnimationStart",function(){var a=t.props.onAnimationStart;t.setState({isAnimationFinished:!1}),M(a)&&a()}),t.state={isAnimationFinished:!n.isAnimationActive,prevIsAnimationActive:n.isAnimationActive,prevAnimationId:n.animationId,sectorToFocus:0},t}return Nr(e,r),kr(e,[{key:"isActiveIndex",value:function(t){var a=this.props.activeIndex;return Array.isArray(a)?a.indexOf(t)!==-1:t===a}},{key:"hasActiveIndex",value:function(){var t=this.props.activeIndex;return Array.isArray(t)?t.length!==0:t||t===0}},{key:"renderLabels",value:function(t){var a=this.props.isAnimationActive;if(a&&!this.state.isAnimationFinished)return null;var o=this.props,i=o.label,l=o.labelLine,d=o.dataKey,c=o.valueKey,p=j(this.props,!1),h=j(i,!1),y=j(l,!1),A=i&&i.offsetRadius||20,m=t.map(function(u,x){var g=(u.startAngle+u.endAngle)/2,b=S(u.cx,u.cy,u.outerRadius+A,g),P=v(v(v(v({},p),u),{},{stroke:"none"},h),{},{index:x,textAnchor:e.getTextAnchor(b.x,u.cx)},b),F=v(v(v(v({},p),u),{},{fill:"none",stroke:u.fill},y),{},{index:x,points:[S(u.cx,u.cy,u.outerRadius,g),b]}),N=d;return Z(d)&&Z(c)?N="value":Z(d)&&(N=c),f.createElement(O,{key:"label-".concat(u.startAngle,"-").concat(u.endAngle,"-").concat(u.midAngle,"-").concat(x)},l&&e.renderLabelLineItem(l,F,"line"),e.renderLabelItem(i,P,V(u,N)))});return f.createElement(O,{className:"recharts-pie-labels"},m)}},{key:"renderSectorsStatically",value:function(t){var a=this,o=this.props,i=o.activeShape,l=o.blendStroke,d=o.inactiveShape;return t.map(function(c,p){if(c?.startAngle===0&&c?.endAngle===0&&t.length!==1)return null;var h=a.isActiveIndex(p),y=d&&a.hasActiveIndex()?d:null,A=h?i:y,m=v(v({},c),{},{stroke:l?c.fill:c.stroke,tabIndex:-1});return f.createElement(O,W({ref:function(x){x&&!a.sectorRefs.includes(x)&&a.sectorRefs.push(x)},tabIndex:-1,className:"recharts-pie-sector"},Ae(a.props,c,p),{key:"sector-".concat(c?.startAngle,"-").concat(c?.endAngle,"-").concat(c.midAngle,"-").concat(p)}),f.createElement(xt,W({option:A,isActive:h,shapeType:"sector"},m)))})}},{key:"renderSectorsWithAnimation",value:function(){var t=this,a=this.props,o=a.sectors,i=a.isAnimationActive,l=a.animationBegin,d=a.animationDuration,c=a.animationEasing,p=a.animationId,h=this.state,y=h.prevSectors,A=h.prevIsAnimationActive;return f.createElement(yt,{begin:l,duration:d,isActive:i,easing:c,from:{t:0},to:{t:1},key:"pie-".concat(p,"-").concat(A),onAnimationStart:this.handleAnimationStart,onAnimationEnd:this.handleAnimationEnd},function(m){var u=m.t,x=[],g=o&&o[0],b=g.startAngle;return o.forEach(function(P,F){var N=y&&y[F],L=F>0?gt(P,"paddingAngle",0):0;if(N){var Y=Oe(N.endAngle-N.startAngle,P.endAngle-P.startAngle),k=v(v({},P),{},{startAngle:b+L,endAngle:b+Y(u)+L});x.push(k),b=k.endAngle}else{var K=P.endAngle,_=P.startAngle,ee=Oe(0,K-_),te=ee(u),R=v(v({},P),{},{startAngle:b+L,endAngle:b+te+L});x.push(R),b=R.endAngle}}),f.createElement(O,null,t.renderSectorsStatically(x))})}},{key:"attachKeyboardHandlers",value:function(t){var a=this;t.onkeydown=function(o){if(!o.altKey)switch(o.key){case"ArrowLeft":{var i=++a.state.sectorToFocus%a.sectorRefs.length;a.sectorRefs[i].focus(),a.setState({sectorToFocus:i});break}case"ArrowRight":{var l=--a.state.sectorToFocus<0?a.sectorRefs.length-1:a.state.sectorToFocus%a.sectorRefs.length;a.sectorRefs[l].focus(),a.setState({sectorToFocus:l});break}case"Escape":{a.sectorRefs[a.state.sectorToFocus].blur(),a.setState({sectorToFocus:0});break}}}}},{key:"renderSectors",value:function(){var t=this.props,a=t.sectors,o=t.isAnimationActive,i=this.state.prevSectors;return o&&a&&a.length&&(!i||!bt(i,a))?this.renderSectorsWithAnimation():this.renderSectorsStatically(a)}},{key:"componentDidMount",value:function(){this.pieRef&&this.attachKeyboardHandlers(this.pieRef)}},{key:"render",value:function(){var t=this,a=this.props,o=a.hide,i=a.sectors,l=a.className,d=a.label,c=a.cx,p=a.cy,h=a.innerRadius,y=a.outerRadius,A=a.isAnimationActive,m=this.state.isAnimationFinished;if(o||!i||!i.length||!q(c)||!q(p)||!q(h)||!q(y))return null;var u=E("recharts-pie",l);return f.createElement(O,{tabIndex:this.props.rootTabIndex,className:u,ref:function(g){t.pieRef=g}},this.renderSectors(),d&&this.renderLabels(i),Ge.renderCallByParent(this.props,null,!1),(!A||m)&&jt.renderCallByParent(this.props,i,!1))}}],[{key:"getDerivedStateFromProps",value:function(t,a){return a.prevIsAnimationActive!==t.isAnimationActive?{prevIsAnimationActive:t.isAnimationActive,prevAnimationId:t.animationId,curSectors:t.sectors,prevSectors:[],isAnimationFinished:!0}:t.isAnimationActive&&t.animationId!==a.prevAnimationId?{prevAnimationId:t.animationId,curSectors:t.sectors,prevSectors:a.curSectors,isAnimationFinished:!0}:t.sectors!==a.curSectors?{curSectors:t.sectors,isAnimationFinished:!0}:null}},{key:"getTextAnchor",value:function(t,a){return t>a?"start":t<a?"end":"middle"}},{key:"renderLabelLineItem",value:function(t,a,o){if(f.isValidElement(t))return f.cloneElement(t,a);if(M(t))return t(a);var i=E("recharts-pie-label-line",typeof t!="boolean"?t.className:"");return f.createElement(vt,W({},a,{key:o,type:"linear",className:i}))}},{key:"renderLabelItem",value:function(t,a,o){if(f.isValidElement(t))return f.cloneElement(t,a);var i=o;if(M(t)&&(i=t(a),f.isValidElement(i)))return i;var l=E("recharts-pie-label-text",typeof t!="boolean"&&!M(t)?t.className:"");return f.createElement(je,W({},a,{alignmentBaseline:"middle",className:l}),i)}}])})(be.PureComponent);ae=T;w(T,"displayName","Pie");w(T,"defaultProps",{stroke:"#fff",fill:"#808080",legendType:"rect",cx:"50%",cy:"50%",startAngle:0,endAngle:360,innerRadius:0,outerRadius:"80%",paddingAngle:0,labelLine:!0,hide:!1,minAngle:0,isAnimationActive:!kt.isSsr,animationBegin:400,animationDuration:1500,animationEasing:"ease",nameKey:"name",blendStroke:!1,rootTabIndex:0});w(T,"parseDeltaAngle",function(r,e){var n=ne(e-r),t=Math.min(Math.abs(e-r),360);return n*t});w(T,"getRealPieData",function(r){var e=r.data,n=r.children,t=j(r,!1),a=wt(n,Ue);return e&&e.length?e.map(function(o,i){return v(v(v({payload:o},t),o),a&&a[i]&&a[i].props)}):a&&a.length?a.map(function(o){return v(v({},t),o.props)}):[]});w(T,"parseCoordinateOfPie",function(r,e){var n=e.top,t=e.left,a=e.width,o=e.height,i=Pt(a,o),l=t+re(r.cx,a,a/2),d=n+re(r.cy,o,o/2),c=re(r.innerRadius,i,0),p=re(r.outerRadius,i,i*.8),h=r.maxRadius||Math.sqrt(a*a+o*o)/2;return{cx:l,cy:d,innerRadius:c,outerRadius:p,maxRadius:h}});w(T,"getComposedData",function(r){var e=r.item,n=r.offset,t=e.type.defaultProps!==void 0?v(v({},e.type.defaultProps),e.props):e.props,a=ae.getRealPieData(t);if(!a||!a.length)return null;var o=t.cornerRadius,i=t.startAngle,l=t.endAngle,d=t.paddingAngle,c=t.dataKey,p=t.nameKey,h=t.valueKey,y=t.tooltipType,A=Math.abs(t.minAngle),m=ae.parseCoordinateOfPie(t,n),u=ae.parseDeltaAngle(i,l),x=Math.abs(u),g=c;Z(c)&&Z(h)?(Ne(!1,`Use "dataKey" to specify the value of pie,
3
- the props "valueKey" will be deprecated in 1.1.0`),g="value"):Z(c)&&(Ne(!1,`Use "dataKey" to specify the value of pie,
4
- the props "valueKey" will be deprecated in 1.1.0`),g=h);var b=a.filter(function(k){return V(k,g,0)!==0}).length,P=(x>=360?b:b-1)*d,F=x-b*A-P,N=a.reduce(function(k,K){var _=V(K,g,0);return k+(q(_)?_:0)},0),L;if(N>0){var Y;L=a.map(function(k,K){var _=V(k,g,0),ee=V(k,p,K),te=(q(_)?_:0)/N,R;K?R=Y.endAngle+ne(u)*d*(_!==0?1:0):R=i;var ke=R+ne(u)*((_!==0?A:0)+te*F),we=(R+ke)/2,Pe=(m.innerRadius+m.outerRadius)/2,nt=[{name:ee,value:_,payload:k,dataKey:g,type:y}],at=S(m.cx,m.cy,Pe,we);return Y=v(v(v({percent:te,cornerRadius:o,name:ee,tooltipPayload:nt,midAngle:we,middleRadius:Pe,tooltipPosition:at},k),m),{},{value:V(k,g),startAngle:R,endAngle:ke,payload:k,paddingAngle:ne(u)*d}),Y})}return v(v({},m),{},{sectors:L,data:a})});var Sr=Ot({chartName:"PieChart",GraphicalChild:T,validateTooltipEventTypes:["item"],defaultTooltipEventType:"item",legendContent:"children",axisComponents:[{axisType:"angleAxis",AxisComp:fe},{axisType:"radiusAxis",AxisComp:ue}],formatAxisMap:Nt,defaultProps:{layout:"centric",startAngle:0,endAngle:360,cx:"50%",cy:"50%",innerRadius:0,outerRadius:"80%"}});const z=["#34d399","#38bdf8","#818cf8","#f59e0b","#f97316","#f472b6"],rt={container:{transition:{staggerChildren:.08}},item:{hidden:{opacity:0,y:20,scale:.97},show:{opacity:1,y:0,scale:1,transition:{duration:.4,ease:[.22,1,.36,1]}}}},Ve={backgroundColor:"rgba(8, 15, 28, 0.96)",border:"1px solid rgba(148, 163, 184, 0.14)",borderRadius:"18px",fontSize:12,boxShadow:"0 20px 60px rgba(0,0,0,0.45)",backdropFilter:"blur(12px)"};function he({label:r,value:e,sub:n,icon:t,gradient:a}){return s.jsxs(D.div,{variants:rt.item,className:"metric-card",children:[s.jsx("div",{className:`metric-orb ${a}`,children:t}),s.jsxs("div",{children:[s.jsx("div",{className:"hud-label",children:r}),s.jsx("div",{className:"mt-1 text-3xl font-semibold tracking-[-0.04em] text-white",children:e}),n&&s.jsx("div",{className:"mt-2 text-sm text-slate-400",children:n})]})]})}function Mr(){const{data:r,isLoading:e}=ot({queryKey:["stats"],queryFn:()=>st(24)}),n=r?.byModel??[],t=r?.byProvider??[],a=n.map(i=>({name:i.model.length>22?`${i.model.slice(0,20)}...`:i.model,cost:Number(i.totalCost.toFixed(6)),tokens:i.totalTokens,calls:i.spanCount})),o=t.map(i=>({name:i.provider,value:Number(i.totalCost.toFixed(6))}));return e?s.jsxs("div",{className:"mx-auto max-w-[1500px] space-y-8",children:[s.jsx("div",{className:"skeleton-panel h-44 rounded-[28px]"}),s.jsx("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-3",children:[...Array(3)].map((i,l)=>s.jsxs("div",{className:"metric-card",children:[s.jsx("div",{className:"skeleton-panel h-12 w-12 rounded-2xl"}),s.jsxs("div",{className:"space-y-2",children:[s.jsx("div",{className:"skeleton-panel h-3 w-20 rounded-full"}),s.jsx("div",{className:"skeleton-panel h-8 w-28 rounded-full"})]})]},l))})]}):s.jsxs(lt,{eyebrow:"Economic Layer",title:"Understand where every token is converting into spend.",description:"The economics view is now built like a cost cockpit. It surfaces burn concentration, provider mix, and the models that are consuming budget fastest.",aside:s.jsxs("div",{className:"insight-panel",children:[s.jsx(it,{}),s.jsxs("div",{className:"mt-4 space-y-3",children:[s.jsxs("div",{className:"rounded-2xl border border-white/8 bg-white/4 p-4",children:[s.jsx("div",{className:"hud-label",children:"Highest model spend"}),s.jsx("div",{className:"mt-2 text-base font-medium text-white",children:n[0]?.model??"Awaiting traffic"}),s.jsx("div",{className:"mt-1 text-sm text-slate-400",children:n[0]?`${I(n[0].totalCost)} across ${n[0].spanCount} calls`:"No model cost data yet"})]}),s.jsxs("div",{className:"rounded-2xl border border-white/8 bg-white/4 p-4",children:[s.jsx("div",{className:"hud-label",children:"Provider spread"}),s.jsxs("div",{className:"mt-2 text-base font-medium text-white",children:[t.length," active providers"]}),s.jsx("div",{className:"mt-1 text-sm text-slate-400",children:"Cost dominance becomes obvious here before it becomes expensive."})]})]})]}),children:[s.jsxs(D.div,{className:"grid grid-cols-1 gap-4 md:grid-cols-3",variants:rt.container,initial:"hidden",animate:"show",children:[s.jsx(he,{icon:s.jsx(dt,{className:"h-5 w-5"}),label:"Total Cost",value:I(r?.totalCost??0),sub:"Accumulated over the last 24 hours",gradient:"bg-[linear-gradient(135deg,rgba(250,204,21,0.18),rgba(249,115,22,0.18))] text-amber-200"}),s.jsx(he,{icon:s.jsx(ft,{className:"h-5 w-5"}),label:"Token Volume",value:ct(r?.totalTokens??0),sub:`${r?.totalSpans??0} model calls observed`,gradient:"bg-[linear-gradient(135deg,rgba(56,189,248,0.18),rgba(168,85,247,0.18))] text-sky-200"}),s.jsx(he,{icon:s.jsx(Kt,{className:"h-5 w-5"}),label:"Models in Rotation",value:String(n.length),sub:`${t.length} providers contributing to spend`,gradient:"bg-[linear-gradient(135deg,rgba(52,211,153,0.18),rgba(14,165,233,0.18))] text-emerald-200"})]}),s.jsxs("div",{className:"grid gap-5 xl:grid-cols-[minmax(0,1.1fr)_minmax(360px,0.9fr)]",children:[s.jsxs(D.div,{className:"dashboard-shell rounded-[26px] px-5 py-5",initial:{opacity:0,y:16},animate:{opacity:1,y:0},transition:{delay:.15,duration:.35},children:[s.jsxs("div",{className:"mb-5 flex items-center justify-between",children:[s.jsxs("div",{children:[s.jsx("div",{className:"hud-label",children:"Model ranking"}),s.jsx("h2",{className:"mt-1 text-xl font-semibold tracking-[-0.04em] text-white",children:"Cost by model"})]}),s.jsxs("span",{className:"status-chip",children:[s.jsx(Dt,{className:"h-3.5 w-3.5 text-sky-300"}),s.jsx("span",{children:"Spend concentration"})]})]}),a.length>0?s.jsx("div",{className:"relative min-h-[320px]",children:s.jsx(_e,{width:"100%",height:Math.max(320,a.length*58),children:s.jsxs(Et,{data:a,layout:"vertical",children:[s.jsx(_t,{stroke:"rgba(148,163,184,0.08)",horizontal:!1}),s.jsx(St,{type:"number",tick:{fontSize:11,fill:"#94a3b8"},axisLine:!1,tickLine:!1,tickFormatter:i=>I(i)}),s.jsx(Tt,{type:"category",dataKey:"name",tick:{fontSize:11,fill:"#cbd5e1"},axisLine:!1,tickLine:!1,width:160}),s.jsx(Se,{contentStyle:Ve,formatter:i=>[I(i),"Cost"]}),s.jsx(Rt,{dataKey:"cost",fill:"#34d399",radius:[0,10,10,0]})]})})}):s.jsxs("div",{className:"empty-state h-[320px]",children:[s.jsx(Te,{className:"h-8 w-8 text-slate-500"}),s.jsx("div",{className:"text-base font-medium text-white",children:"No cost data yet"}),s.jsx("div",{className:"text-center text-sm text-slate-400",children:"Model spend will stack up here as soon as traffic hits the collector."})]})]}),s.jsxs(D.div,{className:"dashboard-shell rounded-[26px] px-5 py-5",initial:{opacity:0,y:16},animate:{opacity:1,y:0},transition:{delay:.2,duration:.35},children:[s.jsxs("div",{className:"mb-5 flex items-center justify-between",children:[s.jsxs("div",{children:[s.jsx("div",{className:"hud-label",children:"Provider mix"}),s.jsx("h2",{className:"mt-1 text-xl font-semibold tracking-[-0.04em] text-white",children:"Who is taking the budget"})]}),s.jsx(Lt,{className:"h-4 w-4 text-sky-300"})]}),o.length>0?s.jsxs("div",{className:"flex flex-col gap-6 lg:flex-row lg:items-center",children:[s.jsx(_e,{width:"100%",height:260,className:"lg:max-w-[260px]",children:s.jsxs(Sr,{children:[s.jsx(T,{data:o,cx:"50%",cy:"50%",innerRadius:62,outerRadius:96,paddingAngle:3,dataKey:"value",strokeWidth:0,children:o.map((i,l)=>s.jsx(Ue,{fill:z[l%z.length]},`cell-${l}`))}),s.jsx(Se,{contentStyle:Ve,formatter:i=>[I(i),"Cost"]})]})}),s.jsx("div",{className:"flex-1 space-y-3",children:o.map((i,l)=>s.jsx("div",{className:"rounded-2xl border border-white/6 bg-white/4 p-3.5",children:s.jsxs("div",{className:"flex items-center gap-3",children:[s.jsx("span",{className:"h-3 w-3 shrink-0 rounded-sm",style:{backgroundColor:z[l%z.length],boxShadow:`0 0 10px ${z[l%z.length]}50`}}),s.jsx("span",{className:"flex-1 text-sm font-medium capitalize text-white",children:i.name}),s.jsx("span",{className:"font-mono text-xs text-slate-400",children:I(i.value)})]})},i.name))})]}):s.jsxs("div",{className:"empty-state h-[260px]",children:[s.jsx(It,{className:"h-8 w-8 text-slate-500"}),s.jsx("div",{className:"text-base font-medium text-white",children:"No providers yet"}),s.jsx("div",{className:"text-center text-sm text-slate-400",children:"Provider allocation appears here as soon as at least one model call is captured."})]})]})]}),n.length>0?s.jsxs(D.div,{className:"dashboard-shell overflow-hidden rounded-[26px] px-4 py-4 sm:px-5",initial:{opacity:0,y:16},animate:{opacity:1,y:0},transition:{delay:.25,duration:.35},children:[s.jsxs("div",{className:"mb-3 flex items-center justify-between gap-3 px-1",children:[s.jsxs("div",{children:[s.jsx("div",{className:"hud-label",children:"Detailed ledger"}),s.jsx("h2",{className:"mt-1 text-xl font-semibold tracking-[-0.04em] text-white",children:"Breakdown by model"})]}),s.jsxs("span",{className:"status-chip",children:[s.jsx(Bt,{className:"h-3.5 w-3.5 text-sky-300"}),s.jsxs("span",{children:[n.length," models"]})]})]}),s.jsx("div",{className:"overflow-x-auto",children:s.jsxs("table",{className:"w-full border-separate border-spacing-y-2 text-sm",children:[s.jsx("thead",{children:s.jsxs("tr",{className:"text-left text-[11px] uppercase tracking-[0.18em] text-slate-500",children:[s.jsx("th",{className:"px-4 py-2",children:"Model"}),s.jsx("th",{className:"px-4 py-2",children:"Provider"}),s.jsx("th",{className:"px-4 py-2 text-right",children:"Calls"}),s.jsx("th",{className:"px-4 py-2 text-right",children:"Tokens"}),s.jsx("th",{className:"px-4 py-2 text-right",children:"Cost"}),s.jsx("th",{className:"px-4 py-2 text-right",children:"Avg Duration"})]})}),s.jsx("tbody",{children:n.map((i,l)=>{const d={openai:"bg-emerald-400",anthropic:"bg-amber-300",google:"bg-sky-400"};return s.jsxs(D.tr,{className:"rounded-2xl border border-white/6 bg-white/4",initial:{opacity:0,x:-8},animate:{opacity:1,x:0},transition:{delay:.03*l,duration:.3},children:[s.jsx("td",{className:"rounded-l-2xl px-4 py-4 font-mono text-xs font-semibold text-slate-100",children:i.model}),s.jsx("td",{className:"px-4 py-4",children:s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("span",{className:`h-2.5 w-2.5 rounded-full ${d[i.provider]??"bg-purple-400"}`,style:{boxShadow:"0 0 10px currentColor"}}),s.jsx("span",{className:"text-xs font-medium capitalize text-slate-200",children:i.provider})]})}),s.jsx("td",{className:"px-4 py-4 text-right",children:s.jsx("span",{className:"inline-flex items-center justify-center rounded-md border border-white/8 bg-slate-950/70 px-2 py-0.5 font-mono text-xs text-slate-400",children:i.spanCount})}),s.jsx("td",{className:"px-4 py-4 text-right font-mono text-xs text-slate-300",children:i.totalTokens.toLocaleString()}),s.jsx("td",{className:"px-4 py-4 text-right font-mono text-xs font-semibold text-white",children:I(i.totalCost)}),s.jsx("td",{className:"rounded-r-2xl px-4 py-4 text-right font-mono text-xs text-slate-500",children:i.avgDuration?ut(i.avgDuration):"-"})]},`${i.provider}-${i.model}`)})})]})})]}):s.jsx(D.div,{className:"dashboard-shell rounded-[26px] p-16",initial:{opacity:0},animate:{opacity:1},children:s.jsxs("div",{className:"empty-state",children:[s.jsx(Te,{className:"h-8 w-8 text-slate-500"}),s.jsx("div",{className:"text-base font-medium text-white",children:"No cost data yet"}),s.jsx("div",{className:"max-w-sm text-center text-sm text-slate-400",children:"Start making traced model calls and the economic layer will fill in automatically."})]})})]})}export{Mr as default};
@@ -1,9 +0,0 @@
1
- import{c as le,R as v,r as V,u as _e,j as e,a as De,C as Le,m as Te,X as Ee,L as Re,T as ce,S as Ie,b as Me,f as $e,d as ze,e as Fe}from"./index-BBr9_AHg.js";import{u as ae,f as qe,P as Be,a as se,b as q,c as de,d as me}from"./format-BiBDo3KS.js";import{G as He}from"./gauge-BBNKtqFH.js";import{f as B,L as X,m as Q,i as W,C as re,A as Ve,a as H,b as he,c as We,d as ue,e as Ne,h as Ke,g as Ge,u as Xe,j as ie,G as Ue,k as xe,l as pe,D as Ye,n as Qe,X as Ae,Y as ke,o as Ze,R as Je,p as et,T as tt}from"./generateCategoricalChart-CylgFInn.js";import{S as at,A as fe,C as st,a as rt,b as be}from"./search-BwbP84dP.js";import{C as it,A as nt}from"./chevron-down-B0xosrpl.js";import{O as lt}from"./orbit-2k6lSwt7.js";const ot=[["path",{d:"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5",key:"1gvzjb"}],["path",{d:"M9 18h6",key:"x1upvd"}],["path",{d:"M10 22h4",key:"ceow96"}]],ct=le("lightbulb",ot);const dt=[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"M12 8v4",key:"1got3b"}],["path",{d:"M12 16h.01",key:"1drbdi"}]],ve=le("shield-alert",dt);const mt=[["path",{d:"M16 7h6v6",key:"box55l"}],["path",{d:"m22 7-8.5 8.5-5-5L2 17",key:"1t1m79"}]],Z=le("trending-up",mt);var ht=["layout","type","stroke","connectNulls","isRange","ref"],ut=["key"],Se;function K(t){"@babel/helpers - typeof";return K=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(a){return typeof a}:function(a){return a&&typeof Symbol=="function"&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},K(t)}function Pe(t,a){if(t==null)return{};var i=xt(t,a),s,n;if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);for(n=0;n<o.length;n++)s=o[n],!(a.indexOf(s)>=0)&&Object.prototype.propertyIsEnumerable.call(t,s)&&(i[s]=t[s])}return i}function xt(t,a){if(t==null)return{};var i={};for(var s in t)if(Object.prototype.hasOwnProperty.call(t,s)){if(a.indexOf(s)>=0)continue;i[s]=t[s]}return i}function F(){return F=Object.assign?Object.assign.bind():function(t){for(var a=1;a<arguments.length;a++){var i=arguments[a];for(var s in i)Object.prototype.hasOwnProperty.call(i,s)&&(t[s]=i[s])}return t},F.apply(this,arguments)}function ge(t,a){var i=Object.keys(t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(t);a&&(s=s.filter(function(n){return Object.getOwnPropertyDescriptor(t,n).enumerable})),i.push.apply(i,s)}return i}function R(t){for(var a=1;a<arguments.length;a++){var i=arguments[a]!=null?arguments[a]:{};a%2?ge(Object(i),!0).forEach(function(s){D(t,s,i[s])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(i)):ge(Object(i)).forEach(function(s){Object.defineProperty(t,s,Object.getOwnPropertyDescriptor(i,s))})}return t}function pt(t,a){if(!(t instanceof a))throw new TypeError("Cannot call a class as a function")}function ye(t,a){for(var i=0;i<a.length;i++){var s=a[i];s.enumerable=s.enumerable||!1,s.configurable=!0,"value"in s&&(s.writable=!0),Object.defineProperty(t,Ce(s.key),s)}}function ft(t,a,i){return a&&ye(t.prototype,a),i&&ye(t,i),Object.defineProperty(t,"prototype",{writable:!1}),t}function bt(t,a,i){return a=ee(a),vt(t,Oe()?Reflect.construct(a,i||[],ee(t).constructor):a.apply(t,i))}function vt(t,a){if(a&&(K(a)==="object"||typeof a=="function"))return a;if(a!==void 0)throw new TypeError("Derived constructors may only return object or undefined");return gt(t)}function gt(t){if(t===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}function Oe(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch{}return(Oe=function(){return!!t})()}function ee(t){return ee=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(i){return i.__proto__||Object.getPrototypeOf(i)},ee(t)}function yt(t,a){if(typeof a!="function"&&a!==null)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(a&&a.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),a&&ne(t,a)}function ne(t,a){return ne=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(s,n){return s.__proto__=n,s},ne(t,a)}function D(t,a,i){return a=Ce(a),a in t?Object.defineProperty(t,a,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[a]=i,t}function Ce(t){var a=jt(t,"string");return K(a)=="symbol"?a:a+""}function jt(t,a){if(K(t)!="object"||!t)return t;var i=t[Symbol.toPrimitive];if(i!==void 0){var s=i.call(t,a);if(K(s)!="object")return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}var I=(function(t){function a(){var i;pt(this,a);for(var s=arguments.length,n=new Array(s),o=0;o<s;o++)n[o]=arguments[o];return i=bt(this,a,[].concat(n)),D(i,"state",{isAnimationFinished:!0}),D(i,"id",Xe("recharts-area-")),D(i,"handleAnimationEnd",function(){var l=i.props.onAnimationEnd;i.setState({isAnimationFinished:!0}),ie(l)&&l()}),D(i,"handleAnimationStart",function(){var l=i.props.onAnimationStart;i.setState({isAnimationFinished:!1}),ie(l)&&l()}),i}return yt(a,t),ft(a,[{key:"renderDots",value:function(s,n,o){var l=this.props.isAnimationActive,c=this.state.isAnimationFinished;if(l&&!c)return null;var m=this.props,d=m.dot,u=m.points,h=m.dataKey,p=B(this.props,!1),x=B(d,!0),w=u.map(function(y,P){var g=R(R(R({key:"dot-".concat(P),r:3},p),x),{},{index:P,cx:y.x,cy:y.y,dataKey:h,value:y.value,payload:y.payload,points:u});return a.renderDotItem(d,g)}),k={clipPath:s?"url(#clipPath-".concat(n?"":"dots-").concat(o,")"):null};return v.createElement(X,F({className:"recharts-area-dots"},k),w)}},{key:"renderHorizontalRect",value:function(s){var n=this.props,o=n.baseLine,l=n.points,c=n.strokeWidth,m=l[0].x,d=l[l.length-1].x,u=s*Math.abs(m-d),h=Q(l.map(function(p){return p.y||0}));return W(o)&&typeof o=="number"?h=Math.max(o,h):o&&Array.isArray(o)&&o.length&&(h=Math.max(Q(o.map(function(p){return p.y||0})),h)),W(h)?v.createElement("rect",{x:m<d?m:m-u,y:0,width:u,height:Math.floor(h+(c?parseInt("".concat(c),10):1))}):null}},{key:"renderVerticalRect",value:function(s){var n=this.props,o=n.baseLine,l=n.points,c=n.strokeWidth,m=l[0].y,d=l[l.length-1].y,u=s*Math.abs(m-d),h=Q(l.map(function(p){return p.x||0}));return W(o)&&typeof o=="number"?h=Math.max(o,h):o&&Array.isArray(o)&&o.length&&(h=Math.max(Q(o.map(function(p){return p.x||0})),h)),W(h)?v.createElement("rect",{x:0,y:m<d?m:m-u,width:h+(c?parseInt("".concat(c),10):1),height:Math.floor(u)}):null}},{key:"renderClipRect",value:function(s){var n=this.props.layout;return n==="vertical"?this.renderVerticalRect(s):this.renderHorizontalRect(s)}},{key:"renderAreaStatically",value:function(s,n,o,l){var c=this.props,m=c.layout,d=c.type,u=c.stroke,h=c.connectNulls,p=c.isRange;c.ref;var x=Pe(c,ht);return v.createElement(X,{clipPath:o?"url(#clipPath-".concat(l,")"):null},v.createElement(re,F({},B(x,!0),{points:s,connectNulls:h,type:d,baseLine:n,layout:m,stroke:"none",className:"recharts-area-area"})),u!=="none"&&v.createElement(re,F({},B(this.props,!1),{className:"recharts-area-curve",layout:m,type:d,connectNulls:h,fill:"none",points:s})),u!=="none"&&p&&v.createElement(re,F({},B(this.props,!1),{className:"recharts-area-curve",layout:m,type:d,connectNulls:h,fill:"none",points:n})))}},{key:"renderAreaWithAnimation",value:function(s,n){var o=this,l=this.props,c=l.points,m=l.baseLine,d=l.isAnimationActive,u=l.animationBegin,h=l.animationDuration,p=l.animationEasing,x=l.animationId,w=this.state,k=w.prevPoints,y=w.prevBaseLine;return v.createElement(Ve,{begin:u,duration:h,isActive:d,easing:p,from:{t:0},to:{t:1},key:"area-".concat(x),onAnimationEnd:this.handleAnimationEnd,onAnimationStart:this.handleAnimationStart},function(P){var g=P.t;if(k){var S=k.length/c.length,b=c.map(function(N,T){var C=Math.floor(T*S);if(k[C]){var A=k[C],_=H(A.x,N.x),M=H(A.y,N.y);return R(R({},N),{},{x:_(g),y:M(g)})}return N}),f;if(W(m)&&typeof m=="number"){var j=H(y,m);f=j(g)}else if(he(m)||We(m)){var O=H(y,0);f=O(g)}else f=m.map(function(N,T){var C=Math.floor(T*S);if(y[C]){var A=y[C],_=H(A.x,N.x),M=H(A.y,N.y);return R(R({},N),{},{x:_(g),y:M(g)})}return N});return o.renderAreaStatically(b,f,s,n)}return v.createElement(X,null,v.createElement("defs",null,v.createElement("clipPath",{id:"animationClipPath-".concat(n)},o.renderClipRect(g))),v.createElement(X,{clipPath:"url(#animationClipPath-".concat(n,")")},o.renderAreaStatically(c,m,s,n)))})}},{key:"renderArea",value:function(s,n){var o=this.props,l=o.points,c=o.baseLine,m=o.isAnimationActive,d=this.state,u=d.prevPoints,h=d.prevBaseLine,p=d.totalLength;return m&&l&&l.length&&(!u&&p>0||!ue(u,l)||!ue(h,c))?this.renderAreaWithAnimation(s,n):this.renderAreaStatically(l,c,s,n)}},{key:"render",value:function(){var s,n=this.props,o=n.hide,l=n.dot,c=n.points,m=n.className,d=n.top,u=n.left,h=n.xAxis,p=n.yAxis,x=n.width,w=n.height,k=n.isAnimationActive,y=n.id;if(o||!c||!c.length)return null;var P=this.state.isAnimationFinished,g=c.length===1,S=Ne("recharts-area",m),b=h&&h.allowDataOverflow,f=p&&p.allowDataOverflow,j=b||f,O=he(y)?this.id:y,N=(s=B(l,!1))!==null&&s!==void 0?s:{r:3,strokeWidth:2},T=N.r,C=T===void 0?3:T,A=N.strokeWidth,_=A===void 0?2:A,M=Ke(l)?l:{},G=M.clipDot,U=G===void 0?!0:G,$=C*2+_;return v.createElement(X,{className:S},b||f?v.createElement("defs",null,v.createElement("clipPath",{id:"clipPath-".concat(O)},v.createElement("rect",{x:b?u:u-x/2,y:f?d:d-w/2,width:b?x:x*2,height:f?w:w*2})),!U&&v.createElement("clipPath",{id:"clipPath-dots-".concat(O)},v.createElement("rect",{x:u-$/2,y:d-$/2,width:x+$,height:w+$}))):null,g?null:this.renderArea(j,O),(l||g)&&this.renderDots(j,U,O),(!k||P)&&Ge.renderCallByParent(this.props,c))}}],[{key:"getDerivedStateFromProps",value:function(s,n){return s.animationId!==n.prevAnimationId?{prevAnimationId:s.animationId,curPoints:s.points,curBaseLine:s.baseLine,prevPoints:n.curPoints,prevBaseLine:n.curBaseLine}:s.points!==n.curPoints||s.baseLine!==n.curBaseLine?{curPoints:s.points,curBaseLine:s.baseLine}:null}}])})(V.PureComponent);Se=I;D(I,"displayName","Area");D(I,"defaultProps",{stroke:"#3182bd",fill:"#3182bd",fillOpacity:.6,xAxisId:0,yAxisId:0,legendType:"line",connectNulls:!1,points:[],dot:!1,activeDot:!0,hide:!1,isAnimationActive:!Ue.isSsr,animationBegin:0,animationDuration:1500,animationEasing:"ease"});D(I,"getBaseValue",function(t,a,i,s){var n=t.layout,o=t.baseValue,l=a.props.baseValue,c=l??o;if(W(c)&&typeof c=="number")return c;var m=n==="horizontal"?s:i,d=m.scale.domain();if(m.type==="number"){var u=Math.max(d[0],d[1]),h=Math.min(d[0],d[1]);return c==="dataMin"?h:c==="dataMax"||u<0?u:Math.max(Math.min(d[0],d[1]),0)}return c==="dataMin"?d[0]:c==="dataMax"?d[1]:d[0]});D(I,"getComposedData",function(t){var a=t.props,i=t.item,s=t.xAxis,n=t.yAxis,o=t.xAxisTicks,l=t.yAxisTicks,c=t.bandSize,m=t.dataKey,d=t.stackedData,u=t.dataStartIndex,h=t.displayedData,p=t.offset,x=a.layout,w=d&&d.length,k=Se.getBaseValue(a,i,s,n),y=x==="horizontal",P=!1,g=h.map(function(b,f){var j;w?j=d[u+f]:(j=xe(b,m),Array.isArray(j)?P=!0:j=[k,j]);var O=j[1]==null||w&&xe(b,m)==null;return y?{x:pe({axis:s,ticks:o,bandSize:c,entry:b,index:f}),y:O?null:n.scale(j[1]),value:j,payload:b}:{x:O?null:s.scale(j[1]),y:pe({axis:n,ticks:l,bandSize:c,entry:b,index:f}),value:j,payload:b}}),S;return w||P?S=g.map(function(b){var f=Array.isArray(b.value)?b.value[0]:null;return y?{x:b.x,y:f!=null&&b.y!=null?n.scale(f):null}:{x:f!=null?s.scale(f):null,y:b.y}}):S=y?n.scale(k):s.scale(k),R({points:g,baseLine:S,layout:x,isRange:P},p)});D(I,"renderDotItem",function(t,a){var i;if(v.isValidElement(t))i=v.cloneElement(t,a);else if(ie(t))i=t(a);else{var s=Ne("recharts-area-dot",typeof t!="boolean"?t.className:""),n=a.key,o=Pe(a,ut);i=v.createElement(Ye,F({},o,{key:n,className:s}))}return i});var wt=Qe({chartName:"AreaChart",GraphicalChild:I,axisComponents:[{axisType:"xAxis",AxisComp:Ae},{axisType:"yAxis",AxisComp:ke}],formatAxisMap:Ze});const je=[12,25,50,100],we=[{value:1,label:"1h"},{value:6,label:"6h"},{value:24,label:"24h"},{value:168,label:"7d"},{value:720,label:"30d"}],Nt={backgroundColor:"rgba(8, 15, 28, 0.96)",border:"1px solid rgba(148, 163, 184, 0.14)",borderRadius:"18px",fontSize:12,boxShadow:"0 20px 60px rgba(0,0,0,0.45)",backdropFilter:"blur(12px)"};function J({label:t,value:a,detail:i,accent:s,icon:n}){return e.jsxs("div",{className:"metric-card",children:[e.jsx("div",{className:`metric-orb ${s}`,children:n}),e.jsxs("div",{children:[e.jsx("div",{className:"hud-label",children:t}),e.jsx("div",{className:"mt-1 text-3xl font-semibold tracking-[-0.04em] text-white",children:a}),e.jsx("div",{className:"mt-1 text-sm text-slate-400",children:i})]})]})}function At({status:t}){const a=t==="error";return e.jsxs("span",{className:"relative flex h-3.5 w-3.5 items-center justify-center",children:[e.jsx("span",{className:`absolute inset-0 rounded-full ${a?"bg-rose-400/25":"bg-emerald-400/25"}`}),e.jsx("span",{className:`relative h-2 w-2 rounded-full ${a?"bg-rose-400":"bg-emerald-300"}`})]})}function Lt(){const[t,a]=_e(),i=t.get("q")??"",s=V.useDeferredValue(i),n=t.get("provider")??"",o=t.get("status"),l=o==="ok"||o==="error"?o:"",c=Number(t.get("periodHours")??"24"),m=Number(t.get("pageSize")??"12"),d=je.includes(m)?m:12,u=Math.max(1,Number(t.get("page")??"1")||1),h=(u-1)*d,p=V.useMemo(()=>({limit:d,offset:h,q:s.trim()||void 0,provider:n||void 0,status:l||void 0,periodHours:we.some(r=>r.value===c)?c:24}),[s,d,h,c,n,l]),{data:x}=ae({queryKey:["stats",p.periodHours],queryFn:()=>$e(p.periodHours??24)}),{data:w,isLoading:k}=ae({queryKey:["traces",p],queryFn:()=>ze(p)}),{data:y}=ae({queryKey:["insights"],queryFn:Fe,refetchInterval:6e4}),P=y?.insights??[],g=w?.traces??[],S=w?.total??0,b=Math.max(1,Math.ceil(S/d)),[f,j]=V.useState(null),[O,N]=V.useState("desc");function T(r){f===r?N(L=>L==="asc"?"desc":"asc"):(j(r),N("desc"))}const C=V.useMemo(()=>f?[...g].sort((r,L)=>{const Y=r[f]??0,z=L[f]??0;return O==="asc"?Y-z:z-Y}):g,[g,f,O]),A=x?.byProvider[0],_=C[0],M=[...new Set(x?.byProvider.map(r=>r.provider)??[])],G=x?.costOverTime.map(r=>({time:qe(r.timestamp),cost:r.cost}))??[],U=x&&x.totalSpans>0?x.totalCost/x.totalSpans:0,$=i.length>0||n.length>0||l.length>0||p.periodHours!==24;function E(r,L=!0){a(Y=>{const z=new URLSearchParams(Y);for(const[oe,te]of Object.entries(r))te===void 0||te===""?z.delete(oe):z.set(oe,String(te));return L&&z.delete("page"),z},{replace:!0})}return e.jsxs(Be,{eyebrow:"Flight Deck",title:"Read the behavior of every model call like a live system.",description:"The dashboard should act like an operator console. This version adds a real trace search surface, URL-synced filters, and paginated queue control.",aside:e.jsxs("div",{className:"insight-panel",children:[e.jsx(Me,{}),e.jsxs("div",{className:"mt-4 grid gap-3",children:[e.jsxs("div",{className:"rounded-2xl border border-white/8 bg-white/4 p-4",children:[e.jsx("div",{className:"hud-label",children:"Dominant provider"}),e.jsxs("div",{className:"mt-2 flex items-center justify-between",children:[e.jsx("div",{className:"text-lg font-medium capitalize text-white",children:A?.provider??"Awaiting traffic"}),e.jsx(lt,{className:"h-4 w-4 text-sky-300"})]}),e.jsx("div",{className:"mt-1 text-sm text-slate-400",children:A?`${A.spanCount} calls, ${q(A.totalCost)} spend`:"No provider activity yet"})]}),e.jsxs("div",{className:"rounded-2xl border border-white/8 bg-white/4 p-4",children:[e.jsx("div",{className:"hud-label",children:"Latest trace"}),e.jsx("div",{className:"mt-2 text-base font-medium text-white",children:_?.name??"No recent traces"}),e.jsx("div",{className:"mt-1 text-sm text-slate-400",children:_?`${me(_.startTime)} / ${_.spanCount} spans`:"Start sending spans to populate the deck"})]})]})]}),children:[e.jsxs("div",{className:"grid gap-4 md:grid-cols-2 xl:grid-cols-4",children:[e.jsx(J,{label:"Trace Volume",value:se(x?.totalTraces??0),detail:`${x?.totalSpans??0} spans in window`,icon:e.jsx(De,{className:"h-5 w-5"}),accent:"bg-[linear-gradient(135deg,rgba(52,211,153,0.18),rgba(14,165,233,0.18))] text-emerald-200"}),e.jsx(J,{label:"Token Throughput",value:se(x?.totalTokens??0),detail:"Token load across the active filter window",icon:e.jsx(Le,{className:"h-5 w-5"}),accent:"bg-[linear-gradient(135deg,rgba(56,189,248,0.18),rgba(168,85,247,0.18))] text-sky-200"}),e.jsx(J,{label:"Spend Velocity",value:q(x?.totalCost??0),detail:`${q(U)} average cost per call`,icon:e.jsx(Z,{className:"h-5 w-5"}),accent:"bg-[linear-gradient(135deg,rgba(251,191,36,0.18),rgba(249,115,22,0.18))] text-amber-200"}),e.jsx(J,{label:"Risk Surface",value:`${Math.round((x?.errorRate??0)*100)}%`,detail:`${x?.errorCount??0} failing calls`,icon:e.jsx(ve,{className:"h-5 w-5"}),accent:"bg-[linear-gradient(135deg,rgba(244,63,94,0.18),rgba(168,85,247,0.18))] text-rose-200"})]}),e.jsxs("div",{className:"grid gap-5 xl:grid-cols-[minmax(0,1.5fr)_minmax(320px,0.95fr)]",children:[e.jsxs("section",{className:"dashboard-shell rounded-[26px] px-5 py-5 sm:px-6",children:[e.jsxs("div",{className:"mb-5 flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("div",{className:"hud-label",children:"Economic pulse"}),e.jsx("h2",{className:"mt-1 text-xl font-semibold tracking-[-0.04em] text-white",children:"Cost gradient"})]}),e.jsxs("div",{className:"status-chip",children:[e.jsx(He,{className:"h-3.5 w-3.5 text-sky-300"}),e.jsxs("span",{children:[p.periodHours,"h window"]})]})]}),G.length>0?e.jsx(Je,{width:"100%",height:320,children:e.jsxs(wt,{data:G,children:[e.jsx("defs",{children:e.jsxs("linearGradient",{id:"dashboardCostFill",x1:"0",y1:"0",x2:"0",y2:"1",children:[e.jsx("stop",{offset:"0%",stopColor:"#34d399",stopOpacity:.35}),e.jsx("stop",{offset:"100%",stopColor:"#38bdf8",stopOpacity:0})]})}),e.jsx(et,{stroke:"rgba(148,163,184,0.08)",vertical:!1}),e.jsx(Ae,{dataKey:"time",tick:{fontSize:11,fill:"#94a3b8"},axisLine:!1,tickLine:!1}),e.jsx(ke,{tick:{fontSize:11,fill:"#94a3b8"},axisLine:!1,tickLine:!1,width:54}),e.jsx(tt,{contentStyle:Nt,formatter:r=>[q(r),"Cost"]}),e.jsx(I,{type:"monotone",dataKey:"cost",stroke:"#34d399",fill:"url(#dashboardCostFill)",strokeWidth:2.6,dot:!1})]})}):e.jsxs("div",{className:"empty-state h-[320px]",children:[e.jsx(Z,{className:"h-8 w-8 text-slate-500"}),e.jsx("div",{className:"text-base font-medium text-white",children:"No cost movement yet"})]})]}),e.jsxs("section",{className:"dashboard-shell rounded-[26px] px-5 py-5 sm:px-6",children:[e.jsxs("div",{className:"mb-5",children:[e.jsx("div",{className:"hud-label",children:"Provider pressure"}),e.jsx("h2",{className:"mt-1 text-xl font-semibold tracking-[-0.04em] text-white",children:"Allocation by provider"})]}),e.jsx("div",{className:"space-y-4",children:(x?.byProvider??[]).map(r=>{const L=(x?.totalCost??0)>0?r.totalCost/(x?.totalCost??1)*100:0;return e.jsxs("div",{className:"rounded-2xl border border-white/6 bg-white/4 p-4",children:[e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-sm font-medium capitalize text-white",children:r.provider}),e.jsxs("div",{className:"text-xs text-slate-400",children:[r.spanCount," calls / ",se(r.totalTokens)," tokens"]})]}),e.jsxs("div",{className:"text-right",children:[e.jsx("div",{className:"text-sm font-medium text-white",children:q(r.totalCost)}),e.jsx("div",{className:"text-xs text-slate-500",children:de(r.avgDuration)})]})]}),e.jsx("div",{className:"mt-3 h-2 overflow-hidden rounded-full bg-slate-900/80",children:e.jsx(Te.div,{className:"h-full rounded-full bg-[linear-gradient(90deg,#34d399,#38bdf8)]",initial:{width:0},animate:{width:`${Math.max(L,4)}%`}})})]},r.provider)})})]})]}),e.jsxs("div",{className:"grid gap-5 xl:grid-cols-[minmax(0,1.45fr)_minmax(320px,0.85fr)]",children:[e.jsxs("section",{className:"dashboard-shell rounded-[26px] px-4 py-4 sm:px-5 sm:py-5",children:[e.jsxs("div",{className:"mb-4 rounded-[24px] border border-white/8 bg-[linear-gradient(180deg,rgba(7,14,26,0.95),rgba(4,8,18,0.98))] p-4",children:[e.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("div",{className:"hud-label",children:"Search console"}),e.jsx("h2",{className:"mt-1 text-xl font-semibold tracking-[-0.04em] text-white",children:"Trace dispatch queue"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("span",{className:"status-chip",children:[S," matches"]}),e.jsxs("button",{type:"button",onClick:()=>E({q:void 0,provider:void 0,status:void 0,periodHours:void 0}),disabled:!$,className:"status-chip transition-colors hover:border-white/16 hover:bg-white/8 disabled:cursor-not-allowed disabled:opacity-50",children:[e.jsx(Ee,{className:"h-3.5 w-3.5"}),e.jsx("span",{children:"Clear"})]})]})]}),e.jsxs("div",{className:"mt-4 grid gap-3 xl:grid-cols-[minmax(0,1.7fr)_repeat(3,minmax(0,0.7fr))]",children:[e.jsxs("label",{className:"relative block",children:[e.jsx(at,{className:"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-slate-500"}),e.jsx("input",{value:i,onChange:r=>E({q:r.target.value||void 0}),placeholder:"Search traces, models, providers, errors",className:"w-full rounded-2xl border border-white/8 bg-white/4 py-3 pl-10 pr-4 text-sm text-white placeholder:text-slate-500 focus:border-emerald-400/30 focus:bg-white/6 focus:outline-none"})]}),e.jsxs("select",{value:n,onChange:r=>E({provider:r.target.value||void 0}),className:"w-full rounded-2xl border border-white/8 bg-white/4 px-4 py-3 text-sm text-white focus:border-sky-400/30 focus:bg-white/6 focus:outline-none",children:[e.jsx("option",{value:"",children:"All providers"}),M.map(r=>e.jsx("option",{value:r,children:r},r))]}),e.jsxs("select",{value:l,onChange:r=>E({status:r.target.value||void 0}),className:"w-full rounded-2xl border border-white/8 bg-white/4 px-4 py-3 text-sm text-white focus:border-emerald-400/30 focus:bg-white/6 focus:outline-none",children:[e.jsx("option",{value:"",children:"All states"}),e.jsx("option",{value:"ok",children:"Healthy only"}),e.jsx("option",{value:"error",children:"Errors only"})]}),e.jsx("select",{value:String(p.periodHours??24),onChange:r=>E({periodHours:Number(r.target.value)===24?void 0:Number(r.target.value)}),className:"w-full rounded-2xl border border-white/8 bg-white/4 px-4 py-3 text-sm text-white focus:border-amber-400/30 focus:bg-white/6 focus:outline-none",children:we.map(r=>e.jsx("option",{value:r.value,children:r.label},r.value))})]})]}),k?e.jsx("div",{className:"empty-state h-[280px] text-slate-500",children:"Loading trace queue..."}):C.length===0&&!$?e.jsxs("div",{className:"rounded-2xl border border-white/8 bg-white/4 p-6 sm:p-8",children:[e.jsxs("div",{className:"flex flex-col items-center gap-3 text-center",children:[e.jsx(fe,{className:"h-10 w-10 text-amber-400/60"}),e.jsxs("div",{children:[e.jsx("div",{className:"text-lg font-semibold text-white",children:"No traces recorded yet"}),e.jsx("p",{className:"mt-1 text-sm text-slate-400",children:"Get started in 3 steps — takes under a minute."})]})]}),e.jsxs("div",{className:"mx-auto mt-6 flex max-w-3xl flex-col gap-4",children:[e.jsxs("div",{className:"rounded-xl border border-white/6 bg-white/3 p-4",children:[e.jsxs("div",{className:"mb-2 flex items-center gap-2",children:[e.jsx("span",{className:"flex h-5 w-5 items-center justify-center rounded-full bg-amber-400/20 text-[10px] font-bold text-amber-400",children:"1"}),e.jsx("span",{className:"text-xs font-semibold uppercase tracking-wider text-amber-400",children:"Install the SDK"})]}),e.jsx("pre",{className:"overflow-x-auto rounded-lg bg-black/40 p-3 text-sm leading-relaxed text-green-400 select-all",children:"npm install @llmtap/sdk"})]}),e.jsxs("div",{className:"rounded-xl border border-white/6 bg-white/3 p-4",children:[e.jsxs("div",{className:"mb-2 flex items-center gap-2",children:[e.jsx("span",{className:"flex h-5 w-5 items-center justify-center rounded-full bg-amber-400/20 text-[10px] font-bold text-amber-400",children:"2"}),e.jsx("span",{className:"text-xs font-semibold uppercase tracking-wider text-amber-400",children:"Wrap your client & use normally"})]}),e.jsx("pre",{className:"overflow-x-auto rounded-lg bg-black/40 p-3 text-sm leading-relaxed text-green-400 select-all whitespace-pre",children:`import { wrap } from "@llmtap/sdk";
2
- import OpenAI from "openai";
3
-
4
- const client = wrap(new OpenAI());
5
-
6
- const res = await client.chat.completions.create({
7
- model: "gpt-4o-mini",
8
- messages: [{ role: "user", content: "Hello!" }],
9
- });`})]}),e.jsxs("div",{className:"rounded-xl border border-white/6 bg-white/3 p-4",children:[e.jsxs("div",{className:"mb-2 flex items-center gap-2",children:[e.jsx("span",{className:"flex h-5 w-5 items-center justify-center rounded-full bg-amber-400/20 text-[10px] font-bold text-amber-400",children:"3"}),e.jsx("span",{className:"text-xs font-semibold uppercase tracking-wider text-amber-400",children:"Start the collector"})]}),e.jsx("pre",{className:"overflow-x-auto rounded-lg bg-black/40 p-3 text-sm leading-relaxed text-green-400 select-all",children:"npx llmtap"}),e.jsx("p",{className:"mt-2 text-xs text-slate-500",children:"Run your app and traces will appear here automatically."})]})]}),e.jsx("div",{className:"mx-auto mt-4 max-w-3xl rounded-lg border border-white/4 bg-white/2 px-4 py-2.5",children:e.jsxs("p",{className:"text-center text-xs text-slate-500",children:["Works with ",e.jsx("span",{className:"text-slate-400",children:"OpenAI"}),", ",e.jsx("span",{className:"text-slate-400",children:"Anthropic"}),", ",e.jsx("span",{className:"text-slate-400",children:"Google Gemini"}),", ",e.jsx("span",{className:"text-slate-400",children:"DeepSeek"}),", ",e.jsx("span",{className:"text-slate-400",children:"Groq"}),", ",e.jsx("span",{className:"text-slate-400",children:"Together"}),", ",e.jsx("span",{className:"text-slate-400",children:"Fireworks"}),", ",e.jsx("span",{className:"text-slate-400",children:"OpenRouter"}),", and any OpenAI-compatible provider."]})})]}):C.length===0?e.jsxs("div",{className:"empty-state h-[280px]",children:[e.jsx(fe,{className:"h-8 w-8 text-slate-500"}),e.jsx("div",{className:"text-base font-medium text-white",children:"No traces match these filters"})]}):e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full border-separate border-spacing-y-2 text-sm",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"text-left text-[11px] uppercase tracking-[0.18em] text-slate-500",children:[e.jsx("th",{className:"px-4 py-2",children:"State"}),e.jsx("th",{className:"px-4 py-2",children:"Trace"}),[["spanCount","Spans"],["totalTokens","Tokens"],["totalCost","Cost"],["startTime","When"]].map(([r,L])=>e.jsx("th",{className:"px-4 py-2 text-right",children:e.jsxs("button",{type:"button",onClick:()=>T(r),className:"inline-flex items-center gap-1 transition-colors hover:text-slate-300",children:[L,f===r?O==="asc"?e.jsx(st,{className:"h-3 w-3"}):e.jsx(it,{className:"h-3 w-3"}):e.jsx(rt,{className:"h-3 w-3 opacity-30"})]})},r))]})}),e.jsx("tbody",{children:C.map(r=>e.jsxs("tr",{className:"rounded-2xl border border-white/6 bg-white/4",children:[e.jsx("td",{className:"rounded-l-2xl px-4 py-4",children:e.jsx(At,{status:r.status})}),e.jsx("td",{className:"px-4 py-4",children:e.jsxs(Re,{to:`/trace/${r.traceId}`,className:"group inline-flex max-w-[380px] flex-col gap-1 text-sm font-medium text-white transition-colors hover:text-emerald-300",children:[e.jsxs("span",{className:"inline-flex items-center gap-2",children:[e.jsx("span",{className:"truncate",children:r.name}),e.jsx(be,{className:"h-3.5 w-3.5 opacity-0 transition-all group-hover:translate-x-0.5 group-hover:opacity-100"})]}),e.jsxs("span",{className:"font-mono text-[10px] uppercase tracking-[0.16em] text-slate-500",children:[r.traceId.slice(0,12),r.totalDuration?` / ${de(r.totalDuration)}`:""]})]})}),e.jsx("td",{className:"px-4 py-4 text-right font-mono text-xs text-slate-300",children:r.spanCount}),e.jsx("td",{className:"px-4 py-4 text-right font-mono text-xs text-slate-300",children:r.totalTokens.toLocaleString()}),e.jsx("td",{className:"px-4 py-4 text-right font-mono text-xs text-slate-300",children:q(r.totalCost)}),e.jsx("td",{className:"rounded-r-2xl px-4 py-4 text-right text-xs text-slate-500",children:me(r.startTime)})]},r.traceId))})]})}),e.jsxs("div",{className:"mt-4 flex items-center justify-between gap-3 px-1",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"text-xs text-slate-500",children:S>0?`Showing ${h+1}-${Math.min(h+C.length,S)} of ${S}`:"Awaiting traces"}),e.jsx("select",{value:String(d),onChange:r=>E({pageSize:Number(r.target.value)===12?void 0:Number(r.target.value)}),className:"rounded-xl border border-white/8 bg-white/4 px-2 py-1.5 text-xs text-slate-300 focus:border-emerald-400/30 focus:outline-none",children:je.map(r=>e.jsxs("option",{value:r,children:[r," / page"]},r))})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("button",{type:"button",onClick:()=>E({page:u>2?u-1:void 0},!1),disabled:u<=1,className:"status-chip transition-colors hover:border-white/16 hover:bg-white/8 disabled:cursor-not-allowed disabled:opacity-50",children:[e.jsx(nt,{className:"h-3.5 w-3.5"}),e.jsx("span",{children:"Previous"})]}),e.jsxs("button",{type:"button",onClick:()=>E({page:u+1},!1),disabled:u>=b,className:"status-chip transition-colors hover:border-white/16 hover:bg-white/8 disabled:cursor-not-allowed disabled:opacity-50",children:[e.jsx("span",{children:"Next"}),e.jsx(be,{className:"h-3.5 w-3.5"})]})]})]})]})]}),e.jsxs("section",{className:"dashboard-shell rounded-[26px] px-5 py-5",children:[e.jsxs("div",{className:"mb-5",children:[e.jsx("div",{className:"hud-label",children:"Intelligence layer"}),e.jsx("h2",{className:"mt-1 text-xl font-semibold tracking-[-0.04em] text-white",children:"Insights"})]}),e.jsx("div",{className:"space-y-4",children:P.length>0?P.map(r=>e.jsxs("div",{className:`rounded-2xl border p-4 ${r.severity==="critical"?"border-rose-400/20 bg-rose-500/8":r.severity==="warning"?"border-amber-400/20 bg-amber-500/8":"border-white/6 bg-white/4"}`,children:[e.jsxs("div",{className:"mb-2 flex items-center justify-between gap-2",children:[e.jsxs("div",{className:"flex items-center gap-2 text-sm font-medium text-white",children:[r.type==="cost_anomaly"&&e.jsx(ce,{className:"h-4 w-4 text-amber-300"}),r.type==="error_pattern"&&e.jsx(ve,{className:"h-4 w-4 text-rose-300"}),r.type==="model_recommendation"&&e.jsx(ct,{className:"h-4 w-4 text-sky-300"}),r.type==="token_waste"&&e.jsx(Z,{className:"h-4 w-4 text-purple-300"}),r.title]}),r.metric&&e.jsx("span",{className:"shrink-0 rounded-full border border-white/10 bg-white/6 px-2 py-0.5 text-[10px] font-mono text-slate-400",children:r.metric})]}),e.jsx("p",{className:"text-sm leading-6 text-slate-400",children:r.description})]},r.id)):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"rounded-2xl border border-white/6 bg-white/4 p-4",children:[e.jsxs("div",{className:"mb-2 flex items-center gap-2 text-sm font-medium text-white",children:[e.jsx(Ie,{className:"h-4 w-4 text-sky-300"}),"Health read"]}),e.jsx("p",{className:"text-sm leading-6 text-slate-400",children:(x?.errorRate??0)>.05?"Error rate is elevated. Start with the most recent failed trace and inspect provider or tool payloads.":"Error pressure is currently low. Use this window to compare provider cost drift and latency patterns."})]}),e.jsxs("div",{className:"rounded-2xl border border-white/6 bg-white/4 p-4",children:[e.jsxs("div",{className:"mb-2 flex items-center gap-2 text-sm font-medium text-white",children:[e.jsx(Z,{className:"h-4 w-4 text-emerald-300"}),"Spend insight"]}),e.jsx("p",{className:"text-sm leading-6 text-slate-400",children:A?`${A.provider} currently leads cost share. If that is unexpected, inspect the filtered queue for bursty workflows.`:"Provider concentration will appear here once traces land."})]}),e.jsxs("div",{className:"rounded-2xl border border-white/6 bg-white/4 p-4",children:[e.jsxs("div",{className:"mb-2 flex items-center gap-2 text-sm font-medium text-white",children:[e.jsx(ce,{className:"h-4 w-4 text-amber-300"}),"Queue focus"]}),e.jsx("p",{className:"text-sm leading-6 text-slate-400",children:_?`Latest traffic is "${_.name}". Open it to inspect hierarchy, timing, and payload shape.`:"No active traces yet. Generate a request through an instrumented client to validate the pipeline."})]})]})})]})]})]})}export{Lt as default};
@@ -1 +0,0 @@
1
- import{j as e,m as a,C as g,b as N,f as v}from"./index-BBr9_AHg.js";import{u as k,P as w,a as d,b as i,c as l}from"./format-BiBDo3KS.js";import{L as C}from"./layers--K2XRXAx.js";import{C as L}from"./clock-CSGov78l.js";import{R as o,p as c,X as x,Y as m,T as h,N as p}from"./generateCategoricalChart-CylgFInn.js";import{B as y}from"./BarChart-N8X7TKRf.js";import{G as S}from"./gauge-BBNKtqFH.js";const j={backgroundColor:"rgba(8, 15, 28, 0.96)",border:"1px solid rgba(148, 163, 184, 0.14)",borderRadius:"18px",fontSize:12,boxShadow:"0 20px 60px rgba(0,0,0,0.45)",backdropFilter:"blur(12px)"},z={openai:"bg-emerald-400",anthropic:"bg-amber-300",google:"bg-sky-400",deepseek:"bg-cyan-400",groq:"bg-fuchsia-400",xai:"bg-rose-400"};function $(){const{data:u,isLoading:b}=k({queryKey:["stats",168],queryFn:()=>v(168)}),s=u?.byModel??[],r=s.map(t=>({name:t.model.length>20?`${t.model.slice(0,18)}...`:t.model,p50:t.avgDuration})),n=s.map(t=>({name:t.model.length>20?`${t.model.slice(0,18)}...`:t.model,tokens:t.totalTokens}));return b?e.jsxs("div",{className:"mx-auto max-w-[1500px] space-y-8",children:[e.jsx("div",{className:"skeleton-panel h-44 rounded-[28px]"}),e.jsx("div",{className:"skeleton-panel h-80 rounded-[24px]"})]}):e.jsx(w,{eyebrow:"Model Intelligence",title:"Every model. Every metric. One surface.",description:"Compare cost, token volume, latency, and call frequency across all models in your rotation. Identify the models consuming the most budget and the ones delivering the best performance.",aside:e.jsxs("div",{className:"insight-panel",children:[e.jsx(N,{}),e.jsxs("div",{className:"mt-4 space-y-3",children:[e.jsxs("div",{className:"rounded-2xl border border-white/8 bg-white/4 p-4",children:[e.jsx("div",{className:"hud-label",children:"Models active"}),e.jsx("div",{className:"mt-2 text-lg font-medium text-white",children:s.length}),e.jsxs("div",{className:"mt-1 text-sm text-slate-400",children:["Across ",new Set(s.map(t=>t.provider)).size," providers"]})]}),e.jsxs("div",{className:"rounded-2xl border border-white/8 bg-white/4 p-4",children:[e.jsx("div",{className:"hud-label",children:"Highest cost model"}),e.jsx("div",{className:"mt-2 text-base font-medium text-white",children:s[0]?.model??"No data"}),e.jsx("div",{className:"mt-1 text-sm text-slate-400",children:s[0]?i(s[0].totalCost):"-"})]})]})]}),children:s.length>0?e.jsxs(e.Fragment,{children:[e.jsxs(a.div,{className:"dashboard-shell overflow-hidden rounded-[26px] px-4 py-4 sm:px-5",initial:{opacity:0,y:16},animate:{opacity:1,y:0},transition:{duration:.35},children:[e.jsxs("div",{className:"mb-3 flex items-center justify-between gap-3 px-1",children:[e.jsxs("div",{children:[e.jsx("div",{className:"hud-label",children:"Model roster"}),e.jsx("h2",{className:"mt-1 text-xl font-semibold tracking-[-0.04em] text-white",children:"Performance by model"})]}),e.jsxs("span",{className:"status-chip",children:[e.jsx(C,{className:"h-3.5 w-3.5 text-sky-300"}),e.jsxs("span",{children:[s.length," models"]})]})]}),e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full border-separate border-spacing-y-2 text-sm",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"text-left text-[11px] uppercase tracking-[0.18em] text-slate-500",children:[e.jsx("th",{className:"px-4 py-2",children:"Model"}),e.jsx("th",{className:"px-4 py-2",children:"Provider"}),e.jsx("th",{className:"px-4 py-2 text-right",children:"Calls"}),e.jsx("th",{className:"px-4 py-2 text-right",children:"Tokens"}),e.jsx("th",{className:"px-4 py-2 text-right",children:"Cost"}),e.jsx("th",{className:"px-4 py-2 text-right",children:"Avg Latency"}),e.jsx("th",{className:"px-4 py-2 text-right",children:"Cost/Call"})]})}),e.jsx("tbody",{children:s.map((t,f)=>e.jsxs(a.tr,{className:"rounded-2xl border border-white/6 bg-white/4",initial:{opacity:0,x:-8},animate:{opacity:1,x:0},transition:{delay:.03*f,duration:.3},children:[e.jsx("td",{className:"rounded-l-2xl px-4 py-4",children:e.jsx("div",{className:"font-mono text-xs font-semibold text-slate-100",children:t.model})}),e.jsx("td",{className:"px-4 py-4",children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:`h-2.5 w-2.5 rounded-full ${z[t.provider]??"bg-purple-400"}`,style:{boxShadow:"0 0 10px currentColor"}}),e.jsx("span",{className:"text-xs font-medium capitalize text-slate-200",children:t.provider})]})}),e.jsx("td",{className:"px-4 py-4 text-right",children:e.jsx("span",{className:"inline-flex items-center justify-center rounded-md border border-white/8 bg-slate-950/70 px-2 py-0.5 font-mono text-xs text-slate-400",children:t.spanCount})}),e.jsx("td",{className:"px-4 py-4 text-right font-mono text-xs text-slate-300",children:d(t.totalTokens)}),e.jsx("td",{className:"px-4 py-4 text-right font-mono text-xs font-semibold text-white",children:i(t.totalCost)}),e.jsx("td",{className:"px-4 py-4 text-right font-mono text-xs text-slate-400",children:t.avgDuration?l(t.avgDuration):"-"}),e.jsx("td",{className:"rounded-r-2xl px-4 py-4 text-right font-mono text-xs text-slate-500",children:t.spanCount>0?i(t.totalCost/t.spanCount):"-"})]},`${t.provider}-${t.model}`))})]})})]}),e.jsxs("div",{className:"grid gap-5 xl:grid-cols-2",children:[e.jsxs(a.div,{className:"dashboard-shell rounded-[26px] px-5 py-5",initial:{opacity:0,y:16},animate:{opacity:1,y:0},transition:{delay:.1,duration:.35},children:[e.jsxs("div",{className:"mb-5 flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("div",{className:"hud-label",children:"Latency profile"}),e.jsx("h2",{className:"mt-1 text-xl font-semibold tracking-[-0.04em] text-white",children:"Average latency by model"})]}),e.jsx(L,{className:"h-4 w-4 text-sky-300"})]}),e.jsx(o,{width:"100%",height:Math.max(280,r.length*52),children:e.jsxs(y,{data:r,layout:"vertical",children:[e.jsx(c,{stroke:"rgba(148,163,184,0.08)",horizontal:!1}),e.jsx(x,{type:"number",tick:{fontSize:11,fill:"#94a3b8"},axisLine:!1,tickLine:!1,tickFormatter:t=>l(t)}),e.jsx(m,{type:"category",dataKey:"name",tick:{fontSize:11,fill:"#cbd5e1"},axisLine:!1,tickLine:!1,width:150}),e.jsx(h,{contentStyle:j,formatter:t=>[l(t),"Avg latency"]}),e.jsx(p,{dataKey:"p50",fill:"#38bdf8",radius:[0,10,10,0]})]})})]}),e.jsxs(a.div,{className:"dashboard-shell rounded-[26px] px-5 py-5",initial:{opacity:0,y:16},animate:{opacity:1,y:0},transition:{delay:.15,duration:.35},children:[e.jsxs("div",{className:"mb-5 flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("div",{className:"hud-label",children:"Token distribution"}),e.jsx("h2",{className:"mt-1 text-xl font-semibold tracking-[-0.04em] text-white",children:"Token volume by model"})]}),e.jsx(g,{className:"h-4 w-4 text-emerald-300"})]}),e.jsx(o,{width:"100%",height:Math.max(280,n.length*52),children:e.jsxs(y,{data:n,layout:"vertical",children:[e.jsx(c,{stroke:"rgba(148,163,184,0.08)",horizontal:!1}),e.jsx(x,{type:"number",tick:{fontSize:11,fill:"#94a3b8"},axisLine:!1,tickLine:!1,tickFormatter:t=>d(t)}),e.jsx(m,{type:"category",dataKey:"name",tick:{fontSize:11,fill:"#cbd5e1"},axisLine:!1,tickLine:!1,width:150}),e.jsx(h,{contentStyle:j,formatter:t=>[t.toLocaleString(),"Tokens"]}),e.jsx(p,{dataKey:"tokens",fill:"#34d399",radius:[0,10,10,0]})]})})]})]})]}):e.jsx("div",{className:"dashboard-shell rounded-[26px] p-16",children:e.jsxs("div",{className:"empty-state",children:[e.jsx(S,{className:"h-8 w-8 text-slate-500"}),e.jsx("div",{className:"text-base font-medium text-white",children:"No models tracked yet"}),e.jsx("div",{className:"max-w-sm text-center text-sm text-slate-400",children:"Start sending traced API calls and model metrics will populate automatically."})]})})})}export{$ as default};