pi-mega-compact 0.11.1 → 0.11.2

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 (53) hide show
  1. package/dist/extensions/dashboard-server/api-contracts/endpoints.js +19 -0
  2. package/dist/extensions/dashboard-server/api-contracts/maintenance.js +7 -0
  3. package/dist/extensions/dashboard-server/api-contracts.test.js +1 -1
  4. package/dist/extensions/dashboard-server/routes-maintenance.js +293 -0
  5. package/dist/extensions/dashboard-server/routes.js +1 -0
  6. package/dist/extensions/dashboard-server/server.js +3 -1
  7. package/dist/src/store/sqlite/maintenance.js +20 -1
  8. package/extensions/dashboard-client/dist/assets/{AchievementTiles-DZp_xQOW.js → AchievementTiles-Cml6YC8w.js} +2 -2
  9. package/extensions/dashboard-client/dist/assets/{AchievementTiles-DZp_xQOW.js.map → AchievementTiles-Cml6YC8w.js.map} +1 -1
  10. package/extensions/dashboard-client/dist/assets/{AchievementsTab-BzFHpAHM.js → AchievementsTab-B8NqDt7I.js} +2 -2
  11. package/extensions/dashboard-client/dist/assets/{AchievementsTab-BzFHpAHM.js.map → AchievementsTab-B8NqDt7I.js.map} +1 -1
  12. package/extensions/dashboard-client/dist/assets/{CacheTab-DEQbTq2T.js → CacheTab-BCLzVL4S.js} +2 -2
  13. package/extensions/dashboard-client/dist/assets/{CacheTab-DEQbTq2T.js.map → CacheTab-BCLzVL4S.js.map} +1 -1
  14. package/extensions/dashboard-client/dist/assets/{ConfigTab-DQ4FG33J.js → ConfigTab-CBYvp2mV.js} +2 -2
  15. package/extensions/dashboard-client/dist/assets/{ConfigTab-DQ4FG33J.js.map → ConfigTab-CBYvp2mV.js.map} +1 -1
  16. package/extensions/dashboard-client/dist/assets/{EventsTab-D5HoEVYo.js → EventsTab-DlTJqiDm.js} +2 -2
  17. package/extensions/dashboard-client/dist/assets/{EventsTab-D5HoEVYo.js.map → EventsTab-DlTJqiDm.js.map} +1 -1
  18. package/extensions/dashboard-client/dist/assets/{GameTab-Jzsc4yeY.js → GameTab-DkGTqKJW.js} +2 -2
  19. package/extensions/dashboard-client/dist/assets/{GameTab-Jzsc4yeY.js.map → GameTab-DkGTqKJW.js.map} +1 -1
  20. package/extensions/dashboard-client/dist/assets/MaintenanceTab-Cw43zmUx.js +2 -0
  21. package/extensions/dashboard-client/dist/assets/MaintenanceTab-Cw43zmUx.js.map +1 -0
  22. package/extensions/dashboard-client/dist/assets/{MetricsTab-D_XnsEYX.js → MetricsTab-BFo7pKM-.js} +2 -2
  23. package/extensions/dashboard-client/dist/assets/{MetricsTab-D_XnsEYX.js.map → MetricsTab-BFo7pKM-.js.map} +1 -1
  24. package/extensions/dashboard-client/dist/assets/{OverviewTab-BMREvAth.js → OverviewTab-CClCUd3-.js} +2 -2
  25. package/extensions/dashboard-client/dist/assets/{OverviewTab-BMREvAth.js.map → OverviewTab-CClCUd3-.js.map} +1 -1
  26. package/extensions/dashboard-client/dist/assets/{ReposTab-DuyhOktG.js → ReposTab-_3R4RSLZ.js} +2 -2
  27. package/extensions/dashboard-client/dist/assets/{ReposTab-DuyhOktG.js.map → ReposTab-_3R4RSLZ.js.map} +1 -1
  28. package/extensions/dashboard-client/dist/assets/{SessionsTab-mz_vz8i2.js → SessionsTab-CCYd-kSz.js} +2 -2
  29. package/extensions/dashboard-client/dist/assets/{SessionsTab-mz_vz8i2.js.map → SessionsTab-CCYd-kSz.js.map} +1 -1
  30. package/extensions/dashboard-client/dist/assets/{TimeSavedCard-B8AIjNTY.js → TimeSavedCard-0TqsrY6y.js} +2 -2
  31. package/extensions/dashboard-client/dist/assets/{TimeSavedCard-B8AIjNTY.js.map → TimeSavedCard-0TqsrY6y.js.map} +1 -1
  32. package/extensions/dashboard-client/dist/assets/{TopicsTab-DKuct4oD.js → TopicsTab-DRLJmVv0.js} +2 -2
  33. package/extensions/dashboard-client/dist/assets/{TopicsTab-DKuct4oD.js.map → TopicsTab-DRLJmVv0.js.map} +1 -1
  34. package/extensions/dashboard-client/dist/assets/{TurnsTab-11MGLxY8.js → TurnsTab-CLNM0T5R.js} +2 -2
  35. package/extensions/dashboard-client/dist/assets/{TurnsTab-11MGLxY8.js.map → TurnsTab-CLNM0T5R.js.map} +1 -1
  36. package/extensions/dashboard-client/dist/assets/{index-CqLN7STl.js → index-BcoSz-L4.js} +10 -10
  37. package/extensions/dashboard-client/dist/assets/{index-CqLN7STl.js.map → index-BcoSz-L4.js.map} +1 -1
  38. package/extensions/dashboard-client/dist/assets/{useSSE-CXrQSbVY.js → useSSE-Cezlih5V.js} +2 -2
  39. package/extensions/dashboard-client/dist/assets/{useSSE-CXrQSbVY.js.map → useSSE-Cezlih5V.js.map} +1 -1
  40. package/extensions/dashboard-client/dist/index.html +1 -1
  41. package/extensions/dashboard-client/src/App.tsx +5 -1
  42. package/extensions/dashboard-client/src/api/client.ts +23 -0
  43. package/extensions/dashboard-client/src/tabs/MaintenanceTab.tsx +293 -0
  44. package/extensions/dashboard-server/api-contracts/endpoints.ts +30 -0
  45. package/extensions/dashboard-server/api-contracts/index.ts +12 -0
  46. package/extensions/dashboard-server/api-contracts/maintenance.ts +84 -0
  47. package/extensions/dashboard-server/api-contracts.test.ts +1 -1
  48. package/extensions/dashboard-server/api-contracts.ts +9 -0
  49. package/extensions/dashboard-server/routes-maintenance.ts +345 -0
  50. package/extensions/dashboard-server/routes.ts +1 -0
  51. package/extensions/dashboard-server/server.ts +2 -0
  52. package/package.json +1 -1
  53. package/src/store/sqlite/maintenance.ts +20 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ReposTab-DuyhOktG.js","sources":["../../src/components/SummaryTiles.tsx","../../src/components/RepoTable.tsx","../../src/components/RepoDetailModal.tsx","../../src/components/ActiveReposTable.tsx","../../src/components/SavingsByModelTable.tsx","../../src/tabs/ReposTab.tsx"],"sourcesContent":["/**\n * dashboard-client/src/components/SummaryTiles.tsx — aggregate header tiles.\n *\n * 4 tiles: Repositories, Total Checkpoints, Total Tokens Saved,\n * Compressed-Original. Matches old dashboard #panel-summary tiles.\n */\n\nimport type React from \"react\";\n\nexport interface SummaryTilesProps {\n\t/** Total repos in the registry. */\n\ttotalRepos: number;\n\t/** Total checkpoints across all repos. */\n\ttotalCheckpoints: number;\n\t/** Total tokens saved across all repos. */\n\ttotalTokensSaved: number;\n\t/** Total compressed-original bytes across all repos. */\n\tcompressedOriginalBytes: number;\n}\n\n/** Format bytes → MiB/KiB/B (matches html.ts fmtBytesTop). */\nfunction fmtBytesTop(b: number): string {\n\tif (b >= 1_048_576) return `${(b / 1_048_576).toFixed(1)} MiB`;\n\tif (b >= 1024) return `${(b / 1024).toFixed(1)} KiB`;\n\treturn `${b} B`;\n}\n\n/** Format large numbers with K/M suffix. */\nfunction fmt(n: number): string {\n\tif (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n\tif (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`;\n\treturn String(n);\n}\n\nexport function SummaryTiles({\n\ttotalRepos,\n\ttotalCheckpoints,\n\ttotalTokensSaved,\n\tcompressedOriginalBytes,\n}: SummaryTilesProps): React.ReactElement {\n\treturn (\n\t\t<div className=\"summary-tiles\">\n\t\t\t<div className=\"tile\">\n\t\t\t\t<span className=\"tile-label\">Repositories</span>\n\t\t\t\t<span className=\"tile-value\">{totalRepos.toLocaleString()}</span>\n\t\t\t</div>\n\t\t\t<div className=\"tile\">\n\t\t\t\t<span className=\"tile-label\">Total Checkpoints</span>\n\t\t\t\t<span className=\"tile-value\">{totalCheckpoints.toLocaleString()}</span>\n\t\t\t</div>\n\t\t\t<div className=\"tile tile-highlight\">\n\t\t\t\t<span className=\"tile-label\">Total Tokens Saved</span>\n\t\t\t\t<span className=\"tile-value\">{fmt(totalTokensSaved)}</span>\n\t\t\t</div>\n\t\t\t<div className=\"tile\">\n\t\t\t\t<span className=\"tile-label\">Compressed-Original</span>\n\t\t\t\t<span className=\"tile-value\">{fmtBytesTop(compressedOriginalBytes)}</span>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","/**\n * dashboard-client/src/components/RepoTable.tsx — sortable, searchable repo table.\n *\n * 6 columns: Repo, Model, Checkpoints, Tokens Saved, Retained, Last Compacted.\n * Client-side sort (click header to toggle asc/desc). Search by displayName\n * (case-insensitive substring). Default sort: Last Compacted DESC.\n * Row click opens RepoDetailModal.\n */\n\nimport type React from \"react\";\nimport { useState, useMemo } from \"react\";\nimport type { IndexesIndexRow } from \"@contracts\";\n\nexport interface RepoTableProps {\n\trepos: IndexesIndexRow[];\n\t/** Called when a row is clicked — opens the detail modal. */\n\tonSelect: (repo: IndexesIndexRow) => void;\n}\n\ntype SortKey =\n\t| \"displayName\"\n\t| \"modelName\"\n\t| \"checkpointCount\"\n\t| \"tokensSaved\"\n\t| \"compressedOriginalBytes\"\n\t| \"lastCompactedAt\";\n\ntype SortDir = \"asc\" | \"desc\";\n\nconst COLUMNS: Array<{ key: SortKey; label: string }> = [\n\t{ key: \"displayName\", label: \"Repo\" },\n\t{ key: \"modelName\", label: \"Model\" },\n\t{ key: \"checkpointCount\", label: \"Checkpoints\" },\n\t{ key: \"tokensSaved\", label: \"Tokens Saved\" },\n\t{ key: \"compressedOriginalBytes\", label: \"Retained\" },\n\t{ key: \"lastCompactedAt\", label: \"Last Compacted\" },\n];\n\n/** Format bytes → MiB/KiB/B (matches html.ts fmtBytesTop). */\nfunction fmtBytesTop(b: number): string {\n\tif (b >= 1_048_576) return `${(b / 1_048_576).toFixed(1)} MiB`;\n\tif (b >= 1024) return `${(b / 1024).toFixed(1)} KiB`;\n\treturn `${b} B`;\n}\n\nfunction formatTs(ts: number | null): string {\n\tif (ts === null || ts === undefined) return \"\\u2014\";\n\ttry {\n\t\treturn new Date(ts).toLocaleString();\n\t} catch {\n\t\treturn String(ts);\n\t}\n}\n\nexport function RepoTable({\n\trepos,\n\tonSelect,\n}: RepoTableProps): React.ReactElement {\n\tconst [search, setSearch] = useState(\"\");\n\tconst [sortKey, setSortKey] = useState<SortKey>(\"lastCompactedAt\");\n\tconst [sortDir, setSortDir] = useState<SortDir>(\"desc\");\n\n\tconst filtered = useMemo(() => {\n\t\tconst q = search.trim().toLowerCase();\n\t\tconst list = q\n\t\t\t? repos.filter((r) => r.displayName.toLowerCase().includes(q))\n\t\t\t: repos.slice();\n\t\tlist.sort((a, b) => {\n\t\t\tconst av = a[sortKey];\n\t\t\tconst bv = b[sortKey];\n\t\t\t// nulls last on desc, first on asc (consistent UX)\n\t\t\tconst aNull = av === null || av === undefined;\n\t\t\tconst bNull = bv === null || bv === undefined;\n\t\t\tif (aNull && bNull) return 0;\n\t\t\tif (aNull) return sortDir === \"desc\" ? 1 : -1;\n\t\t\tif (bNull) return sortDir === \"desc\" ? -1 : 1;\n\t\t\tconst cmp =\n\t\t\t\ttypeof av === \"number\" && typeof bv === \"number\"\n\t\t\t\t\t? av - bv\n\t\t\t\t\t: String(av).localeCompare(String(bv));\n\t\t\treturn sortDir === \"desc\" ? -cmp : cmp;\n\t\t});\n\t\treturn list;\n\t}, [repos, search, sortKey, sortDir]);\n\n\tconst handleSort = (key: SortKey): void => {\n\t\tif (sortKey === key) {\n\t\t\tsetSortDir((d) => (d === \"asc\" ? \"desc\" : \"asc\"));\n\t\t} else {\n\t\t\tsetSortKey(key);\n\t\t\tsetSortDir(\n\t\t\t\tkey === \"lastCompactedAt\" ||\n\t\t\t\tkey === \"tokensSaved\" ||\n\t\t\t\tkey === \"compressedOriginalBytes\"\n\t\t\t\t\t? \"desc\"\n\t\t\t\t\t: \"asc\",\n\t\t\t);\n\t\t}\n\t};\n\n\treturn (\n\t\t<div className=\"repo-table-wrap\">\n\t\t\t<input\n\t\t\t\ttype=\"search\"\n\t\t\t\tclassName=\"repo-search\"\n\t\t\t\tplaceholder=\"Search repos…\"\n\t\t\t\tvalue={search}\n\t\t\t\tonChange={(e) => setSearch(e.target.value)}\n\t\t\t\taria-label=\"Search repos\"\n\t\t\t/>\n\t\t\t<table className=\"repo-table\">\n\t\t\t\t<thead>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t{COLUMNS.map((col) => (\n\t\t\t\t\t\t\t<th key={col.key}>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclassName={`sort-header ${sortKey === col.key ? `active-${sortDir}` : \"\"}`}\n\t\t\t\t\t\t\t\t\tonClick={() => handleSort(col.key)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{col.label}\n\t\t\t\t\t\t\t\t\t{sortKey === col.key && (\n\t\t\t\t\t\t\t\t\t\t<span className=\"sort-arrow\">\n\t\t\t\t\t\t\t\t\t\t\t{sortDir === \"asc\" ? \" ▲\" : \" ▼\"}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</tr>\n\t\t\t\t</thead>\n\t\t\t\t<tbody>\n\t\t\t\t\t{filtered.length === 0 && (\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<td colSpan={COLUMNS.length} className=\"repo-empty\">\n\t\t\t\t\t\t\t\t{repos.length === 0\n\t\t\t\t\t\t\t\t\t? \"No repositories registered yet.\"\n\t\t\t\t\t\t\t\t\t: \"No repos match your search.\"}\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t)}\n\t\t\t\t\t{filtered.map((repo) => (\n\t\t\t\t\t\t<tr key={repo.stateDir} onClick={() => onSelect(repo)}>\n\t\t\t\t\t\t\t<td className=\"repo-name\" title={repo.repoRoot}>\n\t\t\t\t\t\t\t\t{repo.displayName}\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t<td className=\"repo-model\">{repo.modelName ?? \"\\u2014\"}</td>\n\t\t\t\t\t\t\t<td className=\"num\">{repo.checkpointCount.toLocaleString()}</td>\n\t\t\t\t\t\t\t<td className=\"num\">{repo.tokensSaved.toLocaleString()}</td>\n\t\t\t\t\t\t\t<td className=\"num\">{fmtBytesTop(repo.compressedOriginalBytes)}</td>\n\t\t\t\t\t\t\t<td className=\"num\">{formatTs(repo.lastCompactedAt)}</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t))}\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t</div>\n\t);\n}\n","/**\n * dashboard-client/src/components/RepoDetailModal.tsx — repo drill-down.\n *\n * Full detail from an /api/index row: token breakdown (kept/dropped), model\n * info, context window, dedup rate, reasoning flag. Click backdrop to close.\n */\n\nimport type React from \"react\";\nimport { useEffect } from \"react\";\nimport type { IndexesIndexRow } from \"@contracts\";\n\nexport interface RepoDetailModalProps {\n\trepo: IndexesIndexRow;\n\tonClose: () => void;\n}\n\nfunction fmt(n: number): string {\n\tif (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n\tif (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`;\n\treturn String(n);\n}\n\n/** Format bytes → MiB/KiB/B (matches html.ts fmtBytesTop). */\nfunction fmtBytesTop(b: number): string {\n\tif (b >= 1_048_576) return `${(b / 1_048_576).toFixed(1)} MiB`;\n\tif (b >= 1024) return `${(b / 1024).toFixed(1)} KiB`;\n\treturn `${b} B`;\n}\n\nfunction formatTs(ts: number | null): string {\n\tif (ts === null || ts === undefined) return \"never\";\n\ttry {\n\t\treturn new Date(ts).toLocaleString();\n\t} catch {\n\t\treturn String(ts);\n\t}\n}\n\nexport function RepoDetailModal({\n\trepo,\n\tonClose,\n}: RepoDetailModalProps): React.ReactElement {\n\t// Close on Escape key.\n\tuseEffect(() => {\n\t\tconst handler = (e: KeyboardEvent): void => {\n\t\t\tif (e.key === \"Escape\") onClose();\n\t\t};\n\t\twindow.addEventListener(\"keydown\", handler);\n\t\treturn () => window.removeEventListener(\"keydown\", handler);\n\t}, [onClose]);\n\n\treturn (\n\t\t<div\n\t\t\tclassName=\"modal-backdrop\"\n\t\t\tonClick={onClose}\n\t\t\trole=\"dialog\"\n\t\t\taria-modal=\"true\"\n\t\t>\n\t\t\t<div className=\"modal-card\" onClick={(e) => e.stopPropagation()}>\n\t\t\t\t<header className=\"modal-header\">\n\t\t\t\t\t<h2>{repo.displayName}</h2>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName=\"modal-close\"\n\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t\taria-label=\"Close\"\n\t\t\t\t\t>\n\t\t\t\t\t\t×\n\t\t\t\t\t</button>\n\t\t\t\t</header>\n\t\t\t\t<p className=\"modal-path\">{repo.repoRoot}</p>\n\t\t\t\t<div className=\"modal-grid\">\n\t\t\t\t\t<div className=\"modal-stat\">\n\t\t\t\t\t\t<span className=\"modal-label\">Checkpoints</span>\n\t\t\t\t\t\t<span className=\"modal-value\">\n\t\t\t\t\t\t\t{repo.checkpointCount.toLocaleString()}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"modal-stat\">\n\t\t\t\t\t\t<span className=\"modal-label\">Sessions</span>\n\t\t\t\t\t\t<span className=\"modal-value\">\n\t\t\t\t\t\t\t{repo.sessions.toLocaleString()}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"modal-stat modal-highlight\">\n\t\t\t\t\t\t<span className=\"modal-label\">Tokens saved</span>\n\t\t\t\t\t\t<span className=\"modal-value\">{fmt(repo.tokensSaved)}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"modal-stat\">\n\t\t\t\t\t\t<span className=\"modal-label\">Tokens kept</span>\n\t\t\t\t\t\t<span className=\"modal-value\">{fmt(repo.tokensKept)}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"modal-stat\">\n\t\t\t\t\t\t<span className=\"modal-label\">Tokens dropped</span>\n\t\t\t\t\t\t<span className=\"modal-value\">{fmt(repo.tokensDropped)}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"modal-stat\">\n\t\t\t\t\t\t<span className=\"modal-label\">Dedup rate</span>\n\t\t\t\t\t\t<span className=\"modal-value\">—</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<h3>Model</h3>\n\t\t\t\t<dl className=\"modal-dl\">\n\t\t\t\t\t<dt>Provider</dt>\n\t\t\t\t\t<dd>{repo.providerName ?? \"—\"}</dd>\n\t\t\t\t\t<dt>Model</dt>\n\t\t\t\t\t<dd>{repo.modelName ?? \"—\"}</dd>\n\t\t\t\t\t<dt>Input rate</dt>\n\t\t\t\t\t<dd>{repo.inputRate !== null ? `${repo.inputRate} tok/s` : \"—\"}</dd>\n\t\t\t\t\t<dt>Output rate</dt>\n\t\t\t\t\t<dd>{repo.outputRate !== null ? `${repo.outputRate} tok/s` : \"—\"}</dd>\n\t\t\t\t\t<dt>Context window</dt>\n\t\t\t\t\t<dd>{repo.contextWindow !== null ? fmt(repo.contextWindow) : \"—\"}</dd>\n\t\t\t\t\t<dt>Max tokens</dt>\n\t\t\t\t\t<dd>{repo.maxTokens !== null ? fmt(repo.maxTokens) : \"—\"}</dd>\n\t\t\t\t\t<dt>Reasoning</dt>\n\t\t\t\t\t<dd>\n\t\t\t\t\t\t{repo.reasoning === null ? \"—\" : repo.reasoning ? \"on\" : \"off\"}\n\t\t\t\t\t</dd>\n\t\t\t\t</dl>\n\t\t\t\t<h3>Activity</h3>\n\t\t\t\t<dl className=\"modal-dl\">\n\t\t\t\t\t<dt>Last compacted</dt>\n\t\t\t\t\t<dd>{formatTs(repo.lastCompactedAt)}</dd>\n\t\t\t\t\t<dt>Last seen</dt>\n\t\t\t\t\t<dd>{formatTs(repo.lastSeen)}</dd>\n\t\t\t\t\t<dt>Compressed-Original</dt>\n\t\t\t\t\t<dd>{fmtBytesTop(repo.compressedOriginalBytes)}</dd>\n\t\t\t\t</dl>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","/**\n * dashboard-client/src/components/ActiveReposTable.tsx — Active repos table.\n *\n * 9 columns: Repo, Model, Tier, Context %, State, Compactions s/t,\n * Cache Hits s/t, Compact s/t, CacheHit s/t.\n * Data from fetchServers() via useApi with 10s polling.\n */\n\nimport type React from \"react\";\nimport type { ServerEntry } from \"@contracts\";\n\nexport interface ActiveReposTableProps {\n\tservers: ServerEntry[];\n}\n\n/** Format seconds → human-readable duration (matches html.ts fmtSec). */\nfunction fmtSec(s: number | undefined): string {\n\tconst v = s ?? 0;\n\tif (v >= 3600) return `${(v / 3600).toFixed(1)}h`;\n\tif (v >= 60) return `${Math.round(v / 60)}m`;\n\tif (v >= 1) return `${v.toFixed(1)}s`;\n\treturn `${Math.round(v * 1000)}ms`;\n}\n\nconst HEADERS = [\n\t\"Repo\",\n\t\"Model\",\n\t\"Tier\",\n\t\"Context %\",\n\t\"State\",\n\t\"Compactions (s/t)\",\n\t\"Cache Hits (s/t)\",\n\t\"Compact s/t (s)\",\n\t\"CacheHit s/t (s)\",\n] as const;\n\nexport function ActiveReposTable({\n\tservers,\n}: ActiveReposTableProps): React.ReactElement {\n\treturn (\n\t\t<div className=\"active-repos-section\">\n\t\t\t<p className=\"legend-note\">\n\t\t\t\tRepos seen within the last 30 minutes, with their per-repo\n\t\t\t\tcache-hit, compaction, and time-saved (est.) totals pulled live\n\t\t\t\tfrom each repo&apos;s dashboard.json.\n\t\t\t</p>\n\t\t\t<div className=\"table-scroll\">\n\t\t\t\t<table className=\"active-repos-table\">\n\t\t\t\t\t<thead>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t{HEADERS.map((h, i) => (\n\t\t\t\t\t\t\t\t<th\n\t\t\t\t\t\t\t\t\tkey={h}\n\t\t\t\t\t\t\t\t\tclassName={i >= 3 && i !== 4 ? \"num\" : undefined}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{h}\n\t\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</thead>\n\t\t\t\t\t<tbody>\n\t\t\t\t\t\t{servers.length === 0 && (\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td colSpan={9} className=\"repo-empty\">\n\t\t\t\t\t\t\t\t\tNo active repositories.\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{servers.map((r) => {\n\t\t\t\t\t\t\tconst ch = r.cacheHits ?? {\n\t\t\t\t\t\t\t\tsession: 0,\n\t\t\t\t\t\t\t\ttotal: 0,\n\t\t\t\t\t\t\t\tsessionTokensSaved: 0,\n\t\t\t\t\t\t\t\ttotalTokensSaved: 0,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tconst cp = r.compacts ?? { session: 0, total: 0 };\n\t\t\t\t\t\t\tconst ts = r.timeSaved ?? {\n\t\t\t\t\t\t\t\tcompact: { sessionSec: 0, totalSec: 0 },\n\t\t\t\t\t\t\t\tcacheHit: { sessionSec: 0, totalSec: 0 },\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<tr key={r.repoRoot}>\n\t\t\t\t\t\t\t\t\t<td title={r.repoRoot}>\n\t\t\t\t\t\t\t\t\t\t{r.displayName || r.repoRoot}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td>{r.model ?? \"\\u2014\"}</td>\n\t\t\t\t\t\t\t\t\t<td>{r.tier ?? \"\\u2014\"}</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">\n\t\t\t\t\t\t\t\t\t\t{r.contextPct != null\n\t\t\t\t\t\t\t\t\t\t\t? `${Math.round(r.contextPct * 100)}%`\n\t\t\t\t\t\t\t\t\t\t\t: \"\\u2014\"}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td>{r.state ?? \"\\u2014\"}</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">\n\t\t\t\t\t\t\t\t\t\t{cp.session} / {cp.total}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">\n\t\t\t\t\t\t\t\t\t\t{ch.session} / {ch.total}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">\n\t\t\t\t\t\t\t\t\t\t{fmtSec(ts.compact.sessionSec)} /{\" \"}\n\t\t\t\t\t\t\t\t\t\t{fmtSec(ts.compact.totalSec)}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">\n\t\t\t\t\t\t\t\t\t\t{fmtSec(ts.cacheHit.sessionSec)} /{\" \"}\n\t\t\t\t\t\t\t\t\t\t{fmtSec(ts.cacheHit.totalSec)}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t</tbody>\n\t\t\t\t</table>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","/**\n * dashboard-client/src/components/SavingsByModelTable.tsx — Savings by Model.\n *\n * 14 columns aggregated client-side from /api/index repos by model.\n * Replicates html.ts renderByModel logic: group by modelName, accumulate\n * tokens/cost/sessions, collapse numeric ranges when repos disagree.\n */\n\nimport type React from \"react\";\nimport { useMemo } from \"react\";\nimport type { IndexesIndexRow } from \"@contracts\";\n\nexport interface SavingsByModelTableProps {\n\trepos: IndexesIndexRow[];\n}\n\ninterface ModelGroup {\n\tmodel: string;\n\tprovider: string;\n\tcheckpoints: number;\n\ttokensSaved: number;\n\ttokensIn: number;\n\ttokensOut: number;\n\tsessions: number;\n\tusd: number;\n\tinRates: number[];\n\toutRates: number[];\n\tctxWindows: number[];\n\tmaxTokens: number[];\n\treasoning: boolean | null;\n\tlastAt: number;\n}\n\n/** Collapse numeric samples: \"—\" | single | \"lo–hi\" (matches html.ts). */\nfunction collapseNum(samples: number[]): string {\n\tif (!samples.length) return \"\\u2014\";\n\tconst lo = Math.min(...samples);\n\tconst hi = Math.max(...samples);\n\treturn lo === hi\n\t\t? lo.toLocaleString()\n\t\t: `${lo.toLocaleString()}\\u2013${hi.toLocaleString()}`;\n}\n\n/** Collapse rate samples: \"—\" | \"$rate\" | \"$lo–$hi\" (matches html.ts). */\nfunction collapseRate(samples: number[]): string {\n\tif (!samples.length) return \"\\u2014\";\n\tconst lo = Math.min(...samples);\n\tconst hi = Math.max(...samples);\n\tconst fmt = (v: number): string => `$${v.toFixed(6)}`;\n\treturn lo === hi ? fmt(lo) : `${fmt(lo)}\\u2013${fmt(hi)}`;\n}\n\n/** Group repos by model, accumulate totals, sort by tokensSaved desc. */\nfunction aggregate(repos: IndexesIndexRow[]): ModelGroup[] {\n\tconst map: Record<string, ModelGroup> = {};\n\tfor (const r of repos) {\n\t\tconst key = (r.modelName && r.modelName.trim()) || \"(unknown)\";\n\t\tif (!map[key]) {\n\t\t\tmap[key] = {\n\t\t\t\tmodel: key,\n\t\t\t\tprovider: r.providerName ?? r.provider ?? \"\\u2014\",\n\t\t\t\tcheckpoints: 0,\n\t\t\t\ttokensSaved: 0,\n\t\t\t\ttokensIn: 0,\n\t\t\t\ttokensOut: 0,\n\t\t\t\tsessions: 0,\n\t\t\t\tusd: 0,\n\t\t\t\tinRates: [],\n\t\t\t\toutRates: [],\n\t\t\t\tctxWindows: [],\n\t\t\t\tmaxTokens: [],\n\t\t\t\treasoning: null,\n\t\t\t\tlastAt: 0,\n\t\t\t};\n\t\t}\n\t\tconst g = map[key];\n\t\tg.checkpoints += r.checkpointCount || 0;\n\t\tg.tokensSaved += r.tokensSaved || 0;\n\t\tg.tokensIn += r.tokensDropped || 0;\n\t\tg.tokensOut += r.tokensKept || 0;\n\t\tg.sessions += r.sessions || 0;\n\t\tif (r.inputRate) {\n\t\t\tg.usd += (r.tokensSaved || 0) * r.inputRate;\n\t\t\tg.inRates.push(r.inputRate);\n\t\t}\n\t\tif (r.outputRate) g.outRates.push(r.outputRate);\n\t\tif (r.contextWindow) g.ctxWindows.push(r.contextWindow);\n\t\tif (r.maxTokens) g.maxTokens.push(r.maxTokens);\n\t\tif (r.reasoning != null) g.reasoning = r.reasoning;\n\t\tif (r.lastCompactedAt && r.lastCompactedAt > g.lastAt)\n\t\t\tg.lastAt = r.lastCompactedAt;\n\t}\n\treturn Object.values(map).sort((a, b) => b.tokensSaved - a.tokensSaved);\n}\n\n/** Tooltip text copied verbatim from html.ts title attributes. */\nconst TOOLTIPS = {\n\ttokensIn: \"Tokens dropped from context by compaction (the input reclaimed)\",\n\ttokensOut:\n\t\t\"Tokens kept as compacted summaries still in context (the output retained)\",\n\tctxWindow: \"Model context window (max input tokens the model accepts)\",\n\tmaxOut: \"Model max output tokens per turn\",\n\treas: \"Reasoning-capable model\",\n\tsessions: \"Distinct sessions with at least one checkpoint\",\n\tinRate: \"USD per input token\",\n\toutRate: \"USD per output token\",\n} as const;\n\nexport function SavingsByModelTable({\n\trepos,\n}: SavingsByModelTableProps): React.ReactElement {\n\tconst groups = useMemo(() => aggregate(repos), [repos]);\n\n\treturn (\n\t\t<div className=\"savings-by-model\">\n\t\t\t<p className=\"legend-note\">\n\t\t\t\tHow much context &amp; cost mega-compact has reclaimed, grouped by\n\t\t\t\tthe model you were running. Compression ratio reflects\n\t\t\t\tworkload/content, not model quality.\n\t\t\t</p>\n\t\t\t<div className=\"table-scroll\">\n\t\t\t\t<table className=\"savings-table\">\n\t\t\t\t\t<thead>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<th>Model</th>\n\t\t\t\t\t\t\t<th>Provider</th>\n\t\t\t\t\t\t\t<th className=\"num\" title={TOOLTIPS.tokensIn}>\n\t\t\t\t\t\t\t\tTokens In\n\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t<th className=\"num\" title={TOOLTIPS.tokensOut}>\n\t\t\t\t\t\t\t\tTokens Out\n\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t<th className=\"num\">Freed</th>\n\t\t\t\t\t\t\t<th className=\"num\" title={TOOLTIPS.ctxWindow}>\n\t\t\t\t\t\t\t\tCtx Window\n\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t<th className=\"num\" title={TOOLTIPS.maxOut}>\n\t\t\t\t\t\t\t\tMax Out\n\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t<th className=\"num\" title={TOOLTIPS.reas}>\n\t\t\t\t\t\t\t\tReas.\n\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t<th className=\"num\" title={TOOLTIPS.sessions}>\n\t\t\t\t\t\t\t\tSessions\n\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t<th className=\"num\">Checkpoints</th>\n\t\t\t\t\t\t\t<th className=\"num\" title={TOOLTIPS.inRate}>\n\t\t\t\t\t\t\t\tIn $/tok\n\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t<th className=\"num\" title={TOOLTIPS.outRate}>\n\t\t\t\t\t\t\t\tOut $/tok\n\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t<th className=\"num\">$ Saved</th>\n\t\t\t\t\t\t\t<th className=\"num\">Last Used</th>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</thead>\n\t\t\t\t\t<tbody>\n\t\t\t\t\t\t{groups.length === 0 && (\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td colSpan={14} className=\"repo-empty\">\n\t\t\t\t\t\t\t\t\tNo repositories registered yet.\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{groups.map((g) => {\n\t\t\t\t\t\t\tconst freed = (g.tokensIn || 0) - (g.tokensOut || 0);\n\t\t\t\t\t\t\tconst usd =\n\t\t\t\t\t\t\t\tg.usd > 0 ? `$${g.usd.toFixed(4)}` : \"\\u2014\";\n\t\t\t\t\t\t\tconst when = g.lastAt\n\t\t\t\t\t\t\t\t? new Date(g.lastAt).toLocaleString()\n\t\t\t\t\t\t\t\t: \"\\u2014\";\n\t\t\t\t\t\t\tconst reas =\n\t\t\t\t\t\t\t\tg.reasoning == null\n\t\t\t\t\t\t\t\t\t? \"\\u2014\"\n\t\t\t\t\t\t\t\t\t: g.reasoning\n\t\t\t\t\t\t\t\t\t\t? \"yes\"\n\t\t\t\t\t\t\t\t\t\t: \"no\";\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<tr key={g.model}>\n\t\t\t\t\t\t\t\t\t<td className=\"repo-model\">{g.model}</td>\n\t\t\t\t\t\t\t\t\t<td>{g.provider}</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">\n\t\t\t\t\t\t\t\t\t\t{g.tokensIn.toLocaleString()}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">\n\t\t\t\t\t\t\t\t\t\t{g.tokensOut.toLocaleString()}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">\n\t\t\t\t\t\t\t\t\t\t{freed.toLocaleString()}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">\n\t\t\t\t\t\t\t\t\t\t{collapseNum(g.ctxWindows)}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">\n\t\t\t\t\t\t\t\t\t\t{collapseNum(g.maxTokens)}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">{reas}</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">\n\t\t\t\t\t\t\t\t\t\t{g.sessions.toLocaleString()}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">\n\t\t\t\t\t\t\t\t\t\t{g.checkpoints.toLocaleString()}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">\n\t\t\t\t\t\t\t\t\t\t{collapseRate(g.inRates)}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">\n\t\t\t\t\t\t\t\t\t\t{collapseRate(g.outRates)}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">{usd}</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">{when}</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t</tbody>\n\t\t\t\t</table>\n\t\t\t</div>\n\t\t\t<p className=\"legend-note\">\n\t\t\t\tTokens In = Σ original region tokens dropped by compaction. Tokens\n\t\t\t\tOut = Σ compacted summary tokens still retained in context. Freed =\n\t\t\t\tTokens In − Tokens Out (net context reclaimed). Ctx Window / Max Out\n\t\t\t\t/ Reas. come from the latest captured model snapshot for each repo.\n\t\t\t</p>\n\t\t</div>\n\t);\n}\n","/**\n * dashboard-client/src/tabs/ReposTab.tsx — Repos tab (C2 fleshed out).\n *\n * Renders: SummaryTiles (4 tiles), All Repositories table (RepoTable),\n * Active Repos table (ActiveReposTable), Savings by Model table\n * (SavingsByModelTable), and per-repo detail modal (RepoDetailModal).\n *\n * Data sources: fetchIndex() for summary + all repos + savings-by-model;\n * fetchServers() for active repos. Both polled every 10s.\n */\n\nimport type React from \"react\";\nimport { useCallback, useState } from \"react\";\nimport { useApi } from \"../hooks/useApi\";\nimport { fetchIndex, fetchServers } from \"../api/client\";\nimport type { IndexesIndexRow, ServersResponse } from \"@contracts\";\nimport { SummaryTiles } from \"../components/SummaryTiles\";\nimport { RepoTable } from \"../components/RepoTable\";\nimport { RepoDetailModal } from \"../components/RepoDetailModal\";\nimport { ActiveReposTable } from \"../components/ActiveReposTable\";\nimport { SavingsByModelTable } from \"../components/SavingsByModelTable\";\n\n/**\n * Actual runtime shape of /api/index. The contract's IndexesSummaryResponse\n * puts summary fields at the top level, but the real server nests them under\n * `summary` (matching IndexFallbackResponse shape with non-null summary).\n */\ninterface DashboardIndexSummary {\n\ttotalRepos: number;\n\ttotalCheckpoints: number;\n\ttotalTokensSaved: number;\n\ttotalCompressedOriginalBytes: number;\n}\n\ninterface DashboardIndexResponse {\n\tupdatedAt: string | null;\n\tsummary: DashboardIndexSummary | null;\n\trepos: IndexesIndexRow[];\n}\n\n/** Fetch /api/index and cast to the actual runtime shape. */\nasync function fetchIndexTyped(): Promise<DashboardIndexResponse> {\n\treturn (await fetchIndex()) as unknown as DashboardIndexResponse;\n}\n\nexport default function ReposTab(): React.ReactElement {\n\tconst [selected, setSelected] = useState<IndexesIndexRow | null>(null);\n\n\tconst { data: indexData, error: indexErr } =\n\t\tuseApi<DashboardIndexResponse>(\n\t\t\tuseCallback(() => fetchIndexTyped(), []),\n\t\t\t{ pollInterval: 10_000 },\n\t\t);\n\n\tconst { data: serversData } = useApi<ServersResponse>(\n\t\tuseCallback(() => fetchServers(), []),\n\t\t{ pollInterval: 10_000 },\n\t);\n\n\tif (indexErr && !indexData) {\n\t\treturn (\n\t\t\t<div className=\"tab-stub\">Error loading repos: {indexErr.message}</div>\n\t\t);\n\t}\n\tif (!indexData) {\n\t\treturn <div className=\"tab-stub\">Loading repos…</div>;\n\t}\n\n\tconst summary = indexData.summary;\n\tconst repos = indexData.repos;\n\tconst servers = serversData?.servers ?? [];\n\n\treturn (\n\t\t<div className=\"repos-tab\">\n\t\t\t<SummaryTiles\n\t\t\t\ttotalRepos={summary?.totalRepos ?? 0}\n\t\t\t\ttotalCheckpoints={summary?.totalCheckpoints ?? 0}\n\t\t\t\ttotalTokensSaved={summary?.totalTokensSaved ?? 0}\n\t\t\t\tcompressedOriginalBytes={summary?.totalCompressedOriginalBytes ?? 0}\n\t\t\t/>\n\t\t\t<h2 className=\"section-header\">All Repositories</h2>\n\t\t\t<RepoTable repos={repos} onSelect={setSelected} />\n\t\t\t<h2 className=\"section-header\">\n\t\t\t\tActive Repos — Live Cache Hits &amp; Compactions\n\t\t\t</h2>\n\t\t\t<ActiveReposTable servers={servers} />\n\t\t\t<h2 className=\"section-header\">Savings by Model</h2>\n\t\t\t<SavingsByModelTable repos={repos} />\n\t\t\t{selected && (\n\t\t\t\t<RepoDetailModal repo={selected} onClose={() => setSelected(null)} />\n\t\t\t)}\n\t\t</div>\n\t);\n}\n"],"names":["fmtBytesTop","b","fmt","n","SummaryTiles","totalRepos","totalCheckpoints","totalTokensSaved","compressedOriginalBytes","jsxs","jsx","COLUMNS","formatTs","ts","RepoTable","repos","onSelect","search","setSearch","useState","sortKey","setSortKey","sortDir","setSortDir","filtered","useMemo","q","list","r","a","av","bv","aNull","bNull","cmp","handleSort","key","d","e","col","repo","RepoDetailModal","onClose","useEffect","handler","fmtSec","v","HEADERS","ActiveReposTable","servers","h","i","ch","cp","collapseNum","samples","lo","hi","collapseRate","aggregate","map","g","TOOLTIPS","SavingsByModelTable","groups","freed","usd","when","reas","fetchIndexTyped","fetchIndex","ReposTab","selected","setSelected","indexData","indexErr","useApi","useCallback","serversData","fetchServers","summary"],"mappings":"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"}
1
+ {"version":3,"file":"ReposTab-_3R4RSLZ.js","sources":["../../src/components/SummaryTiles.tsx","../../src/components/RepoTable.tsx","../../src/components/RepoDetailModal.tsx","../../src/components/ActiveReposTable.tsx","../../src/components/SavingsByModelTable.tsx","../../src/tabs/ReposTab.tsx"],"sourcesContent":["/**\n * dashboard-client/src/components/SummaryTiles.tsx — aggregate header tiles.\n *\n * 4 tiles: Repositories, Total Checkpoints, Total Tokens Saved,\n * Compressed-Original. Matches old dashboard #panel-summary tiles.\n */\n\nimport type React from \"react\";\n\nexport interface SummaryTilesProps {\n\t/** Total repos in the registry. */\n\ttotalRepos: number;\n\t/** Total checkpoints across all repos. */\n\ttotalCheckpoints: number;\n\t/** Total tokens saved across all repos. */\n\ttotalTokensSaved: number;\n\t/** Total compressed-original bytes across all repos. */\n\tcompressedOriginalBytes: number;\n}\n\n/** Format bytes → MiB/KiB/B (matches html.ts fmtBytesTop). */\nfunction fmtBytesTop(b: number): string {\n\tif (b >= 1_048_576) return `${(b / 1_048_576).toFixed(1)} MiB`;\n\tif (b >= 1024) return `${(b / 1024).toFixed(1)} KiB`;\n\treturn `${b} B`;\n}\n\n/** Format large numbers with K/M suffix. */\nfunction fmt(n: number): string {\n\tif (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n\tif (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`;\n\treturn String(n);\n}\n\nexport function SummaryTiles({\n\ttotalRepos,\n\ttotalCheckpoints,\n\ttotalTokensSaved,\n\tcompressedOriginalBytes,\n}: SummaryTilesProps): React.ReactElement {\n\treturn (\n\t\t<div className=\"summary-tiles\">\n\t\t\t<div className=\"tile\">\n\t\t\t\t<span className=\"tile-label\">Repositories</span>\n\t\t\t\t<span className=\"tile-value\">{totalRepos.toLocaleString()}</span>\n\t\t\t</div>\n\t\t\t<div className=\"tile\">\n\t\t\t\t<span className=\"tile-label\">Total Checkpoints</span>\n\t\t\t\t<span className=\"tile-value\">{totalCheckpoints.toLocaleString()}</span>\n\t\t\t</div>\n\t\t\t<div className=\"tile tile-highlight\">\n\t\t\t\t<span className=\"tile-label\">Total Tokens Saved</span>\n\t\t\t\t<span className=\"tile-value\">{fmt(totalTokensSaved)}</span>\n\t\t\t</div>\n\t\t\t<div className=\"tile\">\n\t\t\t\t<span className=\"tile-label\">Compressed-Original</span>\n\t\t\t\t<span className=\"tile-value\">{fmtBytesTop(compressedOriginalBytes)}</span>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","/**\n * dashboard-client/src/components/RepoTable.tsx — sortable, searchable repo table.\n *\n * 6 columns: Repo, Model, Checkpoints, Tokens Saved, Retained, Last Compacted.\n * Client-side sort (click header to toggle asc/desc). Search by displayName\n * (case-insensitive substring). Default sort: Last Compacted DESC.\n * Row click opens RepoDetailModal.\n */\n\nimport type React from \"react\";\nimport { useState, useMemo } from \"react\";\nimport type { IndexesIndexRow } from \"@contracts\";\n\nexport interface RepoTableProps {\n\trepos: IndexesIndexRow[];\n\t/** Called when a row is clicked — opens the detail modal. */\n\tonSelect: (repo: IndexesIndexRow) => void;\n}\n\ntype SortKey =\n\t| \"displayName\"\n\t| \"modelName\"\n\t| \"checkpointCount\"\n\t| \"tokensSaved\"\n\t| \"compressedOriginalBytes\"\n\t| \"lastCompactedAt\";\n\ntype SortDir = \"asc\" | \"desc\";\n\nconst COLUMNS: Array<{ key: SortKey; label: string }> = [\n\t{ key: \"displayName\", label: \"Repo\" },\n\t{ key: \"modelName\", label: \"Model\" },\n\t{ key: \"checkpointCount\", label: \"Checkpoints\" },\n\t{ key: \"tokensSaved\", label: \"Tokens Saved\" },\n\t{ key: \"compressedOriginalBytes\", label: \"Retained\" },\n\t{ key: \"lastCompactedAt\", label: \"Last Compacted\" },\n];\n\n/** Format bytes → MiB/KiB/B (matches html.ts fmtBytesTop). */\nfunction fmtBytesTop(b: number): string {\n\tif (b >= 1_048_576) return `${(b / 1_048_576).toFixed(1)} MiB`;\n\tif (b >= 1024) return `${(b / 1024).toFixed(1)} KiB`;\n\treturn `${b} B`;\n}\n\nfunction formatTs(ts: number | null): string {\n\tif (ts === null || ts === undefined) return \"\\u2014\";\n\ttry {\n\t\treturn new Date(ts).toLocaleString();\n\t} catch {\n\t\treturn String(ts);\n\t}\n}\n\nexport function RepoTable({\n\trepos,\n\tonSelect,\n}: RepoTableProps): React.ReactElement {\n\tconst [search, setSearch] = useState(\"\");\n\tconst [sortKey, setSortKey] = useState<SortKey>(\"lastCompactedAt\");\n\tconst [sortDir, setSortDir] = useState<SortDir>(\"desc\");\n\n\tconst filtered = useMemo(() => {\n\t\tconst q = search.trim().toLowerCase();\n\t\tconst list = q\n\t\t\t? repos.filter((r) => r.displayName.toLowerCase().includes(q))\n\t\t\t: repos.slice();\n\t\tlist.sort((a, b) => {\n\t\t\tconst av = a[sortKey];\n\t\t\tconst bv = b[sortKey];\n\t\t\t// nulls last on desc, first on asc (consistent UX)\n\t\t\tconst aNull = av === null || av === undefined;\n\t\t\tconst bNull = bv === null || bv === undefined;\n\t\t\tif (aNull && bNull) return 0;\n\t\t\tif (aNull) return sortDir === \"desc\" ? 1 : -1;\n\t\t\tif (bNull) return sortDir === \"desc\" ? -1 : 1;\n\t\t\tconst cmp =\n\t\t\t\ttypeof av === \"number\" && typeof bv === \"number\"\n\t\t\t\t\t? av - bv\n\t\t\t\t\t: String(av).localeCompare(String(bv));\n\t\t\treturn sortDir === \"desc\" ? -cmp : cmp;\n\t\t});\n\t\treturn list;\n\t}, [repos, search, sortKey, sortDir]);\n\n\tconst handleSort = (key: SortKey): void => {\n\t\tif (sortKey === key) {\n\t\t\tsetSortDir((d) => (d === \"asc\" ? \"desc\" : \"asc\"));\n\t\t} else {\n\t\t\tsetSortKey(key);\n\t\t\tsetSortDir(\n\t\t\t\tkey === \"lastCompactedAt\" ||\n\t\t\t\tkey === \"tokensSaved\" ||\n\t\t\t\tkey === \"compressedOriginalBytes\"\n\t\t\t\t\t? \"desc\"\n\t\t\t\t\t: \"asc\",\n\t\t\t);\n\t\t}\n\t};\n\n\treturn (\n\t\t<div className=\"repo-table-wrap\">\n\t\t\t<input\n\t\t\t\ttype=\"search\"\n\t\t\t\tclassName=\"repo-search\"\n\t\t\t\tplaceholder=\"Search repos…\"\n\t\t\t\tvalue={search}\n\t\t\t\tonChange={(e) => setSearch(e.target.value)}\n\t\t\t\taria-label=\"Search repos\"\n\t\t\t/>\n\t\t\t<table className=\"repo-table\">\n\t\t\t\t<thead>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t{COLUMNS.map((col) => (\n\t\t\t\t\t\t\t<th key={col.key}>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclassName={`sort-header ${sortKey === col.key ? `active-${sortDir}` : \"\"}`}\n\t\t\t\t\t\t\t\t\tonClick={() => handleSort(col.key)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{col.label}\n\t\t\t\t\t\t\t\t\t{sortKey === col.key && (\n\t\t\t\t\t\t\t\t\t\t<span className=\"sort-arrow\">\n\t\t\t\t\t\t\t\t\t\t\t{sortDir === \"asc\" ? \" ▲\" : \" ▼\"}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</tr>\n\t\t\t\t</thead>\n\t\t\t\t<tbody>\n\t\t\t\t\t{filtered.length === 0 && (\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<td colSpan={COLUMNS.length} className=\"repo-empty\">\n\t\t\t\t\t\t\t\t{repos.length === 0\n\t\t\t\t\t\t\t\t\t? \"No repositories registered yet.\"\n\t\t\t\t\t\t\t\t\t: \"No repos match your search.\"}\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t)}\n\t\t\t\t\t{filtered.map((repo) => (\n\t\t\t\t\t\t<tr key={repo.stateDir} onClick={() => onSelect(repo)}>\n\t\t\t\t\t\t\t<td className=\"repo-name\" title={repo.repoRoot}>\n\t\t\t\t\t\t\t\t{repo.displayName}\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t<td className=\"repo-model\">{repo.modelName ?? \"\\u2014\"}</td>\n\t\t\t\t\t\t\t<td className=\"num\">{repo.checkpointCount.toLocaleString()}</td>\n\t\t\t\t\t\t\t<td className=\"num\">{repo.tokensSaved.toLocaleString()}</td>\n\t\t\t\t\t\t\t<td className=\"num\">{fmtBytesTop(repo.compressedOriginalBytes)}</td>\n\t\t\t\t\t\t\t<td className=\"num\">{formatTs(repo.lastCompactedAt)}</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t))}\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t</div>\n\t);\n}\n","/**\n * dashboard-client/src/components/RepoDetailModal.tsx — repo drill-down.\n *\n * Full detail from an /api/index row: token breakdown (kept/dropped), model\n * info, context window, dedup rate, reasoning flag. Click backdrop to close.\n */\n\nimport type React from \"react\";\nimport { useEffect } from \"react\";\nimport type { IndexesIndexRow } from \"@contracts\";\n\nexport interface RepoDetailModalProps {\n\trepo: IndexesIndexRow;\n\tonClose: () => void;\n}\n\nfunction fmt(n: number): string {\n\tif (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n\tif (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`;\n\treturn String(n);\n}\n\n/** Format bytes → MiB/KiB/B (matches html.ts fmtBytesTop). */\nfunction fmtBytesTop(b: number): string {\n\tif (b >= 1_048_576) return `${(b / 1_048_576).toFixed(1)} MiB`;\n\tif (b >= 1024) return `${(b / 1024).toFixed(1)} KiB`;\n\treturn `${b} B`;\n}\n\nfunction formatTs(ts: number | null): string {\n\tif (ts === null || ts === undefined) return \"never\";\n\ttry {\n\t\treturn new Date(ts).toLocaleString();\n\t} catch {\n\t\treturn String(ts);\n\t}\n}\n\nexport function RepoDetailModal({\n\trepo,\n\tonClose,\n}: RepoDetailModalProps): React.ReactElement {\n\t// Close on Escape key.\n\tuseEffect(() => {\n\t\tconst handler = (e: KeyboardEvent): void => {\n\t\t\tif (e.key === \"Escape\") onClose();\n\t\t};\n\t\twindow.addEventListener(\"keydown\", handler);\n\t\treturn () => window.removeEventListener(\"keydown\", handler);\n\t}, [onClose]);\n\n\treturn (\n\t\t<div\n\t\t\tclassName=\"modal-backdrop\"\n\t\t\tonClick={onClose}\n\t\t\trole=\"dialog\"\n\t\t\taria-modal=\"true\"\n\t\t>\n\t\t\t<div className=\"modal-card\" onClick={(e) => e.stopPropagation()}>\n\t\t\t\t<header className=\"modal-header\">\n\t\t\t\t\t<h2>{repo.displayName}</h2>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName=\"modal-close\"\n\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t\taria-label=\"Close\"\n\t\t\t\t\t>\n\t\t\t\t\t\t×\n\t\t\t\t\t</button>\n\t\t\t\t</header>\n\t\t\t\t<p className=\"modal-path\">{repo.repoRoot}</p>\n\t\t\t\t<div className=\"modal-grid\">\n\t\t\t\t\t<div className=\"modal-stat\">\n\t\t\t\t\t\t<span className=\"modal-label\">Checkpoints</span>\n\t\t\t\t\t\t<span className=\"modal-value\">\n\t\t\t\t\t\t\t{repo.checkpointCount.toLocaleString()}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"modal-stat\">\n\t\t\t\t\t\t<span className=\"modal-label\">Sessions</span>\n\t\t\t\t\t\t<span className=\"modal-value\">\n\t\t\t\t\t\t\t{repo.sessions.toLocaleString()}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"modal-stat modal-highlight\">\n\t\t\t\t\t\t<span className=\"modal-label\">Tokens saved</span>\n\t\t\t\t\t\t<span className=\"modal-value\">{fmt(repo.tokensSaved)}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"modal-stat\">\n\t\t\t\t\t\t<span className=\"modal-label\">Tokens kept</span>\n\t\t\t\t\t\t<span className=\"modal-value\">{fmt(repo.tokensKept)}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"modal-stat\">\n\t\t\t\t\t\t<span className=\"modal-label\">Tokens dropped</span>\n\t\t\t\t\t\t<span className=\"modal-value\">{fmt(repo.tokensDropped)}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"modal-stat\">\n\t\t\t\t\t\t<span className=\"modal-label\">Dedup rate</span>\n\t\t\t\t\t\t<span className=\"modal-value\">—</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<h3>Model</h3>\n\t\t\t\t<dl className=\"modal-dl\">\n\t\t\t\t\t<dt>Provider</dt>\n\t\t\t\t\t<dd>{repo.providerName ?? \"—\"}</dd>\n\t\t\t\t\t<dt>Model</dt>\n\t\t\t\t\t<dd>{repo.modelName ?? \"—\"}</dd>\n\t\t\t\t\t<dt>Input rate</dt>\n\t\t\t\t\t<dd>{repo.inputRate !== null ? `${repo.inputRate} tok/s` : \"—\"}</dd>\n\t\t\t\t\t<dt>Output rate</dt>\n\t\t\t\t\t<dd>{repo.outputRate !== null ? `${repo.outputRate} tok/s` : \"—\"}</dd>\n\t\t\t\t\t<dt>Context window</dt>\n\t\t\t\t\t<dd>{repo.contextWindow !== null ? fmt(repo.contextWindow) : \"—\"}</dd>\n\t\t\t\t\t<dt>Max tokens</dt>\n\t\t\t\t\t<dd>{repo.maxTokens !== null ? fmt(repo.maxTokens) : \"—\"}</dd>\n\t\t\t\t\t<dt>Reasoning</dt>\n\t\t\t\t\t<dd>\n\t\t\t\t\t\t{repo.reasoning === null ? \"—\" : repo.reasoning ? \"on\" : \"off\"}\n\t\t\t\t\t</dd>\n\t\t\t\t</dl>\n\t\t\t\t<h3>Activity</h3>\n\t\t\t\t<dl className=\"modal-dl\">\n\t\t\t\t\t<dt>Last compacted</dt>\n\t\t\t\t\t<dd>{formatTs(repo.lastCompactedAt)}</dd>\n\t\t\t\t\t<dt>Last seen</dt>\n\t\t\t\t\t<dd>{formatTs(repo.lastSeen)}</dd>\n\t\t\t\t\t<dt>Compressed-Original</dt>\n\t\t\t\t\t<dd>{fmtBytesTop(repo.compressedOriginalBytes)}</dd>\n\t\t\t\t</dl>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","/**\n * dashboard-client/src/components/ActiveReposTable.tsx — Active repos table.\n *\n * 9 columns: Repo, Model, Tier, Context %, State, Compactions s/t,\n * Cache Hits s/t, Compact s/t, CacheHit s/t.\n * Data from fetchServers() via useApi with 10s polling.\n */\n\nimport type React from \"react\";\nimport type { ServerEntry } from \"@contracts\";\n\nexport interface ActiveReposTableProps {\n\tservers: ServerEntry[];\n}\n\n/** Format seconds → human-readable duration (matches html.ts fmtSec). */\nfunction fmtSec(s: number | undefined): string {\n\tconst v = s ?? 0;\n\tif (v >= 3600) return `${(v / 3600).toFixed(1)}h`;\n\tif (v >= 60) return `${Math.round(v / 60)}m`;\n\tif (v >= 1) return `${v.toFixed(1)}s`;\n\treturn `${Math.round(v * 1000)}ms`;\n}\n\nconst HEADERS = [\n\t\"Repo\",\n\t\"Model\",\n\t\"Tier\",\n\t\"Context %\",\n\t\"State\",\n\t\"Compactions (s/t)\",\n\t\"Cache Hits (s/t)\",\n\t\"Compact s/t (s)\",\n\t\"CacheHit s/t (s)\",\n] as const;\n\nexport function ActiveReposTable({\n\tservers,\n}: ActiveReposTableProps): React.ReactElement {\n\treturn (\n\t\t<div className=\"active-repos-section\">\n\t\t\t<p className=\"legend-note\">\n\t\t\t\tRepos seen within the last 30 minutes, with their per-repo\n\t\t\t\tcache-hit, compaction, and time-saved (est.) totals pulled live\n\t\t\t\tfrom each repo&apos;s dashboard.json.\n\t\t\t</p>\n\t\t\t<div className=\"table-scroll\">\n\t\t\t\t<table className=\"active-repos-table\">\n\t\t\t\t\t<thead>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t{HEADERS.map((h, i) => (\n\t\t\t\t\t\t\t\t<th\n\t\t\t\t\t\t\t\t\tkey={h}\n\t\t\t\t\t\t\t\t\tclassName={i >= 3 && i !== 4 ? \"num\" : undefined}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{h}\n\t\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</thead>\n\t\t\t\t\t<tbody>\n\t\t\t\t\t\t{servers.length === 0 && (\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td colSpan={9} className=\"repo-empty\">\n\t\t\t\t\t\t\t\t\tNo active repositories.\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{servers.map((r) => {\n\t\t\t\t\t\t\tconst ch = r.cacheHits ?? {\n\t\t\t\t\t\t\t\tsession: 0,\n\t\t\t\t\t\t\t\ttotal: 0,\n\t\t\t\t\t\t\t\tsessionTokensSaved: 0,\n\t\t\t\t\t\t\t\ttotalTokensSaved: 0,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tconst cp = r.compacts ?? { session: 0, total: 0 };\n\t\t\t\t\t\t\tconst ts = r.timeSaved ?? {\n\t\t\t\t\t\t\t\tcompact: { sessionSec: 0, totalSec: 0 },\n\t\t\t\t\t\t\t\tcacheHit: { sessionSec: 0, totalSec: 0 },\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<tr key={r.repoRoot}>\n\t\t\t\t\t\t\t\t\t<td title={r.repoRoot}>\n\t\t\t\t\t\t\t\t\t\t{r.displayName || r.repoRoot}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td>{r.model ?? \"\\u2014\"}</td>\n\t\t\t\t\t\t\t\t\t<td>{r.tier ?? \"\\u2014\"}</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">\n\t\t\t\t\t\t\t\t\t\t{r.contextPct != null\n\t\t\t\t\t\t\t\t\t\t\t? `${Math.round(r.contextPct * 100)}%`\n\t\t\t\t\t\t\t\t\t\t\t: \"\\u2014\"}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td>{r.state ?? \"\\u2014\"}</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">\n\t\t\t\t\t\t\t\t\t\t{cp.session} / {cp.total}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">\n\t\t\t\t\t\t\t\t\t\t{ch.session} / {ch.total}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">\n\t\t\t\t\t\t\t\t\t\t{fmtSec(ts.compact.sessionSec)} /{\" \"}\n\t\t\t\t\t\t\t\t\t\t{fmtSec(ts.compact.totalSec)}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">\n\t\t\t\t\t\t\t\t\t\t{fmtSec(ts.cacheHit.sessionSec)} /{\" \"}\n\t\t\t\t\t\t\t\t\t\t{fmtSec(ts.cacheHit.totalSec)}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t</tbody>\n\t\t\t\t</table>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","/**\n * dashboard-client/src/components/SavingsByModelTable.tsx — Savings by Model.\n *\n * 14 columns aggregated client-side from /api/index repos by model.\n * Replicates html.ts renderByModel logic: group by modelName, accumulate\n * tokens/cost/sessions, collapse numeric ranges when repos disagree.\n */\n\nimport type React from \"react\";\nimport { useMemo } from \"react\";\nimport type { IndexesIndexRow } from \"@contracts\";\n\nexport interface SavingsByModelTableProps {\n\trepos: IndexesIndexRow[];\n}\n\ninterface ModelGroup {\n\tmodel: string;\n\tprovider: string;\n\tcheckpoints: number;\n\ttokensSaved: number;\n\ttokensIn: number;\n\ttokensOut: number;\n\tsessions: number;\n\tusd: number;\n\tinRates: number[];\n\toutRates: number[];\n\tctxWindows: number[];\n\tmaxTokens: number[];\n\treasoning: boolean | null;\n\tlastAt: number;\n}\n\n/** Collapse numeric samples: \"—\" | single | \"lo–hi\" (matches html.ts). */\nfunction collapseNum(samples: number[]): string {\n\tif (!samples.length) return \"\\u2014\";\n\tconst lo = Math.min(...samples);\n\tconst hi = Math.max(...samples);\n\treturn lo === hi\n\t\t? lo.toLocaleString()\n\t\t: `${lo.toLocaleString()}\\u2013${hi.toLocaleString()}`;\n}\n\n/** Collapse rate samples: \"—\" | \"$rate\" | \"$lo–$hi\" (matches html.ts). */\nfunction collapseRate(samples: number[]): string {\n\tif (!samples.length) return \"\\u2014\";\n\tconst lo = Math.min(...samples);\n\tconst hi = Math.max(...samples);\n\tconst fmt = (v: number): string => `$${v.toFixed(6)}`;\n\treturn lo === hi ? fmt(lo) : `${fmt(lo)}\\u2013${fmt(hi)}`;\n}\n\n/** Group repos by model, accumulate totals, sort by tokensSaved desc. */\nfunction aggregate(repos: IndexesIndexRow[]): ModelGroup[] {\n\tconst map: Record<string, ModelGroup> = {};\n\tfor (const r of repos) {\n\t\tconst key = (r.modelName && r.modelName.trim()) || \"(unknown)\";\n\t\tif (!map[key]) {\n\t\t\tmap[key] = {\n\t\t\t\tmodel: key,\n\t\t\t\tprovider: r.providerName ?? r.provider ?? \"\\u2014\",\n\t\t\t\tcheckpoints: 0,\n\t\t\t\ttokensSaved: 0,\n\t\t\t\ttokensIn: 0,\n\t\t\t\ttokensOut: 0,\n\t\t\t\tsessions: 0,\n\t\t\t\tusd: 0,\n\t\t\t\tinRates: [],\n\t\t\t\toutRates: [],\n\t\t\t\tctxWindows: [],\n\t\t\t\tmaxTokens: [],\n\t\t\t\treasoning: null,\n\t\t\t\tlastAt: 0,\n\t\t\t};\n\t\t}\n\t\tconst g = map[key];\n\t\tg.checkpoints += r.checkpointCount || 0;\n\t\tg.tokensSaved += r.tokensSaved || 0;\n\t\tg.tokensIn += r.tokensDropped || 0;\n\t\tg.tokensOut += r.tokensKept || 0;\n\t\tg.sessions += r.sessions || 0;\n\t\tif (r.inputRate) {\n\t\t\tg.usd += (r.tokensSaved || 0) * r.inputRate;\n\t\t\tg.inRates.push(r.inputRate);\n\t\t}\n\t\tif (r.outputRate) g.outRates.push(r.outputRate);\n\t\tif (r.contextWindow) g.ctxWindows.push(r.contextWindow);\n\t\tif (r.maxTokens) g.maxTokens.push(r.maxTokens);\n\t\tif (r.reasoning != null) g.reasoning = r.reasoning;\n\t\tif (r.lastCompactedAt && r.lastCompactedAt > g.lastAt)\n\t\t\tg.lastAt = r.lastCompactedAt;\n\t}\n\treturn Object.values(map).sort((a, b) => b.tokensSaved - a.tokensSaved);\n}\n\n/** Tooltip text copied verbatim from html.ts title attributes. */\nconst TOOLTIPS = {\n\ttokensIn: \"Tokens dropped from context by compaction (the input reclaimed)\",\n\ttokensOut:\n\t\t\"Tokens kept as compacted summaries still in context (the output retained)\",\n\tctxWindow: \"Model context window (max input tokens the model accepts)\",\n\tmaxOut: \"Model max output tokens per turn\",\n\treas: \"Reasoning-capable model\",\n\tsessions: \"Distinct sessions with at least one checkpoint\",\n\tinRate: \"USD per input token\",\n\toutRate: \"USD per output token\",\n} as const;\n\nexport function SavingsByModelTable({\n\trepos,\n}: SavingsByModelTableProps): React.ReactElement {\n\tconst groups = useMemo(() => aggregate(repos), [repos]);\n\n\treturn (\n\t\t<div className=\"savings-by-model\">\n\t\t\t<p className=\"legend-note\">\n\t\t\t\tHow much context &amp; cost mega-compact has reclaimed, grouped by\n\t\t\t\tthe model you were running. Compression ratio reflects\n\t\t\t\tworkload/content, not model quality.\n\t\t\t</p>\n\t\t\t<div className=\"table-scroll\">\n\t\t\t\t<table className=\"savings-table\">\n\t\t\t\t\t<thead>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<th>Model</th>\n\t\t\t\t\t\t\t<th>Provider</th>\n\t\t\t\t\t\t\t<th className=\"num\" title={TOOLTIPS.tokensIn}>\n\t\t\t\t\t\t\t\tTokens In\n\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t<th className=\"num\" title={TOOLTIPS.tokensOut}>\n\t\t\t\t\t\t\t\tTokens Out\n\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t<th className=\"num\">Freed</th>\n\t\t\t\t\t\t\t<th className=\"num\" title={TOOLTIPS.ctxWindow}>\n\t\t\t\t\t\t\t\tCtx Window\n\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t<th className=\"num\" title={TOOLTIPS.maxOut}>\n\t\t\t\t\t\t\t\tMax Out\n\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t<th className=\"num\" title={TOOLTIPS.reas}>\n\t\t\t\t\t\t\t\tReas.\n\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t<th className=\"num\" title={TOOLTIPS.sessions}>\n\t\t\t\t\t\t\t\tSessions\n\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t<th className=\"num\">Checkpoints</th>\n\t\t\t\t\t\t\t<th className=\"num\" title={TOOLTIPS.inRate}>\n\t\t\t\t\t\t\t\tIn $/tok\n\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t<th className=\"num\" title={TOOLTIPS.outRate}>\n\t\t\t\t\t\t\t\tOut $/tok\n\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t<th className=\"num\">$ Saved</th>\n\t\t\t\t\t\t\t<th className=\"num\">Last Used</th>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</thead>\n\t\t\t\t\t<tbody>\n\t\t\t\t\t\t{groups.length === 0 && (\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td colSpan={14} className=\"repo-empty\">\n\t\t\t\t\t\t\t\t\tNo repositories registered yet.\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{groups.map((g) => {\n\t\t\t\t\t\t\tconst freed = (g.tokensIn || 0) - (g.tokensOut || 0);\n\t\t\t\t\t\t\tconst usd =\n\t\t\t\t\t\t\t\tg.usd > 0 ? `$${g.usd.toFixed(4)}` : \"\\u2014\";\n\t\t\t\t\t\t\tconst when = g.lastAt\n\t\t\t\t\t\t\t\t? new Date(g.lastAt).toLocaleString()\n\t\t\t\t\t\t\t\t: \"\\u2014\";\n\t\t\t\t\t\t\tconst reas =\n\t\t\t\t\t\t\t\tg.reasoning == null\n\t\t\t\t\t\t\t\t\t? \"\\u2014\"\n\t\t\t\t\t\t\t\t\t: g.reasoning\n\t\t\t\t\t\t\t\t\t\t? \"yes\"\n\t\t\t\t\t\t\t\t\t\t: \"no\";\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<tr key={g.model}>\n\t\t\t\t\t\t\t\t\t<td className=\"repo-model\">{g.model}</td>\n\t\t\t\t\t\t\t\t\t<td>{g.provider}</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">\n\t\t\t\t\t\t\t\t\t\t{g.tokensIn.toLocaleString()}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">\n\t\t\t\t\t\t\t\t\t\t{g.tokensOut.toLocaleString()}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">\n\t\t\t\t\t\t\t\t\t\t{freed.toLocaleString()}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">\n\t\t\t\t\t\t\t\t\t\t{collapseNum(g.ctxWindows)}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">\n\t\t\t\t\t\t\t\t\t\t{collapseNum(g.maxTokens)}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">{reas}</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">\n\t\t\t\t\t\t\t\t\t\t{g.sessions.toLocaleString()}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">\n\t\t\t\t\t\t\t\t\t\t{g.checkpoints.toLocaleString()}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">\n\t\t\t\t\t\t\t\t\t\t{collapseRate(g.inRates)}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">\n\t\t\t\t\t\t\t\t\t\t{collapseRate(g.outRates)}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">{usd}</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">{when}</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t</tbody>\n\t\t\t\t</table>\n\t\t\t</div>\n\t\t\t<p className=\"legend-note\">\n\t\t\t\tTokens In = Σ original region tokens dropped by compaction. Tokens\n\t\t\t\tOut = Σ compacted summary tokens still retained in context. Freed =\n\t\t\t\tTokens In − Tokens Out (net context reclaimed). Ctx Window / Max Out\n\t\t\t\t/ Reas. come from the latest captured model snapshot for each repo.\n\t\t\t</p>\n\t\t</div>\n\t);\n}\n","/**\n * dashboard-client/src/tabs/ReposTab.tsx — Repos tab (C2 fleshed out).\n *\n * Renders: SummaryTiles (4 tiles), All Repositories table (RepoTable),\n * Active Repos table (ActiveReposTable), Savings by Model table\n * (SavingsByModelTable), and per-repo detail modal (RepoDetailModal).\n *\n * Data sources: fetchIndex() for summary + all repos + savings-by-model;\n * fetchServers() for active repos. Both polled every 10s.\n */\n\nimport type React from \"react\";\nimport { useCallback, useState } from \"react\";\nimport { useApi } from \"../hooks/useApi\";\nimport { fetchIndex, fetchServers } from \"../api/client\";\nimport type { IndexesIndexRow, ServersResponse } from \"@contracts\";\nimport { SummaryTiles } from \"../components/SummaryTiles\";\nimport { RepoTable } from \"../components/RepoTable\";\nimport { RepoDetailModal } from \"../components/RepoDetailModal\";\nimport { ActiveReposTable } from \"../components/ActiveReposTable\";\nimport { SavingsByModelTable } from \"../components/SavingsByModelTable\";\n\n/**\n * Actual runtime shape of /api/index. The contract's IndexesSummaryResponse\n * puts summary fields at the top level, but the real server nests them under\n * `summary` (matching IndexFallbackResponse shape with non-null summary).\n */\ninterface DashboardIndexSummary {\n\ttotalRepos: number;\n\ttotalCheckpoints: number;\n\ttotalTokensSaved: number;\n\ttotalCompressedOriginalBytes: number;\n}\n\ninterface DashboardIndexResponse {\n\tupdatedAt: string | null;\n\tsummary: DashboardIndexSummary | null;\n\trepos: IndexesIndexRow[];\n}\n\n/** Fetch /api/index and cast to the actual runtime shape. */\nasync function fetchIndexTyped(): Promise<DashboardIndexResponse> {\n\treturn (await fetchIndex()) as unknown as DashboardIndexResponse;\n}\n\nexport default function ReposTab(): React.ReactElement {\n\tconst [selected, setSelected] = useState<IndexesIndexRow | null>(null);\n\n\tconst { data: indexData, error: indexErr } =\n\t\tuseApi<DashboardIndexResponse>(\n\t\t\tuseCallback(() => fetchIndexTyped(), []),\n\t\t\t{ pollInterval: 10_000 },\n\t\t);\n\n\tconst { data: serversData } = useApi<ServersResponse>(\n\t\tuseCallback(() => fetchServers(), []),\n\t\t{ pollInterval: 10_000 },\n\t);\n\n\tif (indexErr && !indexData) {\n\t\treturn (\n\t\t\t<div className=\"tab-stub\">Error loading repos: {indexErr.message}</div>\n\t\t);\n\t}\n\tif (!indexData) {\n\t\treturn <div className=\"tab-stub\">Loading repos…</div>;\n\t}\n\n\tconst summary = indexData.summary;\n\tconst repos = indexData.repos;\n\tconst servers = serversData?.servers ?? [];\n\n\treturn (\n\t\t<div className=\"repos-tab\">\n\t\t\t<SummaryTiles\n\t\t\t\ttotalRepos={summary?.totalRepos ?? 0}\n\t\t\t\ttotalCheckpoints={summary?.totalCheckpoints ?? 0}\n\t\t\t\ttotalTokensSaved={summary?.totalTokensSaved ?? 0}\n\t\t\t\tcompressedOriginalBytes={summary?.totalCompressedOriginalBytes ?? 0}\n\t\t\t/>\n\t\t\t<h2 className=\"section-header\">All Repositories</h2>\n\t\t\t<RepoTable repos={repos} onSelect={setSelected} />\n\t\t\t<h2 className=\"section-header\">\n\t\t\t\tActive Repos — Live Cache Hits &amp; Compactions\n\t\t\t</h2>\n\t\t\t<ActiveReposTable servers={servers} />\n\t\t\t<h2 className=\"section-header\">Savings by Model</h2>\n\t\t\t<SavingsByModelTable repos={repos} />\n\t\t\t{selected && (\n\t\t\t\t<RepoDetailModal repo={selected} onClose={() => setSelected(null)} />\n\t\t\t)}\n\t\t</div>\n\t);\n}\n"],"names":["fmtBytesTop","b","fmt","n","SummaryTiles","totalRepos","totalCheckpoints","totalTokensSaved","compressedOriginalBytes","jsxs","jsx","COLUMNS","formatTs","ts","RepoTable","repos","onSelect","search","setSearch","useState","sortKey","setSortKey","sortDir","setSortDir","filtered","useMemo","q","list","r","a","av","bv","aNull","bNull","cmp","handleSort","key","d","e","col","repo","RepoDetailModal","onClose","useEffect","handler","fmtSec","v","HEADERS","ActiveReposTable","servers","h","i","ch","cp","collapseNum","samples","lo","hi","collapseRate","aggregate","map","g","TOOLTIPS","SavingsByModelTable","groups","freed","usd","when","reas","fetchIndexTyped","fetchIndex","ReposTab","selected","setSelected","indexData","indexErr","useApi","useCallback","serversData","fetchServers","summary"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import{i as di,k as se,r as L,R as _,j as U,u as Ms,f as om,l as um}from"./index-CqLN7STl.js";import{u as cm}from"./useSSE-CXrQSbVY.js";function Tp(e){var t,r,n="";if(typeof e=="string"||typeof e=="number")n+=e;else if(typeof e=="object")if(Array.isArray(e)){var i=e.length;for(t=0;t<i;t++)e[t]&&(r=Tp(e[t]))&&(n&&(n+=" "),n+=r)}else for(r in e)e[r]&&(n&&(n+=" "),n+=r);return n}function ee(){for(var e,t,r=0,n="",i=arguments.length;r<i;r++)(e=arguments[r])&&(t=Tp(e))&&(n&&(n+=" "),n+=t);return n}var sm=Array.isArray,Re=sm,lm=typeof di=="object"&&di&&di.Object===Object&&di,Ep=lm,fm=Ep,hm=typeof self=="object"&&self&&self.Object===Object&&self,pm=fm||hm||Function("return this")(),ht=pm,dm=ht,vm=dm.Symbol,ai=vm,Cs=ai,jp=Object.prototype,ym=jp.hasOwnProperty,mm=jp.toString,cn=Cs?Cs.toStringTag:void 0;function gm(e){var t=ym.call(e,cn),r=e[cn];try{e[cn]=void 0;var n=!0}catch{}var i=mm.call(e);return n&&(t?e[cn]=r:delete e[cn]),i}var bm=gm,xm=Object.prototype,wm=xm.toString;function Om(e){return wm.call(e)}var Am=Om,Is=ai,Sm=bm,_m=Am,Pm="[object Null]",$m="[object Undefined]",ks=Is?Is.toStringTag:void 0;function Tm(e){return e==null?e===void 0?$m:Pm:ks&&ks in Object(e)?Sm(e):_m(e)}var St=Tm;function Em(e){return e!=null&&typeof e=="object"}var _t=Em,jm=St,Mm=_t,Cm="[object Symbol]";function Im(e){return typeof e=="symbol"||Mm(e)&&jm(e)==Cm}var Kr=Im,km=Re,Dm=Kr,Nm=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Lm=/^\w*$/;function Rm(e,t){if(km(e))return!1;var r=typeof e;return r=="number"||r=="symbol"||r=="boolean"||e==null||Dm(e)?!0:Lm.test(e)||!Nm.test(e)||t!=null&&e in Object(t)}var Ac=Rm;function Bm(e){var t=typeof e;return e!=null&&(t=="object"||t=="function")}var kt=Bm;const Xr=se(kt);var Fm=St,Wm=kt,zm="[object AsyncFunction]",Um="[object Function]",Hm="[object GeneratorFunction]",Gm="[object Proxy]";function qm(e){if(!Wm(e))return!1;var t=Fm(e);return t==Um||t==Hm||t==zm||t==Gm}var Sc=qm;const V=se(Sc);var Km=ht,Xm=Km["__core-js_shared__"],Vm=Xm,Ao=Vm,Ds=function(){var e=/[^.]+$/.exec(Ao&&Ao.keys&&Ao.keys.IE_PROTO||"");return e?"Symbol(src)_1."+e:""}();function Ym(e){return!!Ds&&Ds in e}var Zm=Ym,Jm=Function.prototype,Qm=Jm.toString;function eg(e){if(e!=null){try{return Qm.call(e)}catch{}try{return e+""}catch{}}return""}var Mp=eg,tg=Sc,rg=Zm,ng=kt,ig=Mp,ag=/[\\^$.*+?()[\]{}|]/g,og=/^\[object .+?Constructor\]$/,ug=Function.prototype,cg=Object.prototype,sg=ug.toString,lg=cg.hasOwnProperty,fg=RegExp("^"+sg.call(lg).replace(ag,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function hg(e){if(!ng(e)||rg(e))return!1;var t=tg(e)?fg:og;return t.test(ig(e))}var pg=hg;function dg(e,t){return e?.[t]}var vg=dg,yg=pg,mg=vg;function gg(e,t){var r=mg(e,t);return yg(r)?r:void 0}var or=gg,bg=or,xg=bg(Object,"create"),Ca=xg,Ns=Ca;function wg(){this.__data__=Ns?Ns(null):{},this.size=0}var Og=wg;function Ag(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t}var Sg=Ag,_g=Ca,Pg="__lodash_hash_undefined__",$g=Object.prototype,Tg=$g.hasOwnProperty;function Eg(e){var t=this.__data__;if(_g){var r=t[e];return r===Pg?void 0:r}return Tg.call(t,e)?t[e]:void 0}var jg=Eg,Mg=Ca,Cg=Object.prototype,Ig=Cg.hasOwnProperty;function kg(e){var t=this.__data__;return Mg?t[e]!==void 0:Ig.call(t,e)}var Dg=kg,Ng=Ca,Lg="__lodash_hash_undefined__";function Rg(e,t){var r=this.__data__;return this.size+=this.has(e)?0:1,r[e]=Ng&&t===void 0?Lg:t,this}var Bg=Rg,Fg=Og,Wg=Sg,zg=jg,Ug=Dg,Hg=Bg;function Vr(e){var t=-1,r=e==null?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}Vr.prototype.clear=Fg;Vr.prototype.delete=Wg;Vr.prototype.get=zg;Vr.prototype.has=Ug;Vr.prototype.set=Hg;var Gg=Vr;function qg(){this.__data__=[],this.size=0}var Kg=qg;function Xg(e,t){return e===t||e!==e&&t!==t}var _c=Xg,Vg=_c;function Yg(e,t){for(var r=e.length;r--;)if(Vg(e[r][0],t))return r;return-1}var Ia=Yg,Zg=Ia,Jg=Array.prototype,Qg=Jg.splice;function eb(e){var t=this.__data__,r=Zg(t,e);if(r<0)return!1;var n=t.length-1;return r==n?t.pop():Qg.call(t,r,1),--this.size,!0}var tb=eb,rb=Ia;function nb(e){var t=this.__data__,r=rb(t,e);return r<0?void 0:t[r][1]}var ib=nb,ab=Ia;function ob(e){return ab(this.__data__,e)>-1}var ub=ob,cb=Ia;function sb(e,t){var r=this.__data__,n=cb(r,e);return n<0?(++this.size,r.push([e,t])):r[n][1]=t,this}var lb=sb,fb=Kg,hb=tb,pb=ib,db=ub,vb=lb;function Yr(e){var t=-1,r=e==null?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}Yr.prototype.clear=fb;Yr.prototype.delete=hb;Yr.prototype.get=pb;Yr.prototype.has=db;Yr.prototype.set=vb;var ka=Yr,yb=or,mb=ht,gb=yb(mb,"Map"),Pc=gb,Ls=Gg,bb=ka,xb=Pc;function wb(){this.size=0,this.__data__={hash:new Ls,map:new(xb||bb),string:new Ls}}var Ob=wb;function Ab(e){var t=typeof e;return t=="string"||t=="number"||t=="symbol"||t=="boolean"?e!=="__proto__":e===null}var Sb=Ab,_b=Sb;function Pb(e,t){var r=e.__data__;return _b(t)?r[typeof t=="string"?"string":"hash"]:r.map}var Da=Pb,$b=Da;function Tb(e){var t=$b(this,e).delete(e);return this.size-=t?1:0,t}var Eb=Tb,jb=Da;function Mb(e){return jb(this,e).get(e)}var Cb=Mb,Ib=Da;function kb(e){return Ib(this,e).has(e)}var Db=kb,Nb=Da;function Lb(e,t){var r=Nb(this,e),n=r.size;return r.set(e,t),this.size+=r.size==n?0:1,this}var Rb=Lb,Bb=Ob,Fb=Eb,Wb=Cb,zb=Db,Ub=Rb;function Zr(e){var t=-1,r=e==null?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}Zr.prototype.clear=Bb;Zr.prototype.delete=Fb;Zr.prototype.get=Wb;Zr.prototype.has=zb;Zr.prototype.set=Ub;var $c=Zr,Cp=$c,Hb="Expected a function";function Tc(e,t){if(typeof e!="function"||t!=null&&typeof t!="function")throw new TypeError(Hb);var r=function(){var n=arguments,i=t?t.apply(this,n):n[0],a=r.cache;if(a.has(i))return a.get(i);var o=e.apply(this,n);return r.cache=a.set(i,o)||a,o};return r.cache=new(Tc.Cache||Cp),r}Tc.Cache=Cp;var Ip=Tc;const Gb=se(Ip);var qb=Ip,Kb=500;function Xb(e){var t=qb(e,function(n){return r.size===Kb&&r.clear(),n}),r=t.cache;return t}var Vb=Xb,Yb=Vb,Zb=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Jb=/\\(\\)?/g,Qb=Yb(function(e){var t=[];return e.charCodeAt(0)===46&&t.push(""),e.replace(Zb,function(r,n,i,a){t.push(i?a.replace(Jb,"$1"):n||r)}),t}),e0=Qb;function t0(e,t){for(var r=-1,n=e==null?0:e.length,i=Array(n);++r<n;)i[r]=t(e[r],r,e);return i}var Ec=t0,Rs=ai,r0=Ec,n0=Re,i0=Kr,Bs=Rs?Rs.prototype:void 0,Fs=Bs?Bs.toString:void 0;function kp(e){if(typeof e=="string")return e;if(n0(e))return r0(e,kp)+"";if(i0(e))return Fs?Fs.call(e):"";var t=e+"";return t=="0"&&1/e==-1/0?"-0":t}var a0=kp,o0=a0;function u0(e){return e==null?"":o0(e)}var Dp=u0,c0=Re,s0=Ac,l0=e0,f0=Dp;function h0(e,t){return c0(e)?e:s0(e,t)?[e]:l0(f0(e))}var Np=h0,p0=Kr;function d0(e){if(typeof e=="string"||p0(e))return e;var t=e+"";return t=="0"&&1/e==-1/0?"-0":t}var Na=d0,v0=Np,y0=Na;function m0(e,t){t=v0(t,e);for(var r=0,n=t.length;e!=null&&r<n;)e=e[y0(t[r++])];return r&&r==n?e:void 0}var jc=m0,g0=jc;function b0(e,t,r){var n=e==null?void 0:g0(e,t);return n===void 0?r:n}var Lp=b0;const Xe=se(Lp);function x0(e){return e==null}var w0=x0;const Q=se(w0);var O0=St,A0=Re,S0=_t,_0="[object String]";function P0(e){return typeof e=="string"||!A0(e)&&S0(e)&&O0(e)==_0}var $0=P0;const tr=se($0);var Rp={exports:{}},ie={};/**
1
+ import{i as di,k as se,r as L,R as _,j as U,u as Ms,f as om,l as um}from"./index-BcoSz-L4.js";import{u as cm}from"./useSSE-Cezlih5V.js";function Tp(e){var t,r,n="";if(typeof e=="string"||typeof e=="number")n+=e;else if(typeof e=="object")if(Array.isArray(e)){var i=e.length;for(t=0;t<i;t++)e[t]&&(r=Tp(e[t]))&&(n&&(n+=" "),n+=r)}else for(r in e)e[r]&&(n&&(n+=" "),n+=r);return n}function ee(){for(var e,t,r=0,n="",i=arguments.length;r<i;r++)(e=arguments[r])&&(t=Tp(e))&&(n&&(n+=" "),n+=t);return n}var sm=Array.isArray,Re=sm,lm=typeof di=="object"&&di&&di.Object===Object&&di,Ep=lm,fm=Ep,hm=typeof self=="object"&&self&&self.Object===Object&&self,pm=fm||hm||Function("return this")(),ht=pm,dm=ht,vm=dm.Symbol,ai=vm,Cs=ai,jp=Object.prototype,ym=jp.hasOwnProperty,mm=jp.toString,cn=Cs?Cs.toStringTag:void 0;function gm(e){var t=ym.call(e,cn),r=e[cn];try{e[cn]=void 0;var n=!0}catch{}var i=mm.call(e);return n&&(t?e[cn]=r:delete e[cn]),i}var bm=gm,xm=Object.prototype,wm=xm.toString;function Om(e){return wm.call(e)}var Am=Om,Is=ai,Sm=bm,_m=Am,Pm="[object Null]",$m="[object Undefined]",ks=Is?Is.toStringTag:void 0;function Tm(e){return e==null?e===void 0?$m:Pm:ks&&ks in Object(e)?Sm(e):_m(e)}var St=Tm;function Em(e){return e!=null&&typeof e=="object"}var _t=Em,jm=St,Mm=_t,Cm="[object Symbol]";function Im(e){return typeof e=="symbol"||Mm(e)&&jm(e)==Cm}var Kr=Im,km=Re,Dm=Kr,Nm=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Lm=/^\w*$/;function Rm(e,t){if(km(e))return!1;var r=typeof e;return r=="number"||r=="symbol"||r=="boolean"||e==null||Dm(e)?!0:Lm.test(e)||!Nm.test(e)||t!=null&&e in Object(t)}var Ac=Rm;function Bm(e){var t=typeof e;return e!=null&&(t=="object"||t=="function")}var kt=Bm;const Xr=se(kt);var Fm=St,Wm=kt,zm="[object AsyncFunction]",Um="[object Function]",Hm="[object GeneratorFunction]",Gm="[object Proxy]";function qm(e){if(!Wm(e))return!1;var t=Fm(e);return t==Um||t==Hm||t==zm||t==Gm}var Sc=qm;const V=se(Sc);var Km=ht,Xm=Km["__core-js_shared__"],Vm=Xm,Ao=Vm,Ds=function(){var e=/[^.]+$/.exec(Ao&&Ao.keys&&Ao.keys.IE_PROTO||"");return e?"Symbol(src)_1."+e:""}();function Ym(e){return!!Ds&&Ds in e}var Zm=Ym,Jm=Function.prototype,Qm=Jm.toString;function eg(e){if(e!=null){try{return Qm.call(e)}catch{}try{return e+""}catch{}}return""}var Mp=eg,tg=Sc,rg=Zm,ng=kt,ig=Mp,ag=/[\\^$.*+?()[\]{}|]/g,og=/^\[object .+?Constructor\]$/,ug=Function.prototype,cg=Object.prototype,sg=ug.toString,lg=cg.hasOwnProperty,fg=RegExp("^"+sg.call(lg).replace(ag,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function hg(e){if(!ng(e)||rg(e))return!1;var t=tg(e)?fg:og;return t.test(ig(e))}var pg=hg;function dg(e,t){return e?.[t]}var vg=dg,yg=pg,mg=vg;function gg(e,t){var r=mg(e,t);return yg(r)?r:void 0}var or=gg,bg=or,xg=bg(Object,"create"),Ca=xg,Ns=Ca;function wg(){this.__data__=Ns?Ns(null):{},this.size=0}var Og=wg;function Ag(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t}var Sg=Ag,_g=Ca,Pg="__lodash_hash_undefined__",$g=Object.prototype,Tg=$g.hasOwnProperty;function Eg(e){var t=this.__data__;if(_g){var r=t[e];return r===Pg?void 0:r}return Tg.call(t,e)?t[e]:void 0}var jg=Eg,Mg=Ca,Cg=Object.prototype,Ig=Cg.hasOwnProperty;function kg(e){var t=this.__data__;return Mg?t[e]!==void 0:Ig.call(t,e)}var Dg=kg,Ng=Ca,Lg="__lodash_hash_undefined__";function Rg(e,t){var r=this.__data__;return this.size+=this.has(e)?0:1,r[e]=Ng&&t===void 0?Lg:t,this}var Bg=Rg,Fg=Og,Wg=Sg,zg=jg,Ug=Dg,Hg=Bg;function Vr(e){var t=-1,r=e==null?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}Vr.prototype.clear=Fg;Vr.prototype.delete=Wg;Vr.prototype.get=zg;Vr.prototype.has=Ug;Vr.prototype.set=Hg;var Gg=Vr;function qg(){this.__data__=[],this.size=0}var Kg=qg;function Xg(e,t){return e===t||e!==e&&t!==t}var _c=Xg,Vg=_c;function Yg(e,t){for(var r=e.length;r--;)if(Vg(e[r][0],t))return r;return-1}var Ia=Yg,Zg=Ia,Jg=Array.prototype,Qg=Jg.splice;function eb(e){var t=this.__data__,r=Zg(t,e);if(r<0)return!1;var n=t.length-1;return r==n?t.pop():Qg.call(t,r,1),--this.size,!0}var tb=eb,rb=Ia;function nb(e){var t=this.__data__,r=rb(t,e);return r<0?void 0:t[r][1]}var ib=nb,ab=Ia;function ob(e){return ab(this.__data__,e)>-1}var ub=ob,cb=Ia;function sb(e,t){var r=this.__data__,n=cb(r,e);return n<0?(++this.size,r.push([e,t])):r[n][1]=t,this}var lb=sb,fb=Kg,hb=tb,pb=ib,db=ub,vb=lb;function Yr(e){var t=-1,r=e==null?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}Yr.prototype.clear=fb;Yr.prototype.delete=hb;Yr.prototype.get=pb;Yr.prototype.has=db;Yr.prototype.set=vb;var ka=Yr,yb=or,mb=ht,gb=yb(mb,"Map"),Pc=gb,Ls=Gg,bb=ka,xb=Pc;function wb(){this.size=0,this.__data__={hash:new Ls,map:new(xb||bb),string:new Ls}}var Ob=wb;function Ab(e){var t=typeof e;return t=="string"||t=="number"||t=="symbol"||t=="boolean"?e!=="__proto__":e===null}var Sb=Ab,_b=Sb;function Pb(e,t){var r=e.__data__;return _b(t)?r[typeof t=="string"?"string":"hash"]:r.map}var Da=Pb,$b=Da;function Tb(e){var t=$b(this,e).delete(e);return this.size-=t?1:0,t}var Eb=Tb,jb=Da;function Mb(e){return jb(this,e).get(e)}var Cb=Mb,Ib=Da;function kb(e){return Ib(this,e).has(e)}var Db=kb,Nb=Da;function Lb(e,t){var r=Nb(this,e),n=r.size;return r.set(e,t),this.size+=r.size==n?0:1,this}var Rb=Lb,Bb=Ob,Fb=Eb,Wb=Cb,zb=Db,Ub=Rb;function Zr(e){var t=-1,r=e==null?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}Zr.prototype.clear=Bb;Zr.prototype.delete=Fb;Zr.prototype.get=Wb;Zr.prototype.has=zb;Zr.prototype.set=Ub;var $c=Zr,Cp=$c,Hb="Expected a function";function Tc(e,t){if(typeof e!="function"||t!=null&&typeof t!="function")throw new TypeError(Hb);var r=function(){var n=arguments,i=t?t.apply(this,n):n[0],a=r.cache;if(a.has(i))return a.get(i);var o=e.apply(this,n);return r.cache=a.set(i,o)||a,o};return r.cache=new(Tc.Cache||Cp),r}Tc.Cache=Cp;var Ip=Tc;const Gb=se(Ip);var qb=Ip,Kb=500;function Xb(e){var t=qb(e,function(n){return r.size===Kb&&r.clear(),n}),r=t.cache;return t}var Vb=Xb,Yb=Vb,Zb=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Jb=/\\(\\)?/g,Qb=Yb(function(e){var t=[];return e.charCodeAt(0)===46&&t.push(""),e.replace(Zb,function(r,n,i,a){t.push(i?a.replace(Jb,"$1"):n||r)}),t}),e0=Qb;function t0(e,t){for(var r=-1,n=e==null?0:e.length,i=Array(n);++r<n;)i[r]=t(e[r],r,e);return i}var Ec=t0,Rs=ai,r0=Ec,n0=Re,i0=Kr,Bs=Rs?Rs.prototype:void 0,Fs=Bs?Bs.toString:void 0;function kp(e){if(typeof e=="string")return e;if(n0(e))return r0(e,kp)+"";if(i0(e))return Fs?Fs.call(e):"";var t=e+"";return t=="0"&&1/e==-1/0?"-0":t}var a0=kp,o0=a0;function u0(e){return e==null?"":o0(e)}var Dp=u0,c0=Re,s0=Ac,l0=e0,f0=Dp;function h0(e,t){return c0(e)?e:s0(e,t)?[e]:l0(f0(e))}var Np=h0,p0=Kr;function d0(e){if(typeof e=="string"||p0(e))return e;var t=e+"";return t=="0"&&1/e==-1/0?"-0":t}var Na=d0,v0=Np,y0=Na;function m0(e,t){t=v0(t,e);for(var r=0,n=t.length;e!=null&&r<n;)e=e[y0(t[r++])];return r&&r==n?e:void 0}var jc=m0,g0=jc;function b0(e,t,r){var n=e==null?void 0:g0(e,t);return n===void 0?r:n}var Lp=b0;const Xe=se(Lp);function x0(e){return e==null}var w0=x0;const Q=se(w0);var O0=St,A0=Re,S0=_t,_0="[object String]";function P0(e){return typeof e=="string"||!A0(e)&&S0(e)&&O0(e)==_0}var $0=P0;const tr=se($0);var Rp={exports:{}},ie={};/**
2
2
  * @license React
3
3
  * react-is.production.min.js
4
4
  *
@@ -67,4 +67,4 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho
67
67
  In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function m3(e,t){if(e){if(typeof e=="string")return gc(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);if(r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set")return Array.from(e);if(r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return gc(e,t)}}function g3(e){if(typeof Symbol<"u"&&e[Symbol.iterator]!=null||e["@@iterator"]!=null)return Array.from(e)}function b3(e){if(Array.isArray(e))return gc(e)}function gc(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}var bc=function(t,r,n,i,a){var o=Ve(t,Ps),u=Ve(t,vo),c=[].concat(dp(o),dp(u)),s=Ve(t,mo),f="".concat(i,"Id"),l=i[0],h=r;if(c.length&&(h=c.reduce(function(v,d){if(d.props[f]===n&&st(d.props,"extendDomain")&&R(d.props[l])){var b=d.props[l];return[Math.min(v[0],b),Math.max(v[1],b)]}return v},h)),s.length){var p="".concat(l,"1"),y="".concat(l,"2");h=s.reduce(function(v,d){if(d.props[f]===n&&st(d.props,"extendDomain")&&R(d.props[p])&&R(d.props[y])){var b=d.props[p],x=d.props[y];return[Math.min(v[0],b,x),Math.max(v[1],b,x)]}return v},h)}return a&&a.length&&(h=a.reduce(function(v,d){return R(d)?[Math.min(v[0],d),Math.max(v[1],d)]:v},h)),h},Jy={exports:{}};(function(e){var t=Object.prototype.hasOwnProperty,r="~";function n(){}Object.create&&(n.prototype=Object.create(null),new n().__proto__||(r=!1));function i(c,s,f){this.fn=c,this.context=s,this.once=f||!1}function a(c,s,f,l,h){if(typeof f!="function")throw new TypeError("The listener must be a function");var p=new i(f,l||c,h),y=r?r+s:s;return c._events[y]?c._events[y].fn?c._events[y]=[c._events[y],p]:c._events[y].push(p):(c._events[y]=p,c._eventsCount++),c}function o(c,s){--c._eventsCount===0?c._events=new n:delete c._events[s]}function u(){this._events=new n,this._eventsCount=0}u.prototype.eventNames=function(){var s=[],f,l;if(this._eventsCount===0)return s;for(l in f=this._events)t.call(f,l)&&s.push(r?l.slice(1):l);return Object.getOwnPropertySymbols?s.concat(Object.getOwnPropertySymbols(f)):s},u.prototype.listeners=function(s){var f=r?r+s:s,l=this._events[f];if(!l)return[];if(l.fn)return[l.fn];for(var h=0,p=l.length,y=new Array(p);h<p;h++)y[h]=l[h].fn;return y},u.prototype.listenerCount=function(s){var f=r?r+s:s,l=this._events[f];return l?l.fn?1:l.length:0},u.prototype.emit=function(s,f,l,h,p,y){var v=r?r+s:s;if(!this._events[v])return!1;var d=this._events[v],b=arguments.length,x,w;if(d.fn){switch(d.once&&this.removeListener(s,d.fn,void 0,!0),b){case 1:return d.fn.call(d.context),!0;case 2:return d.fn.call(d.context,f),!0;case 3:return d.fn.call(d.context,f,l),!0;case 4:return d.fn.call(d.context,f,l,h),!0;case 5:return d.fn.call(d.context,f,l,h,p),!0;case 6:return d.fn.call(d.context,f,l,h,p,y),!0}for(w=1,x=new Array(b-1);w<b;w++)x[w-1]=arguments[w];d.fn.apply(d.context,x)}else{var O=d.length,m;for(w=0;w<O;w++)switch(d[w].once&&this.removeListener(s,d[w].fn,void 0,!0),b){case 1:d[w].fn.call(d[w].context);break;case 2:d[w].fn.call(d[w].context,f);break;case 3:d[w].fn.call(d[w].context,f,l);break;case 4:d[w].fn.call(d[w].context,f,l,h);break;default:if(!x)for(m=1,x=new Array(b-1);m<b;m++)x[m-1]=arguments[m];d[w].fn.apply(d[w].context,x)}}return!0},u.prototype.on=function(s,f,l){return a(this,s,f,l,!1)},u.prototype.once=function(s,f,l){return a(this,s,f,l,!0)},u.prototype.removeListener=function(s,f,l,h){var p=r?r+s:s;if(!this._events[p])return this;if(!f)return o(this,p),this;var y=this._events[p];if(y.fn)y.fn===f&&(!h||y.once)&&(!l||y.context===l)&&o(this,p);else{for(var v=0,d=[],b=y.length;v<b;v++)(y[v].fn!==f||h&&!y[v].once||l&&y[v].context!==l)&&d.push(y[v]);d.length?this._events[p]=d.length===1?d[0]:d:o(this,p)}return this},u.prototype.removeAllListeners=function(s){var f;return s?(f=r?r+s:s,this._events[f]&&o(this,f)):(this._events=new n,this._eventsCount=0),this},u.prototype.off=u.prototype.removeListener,u.prototype.addListener=u.prototype.on,u.prefixed=r,u.EventEmitter=u,e.exports=u})(Jy);var x3=Jy.exports;const w3=se(x3);var Vo=new w3,Yo="recharts.syncMouseEvents";function ni(e){"@babel/helpers - typeof";return ni=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},ni(e)}function O3(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function A3(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,Qy(n.key),n)}}function S3(e,t,r){return t&&A3(e.prototype,t),Object.defineProperty(e,"prototype",{writable:!1}),e}function Zo(e,t,r){return t=Qy(t),t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function Qy(e){var t=_3(e,"string");return ni(t)=="symbol"?t:t+""}function _3(e,t){if(ni(e)!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t);if(ni(n)!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}var P3=function(){function e(){O3(this,e),Zo(this,"activeIndex",0),Zo(this,"coordinateList",[]),Zo(this,"layout","horizontal")}return S3(e,[{key:"setDetails",value:function(r){var n,i=r.coordinateList,a=i===void 0?null:i,o=r.container,u=o===void 0?null:o,c=r.layout,s=c===void 0?null:c,f=r.offset,l=f===void 0?null:f,h=r.mouseHandlerCallback,p=h===void 0?null:h;this.coordinateList=(n=a??this.coordinateList)!==null&&n!==void 0?n:[],this.container=u??this.container,this.layout=s??this.layout,this.offset=l??this.offset,this.mouseHandlerCallback=p??this.mouseHandlerCallback,this.activeIndex=Math.min(Math.max(this.activeIndex,0),this.coordinateList.length-1)}},{key:"focus",value:function(){this.spoofMouse()}},{key:"keyboardEvent",value:function(r){if(this.coordinateList.length!==0)switch(r.key){case"ArrowRight":{if(this.layout!=="horizontal")return;this.activeIndex=Math.min(this.activeIndex+1,this.coordinateList.length-1),this.spoofMouse();break}case"ArrowLeft":{if(this.layout!=="horizontal")return;this.activeIndex=Math.max(this.activeIndex-1,0),this.spoofMouse();break}}}},{key:"setIndex",value:function(r){this.activeIndex=r}},{key:"spoofMouse",value:function(){var r,n;if(this.layout==="horizontal"&&this.coordinateList.length!==0){var i=this.container.getBoundingClientRect(),a=i.x,o=i.y,u=i.height,c=this.coordinateList[this.activeIndex].coordinate,s=((r=window)===null||r===void 0?void 0:r.scrollX)||0,f=((n=window)===null||n===void 0?void 0:n.scrollY)||0,l=a+c+s,h=o+this.offset.top+u/2+f;this.mouseHandlerCallback({pageX:l,pageY:h})}}}])}();function $3(e,t,r){if(r==="number"&&t===!0&&Array.isArray(e)){var n=e?.[0],i=e?.[1];if(n&&i&&R(n)&&R(i))return!0}return!1}function T3(e,t,r,n){var i=n/2;return{stroke:"none",fill:"#ccc",x:e==="horizontal"?t.x-i:r.left+.5,y:e==="horizontal"?r.top+.5:t.y-i,width:e==="horizontal"?n:r.width-1,height:e==="horizontal"?r.height-1:n}}function em(e){var t=e.cx,r=e.cy,n=e.radius,i=e.startAngle,a=e.endAngle,o=Ee(t,r,n,i),u=Ee(t,r,n,a);return{points:[o,u],cx:t,cy:r,radius:n,startAngle:i,endAngle:a}}function E3(e,t,r){var n,i,a,o;if(e==="horizontal")n=t.x,a=n,i=r.top,o=r.top+r.height;else if(e==="vertical")i=t.y,o=i,n=r.left,a=r.left+r.width;else if(t.cx!=null&&t.cy!=null)if(e==="centric"){var u=t.cx,c=t.cy,s=t.innerRadius,f=t.outerRadius,l=t.angle,h=Ee(u,c,s,l),p=Ee(u,c,f,l);n=h.x,i=h.y,a=p.x,o=p.y}else return em(t);return[{x:n,y:i},{x:a,y:o}]}function ii(e){"@babel/helpers - typeof";return ii=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},ii(e)}function vp(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function $i(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?vp(Object(r),!0).forEach(function(n){j3(e,n,r[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):vp(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))})}return e}function j3(e,t,r){return t=M3(t),t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function M3(e){var t=C3(e,"string");return ii(t)=="symbol"?t:t+""}function C3(e,t){if(ii(e)!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t);if(ii(n)!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}function I3(e){var t,r,n=e.element,i=e.tooltipEventType,a=e.isActive,o=e.activeCoordinate,u=e.activePayload,c=e.offset,s=e.activeTooltipIndex,f=e.tooltipAxisBandSize,l=e.layout,h=e.chartName,p=(t=n.props.cursor)!==null&&t!==void 0?t:(r=n.type.defaultProps)===null||r===void 0?void 0:r.cursor;if(!n||!p||!a||!o||h!=="ScatterChart"&&i!=="axis")return null;var y,v=Or;if(h==="ScatterChart")y=o,v=ON;else if(h==="BarChart")y=T3(l,o,c,f),v=bs;else if(l==="radial"){var d=em(o),b=d.cx,x=d.cy,w=d.radius,O=d.startAngle,m=d.endAngle;y={cx:b,cy:x,startAngle:O,endAngle:m,innerRadius:w,outerRadius:w},v=Qv}else y={points:E3(l,o,c)},v=Or;var g=$i($i($i($i({stroke:"#ccc",pointerEvents:"none"},c),y),Z(p,!1)),{},{payload:u,payloadIndex:s,className:ee("recharts-tooltip-cursor",p.className)});return L.isValidElement(p)?L.cloneElement(p,g):L.createElement(v,g)}var k3=["item"],D3=["children","className","width","height","style","compact","title","desc"];function Gr(e){"@babel/helpers - typeof";return Gr=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Gr(e)}function gr(){return gr=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},gr.apply(this,arguments)}function yp(e,t){return R3(e)||L3(e,t)||rm(e,t)||N3()}function N3(){throw new TypeError(`Invalid attempt to destructure non-iterable instance.
68
68
  In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function L3(e,t){var r=e==null?null:typeof Symbol<"u"&&e[Symbol.iterator]||e["@@iterator"];if(r!=null){var n,i,a,o,u=[],c=!0,s=!1;try{if(a=(r=r.call(e)).next,t!==0)for(;!(c=(n=a.call(r)).done)&&(u.push(n.value),u.length!==t);c=!0);}catch(f){s=!0,i=f}finally{try{if(!c&&r.return!=null&&(o=r.return(),Object(o)!==o))return}finally{if(s)throw i}}return u}}function R3(e){if(Array.isArray(e))return e}function mp(e,t){if(e==null)return{};var r=B3(e,t),n,i;if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i<a.length;i++)n=a[i],!(t.indexOf(n)>=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}function B3(e,t){if(e==null)return{};var r={};for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){if(t.indexOf(n)>=0)continue;r[n]=e[n]}return r}function F3(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function W3(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,nm(n.key),n)}}function z3(e,t,r){return t&&W3(e.prototype,t),Object.defineProperty(e,"prototype",{writable:!1}),e}function U3(e,t,r){return t=Ma(t),H3(e,tm()?Reflect.construct(t,r||[],Ma(e).constructor):t.apply(e,r))}function H3(e,t){if(t&&(Gr(t)==="object"||typeof t=="function"))return t;if(t!==void 0)throw new TypeError("Derived constructors may only return object or undefined");return G3(e)}function G3(e){if(e===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function tm(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch{}return(tm=function(){return!!e})()}function Ma(e){return Ma=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(r){return r.__proto__||Object.getPrototypeOf(r)},Ma(e)}function q3(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&xc(e,t)}function xc(e,t){return xc=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(n,i){return n.__proto__=i,n},xc(e,t)}function qr(e){return V3(e)||X3(e)||rm(e)||K3()}function K3(){throw new TypeError(`Invalid attempt to spread non-iterable instance.
69
69
  In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function rm(e,t){if(e){if(typeof e=="string")return wc(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);if(r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set")return Array.from(e);if(r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return wc(e,t)}}function X3(e){if(typeof Symbol<"u"&&e[Symbol.iterator]!=null||e["@@iterator"]!=null)return Array.from(e)}function V3(e){if(Array.isArray(e))return wc(e)}function wc(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function gp(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function M(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?gp(Object(r),!0).forEach(function(n){q(e,n,r[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):gp(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))})}return e}function q(e,t,r){return t=nm(t),t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function nm(e){var t=Y3(e,"string");return Gr(t)=="symbol"?t:t+""}function Y3(e,t){if(Gr(e)!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t);if(Gr(n)!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}var Z3={xAxis:["bottom","top"],yAxis:["left","right"]},J3={width:"100%",height:"100%"},im={x:0,y:0};function Ti(e){return e}var Q3=function(t,r){return r==="horizontal"?t.x:r==="vertical"?t.y:r==="centric"?t.angle:t.radius},eW=function(t,r,n,i){var a=r.find(function(f){return f&&f.index===n});if(a){if(t==="horizontal")return{x:a.coordinate,y:i.y};if(t==="vertical")return{x:i.x,y:a.coordinate};if(t==="centric"){var o=a.coordinate,u=i.radius;return M(M(M({},i),Ee(i.cx,i.cy,u,o)),{},{angle:o,radius:u})}var c=a.coordinate,s=i.angle;return M(M(M({},i),Ee(i.cx,i.cy,c,s)),{},{angle:s,radius:c})}return im},wo=function(t,r){var n=r.graphicalItems,i=r.dataStartIndex,a=r.dataEndIndex,o=(n??[]).reduce(function(u,c){var s=c.props.data;return s&&s.length?[].concat(qr(u),qr(s)):u},[]);return o.length>0?o:t&&t.length&&R(i)&&R(a)?t.slice(i,a+1):[]};function am(e){return e==="number"?[0,"auto"]:void 0}var Oc=function(t,r,n,i){var a=t.graphicalItems,o=t.tooltipAxis,u=wo(r,t);return n<0||!a||!a.length||n>=u.length?null:a.reduce(function(c,s){var f,l=(f=s.props.data)!==null&&f!==void 0?f:r;l&&t.dataStartIndex+t.dataEndIndex!==0&&t.dataEndIndex-t.dataStartIndex>=n&&(l=l.slice(t.dataStartIndex,t.dataEndIndex+1));var h;if(o.dataKey&&!o.allowDuplicatedCategory){var p=l===void 0?u:l;h=Ei(p,o.dataKey,i)}else h=l&&l[n]||u[n];return h?[].concat(qr(c),[Yv(s,h)]):c},[])},bp=function(t,r,n,i){var a=i||{x:t.chartX,y:t.chartY},o=Q3(a,n),u=t.orderedTooltipTicks,c=t.tooltipAxis,s=t.tooltipTicks,f=e2(o,u,s,c);if(f>=0&&s){var l=s[f]&&s[f].value,h=Oc(t,r,f,l),p=eW(n,u,f,a);return{activeTooltipIndex:f,activeLabel:l,activePayload:h,activeCoordinate:p}}return null},tW=function(t,r){var n=r.axes,i=r.graphicalItems,a=r.axisType,o=r.axisIdKey,u=r.stackGroups,c=r.dataStartIndex,s=r.dataEndIndex,f=t.layout,l=t.children,h=t.stackOffset,p=Kv(f,a);return n.reduce(function(y,v){var d,b=v.type.defaultProps!==void 0?M(M({},v.type.defaultProps),v.props):v.props,x=b.type,w=b.dataKey,O=b.allowDataOverflow,m=b.allowDuplicatedCategory,g=b.scale,A=b.ticks,S=b.includeHidden,P=b[o];if(y[P])return y;var E=wo(t.data,{graphicalItems:i.filter(function(z){var X,le=o in z.props?z.props[o]:(X=z.type.defaultProps)===null||X===void 0?void 0:X[o];return le===P}),dataStartIndex:c,dataEndIndex:s}),T=E.length,$,k,C;$3(b.domain,O,x)&&($=Bu(b.domain,null,O),p&&(x==="number"||g!=="auto")&&(C=wn(E,w,"category")));var j=am(x);if(!$||$.length===0){var I,D=(I=b.domain)!==null&&I!==void 0?I:j;if(w){if($=wn(E,w,x),x==="category"&&p){var B=W0($);m&&B?(k=$,$=ma(0,T)):m||($=Jf(D,$,v).reduce(function(z,X){return z.indexOf(X)>=0?z:[].concat(qr(z),[X])},[]))}else if(x==="category")m?$=$.filter(function(z){return z!==""&&!Q(z)}):$=Jf(D,$,v).reduce(function(z,X){return z.indexOf(X)>=0||X===""||Q(X)?z:[].concat(qr(z),[X])},[]);else if(x==="number"){var F=a2(E,i.filter(function(z){var X,le,ye=o in z.props?z.props[o]:(X=z.type.defaultProps)===null||X===void 0?void 0:X[o],Be="hide"in z.props?z.props.hide:(le=z.type.defaultProps)===null||le===void 0?void 0:le.hide;return ye===P&&(S||!Be)}),w,a,f);F&&($=F)}p&&(x==="number"||g!=="auto")&&(C=wn(E,w,"category"))}else p?$=ma(0,T):u&&u[P]&&u[P].hasStack&&x==="number"?$=h==="expand"?[0,1]:Vv(u[P].stackGroups,c,s):$=qv(E,i.filter(function(z){var X=o in z.props?z.props[o]:z.type.defaultProps[o],le="hide"in z.props?z.props.hide:z.type.defaultProps.hide;return X===P&&(S||!le)}),x,f,!0);if(x==="number")$=bc(l,$,P,a,A),D&&($=Bu(D,$,O));else if(x==="category"&&D){var G=D,K=$.every(function(z){return G.indexOf(z)>=0});K&&($=G)}}return M(M({},y),{},q({},P,M(M({},b),{},{axisType:a,domain:$,categoricalDomain:C,duplicateDomain:k,originalDomain:(d=b.domain)!==null&&d!==void 0?d:j,isCategorical:p,layout:f})))},{})},rW=function(t,r){var n=r.graphicalItems,i=r.Axis,a=r.axisType,o=r.axisIdKey,u=r.stackGroups,c=r.dataStartIndex,s=r.dataEndIndex,f=t.layout,l=t.children,h=wo(t.data,{graphicalItems:n,dataStartIndex:c,dataEndIndex:s}),p=h.length,y=Kv(f,a),v=-1;return n.reduce(function(d,b){var x=b.type.defaultProps!==void 0?M(M({},b.type.defaultProps),b.props):b.props,w=x[o],O=am("number");if(!d[w]){v++;var m;return y?m=ma(0,p):u&&u[w]&&u[w].hasStack?(m=Vv(u[w].stackGroups,c,s),m=bc(l,m,w,a)):(m=Bu(O,qv(h,n.filter(function(g){var A,S,P=o in g.props?g.props[o]:(A=g.type.defaultProps)===null||A===void 0?void 0:A[o],E="hide"in g.props?g.props.hide:(S=g.type.defaultProps)===null||S===void 0?void 0:S.hide;return P===w&&!E}),"number",f),i.defaultProps.allowDataOverflow),m=bc(l,m,w,a)),M(M({},d),{},q({},w,M(M({axisType:a},i.defaultProps),{},{hide:!0,orientation:Xe(Z3,"".concat(a,".").concat(v%2),null),domain:m,originalDomain:O,isCategorical:y,layout:f})))}return d},{})},nW=function(t,r){var n=r.axisType,i=n===void 0?"xAxis":n,a=r.AxisComp,o=r.graphicalItems,u=r.stackGroups,c=r.dataStartIndex,s=r.dataEndIndex,f=t.children,l="".concat(i,"Id"),h=Ve(f,a),p={};return h&&h.length?p=tW(t,{axes:h,graphicalItems:o,axisType:i,axisIdKey:l,stackGroups:u,dataStartIndex:c,dataEndIndex:s}):o&&o.length&&(p=rW(t,{Axis:a,graphicalItems:o,axisType:i,axisIdKey:l,stackGroups:u,dataStartIndex:c,dataEndIndex:s})),p},iW=function(t){var r=jt(t),n=yt(r,!1,!0);return{tooltipTicks:n,orderedTooltipTicks:qc(n,function(i){return i.coordinate}),tooltipAxis:r,tooltipAxisBandSize:ua(r,n)}},xp=function(t){var r=t.children,n=t.defaultShowTooltip,i=ze(r,Dr),a=0,o=0;return t.data&&t.data.length!==0&&(o=t.data.length-1),i&&i.props&&(i.props.startIndex>=0&&(a=i.props.startIndex),i.props.endIndex>=0&&(o=i.props.endIndex)),{chartX:0,chartY:0,dataStartIndex:a,dataEndIndex:o,activeTooltipIndex:-1,isTooltipActive:!!n}},aW=function(t){return!t||!t.length?!1:t.some(function(r){var n=mt(r&&r.type);return n&&n.indexOf("Bar")>=0})},wp=function(t){return t==="horizontal"?{numericAxisName:"yAxis",cateAxisName:"xAxis"}:t==="vertical"?{numericAxisName:"xAxis",cateAxisName:"yAxis"}:t==="centric"?{numericAxisName:"radiusAxis",cateAxisName:"angleAxis"}:{numericAxisName:"angleAxis",cateAxisName:"radiusAxis"}},oW=function(t,r){var n=t.props,i=t.graphicalItems,a=t.xAxisMap,o=a===void 0?{}:a,u=t.yAxisMap,c=u===void 0?{}:u,s=n.width,f=n.height,l=n.children,h=n.margin||{},p=ze(l,Dr),y=ze(l,Jt),v=Object.keys(c).reduce(function(m,g){var A=c[g],S=A.orientation;return!A.mirror&&!A.hide?M(M({},m),{},q({},S,m[S]+A.width)):m},{left:h.left||0,right:h.right||0}),d=Object.keys(o).reduce(function(m,g){var A=o[g],S=A.orientation;return!A.mirror&&!A.hide?M(M({},m),{},q({},S,Xe(m,"".concat(S))+A.height)):m},{top:h.top||0,bottom:h.bottom||0}),b=M(M({},d),v),x=b.bottom;p&&(b.bottom+=p.props.height||Dr.defaultProps.height),y&&r&&(b=n2(b,i,n,r));var w=s-b.left-b.right,O=f-b.top-b.bottom;return M(M({brushBottom:x},b),{},{width:Math.max(w,0),height:Math.max(O,0)})},uW=function(t,r){if(r==="xAxis")return t[r].width;if(r==="yAxis")return t[r].height},cW=function(t){var r=t.chartName,n=t.GraphicalChild,i=t.defaultTooltipEventType,a=i===void 0?"axis":i,o=t.validateTooltipEventTypes,u=o===void 0?["axis"]:o,c=t.axisComponents,s=t.legendContent,f=t.formatAxisMap,l=t.defaultProps,h=function(b,x){var w=x.graphicalItems,O=x.stackGroups,m=x.offset,g=x.updateId,A=x.dataStartIndex,S=x.dataEndIndex,P=b.barSize,E=b.layout,T=b.barGap,$=b.barCategoryGap,k=b.maxBarSize,C=wp(E),j=C.numericAxisName,I=C.cateAxisName,D=aW(w),B=[];return w.forEach(function(F,G){var K=wo(b.data,{graphicalItems:[F],dataStartIndex:A,dataEndIndex:S}),z=F.type.defaultProps!==void 0?M(M({},F.type.defaultProps),F.props):F.props,X=z.dataKey,le=z.maxBarSize,ye=z["".concat(j,"Id")],Be=z["".concat(I,"Id")],Ft={},De=c.reduce(function(Wt,zt){var Oo=x["".concat(zt.axisType,"Map")],Es=z["".concat(zt.axisType,"Id")];Oo&&Oo[Es]||zt.axisType==="zAxis"||ir();var js=Oo[Es];return M(M({},Wt),{},q(q({},zt.axisType,js),"".concat(zt.axisType,"Ticks"),yt(js)))},Ft),W=De[I],Y=De["".concat(I,"Ticks")],J=O&&O[ye]&&O[ye].hasStack&&m2(F,O[ye].stackGroups),N=mt(F.type).indexOf("Bar")>=0,de=ua(W,Y),te=[],be=D&&t2({barSize:P,stackGroups:O,totalSize:uW(De,I)});if(N){var xe,Ne,$t=Q(le)?k:le,fr=(xe=(Ne=ua(W,Y,!0))!==null&&Ne!==void 0?Ne:$t)!==null&&xe!==void 0?xe:0;te=r2({barGap:T,barCategoryGap:$,bandSize:fr!==de?fr:de,sizeList:be[Be],maxBarSize:$t}),fr!==de&&(te=te.map(function(Wt){return M(M({},Wt),{},{position:M(M({},Wt.position),{},{offset:Wt.position.offset-fr/2})})}))}var pi=F&&F.type&&F.type.getComposedData;pi&&B.push({props:M(M({},pi(M(M({},De),{},{displayedData:K,props:b,dataKey:X,item:F,bandSize:de,barPosition:te,offset:m,stackedData:J,layout:E,dataStartIndex:A,dataEndIndex:S}))),{},q(q(q({key:F.key||"item-".concat(G)},j,De[j]),I,De[I]),"animationId",g)),childIndex:Q0(F,b.children),item:F})}),B},p=function(b,x){var w=b.props,O=b.dataStartIndex,m=b.dataEndIndex,g=b.updateId;if(!Gs({props:w}))return null;var A=w.children,S=w.layout,P=w.stackOffset,E=w.data,T=w.reverseStackOrder,$=wp(S),k=$.numericAxisName,C=$.cateAxisName,j=Ve(A,n),I=d2(E,j,"".concat(k,"Id"),"".concat(C,"Id"),P,T),D=c.reduce(function(z,X){var le="".concat(X.axisType,"Map");return M(M({},z),{},q({},le,nW(w,M(M({},X),{},{graphicalItems:j,stackGroups:X.axisType===k&&I,dataStartIndex:O,dataEndIndex:m}))))},{}),B=oW(M(M({},D),{},{props:w,graphicalItems:j}),x?.legendBBox);Object.keys(D).forEach(function(z){D[z]=f(w,D[z],B,z.replace("Map",""),r)});var F=D["".concat(C,"Map")],G=iW(F),K=h(w,M(M({},D),{},{dataStartIndex:O,dataEndIndex:m,updateId:g,graphicalItems:j,stackGroups:I,offset:B}));return M(M({formattedGraphicalItems:K,graphicalItems:j,offset:B,stackGroups:I},G),D)},y=function(d){function b(x){var w,O,m;return F3(this,b),m=U3(this,b,[x]),q(m,"eventEmitterSymbol",Symbol("rechartsEventEmitter")),q(m,"accessibilityManager",new P3),q(m,"handleLegendBBoxUpdate",function(g){if(g){var A=m.state,S=A.dataStartIndex,P=A.dataEndIndex,E=A.updateId;m.setState(M({legendBBox:g},p({props:m.props,dataStartIndex:S,dataEndIndex:P,updateId:E},M(M({},m.state),{},{legendBBox:g}))))}}),q(m,"handleReceiveSyncEvent",function(g,A,S){if(m.props.syncId===g){if(S===m.eventEmitterSymbol&&typeof m.props.syncMethod!="function")return;m.applySyncEvent(A)}}),q(m,"handleBrushChange",function(g){var A=g.startIndex,S=g.endIndex;if(A!==m.state.dataStartIndex||S!==m.state.dataEndIndex){var P=m.state.updateId;m.setState(function(){return M({dataStartIndex:A,dataEndIndex:S},p({props:m.props,dataStartIndex:A,dataEndIndex:S,updateId:P},m.state))}),m.triggerSyncEvent({dataStartIndex:A,dataEndIndex:S})}}),q(m,"handleMouseEnter",function(g){var A=m.getMouseInfo(g);if(A){var S=M(M({},A),{},{isTooltipActive:!0});m.setState(S),m.triggerSyncEvent(S);var P=m.props.onMouseEnter;V(P)&&P(S,g)}}),q(m,"triggeredAfterMouseMove",function(g){var A=m.getMouseInfo(g),S=A?M(M({},A),{},{isTooltipActive:!0}):{isTooltipActive:!1};m.setState(S),m.triggerSyncEvent(S);var P=m.props.onMouseMove;V(P)&&P(S,g)}),q(m,"handleItemMouseEnter",function(g){m.setState(function(){return{isTooltipActive:!0,activeItem:g,activePayload:g.tooltipPayload,activeCoordinate:g.tooltipPosition||{x:g.cx,y:g.cy}}})}),q(m,"handleItemMouseLeave",function(){m.setState(function(){return{isTooltipActive:!1}})}),q(m,"handleMouseMove",function(g){g.persist(),m.throttleTriggeredAfterMouseMove(g)}),q(m,"handleMouseLeave",function(g){m.throttleTriggeredAfterMouseMove.cancel();var A={isTooltipActive:!1};m.setState(A),m.triggerSyncEvent(A);var S=m.props.onMouseLeave;V(S)&&S(A,g)}),q(m,"handleOuterEvent",function(g){var A=J0(g),S=Xe(m.props,"".concat(A));if(A&&V(S)){var P,E;/.*touch.*/i.test(A)?E=m.getMouseInfo(g.changedTouches[0]):E=m.getMouseInfo(g),S((P=E)!==null&&P!==void 0?P:{},g)}}),q(m,"handleClick",function(g){var A=m.getMouseInfo(g);if(A){var S=M(M({},A),{},{isTooltipActive:!0});m.setState(S),m.triggerSyncEvent(S);var P=m.props.onClick;V(P)&&P(S,g)}}),q(m,"handleMouseDown",function(g){var A=m.props.onMouseDown;if(V(A)){var S=m.getMouseInfo(g);A(S,g)}}),q(m,"handleMouseUp",function(g){var A=m.props.onMouseUp;if(V(A)){var S=m.getMouseInfo(g);A(S,g)}}),q(m,"handleTouchMove",function(g){g.changedTouches!=null&&g.changedTouches.length>0&&m.throttleTriggeredAfterMouseMove(g.changedTouches[0])}),q(m,"handleTouchStart",function(g){g.changedTouches!=null&&g.changedTouches.length>0&&m.handleMouseDown(g.changedTouches[0])}),q(m,"handleTouchEnd",function(g){g.changedTouches!=null&&g.changedTouches.length>0&&m.handleMouseUp(g.changedTouches[0])}),q(m,"handleDoubleClick",function(g){var A=m.props.onDoubleClick;if(V(A)){var S=m.getMouseInfo(g);A(S,g)}}),q(m,"handleContextMenu",function(g){var A=m.props.onContextMenu;if(V(A)){var S=m.getMouseInfo(g);A(S,g)}}),q(m,"triggerSyncEvent",function(g){m.props.syncId!==void 0&&Vo.emit(Yo,m.props.syncId,g,m.eventEmitterSymbol)}),q(m,"applySyncEvent",function(g){var A=m.props,S=A.layout,P=A.syncMethod,E=m.state.updateId,T=g.dataStartIndex,$=g.dataEndIndex;if(g.dataStartIndex!==void 0||g.dataEndIndex!==void 0)m.setState(M({dataStartIndex:T,dataEndIndex:$},p({props:m.props,dataStartIndex:T,dataEndIndex:$,updateId:E},m.state)));else if(g.activeTooltipIndex!==void 0){var k=g.chartX,C=g.chartY,j=g.activeTooltipIndex,I=m.state,D=I.offset,B=I.tooltipTicks;if(!D)return;if(typeof P=="function")j=P(B,g);else if(P==="value"){j=-1;for(var F=0;F<B.length;F++)if(B[F].value===g.activeLabel){j=F;break}}var G=M(M({},D),{},{x:D.left,y:D.top}),K=Math.min(k,G.x+G.width),z=Math.min(C,G.y+G.height),X=B[j]&&B[j].value,le=Oc(m.state,m.props.data,j),ye=B[j]?{x:S==="horizontal"?B[j].coordinate:K,y:S==="horizontal"?z:B[j].coordinate}:im;m.setState(M(M({},g),{},{activeLabel:X,activeCoordinate:ye,activePayload:le,activeTooltipIndex:j}))}else m.setState(g)}),q(m,"renderCursor",function(g){var A,S=m.state,P=S.isTooltipActive,E=S.activeCoordinate,T=S.activePayload,$=S.offset,k=S.activeTooltipIndex,C=S.tooltipAxisBandSize,j=m.getTooltipEventType(),I=(A=g.props.active)!==null&&A!==void 0?A:P,D=m.props.layout,B=g.key||"_recharts-cursor";return _.createElement(I3,{key:B,activeCoordinate:E,activePayload:T,activeTooltipIndex:k,chartName:r,element:g,isActive:I,layout:D,offset:$,tooltipAxisBandSize:C,tooltipEventType:j})}),q(m,"renderPolarAxis",function(g,A,S){var P=Xe(g,"type.axisType"),E=Xe(m.state,"".concat(P,"Map")),T=g.type.defaultProps,$=T!==void 0?M(M({},T),g.props):g.props,k=E&&E[$["".concat(P,"Id")]];return L.cloneElement(g,M(M({},k),{},{className:ee(P,k.className),key:g.key||"".concat(A,"-").concat(S),ticks:yt(k,!0)}))}),q(m,"renderPolarGrid",function(g){var A=g.props,S=A.radialLines,P=A.polarAngles,E=A.polarRadius,T=m.state,$=T.radiusAxisMap,k=T.angleAxisMap,C=jt($),j=jt(k),I=j.cx,D=j.cy,B=j.innerRadius,F=j.outerRadius;return L.cloneElement(g,{polarAngles:Array.isArray(P)?P:yt(j,!0).map(function(G){return G.coordinate}),polarRadius:Array.isArray(E)?E:yt(C,!0).map(function(G){return G.coordinate}),cx:I,cy:D,innerRadius:B,outerRadius:F,key:g.key||"polar-grid",radialLines:S})}),q(m,"renderLegend",function(){var g=m.state.formattedGraphicalItems,A=m.props,S=A.children,P=A.width,E=A.height,T=m.props.margin||{},$=P-(T.left||0)-(T.right||0),k=Hv({children:S,formattedGraphicalItems:g,legendWidth:$,legendContent:s});if(!k)return null;var C=k.item,j=mp(k,k3);return L.cloneElement(C,M(M({},j),{},{chartWidth:P,chartHeight:E,margin:T,onBBoxUpdate:m.handleLegendBBoxUpdate}))}),q(m,"renderTooltip",function(){var g,A=m.props,S=A.children,P=A.accessibilityLayer,E=ze(S,at);if(!E)return null;var T=m.state,$=T.isTooltipActive,k=T.activeCoordinate,C=T.activePayload,j=T.activeLabel,I=T.offset,D=(g=E.props.active)!==null&&g!==void 0?g:$;return L.cloneElement(E,{viewBox:M(M({},I),{},{x:I.left,y:I.top}),active:D,label:j,payload:D?C:[],coordinate:k,accessibilityLayer:P})}),q(m,"renderBrush",function(g){var A=m.props,S=A.margin,P=A.data,E=m.state,T=E.offset,$=E.dataStartIndex,k=E.dataEndIndex,C=E.updateId;return L.cloneElement(g,{key:g.key||"_recharts-brush",onChange:Ai(m.handleBrushChange,g.props.onChange),data:P,x:R(g.props.x)?g.props.x:T.left,y:R(g.props.y)?g.props.y:T.top+T.height+T.brushBottom-(S.bottom||0),width:R(g.props.width)?g.props.width:T.width,startIndex:$,endIndex:k,updateId:"brush-".concat(C)})}),q(m,"renderReferenceElement",function(g,A,S){if(!g)return null;var P=m,E=P.clipPathId,T=m.state,$=T.xAxisMap,k=T.yAxisMap,C=T.offset,j=g.type.defaultProps||{},I=g.props,D=I.xAxisId,B=D===void 0?j.xAxisId:D,F=I.yAxisId,G=F===void 0?j.yAxisId:F;return L.cloneElement(g,{key:g.key||"".concat(A,"-").concat(S),xAxis:$[B],yAxis:k[G],viewBox:{x:C.left,y:C.top,width:C.width,height:C.height},clipPathId:E})}),q(m,"renderActivePoints",function(g){var A=g.item,S=g.activePoint,P=g.basePoint,E=g.childIndex,T=g.isRange,$=[],k=A.props.key,C=A.item.type.defaultProps!==void 0?M(M({},A.item.type.defaultProps),A.item.props):A.item.props,j=C.activeDot,I=C.dataKey,D=M(M({index:E,dataKey:I,cx:S.x,cy:S.y,r:4,fill:gs(A.item),strokeWidth:2,stroke:"#fff",payload:S.payload,value:S.value},Z(j,!1)),ji(j));return $.push(b.renderActiveDot(j,D,"".concat(k,"-activePoint-").concat(E))),P?$.push(b.renderActiveDot(j,M(M({},D),{},{cx:P.x,cy:P.y}),"".concat(k,"-basePoint-").concat(E))):T&&$.push(null),$}),q(m,"renderGraphicChild",function(g,A,S){var P=m.filterFormatItem(g,A,S);if(!P)return null;var E=m.getTooltipEventType(),T=m.state,$=T.isTooltipActive,k=T.tooltipAxis,C=T.activeTooltipIndex,j=T.activeLabel,I=m.props.children,D=ze(I,at),B=P.props,F=B.points,G=B.isRange,K=B.baseLine,z=P.item.type.defaultProps!==void 0?M(M({},P.item.type.defaultProps),P.item.props):P.item.props,X=z.activeDot,le=z.hide,ye=z.activeBar,Be=z.activeShape,Ft=!!(!le&&$&&D&&(X||ye||Be)),De={};E!=="axis"&&D&&D.props.trigger==="click"?De={onClick:Ai(m.handleItemMouseEnter,g.props.onClick)}:E!=="axis"&&(De={onMouseLeave:Ai(m.handleItemMouseLeave,g.props.onMouseLeave),onMouseEnter:Ai(m.handleItemMouseEnter,g.props.onMouseEnter)});var W=L.cloneElement(g,M(M({},P.props),De));function Y(zt){return typeof k.dataKey=="function"?k.dataKey(zt.payload):null}if(Ft)if(C>=0){var J,N;if(k.dataKey&&!k.allowDuplicatedCategory){var de=typeof k.dataKey=="function"?Y:"payload.".concat(k.dataKey.toString());J=Ei(F,de,j),N=G&&K&&Ei(K,de,j)}else J=F?.[C],N=G&&K&&K[C];if(Be||ye){var te=g.props.activeIndex!==void 0?g.props.activeIndex:C;return[L.cloneElement(g,M(M(M({},P.props),De),{},{activeIndex:te})),null,null]}if(!Q(J))return[W].concat(qr(m.renderActivePoints({item:P,activePoint:J,basePoint:N,childIndex:C,isRange:G})))}else{var be,xe=(be=m.getItemByXY(m.state.activeCoordinate))!==null&&be!==void 0?be:{graphicalItem:W},Ne=xe.graphicalItem,$t=Ne.item,fr=$t===void 0?g:$t,pi=Ne.childIndex,Wt=M(M(M({},P.props),De),{},{activeIndex:pi});return[L.cloneElement(fr,Wt),null,null]}return G?[W,null,null]:[W,null]}),q(m,"renderCustomized",function(g,A,S){return L.cloneElement(g,M(M({key:"recharts-customized-".concat(S)},m.props),m.state))}),q(m,"renderMap",{CartesianGrid:{handler:Ti,once:!0},ReferenceArea:{handler:m.renderReferenceElement},ReferenceLine:{handler:Ti},ReferenceDot:{handler:m.renderReferenceElement},XAxis:{handler:Ti},YAxis:{handler:Ti},Brush:{handler:m.renderBrush,once:!0},Bar:{handler:m.renderGraphicChild},Line:{handler:m.renderGraphicChild},Area:{handler:m.renderGraphicChild},Radar:{handler:m.renderGraphicChild},RadialBar:{handler:m.renderGraphicChild},Scatter:{handler:m.renderGraphicChild},Pie:{handler:m.renderGraphicChild},Funnel:{handler:m.renderGraphicChild},Tooltip:{handler:m.renderCursor,once:!0},PolarGrid:{handler:m.renderPolarGrid,once:!0},PolarAngleAxis:{handler:m.renderPolarAxis},PolarRadiusAxis:{handler:m.renderPolarAxis},Customized:{handler:m.renderCustomized}}),m.clipPathId="".concat((w=x.id)!==null&&w!==void 0?w:Qr("recharts"),"-clip"),m.throttleTriggeredAfterMouseMove=Hd(m.triggeredAfterMouseMove,(O=x.throttleDelay)!==null&&O!==void 0?O:1e3/60),m.state={},m}return q3(b,d),z3(b,[{key:"componentDidMount",value:function(){var w,O;this.addListener(),this.accessibilityManager.setDetails({container:this.container,offset:{left:(w=this.props.margin.left)!==null&&w!==void 0?w:0,top:(O=this.props.margin.top)!==null&&O!==void 0?O:0},coordinateList:this.state.tooltipTicks,mouseHandlerCallback:this.triggeredAfterMouseMove,layout:this.props.layout}),this.displayDefaultTooltip()}},{key:"displayDefaultTooltip",value:function(){var w=this.props,O=w.children,m=w.data,g=w.height,A=w.layout,S=ze(O,at);if(S){var P=S.props.defaultIndex;if(!(typeof P!="number"||P<0||P>this.state.tooltipTicks.length-1)){var E=this.state.tooltipTicks[P]&&this.state.tooltipTicks[P].value,T=Oc(this.state,m,P,E),$=this.state.tooltipTicks[P].coordinate,k=(this.state.offset.top+g)/2,C=A==="horizontal",j=C?{x:$,y:k}:{y:$,x:k},I=this.state.formattedGraphicalItems.find(function(B){var F=B.item;return F.type.name==="Scatter"});I&&(j=M(M({},j),I.props.points[P].tooltipPosition),T=I.props.points[P].tooltipPayload);var D={activeTooltipIndex:P,isTooltipActive:!0,activeLabel:E,activePayload:T,activeCoordinate:j};this.setState(D),this.renderCursor(S),this.accessibilityManager.setIndex(P)}}}},{key:"getSnapshotBeforeUpdate",value:function(w,O){if(!this.props.accessibilityLayer)return null;if(this.state.tooltipTicks!==O.tooltipTicks&&this.accessibilityManager.setDetails({coordinateList:this.state.tooltipTicks}),this.props.layout!==w.layout&&this.accessibilityManager.setDetails({layout:this.props.layout}),this.props.margin!==w.margin){var m,g;this.accessibilityManager.setDetails({offset:{left:(m=this.props.margin.left)!==null&&m!==void 0?m:0,top:(g=this.props.margin.top)!==null&&g!==void 0?g:0}})}return null}},{key:"componentDidUpdate",value:function(w){eu([ze(w.children,at)],[ze(this.props.children,at)])||this.displayDefaultTooltip()}},{key:"componentWillUnmount",value:function(){this.removeListener(),this.throttleTriggeredAfterMouseMove.cancel()}},{key:"getTooltipEventType",value:function(){var w=ze(this.props.children,at);if(w&&typeof w.props.shared=="boolean"){var O=w.props.shared?"axis":"item";return u.indexOf(O)>=0?O:a}return a}},{key:"getMouseInfo",value:function(w){if(!this.container)return null;var O=this.container,m=O.getBoundingClientRect(),g=PE(m),A={chartX:Math.round(w.pageX-g.left),chartY:Math.round(w.pageY-g.top)},S=m.width/O.offsetWidth||1,P=this.inRange(A.chartX,A.chartY,S);if(!P)return null;var E=this.state,T=E.xAxisMap,$=E.yAxisMap,k=this.getTooltipEventType(),C=bp(this.state,this.props.data,this.props.layout,P);if(k!=="axis"&&T&&$){var j=jt(T).scale,I=jt($).scale,D=j&&j.invert?j.invert(A.chartX):null,B=I&&I.invert?I.invert(A.chartY):null;return M(M({},A),{},{xValue:D,yValue:B},C)}return C?M(M({},A),C):null}},{key:"inRange",value:function(w,O){var m=arguments.length>2&&arguments[2]!==void 0?arguments[2]:1,g=this.props.layout,A=w/m,S=O/m;if(g==="horizontal"||g==="vertical"){var P=this.state.offset,E=A>=P.left&&A<=P.left+P.width&&S>=P.top&&S<=P.top+P.height;return E?{x:A,y:S}:null}var T=this.state,$=T.angleAxisMap,k=T.radiusAxisMap;if($&&k){var C=jt($);return th({x:A,y:S},C)}return null}},{key:"parseEventsOfWrapper",value:function(){var w=this.props.children,O=this.getTooltipEventType(),m=ze(w,at),g={};m&&O==="axis"&&(m.props.trigger==="click"?g={onClick:this.handleClick}:g={onMouseEnter:this.handleMouseEnter,onDoubleClick:this.handleDoubleClick,onMouseMove:this.handleMouseMove,onMouseLeave:this.handleMouseLeave,onTouchMove:this.handleTouchMove,onTouchStart:this.handleTouchStart,onTouchEnd:this.handleTouchEnd,onContextMenu:this.handleContextMenu});var A=ji(this.props,this.handleOuterEvent);return M(M({},A),g)}},{key:"addListener",value:function(){Vo.on(Yo,this.handleReceiveSyncEvent)}},{key:"removeListener",value:function(){Vo.removeListener(Yo,this.handleReceiveSyncEvent)}},{key:"filterFormatItem",value:function(w,O,m){for(var g=this.state.formattedGraphicalItems,A=0,S=g.length;A<S;A++){var P=g[A];if(P.item===w||P.props.key===w.key||O===mt(P.item.type)&&m===P.childIndex)return P}return null}},{key:"renderClipPath",value:function(){var w=this.clipPathId,O=this.state.offset,m=O.left,g=O.top,A=O.height,S=O.width;return _.createElement("defs",null,_.createElement("clipPath",{id:w},_.createElement("rect",{x:m,y:g,height:A,width:S})))}},{key:"getXScales",value:function(){var w=this.state.xAxisMap;return w?Object.entries(w).reduce(function(O,m){var g=yp(m,2),A=g[0],S=g[1];return M(M({},O),{},q({},A,S.scale))},{}):null}},{key:"getYScales",value:function(){var w=this.state.yAxisMap;return w?Object.entries(w).reduce(function(O,m){var g=yp(m,2),A=g[0],S=g[1];return M(M({},O),{},q({},A,S.scale))},{}):null}},{key:"getXScaleByAxisId",value:function(w){var O;return(O=this.state.xAxisMap)===null||O===void 0||(O=O[w])===null||O===void 0?void 0:O.scale}},{key:"getYScaleByAxisId",value:function(w){var O;return(O=this.state.yAxisMap)===null||O===void 0||(O=O[w])===null||O===void 0?void 0:O.scale}},{key:"getItemByXY",value:function(w){var O=this.state,m=O.formattedGraphicalItems,g=O.activeItem;if(m&&m.length)for(var A=0,S=m.length;A<S;A++){var P=m[A],E=P.props,T=P.item,$=T.type.defaultProps!==void 0?M(M({},T.type.defaultProps),T.props):T.props,k=mt(T.type);if(k==="Bar"){var C=(E.data||[]).find(function(B){return hN(w,B)});if(C)return{graphicalItem:P,payload:C}}else if(k==="RadialBar"){var j=(E.data||[]).find(function(B){return th(w,B)});if(j)return{graphicalItem:P,payload:j}}else if(lo(P,g)||fo(P,g)||Jn(P,g)){var I=vL({graphicalItem:P,activeTooltipItem:g,itemData:$.data}),D=$.activeIndex===void 0?I:$.activeIndex;return{graphicalItem:M(M({},P),{},{childIndex:D}),payload:Jn(P,g)?$.data[I]:P.props.data[I]}}}return null}},{key:"render",value:function(){var w=this;if(!Gs(this))return null;var O=this.props,m=O.children,g=O.className,A=O.width,S=O.height,P=O.style,E=O.compact,T=O.title,$=O.desc,k=mp(O,D3),C=Z(k,!1);if(E)return _.createElement(Yh,{state:this.state,width:this.props.width,height:this.props.height,clipPathId:this.clipPathId},_.createElement(ru,gr({},C,{width:A,height:S,title:T,desc:$}),this.renderClipPath(),Ks(m,this.renderMap)));if(this.props.accessibilityLayer){var j,I;C.tabIndex=(j=this.props.tabIndex)!==null&&j!==void 0?j:0,C.role=(I=this.props.role)!==null&&I!==void 0?I:"application",C.onKeyDown=function(B){w.accessibilityManager.keyboardEvent(B)},C.onFocus=function(){w.accessibilityManager.focus()}}var D=this.parseEventsOfWrapper();return _.createElement(Yh,{state:this.state,width:this.props.width,height:this.props.height,clipPathId:this.clipPathId},_.createElement("div",gr({className:ee("recharts-wrapper",g),style:M({position:"relative",cursor:"default",width:A,height:S},P)},D,{ref:function(F){w.container=F}}),_.createElement(ru,gr({},C,{width:A,height:S,title:T,desc:$,style:J3}),this.renderClipPath(),Ks(m,this.renderMap)),this.renderLegend(),this.renderTooltip()))}}])}(L.Component);q(y,"displayName",r),q(y,"defaultProps",M({layout:"horizontal",stackOffset:"none",barCategoryGap:"10%",barGap:4,margin:{top:5,right:5,bottom:5,left:5},reverseStackOrder:!1,syncMethod:"index"},l)),q(y,"getDerivedStateFromProps",function(d,b){var x=d.dataKey,w=d.data,O=d.children,m=d.width,g=d.height,A=d.layout,S=d.stackOffset,P=d.margin,E=b.dataStartIndex,T=b.dataEndIndex;if(b.updateId===void 0){var $=xp(d);return M(M(M({},$),{},{updateId:0},p(M(M({props:d},$),{},{updateId:0}),b)),{},{prevDataKey:x,prevData:w,prevWidth:m,prevHeight:g,prevLayout:A,prevStackOffset:S,prevMargin:P,prevChildren:O})}if(x!==b.prevDataKey||w!==b.prevData||m!==b.prevWidth||g!==b.prevHeight||A!==b.prevLayout||S!==b.prevStackOffset||!br(P,b.prevMargin)){var k=xp(d),C={chartX:b.chartX,chartY:b.chartY,isTooltipActive:b.isTooltipActive},j=M(M({},bp(b,w,A)),{},{updateId:b.updateId+1}),I=M(M(M({},k),C),j);return M(M(M({},I),p(M({props:d},I),b)),{},{prevDataKey:x,prevData:w,prevWidth:m,prevHeight:g,prevLayout:A,prevStackOffset:S,prevMargin:P,prevChildren:O})}if(!eu(O,b.prevChildren)){var D,B,F,G,K=ze(O,Dr),z=K&&(D=(B=K.props)===null||B===void 0?void 0:B.startIndex)!==null&&D!==void 0?D:E,X=K&&(F=(G=K.props)===null||G===void 0?void 0:G.endIndex)!==null&&F!==void 0?F:T,le=z!==E||X!==T,ye=!Q(w),Be=ye&&!le?b.updateId:b.updateId+1;return M(M({updateId:Be},p(M(M({props:d},b),{},{updateId:Be,dataStartIndex:z,dataEndIndex:X}),b)),{},{prevChildren:O,dataStartIndex:z,dataEndIndex:X})}return null}),q(y,"renderActiveDot",function(d,b,x){var w;return L.isValidElement(d)?w=L.cloneElement(d,b):V(d)?w=d(b):w=_.createElement(so,b),_.createElement(ce,{className:"recharts-active-dot",key:x},w)});var v=L.forwardRef(function(b,x){return _.createElement(y,gr({},b,{ref:x}))});return v.displayName=y.displayName,v},sW=cW({chartName:"AreaChart",GraphicalChild:Bt,axisComponents:[{axisType:"xAxis",AxisComp:bo},{axisType:"yAxis",AxisComp:xo}],formatAxisMap:FR});function lW(e,t){const r=new Map,n=e.map(i=>i.sessionId);for(const i of e)for(const a of i.data){let o=r.get(a.ts);if(!o){o={ts:a.ts,total:0};for(const u of n)o[u]=0;r.set(a.ts,o)}o[i.sessionId]=a.tokens}for(const i of t){let a=r.get(i.ts);if(!a){a={ts:i.ts,total:0};for(const o of n)a[o]=0;r.set(i.ts,a)}a.total=i.tokens}return[...r.values()].sort((i,a)=>i.ts-a.ts)}function Op(e){return new Date(e).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit"})}function Ap(e){const t=Number(e);return Number.isFinite(t)?t.toLocaleString():String(e)}function Sp(e){return`grad-${e.replace(/[^a-zA-Z0-9_-]/g,"_")}`}function fW({series:e,totals:t}){const r=L.useMemo(()=>lW(e,t),[e,t]);return e.length===0?U.jsx("div",{className:"sessions-chart-empty",children:"No token samples in this window yet."}):U.jsx("div",{className:"sessions-chart",children:U.jsx(bE,{width:"100%",height:360,children:U.jsxs(sW,{data:r,margin:{top:8,right:16,left:0,bottom:0},children:[U.jsx("defs",{children:e.map(n=>U.jsxs("linearGradient",{id:Sp(n.sessionId),x1:"0",y1:"0",x2:"0",y2:"1",children:[U.jsx("stop",{offset:"5%",stopColor:n.color,stopOpacity:.7}),U.jsx("stop",{offset:"95%",stopColor:n.color,stopOpacity:.25})]},`${n.sessionId}-grad`))}),U.jsx(By,{strokeDasharray:"3 3",stroke:"#30363d"}),U.jsx(bo,{dataKey:"ts",type:"number",domain:["dataMin","dataMax"],tickFormatter:n=>Op(n),stroke:"#8b949e",tick:{fontSize:11},scale:"time"}),U.jsx(xo,{stroke:"#8b949e",tick:{fontSize:11},width:56,tickFormatter:n=>Ap(n)}),U.jsx(at,{labelFormatter:n=>Op(n),formatter:n=>[Ap(n),"tokens"],contentStyle:{background:"#161b22",border:"1px solid #30363d",borderRadius:"6px",color:"#e6edf3"},labelStyle:{color:"#8b949e",fontSize:12}}),U.jsx(Jt,{wrapperStyle:{fontSize:12}}),e.map(n=>U.jsx(Bt,{type:"monotone",dataKey:n.sessionId,name:n.label,stackId:"1",stroke:n.color,fill:`url(#${Sp(n.sessionId)})`,fillOpacity:1,isAnimationActive:!1,dot:!1},n.sessionId)),U.jsx(go,{type:"monotone",dataKey:"total",name:"Total",stroke:"#e6edf3",strokeWidth:1.5,strokeDasharray:"4 2",dot:!1,isAnimationActive:!1})]})})})}const _p=["PID","Repo","Model","Context %","Tokens / Window","Last Heartbeat","State Dir","Trend"];function hW(e){const t=Math.max(0,Math.round(e/1e3));if(t<60)return`${t}s ago`;const r=Math.floor(t/60);return r<60?`${r}m ${t%60}s ago`:`${Math.floor(r/60)}h ${r%60}m ago`}function Pp(e){return e==null?"—":e>=1e5?`${(e/1e3).toFixed(0)}k`:e>=1e3?`${(e/1e3).toFixed(1)}k`:e.toLocaleString()}function pW(e){return e==null?"sessions-pct-ok":e>=85?"sessions-pct-err":e>=60?"sessions-pct-warn":"sessions-pct-ok"}function dW(e){return e==null?"—":`${Math.round(e)}%`}function vW(e,t){return e==null?"—":`${Pp(e)} / ${Pp(t)}`}function yW({points:e,color:t}){if(e.length<2)return U.jsx("span",{className:"sessions-sparkline-empty",children:"—"});const r=Math.min(...e),i=Math.max(...e)-r||1,a=64,o=18,u=a/(e.length-1),c=e.map((s,f)=>{const l=f*u,h=o-(s-r)/i*o;return`${f===0?"M":"L"} ${l.toFixed(1)} ${h.toFixed(1)}`});return U.jsx("svg",{className:"sessions-sparkline",width:a,height:o,viewBox:`0 0 ${a} ${o}`,role:"img","aria-label":"token trend",children:U.jsx("path",{d:c.join(" "),fill:"none",stroke:t,strokeWidth:"1.5",strokeLinejoin:"round",strokeLinecap:"round"})})}function mW(e){const t=new Map;for(const r of e)t.set(r.sessionId,r);return t}function gW({sessions:e,series:t}){const r=mW(t),n=Date.now();return U.jsx("div",{className:"sessions-table-scroll",children:U.jsxs("table",{className:"sessions-table",children:[U.jsx("thead",{children:U.jsx("tr",{children:_p.map((i,a)=>U.jsx("th",{className:a>=3&&a!==6?"num":void 0,children:i},i))})}),U.jsxs("tbody",{children:[e.length===0&&U.jsx("tr",{className:"sessions-empty-row",children:U.jsx("td",{colSpan:_p.length,children:"No active sessions."})}),e.map(i=>{const a=r.get(i.sessionId),o=a?.data.map(c=>c.tokens)??[],u=a?.color??"#58a6ff";return U.jsxs("tr",{children:[U.jsx("td",{className:"num",children:i.pid}),U.jsx("td",{title:i.repoRoot??void 0,children:i.displayName||i.repoRoot||"—"}),U.jsx("td",{children:i.model??"—"}),U.jsx("td",{className:"num",children:U.jsx("span",{className:`sessions-pct-pill ${pW(i.percent)}`,children:dW(i.percent)})}),U.jsx("td",{className:"num",children:vW(i.tokens,i.ctxWindow)}),U.jsx("td",{className:"num",children:hW(n-i.lastSeen)}),U.jsx("td",{title:i.stateDir??void 0,className:"sessions-meta",children:i.stateDir?i.stateDir.split("/").pop()||i.stateDir:"—"}),U.jsx("td",{children:U.jsx(yW,{points:o,color:u})})]},`${i.pid}:${i.sessionId}`)})]})]})})}function bW(e){return e.type==="session_sample"}const $p=[{value:5,label:"5m"},{value:15,label:"15m"},{value:30,label:"30m"},{value:60,label:"60m"}];function xW({sessions:e}){const t=e.sessions.length,r=e.sessions.reduce((a,o)=>a+(o.tokens??0),0),n=e.sessions.reduce((a,o)=>Math.max(a,o.ctxWindow),0),i=n>0?r/n*100:0;return U.jsxs("div",{className:"sessions-summary-tiles",children:[U.jsxs("div",{className:"tile",children:[U.jsx("span",{className:"tile-label",children:"Active sessions"}),U.jsx("span",{className:"tile-value",children:t})]}),U.jsxs("div",{className:"tile",children:[U.jsx("span",{className:"tile-label",children:"Combined tokens"}),U.jsx("span",{className:"tile-value",children:r>=1e5?`${(r/1e3).toFixed(0)}k`:r.toLocaleString()})]}),U.jsxs("div",{className:"tile",children:[U.jsx("span",{className:"tile-label",children:"Combined % of max window"}),U.jsxs("span",{className:"tile-value",children:[Math.round(i),"%"]})]}),U.jsxs("div",{className:"tile",children:[U.jsx("span",{className:"tile-label",children:"Pruned (stale)"}),U.jsx("span",{className:"tile-value",children:e.pruned})]})]})}function AW(){const[e,t]=L.useState(30),{data:r,error:n,refetch:i}=Ms(L.useCallback(()=>om(),[]),{pollInterval:2e3}),{data:a,error:o,refetch:u}=Ms(L.useCallback(()=>um(e),[e]),{pollInterval:2e3}),{events:c}=cm(),s=L.useMemo(()=>c.filter(bW),[c]),f=L.useMemo(()=>s.length===0?null:s[s.length-1].ts,[s]);if(L.useEffect(()=>{f!=null&&(i(),u())},[f,i,u]),n&&!r)return U.jsxs("div",{className:"tab-stub",children:["Error loading sessions: ",n.message]});if(o&&!a)return U.jsxs("div",{className:"tab-stub",children:["Error loading timeseries: ",o.message]});if(!r)return U.jsx("div",{className:"tab-stub",children:"Loading sessions…"});const l=r.sessions,h=a?.series??[],p=a?.totals??[],y=$p.find(v=>v.value===e)?.label??`${e}m`;return U.jsxs("div",{className:"sessions-tab",children:[U.jsxs("div",{className:"sessions-toolbar",children:[U.jsx("h2",{children:"Session Memory Graph"}),U.jsx("div",{className:"sessions-window-select",children:$p.map(v=>U.jsx("button",{type:"button",className:`sessions-window-btn ${e===v.value?"active":""}`,onClick:()=>t(v.value),"aria-pressed":e===v.value,children:v.label},v.value))})]}),l.length===0?U.jsx("div",{className:"sessions-empty",children:"No active sessions."}):U.jsxs(U.Fragment,{children:[U.jsx(xW,{sessions:r}),U.jsx(fW,{series:h,totals:p}),U.jsx("h2",{className:"section-header",children:"Active Sessions"}),U.jsx(gW,{sessions:l,series:h}),U.jsxs("div",{className:"sessions-footer",children:[h.length," series · ",p.length," timestamps ·"," ",y," window · updated"," ",a?.updatedAt??r.updatedAt]})]})]})}export{AW as default};
70
- //# sourceMappingURL=SessionsTab-mz_vz8i2.js.map
70
+ //# sourceMappingURL=SessionsTab-CCYd-kSz.js.map