pi-mega-compact 0.11.4 → 0.11.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (381) hide show
  1. package/dist/extensions/dashboard-server/api-contracts/cache-stripes.js +8 -0
  2. package/dist/extensions/dashboard-server/api-contracts/endpoints.js +32 -0
  3. package/dist/extensions/dashboard-server/api-contracts/memory-map.js +1 -0
  4. package/dist/extensions/dashboard-server/api-contracts/memory.js +8 -0
  5. package/dist/extensions/dashboard-server/api-contracts/provider-cache.js +1 -0
  6. package/dist/extensions/dashboard-server/api-contracts/setup.js +10 -0
  7. package/dist/extensions/dashboard-server/index-reader.js +6 -2
  8. package/dist/extensions/dashboard-server/routes-cache.js +135 -47
  9. package/dist/extensions/dashboard-server/routes-game.js +3 -0
  10. package/dist/extensions/dashboard-server/routes-memory-map.js +50 -0
  11. package/dist/extensions/dashboard-server/routes-memory.js +51 -0
  12. package/dist/extensions/dashboard-server/routes-repo.js +2 -2
  13. package/dist/extensions/dashboard-server/routes-setup.js +267 -0
  14. package/dist/extensions/dashboard-server/routes.js +4 -0
  15. package/dist/extensions/dashboard-server/server.js +13 -1
  16. package/dist/extensions/mega-commands.js +189 -1
  17. package/dist/extensions/mega-compact.js +5 -0
  18. package/dist/extensions/mega-config.js +7 -0
  19. package/dist/extensions/mega-events/agent-handlers.js +19 -4
  20. package/dist/extensions/mega-events/compact-handlers.js +1 -0
  21. package/dist/extensions/mega-events/context-handler.js +45 -92
  22. package/dist/extensions/mega-events/context-hwm.js +51 -0
  23. package/dist/extensions/mega-events/error-classifier.js +16 -5
  24. package/dist/extensions/mega-events/mirror-append.js +107 -0
  25. package/dist/extensions/mega-events/outage-advisor.js +7 -1
  26. package/dist/extensions/mega-events/perf-handler.js +134 -2
  27. package/dist/extensions/mega-events/recall-tail.js +59 -0
  28. package/dist/extensions/mega-events/separated-prompt.js +248 -0
  29. package/dist/extensions/mega-events/session-handlers.js +15 -8
  30. package/dist/extensions/mega-runtime/env-loader.js +56 -0
  31. package/dist/extensions/mega-runtime/reset-runtime.js +6 -0
  32. package/dist/extensions/mega-runtime/runtime-snapshot.js +1 -0
  33. package/dist/extensions/mega-runtime/runtime.js +7 -0
  34. package/dist/extensions/mega-runtime/snapshot.js +1 -0
  35. package/dist/extensions/mega-runtime/widget.js +5 -0
  36. package/dist/src/cache-stripe-impl.js +288 -0
  37. package/dist/src/cache-stripe.js +11 -0
  38. package/dist/src/config/stopwords.js +24 -0
  39. package/dist/src/config.js +17 -0
  40. package/dist/src/embedder.js +41 -2
  41. package/dist/src/memoryGraph.js +299 -0
  42. package/dist/src/memoryStats.js +75 -0
  43. package/dist/src/monitoring.js +13 -0
  44. package/dist/src/prefix-break.js +43 -0
  45. package/dist/src/pricing.js +1 -1
  46. package/dist/src/queryExpansion.js +163 -0
  47. package/dist/src/queryReformulation/cache.js +123 -0
  48. package/dist/src/queryReformulation/rrf.js +29 -0
  49. package/dist/src/queryReformulation/tfidf.js +61 -0
  50. package/dist/src/queryReformulation/vagueness.js +33 -0
  51. package/dist/src/queryReformulation.js +225 -0
  52. package/dist/src/recallMetrics.js +258 -0
  53. package/dist/src/store/sqlite/cache-stripes.js +133 -0
  54. package/dist/src/store/sqlite/fts5-search.js +68 -0
  55. package/dist/src/store/sqlite/perf-samples.js +145 -16
  56. package/dist/src/store/sqlite/schema.js +60 -1
  57. package/dist/src/store/sqlite.js +1 -0
  58. package/dist/src/store/turns/memory-store.js +8 -0
  59. package/dist/src/store/turns/sqlite-store.js +14 -3
  60. package/dist/src/store/turns/types.js +18 -1
  61. package/dist/src/store/vectorIndex.js +55 -10
  62. package/dist/src/tiered-router/types.js +18 -0
  63. package/dist/src/tieredRouter.js +421 -0
  64. package/dist/src/vectorStore.js +8 -6
  65. package/extensions/dashboard-client/dist/assets/{AchievementTiles-vEo2MtE2.js → AchievementTiles-DR9cLGDL.js} +2 -2
  66. package/extensions/dashboard-client/dist/assets/{AchievementTiles-vEo2MtE2.js.map → AchievementTiles-DR9cLGDL.js.map} +1 -1
  67. package/extensions/dashboard-client/dist/assets/AchievementsTab-svNUgJ1e.js +2 -0
  68. package/extensions/dashboard-client/dist/assets/{AchievementsTab-DjxfYrDc.js.map → AchievementsTab-svNUgJ1e.js.map} +1 -1
  69. package/extensions/dashboard-client/dist/assets/CacheTab-ASwhOMjR.js +2 -0
  70. package/extensions/dashboard-client/dist/assets/CacheTab-ASwhOMjR.js.map +1 -0
  71. package/extensions/dashboard-client/dist/assets/{ConfigTab-Cm6ymbmx.js → ConfigTab-CmmWheuW.js} +2 -2
  72. package/extensions/dashboard-client/dist/assets/{ConfigTab-Cm6ymbmx.js.map → ConfigTab-CmmWheuW.js.map} +1 -1
  73. package/extensions/dashboard-client/dist/assets/{EventsTab-DXWl_YzI.js → EventsTab-CFE7jLsa.js} +2 -2
  74. package/extensions/dashboard-client/dist/assets/{EventsTab-DXWl_YzI.js.map → EventsTab-CFE7jLsa.js.map} +1 -1
  75. package/extensions/dashboard-client/dist/assets/GameTab-CJAX_th_.js +2 -0
  76. package/extensions/dashboard-client/dist/assets/{GameTab-BLDudcO5.js.map → GameTab-CJAX_th_.js.map} +1 -1
  77. package/extensions/dashboard-client/dist/assets/{MaintenanceTab-DLkKCztn.js → MaintenanceTab-P4SUsvMf.js} +2 -2
  78. package/extensions/dashboard-client/dist/assets/{MaintenanceTab-DLkKCztn.js.map → MaintenanceTab-P4SUsvMf.js.map} +1 -1
  79. package/extensions/dashboard-client/dist/assets/MemoryMapTab-BBiH76eF.js +2 -0
  80. package/extensions/dashboard-client/dist/assets/MemoryMapTab-BBiH76eF.js.map +1 -0
  81. package/extensions/dashboard-client/dist/assets/{MetricsTab-Cq4u-rZF.js → MetricsTab-CHQscixy.js} +2 -2
  82. package/extensions/dashboard-client/dist/assets/{MetricsTab-Cq4u-rZF.js.map → MetricsTab-CHQscixy.js.map} +1 -1
  83. package/extensions/dashboard-client/dist/assets/OverviewTab-DBs4DJdd.js +2 -0
  84. package/extensions/dashboard-client/dist/assets/{OverviewTab-D4kGvsiQ.js.map → OverviewTab-DBs4DJdd.js.map} +1 -1
  85. package/extensions/dashboard-client/dist/assets/ReposTab-DeFz76L5.js +2 -0
  86. package/extensions/dashboard-client/dist/assets/ReposTab-DeFz76L5.js.map +1 -0
  87. package/extensions/dashboard-client/dist/assets/{SessionsTab-DZC2-GCn.js → SessionsTab-BWNsj1OB.js} +2 -2
  88. package/extensions/dashboard-client/dist/assets/{SessionsTab-DZC2-GCn.js.map → SessionsTab-BWNsj1OB.js.map} +1 -1
  89. package/extensions/dashboard-client/dist/assets/SetupTab-uS6A0xmw.js +2 -0
  90. package/extensions/dashboard-client/dist/assets/SetupTab-uS6A0xmw.js.map +1 -0
  91. package/extensions/dashboard-client/dist/assets/TimeSavedCard-CiqCOQuL.js +2 -0
  92. package/extensions/dashboard-client/dist/assets/TimeSavedCard-CiqCOQuL.js.map +1 -0
  93. package/extensions/dashboard-client/dist/assets/{TopicsTab-01G71hv1.js → TopicsTab-BWWQxltv.js} +2 -2
  94. package/extensions/dashboard-client/dist/assets/{TopicsTab-01G71hv1.js.map → TopicsTab-BWWQxltv.js.map} +1 -1
  95. package/extensions/dashboard-client/dist/assets/{TurnsTab-DLRg0LZT.js → TurnsTab-CVz4f4-o.js} +2 -2
  96. package/extensions/dashboard-client/dist/assets/{TurnsTab-DLRg0LZT.js.map → TurnsTab-CVz4f4-o.js.map} +1 -1
  97. package/extensions/dashboard-client/dist/assets/format-COjDIVGj.js +2 -0
  98. package/extensions/dashboard-client/dist/assets/format-COjDIVGj.js.map +1 -0
  99. package/extensions/dashboard-client/dist/assets/index-CUNn22iV.css +1 -0
  100. package/extensions/dashboard-client/dist/assets/index-DrktNOoT.js +42 -0
  101. package/extensions/dashboard-client/dist/assets/index-DrktNOoT.js.map +1 -0
  102. package/extensions/dashboard-client/dist/assets/pricing-CvE4NllQ.js +2 -0
  103. package/extensions/dashboard-client/dist/assets/pricing-CvE4NllQ.js.map +1 -0
  104. package/extensions/dashboard-client/dist/assets/{useSSE-BBYt5UPB.js → useSSE-Bf5LOLSi.js} +2 -2
  105. package/extensions/dashboard-client/dist/assets/{useSSE-BBYt5UPB.js.map → useSSE-Bf5LOLSi.js.map} +1 -1
  106. package/extensions/dashboard-client/dist/index.html +2 -2
  107. package/extensions/dashboard-client/src/App.tsx +28 -8
  108. package/extensions/dashboard-client/src/api/client.ts +29 -0
  109. package/extensions/dashboard-client/src/components/ActiveReposTable.tsx +21 -12
  110. package/extensions/dashboard-client/src/components/CacheHitRateTrendCard.tsx +100 -0
  111. package/extensions/dashboard-client/src/components/ProviderCacheCard.tsx +56 -0
  112. package/extensions/dashboard-client/src/components/SavingsByModelTable.tsx +38 -57
  113. package/extensions/dashboard-client/src/components/StripeDistributionCard.tsx +110 -0
  114. package/extensions/dashboard-client/src/components/TabBar.tsx +49 -4
  115. package/extensions/dashboard-client/src/main.tsx +1 -0
  116. package/extensions/dashboard-client/src/styles/base.css +30 -0
  117. package/extensions/dashboard-client/src/styles/cache.css +167 -0
  118. package/extensions/dashboard-client/src/tabs/CacheTab.tsx +75 -12
  119. package/extensions/dashboard-client/src/tabs/MemoryMapTab.tsx +440 -0
  120. package/extensions/dashboard-client/src/tabs/SetupTab.tsx +418 -0
  121. package/extensions/dashboard-client/tsconfig.json +3 -2
  122. package/extensions/dashboard-client/vite.config.ts +2 -0
  123. package/extensions/dashboard-server/api-contracts/cache-stripes.ts +49 -0
  124. package/extensions/dashboard-server/api-contracts/endpoints.ts +66 -3
  125. package/extensions/dashboard-server/api-contracts/index.ts +22 -0
  126. package/extensions/dashboard-server/api-contracts/memory-map.ts +50 -0
  127. package/extensions/dashboard-server/api-contracts/memory.ts +27 -0
  128. package/extensions/dashboard-server/api-contracts/multi-repo.ts +231 -231
  129. package/extensions/dashboard-server/api-contracts/provider-cache.ts +37 -0
  130. package/extensions/dashboard-server/api-contracts/setup.ts +80 -0
  131. package/extensions/dashboard-server/index-reader.ts +138 -121
  132. package/extensions/dashboard-server/routes-cache.ts +186 -75
  133. package/extensions/dashboard-server/routes-game.ts +3 -0
  134. package/extensions/dashboard-server/routes-memory-map.ts +105 -0
  135. package/extensions/dashboard-server/routes-memory.ts +63 -0
  136. package/extensions/dashboard-server/routes-repo.ts +36 -36
  137. package/extensions/dashboard-server/routes-setup.ts +293 -0
  138. package/extensions/dashboard-server/routes.ts +4 -0
  139. package/extensions/dashboard-server/server.ts +12 -0
  140. package/extensions/mega-commands.ts +211 -1
  141. package/extensions/mega-compact.ts +5 -0
  142. package/extensions/mega-config.ts +27 -0
  143. package/extensions/mega-events/agent-handlers.ts +20 -4
  144. package/extensions/mega-events/compact-handlers.ts +1 -0
  145. package/extensions/mega-events/context-handler.ts +53 -110
  146. package/extensions/mega-events/context-hwm.ts +85 -0
  147. package/extensions/mega-events/error-classifier.ts +15 -4
  148. package/extensions/mega-events/mirror-append.ts +155 -0
  149. package/extensions/mega-events/outage-advisor.ts +11 -5
  150. package/extensions/mega-events/perf-handler.ts +190 -6
  151. package/extensions/mega-events/recall-tail.ts +88 -0
  152. package/extensions/mega-events/separated-prompt.ts +329 -0
  153. package/extensions/mega-events/session-handlers.ts +14 -7
  154. package/extensions/mega-runtime/env-loader.ts +55 -0
  155. package/extensions/mega-runtime/helpers.ts +14 -0
  156. package/extensions/mega-runtime/reset-runtime.ts +6 -0
  157. package/extensions/mega-runtime/runtime-snapshot.ts +1 -0
  158. package/extensions/mega-runtime/runtime.ts +7 -0
  159. package/extensions/mega-runtime/snapshot.ts +6 -0
  160. package/extensions/mega-runtime/widget-types.ts +3 -0
  161. package/extensions/mega-runtime/widget.ts +5 -0
  162. package/package.json +5 -2
  163. package/src/cache-stripe-impl.ts +385 -0
  164. package/src/cache-stripe.ts +18 -0
  165. package/src/config/stopwords.ts +25 -0
  166. package/src/config.ts +26 -0
  167. package/src/embedder.ts +42 -2
  168. package/src/memoryGraph.ts +438 -0
  169. package/src/memoryStats.ts +107 -0
  170. package/src/monitoring.ts +35 -0
  171. package/src/prefix-break.ts +83 -0
  172. package/src/pricing.ts +2 -2
  173. package/src/queryExpansion.ts +206 -0
  174. package/src/queryReformulation/cache.ts +169 -0
  175. package/src/queryReformulation/rrf.ts +51 -0
  176. package/src/queryReformulation/tfidf.ts +79 -0
  177. package/src/queryReformulation/vagueness.ts +38 -0
  178. package/src/queryReformulation.ts +355 -0
  179. package/src/recallMetrics.ts +388 -0
  180. package/src/store/sqlite/cache-stripes.ts +196 -0
  181. package/src/store/sqlite/fts5-search.ts +90 -0
  182. package/src/store/sqlite/perf-samples.ts +218 -23
  183. package/src/store/sqlite/schema.ts +60 -1
  184. package/src/store/sqlite.ts +1 -0
  185. package/src/store/turns/memory-store.ts +10 -1
  186. package/src/store/turns/sqlite-store.ts +27 -15
  187. package/src/store/turns/types.ts +21 -0
  188. package/src/store/vectorIndex.ts +71 -11
  189. package/src/tiered-router/types.ts +64 -0
  190. package/src/tieredRouter.ts +489 -0
  191. package/src/vectorStore.ts +9 -5
  192. package/dist/extensions/conflict-scan.test.js +0 -115
  193. package/dist/extensions/dashboard-server/api-contracts.test.js +0 -884
  194. package/dist/extensions/dashboard-server/html.test.js +0 -52
  195. package/dist/extensions/dashboard-server/perf-server.test.js +0 -80
  196. package/dist/extensions/dashboard-server/routes-cache.test.js +0 -248
  197. package/dist/extensions/dashboard-server/server.test.js +0 -120
  198. package/dist/extensions/dashboard-server-s32.test.js +0 -181
  199. package/dist/extensions/dashboard-server.test.js +0 -339
  200. package/dist/extensions/mega-cache-replay.test.js +0 -400
  201. package/dist/extensions/mega-compact-s38.test.js +0 -1383
  202. package/dist/extensions/mega-compact.test.js +0 -1112
  203. package/dist/extensions/mega-events.test.js +0 -47
  204. package/dist/extensions/mega-game-cmds.test.js +0 -163
  205. package/dist/extensions/mega-runtime/snapshot.test.js +0 -127
  206. package/dist/extensions/mega-runtime/state.test.js +0 -266
  207. package/dist/extensions/mega-runtime/widget.test.js +0 -343
  208. package/dist/extensions/mega-shutdown-widget.test.js +0 -121
  209. package/dist/extensions/mega-teamrun.test.js +0 -156
  210. package/dist/extensions/mega-trim.test.js +0 -58
  211. package/dist/extensions/mega-turn-store.test.js +0 -68
  212. package/dist/src/boundary.test.js +0 -170
  213. package/dist/src/compact.test.js +0 -78
  214. package/dist/src/config/themes.test.js +0 -94
  215. package/dist/src/dedup/dedup.test.js +0 -41
  216. package/dist/src/dedup/l1.test.js +0 -50
  217. package/dist/src/dedup/raptor/buildHistory.test.js +0 -292
  218. package/dist/src/dedup/raptor/multilevel-serve.test.js +0 -229
  219. package/dist/src/dedup/raptor/multilevel.test.js +0 -238
  220. package/dist/src/dedup/raptor/promote.test.js +0 -69
  221. package/dist/src/dedup/raptor/raptor.test.js +0 -248
  222. package/dist/src/dedup/raptor/retrieval.test.js +0 -95
  223. package/dist/src/dedup/raptor/serve-gate.test.js +0 -298
  224. package/dist/src/dedup/sprint12.test.js +0 -219
  225. package/dist/src/dedup-engine.test.js +0 -472
  226. package/dist/src/driftDetection.test.js +0 -87
  227. package/dist/src/e2e.test.js +0 -698
  228. package/dist/src/engine.test.js +0 -111
  229. package/dist/src/extractive.test.js +0 -147
  230. package/dist/src/fork.test.js +0 -81
  231. package/dist/src/game/scoring.test.js +0 -98
  232. package/dist/src/httpEmbedder.test.js +0 -277
  233. package/dist/src/importance.test.js +0 -372
  234. package/dist/src/intent.test.js +0 -78
  235. package/dist/src/log.test.js +0 -42
  236. package/dist/src/mechanical-fix.test.js +0 -65
  237. package/dist/src/memory.test.js +0 -70
  238. package/dist/src/memoryConsolidate.test.js +0 -38
  239. package/dist/src/memoryOps.test.js +0 -129
  240. package/dist/src/memoryRecall.test.js +0 -171
  241. package/dist/src/memoryRoundtrip.test.js +0 -137
  242. package/dist/src/metrics/turns.test.js +0 -152
  243. package/dist/src/mirror/mirror.test.js +0 -185
  244. package/dist/src/raptor-inject-summaries.test.js +0 -162
  245. package/dist/src/ratio.bench.test.js +0 -897
  246. package/dist/src/recall.integration.test.js +0 -77
  247. package/dist/src/recall.test.js +0 -379
  248. package/dist/src/sprint14.test.js +0 -219
  249. package/dist/src/sprint4x-rag-verification.test.js +0 -93
  250. package/dist/src/store/compression.test.js +0 -139
  251. package/dist/src/store/memoryIndex.test.js +0 -51
  252. package/dist/src/store/migrate.test.js +0 -139
  253. package/dist/src/store/pgOpenGuard.test.js +0 -74
  254. package/dist/src/store/phase01.test.js +0 -81
  255. package/dist/src/store/phase04.test.js +0 -54
  256. package/dist/src/store/sprint10.test.js +0 -186
  257. package/dist/src/store/sqlite/game-achievements.test.js +0 -67
  258. package/dist/src/store/sqlite/game-scores.test.js +0 -106
  259. package/dist/src/store/sqlite/game-state.test.js +0 -76
  260. package/dist/src/store/sqlite/global-index.test.js +0 -136
  261. package/dist/src/store/sqlite/mechanical-fix.test.js +0 -146
  262. package/dist/src/store/sqlite/perf-samples.test.js +0 -146
  263. package/dist/src/store/sqlite/raptor.test.js +0 -106
  264. package/dist/src/store/sqlite/turns.test.js +0 -183
  265. package/dist/src/store/sqlite.cachehit.test.js +0 -55
  266. package/dist/src/store/sqlite.dbmaint.test.js +0 -158
  267. package/dist/src/store/sqlite.dbmirror.test.js +0 -184
  268. package/dist/src/store/turns/contract-compliance.test.js +0 -428
  269. package/dist/src/store/turns/memory-store.test.js +0 -9
  270. package/dist/src/store/turns/migrations.test.js +0 -138
  271. package/dist/src/store/turns/sqlite-store.test.js +0 -144
  272. package/dist/src/store/vectorIndex.test.js +0 -123
  273. package/dist/src/store.test.js +0 -161
  274. package/dist/src/supersede.test.js +0 -36
  275. package/dist/src/topics/cluster.test.js +0 -150
  276. package/dist/src/topics/store.test.js +0 -117
  277. package/dist/src/types.test.js +0 -9
  278. package/dist/src/vector-search-cache.test.js +0 -157
  279. package/dist/src/vectorStore.test.js +0 -479
  280. package/dist/src/wiki.test.js +0 -171
  281. package/extensions/conflict-scan.test.ts +0 -129
  282. package/extensions/dashboard-client/dist/assets/AchievementsTab-DjxfYrDc.js +0 -2
  283. package/extensions/dashboard-client/dist/assets/CacheTab-Dnpv94wq.js +0 -2
  284. package/extensions/dashboard-client/dist/assets/CacheTab-Dnpv94wq.js.map +0 -1
  285. package/extensions/dashboard-client/dist/assets/GameTab-BLDudcO5.js +0 -2
  286. package/extensions/dashboard-client/dist/assets/OverviewTab-D4kGvsiQ.js +0 -2
  287. package/extensions/dashboard-client/dist/assets/ReposTab-C0Wnrf2u.js +0 -2
  288. package/extensions/dashboard-client/dist/assets/ReposTab-C0Wnrf2u.js.map +0 -1
  289. package/extensions/dashboard-client/dist/assets/TimeSavedCard-UqljSyP-.js +0 -2
  290. package/extensions/dashboard-client/dist/assets/TimeSavedCard-UqljSyP-.js.map +0 -1
  291. package/extensions/dashboard-client/dist/assets/index-BEdKlpAB.css +0 -1
  292. package/extensions/dashboard-client/dist/assets/index-BX0bcgLu.js +0 -42
  293. package/extensions/dashboard-client/dist/assets/index-BX0bcgLu.js.map +0 -1
  294. package/extensions/dashboard-server/api-contracts.test.ts +0 -1065
  295. package/extensions/dashboard-server/html.test.ts +0 -62
  296. package/extensions/dashboard-server/perf-server.test.ts +0 -101
  297. package/extensions/dashboard-server/routes-cache.test.ts +0 -302
  298. package/extensions/dashboard-server/server.test.ts +0 -131
  299. package/extensions/dashboard-server-s32.test.ts +0 -195
  300. package/extensions/dashboard-server.test.ts +0 -382
  301. package/extensions/mega-cache-replay.test.ts +0 -526
  302. package/extensions/mega-compact-s38.test.ts +0 -1433
  303. package/extensions/mega-compact.test.ts +0 -1509
  304. package/extensions/mega-events.test.ts +0 -55
  305. package/extensions/mega-game-cmds.test.ts +0 -197
  306. package/extensions/mega-runtime/snapshot.test.ts +0 -139
  307. package/extensions/mega-runtime/state.test.ts +0 -262
  308. package/extensions/mega-runtime/widget.test.ts +0 -468
  309. package/extensions/mega-shutdown-widget.test.ts +0 -141
  310. package/extensions/mega-teamrun.test.ts +0 -176
  311. package/extensions/mega-trim.test.ts +0 -64
  312. package/extensions/mega-turn-store.test.ts +0 -108
  313. package/src/boundary.test.ts +0 -187
  314. package/src/compact.test.ts +0 -99
  315. package/src/config/themes.test.ts +0 -116
  316. package/src/dedup/dedup.test.ts +0 -46
  317. package/src/dedup/l1.test.ts +0 -57
  318. package/src/dedup/raptor/buildHistory.test.ts +0 -353
  319. package/src/dedup/raptor/multilevel-serve.test.ts +0 -273
  320. package/src/dedup/raptor/multilevel.test.ts +0 -325
  321. package/src/dedup/raptor/promote.test.ts +0 -82
  322. package/src/dedup/raptor/raptor.test.ts +0 -297
  323. package/src/dedup/raptor/retrieval.test.ts +0 -118
  324. package/src/dedup/raptor/serve-gate.test.ts +0 -348
  325. package/src/dedup/sprint12.test.ts +0 -242
  326. package/src/dedup-engine.test.ts +0 -670
  327. package/src/driftDetection.test.ts +0 -100
  328. package/src/e2e.test.ts +0 -843
  329. package/src/engine.test.ts +0 -123
  330. package/src/extractive.test.ts +0 -174
  331. package/src/fork.test.ts +0 -94
  332. package/src/game/scoring.test.ts +0 -103
  333. package/src/httpEmbedder.test.ts +0 -286
  334. package/src/importance.test.ts +0 -538
  335. package/src/intent.test.ts +0 -87
  336. package/src/log.test.ts +0 -47
  337. package/src/mechanical-fix.test.ts +0 -70
  338. package/src/memory.test.ts +0 -92
  339. package/src/memoryConsolidate.test.ts +0 -47
  340. package/src/memoryOps.test.ts +0 -148
  341. package/src/memoryRecall.test.ts +0 -194
  342. package/src/memoryRoundtrip.test.ts +0 -155
  343. package/src/metrics/turns.test.ts +0 -165
  344. package/src/mirror/mirror.test.ts +0 -240
  345. package/src/raptor-inject-summaries.test.ts +0 -228
  346. package/src/ratio.bench.test.ts +0 -1316
  347. package/src/recall.integration.test.ts +0 -96
  348. package/src/recall.test.ts +0 -467
  349. package/src/sprint14.test.ts +0 -245
  350. package/src/sprint4x-rag-verification.test.ts +0 -119
  351. package/src/store/compression.test.ts +0 -168
  352. package/src/store/memoryIndex.test.ts +0 -61
  353. package/src/store/migrate.test.ts +0 -158
  354. package/src/store/pgOpenGuard.test.ts +0 -89
  355. package/src/store/phase01.test.ts +0 -88
  356. package/src/store/phase04.test.ts +0 -58
  357. package/src/store/sprint10.test.ts +0 -214
  358. package/src/store/sqlite/game-achievements.test.ts +0 -80
  359. package/src/store/sqlite/game-scores.test.ts +0 -132
  360. package/src/store/sqlite/game-state.test.ts +0 -89
  361. package/src/store/sqlite/global-index.test.ts +0 -222
  362. package/src/store/sqlite/mechanical-fix.test.ts +0 -162
  363. package/src/store/sqlite/perf-samples.test.ts +0 -169
  364. package/src/store/sqlite/raptor.test.ts +0 -139
  365. package/src/store/sqlite/turns.test.ts +0 -218
  366. package/src/store/sqlite.cachehit.test.ts +0 -68
  367. package/src/store/sqlite.dbmaint.test.ts +0 -193
  368. package/src/store/sqlite.dbmirror.test.ts +0 -229
  369. package/src/store/turns/contract-compliance.test.ts +0 -562
  370. package/src/store/turns/memory-store.test.ts +0 -15
  371. package/src/store/turns/migrations.test.ts +0 -161
  372. package/src/store/turns/sqlite-store.test.ts +0 -161
  373. package/src/store/vectorIndex.test.ts +0 -140
  374. package/src/store.test.ts +0 -191
  375. package/src/supersede.test.ts +0 -42
  376. package/src/topics/cluster.test.ts +0 -176
  377. package/src/topics/store.test.ts +0 -132
  378. package/src/types.test.ts +0 -10
  379. package/src/vector-search-cache.test.ts +0 -190
  380. package/src/vectorStore.test.ts +0 -533
  381. package/src/wiki.test.ts +0 -217
