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.
Files changed (234) hide show
  1. package/dist/extensions/dashboard-server/api-contracts/endpoints/registry.js +50 -0
  2. package/dist/extensions/dashboard-server/api-contracts/rag-metrics.js +1 -0
  3. package/dist/extensions/dashboard-server/api-contracts/rag-settings.js +3 -3
  4. package/dist/extensions/dashboard-server/api-contracts/wiki.js +1 -0
  5. package/dist/extensions/dashboard-server/index-reader.js +3 -1
  6. package/dist/extensions/dashboard-server/resolve-snapshot.js +81 -0
  7. package/dist/extensions/dashboard-server/routes-core.js +8 -3
  8. package/dist/extensions/dashboard-server/routes-rag-metrics.js +60 -0
  9. package/dist/extensions/dashboard-server/routes-rag-settings-helpers.js +167 -0
  10. package/dist/extensions/dashboard-server/routes-rag-settings.js +136 -77
  11. package/dist/extensions/dashboard-server/routes-repo.js +5 -1
  12. package/dist/extensions/dashboard-server/routes-sessions.js +6 -3
  13. package/dist/extensions/dashboard-server/routes-wiki-helpers.js +97 -0
  14. package/dist/extensions/dashboard-server/routes-wiki.js +330 -0
  15. package/dist/extensions/dashboard-server/routes.js +2 -0
  16. package/dist/extensions/dashboard-server/server.js +17 -3
  17. package/dist/extensions/mega-events/context-handler/afterCompact.js +35 -2
  18. package/dist/extensions/mega-pipeline/recall.js +31 -0
  19. package/dist/extensions/mega-runtime/capture-model.js +5 -2
  20. package/dist/extensions/mega-turn-store.js +2 -1
  21. package/dist/src/config/turns.js +10 -0
  22. package/dist/src/config.js +2 -0
  23. package/dist/src/pricing.js +8 -0
  24. package/dist/src/recall/async.js +10 -1
  25. package/dist/src/recall/format.js +10 -1
  26. package/dist/src/recall/hydeTelemetry.js +22 -0
  27. package/dist/src/recall/sync.js +28 -2
  28. package/dist/src/store/turns/hydeStore.js +32 -0
  29. package/dist/src/store/turns/index.js +1 -0
  30. package/dist/src/store/turns/schema.js +102 -1
  31. package/dist/src/store/turns/sqlite-store/rows.js +23 -0
  32. package/dist/src/store/turns/sqlite-store/write.js +7 -3
  33. package/dist/src/topics/durability.js +187 -0
  34. package/dist/src/topics/index.js +2 -1
  35. package/dist/src/topics/store.js +28 -9
  36. package/dist/src/wiki/curation-helpers.js +71 -0
  37. package/dist/src/wiki/curation.js +147 -0
  38. package/dist/src/wiki/incremental.js +126 -0
  39. package/dist/src/wiki/index.js +5 -0
  40. package/extensions/dashboard-client/dist/assets/AreaChart-j2VOSRp6.js +70 -0
  41. package/extensions/dashboard-client/dist/assets/{SessionsTab-C30AwyoF.js.map → AreaChart-j2VOSRp6.js.map} +1 -1
  42. package/extensions/dashboard-client/dist/assets/CacheTab-Dr1HeMfc.js +2 -0
  43. package/extensions/dashboard-client/dist/assets/CacheTab-Dr1HeMfc.js.map +1 -0
  44. package/extensions/dashboard-client/dist/assets/EventsTab-DRG2k7FS.js +2 -0
  45. package/extensions/dashboard-client/dist/assets/EventsTab-DRG2k7FS.js.map +1 -0
  46. package/extensions/dashboard-client/dist/assets/HealthTab-DGE9PpW3.js +2 -0
  47. package/extensions/dashboard-client/dist/assets/HealthTab-DGE9PpW3.js.map +1 -0
  48. package/extensions/dashboard-client/dist/assets/MaintenanceTab-DeYRhF4q.js +2 -0
  49. package/extensions/dashboard-client/dist/assets/MaintenanceTab-DeYRhF4q.js.map +1 -0
  50. package/extensions/dashboard-client/dist/assets/MemoryMapTab-DSnSO3nG.js +2 -0
  51. package/extensions/dashboard-client/dist/assets/MemoryMapTab-DSnSO3nG.js.map +1 -0
  52. package/extensions/dashboard-client/dist/assets/MetricsTab-RIzNc1Uj.js +2 -0
  53. package/extensions/dashboard-client/dist/assets/MetricsTab-RIzNc1Uj.js.map +1 -0
  54. package/extensions/dashboard-client/dist/assets/OverviewTab-_1BJ4Bmh.js +2 -0
  55. package/extensions/dashboard-client/dist/assets/OverviewTab-_1BJ4Bmh.js.map +1 -0
  56. package/extensions/dashboard-client/dist/assets/ReposTab-DkU7ywZB.js +2 -0
  57. package/extensions/dashboard-client/dist/assets/ReposTab-DkU7ywZB.js.map +1 -0
  58. package/extensions/dashboard-client/dist/assets/SessionsTab-Bq_F_aOk.js +2 -0
  59. package/extensions/dashboard-client/dist/assets/SessionsTab-Bq_F_aOk.js.map +1 -0
  60. package/extensions/dashboard-client/dist/assets/SetupTab-BkBD2Y97.js +2 -0
  61. package/extensions/dashboard-client/dist/assets/SetupTab-BkBD2Y97.js.map +1 -0
  62. package/extensions/dashboard-client/dist/assets/TimeSavedCard-BXzFKU7C.js +2 -0
  63. package/extensions/dashboard-client/dist/assets/TimeSavedCard-BXzFKU7C.js.map +1 -0
  64. package/extensions/dashboard-client/dist/assets/TurnsTab-Bjpp3vBH.js +5 -0
  65. package/extensions/dashboard-client/dist/assets/TurnsTab-Bjpp3vBH.js.map +1 -0
  66. package/extensions/dashboard-client/dist/assets/WikiTab-dBN2EA5G.js +2 -0
  67. package/extensions/dashboard-client/dist/assets/WikiTab-dBN2EA5G.js.map +1 -0
  68. package/extensions/dashboard-client/dist/assets/button-Bt0b5QVp.js +2 -0
  69. package/extensions/dashboard-client/dist/assets/button-Bt0b5QVp.js.map +1 -0
  70. package/extensions/dashboard-client/dist/assets/card-D5CafXtg.js +2 -0
  71. package/extensions/dashboard-client/dist/assets/card-D5CafXtg.js.map +1 -0
  72. package/extensions/dashboard-client/dist/assets/index-CUA6EDRF.css +1 -0
  73. package/extensions/dashboard-client/dist/assets/index-GPHRnEN7.js +137 -0
  74. package/extensions/dashboard-client/dist/assets/index-GPHRnEN7.js.map +1 -0
  75. package/extensions/dashboard-client/dist/assets/pricing-DkYp8-vi.js +2 -0
  76. package/extensions/dashboard-client/dist/assets/pricing-DkYp8-vi.js.map +1 -0
  77. package/extensions/dashboard-client/dist/assets/switch-CY5Gwj1o.js +2 -0
  78. package/extensions/dashboard-client/dist/assets/switch-CY5Gwj1o.js.map +1 -0
  79. package/extensions/dashboard-client/dist/assets/toggle-C9HpkIfH.js +2 -0
  80. package/extensions/dashboard-client/dist/assets/toggle-C9HpkIfH.js.map +1 -0
  81. package/extensions/dashboard-client/dist/assets/{useSSE-p1pOI_-P.js → useSSE-2JFrLDlE.js} +2 -2
  82. package/extensions/dashboard-client/dist/assets/{useSSE-p1pOI_-P.js.map → useSSE-2JFrLDlE.js.map} +1 -1
  83. package/extensions/dashboard-client/dist/index.html +2 -2
  84. package/extensions/dashboard-client/package-lock.json +1995 -191
  85. package/extensions/dashboard-client/package.json +12 -1
  86. package/extensions/dashboard-client/postcss.config.js +6 -0
  87. package/extensions/dashboard-client/src/App.tsx +127 -88
  88. package/extensions/dashboard-client/src/api/client.ts +109 -10
  89. package/extensions/dashboard-client/src/components/ActiveReposTable.tsx +15 -7
  90. package/extensions/dashboard-client/src/components/ActiveSessionsTable.tsx +67 -55
  91. package/extensions/dashboard-client/src/components/CacheHitRateTrendCard.tsx +17 -13
  92. package/extensions/dashboard-client/src/components/CacheHitsCard.tsx +35 -30
  93. package/extensions/dashboard-client/src/components/CacheStatusPerModel.tsx +33 -28
  94. package/extensions/dashboard-client/src/components/EventCategoryFilter.tsx +5 -6
  95. package/extensions/dashboard-client/src/components/EventStream.tsx +17 -13
  96. package/extensions/dashboard-client/src/components/HydeDetailPanel.tsx +173 -0
  97. package/extensions/dashboard-client/src/components/LegendCard.tsx +16 -9
  98. package/extensions/dashboard-client/src/components/PerfCards.tsx +28 -20
  99. package/extensions/dashboard-client/src/components/PerfChart.tsx +9 -6
  100. package/extensions/dashboard-client/src/components/ProviderCacheCard.tsx +15 -7
  101. package/extensions/dashboard-client/src/components/RagDashboard.tsx +253 -0
  102. package/extensions/dashboard-client/src/components/RepoAllSessionsCard.tsx +15 -10
  103. package/extensions/dashboard-client/src/components/RepoContextStack.tsx +24 -16
  104. package/extensions/dashboard-client/src/components/RepoDetailModal.tsx +52 -49
  105. package/extensions/dashboard-client/src/components/RepoTable.tsx +26 -17
  106. package/extensions/dashboard-client/src/components/SessionContextGauges.tsx +11 -14
  107. package/extensions/dashboard-client/src/components/SessionInfo.tsx +20 -15
  108. package/extensions/dashboard-client/src/components/SessionsMemoryChart.tsx +8 -5
  109. package/extensions/dashboard-client/src/components/SummaryTiles.tsx +26 -17
  110. package/extensions/dashboard-client/src/components/TabBar.tsx +1 -3
  111. package/extensions/dashboard-client/src/components/layout/AppShell.tsx +42 -0
  112. package/extensions/dashboard-client/src/components/layout/BottomBar.tsx +88 -0
  113. package/extensions/dashboard-client/src/components/layout/Sidebar.tsx +83 -0
  114. package/extensions/dashboard-client/src/components/ui/badge.tsx +30 -0
  115. package/extensions/dashboard-client/src/components/ui/button.tsx +44 -0
  116. package/extensions/dashboard-client/src/components/ui/card.tsx +32 -0
  117. package/extensions/dashboard-client/src/components/ui/select.tsx +64 -0
  118. package/extensions/dashboard-client/src/components/ui/switch.tsx +26 -0
  119. package/extensions/dashboard-client/src/components/ui/tabs.tsx +36 -0
  120. package/extensions/dashboard-client/src/components/ui/toggle.tsx +28 -0
  121. package/extensions/dashboard-client/src/components/ui/tooltip.tsx +27 -0
  122. package/extensions/dashboard-client/src/config.ts +10 -0
  123. package/extensions/dashboard-client/src/main.tsx +2 -2
  124. package/extensions/dashboard-client/src/memory-map-layout.ts +1 -2
  125. package/extensions/dashboard-client/src/styles/index.css +79 -0
  126. package/extensions/dashboard-client/src/tabs/CacheTab.tsx +33 -26
  127. package/extensions/dashboard-client/src/tabs/EventsTab.tsx +22 -7
  128. package/extensions/dashboard-client/src/tabs/HealthTab.tsx +77 -46
  129. package/extensions/dashboard-client/src/tabs/MaintenanceTab/ActionsCard.tsx +60 -50
  130. package/extensions/dashboard-client/src/tabs/MaintenanceTab/DbStatsCard.tsx +61 -35
  131. package/extensions/dashboard-client/src/tabs/MaintenanceTab/DebugBundleCard.tsx +34 -23
  132. package/extensions/dashboard-client/src/tabs/MaintenanceTab/HealthMitigationCard.tsx +62 -43
  133. package/extensions/dashboard-client/src/tabs/MaintenanceTab/SchemaHealthCard.tsx +53 -32
  134. package/extensions/dashboard-client/src/tabs/MaintenanceTab.tsx +2 -2
  135. package/extensions/dashboard-client/src/tabs/MemoryMapTab/MemoryMapView.tsx +29 -46
  136. package/extensions/dashboard-client/src/tabs/MemoryMapTab/RaptorTreeView.tsx +10 -34
  137. package/extensions/dashboard-client/src/tabs/MemoryMapTab.tsx +14 -34
  138. package/extensions/dashboard-client/src/tabs/MetricsTab.tsx +5 -2
  139. package/extensions/dashboard-client/src/tabs/OverviewTab.tsx +11 -5
  140. package/extensions/dashboard-client/src/tabs/ReposTab.tsx +5 -5
  141. package/extensions/dashboard-client/src/tabs/SessionsTab.tsx +47 -33
  142. package/extensions/dashboard-client/src/tabs/SetupTab/EmbedderSetup.tsx +6 -2
  143. package/extensions/dashboard-client/src/tabs/SetupTab/RagHealthCard.tsx +78 -0
  144. package/extensions/dashboard-client/src/tabs/SetupTab/SettingsPanel.tsx +198 -0
  145. package/extensions/dashboard-client/src/tabs/SetupTab/SettingsSection.tsx +50 -0
  146. package/extensions/dashboard-client/src/tabs/SetupTab.tsx +21 -59
  147. package/extensions/dashboard-client/src/tabs/TopicsTab.tsx +75 -40
  148. package/extensions/dashboard-client/src/tabs/TurnsTab.tsx +150 -112
  149. package/extensions/dashboard-client/src/tabs/WikiTab/TopicEvolutionGraph.tsx +274 -0
  150. package/extensions/dashboard-client/src/tabs/WikiTab/TopicEvolutionView.tsx +71 -0
  151. package/extensions/dashboard-client/src/tabs/WikiTab/TopicTimeline.tsx +103 -0
  152. package/extensions/dashboard-client/src/tabs/WikiTab/WikiPage.tsx +213 -0
  153. package/extensions/dashboard-client/src/tabs/WikiTab/WikiPageControls.tsx +188 -0
  154. package/extensions/dashboard-client/src/tabs/WikiTab.tsx +222 -0
  155. package/extensions/dashboard-client/src/tabs/registry.ts +57 -0
  156. package/extensions/dashboard-client/src/utils/cn.ts +7 -0
  157. package/extensions/dashboard-client/tailwind.config.js +46 -0
  158. package/extensions/dashboard-server/api-contracts/core.ts +59 -0
  159. package/extensions/dashboard-server/api-contracts/endpoints/registry.ts +79 -0
  160. package/extensions/dashboard-server/api-contracts/index.ts +48 -2
  161. package/extensions/dashboard-server/api-contracts/rag-metrics.ts +22 -0
  162. package/extensions/dashboard-server/api-contracts/rag-settings.ts +30 -20
  163. package/extensions/dashboard-server/api-contracts/wiki.ts +138 -0
  164. package/extensions/dashboard-server/index-reader.ts +3 -1
  165. package/extensions/dashboard-server/resolve-snapshot.ts +98 -0
  166. package/extensions/dashboard-server/routes-core.ts +8 -3
  167. package/extensions/dashboard-server/routes-rag-metrics.ts +82 -0
  168. package/extensions/dashboard-server/routes-rag-settings-helpers.ts +314 -0
  169. package/extensions/dashboard-server/routes-rag-settings.ts +147 -97
  170. package/extensions/dashboard-server/routes-repo.ts +5 -1
  171. package/extensions/dashboard-server/routes-sessions.ts +6 -3
  172. package/extensions/dashboard-server/routes-wiki-helpers.ts +126 -0
  173. package/extensions/dashboard-server/routes-wiki.ts +376 -0
  174. package/extensions/dashboard-server/routes.ts +2 -0
  175. package/extensions/dashboard-server/server.ts +18 -2
  176. package/extensions/mega-events/context-handler/afterCompact.ts +44 -1
  177. package/extensions/mega-pipeline/recall.ts +31 -0
  178. package/extensions/mega-runtime/capture-model.ts +5 -2
  179. package/extensions/mega-turn-store.ts +13 -0
  180. package/package.json +1 -1
  181. package/src/config/turns.ts +17 -0
  182. package/src/config.ts +3 -0
  183. package/src/pricing.ts +8 -0
  184. package/src/recall/async.ts +10 -1
  185. package/src/recall/format.ts +15 -2
  186. package/src/recall/hydeTelemetry.ts +44 -0
  187. package/src/recall/sync.ts +34 -2
  188. package/src/recall/types.ts +36 -0
  189. package/src/store/turns/hydeStore.ts +82 -0
  190. package/src/store/turns/index.ts +4 -0
  191. package/src/store/turns/schema.ts +126 -1
  192. package/src/store/turns/sqlite-store/rows.ts +25 -0
  193. package/src/store/turns/sqlite-store/write.ts +20 -2
  194. package/src/store/turns/types.ts +33 -0
  195. package/src/topics/durability.ts +231 -0
  196. package/src/topics/index.ts +7 -1
  197. package/src/topics/store.ts +35 -9
  198. package/src/wiki/curation-helpers.ts +140 -0
  199. package/src/wiki/curation.ts +217 -0
  200. package/src/wiki/incremental.ts +164 -0
  201. package/src/wiki/index.ts +13 -0
  202. package/extensions/dashboard-client/dist/assets/CacheTab-Cqnc7lMg.js +0 -2
  203. package/extensions/dashboard-client/dist/assets/CacheTab-Cqnc7lMg.js.map +0 -1
  204. package/extensions/dashboard-client/dist/assets/EventsTab-tYk3VFAp.js +0 -2
  205. package/extensions/dashboard-client/dist/assets/EventsTab-tYk3VFAp.js.map +0 -1
  206. package/extensions/dashboard-client/dist/assets/HealthTab-D2_kjgxw.js +0 -2
  207. package/extensions/dashboard-client/dist/assets/HealthTab-D2_kjgxw.js.map +0 -1
  208. package/extensions/dashboard-client/dist/assets/MaintenanceTab-Bc-uPYrz.js +0 -2
  209. package/extensions/dashboard-client/dist/assets/MaintenanceTab-Bc-uPYrz.js.map +0 -1
  210. package/extensions/dashboard-client/dist/assets/MemoryMapTab-D1V9g_NC.js +0 -2
  211. package/extensions/dashboard-client/dist/assets/MemoryMapTab-D1V9g_NC.js.map +0 -1
  212. package/extensions/dashboard-client/dist/assets/MetricsTab-DT_XfL96.js +0 -2
  213. package/extensions/dashboard-client/dist/assets/MetricsTab-DT_XfL96.js.map +0 -1
  214. package/extensions/dashboard-client/dist/assets/OverviewTab-BY6KZCme.js +0 -2
  215. package/extensions/dashboard-client/dist/assets/OverviewTab-BY6KZCme.js.map +0 -1
  216. package/extensions/dashboard-client/dist/assets/ReposTab-CeS-tpDM.js +0 -2
  217. package/extensions/dashboard-client/dist/assets/ReposTab-CeS-tpDM.js.map +0 -1
  218. package/extensions/dashboard-client/dist/assets/SessionsTab-C30AwyoF.js +0 -70
  219. package/extensions/dashboard-client/dist/assets/SetupTab-BJUHOVK2.js +0 -2
  220. package/extensions/dashboard-client/dist/assets/SetupTab-BJUHOVK2.js.map +0 -1
  221. package/extensions/dashboard-client/dist/assets/TimeSavedCard-p55K1tFP.js +0 -2
  222. package/extensions/dashboard-client/dist/assets/TimeSavedCard-p55K1tFP.js.map +0 -1
  223. package/extensions/dashboard-client/dist/assets/TopicsTab-D8FqyAbK.js +0 -2
  224. package/extensions/dashboard-client/dist/assets/TopicsTab-D8FqyAbK.js.map +0 -1
  225. package/extensions/dashboard-client/dist/assets/TurnsTab-ju-nXDys.js +0 -2
  226. package/extensions/dashboard-client/dist/assets/TurnsTab-ju-nXDys.js.map +0 -1
  227. package/extensions/dashboard-client/dist/assets/index-BEj1Zahy.js +0 -42
  228. package/extensions/dashboard-client/dist/assets/index-BEj1Zahy.js.map +0 -1
  229. package/extensions/dashboard-client/dist/assets/index-CUNn22iV.css +0 -1
  230. package/extensions/dashboard-client/dist/assets/pricing-CvE4NllQ.js +0 -2
  231. package/extensions/dashboard-client/dist/assets/pricing-CvE4NllQ.js.map +0 -1
  232. package/extensions/dashboard-client/src/styles/metrics-extra.css +0 -69
  233. package/extensions/dashboard-client/src/styles/turns.css +0 -142
  234. 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 <div className="memory-map-loading">Loading memory graph...</div>;
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="memory-map-error">
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="memory-map-retry-btn"
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="memory-map-empty">
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="memory-map-container">
328
+ <div className="flex flex-col gap-3">
325
329
  {/* Toolbar */}
