pi-mega-compact 0.13.4 → 0.13.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.
Files changed (217) hide show
  1. package/README.md +11 -8
  2. package/dist/extensions/dashboard-server/api-contracts/endpoints/registry.js +50 -0
  3. package/dist/extensions/dashboard-server/api-contracts/rag-metrics.js +1 -0
  4. package/dist/extensions/dashboard-server/api-contracts/rag-settings.js +3 -3
  5. package/dist/extensions/dashboard-server/api-contracts/wiki.js +1 -0
  6. package/dist/extensions/dashboard-server/routes-rag-metrics.js +60 -0
  7. package/dist/extensions/dashboard-server/routes-rag-settings-helpers.js +167 -0
  8. package/dist/extensions/dashboard-server/routes-rag-settings.js +136 -77
  9. package/dist/extensions/dashboard-server/routes-wiki-helpers.js +97 -0
  10. package/dist/extensions/dashboard-server/routes-wiki.js +330 -0
  11. package/dist/extensions/dashboard-server/routes.js +2 -0
  12. package/dist/extensions/dashboard-server/server.js +17 -3
  13. package/dist/extensions/mega-events/context-handler/afterCompact.js +35 -2
  14. package/dist/extensions/mega-pipeline/recall.js +31 -0
  15. package/dist/extensions/mega-turn-store.js +2 -1
  16. package/dist/src/config/turns.js +10 -0
  17. package/dist/src/config.js +2 -0
  18. package/dist/src/recall/async.js +10 -1
  19. package/dist/src/recall/format.js +10 -1
  20. package/dist/src/recall/hydeTelemetry.js +22 -0
  21. package/dist/src/recall/sync.js +28 -2
  22. package/dist/src/store/turns/hydeStore.js +32 -0
  23. package/dist/src/store/turns/index.js +1 -0
  24. package/dist/src/store/turns/schema.js +102 -1
  25. package/dist/src/store/turns/sqlite-store/rows.js +23 -0
  26. package/dist/src/store/turns/sqlite-store/write.js +7 -3
  27. package/dist/src/topics/durability.js +187 -0
  28. package/dist/src/topics/index.js +2 -1
  29. package/dist/src/topics/store.js +28 -9
  30. package/dist/src/wiki/curation-helpers.js +71 -0
  31. package/dist/src/wiki/curation.js +147 -0
  32. package/dist/src/wiki/incremental.js +126 -0
  33. package/dist/src/wiki/index.js +5 -0
  34. package/extensions/dashboard-client/dist/assets/AreaChart-KAmp_6bL.js +70 -0
  35. package/extensions/dashboard-client/dist/assets/{SessionsTab-C30AwyoF.js.map → AreaChart-KAmp_6bL.js.map} +1 -1
  36. package/extensions/dashboard-client/dist/assets/CacheTab-Bk-gm-R0.js +2 -0
  37. package/extensions/dashboard-client/dist/assets/CacheTab-Bk-gm-R0.js.map +1 -0
  38. package/extensions/dashboard-client/dist/assets/EventsTab-Cyylo0of.js +2 -0
  39. package/extensions/dashboard-client/dist/assets/EventsTab-Cyylo0of.js.map +1 -0
  40. package/extensions/dashboard-client/dist/assets/HealthTab-D-IzmV29.js +2 -0
  41. package/extensions/dashboard-client/dist/assets/HealthTab-D-IzmV29.js.map +1 -0
  42. package/extensions/dashboard-client/dist/assets/MaintenanceTab-CrlkCFVj.js +2 -0
  43. package/extensions/dashboard-client/dist/assets/MaintenanceTab-CrlkCFVj.js.map +1 -0
  44. package/extensions/dashboard-client/dist/assets/MemoryMapTab-DHUdZ7RR.js +2 -0
  45. package/extensions/dashboard-client/dist/assets/MemoryMapTab-DHUdZ7RR.js.map +1 -0
  46. package/extensions/dashboard-client/dist/assets/MetricsTab-B7I4HWVg.js +2 -0
  47. package/extensions/dashboard-client/dist/assets/MetricsTab-B7I4HWVg.js.map +1 -0
  48. package/extensions/dashboard-client/dist/assets/OverviewTab-K6j4ZI7u.js +2 -0
  49. package/extensions/dashboard-client/dist/assets/OverviewTab-K6j4ZI7u.js.map +1 -0
  50. package/extensions/dashboard-client/dist/assets/ReposTab-BSRWhn56.js +2 -0
  51. package/extensions/dashboard-client/dist/assets/ReposTab-BSRWhn56.js.map +1 -0
  52. package/extensions/dashboard-client/dist/assets/SessionsTab-BXdizHN1.js +2 -0
  53. package/extensions/dashboard-client/dist/assets/SessionsTab-BXdizHN1.js.map +1 -0
  54. package/extensions/dashboard-client/dist/assets/SetupTab-CAgyfqY3.js +2 -0
  55. package/extensions/dashboard-client/dist/assets/SetupTab-CAgyfqY3.js.map +1 -0
  56. package/extensions/dashboard-client/dist/assets/TimeSavedCard-DwgCzPD9.js +2 -0
  57. package/extensions/dashboard-client/dist/assets/TimeSavedCard-DwgCzPD9.js.map +1 -0
  58. package/extensions/dashboard-client/dist/assets/TurnsTab-CVKcStBp.js +5 -0
  59. package/extensions/dashboard-client/dist/assets/TurnsTab-CVKcStBp.js.map +1 -0
  60. package/extensions/dashboard-client/dist/assets/WikiTab-BNohxTbs.js +2 -0
  61. package/extensions/dashboard-client/dist/assets/WikiTab-BNohxTbs.js.map +1 -0
  62. package/extensions/dashboard-client/dist/assets/button-B4A-_dCA.js +2 -0
  63. package/extensions/dashboard-client/dist/assets/button-B4A-_dCA.js.map +1 -0
  64. package/extensions/dashboard-client/dist/assets/card-Cjn7Ifoe.js +2 -0
  65. package/extensions/dashboard-client/dist/assets/card-Cjn7Ifoe.js.map +1 -0
  66. package/extensions/dashboard-client/dist/assets/index-CQjCLvv7.js +137 -0
  67. package/extensions/dashboard-client/dist/assets/index-CQjCLvv7.js.map +1 -0
  68. package/extensions/dashboard-client/dist/assets/index-CUA6EDRF.css +1 -0
  69. package/extensions/dashboard-client/dist/assets/switch-CcdXX0Zm.js +2 -0
  70. package/extensions/dashboard-client/dist/assets/switch-CcdXX0Zm.js.map +1 -0
  71. package/extensions/dashboard-client/dist/assets/toggle-KdBnFLu3.js +2 -0
  72. package/extensions/dashboard-client/dist/assets/toggle-KdBnFLu3.js.map +1 -0
  73. package/extensions/dashboard-client/dist/assets/{useSSE-p1pOI_-P.js → useSSE-B6t44vzc.js} +2 -2
  74. package/extensions/dashboard-client/dist/assets/{useSSE-p1pOI_-P.js.map → useSSE-B6t44vzc.js.map} +1 -1
  75. package/extensions/dashboard-client/dist/index.html +2 -2
  76. package/extensions/dashboard-client/package-lock.json +1995 -191
  77. package/extensions/dashboard-client/package.json +12 -1
  78. package/extensions/dashboard-client/postcss.config.js +6 -0
  79. package/extensions/dashboard-client/src/App.tsx +127 -88
  80. package/extensions/dashboard-client/src/api/client.ts +109 -10
  81. package/extensions/dashboard-client/src/components/ActiveReposTable.tsx +15 -7
  82. package/extensions/dashboard-client/src/components/ActiveSessionsTable.tsx +67 -55
  83. package/extensions/dashboard-client/src/components/CacheHitRateTrendCard.tsx +17 -13
  84. package/extensions/dashboard-client/src/components/CacheHitsCard.tsx +35 -30
  85. package/extensions/dashboard-client/src/components/CacheStatusPerModel.tsx +33 -28
  86. package/extensions/dashboard-client/src/components/EventCategoryFilter.tsx +5 -6
  87. package/extensions/dashboard-client/src/components/EventStream.tsx +17 -13
  88. package/extensions/dashboard-client/src/components/HydeDetailPanel.tsx +173 -0
  89. package/extensions/dashboard-client/src/components/LegendCard.tsx +16 -9
  90. package/extensions/dashboard-client/src/components/PerfCards.tsx +28 -20
  91. package/extensions/dashboard-client/src/components/PerfChart.tsx +9 -6
  92. package/extensions/dashboard-client/src/components/ProviderCacheCard.tsx +15 -7
  93. package/extensions/dashboard-client/src/components/RagDashboard.tsx +253 -0
  94. package/extensions/dashboard-client/src/components/RepoAllSessionsCard.tsx +15 -10
  95. package/extensions/dashboard-client/src/components/RepoContextStack.tsx +24 -16
  96. package/extensions/dashboard-client/src/components/RepoDetailModal.tsx +52 -49
  97. package/extensions/dashboard-client/src/components/RepoTable.tsx +26 -17
  98. package/extensions/dashboard-client/src/components/SessionContextGauges.tsx +11 -14
  99. package/extensions/dashboard-client/src/components/SessionInfo.tsx +20 -15
  100. package/extensions/dashboard-client/src/components/SessionsMemoryChart.tsx +8 -5
  101. package/extensions/dashboard-client/src/components/SummaryTiles.tsx +26 -17
  102. package/extensions/dashboard-client/src/components/TabBar.tsx +1 -3
  103. package/extensions/dashboard-client/src/components/layout/AppShell.tsx +42 -0
  104. package/extensions/dashboard-client/src/components/layout/BottomBar.tsx +88 -0
  105. package/extensions/dashboard-client/src/components/layout/Sidebar.tsx +83 -0
  106. package/extensions/dashboard-client/src/components/ui/badge.tsx +30 -0
  107. package/extensions/dashboard-client/src/components/ui/button.tsx +44 -0
  108. package/extensions/dashboard-client/src/components/ui/card.tsx +32 -0
  109. package/extensions/dashboard-client/src/components/ui/select.tsx +64 -0
  110. package/extensions/dashboard-client/src/components/ui/switch.tsx +26 -0
  111. package/extensions/dashboard-client/src/components/ui/tabs.tsx +36 -0
  112. package/extensions/dashboard-client/src/components/ui/toggle.tsx +28 -0
  113. package/extensions/dashboard-client/src/components/ui/tooltip.tsx +27 -0
  114. package/extensions/dashboard-client/src/config.ts +10 -0
  115. package/extensions/dashboard-client/src/main.tsx +2 -2
  116. package/extensions/dashboard-client/src/memory-map-layout.ts +1 -2
  117. package/extensions/dashboard-client/src/styles/index.css +79 -0
  118. package/extensions/dashboard-client/src/tabs/CacheTab.tsx +33 -26
  119. package/extensions/dashboard-client/src/tabs/EventsTab.tsx +22 -7
  120. package/extensions/dashboard-client/src/tabs/HealthTab.tsx +77 -46
  121. package/extensions/dashboard-client/src/tabs/MaintenanceTab/ActionsCard.tsx +60 -50
  122. package/extensions/dashboard-client/src/tabs/MaintenanceTab/DbStatsCard.tsx +61 -35
  123. package/extensions/dashboard-client/src/tabs/MaintenanceTab/DebugBundleCard.tsx +34 -23
  124. package/extensions/dashboard-client/src/tabs/MaintenanceTab/HealthMitigationCard.tsx +62 -43
  125. package/extensions/dashboard-client/src/tabs/MaintenanceTab/SchemaHealthCard.tsx +53 -32
  126. package/extensions/dashboard-client/src/tabs/MaintenanceTab.tsx +2 -2
  127. package/extensions/dashboard-client/src/tabs/MemoryMapTab/MemoryMapView.tsx +29 -46
  128. package/extensions/dashboard-client/src/tabs/MemoryMapTab/RaptorTreeView.tsx +10 -34
  129. package/extensions/dashboard-client/src/tabs/MemoryMapTab.tsx +14 -34
  130. package/extensions/dashboard-client/src/tabs/MetricsTab.tsx +5 -2
  131. package/extensions/dashboard-client/src/tabs/OverviewTab.tsx +11 -5
  132. package/extensions/dashboard-client/src/tabs/ReposTab.tsx +5 -5
  133. package/extensions/dashboard-client/src/tabs/SessionsTab.tsx +47 -33
  134. package/extensions/dashboard-client/src/tabs/SetupTab/EmbedderSetup.tsx +6 -2
  135. package/extensions/dashboard-client/src/tabs/SetupTab/RagHealthCard.tsx +78 -0
  136. package/extensions/dashboard-client/src/tabs/SetupTab/SettingsPanel.tsx +198 -0
  137. package/extensions/dashboard-client/src/tabs/SetupTab/SettingsSection.tsx +50 -0
  138. package/extensions/dashboard-client/src/tabs/SetupTab.tsx +21 -59
  139. package/extensions/dashboard-client/src/tabs/TopicsTab.tsx +75 -40
  140. package/extensions/dashboard-client/src/tabs/TurnsTab.tsx +150 -112
  141. package/extensions/dashboard-client/src/tabs/WikiTab/TopicEvolutionGraph.tsx +274 -0
  142. package/extensions/dashboard-client/src/tabs/WikiTab/TopicEvolutionView.tsx +71 -0
  143. package/extensions/dashboard-client/src/tabs/WikiTab/TopicTimeline.tsx +103 -0
  144. package/extensions/dashboard-client/src/tabs/WikiTab/WikiPage.tsx +213 -0
  145. package/extensions/dashboard-client/src/tabs/WikiTab/WikiPageControls.tsx +188 -0
  146. package/extensions/dashboard-client/src/tabs/WikiTab.tsx +222 -0
  147. package/extensions/dashboard-client/src/tabs/registry.ts +57 -0
  148. package/extensions/dashboard-client/src/utils/cn.ts +7 -0
  149. package/extensions/dashboard-client/tailwind.config.js +46 -0
  150. package/extensions/dashboard-server/api-contracts/core.ts +59 -0
  151. package/extensions/dashboard-server/api-contracts/endpoints/registry.ts +79 -0
  152. package/extensions/dashboard-server/api-contracts/index.ts +48 -2
  153. package/extensions/dashboard-server/api-contracts/rag-metrics.ts +22 -0
  154. package/extensions/dashboard-server/api-contracts/rag-settings.ts +30 -20
  155. package/extensions/dashboard-server/api-contracts/wiki.ts +138 -0
  156. package/extensions/dashboard-server/routes-rag-metrics.ts +82 -0
  157. package/extensions/dashboard-server/routes-rag-settings-helpers.ts +314 -0
  158. package/extensions/dashboard-server/routes-rag-settings.ts +147 -97
  159. package/extensions/dashboard-server/routes-wiki-helpers.ts +126 -0
  160. package/extensions/dashboard-server/routes-wiki.ts +376 -0
  161. package/extensions/dashboard-server/routes.ts +2 -0
  162. package/extensions/dashboard-server/server.ts +18 -2
  163. package/extensions/mega-events/context-handler/afterCompact.ts +44 -1
  164. package/extensions/mega-pipeline/recall.ts +31 -0
  165. package/extensions/mega-turn-store.ts +13 -0
  166. package/package.json +1 -1
  167. package/src/config/turns.ts +17 -0
  168. package/src/config.ts +3 -0
  169. package/src/recall/async.ts +10 -1
  170. package/src/recall/format.ts +15 -2
  171. package/src/recall/hydeTelemetry.ts +44 -0
  172. package/src/recall/sync.ts +34 -2
  173. package/src/recall/types.ts +36 -0
  174. package/src/store/turns/hydeStore.ts +82 -0
  175. package/src/store/turns/index.ts +4 -0
  176. package/src/store/turns/schema.ts +126 -1
  177. package/src/store/turns/sqlite-store/rows.ts +25 -0
  178. package/src/store/turns/sqlite-store/write.ts +20 -2
  179. package/src/store/turns/types.ts +33 -0
  180. package/src/topics/durability.ts +231 -0
  181. package/src/topics/index.ts +7 -1
  182. package/src/topics/store.ts +35 -9
  183. package/src/wiki/curation-helpers.ts +140 -0
  184. package/src/wiki/curation.ts +217 -0
  185. package/src/wiki/incremental.ts +164 -0
  186. package/src/wiki/index.ts +13 -0
  187. package/extensions/dashboard-client/dist/assets/CacheTab-Cqnc7lMg.js +0 -2
  188. package/extensions/dashboard-client/dist/assets/CacheTab-Cqnc7lMg.js.map +0 -1
  189. package/extensions/dashboard-client/dist/assets/EventsTab-tYk3VFAp.js +0 -2
  190. package/extensions/dashboard-client/dist/assets/EventsTab-tYk3VFAp.js.map +0 -1
  191. package/extensions/dashboard-client/dist/assets/HealthTab-D2_kjgxw.js +0 -2
  192. package/extensions/dashboard-client/dist/assets/HealthTab-D2_kjgxw.js.map +0 -1
  193. package/extensions/dashboard-client/dist/assets/MaintenanceTab-Bc-uPYrz.js +0 -2
  194. package/extensions/dashboard-client/dist/assets/MaintenanceTab-Bc-uPYrz.js.map +0 -1
  195. package/extensions/dashboard-client/dist/assets/MemoryMapTab-D1V9g_NC.js +0 -2
  196. package/extensions/dashboard-client/dist/assets/MemoryMapTab-D1V9g_NC.js.map +0 -1
  197. package/extensions/dashboard-client/dist/assets/MetricsTab-DT_XfL96.js +0 -2
  198. package/extensions/dashboard-client/dist/assets/MetricsTab-DT_XfL96.js.map +0 -1
  199. package/extensions/dashboard-client/dist/assets/OverviewTab-BY6KZCme.js +0 -2
  200. package/extensions/dashboard-client/dist/assets/OverviewTab-BY6KZCme.js.map +0 -1
  201. package/extensions/dashboard-client/dist/assets/ReposTab-CeS-tpDM.js +0 -2
  202. package/extensions/dashboard-client/dist/assets/ReposTab-CeS-tpDM.js.map +0 -1
  203. package/extensions/dashboard-client/dist/assets/SessionsTab-C30AwyoF.js +0 -70
  204. package/extensions/dashboard-client/dist/assets/SetupTab-BJUHOVK2.js +0 -2
  205. package/extensions/dashboard-client/dist/assets/SetupTab-BJUHOVK2.js.map +0 -1
  206. package/extensions/dashboard-client/dist/assets/TimeSavedCard-p55K1tFP.js +0 -2
  207. package/extensions/dashboard-client/dist/assets/TimeSavedCard-p55K1tFP.js.map +0 -1
  208. package/extensions/dashboard-client/dist/assets/TopicsTab-D8FqyAbK.js +0 -2
  209. package/extensions/dashboard-client/dist/assets/TopicsTab-D8FqyAbK.js.map +0 -1
  210. package/extensions/dashboard-client/dist/assets/TurnsTab-ju-nXDys.js +0 -2
  211. package/extensions/dashboard-client/dist/assets/TurnsTab-ju-nXDys.js.map +0 -1
  212. package/extensions/dashboard-client/dist/assets/index-BEj1Zahy.js +0 -42
  213. package/extensions/dashboard-client/dist/assets/index-BEj1Zahy.js.map +0 -1
  214. package/extensions/dashboard-client/dist/assets/index-CUNn22iV.css +0 -1
  215. package/extensions/dashboard-client/src/styles/metrics-extra.css +0 -69
  216. package/extensions/dashboard-client/src/styles/turns.css +0 -142
  217. package/extensions/dashboard-client/src/tabs/SetupTab/RagSettingsCard.tsx +0 -160
