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
@@ -1,219 +0,0 @@
1
- /**
2
- * sprint14.test.ts — Sprint 14 full-pipeline wiring (flags, backfill, monitoring, canary).
3
- * Hermetic: isolated state dirs, no network, no remote.
4
- */
5
- import { test } from "node:test";
6
- import assert from "node:assert/strict";
7
- import { mkdtempSync, rmSync, readFileSync, existsSync } from "node:fs";
8
- import { tmpdir } from "node:os";
9
- import { join } from "node:path";
10
- import { VectorStore, vectorSearch } from "./vectorStore.js";
11
- import { defaultEmbedder } from "./embedder.js";
12
- import { loadDedupConfig } from "./config/dedup.js";
13
- import { loadMetrics, saveMetrics, recordDecision, evaluateAlerts, fpRate, p95, } from "./monitoring.js";
14
- import { backfillPhase, backfillRaptor } from "./store/backfill.js";
15
- import { listCheckpoints, closeStore } from "./store/sqlite.js";
16
- import { CanaryController, runCanary } from "./canary.js";
17
- const baseTmp = mkdtempSync(join(tmpdir(), "mc-s14-"));
18
- function cfg(over = {}) {
19
- return { ...loadDedupConfig(), ...over };
20
- }
21
- function store(over = {}, eventsPath) {
22
- const dir = join(baseTmp, `run-${Math.floor(performance.now() * 1000)}-${Math.random()}`);
23
- return new VectorStore({ stateDir: dir, config: cfg(over), eventsPath });
24
- }
25
- // --- 1. Flag matrix: 16 combos don't crash add()/search() -------------------
26
- test("flag matrix: all 16 L0/L1/L2/RAPTOR enable combos are safe", () => {
27
- const flags = [false, true];
28
- let combos = 0;
29
- for (const l0 of flags)
30
- for (const l1 of flags)
31
- for (const l2 of flags)
32
- for (const raptor of flags) {
33
- combos++;
34
- const s = store({ L0_ENABLED: l0, L1_ENABLED: l1, L2_ENABLED: l2, RAPTOR_ENABLED: raptor });
35
- s.add({ sessionId: "s", summary: "x", regionText: `region A for combo ${combos} about the cache`, timestamp: 1 });
36
- const r2 = s.add({ sessionId: "s", summary: "x", regionText: `region B for combo ${combos} about the parser`, timestamp: 2 });
37
- // search must not throw under any combination
38
- const hits = vectorSearch(s, "s", "cache", 3);
39
- assert.ok(Array.isArray(hits));
40
- // With all tiers off, the second add is always "new" (no collapse).
41
- if (!l0 && !l1 && !l2)
42
- assert.equal(r2.deduped, false);
43
- }
44
- assert.equal(combos, 16);
45
- });
46
- // --- 2. MARK_ONLY_L1 records but doesn't collapse ---------------------------
47
- test("MARK_ONLY_L1: L1 match is recorded but not collapsed (new checkpoint)", () => {
48
- // Disable L2 so we isolate L1 behavior (L2 cosine would otherwise catch the near-dup).
49
- const s = store({ L1_ENABLED: true, MARK_ONLY_L1: true, L2_ENABLED: false });
50
- const a = s.add({ sessionId: "s", summary: "x", regionText: "the parser optimized the hot loop", timestamp: 1 });
51
- const b = s.add({ sessionId: "s", summary: "x", regionText: "the parser optimized the hot loops", timestamp: 2 });
52
- assert.equal(a.deduped, false);
53
- // MARK_ONLY → b is NOT collapsed into a; both stored as active.
54
- assert.equal(b.deduped, false);
55
- const all = listCheckpoints("s", s.stateDir);
56
- assert.equal(all.length, 2);
57
- assert.ok(all.every((c) => c.dedupStatus === "active"));
58
- });
59
- test("MARK_ONLY_L1 off: L1 match IS collapsed", () => {
60
- const s = store({ L1_ENABLED: true, MARK_ONLY_L1: false });
61
- s.add({ sessionId: "s", summary: "x", regionText: "the parser optimized the hot loop", timestamp: 1 });
62
- const b = s.add({ sessionId: "s", summary: "x", regionText: "the parser optimized the hot loops", timestamp: 2 });
63
- assert.equal(b.deduped, true);
64
- assert.equal(b.reason, "l1MinHash");
65
- });
66
- // --- 3. Backfill resumes after interrupt -------------------------------------
67
- test("backfill L1 resumes after simulated interrupt", () => {
68
- const dir = join(baseTmp, `bf-${Math.floor(performance.now())}`);
69
- // Seed 12 checkpoints, 2 per batch of 5.
70
- const s = new VectorStore({ stateDir: dir, config: cfg() });
71
- const texts = [
72
- "The walrus drifted past the lighthouse while the baker kneaded sourdough at dawn",
73
- "Quantum entanglement linked the two photons across the lab in a cryogenic chamber",
74
- "A medieval scribe copied the gospel by candlelight atop a windswept cliff",
75
- "The rover sampled basalt from the crater and transmitted spectra to mission control",
76
- "Jazz musicians improvised a syncopated triangle rhythm beneath the streetlamp",
77
- "The glacier calved a towering iceberg into the fjord with a thunderous crack",
78
- "A botanist cataloged the orchid species thriving in the cloud forest canopy",
79
- "The blacksmith forged a horseshoe while sparks danced across the anvil",
80
- "Astronomers imaged a distant nebula glowing with newborn stellar furnaces",
81
- "The ferry crossed the strait as gulls wheeled above the churning wake",
82
- "A weaver threaded crimson silk through the loom in the mountain village",
83
- "The surgeon sutured the incision with steady hands under the theatre lights",
84
- ];
85
- for (let i = 0; i < 12; i++) {
86
- s.add({ sessionId: "sess_bf", summary: `n${i}`, regionText: texts[i], timestamp: i });
87
- }
88
- // Interrupt after batch 1 (5 rows).
89
- const r1 = backfillPhase("L1", "sess_bf", dir, { batchSize: 5, interruptAfterBatches: 1 });
90
- assert.equal(r1.interrupted, true);
91
- assert.equal(r1.processed, 5);
92
- assert.ok(r1.cursor === "chkpt_005" || r1.cursor === "chkpt_05");
93
- // Resume: should continue from the cursor → process the remaining 7.
94
- const r2 = backfillPhase("L1", "sess_bf", dir, { batchSize: 5 });
95
- assert.equal(r2.interrupted, false);
96
- assert.equal(r2.processed, 12); // total across both runs (cursor-based resume)
97
- closeStore(dir);
98
- });
99
- // --- 4. Alert fires on injected FP spike -------------------------------------
100
- test("alert: FP spike breaches threshold → MARK_ONLY flagged + warning", () => {
101
- const config = cfg();
102
- const m = loadMetrics("/dev/null");
103
- // Inject 100 L1 decisions, 20 false positives → 20% > FP_RATE_L1L2 (5%).
104
- for (let i = 0; i < 100; i++) {
105
- recordDecision(m, "L1", i < 20 ? "deduped" : "new", 5, i < 20);
106
- }
107
- const res = evaluateAlerts(m, config);
108
- assert.ok(res.breached.includes("L1"));
109
- assert.ok(res.warnings.some((w) => w.includes("DEDUP FP BREACH tier=L1")));
110
- assert.ok(fpRate(m, "L1") > config.FP_RATE_L1L2);
111
- });
112
- test("alert: clean run does NOT breach", () => {
113
- const config = cfg();
114
- const m = loadMetrics("/dev/null");
115
- for (let i = 0; i < 100; i++)
116
- recordDecision(m, "L1", "new", 5, false);
117
- const res = evaluateAlerts(m, config);
118
- assert.equal(res.breached.length, 0);
119
- });
120
- // --- 5. Canary auto-disables a tier whose p95 exceeds budget ---------------
121
- test("canary: auto-disables a tier whose p95 exceeds budget", () => {
122
- // Feed where L2 always has high latency (breaches P95_BUDGET_MS).
123
- const feed = (_step, c) => {
124
- const m = loadMetrics("/dev/null");
125
- if (c.L0_ENABLED)
126
- recordDecision(m, "L0", "new", 1, false);
127
- if (c.L1_ENABLED)
128
- recordDecision(m, "L1", "new", 1, false);
129
- if (c.L2_ENABLED)
130
- recordDecision(m, "L2", "new", 500, false); // > 100ms budget
131
- if (c.RAPTOR_ENABLED)
132
- recordDecision(m, "RAPTOR", "new", 1, false);
133
- return m;
134
- };
135
- const { controller, disabled } = runCanary(feed, cfg({ P95_BUDGET_MS: 100 }));
136
- assert.ok(disabled.includes("L2"), `expected L2 auto-disabled, got ${JSON.stringify(disabled)}`);
137
- assert.equal(controller.config.L2_ENABLED, false);
138
- // Lower tiers should still be enabled.
139
- assert.equal(controller.config.L0_ENABLED, true);
140
- });
141
- test("canary: sequential enablement order L0→L1→L2→RAPTOR", () => {
142
- const c = new CanaryController(cfg());
143
- assert.deepEqual([...c.getState().enabled], ["L0"]);
144
- const t1 = c.stepForward();
145
- assert.equal(t1, "L1");
146
- assert.equal(c.stepForward(), "L2");
147
- assert.equal(c.stepForward(), "RAPTOR");
148
- assert.equal(c.stepForward(), null); // all enabled
149
- });
150
- // --- 6. Monitoring: structured decision events written ----------------------
151
- test("monitoring: add() writes structured decision events to events.log", () => {
152
- const dir = join(baseTmp, `mon-${Math.floor(performance.now())}`);
153
- const eventsPath = join(dir, "events.log");
154
- const s = new VectorStore({
155
- stateDir: dir,
156
- config: cfg(),
157
- eventsPath,
158
- });
159
- s.add({ sessionId: "s", summary: "x", regionText: "unique region alpha one", timestamp: 1 });
160
- s.add({ sessionId: "s", summary: "x", regionText: "unique region alpha one", timestamp: 2 }); // L0 content dup
161
- assert.ok(existsSync(eventsPath));
162
- const lines = readFileSync(eventsPath, "utf-8").trim().split("\n").filter(Boolean);
163
- assert.ok(lines.length >= 2);
164
- const ev = JSON.parse(lines[0]);
165
- assert.ok(["L0"].includes(ev.tier));
166
- assert.ok(["new", "deduped", "mark_only"].includes(ev.result));
167
- closeStore(dir);
168
- });
169
- // --- 7. RAPTOR backfill builds + persists a tree ---------------------------
170
- test("backfill RAPTOR builds + persists a tree for a session", () => {
171
- const dir = join(baseTmp, `raptorbf-${Math.floor(performance.now())}`);
172
- const s = new VectorStore({ stateDir: dir, config: cfg() });
173
- const texts = [
174
- "The whale breached beside the research vessel near the polar ice shelf",
175
- "A potter shaped the clay vessel on the spinning wheel at the riverside studio",
176
- "The comet streaked across the pre dawn sky witnessed by the hilltop observatory",
177
- "Lumberjacks felled the ancient cedar while the river carried the logs downstream",
178
- "The chemist titrated the solution until the indicator turned faint violet",
179
- "A flock of cranes migrated northward over the thawing wetland at first light",
180
- "The locksmith picked the stubborn tumbler and opened the oak cabinet",
181
- "Geologists hammered the schist sample from the canyon wall into the satchel",
182
- "The chocolatier tempered the couverture until it snapped with a clean gloss",
183
- "A fisher cast the line into the mist where the trout rose to the fly",
184
- "The archivist unsealed the parchment scroll recovered from the coastal ruin",
185
- "Beekeepers harvested the golden comb while the orchard blossoms drifted down",
186
- "The pilot navigated the canyon winds using only the instrument panel glow",
187
- "A tailor stitched the velvet cuff with silk thread by the window",
188
- "The miner extracted the quartz crystal from the vein deep in the shaft",
189
- "Cartographers plotted the uncharted island onto the worn leather map",
190
- "The gardener pruned the rosebush and tied the canes to the cedar trellis",
191
- "A violinist tuned the gut strings until the chamber rang pure and bright",
192
- "The diver surfaced with the amphora lifted from the sunken galleon",
193
- "Shepherds guided the flock across the high pasture toward the stone bothy",
194
- ];
195
- for (let i = 0; i < 20; i++) {
196
- s.add({ sessionId: "sess_rb", summary: `n${i}`, regionText: texts[i], timestamp: i });
197
- }
198
- const res = backfillRaptor("sess_rb", dir, defaultEmbedder());
199
- assert.ok(res.processed > 0);
200
- // Sanity: source checkpoints remain intact (backfill is additive).
201
- const nodes = listCheckpoints("sess_rb", dir).length;
202
- assert.ok(nodes >= 20);
203
- closeStore(dir);
204
- });
205
- // --- 8. dashboard.json metrics round-trip -----------------------------------
206
- test("metrics: dashboard.json persists + p95 computed", () => {
207
- const path = join(baseTmp, `dash-${Math.floor(performance.now())}.json`);
208
- const m = loadMetrics(path);
209
- for (let i = 0; i < 10; i++)
210
- recordDecision(m, "L2", "new", i * 10, false);
211
- saveMetrics(path, m);
212
- const reloaded = loadMetrics(path);
213
- assert.equal(reloaded.decisions.L2, 10);
214
- assert.equal(p95(reloaded.latency.L2), 90); // 95th pct of [0,10,..,90]
215
- });
216
- // --- cleanup ----------------------------------------------------------------
217
- test("Sprint 14 cleanup", () => {
218
- rmSync(baseTmp, { recursive: true, force: true });
219
- });
@@ -1,93 +0,0 @@
1
- /**
2
- * sprint4x-rag-verification.test.ts — run the S40–S47 RAG suite once against
3
- * the current implementation and assert the documented "default enable" claims.
4
- *
5
- * This is the verification pass demanded by the roadmap/backlog: each spec
6
- * claims its feature flags DEFAULT ON. The honest check (not a re-statement of
7
- * the spec) is: which flags actually exist in code, what do they default to,
8
- * and is the consuming path wired?
9
- *
10
- * Findings recorded here, per spec:
11
- * S40 importance-scoring — module src/importance.ts exists (S40A) but is
12
- * NOT consumed by compactSession/vector-paths;
13
- * no shipped flag, no adapter wiring.
14
- * S41 self-rag-quality-gate — spec-only; NO flag, NO consumer.
15
- * S42 raptor-multilevel — PARTIALLY SHIPPED: RAPTOR_MULTILEVEL_ENABLED
16
- * and RAPTOR_LEAF_EXPANSION both default true
17
- * with real consumers; the spec's claim holds.
18
- * S43 hyde-vague-queries — spec-only (QUERY_REFORMULATION_ENABLED absent).
19
- * S44 three-tier-latency-routing — spec-only (TIERED_ROUTING_ENABLED absent).
20
- * S45 crag-quality-metrics — spec-only (CRAG_ENABLED absent).
21
- * S46 visual-memory-map — spec-only (MEMORY_MAP_ENABLED absent;
22
- * memory-graph endpoint not in dashboard-server).
23
- * S47 auto-categorizing-wiki — spec-only (AUTO_WIKI_ENABLED absent).
24
- *
25
- * Policy: the suite runs against the flags that EXIST today. Unimplemented spec
26
- * claims are pinned by the S4X_SPEC_ONLY tests so regressions can't silently
27
- * add them in the wrong state, and this file records exactly which
28
- * spec-vs-implementation gaps remain.
29
- */
30
- import { test } from "node:test";
31
- import assert from "node:assert/strict";
32
- import { loadDedupConfig } from "./config/dedup.js";
33
- /**
34
- * Clear any env pollution so the default is measured, not the override.
35
- */
36
- function fresh(envKey, get) {
37
- delete process.env[envKey];
38
- try {
39
- return get();
40
- }
41
- finally {
42
- delete process.env[envKey];
43
- }
44
- }
45
- // ---- S42: shipped flags default ON (claim holds) ----------------------------
46
- test("S42 RAPTOR_MULTILEVEL_ENABLED defaults ON and honors env off", () => {
47
- const d = fresh("MEGACOMPACT_RAPTOR_MULTILEVEL", () => loadDedupConfig());
48
- assert.ok(d.RAPTOR_MULTILEVEL_ENABLED, "ship claim: multi-level on by default");
49
- process.env.MEGACOMPACT_RAPTOR_MULTILEVEL = "false";
50
- const off = loadDedupConfig();
51
- assert.ok(!off.RAPTOR_MULTILEVEL_ENABLED, "env override: MEGACOMPACT_RAPTOR_MULTILEVEL=false turns it off");
52
- });
53
- test("S42 RAPTOR_LEAF_EXPANSION defaults ON and honors env off", () => {
54
- const d = fresh("MEGACOMPACT_RAPTOR_LEAF_EXPANSION", () => loadDedupConfig());
55
- assert.ok(d.RAPTOR_LEAF_EXPANSION, "ship claim: leaf-expansion on by default");
56
- process.env.MEGACOMPACT_RAPTOR_LEAF_EXPANSION = "false";
57
- const off = loadDedupConfig();
58
- assert.ok(!off.RAPTOR_LEAF_EXPANSION, "env override off");
59
- });
60
- // ---- S40: module exists, claims do NOT yet hold at the flag/consumer level --
61
- test("S40 importance module exists in-tree (S40A artifact)", async () => {
62
- // Load the module and confirm it exports the scoring surface the spec
63
- // describes. This proves the S40A implementation exists even though nothing
64
- // wires it into compaction/vector paths yet (documented gap).
65
- const mod = await import("./importance.js");
66
- assert.ok(mod && typeof mod === "object", "importance.ts loads");
67
- // Exports per spec: score() plus item-type enum.
68
- assert.ok(typeof mod.score === "function", "importance.ts exports score() function");
69
- });
70
- test("S40 has no shipped consumer flag in the current codebase (gap pinned)", async () => {
71
- // The S40 spec claims an IMPORTANCE_SCORING flag defaults ON. In the
72
- // current code no such flag exists, and no vector/compact path reads
73
- // importance scores. This test documents the gap so a future wiring does
74
- // not silently flip it on in the wrong shape.
75
- const cfg = loadDedupConfig();
76
- assert.ok(!("IMPORTANCE_SCORING" in cfg), "no IMPORTANCE_SCORING flag yet (S40 consumer wiring missing)");
77
- });
78
- // ---- S41/S43–S47: spec-only modules — pin the absence ------------------------
79
- test("S4X spec-only flags absent from DedupConfig", () => {
80
- const cfg = loadDedupConfig();
81
- const specFlags = [
82
- "CRITIQUE_ENABLED", // S41
83
- "QUERY_REFORMULATION_ENABLED", // S43
84
- "TIERED_ROUTING_ENABLED", // S44
85
- "CRAG_ENABLED", // S45
86
- "CRAG_EXPANSION_ENABLED", // S45
87
- "MEMORY_MAP_ENABLED", // S46
88
- "AUTO_WIKI_ENABLED", // S47
89
- ];
90
- for (const f of specFlags) {
91
- assert.ok(!(f in cfg), `${f} is spec-only — should not be present in DedupConfig`);
92
- }
93
- });
@@ -1,139 +0,0 @@
1
- /**
2
- * compression.test.ts — versioned compression tiers + backward compatibility.
3
- *
4
- * Proves Sprint 8's root-cause fix: the 0x03 tag collision is impossible because
5
- * new blobs carry a 2-byte version magic, and legacy blobs (untagged gzip, legacy
6
- * single-tag incl. the old 0x03=brotli) still decompress.
7
- */
8
- import { test } from "node:test";
9
- import assert from "node:assert/strict";
10
- import { gzipSync, brotliCompressSync } from "node:zlib";
11
- import { compressSmart, decompressSmart, compressZstd, decompressZstd, isVersioned, detectFormat, decompressSyncAuto, } from "./compression.js";
12
- const buf = (s, n) => Buffer.from(s.repeat(n));
13
- test("versioned format: all size tiers roundtrip and are versioned", () => {
14
- const cases = [
15
- { label: "tiny", data: buf("x", 100), expectTag: 0x00 },
16
- { label: "small", data: buf("a", 600), expectTag: 0x01 },
17
- { label: "medium", data: buf("b", 8000), expectTag: 0x02 },
18
- { label: "large", data: buf("c", 40000), expectTag: 0x05 },
19
- ];
20
- for (const { label, data, expectTag } of cases) {
21
- const c = compressSmart(data);
22
- // New 2-byte magic header present.
23
- assert.ok(isVersioned(c), `${label}: should be versioned (0xEC 0x01)`);
24
- assert.equal(c[0], 0xec, `${label}: magic hi`);
25
- assert.equal(c[1], 0x01, `${label}: magic lo (version)`);
26
- assert.equal(c[2], 0x01, `${label}: format version 1`);
27
- assert.equal(c[3], expectTag, `${label}: tier tag ${expectTag.toString(16)}`);
28
- // Roundtrips exactly.
29
- assert.deepEqual(decompressSmart(c), data, `${label}: roundtrip`);
30
- }
31
- });
32
- test("large tier actually compresses better than raw (brotli 0x05)", () => {
33
- const data = buf("this is a long summary of a coding session. ", 900);
34
- const c = compressSmart(data);
35
- assert.ok(c.length < data.length, "compressed smaller than raw");
36
- assert.equal(c[3], 0x05, "tag is brotli-4");
37
- assert.deepEqual(decompressSmart(c), data);
38
- });
39
- test("legacy untagged gzip (0x1f magic) still decompresses", () => {
40
- const data = Buffer.from(JSON.stringify({ legacy: true }));
41
- const legacyGzip = gzipSync(data); // no tag byte, starts with 0x1f
42
- assert.equal(legacyGzip[0], 0x1f, "gzip magic present");
43
- assert.equal(detectFormat(legacyGzip), "legacy-gzip");
44
- assert.deepEqual(JSON.parse(decompressSmart(legacyGzip).toString()), { legacy: true });
45
- });
46
- test("legacy single-tag 0x03=brotli (the collision case) still decompresses", () => {
47
- const data = buf("legacy brotli payload ", 200);
48
- // Reconstruct the EXACT v0.1.0 legacy brotli frame: tag 0x03 + brotli payload.
49
- const legacy = Buffer.concat([Buffer.from([0x03]), brotliCompressSync(data)]);
50
- assert.equal(detectFormat(legacy), "legacy-tag");
51
- assert.deepEqual(decompressSmart(legacy), data, "legacy 0x03 brotli roundtrips");
52
- });
53
- test("detectFormat classifies all eras", () => {
54
- assert.equal(detectFormat(compressSmart(buf("q", 700))), "versioned");
55
- assert.equal(detectFormat(gzipSync(buf("q", 10))), "legacy-gzip");
56
- assert.equal(detectFormat(Buffer.from([0x00, 1, 2, 3])), "legacy-tag");
57
- assert.equal(detectFormat(Buffer.from([0x99, 0x88])), "unknown");
58
- });
59
- test("zstd helper roundtrips (async) and is not sync-decoded", async () => {
60
- const data = buf("zstd dr export payload ", 1500);
61
- const c = await compressZstd(data);
62
- assert.ok(c.length < data.length, "zstd compresses");
63
- // decompressSyncAuto reports zstd without throwing (caller awaits decompressZstd).
64
- const auto = decompressSyncAuto(c);
65
- assert.equal(auto.isZstd, true, "flagged as zstd");
66
- assert.deepEqual(await decompressZstd(c), data, "zstd roundtrip");
67
- });
68
- test("module loads without a top-level zstd import (Fix A: no load crash)", async () => {
69
- // The extension must load even when the @mongodb-js/zstd native addon is
70
- // absent (clean/allowScripts-blocked install). The dynamic import() lives
71
- // inside the helpers, so importing this module must never throw.
72
- const mod = await import("./compression.js");
73
- assert.equal(typeof mod.compressSmart, "function", "compressSmart exported");
74
- assert.equal(typeof mod.compressZstd, "function", "compressZstd exported");
75
- // The real invariant: no STATIC `import ... from "@mongodb-js/zstd"` at the
76
- // top level (that's what crashed the whole extension). zstd must be loaded
77
- // lazily inside the helpers only. Check the source text.
78
- const { readFileSync } = await import("node:fs");
79
- const { join } = await import("node:path");
80
- // Tests run with cwd at repo root (`node --test`), so resolve the source.
81
- const src = readFileSync(join(process.cwd(), "src/store/compression.ts"), "utf-8");
82
- const staticImport = /^import\s+.+\s+from\s+["']@mongodb-js\/zstd["'];?$/m;
83
- assert.equal(staticImport.test(src), false, "no static top-level import of @mongodb-js/zstd (would crash load if binary absent)");
84
- assert.ok(src.includes('await import("@mongodb-js/zstd")'), "zstd is loaded lazily via dynamic import() inside the helpers");
85
- });
86
- test("compressSmart escalates brotli quality with pressure (Fix E)", () => {
87
- // Large (>32KB) payloads hit the brotli tier; higher pressure → brotli-11
88
- // → smaller output than the default brotli-4, and still decodes.
89
- const words = Array.from({ length: 6000 }, (_, i) => "word" + ((i * 2654435761) % 9973));
90
- const big = Buffer.from(words.join(" "));
91
- const low = compressSmart(big, 0);
92
- const high = compressSmart(big, 1);
93
- assert.equal(isVersioned(low), true, "versioned header preserved at p=0");
94
- assert.equal(isVersioned(high), true, "versioned header preserved at p=1");
95
- assert.ok(high.length < low.length, "high pressure compresses smaller");
96
- assert.deepEqual(decompressSmart(low), big, "p=0 roundtrip");
97
- assert.deepEqual(decompressSmart(high), big, "p=1 roundtrip");
98
- // Small payloads ignore pressure (gzip tier) but still roundtrip.
99
- const small = buf("hello world ", 300);
100
- assert.deepEqual(decompressSmart(compressSmart(small, 1)), small, "small ignores pressure");
101
- // pressure out of range is clamped (no throw, still versioned + decodable).
102
- assert.deepEqual(decompressSmart(compressSmart(big, 5)), big, "over-pressure clamped");
103
- assert.deepEqual(decompressSmart(compressSmart(big, -1)), big, "under-pressure clamped");
104
- });
105
- test("pressureFromPct + preserveRecentForPressure scale with context (Fix E)", async () => {
106
- const { pressureFromPct, preserveRecentForPressure } = await import("../config.js");
107
- assert.equal(pressureFromPct(50), 0.5, "pct→pressure");
108
- assert.equal(pressureFromPct(null), 0, "null pct → 0");
109
- assert.equal(pressureFromPct(150), 1, "pct clamped");
110
- // low pressure keeps preserveRecent; high pressure compacts deeper (min floor).
111
- assert.equal(preserveRecentForPressure(0, 4, 2), 4, "p=0 → preserveRecent");
112
- assert.equal(preserveRecentForPressure(1, 4, 2), 2, "p=1 → preserveRecentMin");
113
- assert.equal(preserveRecentForPressure(0.5, 4, 2), 3, "p=0.5 → interpolates");
114
- assert.ok(preserveRecentForPressure(1, 4, 2) >= 2, "never below floor");
115
- });
116
- test("S24: pressureRatio + pressureBand + memoryReviewCadence unify the signal", async () => {
117
- const { pressureRatio, pressureBand, memoryReviewCadence } = await import("../config.js");
118
- // pressureRatio: current/threshold, clamped to [0,1].
119
- assert.equal(pressureRatio(50_000, 100_000), 0.5, "half threshold → 0.5");
120
- assert.equal(pressureRatio(0, 100_000), 0, "no tokens → 0");
121
- assert.equal(pressureRatio(10_000_000, 100_000), 1, "over threshold → clamped 1");
122
- assert.equal(pressureRatio(50_000, 0), 0, "zero threshold → 0");
123
- assert.equal(pressureRatio(NaN, 100_000), 0, "NaN current → 0");
124
- // pressureBand: discrete bands drive the toolbar/dashboard tier label.
125
- assert.equal(pressureBand(0.2), "low");
126
- assert.equal(pressureBand(0.5), "medium");
127
- assert.equal(pressureBand(0.75), "high");
128
- assert.equal(pressureBand(0.9), "ultra");
129
- assert.equal(pressureBand(1.0), "mega");
130
- assert.equal(pressureBand(2.0), "mega", "over 1 → mega");
131
- assert.equal(pressureBand(-1), "low", "below 0 → low");
132
- // memoryReviewCadence: higher pressure → smaller (more frequent) divisor.
133
- assert.equal(memoryReviewCadence("low", 10), 10, "low keeps base interval");
134
- assert.equal(memoryReviewCadence("medium", 10), 7, "medium shortens");
135
- assert.equal(memoryReviewCadence("high", 10), 5, "high halves");
136
- assert.equal(memoryReviewCadence("ultra", 10), 3, "ultra shortens more");
137
- assert.equal(memoryReviewCadence("mega", 10), 2, "mega near base/5");
138
- assert.equal(memoryReviewCadence("high", 0), 1, "never below 1");
139
- });
@@ -1,51 +0,0 @@
1
- import { test } from "node:test";
2
- import assert from "node:assert/strict";
3
- import { mkdtempSync, rmSync } from "node:fs";
4
- import { tmpdir } from "node:os";
5
- import { join } from "node:path";
6
- import { defaultEmbedder } from "../embedder.js";
7
- import { upsertMemoryEmbedding, searchMemoriesAsync, initMemoryIndex, closeMemoryIndex, isMemoryIndexDisabled, } from "./memoryIndex.js";
8
- const baseTmp = mkdtempSync(join(tmpdir(), "mc-memidx-"));
9
- test("memoryIndex: disabled when MEGACOMPACT_PGLITE_DISABLED", async () => {
10
- process.env.MEGACOMPACT_PGLITE_DISABLED = "true";
11
- try {
12
- assert.equal(isMemoryIndexDisabled(), true, "kill-switch honored");
13
- const hits = await searchMemoriesAsync(defaultEmbedder().embed("anything"), { k: 3 });
14
- assert.deepEqual(hits, [], "search returns [] when disabled");
15
- }
16
- finally {
17
- delete process.env.MEGACOMPACT_PGLITE_DISABLED;
18
- }
19
- });
20
- test("memoryIndex: cross-repo upsert + NN search returns the right repo's memory", async () => {
21
- // Isolate the global PGlite dir so concurrent test runs don't collide.
22
- process.env.MEGACOMPACT_INDEX_DIR = join(baseTmp, "index");
23
- const repoA = "/tmp/repo-a";
24
- const repoB = "/tmp/repo-b";
25
- try {
26
- await initMemoryIndex();
27
- // Two memories in different repos, with clearly distinct content so their
28
- // trigram embeddings separate.
29
- const vecA = defaultEmbedder().embed("We standardized on node:sqlite for the store backend");
30
- const vecB = defaultEmbedder().embed("The deployment target is a raspberry pi in the closet");
31
- await upsertMemoryEmbedding(repoA, 1, "We standardized on node:sqlite for the store backend", vecA);
32
- await upsertMemoryEmbedding(repoB, 7, "The deployment target is a raspberry pi in the closet", vecB);
33
- // Query close to A's content → top hit should be A's memory, not B's.
34
- const q = defaultEmbedder().embed("standardized node:sqlite store backend choice");
35
- const hits = await searchMemoriesAsync(q, { k: 3 });
36
- assert.ok(hits.length >= 1, "at least one hit");
37
- assert.equal(hits[0].repoId, repoA, "nearest neighbor is repo A");
38
- assert.equal(hits[0].memoryId, 1, "correct memory id");
39
- assert.ok(hits[0].score > 0.5, "high cosine for the matching memory");
40
- // Scope to repoB only → A must not appear.
41
- const scoped = await searchMemoriesAsync(q, { k: 3, repoId: repoB });
42
- assert.ok(scoped.every((h) => h.repoId === repoB), "scoped search stays within repoB");
43
- }
44
- finally {
45
- await closeMemoryIndex();
46
- delete process.env.MEGACOMPACT_INDEX_DIR;
47
- }
48
- });
49
- test("memoryIndex: cleanup", () => {
50
- rmSync(baseTmp, { recursive: true, force: true });
51
- });
@@ -1,139 +0,0 @@
1
- /**
2
- * migrate + recall integration test — Sprint 8 acceptance proofs.
3
- *
4
- * 1. Migration is lossless: a v0.1.0 `<sess>.checkpoints.json.gz` roundtrips
5
- * into SQLite with checkpoint count + regionHash set identical, and the JSON
6
- * file is retained as a DR snapshot.
7
- * 2. Cross-process recall: compact in one VectorStore, then recall via a FRESH
8
- * VectorStore over the SAME stateDir (re-opens the same sqlite.db file) — the
9
- * checkpoint must reappear. Mirrors Sprint 6.1's durability requirement.
10
- *
11
- * Uses MEGACOMPACT_STATE_DIR overrides; never the real user state dir.
12
- */
13
- import { test } from "node:test";
14
- import assert from "node:assert/strict";
15
- import { mkdtempSync, rmSync, existsSync } from "node:fs";
16
- import { tmpdir } from "node:os";
17
- import { join } from "node:path";
18
- import { VectorStore, vectorMarkInjected, vectorWasInjected, vectorSearch } from "../vectorStore.js";
19
- import { writeGzJson } from "../store.js";
20
- import { migrateJsonToSqlite, readLegacyCheckpointFile } from "../store/migrate.js";
21
- import { listCheckpoints, closeStore } from "../store/sqlite.js";
22
- const baseTmp = mkdtempSync(join(tmpdir(), "mc-migrate-"));
23
- let counter = 0;
24
- function stateDir() {
25
- return join(baseTmp, `run-${counter++}`);
26
- }
27
- function msgVec() {
28
- // Deterministic 8-dim vector.
29
- return [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8];
30
- }
31
- function fakeCheckpoints(sessionId) {
32
- return [
33
- {
34
- checkpointId: "chkpt_001",
35
- sessionId,
36
- summary: "Investigated the vector store and added a cosine helper.",
37
- topicSummary: "Added cosine similarity helper to vector store.",
38
- summaryHash: "a1b2c3d4e5f6a7b8",
39
- keyDecisions: ["use linear scan"],
40
- nextSteps: ["add tests"],
41
- filesModified: ["src/vectorStore.ts"],
42
- tokenEstimate: 1200,
43
- regionHash: "r1",
44
- embedding: msgVec(),
45
- timestamp: 1,
46
- },
47
- {
48
- checkpointId: "chkpt_002",
49
- sessionId,
50
- summary: "Refactored the recall path to dedupe against the window.",
51
- topicSummary: "Recall dedup against injected set.",
52
- summaryHash: "b2c3d4e5f6a7b8c9",
53
- keyDecisions: [],
54
- nextSteps: [],
55
- filesModified: ["src/recall.ts"],
56
- tokenEstimate: 900,
57
- regionHash: "r2",
58
- embedding: msgVec().map((v) => v + 0.01),
59
- timestamp: 2,
60
- },
61
- ];
62
- }
63
- test("migration: v0.1.0 JSON checkpoints migrate losslessly into SQLite", () => {
64
- const dir = stateDir();
65
- const sid = "sess_migrate_lossless";
66
- // Write a legacy JSON checkpoint file (the format v0.1.0 shipped).
67
- writeGzJson(join(dir, `${sid}.checkpoints.json.gz`), fakeCheckpoints(sid));
68
- const result = migrateJsonToSqlite(dir);
69
- assert.equal(result.sessionsScanned, 1);
70
- assert.equal(result.checkpointsMigrated, 2);
71
- assert.equal(result.alreadyPresent, 0);
72
- // SQLite now has both checkpoints, regionHash preserved.
73
- const migrated = listCheckpoints(sid, dir);
74
- assert.equal(migrated.length, 2, "both checkpoints present");
75
- assert.ok(migrated.every((c) => c.regionHash && c.regionHash.length > 0), "regionHash preserved");
76
- assert.deepEqual(migrated.map((c) => c.checkpointId).sort(), ["chkpt_001", "chkpt_002"]);
77
- // content_hash columns populated (needed by Sprint 9).
78
- const legacy = readLegacyCheckpointFile(sid, dir);
79
- assert.equal(legacy.length, 2, "legacy file intact (DR snapshot retained)");
80
- assert.ok(existsSync(join(dir, `${sid}.checkpoints.json.gz`)), "JSON DR snapshot retained");
81
- closeStore(dir);
82
- });
83
- test("migration: re-running is idempotent (no duplicates)", () => {
84
- const dir = stateDir();
85
- const sid = "sess_migrate_idem";
86
- writeGzJson(join(dir, `${sid}.checkpoints.json.gz`), fakeCheckpoints(sid));
87
- migrateJsonToSqlite(dir);
88
- const r2 = migrateJsonToSqlite(dir);
89
- assert.equal(r2.checkpointsMigrated, 0, "nothing new migrated");
90
- assert.equal(r2.alreadyPresent, 2, "both counted as already present");
91
- assert.equal(listCheckpoints(sid, dir).length, 2);
92
- closeStore(dir);
93
- });
94
- test("cross-process recall: fresh VectorStore over same dir recalls prior checkpoint", () => {
95
- const dir = stateDir();
96
- const sid = "sess_xproc";
97
- // Process A: compact a checkpoint into the store.
98
- const a = new VectorStore({ stateDir: dir });
99
- const added = a.add({
100
- sessionId: sid,
101
- summary: "Cross-process recall proof: persisted in process A.",
102
- topicSummary: "Persisted checkpoint in process A.",
103
- regionText: "cross process recall proof session A write path",
104
- tokenEstimate: 500,
105
- timestamp: 1,
106
- });
107
- assert.equal(added.deduped, false);
108
- assert.equal(added.checkpoint.checkpointId, "chkpt_001");
109
- // Force a clean reopen (simulates a new process opening the same file).
110
- closeStore(dir);
111
- // Process B: brand-new VectorStore, same stateDir.
112
- const b = new VectorStore({ stateDir: dir });
113
- const hits = vectorSearch(b, sid, "cross process recall proof", 5);
114
- assert.equal(hits.length, 1, "checkpoint survives cross-process reopen");
115
- assert.equal(hits[0].checkpoint.checkpointId, "chkpt_001");
116
- assert.ok(hits[0].score > 0.5, "recall is relevant");
117
- closeStore(dir);
118
- });
119
- test("cross-process recall: injected state persists across reopen", () => {
120
- const dir = stateDir();
121
- const sid = "sess_xproc_inj";
122
- const a = new VectorStore({ stateDir: dir });
123
- const added = a.add({
124
- sessionId: sid,
125
- summary: "A checkpoint to inject and remember across processes.",
126
- topicSummary: "Injected checkpoint.",
127
- regionText: "injected state persists across process reopen test",
128
- timestamp: 1,
129
- });
130
- vectorMarkInjected(a, sid, added.checkpoint.checkpointId);
131
- assert.equal(vectorWasInjected(a, sid, added.checkpoint.checkpointId), true);
132
- closeStore(dir);
133
- const b = new VectorStore({ stateDir: dir });
134
- assert.equal(vectorWasInjected(b, sid, added.checkpoint.checkpointId), true, "injection remembered");
135
- closeStore(dir);
136
- });
137
- test("cleanup", () => {
138
- rmSync(baseTmp, { recursive: true, force: true });
139
- });