326
- <div className="memory-map-toolbar">
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="memory-map-search"
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="memory-map-stats">
337
- {/* Count badge */}
338
- <span className="memory-map-count-badge">{countBadge}</span>
339
- <br />
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="memory-map-health-badge"
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="memory-map-source-avail" style={{ fontSize: "11px", padding: "2px 12px", color: "#6b7280" }}>
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="memory-map-legend">
369
- <span className="memory-map-legend-section">Nodes:</span>
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="memory-map-legend-sep">|</span>
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="memory-map-detail">
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="memory-map-topic">Topic: {selectedNode.topicSummary}</p>
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="memory-map-snippet">{selectedNode.textSnippet}</p>
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 <div style={loadingStyle}>Loading RAPTOR tree...</div>;
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 style={emptyStyle}>
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 style={emptyStyle}>
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 style={containerStyle}>
149
- <div style={headerStyle}>
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="memory-map-tab">
44
- <nav style={subTabNavStyle} aria-label="Memory map sections">
45
- <button
46
- type="button"
47
- style={subTabBtnStyle(subTab === "map")}
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
- </button>
52
- <button
53
- type="button"
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
- </button>
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="metrics-tab">
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="perf-footer">
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="overview-tab">
115
- <div className="overview-header">
116
- <span className="tier-pill">{tier}</span>
117
- <span className="updated">updated {formatUpdatedAt(updatedAt)}</span>
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="card-grid overview-card-grid">
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="repos-tab">
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="repos-tab">
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="section-header">All Repositories</h2>
102
+ <h2 className="font-heading text-lg font-semibold">All Repositories</h2>
103
103
  <RepoTable repos={repos} onSelect={setSelected} />