@@ -1,42 +1,52 @@
1
1
  /**
2
- * api-contracts/rag-settings.ts — RAG feature flag API response types.
2
+ * api-contracts/rag-settings.ts — comprehensive settings API response types.
3
3
  *
4
- * Types for the /api/rag-settings endpoint used by the dashboard RAG Settings
5
- * panel to read and toggle the five RAG feature flags (B1–B5).
4
+ * Types for the /api/rag-settings endpoint used by the dashboard Setup panel to
5
+ * read and update every adjustable MEGACOMPACT_* setting, grouped by category.
6
6
  *
7
7
  * PREVENT-PI-004: type definitions only, no network code.
8
8
  * PREVENT-011: no `any` type — all types are explicit.
9
9
  */
10
10
 
11
- /**单个 RAG feature flag state for the dashboard. */
12
- export interface RagFlagState {
13
- /** Env var key without the _DISABLED suffix, e.g. "MEGACOMPACT_HYDE". */
11
+ /** A single configurable setting's metadata + current value. */
12
+ export interface SettingState {
14
13
  readonly key: string;
15
- /** Short human-readable label, e.g. "HyDE (Hypothetical Document Embeddings)". */
16
14
  readonly label: string;
17
- /** One-line description of what the flag does. */
18
15
  readonly description: string;
19
- /** Whether the flag is currently enabled (true = ON, false = disabled via _DISABLED). */
20
- readonly enabled: boolean;
21
- /** Whether this flag requires an LLM embedder (HttpEmbedder) to function. */
16
+ readonly category: string;
17
+ readonly type: "boolean" | "number" | "string";
18
+ readonly value: string | number | boolean;
19
+ readonly default: string | number | boolean;
20
+ readonly disabledConvention: boolean;
22
21
  readonly requiresLlm: boolean;
22
+ readonly unit?: string;
23
+ readonly min?: number;
24
+ readonly max?: number;
23
25
  }
24
26
 
25
- /** Response for GET /api/rag-settings. */
26
- export interface RagSettingsResponse {
27
- readonly flags: RagFlagState[];
28
- /** Whether an HttpEmbedder (LLM) is currently active — gates HyDE toggle. */
27
+ /** Response for GET /api/rag-settings — all settings grouped by category. */
28
+ export interface SettingsResponse {
29
+ readonly categories: ReadonlyArray<{ name: string; settings: SettingState[] }>;
29
30
  readonly llmActive: boolean;
30
31
  }
31
32
 
32
- /** Request body for POST /api/rag-settings. */
33
- export interface RagSettingsRequest {
34
- /** Map of flag key (e.g. "MEGACOMPACT_HYDE") to desired enabled state. */
35
- readonly flags: Record<string, boolean>;
33
+ /** Request body for POST /api/rag-settings — update a single setting. */
34
+ export interface SettingsUpdateRequest {
35
+ readonly key: string;
36
+ readonly value: string;
36
37
  }
37
38
 
38
39
  /** Response for POST /api/rag-settings. */
39
- export interface RagSettingsResponsePost {
40
+ export interface SettingsResponsePost {
40
41
  readonly envPath: string;
41
42
  readonly restartRequired: boolean;
42
43
  }
44
+
45
+ /** @deprecated Use SettingState instead */
46
+ export type RagFlagState = SettingState;
47
+ /** @deprecated Use SettingsResponse instead */
48
+ export type RagSettingsResponse = SettingsResponse;
49
+ /** @deprecated Use SettingsUpdateRequest instead */
50
+ export type RagSettingsRequest = SettingsUpdateRequest;
51
+ /** @deprecated Use SettingsResponsePost instead */
52
+ export type RagSettingsResponsePost = SettingsResponsePost;
@@ -0,0 +1,138 @@
1
+ /**
2
+ * api-contracts/wiki.ts — W2 wiki revival contract types.
3
+ *
4
+ * Shapes for the 7 wiki endpoints plus the SSE events the mutations emit.
5
+ * `CurationResult` is the canonical type from src/wiki/curation.ts (single
6
+ * source of truth), re-exported here for route + client parity. Type-only —
7
+ * no network (PREVENT-PI-004), no `any` (PREVENT-011).
8
+ */
9
+ import type { CurationResult } from "../../../src/wiki/curation.js";
10
+
11
+ /** One topic row in the wiki index (with resolved custom label). */
12
+ export interface WikiIndexEntry {
13
+ id: string;
14
+ label: string;
15
+ memoryCount: number;
16
+ lastUpdated: number;
17
+ /** True when the label is a user override, not the auto-generated one. */
18
+ edited: boolean;
19
+ /** Cumulative override kinds for badge provenance. */
20
+ overrideKinds: Array<"label" | "merge" | "split">;
21
+ }
22
+
23
+ /** GET /api/wiki/index — wiki landing page payload. */
24
+ export interface WikiIndexResponse {
25
+ topics: WikiIndexEntry[];
26
+ totalTopics: number;
27
+ totalMemories: number;
28
+ lastRebuildAt: number | null;
29
+ }
30
+
31
+ /** Provenance for one memory within a wiki topic. */
32
+ export interface MemoryProvenance {
33
+ memoryId: string;
34
+ sessionId: string;
35
+ assignedAt: number;
36
+ method: string;
37
+ }
38
+
39
+ /** GET /api/wiki/topic/:topicId — single topic page. */
40
+ export interface WikiPageResponse {
41
+ topic: WikiIndexEntry;
42
+ summary: string;
43
+ keyMemories: Array<{
44
+ memoryId: string;
45
+ content: string;
46
+ timestamp: number;
47
+ importance: number;
48
+ }>;
49
+ provenance: MemoryProvenance[];
50
+ relatedTopicIds: string[];
51
+ generatedAt: number;
52
+ }
53
+
54
+ /** PUT /api/wiki/topic/:topicId/label — rename request body. */
55
+ export interface RenameTopicRequest {
56
+ label: string;
57
+ }
58
+
59
+ /** POST /api/wiki/merge — merge source into target. */
60
+ export interface MergeTopicsRequest {
61
+ sourceTopicId: string;
62
+ targetTopicId: string;
63
+ }
64
+
65
+ /** POST /api/wiki/topic/:topicId/split — split request body. */
66
+ export interface SplitTopicRequest {
67
+ memoryIds: string[];
68
+ }
69
+
70
+ /** One flat node row in the D3 evolution graph. */
71
+ export interface TopicEvolutionNode {
72
+ id: string;
73
+ label: string;
74
+ memoryCount: number;
75
+ }
76
+
77
+ /** One edge between evolved topics. */
78
+ export interface TopicEvolutionEdge {
79
+ source: string;
80
+ target: string;
81
+ kind: "merge" | "split";
82
+ at: number;
83
+ }
84
+
85
+ /** GET /api/wiki/evolution — nodes + edges + time buckets for D3. */
86
+ export interface TopicEvolutionResponse {
87
+ nodes: TopicEvolutionNode[];
88
+ edges: TopicEvolutionEdge[];
89
+ buckets: Array<{ bucket: number; count: number }>;
90
+ }
91
+
92
+ /** GET /api/wiki/topic/:topicId/timeline — per-topic time buckets. */
93
+ export interface TopicTimelineResponse {
94
+ topicId: string;
95
+ buckets: Array<{ bucket: number; count: number }>;
96
+ total: number;
97
+ }
98
+
99
+ /** SSE: wiki model rebuilt. */
100
+ export interface SseWikiRebuilt {
101
+ type: "wiki_rebuilt";
102
+ ts: string;
103
+ topicCount: number;
104
+ }
105
+
106
+ /** SSE: a topic was renamed. */
107
+ export interface SseWikiTopicRenamed {
108
+ type: "wiki_topic_renamed";
109
+ ts: string;
110
+ topicId: string;
111
+ label: string;
112
+ edited: boolean;
113
+ }
114
+
115
+ /** SSE: two topics were merged. */
116
+ export interface SseWikiTopicsMerged {
117
+ type: "wiki_topics_merged";
118
+ ts: string;
119
+ sourceTopicId: string;
120
+ targetTopicId: string;
121
+ }
122
+
123
+ /** SSE: a topic was split. */
124
+ export interface SseWikiTopicSplit {
125
+ type: "wiki_topic_split";
126
+ ts: string;
127
+ fromTopicId: string;
128
+ toTopicId: string;
129
+ }
130
+
131
+ /** Union of all wiki SSE events. */
132
+ export type WikiSseEvent =
133
+ | SseWikiRebuilt
134
+ | SseWikiTopicRenamed
135
+ | SseWikiTopicsMerged
136
+ | SseWikiTopicSplit;
137
+
138
+ export type { CurationResult };
@@ -0,0 +1,82 @@
1
+ /**
2
+ * dashboard-server/routes-rag-metrics.ts — GET /api/rag-metrics route (H2).
3
+ *
4
+ * Aggregates the H1 HyDE + recall-quality telemetry columns from turns.db into
5
+ * a compact response (flags, totals, recent rows, daily series).
6
+ *
7
+ * Guardrails: PREVENT-PI-004 (loopback-only), PREVENT-002 (parameterized),
8
+ * PREVENT-011 (no `any`).
9
+ */
10
+
11
+ import type { IncomingMessage, ServerResponse } from "node:http";
12
+ import type { DatabaseSync } from "node:sqlite";
13
+ import type { RouteContext } from "./routes-core.js";
14
+ import { openTurnStore } from "../../src/store/turns/connection.js";
15
+ import {
16
+ listTelemetryTurns,
17
+ aggregateDailyTelemetry,
18
+ } from "../../src/store/turns/hydeStore.js";
19
+ import { RAG_HYDE_ENABLED, RAG_RECALL_METRICS } from "../../src/config.js";
20
+ import type { RagMetricsResponse } from "./api-contracts/rag-metrics.js";
21
+
22
+ function sendJson(res: ServerResponse, status: number, body: unknown): void {
23
+ // guardrails-allow PREVENT-PI-004: loopback dashboard response (local)
24
+ res.writeHead(status, { "Content-Type": "application/json" });
25
+ res.end(JSON.stringify(body));
26
+ }
27
+
28
+ export function handleRagMetrics(
29
+ req: IncomingMessage,
30
+ res: ServerResponse,
31
+ ctx: RouteContext,
32
+ ): boolean {
33
+ const url = req.url ?? "";
34
+ if (url !== "/api/rag-metrics" || req.method !== "GET") return false;
35
+
36
+ let db: DatabaseSync | null;
37
+ try {
38
+ db = openTurnStore(ctx.stateDir);
39
+ } catch {
40
+ db = null;
41
+ }
42
+ const recent = db ? listTelemetryTurns(db, { limit: 200 }) : [];
43
+ const daily = db ? aggregateDailyTelemetry(db, 14) : [];
44
+
45
+ const hydeRanTurns = recent.filter((t) => t.hydeRan === 1).length;
46
+ const liftSum = recent.reduce((s, t) => s + t.hydeLift, 0);
47
+ const genSum = recent.reduce((s, t) => s + t.hydeGenerationMs, 0);
48
+ const scored = recent.filter(
49
+ (t) => t.recallScore > 0 || t.recallPass === 1,
50
+ );
51
+ const avgScore =
52
+ scored.length > 0
53
+ ? Math.round(
54
+ (scored.reduce((s, t) => s + t.recallScore, 0) / scored.length) * 100,
55
+ ) / 100
56
+ : null;
57
+ const passCount = scored.filter((t) => t.recallPass === 1).length;
58
+ const recentPassRate =
59
+ scored.length > 0 ? Math.round((passCount / scored.length) * 100) / 100 : 0;
60
+
61
+ const body: RagMetricsResponse = {
62
+ flags: {
63
+ hydeEnabled: RAG_HYDE_ENABLED(),
64
+ recallMetricsEnabled: RAG_RECALL_METRICS(),
65
+ },
66
+ totals: {
67
+ telemetryTurns: recent.length,
68
+ hydeRanTurns,
69
+ avgLift:
70
+ recent.length > 0
71
+ ? Math.round((liftSum / recent.length) * 100) / 100
72
+ : 0,
73
+ avgScore,
74
+ avgGenerationMs: recent.length > 0 ? Math.round(genSum / recent.length) : 0,
75
+ recentPassRate,
76
+ },
77
+ recent: recent.slice(0, 50),
78
+ daily,
79
+ };
80
+ sendJson(res, 200, body);
81
+ return true;
82
+ }
@@ -0,0 +1,314 @@
1
+ /**
2
+ * dashboard-server/routes-rag-settings-helpers.ts — SETTINGS inventory.
3
+ *
4
+ * The full catalog of user-adjustable MEGACOMPACT_* settings surfaced by the
5
+ * dashboard Setup panel, grouped by category. Kept separate from the route
6
+ * handler so the inventory can grow without bloating the handler file.
7
+ *
8
+ * PREVENT-011: no `any` type.
9
+ */
10
+
11
+
12
+ /**
13
+ * Base metadata for a single setting entry before its live `value` is resolved.
14
+ * `category` and `value` are filled in at read time by the handler.
15
+ */
16
+ export interface SettingSpec {
17
+ key: string;
18
+ label: string;
19
+ description: string;
20
+ type: "boolean" | "number" | "string";
21
+ default: string | number | boolean;
22
+ /** True when this is a `_DISABLED`-convention opt-out flag. */
23
+ disabledConvention: boolean;
24
+ requiresLlm: boolean;
25
+ unit?: string;
26
+ min?: number;
27
+ max?: number;
28
+ }
29
+
30
+ // Shorthand builders to keep the inventory terse and unambiguous.
31
+ const boolFlag = (
32
+ key: string,
33
+ label: string,
34
+ description: string,
35
+ def: boolean,
36
+ requiresLlm = false,
37
+ ): SettingSpec => ({
38
+ key,
39
+ label,
40
+ description,
41
+ type: "boolean",
42
+ default: def,
43
+ disabledConvention: true,
44
+ requiresLlm,
45
+ });
46
+
47
+ const boolDirect = (
48
+ key: string,
49
+ label: string,
50
+ description: string,
51
+ def: boolean,
52
+ ): SettingSpec => ({
53
+ key,
54
+ label,
55
+ description,
56
+ type: "boolean",
57
+ default: def,
58
+ disabledConvention: false,
59
+ requiresLlm: false,
60
+ });
61
+
62
+ const num = (
63
+ key: string,
64
+ label: string,
65
+ description: string,
66
+ def: number,
67
+ min: number,
68
+ max: number,
69
+ unit?: string,
70
+ ): SettingSpec => ({
71
+ key,
72
+ label,
73
+ description,
74
+ type: "number",
75
+ default: def,
76
+ disabledConvention: false,
77
+ requiresLlm: false,
78
+ min,
79
+ max,
80
+ ...(unit ? { unit } : {}),
81
+ });
82
+
83
+ const str = (
84
+ key: string,
85
+ label: string,
86
+ description: string,
87
+ def: string,
88
+ ): SettingSpec => ({
89
+ key,
90
+ label,
91
+ description,
92
+ type: "string",
93
+ default: def,
94
+ disabledConvention: false,
95
+ requiresLlm: false,
96
+ });
97
+
98
+ /** Every adjustable setting, grouped by category. Read-only after module load. */
99
+ export const SETTINGS: ReadonlyArray<{
100
+ name: string;
101
+ settings: SettingSpec[];
102
+ }> = [
103
+ {
104
+ name: "RAG Pipeline",
105
+ settings: [
106
+ boolFlag(
107
+ "MEGACOMPACT_QUERY_REFORMULATION",
108
+ "Query Reformulation",
109
+ "TF-IDF keyword expansion for vague recall queries",
110
+ true,
111
+ ),
112
+ boolFlag(
113
+ "MEGACOMPACT_TIERED_ROUTER",
114
+ "Tiered Recall Router",
115
+ "L0 cache → L1 FTS5 → L2 HNSW routing",
116
+ true,
117
+ ),
118
+ boolFlag(
119
+ "MEGACOMPACT_RECALL_METRICS",
120
+ "Recall Quality Metrics",
121
+ "Precision/recall scoring and logging",
122
+ true,
123
+ ),
124
+ boolFlag(
125
+ "MEGACOMPACT_MEMORY_GRAPH",
126
+ "Memory Graph",
127
+ "Dashboard-oriented memory graph traversal",
128
+ true,
129
+ ),
130
+ boolFlag(
131
+ "MEGACOMPACT_HYDE",
132
+ "HyDE",
133
+ "Generate hypothetical answer via LLM, embed it, RRF-fuse",
134
+ true,
135
+ true,
136
+ ),
137
+ boolFlag(
138
+ "MEGACOMPACT_NEW_UI",
139
+ "New Dashboard UI",
140
+ "Tailwind + shadcn visual design (sidebar, glass panels)",
141
+ true,
142
+ ),
143
+ ],
144
+ },
145
+ {
146
+ name: "Wiki / Turns",
147
+ settings: [
148
+ boolFlag(
149
+ "MEGACOMPACT_WIKI_ENHANCED",
150
+ "Wiki Enhanced",
151
+ "User curation (rename/merge/split) + topic evolution",
152
+ true,
153
+ ),
154
+ boolFlag(
155
+ "MEGACOMPACT_WIKI_INCREMENTAL",
156
+ "Wiki Incremental",
157
+ "Assign new memories to nearest centroid",
158
+ true,
159
+ ),
160
+ boolDirect(
161
+ "MEGACOMPACT_AUTO_WIKI",
162
+ "Auto Wiki",
163
+ "Auto-categorizing wiki (k-means + TF-IDF)",
164
+ true,
165
+ ),
166
+ boolDirect(
167
+ "MEGACOMPACT_WIKI_SEED_FROM_TURNS",
168
+ "Wiki Seed from Turns",
169
+ "Seed topic model from raw_transcript when chunks thin",
170
+ true,
171
+ ),
172
+ boolDirect(
173
+ "MEGACOMPACT_TURNS_DB",
174
+ "Turns DB",
175
+ "Isolated turns.db store",
176
+ true,
177
+ ),
178
+ num(
179
+ "MEGACOMPACT_WIKI_SILHOUETTE_MIN",
180
+ "Silhouette Minimum",
181
+ "Full rebuild trigger threshold",
182
+ 0.2,
183
+ 0,
184
+ 1,
185
+ ),
186
+ num(
187
+ "MEGACOMPACT_TURNS_RETENTION_DAYS",
188
+ "Turn Retention",
189
+ "Per-turn provenance retention window",
190
+ 30,
191
+ 1,
192
+ 365,
193
+ "days",
194
+ ),
195
+ num(
196
+ "MEGACOMPACT_TURNS_KEEP_MIN",
197
+ "Turns Keep Minimum",
198
+ "Min turns kept per conversation during prune",
199
+ 5,
200
+ 1,
201
+ 100,
202
+ ),
203
+ num(
204
+ "MEGACOMPACT_WIKI_LABEL_TOP_TERMS",
205
+ "Wiki Label Terms",
206
+ "How many TF-IDF terms form a topic label",
207
+ 5,
208
+ 1,
209
+ 20,
210
+ ),
211
+ num(
212
+ "MEGACOMPACT_WIKI_REBUILD_EVERY",
213
+ "Wiki Rebuild Every",
214
+ "Rebuild topic model every Nth compaction",
215
+ 3,
216
+ 1,
217
+ 50,
218
+ ),
219
+ ],
220
+ },
221
+ {
222
+ name: "Dedup Tiers",
223
+ settings: [
224
+ boolDirect("MEGACOMPACT_L0_ENABLED", "L0 Exact Match", "Exact-hash dedup tier", true),
225
+ boolDirect("MEGACOMPACT_L1_ENABLED", "L1 MinHash/LSH", "Near-dup tier", true),
226
+ boolDirect("MEGACOMPACT_L2_ENABLED", "L2 Semantic", "Cosine similarity dedup tier", true),
227
+ boolDirect("MEGACOMPACT_RAPTOR_ENABLED", "RAPTOR", "Hierarchical clustering tier", true),
228
+ boolDirect("MEGACOMPACT_RAPTOR_MULTILEVEL", "RAPTOR Multi-level", "Multi-level retrieval (score all tree levels)", true),
229
+ boolDirect("MEGACOMPACT_RAPTOR_LEAF_EXPANSION", "RAPTOR Leaf Expansion", "Leaf node expansion in retrieval", true),
230
+ boolDirect("MEGACOMPACT_RAPTOR_INCREMENTAL", "RAPTOR Incremental", "Incremental rebuild mode", true),
231
+ boolDirect("MEGACOMPACT_RAPTOR_INJECT_SUMMARIES", "RAPTOR Inject Summaries", "Inject top-level summary nodes into recall", true),
232
+ boolDirect("MEGACOMPACT_MARK_ONLY_L0", "Mark Only L0", "L0 runs but does not collapse", false),
233
+ boolDirect("MEGACOMPACT_MARK_ONLY_L1", "Mark Only L1", "L1 runs but does not collapse", false),
234
+ boolDirect("MEGACOMPACT_MARK_ONLY_L2", "Mark Only L2", "L2 runs but does not collapse", false),
235
+ boolDirect("MEGACOMPACT_MINILM", "MiniLM Embedder", "Use MiniLM instead of trigram", false),
236
+ ],
237
+ },
238
+ {
239
+ name: "Dedup Thresholds",
240
+ settings: [
241
+ num("MEGACOMPACT_L2_THRESHOLD", "L2 Cosine Threshold", "L2 semantic dedup firing point", 0.85, 0, 1),
242
+ num("MEGACOMPACT_L1_JACCARD", "L1 Jaccard Threshold", "L1 MinHash near-dup threshold", 0.8, 0, 1),
243
+ num("MEGACOMPACT_DEDUP_SIM", "Dedup Similarity", "Legacy content-similarity fallback", 0.9, 0, 1),
244
+ num("MEGACOMPACT_MMR_LAMBDA", "MMR Lambda", "Maximal Marginal Relevance diversity", 0.5, 0, 1),
245
+ num("MEGACOMPACT_SEMDEDUP_COSINE", "SemDeDup Cosine", "Offline SemDeDup pair threshold", 0.95, 0, 1),
246
+ num("MEGACOMPACT_CONSOLIDATE_COSINE", "Consolidate Cosine", "Memory consolidation merge threshold", 0.7, 0, 1),
247
+ num("MEGACOMPACT_SIMILARITY_BUDGET_MS", "Similarity Budget", "Time budget for similarity computation", 50, 1, 10000, "ms"),
248
+ num("MEGACOMPACT_L1_VERIFY_BUDGET_MS", "L1 Verify Budget", "L1 verification time budget", 20, 1, 10000, "ms"),
249
+ num("MEGACOMPACT_L1_CANDIDATE_CAP", "L1 Candidate Cap", "L1 candidate cap", 100, 1, 10000),
250
+ ],
251
+ },
252
+ {
253
+ name: "RAPTOR Tuning",
254
+ settings: [
255
+ num("MEGACOMPACT_RAPTOR_BUDGET_MS", "RAPTOR Budget", "RAPTOR time budget", 5000, 100, 60000, "ms"),
256
+ num("MEGACOMPACT_RAPTOR_CLUSTERS", "RAPTOR Clusters", "Clusters per level", 5, 1, 50),
257
+ num("MEGACOMPACT_RAPTOR_CONSISTENCY", "RAPTOR Consistency", "Consistency threshold", 0.6, 0, 1),
258
+ num("MEGACOMPACT_RAPTOR_MAX_LEAF_EXP", "RAPTOR Max Leaf Expansion", "Max leaf expansion nodes", 10, 1, 100),
259
+ num("MEGACOMPACT_RAPTOR_FRESHNESS_HOURS", "RAPTOR Freshness", "Skip rebuild when tree is fresh", 4, 1, 168, "hours"),
260
+ num("MEGACOMPACT_FP_RATE_L0", "FP Rate L0", "FP alert threshold for exact tier", 0.01, 0, 1),
261
+ num("MEGACOMPACT_FP_RATE_L1L2", "FP Rate L1/L2", "FP alert threshold for fuzzy tiers", 0.05, 0, 1),
262
+ num("MEGACOMPACT_ALERT_WINDOW_MS", "Alert Window", "Alert evaluation window", 600000, 1000, 3600000, "ms"),
263
+ num("MEGACOMPACT_P95_BUDGET_MS", "P95 Budget", "Canary p95 budget per tier", 100, 1, 10000, "ms"),
264
+ ],
265
+ },
266
+ {
267
+ name: "Models",
268
+ settings: [
269
+ str("MEGACOMPACT_HYDE_MODEL", "HyDE Model", "LLM model name for HyDE generation", "llama3.2"),
270
+ str("MEGACOMPACT_RAPTOR_MODEL", "RAPTOR Summary Model", "Ollama model for cluster summarization (empty = extractive)", ""),
271
+ str("MEGACOMPACT_RAPTOR_URL", "RAPTOR Ollama URL", "Ollama endpoint for RAPTOR summarization", "http://127.0.0.1:11434"),
272
+ num("MEGACOMPACT_EMBED_CACHE", "Embed Cache Size", "Embedding cache entries (0 = disabled)", 256, 0, 10000),
273
+ ],
274
+ },
275
+ ];
276
+
277
+ /** Flat index of every setting by key for O(1) lookup + validation. */
278
+ export const SETTING_BY_KEY: ReadonlyMap<string, SettingSpec> = new Map(
279
+ SETTINGS.flatMap((c) => c.settings).map((s) => [s.key, s]),
280
+ );
281
+
282
+ /**
283
+ * Adjustable MEGACOMPACT_* env vars intentionally NOT surfaced in the settings
284
+ * UI. Handled by other panels, install-time paths, dev-only, internal tuning,
285
+ * or special string formats the generic form cannot represent.
286
+ * Kept as string literals so regression_check.py's coverage scan sees them.
287
+ */
288
+ export const EXCLUDED_SETTINGS: readonly string[] = [
289
+ // Embedder telemetry — handled by EmbedderSetup.
290
+ "MEGACOMPACT_EMBEDDING_URL",
291
+ "MEGACOMPACT_EMBEDDING_KEY",
292
+ "MEGACOMPACT_EMBEDDING_HEADERS",
293
+ "MEGACOMPACT_EMBEDDING_DIM",
294
+ "MEGACOMPACT_OLLAMA_MODEL",
295
+ "MEGACOMPACT_ALLOW_REMOTE_EMBEDDER",
296
+ // Install-time paths.
297
+ "MEGACOMPACT_STATE_DIR",
298
+ "MEGACOMPACT_INDEX_DIR",
299
+ "MEGACOMPACT_VECTOR_INDEX_DIR",
300
+ "MEGACOMPACT_TURNS_DB_PATH",
301
+ // Dev-only.
302
+ "MEGACOMPACT_EXT_SCAN_DIR",
303
+ "MEGACOMPACT_EXT_USER_DIR",
304
+ // PGlite internal tuning.
305
+ "MEGACOMPACT_PGLITE_DISABLED",
306
+ "MEGACOMPACT_PGLITE_OPEN_TIMEOUT_MS",
307
+ "MEGACOMPACT_PGLITE_CLOSE_TIMEOUT_MS",
308
+ "MEGACOMPACT_PGLITE_QUERY_TIMEOUT_MS",
309
+ // Special string formats the generic form cannot represent.
310
+ "MEGACOMPACT_WIKI_K_RANGE",
311
+ "MEGACOMPACT_RAPTOR_LEVEL_WEIGHTS",
312
+ // Internal calibration, not user-facing.
313
+ "MEGACOMPACT_FTS5_MAX_BM25",
314
+ ];