@@ -0,0 +1,418 @@
1
+ /**
2
+ * dashboard-client/src/tabs/SetupTab.tsx — Setup wizard tab (P0b).
3
+ *
4
+ * Shows current embedder configuration, warns about trigram recall quality,
5
+ * and mirrors the /megasetup command with detection results.
6
+ *
7
+ * PREVENT-PI-004: all data comes from localhost dashboard API endpoints —
8
+ * no external network calls.
9
+ */
10
+
11
+ import type React from "react";
12
+ import { useState, useEffect, useCallback } from "react";
13
+ import type { SetupStatusResponse, SetupDetectResponse, SetupConfigureResponse } from "@contracts";
14
+ import { fetchSetupStatus, fetchSetupDetect, configureEmbedder } from "../api/client";
15
+
16
+ // ---------------------------------------------------------------------------
17
+ // Style constants
18
+ // ---------------------------------------------------------------------------
19
+
20
+ const styles: Record<string, React.CSSProperties> = {
21
+ container: {
22
+ padding: "1rem",
23
+ maxWidth: "720px",
24
+ margin: "0 auto",
25
+ fontFamily: "system-ui, sans-serif",
26
+ color: "#e0e0e0",
27
+ },
28
+ section: {
29
+ background: "#1a1a2e",
30
+ borderRadius: "8px",
31
+ padding: "1rem",
32
+ marginBottom: "1rem",
33
+ border: "1px solid #2a2a4e",
34
+ },
35
+ sectionTitle: {
36
+ fontSize: "1.1rem",
37
+ fontWeight: 700,
38
+ marginTop: 0,
39
+ marginBottom: "0.75rem",
40
+ color: "#e0e0e0",
41
+ borderBottom: "1px solid #333",
42
+ paddingBottom: "0.5rem",
43
+ },
44
+ label: { fontWeight: 600, color: "#a0a0c0", marginRight: "0.5rem" },
45
+ value: { color: "#e0e0e0" },
46
+ row: { marginBottom: "0.4rem", fontSize: "0.9rem" },
47
+ warning: {
48
+ background: "#3a2a00",
49
+ border: "1px solid #665500",
50
+ borderRadius: "8px",
51
+ padding: "0.75rem",
52
+ marginTop: "0.5rem",
53
+ color: "#ffcc00",
54
+ fontSize: "0.85rem",
55
+ },
56
+ badge: {
57
+ display: "inline-block",
58
+ padding: "0.15rem 0.5rem",
59
+ borderRadius: "4px",
60
+ fontSize: "0.8rem",
61
+ fontWeight: 600,
62
+ marginLeft: "0.5rem",
63
+ },
64
+ detectRow: {
65
+ display: "flex",
66
+ justifyContent: "space-between",
67
+ alignItems: "center",
68
+ padding: "0.5rem 0",
69
+ borderBottom: "1px solid #2a2a4e",
70
+ },
71
+ button: {
72
+ background: "#3a5a9f",
73
+ color: "#fff",
74
+ border: "none",
75
+ borderRadius: "6px",
76
+ padding: "0.5rem 1rem",
77
+ cursor: "pointer",
78
+ fontSize: "0.9rem",
79
+ fontWeight: 600,
80
+ },
81
+ };
82
+
83
+ // ---------------------------------------------------------------------------
84
+ // SetupTab component
85
+ // ---------------------------------------------------------------------------
86
+
87
+ export default function SetupTab(): React.ReactElement {
88
+ const [status, setStatus] = useState<SetupStatusResponse | null>(null);
89
+ const [detect, setDetect] = useState<SetupDetectResponse | null>(null);
90
+ const [statusError, setStatusError] = useState<string | null>(null);
91
+ const [detectError, setDetectError] = useState<string | null>(null);
92
+ const [runningDetect, setRunningDetect] = useState(false);
93
+ const [configuring, setConfiguring] = useState<string | null>(null);
94
+ const [configResult, setConfigResult] = useState<SetupConfigureResponse | null>(null);
95
+ const [configError, setConfigError] = useState<string | null>(null);
96
+
97
+ const applyEmbedder = useCallback((embedder: "ollama" | "llama" | "trigram") => {
98
+ setConfiguring(embedder);
99
+ setConfigError(null);
100
+ setConfigResult(null);
101
+ configureEmbedder({ embedder })
102
+ .then((r) => {
103
+ setConfigResult(r);
104
+ setConfiguring(null);
105
+ loadStatus();
106
+ })
107
+ .catch((e: unknown) => {
108
+ setConfigError(e instanceof Error ? e.message : String(e));
109
+ setConfiguring(null);
110
+ });
111
+ }, [loadStatus]);
112
+
113
+ const loadStatus = useCallback(() => {
114
+ fetchSetupStatus()
115
+ .then(setStatus)
116
+ .catch((e: unknown) =>
117
+ setStatusError(e instanceof Error ? e.message : String(e)),
118
+ );
119
+ }, []);
120
+
121
+ const runDetect = useCallback(() => {
122
+ setRunningDetect(true);
123
+ setDetectError(null);
124
+ fetchSetupDetect()
125
+ .then((d) => {
126
+ setDetect(d);
127
+ setRunningDetect(false);
128
+ })
129
+ .catch((e: unknown) => {
130
+ setDetectError(e instanceof Error ? e.message : String(e));
131
+ setRunningDetect(false);
132
+ });
133
+ }, []);
134
+
135
+ useEffect(() => {
136
+ loadStatus();
137
+ }, [loadStatus]);
138
+
139
+ // Poll status every 30s
140
+ useEffect(() => {
141
+ const id = setInterval(loadStatus, 30000);
142
+ return () => clearInterval(id);
143
+ }, [loadStatus]);
144
+
145
+ // -----------------------------------------------------------------------
146
+ // Render helpers
147
+ // -----------------------------------------------------------------------
148
+
149
+ const embedderLabel = (e: string): string => {
150
+ switch (e) {
151
+ case "trigram":
152
+ return "TrigramEmbedder (heuristic, default)";
153
+ case "http":
154
+ return "HTTP Embedder (BYO localhost)";
155
+ case "minilm":
156
+ return "MiniLM (experimental)";
157
+ default:
158
+ return "Unknown";
159
+ }
160
+ };
161
+
162
+ const trigramWarning = status?.currentEmbedder === "trigram" && (
163
+ <div style={styles.warning}>
164
+ <strong>Note:</strong> TrigramEmbedder is a heuristic-strength default
165
+ embedder. It works without any setup but recall quality may be lower
166
+ than a dedicated embedding backend. If you notice poor recall results,
167
+ consider installing Ollama and running the{" "}
168
+ <code>/megasetup</code> command, or set{" "}
169
+ <code>MEGACOMPACT_EMBEDDING_URL</code> to point at your own localhost
170
+ embedding server.
171
+ </div>
172
+ );
173
+
174
+ const detectBadge = (installed: boolean): React.ReactElement => {
175
+ const bg = installed ? "#1a5a1a" : "#3a1a1a";
176
+ const color = installed ? "#4caf50" : "#f44336";
177
+ return (
178
+ <span style={{ ...styles.badge, background: bg, color }}>
179
+ {installed ? "Detected" : "Not found"}
180
+ </span>
181
+ );
182
+ };
183
+
184
+ // -----------------------------------------------------------------------
185
+ // Main render
186
+ // -----------------------------------------------------------------------
187
+
188
+ return (
189
+ <div style={styles.container}>
190
+ <h2 style={{ fontSize: "1.3rem", marginTop: 0, marginBottom: "1rem" }}>
191
+ Embedder Setup
192
+ </h2>
193
+
194
+ {/* Current Config Section */}
195
+ <div style={styles.section}>
196
+ <h3 style={styles.sectionTitle}>Current Embedder Configuration</h3>
197
+ {statusError && (
198
+ <p style={{ color: "#f44336", fontSize: "0.85rem" }}>
199
+ Error: {statusError}
200
+ </p>
201
+ )}
202
+ {status && (
203
+ <>
204
+ <div style={styles.row}>
205
+ <span style={styles.label}>Active Embedder:</span>
206
+ <span style={styles.value}>
207
+ {embedderLabel(status.currentEmbedder)}
208
+ </span>
209
+ </div>
210
+ <div style={styles.row}>
211
+ <span style={styles.label}>Embedding URL:</span>
212
+ <span style={styles.value}>
213
+ {status.embeddingUrl ?? (
214
+ <span style={{ color: "#888" }}>not set</span>
215
+ )}
216
+ </span>
217
+ </div>
218
+ <div style={styles.row}>
219
+ <span style={styles.label}>Embed Cache:</span>
220
+ <span style={styles.value}>
221
+ {status.embedCache ?? (
222
+ <span style={{ color: "#888" }}>not set</span>
223
+ )}
224
+ </span>
225
+ </div>
226
+ <div style={styles.row}>
227
+ <span style={styles.label}>MiniLM:</span>
228
+ <span style={styles.value}>{status.minilm ? "enabled" : "disabled"}</span>
229
+ </div>
230
+ {trigramWarning}
231
+ </>
232
+ )}
233
+ {!status && !statusError && (
234
+ <p style={{ color: "#888", fontSize: "0.85rem" }}>
235
+ Loading configuration...
236
+ </p>
237
+ )}
238
+ </div>
239
+
240
+ {/* Detection Section */}
241
+ <div style={styles.section}>
242
+ <h3 style={styles.sectionTitle}>Local Embedder Detection</h3>
243
+ <p style={{ fontSize: "0.85rem", color: "#a0a0c0", marginTop: 0 }}>
244
+ Detect which local embedding backends are available on this machine.
245
+ No software is installed — detection only.
246
+ </p>
247
+
248
+ {detect && (
249
+ <>
250
+ {/* Ollama */}
251
+ <div style={styles.detectRow}>
252
+ <span>
253
+ <strong>Ollama</strong>
254
+ </span>
255
+ {detect.ollama !== null ? (
256
+ <span>
257
+ {detectBadge(detect.ollama.installed)}
258
+ {detect.ollama.installed && (
259
+ <span style={{ fontSize: "0.8rem", color: "#a0a0c0", marginLeft: "0.5rem" }}>
260
+ {detect.ollama.running
261
+ ? `server running, ${detect.ollama.models.length} model(s)`
262
+ : "server not running"}
263
+ </span>
264
+ )}
265
+ </span>
266
+ ) : (
267
+ <span style={{ color: "#888", fontSize: "0.85rem" }}>
268
+ not checked
269
+ </span>
270
+ )}
271
+ </div>
272
+
273
+ {/* llama.cpp */}
274
+ <div style={styles.detectRow}>
275
+ <span>
276
+ <strong>llama.cpp</strong>
277
+ </span>
278
+ {detect.llamaCpp !== null ? (
279
+ <span>
280
+ {detectBadge(detect.llamaCpp.installed)}
281
+ {detect.llamaCpp.installed && detect.llamaCpp.detail && (
282
+ <span style={{ fontSize: "0.8rem", color: "#a0a0c0", marginLeft: "0.5rem" }}>
283
+ {detect.llamaCpp.detail}
284
+ </span>
285
+ )}
286
+ </span>
287
+ ) : (
288
+ <span style={{ color: "#888", fontSize: "0.85rem" }}>
289
+ not checked
290
+ </span>
291
+ )}
292
+ </div>
293
+
294
+ {/* ONNX */}
295
+ <div style={styles.detectRow}>
296
+ <span>
297
+ <strong>ONNX Runtime</strong>
298
+ </span>
299
+ {detect.onnx !== null ? (
300
+ <span>
301
+ {detectBadge(detect.onnx.installed)}
302
+ {detect.onnx.installed && detect.onnx.detail && (
303
+ <span style={{ fontSize: "0.8rem", color: "#a0a0c0", marginLeft: "0.5rem" }}>
304
+ {detect.onnx.detail}
305
+ </span>
306
+ )}
307
+ </span>
308
+ ) : (
309
+ <span style={{ color: "#888", fontSize: "0.85rem" }}>
310
+ not checked
311
+ </span>
312
+ )}
313
+ </div>
314
+
315
+ {detect.error && (
316
+ <p style={{ color: "#f44336", fontSize: "0.8rem", marginTop: "0.5rem" }}>
317
+ Detection error: {detect.error}
318
+ </p>
319
+ )}
320
+ </>
321
+ )}
322
+
323
+ {detectError && (
324
+ <p style={{ color: "#f44336", fontSize: "0.85rem" }}>
325
+ Error: {detectError}
326
+ </p>
327
+ )}
328
+
329
+ <div style={{ marginTop: "1rem" }}>
330
+ <button
331
+ style={styles.button}
332
+ onClick={runDetect}
333
+ disabled={runningDetect}
334
+ >
335
+ {runningDetect ? "Detecting..." : "Run Detection"}
336
+ </button>
337
+ <span style={{ fontSize: "0.8rem", color: "#888", marginLeft: "0.75rem" }}>
338
+ Or run <code>/megasetup</code> in the chat for an interactive wizard.
339
+ </span>
340
+ </div>
341
+
342
+ {/* Configure buttons — appear after detection runs */}
343
+ {detect && (
344
+ <div style={{ marginTop: "1rem", paddingTop: "0.75rem", borderTop: "1px solid #2a2a4e" }}>
345
+ <div style={{ fontSize: "0.9rem", fontWeight: 600, marginBottom: "0.5rem" }}>
346
+ Configure
347
+ </div>
348
+ <div style={{ display: "flex", gap: "0.5rem", flexWrap: "wrap" }}>
349
+ <button
350
+ style={{ ...styles.button, opacity: detect.ollama?.installed ? 1 : 0.4 }}
351
+ onClick={() => applyEmbedder("ollama")}
352
+ disabled={!detect.ollama?.installed || configuring !== null}
353
+ >
354
+ {configuring === "ollama" ? "Writing..." : "Use Ollama"}
355
+ </button>
356
+ <button
357
+ style={{ ...styles.button, opacity: detect.llamaCpp?.installed ? 1 : 0.4 }}
358
+ onClick={() => applyEmbedder("llama")}
359
+ disabled={!detect.llamaCpp?.installed || configuring !== null}
360
+ >
361
+ {configuring === "llama" ? "Writing..." : "Use llama.cpp"}
362
+ </button>
363
+ <button
364
+ style={{ ...styles.button, background: "#444" }}
365
+ onClick={() => applyEmbedder("trigram")}
366
+ disabled={configuring !== null}
367
+ >
368
+ {configuring === "trigram" ? "Writing..." : "Use Trigram (default)"}
369
+ </button>
370
+ </div>
371
+ {configResult && (
372
+ <div style={styles.warning}>
373
+ {configResult.alreadyActive
374
+ ? "Already active — no restart needed."
375
+ : `Configured ${configResult.embedder}. Restart pi to activate (config written to ${configResult.envPath}).`}
376
+ </div>
377
+ )}
378
+ {configError && (
379
+ <p style={{ color: "#f44336", fontSize: "0.85rem", marginTop: "0.5rem" }}>
380
+ Configure error: {configError}
381
+ </p>
382
+ )}
383
+ </div>
384
+ )}
385
+ </div>
386
+
387
+ {/* Help Section */}
388
+ <div style={styles.section}>
389
+ <h3 style={styles.sectionTitle}>How to Upgrade</h3>
390
+ <ul style={{ fontSize: "0.85rem", lineHeight: 1.6, paddingLeft: "1.25rem" }}>
391
+ <li>
392
+ <strong>Ollama:</strong> Install from{" "}
393
+ <a
394
+ href="https://ollama.com"
395
+ style={{ color: "#6a9fff" }}
396
+ target="_blank"
397
+ rel="noopener noreferrer"
398
+ >
399
+ ollama.com
400
+ </a>
401
+ , then <code>ollama pull nomic-embed-text</code> and restart pi.
402
+ Set <code>MEGACOMPACT_EMBEDDING_URL=http://localhost:11434/api/embeddings</code>.
403
+ </li>
404
+ <li>
405
+ <strong>llama.cpp:</strong> Build or install llama.cpp, run{" "}
406
+ <code>llama-server</code> with an embedding model, and set
407
+ the URL accordingly.
408
+ </li>
409
+ <li>
410
+ <strong>ONNX Runtime:</strong> Install{" "}
411
+ <code>onnxruntime-node</code> in the project root. Not yet
412
+ integrated — see docs for manual setup.
413
+ </li>
414
+ </ul>
415
+ </div>
416
+ </div>
417
+ );
418
+ }
@@ -20,9 +20,10 @@
20
20
  "baseUrl": ".",