104
- <h2 className="section-header">
104
+ <h2 className="font-heading text-lg font-semibold">
105
105
  Active Repos — Live Cache Hits &amp; Compactions
106
106
  </h2>
107
107
  <ActiveReposTable servers={servers} />
108
- <h2 className="section-header">Savings by Model</h2>
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="sessions-summary-tiles">
65
- <div className="tile">
66
- <span className="tile-label">Active sessions</span>
67
- <span className="tile-value">{active}</span>
68
- </div>
69
- <div className="tile">
70
- <span className="tile-label">Combined tokens</span>
71
- <span className="tile-value">
72
- {combinedTokens >= 100_000
73
- ? `${(combinedTokens / 1000).toFixed(0)}k`
74
- : combinedTokens.toLocaleString()}
75
- </span>
76
- </div>
77
- <div className="tile">
78
- <span className="tile-label">Combined % of max window</span>
79
- <span className="tile-value">{Math.round(combinedPct)}%</span>
80
- </div>
81
- <div className="tile">
82
- <span className="tile-label">Pruned (stale)</span>
83
- <span className="tile-value">{sessions.pruned}</span>
84
- </div>
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="sessions-tab">
159
- <div className="sessions-toolbar">
160
- <h2>Session Memory Graph</h2>
161
- <div className="sessions-window-select">
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
- <button
177
+ <Toggle
164
178
  key={w.value}
165
- type="button"
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
- </button>
183
+ </Toggle>
172
184
  ))}
173
185
  </div>
174
186
  </div>
175
187
 
176
188
  {sessions.length === 0 ? (
177
- <div className="sessions-empty">No active sessions.</div>
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="section-header">Active Sessions</h2>
194
+ <h2 className="font-heading text-lg font-semibold">
195
+ Active Sessions
196
+ </h2>
183
197
  <ActiveSessionsTable sessions={sessions} series={series} />
184
- <div className="sessions-footer">
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 RagSettingsCard from "./RagSettingsCard";
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
- <RagSettingsCard />
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;