pi-mega-compact 0.13.5 → 0.13.7
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/endpoints/registry.js +50 -0
- package/dist/extensions/dashboard-server/api-contracts/rag-metrics.js +1 -0
- package/dist/extensions/dashboard-server/api-contracts/rag-settings.js +3 -3
- package/dist/extensions/dashboard-server/api-contracts/wiki.js +1 -0
- package/dist/extensions/dashboard-server/index-reader.js +3 -1
- package/dist/extensions/dashboard-server/resolve-snapshot.js +81 -0
- package/dist/extensions/dashboard-server/routes-core.js +8 -3
- package/dist/extensions/dashboard-server/routes-rag-metrics.js +60 -0
- package/dist/extensions/dashboard-server/routes-rag-settings-helpers.js +167 -0
- package/dist/extensions/dashboard-server/routes-rag-settings.js +136 -77
- package/dist/extensions/dashboard-server/routes-repo.js +5 -1
- package/dist/extensions/dashboard-server/routes-sessions.js +6 -3
- package/dist/extensions/dashboard-server/routes-wiki-helpers.js +97 -0
- package/dist/extensions/dashboard-server/routes-wiki.js +330 -0
- package/dist/extensions/dashboard-server/routes.js +2 -0
- package/dist/extensions/dashboard-server/server.js +17 -3
- package/dist/extensions/mega-events/context-handler/afterCompact.js +35 -2
- package/dist/extensions/mega-pipeline/recall.js +31 -0
- package/dist/extensions/mega-runtime/capture-model.js +5 -2
- package/dist/extensions/mega-turn-store.js +2 -1
- package/dist/src/config/turns.js +10 -0
- package/dist/src/config.js +2 -0
- package/dist/src/pricing.js +8 -0
- package/dist/src/recall/async.js +10 -1
- package/dist/src/recall/format.js +10 -1
- package/dist/src/recall/hydeTelemetry.js +22 -0
- package/dist/src/recall/sync.js +28 -2
- package/dist/src/store/turns/hydeStore.js +32 -0
- package/dist/src/store/turns/index.js +1 -0
- package/dist/src/store/turns/schema.js +102 -1
- package/dist/src/store/turns/sqlite-store/rows.js +23 -0
- package/dist/src/store/turns/sqlite-store/write.js +7 -3
- package/dist/src/topics/durability.js +187 -0
- package/dist/src/topics/index.js +2 -1
- package/dist/src/topics/store.js +28 -9
- package/dist/src/wiki/curation-helpers.js +71 -0
- package/dist/src/wiki/curation.js +147 -0
- package/dist/src/wiki/incremental.js +126 -0
- package/dist/src/wiki/index.js +5 -0
- package/extensions/dashboard-client/dist/assets/AreaChart-j2VOSRp6.js +70 -0
- package/extensions/dashboard-client/dist/assets/{SessionsTab-C30AwyoF.js.map → AreaChart-j2VOSRp6.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/CacheTab-Dr1HeMfc.js +2 -0
- package/extensions/dashboard-client/dist/assets/CacheTab-Dr1HeMfc.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/EventsTab-DRG2k7FS.js +2 -0
- package/extensions/dashboard-client/dist/assets/EventsTab-DRG2k7FS.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/HealthTab-DGE9PpW3.js +2 -0
- package/extensions/dashboard-client/dist/assets/HealthTab-DGE9PpW3.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/MaintenanceTab-DeYRhF4q.js +2 -0
- package/extensions/dashboard-client/dist/assets/MaintenanceTab-DeYRhF4q.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/MemoryMapTab-DSnSO3nG.js +2 -0
- package/extensions/dashboard-client/dist/assets/MemoryMapTab-DSnSO3nG.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/MetricsTab-RIzNc1Uj.js +2 -0
- package/extensions/dashboard-client/dist/assets/MetricsTab-RIzNc1Uj.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/OverviewTab-_1BJ4Bmh.js +2 -0
- package/extensions/dashboard-client/dist/assets/OverviewTab-_1BJ4Bmh.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/ReposTab-DkU7ywZB.js +2 -0
- package/extensions/dashboard-client/dist/assets/ReposTab-DkU7ywZB.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/SessionsTab-Bq_F_aOk.js +2 -0
- package/extensions/dashboard-client/dist/assets/SessionsTab-Bq_F_aOk.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/SetupTab-BkBD2Y97.js +2 -0
- package/extensions/dashboard-client/dist/assets/SetupTab-BkBD2Y97.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/TimeSavedCard-BXzFKU7C.js +2 -0
- package/extensions/dashboard-client/dist/assets/TimeSavedCard-BXzFKU7C.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/TurnsTab-Bjpp3vBH.js +5 -0
- package/extensions/dashboard-client/dist/assets/TurnsTab-Bjpp3vBH.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/WikiTab-dBN2EA5G.js +2 -0
- package/extensions/dashboard-client/dist/assets/WikiTab-dBN2EA5G.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/button-Bt0b5QVp.js +2 -0
- package/extensions/dashboard-client/dist/assets/button-Bt0b5QVp.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/card-D5CafXtg.js +2 -0
- package/extensions/dashboard-client/dist/assets/card-D5CafXtg.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/index-CUA6EDRF.css +1 -0
- package/extensions/dashboard-client/dist/assets/index-GPHRnEN7.js +137 -0
- package/extensions/dashboard-client/dist/assets/index-GPHRnEN7.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/pricing-DkYp8-vi.js +2 -0
- package/extensions/dashboard-client/dist/assets/pricing-DkYp8-vi.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/switch-CY5Gwj1o.js +2 -0
- package/extensions/dashboard-client/dist/assets/switch-CY5Gwj1o.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/toggle-C9HpkIfH.js +2 -0
- package/extensions/dashboard-client/dist/assets/toggle-C9HpkIfH.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/{useSSE-p1pOI_-P.js → useSSE-2JFrLDlE.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{useSSE-p1pOI_-P.js.map → useSSE-2JFrLDlE.js.map} +1 -1
- package/extensions/dashboard-client/dist/index.html +2 -2
- package/extensions/dashboard-client/package-lock.json +1995 -191
- package/extensions/dashboard-client/package.json +12 -1
- package/extensions/dashboard-client/postcss.config.js +6 -0
- package/extensions/dashboard-client/src/App.tsx +127 -88
- package/extensions/dashboard-client/src/api/client.ts +109 -10
- package/extensions/dashboard-client/src/components/ActiveReposTable.tsx +15 -7
- package/extensions/dashboard-client/src/components/ActiveSessionsTable.tsx +67 -55
- package/extensions/dashboard-client/src/components/CacheHitRateTrendCard.tsx +17 -13
- package/extensions/dashboard-client/src/components/CacheHitsCard.tsx +35 -30
- package/extensions/dashboard-client/src/components/CacheStatusPerModel.tsx +33 -28
- package/extensions/dashboard-client/src/components/EventCategoryFilter.tsx +5 -6
- package/extensions/dashboard-client/src/components/EventStream.tsx +17 -13
- package/extensions/dashboard-client/src/components/HydeDetailPanel.tsx +173 -0
- package/extensions/dashboard-client/src/components/LegendCard.tsx +16 -9
- package/extensions/dashboard-client/src/components/PerfCards.tsx +28 -20
- package/extensions/dashboard-client/src/components/PerfChart.tsx +9 -6
- package/extensions/dashboard-client/src/components/ProviderCacheCard.tsx +15 -7
- package/extensions/dashboard-client/src/components/RagDashboard.tsx +253 -0
- package/extensions/dashboard-client/src/components/RepoAllSessionsCard.tsx +15 -10
- package/extensions/dashboard-client/src/components/RepoContextStack.tsx +24 -16
- package/extensions/dashboard-client/src/components/RepoDetailModal.tsx +52 -49
- package/extensions/dashboard-client/src/components/RepoTable.tsx +26 -17
- package/extensions/dashboard-client/src/components/SessionContextGauges.tsx +11 -14
- package/extensions/dashboard-client/src/components/SessionInfo.tsx +20 -15
- package/extensions/dashboard-client/src/components/SessionsMemoryChart.tsx +8 -5
- package/extensions/dashboard-client/src/components/SummaryTiles.tsx +26 -17
- package/extensions/dashboard-client/src/components/TabBar.tsx +1 -3
- package/extensions/dashboard-client/src/components/layout/AppShell.tsx +42 -0
- package/extensions/dashboard-client/src/components/layout/BottomBar.tsx +88 -0
- package/extensions/dashboard-client/src/components/layout/Sidebar.tsx +83 -0
- package/extensions/dashboard-client/src/components/ui/badge.tsx +30 -0
- package/extensions/dashboard-client/src/components/ui/button.tsx +44 -0
- package/extensions/dashboard-client/src/components/ui/card.tsx +32 -0
- package/extensions/dashboard-client/src/components/ui/select.tsx +64 -0
- package/extensions/dashboard-client/src/components/ui/switch.tsx +26 -0
- package/extensions/dashboard-client/src/components/ui/tabs.tsx +36 -0
- package/extensions/dashboard-client/src/components/ui/toggle.tsx +28 -0
- package/extensions/dashboard-client/src/components/ui/tooltip.tsx +27 -0
- package/extensions/dashboard-client/src/config.ts +10 -0
- package/extensions/dashboard-client/src/main.tsx +2 -2
- package/extensions/dashboard-client/src/memory-map-layout.ts +1 -2
- package/extensions/dashboard-client/src/styles/index.css +79 -0
- package/extensions/dashboard-client/src/tabs/CacheTab.tsx +33 -26
- package/extensions/dashboard-client/src/tabs/EventsTab.tsx +22 -7
- package/extensions/dashboard-client/src/tabs/HealthTab.tsx +77 -46
- package/extensions/dashboard-client/src/tabs/MaintenanceTab/ActionsCard.tsx +60 -50
- package/extensions/dashboard-client/src/tabs/MaintenanceTab/DbStatsCard.tsx +61 -35
- package/extensions/dashboard-client/src/tabs/MaintenanceTab/DebugBundleCard.tsx +34 -23
- package/extensions/dashboard-client/src/tabs/MaintenanceTab/HealthMitigationCard.tsx +62 -43
- package/extensions/dashboard-client/src/tabs/MaintenanceTab/SchemaHealthCard.tsx +53 -32
- package/extensions/dashboard-client/src/tabs/MaintenanceTab.tsx +2 -2
- package/extensions/dashboard-client/src/tabs/MemoryMapTab/MemoryMapView.tsx +29 -46
- package/extensions/dashboard-client/src/tabs/MemoryMapTab/RaptorTreeView.tsx +10 -34
- package/extensions/dashboard-client/src/tabs/MemoryMapTab.tsx +14 -34
- package/extensions/dashboard-client/src/tabs/MetricsTab.tsx +5 -2
- package/extensions/dashboard-client/src/tabs/OverviewTab.tsx +11 -5
- package/extensions/dashboard-client/src/tabs/ReposTab.tsx +5 -5
- package/extensions/dashboard-client/src/tabs/SessionsTab.tsx +47 -33
- package/extensions/dashboard-client/src/tabs/SetupTab/EmbedderSetup.tsx +6 -2
- package/extensions/dashboard-client/src/tabs/SetupTab/RagHealthCard.tsx +78 -0
- package/extensions/dashboard-client/src/tabs/SetupTab/SettingsPanel.tsx +198 -0
- package/extensions/dashboard-client/src/tabs/SetupTab/SettingsSection.tsx +50 -0
- package/extensions/dashboard-client/src/tabs/SetupTab.tsx +21 -59
- package/extensions/dashboard-client/src/tabs/TopicsTab.tsx +75 -40
- package/extensions/dashboard-client/src/tabs/TurnsTab.tsx +150 -112
- package/extensions/dashboard-client/src/tabs/WikiTab/TopicEvolutionGraph.tsx +274 -0
- package/extensions/dashboard-client/src/tabs/WikiTab/TopicEvolutionView.tsx +71 -0
- package/extensions/dashboard-client/src/tabs/WikiTab/TopicTimeline.tsx +103 -0
- package/extensions/dashboard-client/src/tabs/WikiTab/WikiPage.tsx +213 -0
- package/extensions/dashboard-client/src/tabs/WikiTab/WikiPageControls.tsx +188 -0
- package/extensions/dashboard-client/src/tabs/WikiTab.tsx +222 -0
- package/extensions/dashboard-client/src/tabs/registry.ts +57 -0
- package/extensions/dashboard-client/src/utils/cn.ts +7 -0
- package/extensions/dashboard-client/tailwind.config.js +46 -0
- package/extensions/dashboard-server/api-contracts/core.ts +59 -0
- package/extensions/dashboard-server/api-contracts/endpoints/registry.ts +79 -0
- package/extensions/dashboard-server/api-contracts/index.ts +48 -2
- package/extensions/dashboard-server/api-contracts/rag-metrics.ts +22 -0
- package/extensions/dashboard-server/api-contracts/rag-settings.ts +30 -20
- package/extensions/dashboard-server/api-contracts/wiki.ts +138 -0
- package/extensions/dashboard-server/index-reader.ts +3 -1
- package/extensions/dashboard-server/resolve-snapshot.ts +98 -0
- package/extensions/dashboard-server/routes-core.ts +8 -3
- package/extensions/dashboard-server/routes-rag-metrics.ts +82 -0
- package/extensions/dashboard-server/routes-rag-settings-helpers.ts +314 -0
- package/extensions/dashboard-server/routes-rag-settings.ts +147 -97
- package/extensions/dashboard-server/routes-repo.ts +5 -1
- package/extensions/dashboard-server/routes-sessions.ts +6 -3
- package/extensions/dashboard-server/routes-wiki-helpers.ts +126 -0
- package/extensions/dashboard-server/routes-wiki.ts +376 -0
- package/extensions/dashboard-server/routes.ts +2 -0
- package/extensions/dashboard-server/server.ts +18 -2
- package/extensions/mega-events/context-handler/afterCompact.ts +44 -1
- package/extensions/mega-pipeline/recall.ts +31 -0
- package/extensions/mega-runtime/capture-model.ts +5 -2
- package/extensions/mega-turn-store.ts +13 -0
- package/package.json +1 -1
- package/src/config/turns.ts +17 -0
- package/src/config.ts +3 -0
- package/src/pricing.ts +8 -0
- package/src/recall/async.ts +10 -1
- package/src/recall/format.ts +15 -2
- package/src/recall/hydeTelemetry.ts +44 -0
- package/src/recall/sync.ts +34 -2
- package/src/recall/types.ts +36 -0
- package/src/store/turns/hydeStore.ts +82 -0
- package/src/store/turns/index.ts +4 -0
- package/src/store/turns/schema.ts +126 -1
- package/src/store/turns/sqlite-store/rows.ts +25 -0
- package/src/store/turns/sqlite-store/write.ts +20 -2
- package/src/store/turns/types.ts +33 -0
- package/src/topics/durability.ts +231 -0
- package/src/topics/index.ts +7 -1
- package/src/topics/store.ts +35 -9
- package/src/wiki/curation-helpers.ts +140 -0
- package/src/wiki/curation.ts +217 -0
- package/src/wiki/incremental.ts +164 -0
- package/src/wiki/index.ts +13 -0
- package/extensions/dashboard-client/dist/assets/CacheTab-Cqnc7lMg.js +0 -2
- package/extensions/dashboard-client/dist/assets/CacheTab-Cqnc7lMg.js.map +0 -1
- package/extensions/dashboard-client/dist/assets/EventsTab-tYk3VFAp.js +0 -2
- package/extensions/dashboard-client/dist/assets/EventsTab-tYk3VFAp.js.map +0 -1
- package/extensions/dashboard-client/dist/assets/HealthTab-D2_kjgxw.js +0 -2
- package/extensions/dashboard-client/dist/assets/HealthTab-D2_kjgxw.js.map +0 -1
- package/extensions/dashboard-client/dist/assets/MaintenanceTab-Bc-uPYrz.js +0 -2
- package/extensions/dashboard-client/dist/assets/MaintenanceTab-Bc-uPYrz.js.map +0 -1
- package/extensions/dashboard-client/dist/assets/MemoryMapTab-D1V9g_NC.js +0 -2
- package/extensions/dashboard-client/dist/assets/MemoryMapTab-D1V9g_NC.js.map +0 -1
- package/extensions/dashboard-client/dist/assets/MetricsTab-DT_XfL96.js +0 -2
- package/extensions/dashboard-client/dist/assets/MetricsTab-DT_XfL96.js.map +0 -1
- package/extensions/dashboard-client/dist/assets/OverviewTab-BY6KZCme.js +0 -2
- package/extensions/dashboard-client/dist/assets/OverviewTab-BY6KZCme.js.map +0 -1
- package/extensions/dashboard-client/dist/assets/ReposTab-CeS-tpDM.js +0 -2
- package/extensions/dashboard-client/dist/assets/ReposTab-CeS-tpDM.js.map +0 -1
- package/extensions/dashboard-client/dist/assets/SessionsTab-C30AwyoF.js +0 -70
- package/extensions/dashboard-client/dist/assets/SetupTab-BJUHOVK2.js +0 -2
- package/extensions/dashboard-client/dist/assets/SetupTab-BJUHOVK2.js.map +0 -1
- package/extensions/dashboard-client/dist/assets/TimeSavedCard-p55K1tFP.js +0 -2
- package/extensions/dashboard-client/dist/assets/TimeSavedCard-p55K1tFP.js.map +0 -1
- package/extensions/dashboard-client/dist/assets/TopicsTab-D8FqyAbK.js +0 -2
- package/extensions/dashboard-client/dist/assets/TopicsTab-D8FqyAbK.js.map +0 -1
- package/extensions/dashboard-client/dist/assets/TurnsTab-ju-nXDys.js +0 -2
- package/extensions/dashboard-client/dist/assets/TurnsTab-ju-nXDys.js.map +0 -1
- package/extensions/dashboard-client/dist/assets/index-BEj1Zahy.js +0 -42
- package/extensions/dashboard-client/dist/assets/index-BEj1Zahy.js.map +0 -1
- package/extensions/dashboard-client/dist/assets/index-CUNn22iV.css +0 -1
- package/extensions/dashboard-client/dist/assets/pricing-CvE4NllQ.js +0 -2
- package/extensions/dashboard-client/dist/assets/pricing-CvE4NllQ.js.map +0 -1
- package/extensions/dashboard-client/src/styles/metrics-extra.css +0 -69
- package/extensions/dashboard-client/src/styles/turns.css +0 -142
- package/extensions/dashboard-client/src/tabs/SetupTab/RagSettingsCard.tsx +0 -160
|
@@ -287,17 +287,21 @@ const MemoryMapView: React.FC = () => {
|
|
|
287
287
|
// Loading state
|
|
288
288
|
|
|
289
289
|
if (loading) {
|
|
290
|
-
return
|
|
290
|
+
return (
|
|
291
|
+
<div className="rounded-lg border border-border bg-bg-card p-6 text-center text-sm text-muted-foreground">
|
|
292
|
+
Loading memory graph...
|
|
293
|
+
</div>
|
|
294
|
+
);
|
|
291
295
|
}
|
|
292
296
|
|
|
293
297
|
// Error state
|
|
294
298
|
|
|
295
299
|
if (error) {
|
|
296
300
|
return (
|
|
297
|
-
<div className="
|
|
298
|
-
<p>Failed to load memory map: {error}</p>
|
|
301
|
+
<div className="rounded-lg border border-border bg-bg-card p-6 text-center text-sm">
|
|
302
|
+
<p className="text-red-400">Failed to load memory map: {error}</p>
|
|
299
303
|
<button
|
|
300
|
-
className="
|
|
304
|
+
className="mt-3 rounded-md border border-border px-3 py-1.5 text-sm transition-colors hover:bg-bg-elevated hover:text-foreground"
|
|
301
305
|
onClick={() => setFrame((s) => s + 1)}
|
|
302
306
|
>
|
|
303
307
|
Retry
|
|
@@ -310,7 +314,7 @@ const MemoryMapView: React.FC = () => {
|
|
|
310
314
|
|
|
311
315
|
if (!data || !layoutRef.current || allSourcesEmpty) {
|
|
312
316
|
return (
|
|
313
|
-
<div className="
|
|
317
|
+
<div className="rounded-lg border border-border bg-bg-card p-6 text-sm text-muted-foreground">
|
|
314
318
|
<p>Memories appear after your first compaction. The graph shows checkpoints (compaction summaries) linked by semantic similarity and time. Run a longer session or lower the compaction tier to see it sooner.</p>
|
|
315
319
|
</div>
|
|
316
320
|
);
|
|
@@ -321,9 +325,9 @@ const MemoryMapView: React.FC = () => {
|
|
|
321
325
|
// Render
|
|
322
326
|
|
|
323
327
|
return (
|
|
324
|
-
<div className="
|
|
328
|
+
<div className="flex flex-col gap-3">
|
|
325
329
|
{/* Toolbar */}
|
|
326
|
-
<div className="
|
|
330
|
+
<div className="flex flex-wrap items-center gap-3">
|
|
327
331
|
<input
|
|
328
332
|
type="text"
|
|
329
333
|
placeholder="Search memories..."
|
|
@@ -331,26 +335,17 @@ const MemoryMapView: React.FC = () => {
|
|
|
331
335
|
onInput={(e: React.FormEvent<HTMLInputElement>) =>
|
|
332
336
|
setSearchQuery((e.target as HTMLInputElement).value)
|
|
333
337
|
}
|
|
334
|
-
className="
|
|
338
|
+
className="w-56 rounded-md border border-border bg-bg-elevated/50 px-3 py-2 text-sm outline-none transition-colors focus:border-primary"
|
|
335
339
|
/>
|
|
336
|
-
<span className="
|
|
337
|
-
{
|
|
338
|
-
|
|
339
|
-
<
|
|
340
|
-
<span className="memory-map-edges">{data.edges.length} edges</span>
|
|
340
|
+
<span className="text-xs text-muted-foreground">
|
|
341
|
+
<span>{countBadge}</span>
|
|
342
|
+
{" · "}
|
|
343
|
+
<span>{data.edges.length} edges</span>
|
|
341
344
|
</span>
|
|
342
345
|
{/* Graph-health indicator */}
|
|
343
346
|
<span
|
|
344
|
-
className="
|
|
345
|
-
style={{
|
|
346
|
-
backgroundColor: healthColor[graphHealth.level] ?? "#6b7280",
|
|
347
|
-
color: "#fff",
|
|
348
|
-
padding: "2px 8px",
|
|
349
|
-
borderRadius: "10px",
|
|
350
|
-
fontSize: "11px",
|
|
351
|
-
fontWeight: 600,
|
|
352
|
-
marginLeft: "8px",
|
|
353
|
-
}}
|
|
347
|
+
className="ml-auto rounded-full px-2 py-1 text-[11px] font-semibold text-white"
|
|
348
|
+
style={{ backgroundColor: healthColor[graphHealth.level] ?? "#6b7280" }}
|
|
354
349
|
title={`Validation: ${graphHealth.label}`}
|
|
355
350
|
>
|
|
356
351
|
{graphHealth.level === "green" ? "Healthy" : graphHealth.level === "yellow" ? "Warnings" : "Critical"}
|
|
@@ -359,20 +354,17 @@ const MemoryMapView: React.FC = () => {
|
|
|
359
354
|
|
|
360
355
|
{/* Source availability indicators */}
|
|
361
356
|
{sourceAvail ? (
|
|
362
|
-
<div className="
|
|
363
|
-
{sourceAvail}
|
|
364
|
-
</div>
|
|
357
|
+
<div className="text-[11px] text-muted-foreground">{sourceAvail}</div>
|
|
365
358
|
) : null}
|
|
366
359
|
|
|
367
360
|
{/* Legend — node types + edge types */}
|
|
368
|
-
<div className="
|
|
369
|
-
<span className="
|
|
361
|
+
<div className="flex flex-wrap items-center gap-x-4 gap-y-1 rounded-lg border border-border/60 bg-bg-card px-3 py-2 text-xs">
|
|
362
|
+
<span className="font-semibold text-muted-foreground">Nodes:</span>
|
|
370
363
|
<Swatch type="node" color={NODE_COLORS.checkpoint} shape="filled-circle" label="Checkpoint" />
|
|
371
364
|
<Swatch type="node" color={NODE_COLORS.turn} shape="hollow-circle" label="Turn" />
|
|
372
365
|
<Swatch type="node" color={NODE_COLORS["turn-content"]} shape="hollow-ring" label="Turn Content" />
|
|
373
366
|
<Swatch type="node" color={NODE_COLORS.memory} shape="diamond" label="Memory" />
|
|
374
|
-
<span className="
|
|
375
|
-
<span className="memory-map-legend-section">Edges:</span>
|
|
367
|
+
<span className="font-semibold text-muted-foreground">Edges:</span>
|
|
376
368
|
<Swatch type="edge" color={edgeColor("semantic")} shape="line" label="Semantic" />
|
|
377
369
|
<Swatch type="edge" color={edgeColor("temporal")} shape="line" label="Temporal" />
|
|
378
370
|
<Swatch type="edge" color={edgeColor("raptor_parent")} shape="line" label="Raptor" />
|
|
@@ -441,32 +433,23 @@ const MemoryMapView: React.FC = () => {
|
|
|
441
433
|
|
|
442
434
|
{/* Node detail panel */}
|
|
443
435
|
{selectedNode ? (
|
|
444
|
-
<div className="
|
|
445
|
-
<h3>
|
|
446
|
-
<span
|
|
447
|
-
className="memory-map-detail-type"
|
|
448
|
-
style={{
|
|
449
|
-
display: "inline-block",
|
|
450
|
-
fontSize: "12px",
|
|
451
|
-
fontWeight: 400,
|
|
452
|
-
color: "#6b7280",
|
|
453
|
-
marginRight: "6px",
|
|
454
|
-
}}
|
|
455
|
-
>
|
|
436
|
+
<div className="rounded-lg border border-border/60 bg-bg-card p-4 text-sm">
|
|
437
|
+
<h3 className="font-heading text-base font-semibold">
|
|
438
|
+
<span className="mr-1.5 text-xs font-normal text-muted-foreground">
|
|
456
439
|
{NODE_TYPE_LABELS[selectedNode.nodeType]}
|
|
457
440
|
</span>
|
|
458
441
|
{selectedNode.label}
|
|
459
442
|
</h3>
|
|
460
|
-
<p>{selectedNode.summaryTruncated}</p>
|
|
443
|
+
<p className="mt-1">{selectedNode.summaryTruncated}</p>
|
|
461
444
|
{selectedNode.topicSummary ? (
|
|
462
|
-
<p className="
|
|
445
|
+
<p className="mt-1">Topic: {selectedNode.topicSummary}</p>
|
|
463
446
|
) : null}
|
|
464
|
-
<p>
|
|
447
|
+
<p className="mt-1">
|
|
465
448
|
Tokens: {selectedNode.tokenEstimate} | Decisions: {selectedNode.decisionCount}
|
|
466
449
|
</p>
|
|
467
450
|
<p>Session: {selectedNode.sessionId}</p>
|
|
468
451
|
<p>Raptor Level: {selectedNode.raptorLevel}</p>
|
|
469
|
-
<p className="
|
|
452
|
+
<p className="mt-1 text-muted-foreground">{selectedNode.textSnippet}</p>
|
|
470
453
|
</div>
|
|
471
454
|
) : null}
|
|
472
455
|
</div>
|
|
@@ -22,34 +22,6 @@ function formatDate(ts: number): string {
|
|
|
22
22
|
return new Date(ts).toLocaleString();
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
const containerStyle: React.CSSProperties = {
|
|
26
|
-
padding: "1rem",
|
|
27
|
-
width: "100%",
|
|
28
|
-
boxSizing: "border-box",
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
const headerStyle: React.CSSProperties = {
|
|
32
|
-
display: "flex",
|
|
33
|
-
gap: "1.5rem",
|
|
34
|
-
alignItems: "center",
|
|
35
|
-
marginBottom: "1rem",
|
|
36
|
-
color: "#a0a0c0",
|
|
37
|
-
fontSize: "0.9rem",
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
const emptyStyle: React.CSSProperties = {
|
|
41
|
-
padding: "2rem",
|
|
42
|
-
border: "1px dashed #2a2a4e",
|
|
43
|
-
borderRadius: "8px",
|
|
44
|
-
color: "#a0a0c0",
|
|
45
|
-
textAlign: "center",
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
const loadingStyle: React.CSSProperties = {
|
|
49
|
-
padding: "1rem",
|
|
50
|
-
color: "#a0a0c0",
|
|
51
|
-
};
|
|
52
|
-
|
|
53
25
|
function NodeCard({ node }: { node: RaptorNodeDTO }): React.ReactElement {
|
|
54
26
|
const border = levelColor(node.level);
|
|
55
27
|
const childrenLabel =
|
|
@@ -122,20 +94,24 @@ export default function RaptorTreeView(): React.ReactElement {
|
|
|
122
94
|
}, []);
|
|
123
95
|
|
|
124
96
|
if (loading) {
|
|
125
|
-
return
|
|
97
|
+
return (
|
|
98
|
+
<div className="rounded-lg border border-border bg-bg-card p-6 text-center text-sm text-muted-foreground">
|
|
99
|
+
Loading RAPTOR tree...
|
|
100
|
+
</div>
|
|
101
|
+
);
|
|
126
102
|
}
|
|
127
103
|
|
|
128
104
|
if (error) {
|
|
129
105
|
return (
|
|
130
|
-
<div
|
|
131
|
-
<p>Failed to load RAPTOR tree: {error}</p>
|
|
106
|
+
<div className="rounded-lg border border-dashed border-border bg-bg-card p-8 text-center text-sm">
|
|
107
|
+
<p className="text-red-400">Failed to load RAPTOR tree: {error}</p>
|
|
132
108
|
</div>
|
|
133
109
|
);
|
|
134
110
|
}
|
|
135
111
|
|
|
136
112
|
if (!data || data.empty || data.nodes.length === 0) {
|
|
137
113
|
return (
|
|
138
|
-
<div
|
|
114
|
+
<div className="rounded-lg border border-dashed border-border bg-bg-card p-8 text-center text-sm text-muted-foreground">
|
|
139
115
|
<p>
|
|
140
116
|
No RAPTOR tree built yet — run a compaction (the tree builds during
|
|
141
117
|
compaction).
|
|
@@ -145,8 +121,8 @@ export default function RaptorTreeView(): React.ReactElement {
|
|
|
145
121
|
}
|
|
146
122
|
|
|
147
123
|
return (
|
|
148
|
-
<div
|
|
149
|
-
<div
|
|
124
|
+
<div className="w-full p-4">
|
|
125
|
+
<div className="mb-4 flex items-center gap-6 text-sm text-muted-foreground">
|
|
150
126
|
<span>
|
|
151
127
|
<strong>{data.nodes.length}</strong> nodes
|
|
152
128
|
</span>
|
|
@@ -9,53 +9,33 @@ import type React from "react";
|
|
|
9
9
|
import { useState } from "react";
|
|
10
10
|
import MemoryMapView from "./MemoryMapTab/MemoryMapView.js";
|
|
11
11
|
import RaptorTreeView from "./MemoryMapTab/RaptorTreeView.js";
|
|
12
|
+
import { Toggle } from "../components/ui/toggle";
|
|
12
13
|
|
|
13
14
|
type MemoryMapSubTab = "map" | "raptor";
|
|
14
15
|
|
|
15
|
-
const subTabNavStyle: React.CSSProperties = {
|
|
16
|
-
display: "flex",
|
|
17
|
-
gap: "0.5rem",
|
|
18
|
-
marginBottom: "1rem",
|
|
19
|
-
borderBottom: "1px solid #2a2a4e",
|
|
20
|
-
paddingBottom: "0.5rem",
|
|
21
|
-
paddingTop: "0.5rem",
|
|
22
|
-
width: "100%",
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
function subTabBtnStyle(active: boolean): React.CSSProperties {
|
|
26
|
-
return {
|
|
27
|
-
background: active ? "#3a5a9f" : "transparent",
|
|
28
|
-
color: active ? "#fff" : "#a0a0c0",
|
|
29
|
-
border: "1px solid",
|
|
30
|
-
borderColor: active ? "#3a5a9f" : "#2a2a4e",
|
|
31
|
-
borderRadius: "6px",
|
|
32
|
-
padding: "0.4rem 0.8rem",
|
|
33
|
-
cursor: "pointer",
|
|
34
|
-
fontSize: "0.9rem",
|
|
35
|
-
fontWeight: active ? 600 : 400,
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
|
|
39
16
|
const MemoryMapTab: React.FC = () => {
|
|
40
17
|
const [subTab, setSubTab] = useState<MemoryMapSubTab>("map");
|
|
41
18
|
|
|
42
19
|
return (
|
|
43
|
-
<div className="
|
|
44
|
-
<nav
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
20
|
+
<div className="flex flex-col gap-4">
|
|
21
|
+
<nav
|
|
22
|
+
className="flex gap-2 border-b border-border pb-2 pt-2"
|
|
23
|
+
aria-label="Memory map sections"
|
|
24
|
+
>
|
|
25
|
+
<Toggle
|
|
26
|
+
pressed={subTab === "map"}
|
|
48
27
|
onClick={() => setSubTab("map")}
|
|
28
|
+
aria-label="Memory Map view"
|
|
49
29
|
>
|
|
50
30
|
Memory Map
|
|
51
|
-
</
|
|
52
|
-
<
|
|
53
|
-
|
|
54
|
-
style={subTabBtnStyle(subTab === "raptor")}
|
|
31
|
+
</Toggle>
|
|
32
|
+
<Toggle
|
|
33
|
+
pressed={subTab === "raptor"}
|
|
55
34
|
onClick={() => setSubTab("raptor")}
|
|
35
|
+
aria-label="RAPTOR Tree view"
|
|
56
36
|
>
|
|
57
37
|
RAPTOR Tree
|
|
58
|
-
</
|
|
38
|
+
</Toggle>
|
|
59
39
|
</nav>
|
|
60
40
|
{subTab === "map" && <MemoryMapView />}
|
|
61
41
|
{subTab === "raptor" && <RaptorTreeView />}
|
|
@@ -11,9 +11,11 @@ import { useCallback } from "react";
|
|
|
11
11
|
import { useApi } from "../hooks/useApi";
|
|
12
12
|
import { fetchPerf, fetchSnapshot } from "../api/client";
|
|
13
13
|
import type { PerfResponse, SnapshotResponse } from "@contracts";
|
|
14
|
+
import { NEW_UI } from "../config";
|
|
14
15
|
import { PerfChart } from "../components/PerfChart";
|
|
15
16
|
import { PerfCards } from "../components/PerfCards";
|
|
16
17
|
import { ModelBadge } from "../components/ModelBadge";
|
|
18
|
+
import { RagDashboard } from "../components/RagDashboard";
|
|
17
19
|
|
|
18
20
|
export default function MetricsTab(): React.ReactElement {
|
|
19
21
|
const { data: perf, error: perfErr } = useApi<PerfResponse>(
|
|
@@ -35,7 +37,7 @@ export default function MetricsTab(): React.ReactElement {
|
|
|
35
37
|
}
|
|
36
38
|
|
|
37
39
|
return (
|
|
38
|
-
<div className="
|
|
40
|
+
<div className="flex flex-col gap-4">
|
|
39
41
|
{snapshot?.model && (
|
|
40
42
|
<ModelBadge
|
|
41
43
|
name={snapshot.model.name}
|
|
@@ -47,9 +49,10 @@ export default function MetricsTab(): React.ReactElement {
|
|
|
47
49
|
)}
|
|
48
50
|
<PerfChart perf={perf} />
|
|
49
51
|
<PerfCards perf={perf} />
|
|
50
|
-
<div className="
|
|
52
|
+
<div className="text-xs text-muted-foreground">
|
|
51
53
|
{perf.sampleCount} samples · updated {perf.updatedAt}
|
|
52
54
|
</div>
|
|
55
|
+
{NEW_UI() && <RagDashboard />}
|
|
53
56
|
</div>
|
|
54
57
|
);
|
|
55
58
|
}
|
|
@@ -41,6 +41,9 @@ import { SessionInfo } from "../components/SessionInfo";
|
|
|
41
41
|
import { CacheHitsCard } from "../components/CacheHitsCard";
|
|
42
42
|
import { TimeSavedCard } from "../components/TimeSavedCard";
|
|
43
43
|
import { LegendCard } from "../components/LegendCard";
|
|
44
|
+
import { Badge } from "../components/ui/badge";
|
|
45
|
+
import { NEW_UI } from "../config";
|
|
46
|
+
import RagHealthCard from "./SetupTab/RagHealthCard";
|
|
44
47
|
|
|
45
48
|
/** Type guard: narrows an SSE event to a session_sample event. */
|
|
46
49
|
function isSessionSample(e: SseEvent): e is SseSessionSample {
|
|
@@ -111,12 +114,14 @@ export default function OverviewTab({
|
|
|
111
114
|
const model = d.model;
|
|
112
115
|
|
|
113
116
|
return (
|
|
114
|
-
<div className="
|
|
115
|
-
<div className="
|
|
116
|
-
<
|
|
117
|
-
<span className="
|
|
117
|
+
<div className="flex flex-col gap-4">
|
|
118
|
+
<div className="flex items-center justify-between">
|
|
119
|
+
<Badge variant="accent">{tier}</Badge>
|
|
120
|
+
<span className="text-xs text-muted-foreground">
|
|
121
|
+
updated {formatUpdatedAt(updatedAt)}
|
|
122
|
+
</span>
|
|
118
123
|
</div>
|
|
119
|
-
<div className="
|
|
124
|
+
<div className="grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3">
|
|
120
125
|
<SessionContextGauges
|
|
121
126
|
sessions={sessionsData}
|
|
122
127
|
loading={sessionsLoading}
|
|
@@ -209,6 +214,7 @@ export default function OverviewTab({
|
|
|
209
214
|
cacheHitSessionSec={timeSaved.cacheHit.sessionSec}
|
|
210
215
|
cacheHitTotalSec={timeSaved.cacheHit.totalSec}
|
|
211
216
|
/>
|
|
217
|
+
{NEW_UI() && <RagHealthCard />}
|
|
212
218
|
<LegendCard />
|
|
213
219
|
</div>
|
|
214
220
|
</div>
|
|
@@ -72,7 +72,7 @@ export default function ReposTab(): React.ReactElement {
|
|
|
72
72
|
|
|
73
73
|
if (repos.length === 0) {
|
|
74
74
|
return (
|
|
75
|
-
<div className="
|
|
75
|
+
<div className="flex flex-col gap-4">
|
|
76
76
|
<SummaryTiles
|
|
77
77
|
totalRepos={0}
|
|
78
78
|
totalCheckpoints={0}
|
|
@@ -92,20 +92,20 @@ export default function ReposTab(): React.ReactElement {
|
|
|
92
92
|
}
|
|
93
93
|
|
|
94
94
|
return (
|
|
95
|
-
<div className="
|
|
95
|
+
<div className="flex flex-col gap-4">
|
|
96
96
|
<SummaryTiles
|
|
97
97
|
totalRepos={summary?.totalRepos ?? 0}
|
|
98
98
|
totalCheckpoints={summary?.totalCheckpoints ?? 0}
|
|
99
99
|
totalTokensSaved={summary?.totalTokensSaved ?? 0}
|
|
100
100
|
compressedOriginalBytes={summary?.totalCompressedOriginalBytes ?? 0}
|
|
101
101
|
/>
|
|
102
|
-
<h2 className="
|
|
102
|
+
<h2 className="font-heading text-lg font-semibold">All Repositories</h2>
|
|
103
103
|
<RepoTable repos={repos} onSelect={setSelected} />
|
|
104
|
-
<h2 className="
|
|
104
|
+
<h2 className="font-heading text-lg font-semibold">
|
|
105
105
|
Active Repos — Live Cache Hits & Compactions
|
|
106
106
|
</h2>
|
|
107
107
|
<ActiveReposTable servers={servers} />
|
|
108
|
-
<h2 className="
|
|
108
|
+
<h2 className="font-heading text-lg font-semibold">Savings by Model</h2>
|
|
109
109
|
<SavingsByModelTable repos={repos} />
|
|
110
110
|
{selected && (
|
|
111
111
|
<RepoDetailModal repo={selected} onClose={() => setSelected(null)} />
|
|
@@ -22,6 +22,8 @@ import { fetchSessions, fetchSessionTimeseries } from "../api/client";
|
|
|
22
22
|
import type { SseEvent, SseSessionSample, SessionsResponse, SessionTimeseriesResponse } from "@contracts";
|
|
23
23
|
import { SessionsMemoryChart } from "../components/SessionsMemoryChart";
|
|
24
24
|
import { ActiveSessionsTable } from "../components/ActiveSessionsTable";
|
|
25
|
+
import { Toggle } from "../components/ui/toggle";
|
|
26
|
+
import { Card, CardContent } from "../components/ui/card";
|
|
25
27
|
|
|
26
28
|
/**
|
|
27
29
|
* Shape of the {@link SseSessionSample} SSE event appended to events.log by
|
|
@@ -61,27 +63,37 @@ function SummaryTiles({ sessions }: SummaryTilesProps): React.ReactElement {
|
|
|
61
63
|
);
|
|
62
64
|
const combinedPct = maxWindow > 0 ? (combinedTokens / maxWindow) * 100 : 0;
|
|
63
65
|
return (
|
|
64
|
-
<div className="
|
|
65
|
-
<
|
|
66
|
-
<
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
</
|
|
81
|
-
<
|
|
82
|
-
<
|
|
83
|
-
|
|
84
|
-
|
|
66
|
+
<div className="grid grid-cols-2 gap-4 md:grid-cols-4">
|
|
67
|
+
<Card>
|
|
68
|
+
<CardContent>
|
|
69
|
+
<span className="text-xs text-muted-foreground">Active sessions</span>
|
|
70
|
+
<div className="text-xl font-semibold">{active}</div>
|
|
71
|
+
</CardContent>
|
|
72
|
+
</Card>
|
|
73
|
+
<Card>
|
|
74
|
+
<CardContent>
|
|
75
|
+
<span className="text-xs text-muted-foreground">Combined tokens</span>
|
|
76
|
+
<div className="text-xl font-semibold">
|
|
77
|
+
{combinedTokens >= 100_000
|
|
78
|
+
? `${(combinedTokens / 1000).toFixed(0)}k`
|
|
79
|
+
: combinedTokens.toLocaleString()}
|
|
80
|
+
</div>
|
|
81
|
+
</CardContent>
|
|
82
|
+
</Card>
|
|
83
|
+
<Card>
|
|
84
|
+
<CardContent>
|
|
85
|
+
<span className="text-xs text-muted-foreground">
|
|
86
|
+
Combined % of max window
|
|
87
|
+
</span>
|
|
88
|
+
<div className="text-xl font-semibold">{Math.round(combinedPct)}%</div>
|
|
89
|
+
</CardContent>
|
|
90
|
+
</Card>
|
|
91
|
+
<Card>
|
|
92
|
+
<CardContent>
|
|
93
|
+
<span className="text-xs text-muted-foreground">Pruned (stale)</span>
|
|
94
|
+
<div className="text-xl font-semibold">{sessions.pruned}</div>
|
|
95
|
+
</CardContent>
|
|
96
|
+
</Card>
|
|
85
97
|
</div>
|
|
86
98
|
);
|
|
87
99
|
}
|
|
@@ -155,33 +167,35 @@ export default function SessionsTab(): React.ReactElement {
|
|
|
155
167
|
WINDOWS.find((w) => w.value === minutes)?.label ?? `${minutes}m`;
|
|
156
168
|
|
|
157
169
|
return (
|
|
158
|
-
<div className="
|
|
159
|
-
<div className="
|
|
160
|
-
<h2
|
|
161
|
-
|
|
170
|
+
<div className="flex flex-col gap-4">
|
|
171
|
+
<div className="flex items-center justify-between">
|
|
172
|
+
<h2 className="font-heading text-lg font-semibold">
|
|
173
|
+
Session Memory Graph
|
|
174
|
+
</h2>
|
|
175
|
+
<div className="flex gap-2">
|
|
162
176
|
{WINDOWS.map((w) => (
|
|
163
|
-
<
|
|
177
|
+
<Toggle
|
|
164
178
|
key={w.value}
|
|
165
|
-
|
|
166
|
-
className={`sessions-window-btn ${minutes === w.value ? "active" : ""}`}
|
|
179
|
+
pressed={minutes === w.value}
|
|
167
180
|
onClick={() => setMinutes(w.value)}
|
|
168
|
-
aria-pressed={minutes === w.value}
|
|
169
181
|
>
|
|
170
182
|
{w.label}
|
|
171
|
-
</
|
|
183
|
+
</Toggle>
|
|
172
184
|
))}
|
|
173
185
|
</div>
|
|
174
186
|
</div>
|
|
175
187
|
|
|
176
188
|
{sessions.length === 0 ? (
|
|
177
|
-
<div className="
|
|
189
|
+
<div className="text-sm text-muted-foreground">No active sessions.</div>
|
|
178
190
|
) : (
|
|
179
191
|
<>
|
|
180
192
|
<SummaryTiles sessions={sessionsData} />
|
|
181
193
|
<SessionsMemoryChart series={series} totals={totals} />
|
|
182
|
-
<h2 className="
|
|
194
|
+
<h2 className="font-heading text-lg font-semibold">
|
|
195
|
+
Active Sessions
|
|
196
|
+
</h2>
|
|
183
197
|
<ActiveSessionsTable sessions={sessions} series={series} />
|
|
184
|
-
<div className="
|
|
198
|
+
<div className="text-xs text-muted-foreground">
|
|
185
199
|
{series.length} series · {totals.length} timestamps ·{" "}
|
|
186
200
|
{windowLabel} window · updated{" "}
|
|
187
201
|
{timeseriesData?.updatedAt ?? sessionsData.updatedAt}
|
|
@@ -13,7 +13,7 @@ import { useState, useEffect, useCallback } from "react";
|
|
|
13
13
|
import type { SetupStatusResponse, SetupDetectResponse, SetupConfigureResponse } from "@contracts";
|
|
14
14
|
import { fetchSetupStatus, fetchSetupDetect, configureEmbedder } from "../../api/client";
|
|
15
15
|
import EmbedderHealthCard from "./EmbedderHealthCard";
|
|
16
|
-
import
|
|
16
|
+
import SettingsPanel from "./SettingsPanel";
|
|
17
17
|
|
|
18
18
|
const styles: Record<string, React.CSSProperties> = {
|
|
19
19
|
container: {
|
|
@@ -464,7 +464,11 @@ export default function EmbedderSetup(): React.ReactElement {
|
|
|
464
464
|
</li>
|
|
465
465
|
</ul>
|
|
466
466
|
</div>
|
|
467
|
-
|
|
467
|
+
{/* Settings Section — every adjustable MEGACOMPACT_* setting */}
|
|
468
|
+
<div style={styles.section}>
|
|
469
|
+
<h3 style={styles.sectionTitle}>Settings</h3>
|
|
470
|
+
<SettingsPanel />
|
|
471
|
+
</div>
|
|
468
472
|
</div>
|
|
469
473
|
);
|
|
470
474
|
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SetupTab/RagHealthCard.tsx — mini RAG health summary for the Overview tab
|
|
3
|
+
* (H3.2). Shows pass rate, avg lift, and an on/off indicator dot, fetched
|
|
4
|
+
* inline from /api/rag-metrics.
|
|
5
|
+
*
|
|
6
|
+
* PREVENT-PI-004: relative-path fetch to the same-origin dashboard server.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type React from "react";
|
|
10
|
+
import { useMemo } from "react";
|
|
11
|
+
import { useApi } from "../../hooks/useApi";
|
|
12
|
+
import { fetchRagMetrics } from "../../api/client";
|
|
13
|
+
import type { RagMetricsResponse } from "@contracts";
|
|
14
|
+
import { Card, CardHeader, CardTitle, CardContent } from "../../components/ui/card";
|
|
15
|
+
|
|
16
|
+
export const RagHealthCard: React.FC = () => {
|
|
17
|
+
const { data: m } = useApi<RagMetricsResponse>(
|
|
18
|
+
useMemo(() => () => fetchRagMetrics(), []),
|
|
19
|
+
{ pollInterval: 30_000 },
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
if (!m) {
|
|
23
|
+
return (
|
|
24
|
+
<Card>
|
|
25
|
+
<CardContent className="text-sm text-muted-foreground">Loading RAG health…</CardContent>
|
|
26
|
+
</Card>
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const { totals, flags } = m;
|
|
31
|
+
const active = flags.hydeEnabled || flags.recallMetricsEnabled;
|
|
32
|
+
|
|
33
|
+
return (
|
|
34
|
+
<Card>
|
|
35
|
+
<CardHeader>
|
|
36
|
+
<CardTitle className="flex items-center gap-2">
|
|
37
|
+
<span
|
|
38
|
+
className={`inline-block h-2 w-2 rounded-full ${active ? "bg-success" : "bg-muted-foreground"}`}
|
|
39
|
+
aria-hidden="true"
|
|
40
|
+
/>
|
|
41
|
+
RAG Health
|
|
42
|
+
</CardTitle>
|
|
43
|
+
</CardHeader>
|
|
44
|
+
<CardContent>
|
|
45
|
+
{!active ? (
|
|
46
|
+
<div className="text-sm text-muted-foreground">
|
|
47
|
+
All RAG recall feature flags are off.
|
|
48
|
+
</div>
|
|
49
|
+
) : (
|
|
50
|
+
<dl className="grid grid-cols-2 gap-x-4 gap-y-2 text-sm">
|
|
51
|
+
<div>
|
|
52
|
+
<dt className="text-xs text-muted-foreground">Pass rate</dt>
|
|
53
|
+
<dd className="font-semibold text-foreground">
|
|
54
|
+
{Math.round(totals.recentPassRate * 100)}%
|
|
55
|
+
</dd>
|
|
56
|
+
</div>
|
|
57
|
+
<div>
|
|
58
|
+
<dt className="text-xs text-muted-foreground">Avg lift</dt>
|
|
59
|
+
<dd className="font-semibold text-foreground">
|
|
60
|
+
{totals.avgLift.toFixed(2)}×
|
|
61
|
+
</dd>
|
|
62
|
+
</div>
|
|
63
|
+
<div>
|
|
64
|
+
<dt className="text-xs text-muted-foreground">Telemetry turns</dt>
|
|
65
|
+
<dd className="font-semibold text-foreground">{totals.telemetryTurns}</dd>
|
|
66
|
+
</div>
|
|
67
|
+
<div>
|
|
68
|
+
<dt className="text-xs text-muted-foreground">HyDE ran</dt>
|
|
69
|
+
<dd className="font-semibold text-foreground">{totals.hydeRanTurns}</dd>
|
|
70
|
+
</div>
|
|
71
|
+
</dl>
|
|
72
|
+
)}
|
|
73
|
+
</CardContent>
|
|
74
|
+
</Card>
|
|
75
|
+
);
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
export default RagHealthCard;
|