21
21
  "paths": {
22
22
  "@/*": ["./src/*"],
23
- "@contracts": ["../dashboard-server/api-contracts/index.ts"]
23
+ "@contracts": ["../dashboard-server/api-contracts/index.ts"],
24
+ "@pricing": ["../../src/pricing.ts"]
24
25
  }
25
26
  },
26
- "include": ["src/**/*.ts", "src/**/*.tsx"],
27
+ "include": ["src/**/*.ts", "src/**/*.tsx", "../../src/pricing.ts"],
27
28
  "exclude": ["node_modules", "dist"]
28
29
  }
@@ -33,6 +33,8 @@ export default defineConfig({
33
33
  "@contracts": fileURLToPath(
34
34
  new URL("../dashboard-server/api-contracts", import.meta.url),
35
35
  ),
36
+ // Shared pricing module (computeCacheSavings, constants).
37
+ "@pricing": fileURLToPath(new URL("../../src/pricing.ts", import.meta.url)),
36
38
  },
37
39
  },
38
40
  });
@@ -0,0 +1,49 @@
1
+ /**
2
+ * api-contracts/cache-stripes.ts — Cache stripe API contract (A3, PLAN_V2 Phase 4).
3
+ *
4
+ * Response shape for GET /api/cache-stripes: per-stripe distribution counts,
5
+ * average stability, and a top-level health score. Loopback-only data;
6
+ * zero network (PREVENT-PI-004).
7
+ */
8
+
9
+ /** A single stripe bucket with aggregate metadata. */
10
+ export interface StripeBucket {
11
+ /** Stripe index 0–4 (0=permanent, 1=epoch, 2=topic, 3=thread, 4=volatile). */
12
+ readonly stripe: number;
13
+ /** Human-readable label for this stripe. */
14
+ readonly label: string;
15
+ /** Number of chunks assigned to this stripe. */
16
+ readonly count: number;
17
+ /** Average stability score (0.0–1.0) within this stripe. */
18
+ readonly avgStability: number;
19
+ /** Minimum stability in this stripe. */
20
+ readonly minStability: number;
21
+ /** Maximum stability in this stripe. */
22
+ readonly maxStability: number;
23
+ }
24
+
25
+ /** Overall cache health assessment. */
26
+ export interface CacheHealthScore {
27
+ /** Composite health score 0.0–1.0 (1.0 = perfect). */
28
+ readonly score: number;
29
+ /** Human-readable label: "good" | "fair" | "degraded" | "poor". */
30
+ readonly label: string;
31
+ /** Dominant stability tier fraction. */
32
+ readonly dominantTier: number;
33
+ /** Stripe churn rate (0.0–1.0) — fraction of assignments changed since last epoch. */
34
+ readonly churnRate: number;
35
+ }
36
+
37
+ /** Response body for GET /api/cache-stripes. */
38
+ export interface CacheStripesResponse {
39
+ /** Per-stripe bucket arrays (always 5 entries, stripes 0–4). */
40
+ readonly buckets: StripeBucket[];
41
+ /** Overall health assessment. */
42
+ readonly health: CacheHealthScore;
43
+ /** Epoch id these assignments belong to. */
44
+ readonly epochId: string | null;
45
+ /** Timestamp (epoch ms) of the last refresh. */
46
+ readonly lastRefreshAt: number;
47
+ /** Total chunk count across all stripes. */
48
+ readonly totalChunks: number;
49
+ }
@@ -15,6 +15,8 @@ import type { IndexesIndexRow, IndexesSummaryResponse } from "./multi-repo.js";
15
15
  import type { GameStateResponse } from "./game.js";
