pi-mega-compact 0.11.5 → 0.11.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/extensions/dashboard-server/api-contracts/cache-stripes.js +8 -0
- package/dist/extensions/dashboard-server/api-contracts/endpoints.js +13 -0
- package/dist/extensions/dashboard-server/api-contracts/memory-map.js +1 -0
- package/dist/extensions/dashboard-server/routes-cache.js +28 -0
- package/dist/extensions/dashboard-server/routes-game.js +3 -0
- package/dist/extensions/dashboard-server/routes-memory-map.js +50 -0
- package/dist/extensions/dashboard-server/routes-setup.js +105 -0
- package/dist/extensions/dashboard-server/routes.js +3 -1
- package/dist/extensions/dashboard-server/server.js +7 -1
- package/dist/extensions/mega-compact.js +5 -0
- package/dist/extensions/mega-config.js +5 -0
- package/dist/extensions/mega-events/context-handler.js +10 -2
- package/dist/extensions/mega-events/perf-handler.js +83 -1
- package/dist/extensions/mega-events/separated-prompt.js +248 -0
- package/dist/extensions/mega-runtime/env-loader.js +56 -0
- package/dist/extensions/mega-runtime/reset-runtime.js +1 -0
- package/dist/extensions/mega-runtime/runtime-snapshot.js +1 -0
- package/dist/extensions/mega-runtime/runtime.js +1 -0
- package/dist/extensions/mega-runtime/snapshot.js +1 -0
- package/dist/extensions/mega-runtime/widget.js +5 -0
- package/dist/src/cache-stripe-impl.js +288 -0
- package/dist/src/cache-stripe.js +11 -0
- package/dist/src/config/stopwords.js +24 -0
- package/dist/src/config.js +17 -0
- package/dist/src/memoryGraph.js +299 -0
- package/dist/src/monitoring.js +13 -0
- package/dist/src/queryExpansion.js +163 -0
- package/dist/src/queryReformulation/cache.js +123 -0
- package/dist/src/queryReformulation/rrf.js +29 -0
- package/dist/src/queryReformulation/tfidf.js +61 -0
- package/dist/src/queryReformulation/vagueness.js +33 -0
- package/dist/src/queryReformulation.js +225 -0
- package/dist/src/recallMetrics.js +258 -0
- package/dist/src/store/sqlite/cache-stripes.js +133 -0
- package/dist/src/store/sqlite/fts5-search.js +68 -0
- package/dist/src/store/sqlite/perf-samples.js +1 -0
- package/dist/src/store/sqlite/schema.js +60 -1
- package/dist/src/store/sqlite.js +1 -0
- package/dist/src/store/vectorIndex.js +29 -5
- package/dist/src/tiered-router/types.js +18 -0
- package/dist/src/tieredRouter.js +421 -0
- package/dist/src/vectorStore.js +8 -6
- package/extensions/dashboard-client/dist/assets/{AchievementTiles-BoL7qBOJ.js → AchievementTiles-DR9cLGDL.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{AchievementTiles-BoL7qBOJ.js.map → AchievementTiles-DR9cLGDL.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{AchievementsTab-BFDE3HYc.js → AchievementsTab-svNUgJ1e.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{AchievementsTab-BFDE3HYc.js.map → AchievementsTab-svNUgJ1e.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/CacheTab-ASwhOMjR.js +2 -0
- package/extensions/dashboard-client/dist/assets/CacheTab-ASwhOMjR.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/{ConfigTab-DDFE-ckA.js → ConfigTab-CmmWheuW.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{ConfigTab-DDFE-ckA.js.map → ConfigTab-CmmWheuW.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{EventsTab-B6UxZ7PM.js → EventsTab-CFE7jLsa.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{EventsTab-B6UxZ7PM.js.map → EventsTab-CFE7jLsa.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/GameTab-CJAX_th_.js +2 -0
- package/extensions/dashboard-client/dist/assets/{GameTab-DehUX-KE.js.map → GameTab-CJAX_th_.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{MaintenanceTab-0GWRt4wn.js → MaintenanceTab-P4SUsvMf.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{MaintenanceTab-0GWRt4wn.js.map → MaintenanceTab-P4SUsvMf.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/MemoryMapTab-BBiH76eF.js +2 -0
- package/extensions/dashboard-client/dist/assets/MemoryMapTab-BBiH76eF.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/{MetricsTab-C3rwMVsN.js → MetricsTab-CHQscixy.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{MetricsTab-C3rwMVsN.js.map → MetricsTab-CHQscixy.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{OverviewTab-39O9_x5j.js → OverviewTab-DBs4DJdd.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{OverviewTab-39O9_x5j.js.map → OverviewTab-DBs4DJdd.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{ReposTab-Cfj6Q5sH.js → ReposTab-DeFz76L5.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{ReposTab-Cfj6Q5sH.js.map → ReposTab-DeFz76L5.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{SessionsTab-DXDTCi3r.js → SessionsTab-BWNsj1OB.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{SessionsTab-DXDTCi3r.js.map → SessionsTab-BWNsj1OB.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/SetupTab-uS6A0xmw.js +2 -0
- package/extensions/dashboard-client/dist/assets/SetupTab-uS6A0xmw.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/{TimeSavedCard-Cw1dJ4e9.js → TimeSavedCard-CiqCOQuL.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{TimeSavedCard-Cw1dJ4e9.js.map → TimeSavedCard-CiqCOQuL.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{TopicsTab-BAw972BV.js → TopicsTab-BWWQxltv.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{TopicsTab-BAw972BV.js.map → TopicsTab-BWWQxltv.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{TurnsTab-Cf5mGIdl.js → TurnsTab-CVz4f4-o.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{TurnsTab-Cf5mGIdl.js.map → TurnsTab-CVz4f4-o.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/index-CUNn22iV.css +1 -0
- package/extensions/dashboard-client/dist/assets/{index-4gQ7auad.js → index-DrktNOoT.js} +11 -11
- package/extensions/dashboard-client/dist/assets/index-DrktNOoT.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/{useSSE-DNgMuyP6.js → useSSE-Bf5LOLSi.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{useSSE-DNgMuyP6.js.map → useSSE-Bf5LOLSi.js.map} +1 -1
- package/extensions/dashboard-client/dist/index.html +2 -2
- package/extensions/dashboard-client/src/App.tsx +24 -8
- package/extensions/dashboard-client/src/api/client.ts +15 -0
- package/extensions/dashboard-client/src/components/CacheHitRateTrendCard.tsx +100 -0
- package/extensions/dashboard-client/src/components/StripeDistributionCard.tsx +110 -0
- package/extensions/dashboard-client/src/components/TabBar.tsx +49 -4
- package/extensions/dashboard-client/src/main.tsx +1 -0
- package/extensions/dashboard-client/src/styles/base.css +30 -0
- package/extensions/dashboard-client/src/styles/cache.css +167 -0
- package/extensions/dashboard-client/src/tabs/CacheTab.tsx +75 -13
- package/extensions/dashboard-client/src/tabs/MemoryMapTab.tsx +440 -0
- package/extensions/dashboard-client/src/tabs/SetupTab.tsx +65 -2
- package/extensions/dashboard-server/api-contracts/cache-stripes.ts +49 -0
- package/extensions/dashboard-server/api-contracts/endpoints.ts +31 -1
- package/extensions/dashboard-server/api-contracts/index.ts +16 -1
- package/extensions/dashboard-server/api-contracts/memory-map.ts +50 -0
- package/extensions/dashboard-server/api-contracts/setup.ts +22 -0
- package/extensions/dashboard-server/routes-cache.ts +36 -1
- package/extensions/dashboard-server/routes-game.ts +3 -0
- package/extensions/dashboard-server/routes-memory-map.ts +105 -0
- package/extensions/dashboard-server/routes-setup.ts +112 -0
- package/extensions/dashboard-server/routes.ts +3 -1
- package/extensions/dashboard-server/server.ts +6 -0
- package/extensions/mega-compact.ts +5 -0
- package/extensions/mega-config.ts +17 -0
- package/extensions/mega-events/context-handler.ts +10 -2
- package/extensions/mega-events/perf-handler.ts +111 -1
- package/extensions/mega-events/separated-prompt.ts +329 -0
- package/extensions/mega-runtime/env-loader.ts +55 -0
- package/extensions/mega-runtime/helpers.ts +2 -0
- package/extensions/mega-runtime/reset-runtime.ts +1 -0
- package/extensions/mega-runtime/runtime-snapshot.ts +1 -0
- package/extensions/mega-runtime/runtime.ts +1 -0
- package/extensions/mega-runtime/snapshot.ts +6 -0
- package/extensions/mega-runtime/widget-types.ts +3 -0
- package/extensions/mega-runtime/widget.ts +5 -0
- package/package.json +1 -1
- package/src/cache-stripe-impl.ts +385 -0
- package/src/cache-stripe.ts +18 -0
- package/src/config/stopwords.ts +25 -0
- package/src/config.ts +26 -0
- package/src/memoryGraph.ts +438 -0
- package/src/monitoring.ts +35 -0
- package/src/queryExpansion.ts +206 -0
- package/src/queryReformulation/cache.ts +169 -0
- package/src/queryReformulation/rrf.ts +51 -0
- package/src/queryReformulation/tfidf.ts +79 -0
- package/src/queryReformulation/vagueness.ts +38 -0
- package/src/queryReformulation.ts +355 -0
- package/src/recallMetrics.ts +388 -0
- package/src/store/sqlite/cache-stripes.ts +196 -0
- package/src/store/sqlite/fts5-search.ts +90 -0
- package/src/store/sqlite/perf-samples.ts +3 -1
- package/src/store/sqlite/schema.ts +60 -1
- package/src/store/sqlite.ts +1 -0
- package/src/store/vectorIndex.ts +38 -7
- package/src/tiered-router/types.ts +64 -0
- package/src/tieredRouter.ts +489 -0
- package/src/vectorStore.ts +9 -5
- package/extensions/dashboard-client/dist/assets/CacheTab-eKVc-NV1.js +0 -2
- package/extensions/dashboard-client/dist/assets/CacheTab-eKVc-NV1.js.map +0 -1
- package/extensions/dashboard-client/dist/assets/GameTab-DehUX-KE.js +0 -2
- package/extensions/dashboard-client/dist/assets/SetupTab-mMlfunJa.js +0 -2
- package/extensions/dashboard-client/dist/assets/SetupTab-mMlfunJa.js.map +0 -1
- package/extensions/dashboard-client/dist/assets/index-4gQ7auad.js.map +0 -1
- package/extensions/dashboard-client/dist/assets/index-BEdKlpAB.css +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReposTab-Cfj6Q5sH.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 * Columns: Repo, Model, Tier, Context %, State, Compactions s/t,\n * Cache Hits s/t, Cache Hit %, Cache Read, Cache Write, Est. Saved,\n * Compact s/t (s), CacheHit s/t (s).\n * Data from fetchServers() via useApi with 10s polling.\n */\n\nimport type React from \"react\";\nimport type { ServerEntry } from \"@contracts\";\nimport { fmtTokens } from \"@/utils/format.ts\";\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\"Cache Hit %\",\n\t\"Est. Saved\",\n\t\"Cache Read\",\n\t\"Cache Write\",\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 cache-hit,\n\t\t\t\tcompaction, and time-saved (est.) totals pulled live from each\n\t\t\t\trepo'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 key={h} className={i >= 3 && i !== 4 ? \"num\" : undefined}>\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={HEADERS.length} 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}>{r.displayName || r.repoRoot}</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{r.providerCache != null\n\t\t\t\t\t\t\t\t\t\t\t? `${r.providerCache.avgHitPct.toFixed(1)}%`\n\t\t\t\t\t\t\t\t\t\t\t: \"—\"}\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{r.providerCache?.estimatedSaved != null\n\t\t\t\t\t\t\t\t\t\t\t? `$${r.providerCache.estimatedSaved.toFixed(2)}`\n\t\t\t\t\t\t\t\t\t\t\t: \"—\"}\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{r.providerCache?.cacheRead != null\n\t\t\t\t\t\t\t\t\t\t\t? fmtTokens(r.providerCache.cacheRead)\n\t\t\t\t\t\t\t\t\t\t\t: \"—\"}\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{r.providerCache?.cacheWrite != null\n\t\t\t\t\t\t\t\t\t\t\t? fmtTokens(r.providerCache.cacheWrite)\n\t\t\t\t\t\t\t\t\t\t\t: \"—\"}\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\";\nimport { computeCacheSavings } from \"@pricing\";\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\tcacheRead: number;\n\tcacheWrite: 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\tcacheRead: 0,\n\t\t\t\tcacheWrite: 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.providerCacheRead) g.cacheRead += r.providerCacheRead;\n\t\tif (r.providerCacheWrite) g.cacheWrite += r.providerCacheWrite;\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 & cost mega-compact has reclaimed, grouped by the\n\t\t\t\tmodel you were running. Compression ratio reflects workload/content, not\n\t\t\t\tmodel 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\n\t\t\t\t\t\t\t\tclassName=\"num\"\n\t\t\t\t\t\t\t\ttitle=\"Provider prompt-cache hit rate (reads / reads+writes+tokens_in)\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tCache Hit %\n\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t<th\n\t\t\t\t\t\t\t\tclassName=\"num\"\n\t\t\t\t\t\t\t\ttitle=\"Estimated provider prompt-cache savings (read tokens * 0.9 * inputRate − write tokens * 0.25 * inputRate)\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tCache $ Saved\n\t\t\t\t\t\t\t</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={16} 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 = g.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 ? \"\\u2014\" : g.reasoning ? \"yes\" : \"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\">{g.tokensIn.toLocaleString()}</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">{g.tokensOut.toLocaleString()}</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">{freed.toLocaleString()}</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">{collapseNum(g.ctxWindows)}</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">{collapseNum(g.maxTokens)}</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\">{g.sessions.toLocaleString()}</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">{g.checkpoints.toLocaleString()}</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">{collapseRate(g.inRates)}</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">{collapseRate(g.outRates)}</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\">\n\t\t\t\t\t\t\t\t\t\t{g.cacheRead > 0\n\t\t\t\t\t\t\t\t\t\t\t? `${(\n\t\t\t\t\t\t\t\t\t\t\t\t\t(g.cacheRead * 100) /\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t(g.cacheRead + g.cacheWrite + g.tokensIn || 1)\n\t\t\t\t\t\t\t\t\t\t\t\t).toFixed(1)}%`\n\t\t\t\t\t\t\t\t\t\t\t: \"—\"}\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.cacheRead > 0\n\t\t\t\t\t\t\t\t\t\t\t? `$${computeCacheSavings(g.cacheRead, g.cacheWrite, g.inRates[0] || 0).netSaved.toFixed(4)}`\n\t\t\t\t\t\t\t\t\t\t\t: \"—\"}\n\t\t\t\t\t\t\t\t\t</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 Out =\n\t\t\t\tΣ compacted summary tokens still retained in context. Freed = Tokens In\n\t\t\t\t− Tokens Out (net context reclaimed). Ctx Window / Max Out / Reas. come\n\t\t\t\tfrom 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 & 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","fmtTokens","collapseNum","samples","lo","hi","collapseRate","aggregate","map","g","TOOLTIPS","SavingsByModelTable","groups","freed","usd","when","reas","computeCacheSavings","fetchIndexTyped","fetchIndex","ReposTab","selected","setSelected","indexData","indexErr","useApi","useCallback","serversData","fetchServers","summary"],"mappings":"uJAqBA,SAASA,EAAYC,EAAmB,CACvC,OAAIA,GAAK,QAAkB,IAAIA,EAAI,SAAW,QAAQ,CAAC,CAAC,OACpDA,GAAK,KAAa,IAAIA,EAAI,MAAM,QAAQ,CAAC,CAAC,OACvC,GAAGA,CAAC,IACZ,CAGA,SAASC,EAAIC,EAAmB,CAC/B,OAAIA,GAAK,IAAkB,IAAIA,EAAI,KAAW,QAAQ,CAAC,CAAC,IACpDA,GAAK,IAAc,IAAIA,EAAI,KAAO,QAAQ,CAAC,CAAC,IACzC,OAAOA,CAAC,CAChB,CAEO,SAASC,EAAa,CAC5B,WAAAC,EACA,iBAAAC,EACA,iBAAAC,EACA,wBAAAC,CACD,EAA0C,CACzC,OACCC,EAAAA,KAAC,MAAA,CAAI,UAAU,gBACd,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,OACd,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,aAAa,SAAA,eAAY,QACxC,OAAA,CAAK,UAAU,aAAc,SAAAL,EAAW,gBAAe,CAAE,CAAA,EAC3D,EACAI,EAAAA,KAAC,MAAA,CAAI,UAAU,OACd,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,aAAa,SAAA,oBAAiB,QAC7C,OAAA,CAAK,UAAU,aAAc,SAAAJ,EAAiB,gBAAe,CAAE,CAAA,EACjE,EACAG,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACd,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,aAAa,SAAA,qBAAkB,QAC9C,OAAA,CAAK,UAAU,aAAc,SAAAR,EAAIK,CAAgB,CAAA,CAAE,CAAA,EACrD,EACAE,EAAAA,KAAC,MAAA,CAAI,UAAU,OACd,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,aAAa,SAAA,sBAAmB,QAC/C,OAAA,CAAK,UAAU,aAAc,SAAAV,EAAYQ,CAAuB,CAAA,CAAE,CAAA,CAAA,CACpE,CAAA,EACD,CAEF,CC/BA,MAAMG,EAAkD,CACvD,CAAE,IAAK,cAAe,MAAO,MAAA,EAC7B,CAAE,IAAK,YAAa,MAAO,OAAA,EAC3B,CAAE,IAAK,kBAAmB,MAAO,aAAA,EACjC,CAAE,IAAK,cAAe,MAAO,cAAA,EAC7B,CAAE,IAAK,0BAA2B,MAAO,UAAA,EACzC,CAAE,IAAK,kBAAmB,MAAO,gBAAA,CAClC,EAGA,SAASX,EAAYC,EAAmB,CACvC,OAAIA,GAAK,QAAkB,IAAIA,EAAI,SAAW,QAAQ,CAAC,CAAC,OACpDA,GAAK,KAAa,IAAIA,EAAI,MAAM,QAAQ,CAAC,CAAC,OACvC,GAAGA,CAAC,IACZ,CAEA,SAASW,EAASC,EAA2B,CAC5C,GAAIA,GAAO,KAA0B,MAAO,IAC5C,GAAI,CACH,OAAO,IAAI,KAAKA,CAAE,EAAE,eAAA,CACrB,MAAQ,CACP,OAAO,OAAOA,CAAE,CACjB,CACD,CAEO,SAASC,EAAU,CACzB,MAAAC,EACA,SAAAC,CACD,EAAuC,CACtC,KAAM,CAACC,EAAQC,CAAS,EAAIC,EAAAA,SAAS,EAAE,EACjC,CAACC,EAASC,CAAU,EAAIF,EAAAA,SAAkB,iBAAiB,EAC3D,CAACG,EAASC,CAAU,EAAIJ,EAAAA,SAAkB,MAAM,EAEhDK,EAAWC,EAAAA,QAAQ,IAAM,CAC9B,MAAMC,EAAIT,EAAO,KAAA,EAAO,YAAA,EAClBU,EAAOD,EACVX,EAAM,OAAQa,GAAMA,EAAE,YAAY,YAAA,EAAc,SAASF,CAAC,CAAC,EAC3DX,EAAM,MAAA,EACT,OAAAY,EAAK,KAAK,CAACE,EAAG5B,IAAM,CACnB,MAAM6B,EAAKD,EAAET,CAAO,EACdW,EAAK9B,EAAEmB,CAAO,EAEdY,EAAQF,GAAO,KACfG,EAAQF,GAAO,KACrB,GAAIC,GAASC,EAAO,MAAO,GAC3B,GAAID,EAAO,OAAOV,IAAY,OAAS,EAAI,GAC3C,GAAIW,EAAO,OAAOX,IAAY,OAAS,GAAK,EAC5C,MAAMY,EACL,OAAOJ,GAAO,UAAY,OAAOC,GAAO,SACrCD,EAAKC,EACL,OAAOD,CAAE,EAAE,cAAc,OAAOC,CAAE,CAAC,EACvC,OAAOT,IAAY,OAAS,CAACY,EAAMA,CACpC,CAAC,EACMP,CACR,EAAG,CAACZ,EAAOE,EAAQG,EAASE,CAAO,CAAC,EAE9Ba,EAAcC,GAAuB,CACtChB,IAAYgB,EACfb,EAAYc,GAAOA,IAAM,MAAQ,OAAS,KAAM,GAEhDhB,EAAWe,CAAG,EACdb,EACCa,IAAQ,mBACRA,IAAQ,eACRA,IAAQ,0BACL,OACA,KAAA,EAGN,EAEA,OACC3B,EAAAA,KAAC,MAAA,CAAI,UAAU,kBACd,SAAA,CAAAC,EAAAA,IAAC,QAAA,CACA,KAAK,SACL,UAAU,cACV,YAAY,gBACZ,MAAOO,EACP,SAAWqB,GAAMpB,EAAUoB,EAAE,OAAO,KAAK,EACzC,aAAW,cAAA,CAAA,EAEZ7B,EAAAA,KAAC,QAAA,CAAM,UAAU,aAChB,SAAA,CAAAC,EAAAA,IAAC,QAAA,CACA,eAAC,KAAA,CACC,SAAAC,EAAQ,IAAK4B,SACZ,KAAA,CACA,SAAA9B,EAAAA,KAAC,SAAA,CACA,KAAK,SACL,UAAW,eAAeW,IAAYmB,EAAI,IAAM,UAAUjB,CAAO,GAAK,EAAE,GACxE,QAAS,IAAMa,EAAWI,EAAI,GAAG,EAEhC,SAAA,CAAAA,EAAI,MACJnB,IAAYmB,EAAI,KAChB7B,EAAAA,IAAC,OAAA,CAAK,UAAU,aACd,SAAAY,IAAY,MAAQ,KAAO,IAAA,CAC7B,CAAA,CAAA,CAAA,CAEF,EAZQiB,EAAI,GAab,CACA,EACF,CAAA,CACD,SACC,QAAA,CACC,SAAA,CAAAf,EAAS,SAAW,GACpBd,MAAC,KAAA,CACA,SAAAA,EAAAA,IAAC,MAAG,QAASC,EAAQ,OAAQ,UAAU,aACrC,SAAAI,EAAM,SAAW,EACf,kCACA,8BACJ,EACD,EAEAS,EAAS,IAAKgB,GACd/B,OAAC,MAAuB,QAAS,IAAMO,EAASwB,CAAI,EACnD,SAAA,CAAA9B,EAAAA,IAAC,MAAG,UAAU,YAAY,MAAO8B,EAAK,SACpC,WAAK,WAAA,CACP,QACC,KAAA,CAAG,UAAU,aAAc,SAAAA,EAAK,WAAa,IAAS,QACtD,KAAA,CAAG,UAAU,MAAO,SAAAA,EAAK,gBAAgB,iBAAiB,QAC1D,KAAA,CAAG,UAAU,MAAO,SAAAA,EAAK,YAAY,iBAAiB,QACtD,KAAA,CAAG,UAAU,MAAO,SAAAxC,EAAYwC,EAAK,uBAAuB,EAAE,QAC9D,KAAA,CAAG,UAAU,MAAO,SAAA5B,EAAS4B,EAAK,eAAe,CAAA,CAAE,CAAA,CAAA,EAR5CA,EAAK,QASd,CACA,CAAA,CAAA,CACF,CAAA,CAAA,CACD,CAAA,EACD,CAEF,CC7IA,SAAStC,EAAIC,EAAmB,CAC/B,OAAIA,GAAK,IAAkB,IAAIA,EAAI,KAAW,QAAQ,CAAC,CAAC,IACpDA,GAAK,IAAc,IAAIA,EAAI,KAAO,QAAQ,CAAC,CAAC,IACzC,OAAOA,CAAC,CAChB,CAGA,SAASH,EAAYC,EAAmB,CACvC,OAAIA,GAAK,QAAkB,IAAIA,EAAI,SAAW,QAAQ,CAAC,CAAC,OACpDA,GAAK,KAAa,IAAIA,EAAI,MAAM,QAAQ,CAAC,CAAC,OACvC,GAAGA,CAAC,IACZ,CAEA,SAASW,EAASC,EAA2B,CAC5C,GAAIA,GAAO,KAA0B,MAAO,QAC5C,GAAI,CACH,OAAO,IAAI,KAAKA,CAAE,EAAE,eAAA,CACrB,MAAQ,CACP,OAAO,OAAOA,CAAE,CACjB,CACD,CAEO,SAAS4B,EAAgB,CAC/B,KAAAD,EACA,QAAAE,CACD,EAA6C,CAE5CC,OAAAA,EAAAA,UAAU,IAAM,CACf,MAAMC,EAAWN,GAA2B,CACvCA,EAAE,MAAQ,UAAUI,EAAA,CACzB,EACA,cAAO,iBAAiB,UAAWE,CAAO,EACnC,IAAM,OAAO,oBAAoB,UAAWA,CAAO,CAC3D,EAAG,CAACF,CAAO,CAAC,EAGXhC,EAAAA,IAAC,MAAA,CACA,UAAU,iBACV,QAASgC,EACT,KAAK,SACL,aAAW,OAEX,SAAAjC,EAAAA,KAAC,OAAI,UAAU,aAAa,QAAU6B,GAAMA,EAAE,gBAAA,EAC7C,SAAA,CAAA7B,EAAAA,KAAC,SAAA,CAAO,UAAU,eACjB,SAAA,CAAAC,EAAAA,IAAC,KAAA,CAAI,WAAK,WAAA,CAAY,EACtBA,EAAAA,IAAC,SAAA,CACA,KAAK,SACL,UAAU,cACV,QAASgC,EACT,aAAW,QACX,SAAA,GAAA,CAAA,CAED,EACD,EACAhC,EAAAA,IAAC,IAAA,CAAE,UAAU,aAAc,WAAK,SAAS,EACzCD,EAAAA,KAAC,MAAA,CAAI,UAAU,aACd,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,aACd,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,cAAc,SAAA,cAAW,QACxC,OAAA,CAAK,UAAU,cACd,SAAA8B,EAAK,gBAAgB,gBAAe,CACtC,CAAA,EACD,EACA/B,EAAAA,KAAC,MAAA,CAAI,UAAU,aACd,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,cAAc,SAAA,WAAQ,QACrC,OAAA,CAAK,UAAU,cACd,SAAA8B,EAAK,SAAS,gBAAe,CAC/B,CAAA,EACD,EACA/B,EAAAA,KAAC,MAAA,CAAI,UAAU,6BACd,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,cAAc,SAAA,eAAY,QACzC,OAAA,CAAK,UAAU,cAAe,SAAAR,EAAIsC,EAAK,WAAW,CAAA,CAAE,CAAA,EACtD,EACA/B,EAAAA,KAAC,MAAA,CAAI,UAAU,aACd,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,cAAc,SAAA,cAAW,QACxC,OAAA,CAAK,UAAU,cAAe,SAAAR,EAAIsC,EAAK,UAAU,CAAA,CAAE,CAAA,EACrD,EACA/B,EAAAA,KAAC,MAAA,CAAI,UAAU,aACd,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,cAAc,SAAA,iBAAc,QAC3C,OAAA,CAAK,UAAU,cAAe,SAAAR,EAAIsC,EAAK,aAAa,CAAA,CAAE,CAAA,EACxD,EACA/B,EAAAA,KAAC,MAAA,CAAI,UAAU,aACd,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,cAAc,SAAA,aAAU,EACxCA,EAAAA,IAAC,OAAA,CAAK,UAAU,cAAc,SAAA,GAAA,CAAC,CAAA,CAAA,CAChC,CAAA,EACD,EACAA,EAAAA,IAAC,MAAG,SAAA,OAAA,CAAK,EACTD,EAAAA,KAAC,KAAA,CAAG,UAAU,WACb,SAAA,CAAAC,EAAAA,IAAC,MAAG,SAAA,UAAA,CAAQ,EACZA,EAAAA,IAAC,KAAA,CAAI,SAAA8B,EAAK,cAAgB,IAAI,EAC9B9B,EAAAA,IAAC,MAAG,SAAA,OAAA,CAAK,EACTA,EAAAA,IAAC,KAAA,CAAI,SAAA8B,EAAK,WAAa,IAAI,EAC3B9B,EAAAA,IAAC,MAAG,SAAA,YAAA,CAAU,EACdA,EAAAA,IAAC,MAAI,SAAA8B,EAAK,YAAc,KAAO,GAAGA,EAAK,SAAS,SAAW,GAAA,CAAI,EAC/D9B,EAAAA,IAAC,MAAG,SAAA,aAAA,CAAW,EACfA,EAAAA,IAAC,MAAI,SAAA8B,EAAK,aAAe,KAAO,GAAGA,EAAK,UAAU,SAAW,GAAA,CAAI,EACjE9B,EAAAA,IAAC,MAAG,SAAA,gBAAA,CAAc,EAClBA,EAAAA,IAAC,MAAI,SAAA8B,EAAK,gBAAkB,KAAOtC,EAAIsC,EAAK,aAAa,EAAI,GAAA,CAAI,EACjE9B,EAAAA,IAAC,MAAG,SAAA,YAAA,CAAU,EACdA,EAAAA,IAAC,MAAI,SAAA8B,EAAK,YAAc,KAAOtC,EAAIsC,EAAK,SAAS,EAAI,GAAA,CAAI,EACzD9B,EAAAA,IAAC,MAAG,SAAA,WAAA,CAAS,EACbA,EAAAA,IAAC,MACC,SAAA8B,EAAK,YAAc,KAAO,IAAMA,EAAK,UAAY,KAAO,KAAA,CAC1D,CAAA,EACD,EACA9B,EAAAA,IAAC,MAAG,SAAA,UAAA,CAAQ,EACZD,EAAAA,KAAC,KAAA,CAAG,UAAU,WACb,SAAA,CAAAC,EAAAA,IAAC,MAAG,SAAA,gBAAA,CAAc,EAClBA,EAAAA,IAAC,KAAA,CAAI,SAAAE,EAAS4B,EAAK,eAAe,EAAE,EACpC9B,EAAAA,IAAC,MAAG,SAAA,WAAA,CAAS,EACbA,EAAAA,IAAC,KAAA,CAAI,SAAAE,EAAS4B,EAAK,QAAQ,EAAE,EAC7B9B,EAAAA,IAAC,MAAG,SAAA,qBAAA,CAAmB,EACvBA,EAAAA,IAAC,KAAA,CAAI,SAAAV,EAAYwC,EAAK,uBAAuB,CAAA,CAAE,CAAA,CAAA,CAChD,CAAA,CAAA,CACD,CAAA,CAAA,CAGH,CClHA,SAASK,EAAO,EAA+B,CAC9C,MAAMC,EAAI,GAAK,EACf,OAAIA,GAAK,KAAa,IAAIA,EAAI,MAAM,QAAQ,CAAC,CAAC,IAC1CA,GAAK,GAAW,GAAG,KAAK,MAAMA,EAAI,EAAE,CAAC,IACrCA,GAAK,EAAU,GAAGA,EAAE,QAAQ,CAAC,CAAC,IAC3B,GAAG,KAAK,MAAMA,EAAI,GAAI,CAAC,IAC/B,CAEA,MAAMC,EAAU,CACf,OACA,QACA,OACA,YACA,QACA,oBACA,mBACA,cACA,aACA,aACA,cACA,kBACA,kBACD,EAEO,SAASC,EAAiB,CAChC,QAAAC,CACD,EAA8C,CAC7C,OACCxC,EAAAA,KAAC,MAAA,CAAI,UAAU,uBACd,SAAA,CAAAC,EAAAA,IAAC,IAAA,CAAE,UAAU,cAAc,SAAA,8JAI3B,QACC,MAAA,CAAI,UAAU,eACd,SAAAD,EAAAA,KAAC,QAAA,CAAM,UAAU,qBAChB,SAAA,CAAAC,EAAAA,IAAC,QAAA,CACA,eAAC,KAAA,CACC,SAAAqC,EAAQ,IAAI,CAACG,EAAGC,IAChBzC,EAAAA,IAAC,KAAA,CAAW,UAAWyC,GAAK,GAAKA,IAAM,EAAI,MAAQ,OACjD,SAAAD,CAAA,EADOA,CAET,CACA,CAAA,CACF,CAAA,CACD,SACC,QAAA,CACC,SAAA,CAAAD,EAAQ,SAAW,GACnBvC,EAAAA,IAAC,KAAA,CACA,SAAAA,EAAAA,IAAC,KAAA,CAAG,QAASqC,EAAQ,OAAQ,UAAU,aAAa,SAAA,yBAAA,CAEpD,EACD,EAEAE,EAAQ,IAAKrB,GAAM,CACnB,MAAMwB,EAAKxB,EAAE,WAAa,CACzB,QAAS,EACT,MAAO,CAGR,EACMyB,EAAKzB,EAAE,UAAY,CAAE,QAAS,EAAG,MAAO,CAAA,EACxCf,EAAKe,EAAE,WAAa,CACzB,QAAS,CAAE,WAAY,EAAG,SAAU,CAAA,EACpC,SAAU,CAAE,WAAY,EAAG,SAAU,CAAA,CAAE,EAExC,cACE,KAAA,CACA,SAAA,CAAAlB,EAAAA,IAAC,MAAG,MAAOkB,EAAE,SAAW,SAAAA,EAAE,aAAeA,EAAE,QAAA,CAAS,EACpDlB,EAAAA,IAAC,KAAA,CAAI,SAAAkB,EAAE,OAAS,IAAS,EACzBlB,EAAAA,IAAC,KAAA,CAAI,SAAAkB,EAAE,MAAQ,IAAS,EACxBlB,EAAAA,IAAC,KAAA,CAAG,UAAU,MACZ,WAAE,YAAc,KACd,GAAG,KAAK,MAAMkB,EAAE,WAAa,GAAG,CAAC,IACjC,IACJ,EACAlB,EAAAA,IAAC,KAAA,CAAI,SAAAkB,EAAE,OAAS,IAAS,EACzBnB,EAAAA,KAAC,KAAA,CAAG,UAAU,MACZ,SAAA,CAAA4C,EAAG,QAAQ,MAAIA,EAAG,KAAA,EACpB,EACA5C,EAAAA,KAAC,KAAA,CAAG,UAAU,MACZ,SAAA,CAAA2C,EAAG,QAAQ,MAAIA,EAAG,KAAA,EACpB,EACA1C,EAAAA,IAAC,KAAA,CAAG,UAAU,MACZ,WAAE,eAAiB,KACjB,GAAGkB,EAAE,cAAc,UAAU,QAAQ,CAAC,CAAC,IACvC,IACJ,QACC,KAAA,CAAG,UAAU,MACZ,SAAAA,EAAE,eAAe,gBAAkB,KACjC,IAAIA,EAAE,cAAc,eAAe,QAAQ,CAAC,CAAC,GAC7C,IACJ,EACAlB,EAAAA,IAAC,KAAA,CAAG,UAAU,MACZ,SAAAkB,EAAE,eAAe,WAAa,KAC5B0B,EAAU1B,EAAE,cAAc,SAAS,EACnC,IACJ,EACAlB,EAAAA,IAAC,KAAA,CAAG,UAAU,MACZ,SAAAkB,EAAE,eAAe,YAAc,KAC7B0B,EAAU1B,EAAE,cAAc,UAAU,EACpC,IACJ,EACAnB,EAAAA,KAAC,KAAA,CAAG,UAAU,MACZ,SAAA,CAAAoC,EAAOhC,EAAG,QAAQ,UAAU,EAAE,KAAG,IACjCgC,EAAOhC,EAAG,QAAQ,QAAQ,CAAA,EAC5B,EACAJ,EAAAA,KAAC,KAAA,CAAG,UAAU,MACZ,SAAA,CAAAoC,EAAOhC,EAAG,SAAS,UAAU,EAAE,KAAG,IAClCgC,EAAOhC,EAAG,SAAS,QAAQ,CAAA,CAAA,CAC7B,CAAA,CAAA,EA3CQe,EAAE,QA4CX,CAEF,CAAC,CAAA,CAAA,CACF,CAAA,CAAA,CACD,CAAA,CACD,CAAA,EACD,CAEF,CCnGA,SAAS2B,EAAYC,EAA2B,CAC/C,GAAI,CAACA,EAAQ,OAAQ,MAAO,IAC5B,MAAMC,EAAK,KAAK,IAAI,GAAGD,CAAO,EACxBE,EAAK,KAAK,IAAI,GAAGF,CAAO,EAC9B,OAAOC,IAAOC,EACXD,EAAG,eAAA,EACH,GAAGA,EAAG,eAAA,CAAgB,IAASC,EAAG,eAAA,CAAgB,EACtD,CAGA,SAASC,EAAaH,EAA2B,CAChD,GAAI,CAACA,EAAQ,OAAQ,MAAO,IAC5B,MAAMC,EAAK,KAAK,IAAI,GAAGD,CAAO,EACxBE,EAAK,KAAK,IAAI,GAAGF,CAAO,EACxBtD,EAAO4C,GAAsB,IAAIA,EAAE,QAAQ,CAAC,CAAC,GACnD,OAAOW,IAAOC,EAAKxD,EAAIuD,CAAE,EAAI,GAAGvD,EAAIuD,CAAE,CAAC,IAASvD,EAAIwD,CAAE,CAAC,EACxD,CAGA,SAASE,EAAU7C,EAAwC,CAC1D,MAAM8C,EAAkC,CAAA,EACxC,UAAWjC,KAAKb,EAAO,CACtB,MAAMqB,EAAOR,EAAE,WAAaA,EAAE,UAAU,QAAW,YAC9CiC,EAAIzB,CAAG,IACXyB,EAAIzB,CAAG,EAAI,CACV,MAAOA,EACP,SAAUR,EAAE,cAAgBA,EAAE,UAAY,IAC1C,YAAa,EACb,YAAa,EACb,SAAU,EACV,UAAW,EACX,SAAU,EACV,IAAK,EACL,QAAS,CAAA,EACT,SAAU,CAAA,EACV,WAAY,CAAA,EACZ,UAAW,CAAA,EACX,UAAW,KACX,OAAQ,EACR,UAAW,EACX,WAAY,CAAA,GAGd,MAAMkC,EAAID,EAAIzB,CAAG,EACjB0B,EAAE,aAAelC,EAAE,iBAAmB,EACtCkC,EAAE,aAAelC,EAAE,aAAe,EAClCkC,EAAE,UAAYlC,EAAE,eAAiB,EACjCkC,EAAE,WAAalC,EAAE,YAAc,EAC/BkC,EAAE,UAAYlC,EAAE,UAAY,EACxBA,EAAE,YACLkC,EAAE,MAAQlC,EAAE,aAAe,GAAKA,EAAE,UAClCkC,EAAE,QAAQ,KAAKlC,EAAE,SAAS,GAEvBA,EAAE,YAAYkC,EAAE,SAAS,KAAKlC,EAAE,UAAU,EAC1CA,EAAE,eAAekC,EAAE,WAAW,KAAKlC,EAAE,aAAa,EAClDA,EAAE,WAAWkC,EAAE,UAAU,KAAKlC,EAAE,SAAS,EACzCA,EAAE,WAAa,OAAMkC,EAAE,UAAYlC,EAAE,WACrCA,EAAE,oBAAmBkC,EAAE,WAAalC,EAAE,mBACtCA,EAAE,qBAAoBkC,EAAE,YAAclC,EAAE,oBACxCA,EAAE,iBAAmBA,EAAE,gBAAkBkC,EAAE,SAC9CA,EAAE,OAASlC,EAAE,gBACf,CACA,OAAO,OAAO,OAAOiC,CAAG,EAAE,KAAK,CAAChC,EAAG5B,IAAMA,EAAE,YAAc4B,EAAE,WAAW,CACvE,CAGA,MAAMkC,EAAW,CAChB,SAAU,kEACV,UACC,4EACD,UAAW,4DACX,OAAQ,mCACR,KAAM,0BACN,SAAU,iDACV,OAAQ,sBACR,QAAS,sBACV,EAEO,SAASC,EAAoB,CACnC,MAAAjD,CACD,EAAiD,CAChD,MAAMkD,EAASxC,EAAAA,QAAQ,IAAMmC,EAAU7C,CAAK,EAAG,CAACA,CAAK,CAAC,EAEtD,OACCN,EAAAA,KAAC,MAAA,CAAI,UAAU,mBACd,SAAA,CAAAC,EAAAA,IAAC,IAAA,CAAE,UAAU,cAAc,SAAA,6JAI3B,QACC,MAAA,CAAI,UAAU,eACd,SAAAD,EAAAA,KAAC,QAAA,CAAM,UAAU,gBAChB,SAAA,CAAAC,EAAAA,IAAC,QAAA,CACA,gBAAC,KAAA,CACA,SAAA,CAAAA,EAAAA,IAAC,MAAG,SAAA,OAAA,CAAK,EACTA,EAAAA,IAAC,MAAG,SAAA,UAAA,CAAQ,QACX,KAAA,CAAG,UAAU,MAAM,MAAOqD,EAAS,SAAU,SAAA,YAE9C,QACC,KAAA,CAAG,UAAU,MAAM,MAAOA,EAAS,UAAW,SAAA,aAE/C,EACArD,EAAAA,IAAC,KAAA,CAAG,UAAU,MAAM,SAAA,QAAK,QACxB,KAAA,CAAG,UAAU,MAAM,MAAOqD,EAAS,UAAW,SAAA,aAE/C,QACC,KAAA,CAAG,UAAU,MAAM,MAAOA,EAAS,OAAQ,SAAA,UAE5C,QACC,KAAA,CAAG,UAAU,MAAM,MAAOA,EAAS,KAAM,SAAA,QAE1C,QACC,KAAA,CAAG,UAAU,MAAM,MAAOA,EAAS,SAAU,SAAA,WAE9C,EACArD,EAAAA,IAAC,KAAA,CAAG,UAAU,MAAM,SAAA,cAAW,QAC9B,KAAA,CAAG,UAAU,MAAM,MAAOqD,EAAS,OAAQ,SAAA,WAE5C,QACC,KAAA,CAAG,UAAU,MAAM,MAAOA,EAAS,QAAS,SAAA,YAE7C,EACArD,EAAAA,IAAC,KAAA,CAAG,UAAU,MAAM,SAAA,UAAO,EAC3BA,EAAAA,IAAC,KAAA,CACA,UAAU,MACV,MAAM,kEACN,SAAA,aAAA,CAAA,EAGDA,EAAAA,IAAC,KAAA,CACA,UAAU,MACV,MAAM,4GACN,SAAA,eAAA,CAAA,EAGDA,EAAAA,IAAC,KAAA,CAAG,UAAU,MAAM,SAAA,WAAA,CAAS,CAAA,CAAA,CAC9B,CAAA,CACD,SACC,QAAA,CACC,SAAA,CAAAuD,EAAO,SAAW,GAClBvD,EAAAA,IAAC,KAAA,CACA,SAAAA,MAAC,KAAA,CAAG,QAAS,GAAI,UAAU,aAAa,SAAA,iCAAA,CAExC,EACD,EAEAuD,EAAO,IAAKH,GAAM,CAClB,MAAMI,GAASJ,EAAE,UAAY,IAAMA,EAAE,WAAa,GAC5CK,EAAML,EAAE,IAAM,EAAI,IAAIA,EAAE,IAAI,QAAQ,CAAC,CAAC,GAAK,IAC3CM,EAAON,EAAE,OACZ,IAAI,KAAKA,EAAE,MAAM,EAAE,eAAA,EACnB,IACGO,EACLP,EAAE,WAAa,KAAO,IAAWA,EAAE,UAAY,MAAQ,KACxD,cACE,KAAA,CACA,SAAA,CAAApD,EAAAA,IAAC,KAAA,CAAG,UAAU,aAAc,SAAAoD,EAAE,MAAM,EACpCpD,EAAAA,IAAC,KAAA,CAAI,SAAAoD,EAAE,QAAA,CAAS,QACf,KAAA,CAAG,UAAU,MAAO,SAAAA,EAAE,SAAS,iBAAiB,QAChD,KAAA,CAAG,UAAU,MAAO,SAAAA,EAAE,UAAU,iBAAiB,QACjD,KAAA,CAAG,UAAU,MAAO,SAAAI,EAAM,iBAAiB,QAC3C,KAAA,CAAG,UAAU,MAAO,SAAAX,EAAYO,EAAE,UAAU,EAAE,QAC9C,KAAA,CAAG,UAAU,MAAO,SAAAP,EAAYO,EAAE,SAAS,EAAE,EAC9CpD,EAAAA,IAAC,KAAA,CAAG,UAAU,MAAO,SAAA2D,EAAK,QACzB,KAAA,CAAG,UAAU,MAAO,SAAAP,EAAE,SAAS,iBAAiB,QAChD,KAAA,CAAG,UAAU,MAAO,SAAAA,EAAE,YAAY,iBAAiB,QACnD,KAAA,CAAG,UAAU,MAAO,SAAAH,EAAaG,EAAE,OAAO,EAAE,QAC5C,KAAA,CAAG,UAAU,MAAO,SAAAH,EAAaG,EAAE,QAAQ,EAAE,EAC9CpD,EAAAA,IAAC,KAAA,CAAG,UAAU,MAAO,SAAAyD,EAAI,EACzBzD,EAAAA,IAAC,MAAG,UAAU,MACZ,WAAE,UAAY,EACZ,IACCoD,EAAE,UAAY,KACbA,EAAE,UAAYA,EAAE,WAAaA,EAAE,UAAY,IAC5C,QAAQ,CAAC,CAAC,IACX,GAAA,CACJ,EACApD,EAAAA,IAAC,KAAA,CAAG,UAAU,MACZ,SAAAoD,EAAE,UAAY,EACZ,IAAIQ,EAAoBR,EAAE,UAAWA,EAAE,WAAYA,EAAE,QAAQ,CAAC,GAAK,CAAC,EAAE,SAAS,QAAQ,CAAC,CAAC,GACzF,GAAA,CACJ,EACApD,EAAAA,IAAC,KAAA,CAAG,UAAU,MAAO,SAAA0D,CAAA,CAAK,CAAA,CAAA,EA3BlBN,EAAE,KA4BX,CAEF,CAAC,CAAA,CAAA,CACF,CAAA,CAAA,CACD,CAAA,CACD,EACApD,EAAAA,IAAC,IAAA,CAAE,UAAU,cAAc,SAAA,iRAAA,CAK3B,CAAA,EACD,CAEF,CCjMA,eAAe6D,GAAmD,CACjE,OAAQ,MAAMC,EAAA,CACf,CAEA,SAAwBC,GAA+B,CACtD,KAAM,CAACC,EAAUC,CAAW,EAAIxD,EAAAA,SAAiC,IAAI,EAE/D,CAAE,KAAMyD,EAAW,MAAOC,GAC/BC,EACCC,cAAY,IAAMR,EAAA,EAAmB,EAAE,EACvC,CAAE,aAAc,GAAA,CAAO,EAGnB,CAAE,KAAMS,CAAA,EAAgBF,EAC7BC,cAAY,IAAME,EAAA,EAAgB,EAAE,EACpC,CAAE,aAAc,GAAA,CAAO,EAGxB,GAAIJ,GAAY,CAACD,EAChB,OACCnE,EAAAA,KAAC,MAAA,CAAI,UAAU,WAAW,SAAA,CAAA,wBAAsBoE,EAAS,OAAA,EAAQ,EAGnE,GAAI,CAACD,EACJ,OAAOlE,EAAAA,IAAC,MAAA,CAAI,UAAU,WAAW,SAAA,iBAAc,EAGhD,MAAMwE,EAAUN,EAAU,QACpB7D,EAAQ6D,EAAU,MAClB3B,EAAU+B,GAAa,SAAW,CAAA,EAExC,OACCvE,EAAAA,KAAC,MAAA,CAAI,UAAU,YACd,SAAA,CAAAC,EAAAA,IAACN,EAAA,CACA,WAAY8E,GAAS,YAAc,EACnC,iBAAkBA,GAAS,kBAAoB,EAC/C,iBAAkBA,GAAS,kBAAoB,EAC/C,wBAAyBA,GAAS,8BAAgC,CAAA,CAAA,EAEnExE,EAAAA,IAAC,KAAA,CAAG,UAAU,iBAAiB,SAAA,mBAAgB,EAC/CA,EAAAA,IAACI,EAAA,CAAU,MAAAC,EAAc,SAAU4D,CAAA,CAAa,EAChDjE,EAAAA,IAAC,KAAA,CAAG,UAAU,iBAAiB,SAAA,+CAE/B,EACAA,MAACsC,GAAiB,QAAAC,EAAkB,EACpCvC,EAAAA,IAAC,KAAA,CAAG,UAAU,iBAAiB,SAAA,mBAAgB,EAC/CA,MAACsD,GAAoB,MAAAjD,EAAc,EAClC2D,SACCjC,EAAA,CAAgB,KAAMiC,EAAU,QAAS,IAAMC,EAAY,IAAI,CAAA,CAAG,CAAA,EAErE,CAEF"}
|
|
1
|
+
{"version":3,"file":"ReposTab-DeFz76L5.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 * Columns: Repo, Model, Tier, Context %, State, Compactions s/t,\n * Cache Hits s/t, Cache Hit %, Cache Read, Cache Write, Est. Saved,\n * Compact s/t (s), CacheHit s/t (s).\n * Data from fetchServers() via useApi with 10s polling.\n */\n\nimport type React from \"react\";\nimport type { ServerEntry } from \"@contracts\";\nimport { fmtTokens } from \"@/utils/format.ts\";\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\"Cache Hit %\",\n\t\"Est. Saved\",\n\t\"Cache Read\",\n\t\"Cache Write\",\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 cache-hit,\n\t\t\t\tcompaction, and time-saved (est.) totals pulled live from each\n\t\t\t\trepo'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 key={h} className={i >= 3 && i !== 4 ? \"num\" : undefined}>\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={HEADERS.length} 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}>{r.displayName || r.repoRoot}</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{r.providerCache != null\n\t\t\t\t\t\t\t\t\t\t\t? `${r.providerCache.avgHitPct.toFixed(1)}%`\n\t\t\t\t\t\t\t\t\t\t\t: \"—\"}\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{r.providerCache?.estimatedSaved != null\n\t\t\t\t\t\t\t\t\t\t\t? `$${r.providerCache.estimatedSaved.toFixed(2)}`\n\t\t\t\t\t\t\t\t\t\t\t: \"—\"}\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{r.providerCache?.cacheRead != null\n\t\t\t\t\t\t\t\t\t\t\t? fmtTokens(r.providerCache.cacheRead)\n\t\t\t\t\t\t\t\t\t\t\t: \"—\"}\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{r.providerCache?.cacheWrite != null\n\t\t\t\t\t\t\t\t\t\t\t? fmtTokens(r.providerCache.cacheWrite)\n\t\t\t\t\t\t\t\t\t\t\t: \"—\"}\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\";\nimport { computeCacheSavings } from \"@pricing\";\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\tcacheRead: number;\n\tcacheWrite: 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\tcacheRead: 0,\n\t\t\t\tcacheWrite: 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.providerCacheRead) g.cacheRead += r.providerCacheRead;\n\t\tif (r.providerCacheWrite) g.cacheWrite += r.providerCacheWrite;\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 & cost mega-compact has reclaimed, grouped by the\n\t\t\t\tmodel you were running. Compression ratio reflects workload/content, not\n\t\t\t\tmodel 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\n\t\t\t\t\t\t\t\tclassName=\"num\"\n\t\t\t\t\t\t\t\ttitle=\"Provider prompt-cache hit rate (reads / reads+writes+tokens_in)\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tCache Hit %\n\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t<th\n\t\t\t\t\t\t\t\tclassName=\"num\"\n\t\t\t\t\t\t\t\ttitle=\"Estimated provider prompt-cache savings (read tokens * 0.9 * inputRate − write tokens * 0.25 * inputRate)\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tCache $ Saved\n\t\t\t\t\t\t\t</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={16} 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 = g.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 ? \"\\u2014\" : g.reasoning ? \"yes\" : \"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\">{g.tokensIn.toLocaleString()}</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">{g.tokensOut.toLocaleString()}</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">{freed.toLocaleString()}</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">{collapseNum(g.ctxWindows)}</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">{collapseNum(g.maxTokens)}</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\">{g.sessions.toLocaleString()}</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">{g.checkpoints.toLocaleString()}</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">{collapseRate(g.inRates)}</td>\n\t\t\t\t\t\t\t\t\t<td className=\"num\">{collapseRate(g.outRates)}</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\">\n\t\t\t\t\t\t\t\t\t\t{g.cacheRead > 0\n\t\t\t\t\t\t\t\t\t\t\t? `${(\n\t\t\t\t\t\t\t\t\t\t\t\t\t(g.cacheRead * 100) /\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t(g.cacheRead + g.cacheWrite + g.tokensIn || 1)\n\t\t\t\t\t\t\t\t\t\t\t\t).toFixed(1)}%`\n\t\t\t\t\t\t\t\t\t\t\t: \"—\"}\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.cacheRead > 0\n\t\t\t\t\t\t\t\t\t\t\t? `$${computeCacheSavings(g.cacheRead, g.cacheWrite, g.inRates[0] || 0).netSaved.toFixed(4)}`\n\t\t\t\t\t\t\t\t\t\t\t: \"—\"}\n\t\t\t\t\t\t\t\t\t</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 Out =\n\t\t\t\tΣ compacted summary tokens still retained in context. Freed = Tokens In\n\t\t\t\t− Tokens Out (net context reclaimed). Ctx Window / Max Out / Reas. come\n\t\t\t\tfrom 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 & 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","fmtTokens","collapseNum","samples","lo","hi","collapseRate","aggregate","map","g","TOOLTIPS","SavingsByModelTable","groups","freed","usd","when","reas","computeCacheSavings","fetchIndexTyped","fetchIndex","ReposTab","selected","setSelected","indexData","indexErr","useApi","useCallback","serversData","fetchServers","summary"],"mappings":"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"}
|
package/extensions/dashboard-client/dist/assets/{SessionsTab-DXDTCi3r.js → SessionsTab-BWNsj1OB.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{o as di,q as se,r as L,R as _,j as U,u as Ms,f as om,s as um}from"./index-DrktNOoT.js";import{u as cm}from"./useSSE-Bf5LOLSi.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-
|
|
70
|
+
//# sourceMappingURL=SessionsTab-BWNsj1OB.js.map
|