16
16
  import type { SseEvent } from "./index.js";
17
17
  import type { ProviderCacheResponse } from "./provider-cache.js";
18
+ import type { MemoryStatusResponse } from "./memory.js";
19
+ import type { SetupStatusResponse, SetupDetectResponse, SetupConfigureRequest, SetupConfigureResponse } from "./setup.js";
18
20
  import type {
19
21
  TurnsResponse,
20
22
  ConversationTurnsResponse,
@@ -34,6 +36,8 @@ import type {
34
36
  SchemaHealthResponse,
35
37
  } from "./maintenance.js";
36
38
 
39
+ import type { CacheStripesResponse } from "./cache-stripes.js";
40
+
37
41
  import type {
38
42
  GameScoreRow,
39
43
  GameScoresQuery,
@@ -298,6 +302,14 @@ export interface PerfLatest {
298
302
  readonly n: number;
299
303
  }
300
304
 
305
+ /** A single cache hit rate sample with timestamp. */
306
+ export interface CacheHitSample {
307
+ /** Cache hit percentage (0–100). */
308
+ readonly pct: number;
309
+ /** Epoch ms timestamp of the sample. */
310
+ readonly ts: number;
311
+ }
312
+
301
313
  /** Average + latest statistics for cache hit percentage. */
302
314
  export interface PerfCacheHit {
303
315
  /** Average cache hit percentage (0–100). */
@@ -306,6 +318,8 @@ export interface PerfCacheHit {
306
318
  readonly latest: number;
307
319
  /** Number of samples in the window. */
308
320
  readonly n: number;
321
+ /** Raw cache hit samples with timestamps for time-series charting. */
322
+ readonly samples: CacheHitSample[];
309
323
  }
310
324
 
311
325
  /** Diagnostic counters from the live dashboard snapshot. */
@@ -586,15 +600,21 @@ export const ENDPOINTS = {
586
600
  schemaHealth: {
587
601
  method: "GET",
588
602
  path: "/api/maintenance/schema-health",
589
- description: "SCHEMA_VERSION, PRAGMA integrity_check, FK check, and per-column audit.",
603
+ description:
604
+ "SCHEMA_VERSION, PRAGMA integrity_check, FK check, and per-column audit.",
590
605
  } as const satisfies EndpointDef<"GET", undefined, SchemaHealthResponse>,
591
606
 
592
607
  /** POST /api/maintenance/action — Trigger a maintenance action. */
593
608
  maintenanceAction: {
594
609
  method: "POST",
595
610
  path: "/api/maintenance/action",
596
- description: "Run vacuum, checkpoint, reindex, fts5-rebuild, reconcile-dedup, prune, or integrity-check.",
597
- } as const satisfies EndpointDef<"POST", MaintenanceAction, MaintenanceActionResult>,
611
+ description:
612
+ "Run vacuum, checkpoint, reindex, fts5-rebuild, reconcile-dedup, prune, or integrity-check.",
613
+ } as const satisfies EndpointDef<
614
+ "POST",
615
+ MaintenanceAction,
616
+ MaintenanceActionResult
617
+ >,
598
618
 
599
619
  // ─── Provider Cache (Sprint A.2) ─────────────────────────────────
600
620
 
@@ -606,4 +626,47 @@ export const ENDPOINTS = {
606
626
  "Lifetime provider prompt cache hit-rate aggregates + dollar savings estimate.",
607
627
  } as const satisfies EndpointDef<"GET", undefined, ProviderCacheResponse>,
608
628
 
629
+
630
+ // ─── A3 Cache Stripes (PLAN_V2 Phase 4) ───────────────────────────
631
+
632
+ /** GET /api/cache-stripes — Per-stripe distribution + health score. */
633
+ cacheStripes: {
634
+ method: "GET",
635
+ path: "/api/cache-stripes",
636
+ description:
637
+ "Per-stripe distribution counts, average stability scores, and composite cache health.",
638
+ } as const satisfies EndpointDef<"GET", undefined, CacheStripesResponse>,
639
+ // ─── Memory Effectiveness (S53B) ───────────────────────────────────────
640
+
641
+ /** GET /api/memory-status — Memory store aggregate statistics. */
642
+ memoryStatus: {
643
+ method: "GET",
644
+ path: "/api/memory-status",
645
+ description:
646
+ "Memory store statistics: total count, 30-day window, top-N stable memories, avg recall score.",
647
+ } as const satisfies EndpointDef<"GET", undefined, MemoryStatusResponse>,
648
+
649
+ /** GET /api/setup-status — Current embedder configuration. */
650
+ setupStatus: {
651
+ method: "GET",
652
+ path: "/api/setup-status",
653
+ description:
654
+ "Current embedder configuration (which embedder is active, embedding URL, cache, MiniLM flag).",
655
+ } as const satisfies EndpointDef<"GET", undefined, SetupStatusResponse>,
656
+
657
+ /** GET /api/setup-detect — Detect available local embedder backends. */
658
+ setupDetect: {
659
+ method: "GET",
660
+ path: "/api/setup-detect",
661
+ description:
662
+ "Best-effort detection of local embedder backends (ollama, llama.cpp, ONNX) available on the machine.",
663
+ } as const satisfies EndpointDef<"GET", undefined, SetupDetectResponse>,
664
+
665
+ /** POST /api/setup-configure — Write embedder config to .mega-compact.env. */
666
+ setupConfigure: {
667
+ method: "POST",
668
+ path: "/api/setup-configure",
669
+ description:
670
+ "Write the chosen embedder configuration to .mega-compact.env (loaded at next startup). Returns whether a restart is required.",
671
+ } as const satisfies EndpointDef<"POST", SetupConfigureRequest, SetupConfigureResponse>,
609
672
  } as const;
@@ -147,6 +147,7 @@ export type {
147
147
  export type {
148
148
  ProviderCacheSavings,
149
149
  ProviderCacheResponse,
150
+ ProviderCacheByModel,
150
151
  } from "./provider-cache.js";
151
152
 
152
153
  export { ENDPOINTS } from "./endpoints.js";
@@ -202,3 +203,24 @@ export type {
202
203
  PruneTurnsResponse,
203
204
  TopicMemoriesResponse,
204
205
  } from "./turns.js";
206
+
207
+ // S53B — memory effectiveness stats
208
+ export type { MemoryStatusResponse, MemoryStatsTopMemory } from "./memory.js";
209
+
210
+ // Setup wizard — embedder configuration + backend detection
211
+ export type { SetupStatusResponse, SetupDetectResponse, SetupConfigureRequest, SetupConfigureResponse, DetectResult, OllamaDetectResult } from "./setup.js";
212
+
213
+ // S46 — memory graph (visual memory map)
214
+ export type {
215
+ MemoryMapResponse,
216
+ MemoryMapNode,
217
+ MemoryMapEdgeEntry,
218
+ MemoryMapQuery,
219
+ } from "./memory-map.js";
220
+
221
+ // A3 — cache stripe distribution + health
222
+ export type {
223
+ StripeBucket,
224
+ CacheHealthScore,
225
+ CacheStripesResponse,
226
+ } from "./cache-stripes.js";
@@ -0,0 +1,50 @@
1
+ /**
2
+ * api-contracts/memory-map.ts — Memory graph API contract (S46).
3
+ *
4
+ * Response shape for GET /api/memory-map: graph nodes, edges, and metadata.
5
+ * This is a read-only JSON payload consumed by the MemoryMapTab React component.
6
+ */
7
+ import type { GraphMetadata } from "../../../src/memoryGraph.js";
8
+
9
+ /**
10
+ * Query parameters for GET /api/memory-map.
11
+ * All fields are optional.
12
+ */
13
+ export interface MemoryMapQuery {
14
+ /** Filter to a single session ID. */
15
+ readonly sessionId?: string;
16
+ /** Cosine similarity threshold (0..1). Default 0.7. */
17
+ readonly threshold?: number;
18
+ /** Max semantic edges per node. Default 3. */
19
+ readonly maxEdgesPerNode?: number;
20
+ }
21
+
22
+ /** Response body for GET /api/memory-map. */
23
+ export interface MemoryMapResponse {
24
+ readonly nodes: MemoryMapNode[];
25
+ readonly edges: MemoryMapEdgeEntry[];
26
+ readonly metadata: GraphMetadata;
27
+ }
28
+
29
+ /** A node in the response (client-safe subset — no full embedding vector). */
30
+ export interface MemoryMapNode {
31
+ readonly id: string;
32
+ readonly sessionId: string;
33
+ readonly label: string;
34
+ readonly summaryTruncated: string;
35
+ readonly tokenEstimate: number;
36
+ readonly timestamp: number;
37
+ readonly dedupStatus: string | undefined;
38
+ readonly raptorLevel: number;
39
+ readonly topicSummary: string | undefined;
40
+ readonly decisionCount: number;
41
+ readonly textSnippet: string;
42
+ }
43
+
44
+ /** An edge entry in the response. */
45
+ export interface MemoryMapEdgeEntry {
46
+ readonly source: string;
47
+ readonly target: string;
48
+ readonly weight: number;
49
+ readonly type: "temporal" | "semantic" | "raptor_parent";
50
+ }