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,77 +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 { VectorStore } from "./vectorStore.js";
7
- import { compactSession } from "./engine.js";
8
- import { recallAndInline } from "./recall.js";
9
- const baseTmp = mkdtempSync(join(tmpdir(), "mc-resume-"));
10
- let counter = 0;
11
- /** Two instances, SAME disk dir — simulates a fresh process / resumed session. */
12
- function storeForDir(dir) {
13
- return new VectorStore({ dedupSim: 0.9, stateDir: dir });
14
- }
15
- function msg(role, text, toolName) {
16
- return toolName ? { role, text, toolName, input: text, output: text } : { role, text };
17
- }
18
- const SESS = "sess_resume";
19
- /**
20
- * Simulate the extension's `recentUserQuery`: the resume query is built from the
21
- * newest user message in the (re-loaded) session. We model "newest user msg"
22
- * directly rather than going through pi's session manager.
23
- */
24
- function latestUserQuery(messages) {
25
- for (let i = messages.length - 1; i >= 0; i--) {
26
- if (messages[i].role === "user")
27
- return messages[i].text;
28
- }
29
- return "";
30
- }
31
- test("resume contract: compact in one process, recall in a fresh one from disk", () => {
32
- const dir = join(baseTmp, `run-${counter++}`);
33
- // --- Process 1: the original session compacts ---
34
- const writer = storeForDir(dir);
35
- const session = [
36
- msg("user", "investigated src/compact.ts and added a truncate helper"),
37
- msg("assistant", "added truncate", "Edit"),
38
- msg("user", "then wired it into the summary pipeline"),
39
- msg("assistant", "wired it in", "Edit"),
40
- ];
41
- const ran = compactSession({ sessionId: SESS, messages: session, keepFrom: session.length, timestamp: 1 }, writer);
42
- assert.equal(ran.skipped, false);
43
- assert.ok(ran.checkpointId, "a checkpoint was persisted");
44
- // --- Process 2: pi restarts, session resumes from disk ---
45
- const reader = storeForDir(dir); // brand new instance, same dir
46
- const resumeQuery = latestUserQuery(session); // newest user msg
47
- const r = recallAndInline({ sessionId: SESS, query: resumeQuery, limit: 3, source: "resume" }, reader);
48
- assert.equal(r.empty, false, "resume must re-surface the compacted context");
49
- assert.equal(r.toInject.length, 1);
50
- assert.equal(r.toInject[0].checkpoint.checkpointId, ran.checkpointId);
51
- assert.ok(r.block.includes("Recalled context"), "block is model-visible system-prompt text");
52
- });
53
- test("resume contract: nothing to recall for a brand-new session", () => {
54
- const dir = join(baseTmp, `run-${counter++}`);
55
- const fresh = storeForDir(dir);
56
- const r = recallAndInline({ sessionId: "sess_never_seen", query: "anything at all", limit: 3, source: "resume" }, fresh);
57
- assert.equal(r.empty, true);
58
- assert.equal(r.block, "");
59
- });
60
- test("resume contract: re-inject is deduped after the first recall", () => {
61
- const dir = join(baseTmp, `run-${counter++}`);
62
- const writer = storeForDir(dir);
63
- const session = [
64
- msg("user", "built the trigram embedder for the vector store"),
65
- msg("assistant", "built it", "Edit"),
66
- ];
67
- compactSession({ sessionId: SESS, messages: session, keepFrom: 2, timestamp: 1 }, writer);
68
- const reader = storeForDir(dir);
69
- const q = latestUserQuery(session);
70
- const first = recallAndInline({ sessionId: SESS, query: q, limit: 3, source: "resume" }, reader);
71
- const second = recallAndInline({ sessionId: SESS, query: q, limit: 3, source: "resume" }, reader);
72
- assert.equal(first.empty, false);
73
- assert.equal(second.empty, true, "second resume does not re-inject (sentinel)");
74
- });
75
- test("cleanup", () => {
76
- rmSync(baseTmp, { recursive: true, force: true });
77
- });
@@ -1,379 +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 { VectorStore } from "./vectorStore.js";
7
- import { compactSession } from "./engine.js";
8
- import { recallAndInline, recallAndInlineAsync, formatRecallBlock } from "./recall.js";
9
- import { vectorList, vectorWasInjected } from "./vectorStore.js";
10
- import { markInjectedGlobal, wasInjectedGlobal, closeIndexStore } from "./store/sqlite.js";
11
- import { closeVectorIndex, initVectorIndex, rebuildFromSqlite, } from "./store/vectorIndex.js";
12
- const baseTmp = mkdtempSync(join(tmpdir(), "mc-recall-"));
13
- let counter = 0;
14
- function store() {
15
- return new VectorStore({ dedupSim: 0.9, stateDir: join(baseTmp, `run-${counter++}`) });
16
- }
17
- function msg(role, text, toolName) {
18
- return toolName ? { role, text, toolName, input: text, output: text } : { role, text };
19
- }
20
- const SESS = "sess_recall";
21
- test("recallAndInline injects new hits and marks them injected", () => {
22
- const s = store();
23
- compactSession({ sessionId: SESS, messages: [msg("user", "investigated src/vectorStore.ts embedding"), msg("assistant", "ok", "Edit")], keepFrom: 2, timestamp: 1 }, s);
24
- compactSession({ sessionId: SESS, messages: [msg("user", "fixed the dedupe race in store.ts"), msg("assistant", "ok", "Edit")], keepFrom: 2, timestamp: 2 }, s);
25
- const r1 = recallAndInline({ sessionId: SESS, query: "vectorStore embedding", limit: 1, source: "command" }, s);
26
- assert.equal(r1.empty, false);
27
- assert.equal(r1.toInject.length, 1);
28
- assert.ok(r1.block.includes("Recalled context"));
29
- // Second call with the same query must NOT re-inject (shared dedup).
30
- const r2 = recallAndInline({ sessionId: SESS, query: "vectorStore embedding", limit: 1, source: "command" }, s);
31
- assert.equal(r2.empty, true);
32
- assert.equal(r2.toInject.length, 0);
33
- });
34
- test("recallAndInline skipInjected=false re-returns hits", () => {
35
- const s = store();
36
- compactSession({ sessionId: SESS, messages: [msg("user", "configured the fast gate threshold"), msg("assistant", "ok", "Edit")], keepFrom: 2, timestamp: 1 }, s);
37
- const r1 = recallAndInline({ sessionId: SESS, query: "fast gate threshold", limit: 5, source: "resume" }, s);
38
- const r2 = recallAndInline({ sessionId: SESS, query: "fast gate threshold", limit: 5, source: "resume", skipInjected: false }, s);
39
- assert.equal(r1.toInject.length, 1);
40
- assert.equal(r2.toInject.length, 1);
41
- });
42
- test("formatRecallBlock is empty for no hits", () => {
43
- assert.equal(formatRecallBlock([]), "");
44
- });
45
- test("formatRecallBlock (S17): labels a cross-repo hit with its source repo", () => {
46
- const hit = {
47
- checkpoint: { checkpointId: "chkpt_x", summary: "did thing Y", filesModified: ["a.ts"] },
48
- score: 0.91,
49
- repoId: "/home/u/rad-gateway",
50
- };
51
- const block = formatRecallBlock([hit]);
52
- assert.ok(block.includes("from repo"), "labels cross-repo source");
53
- assert.ok(block.includes("rad-gateway"), "includes the repo display name");
54
- });
55
- test("formatRecallBlock (S17): omits the label for same-repo hits (no repoId)", () => {
56
- const hit = {
57
- checkpoint: { checkpointId: "c1", summary: "s", filesModified: [] },
58
- score: 0.9,
59
- };
60
- const block = formatRecallBlock([hit]);
61
- assert.ok(!block.includes("from repo"), "no source label for same-repo hits");
62
- });
63
- test("recallAndInline empty when store has nothing for query", () => {
64
- const s = store();
65
- const r = recallAndInline({ sessionId: SESS, query: "no such topic exists here", limit: 5, source: "command" }, s);
66
- assert.equal(r.empty, true);
67
- assert.equal(r.block, "");
68
- });
69
- test("Fix C: recallMaxTokens caps the injected block", () => {
70
- const s = store();
71
- // Three distinct checkpoints so we can observe the cap bite mid-stream.
72
- compactSession({ sessionId: SESS, messages: [msg("user", "alpha module wiring and bootstrap sequence"), msg("assistant", "ok", "Edit")], keepFrom: 2, timestamp: 1 }, s);
73
- compactSession({ sessionId: SESS, messages: [msg("user", "beta module config and env resolution"), msg("assistant", "ok", "Edit")], keepFrom: 2, timestamp: 2 }, s);
74
- compactSession({ sessionId: SESS, messages: [msg("user", "gamma module shutdown and cleanup hooks"), msg("assistant", "ok", "Edit")], keepFrom: 2, timestamp: 3 }, s);
75
- // A ceiling of 50 tokens fits the first checkpoint (~33 body tokens) but
76
- // stops before the second (~65 cumulative) — proving the cap bites mid-stream.
77
- // (F3: the cap now counts body tokens only — one preamble at format time, not
78
- // N — matching the async path. The old per-hit preamble counting needed ~100.)
79
- const r = recallAndInline({ sessionId: SESS, query: "module wiring config shutdown", limit: 5, source: "command", recallMaxTokens: 50, skipInjected: false }, s);
80
- assert.ok(r.toInject.length >= 1, "at least one injected under the cap");
81
- assert.ok(r.toInject.length < 3, "cap prevented all three from injecting");
82
- assert.ok(r.block.length > 0, "block non-empty");
83
- });
84
- test("Fix C: inline dedupe drops a hit already resident in the live window", () => {
85
- const s = store();
86
- const resident = "alpha module wiring and bootstrap sequence";
87
- compactSession({ sessionId: SESS, messages: [msg("user", resident), msg("assistant", "ok", "Edit")], keepFrom: 2, timestamp: 1 }, s);
88
- compactSession({ sessionId: SESS, messages: [msg("user", "omega module telemetry and tracing spans"), msg("assistant", "ok", "Edit")], keepFrom: 2, timestamp: 2 }, s);
89
- // Baseline: with dedupe OFF, both checkpoints are candidates.
90
- const rNoDedup = recallAndInline({ sessionId: SESS, query: "module wiring telemetry", limit: 5, source: "command", skipInjected: false }, s);
91
- // The live window contains the exact summary of the first checkpoint — as it
92
- // would be if a prior recall already injected it. Inline dedupe must drop it
93
- // (strictly fewer injected than the no-dedupe baseline).
94
- const residentSummary = rNoDedup.toInject[0].checkpoint.summary;
95
- const rDedup = recallAndInline({ sessionId: SESS, query: "module wiring telemetry", limit: 5, source: "command", skipInjected: false, windowDedupe: true, liveWindow: [residentSummary], dedupSim: 0.9 }, s);
96
- assert.ok(rDedup.toInject.length <= rNoDedup.toInject.length, "dedupe never adds hits");
97
- assert.ok(rDedup.toInject.length < rNoDedup.toInject.length, "inline dedupe dropped a resident hit");
98
- });
99
- // ---- S18 cross-repo global injected-set (real-data, no mocks) ----------------
100
- //
101
- // Earlier versions of these tests used `as any` mock stores with canned
102
- // `searchAsync` returns. That was mock data: it asserted recall's orchestration
103
- // against a fake search result, not the real embed → HNSW → hydrate → inject
104
- // path. Per the no-mock-data principle, both tests now seed a REAL foreign
105
- // VectorStore (real checkpoint + real TrigramEmbedder embedding persisted to
106
- // SQLite), rebuild the real PGlite index from it via `rebuildFromSqlite`, and
107
- // run the full `recallAndInlineAsync` cross-repo path against a separate self
108
- // store. The foreign checkpoint hydrates from the foreign store via its real
109
- // repoId (== stateDir, per VectorStore's repoId convention).
110
- async function seedForeignRepo(foreignStateDir) {
111
- // A real VectorStore at the foreign repo's stateDir. repoId == stateDir.
112
- const foreign = new VectorStore({ stateDir: foreignStateDir, dedupSim: 0.9 });
113
- const sess = "sess_foreign";
114
- // Seed a real checkpoint via the real compactSession pipeline. The summary
115
- // text determines the embedding; the query below must land near it.
116
- const summary = "foreign repo authentication jwt token validation";
117
- const result = compactSession({
118
- sessionId: sess,
119
- messages: [msg("user", summary), msg("assistant", "ok", "Edit")],
120
- keepFrom: 2,
121
- timestamp: 1,
122
- }, foreign);
123
- return { sessionId: sess, checkpointId: result.checkpointId ?? "", summary };
124
- }
125
- test("S18: global injected-set skips a foreign checkpoint already injected machine-wide", async () => {
126
- if (process.env.MEGACOMPACT_PGLITE_DISABLED === "true") {
127
- return;
128
- } // skip when WASM index is off
129
- const indexDir = mkdtempSync(join(tmpdir(), "mc-gi-"));
130
- const foreignStateDir = mkdtempSync(join(tmpdir(), "mc-gi-foreign-"));
131
- const selfStateDir = mkdtempSync(join(tmpdir(), "mc-gi-self-"));
132
- process.env.MEGACOMPACT_VECTOR_INDEX_DIR = mkdtempSync(join(tmpdir(), "mc-gi-vidx-"));
133
- try {
134
- await closeVectorIndex(); // fresh singleton per this index dir
135
- const seed = await seedForeignRepo(foreignStateDir);
136
- // Populate the real PGlite index from the foreign store's real checkpoints.
137
- await rebuildFromSqlite(() => [{ repoId: foreignStateDir, stateDir: foreignStateDir }], (sd) => {
138
- // readCheckpoints: yield (sessionId, checkpointId, embedding) for every
139
- // real checkpoint in this store. Mirrors the production enumerator.
140
- const store = new VectorStore({ stateDir: sd, dedupSim: 0.9 });
141
- return vectorList(store, seed.sessionId).map((cp) => ({
142
- sessionId: seed.sessionId,
143
- checkpointId: cp.checkpointId,
144
- embedding: cp.embedding,
145
- }));
146
- });
147
- const pg = await initVectorIndex();
148
- assert.ok(pg, "PGlite index should initialize (WASM available)");
149
- const sess = "sess_cross";
150
- // Pre-mark the foreign checkpoint as already injected machine-wide.
151
- markInjectedGlobal(seed.checkpointId, foreignStateDir, sess, indexDir);
152
- assert.equal(wasInjectedGlobal(seed.checkpointId, sess, indexDir), true);
153
- // Self store (different repo) — the cross-repo query runs against the index.
154
- const selfStore = new VectorStore({ stateDir: selfStateDir, dedupSim: 0.9 });
155
- const r = await recallAndInlineAsync({ sessionId: sess, query: "foreign repo authentication jwt", limit: 3, source: "command", crossRepo: true, globalIndexDir: indexDir }, selfStore);
156
- assert.equal(r.toInject.length, 0, "globally-injected foreign checkpoint skipped");
157
- }
158
- finally {
159
- await closeVectorIndex();
160
- closeIndexStore();
161
- delete process.env.MEGACOMPACT_VECTOR_INDEX_DIR;
162
- rmSync(indexDir, { recursive: true, force: true });
163
- rmSync(foreignStateDir, { recursive: true, force: true });
164
- rmSync(selfStateDir, { recursive: true, force: true });
165
- }
166
- });
167
- test("S18: a fresh foreign checkpoint is injected AND recorded globally", async () => {
168
- if (process.env.MEGACOMPACT_PGLITE_DISABLED === "true") {
169
- return;
170
- } // skip when WASM index is off
171
- const indexDir = mkdtempSync(join(tmpdir(), "mc-gi2-"));
172
- const foreignStateDir = mkdtempSync(join(tmpdir(), "mc-gi2-foreign-"));
173
- const selfStateDir = mkdtempSync(join(tmpdir(), "mc-gi2-self-"));
174
- process.env.MEGACOMPACT_VECTOR_INDEX_DIR = mkdtempSync(join(tmpdir(), "mc-gi2-vidx-"));
175
- try {
176
- await closeVectorIndex(); // fresh singleton per this index dir
177
- const seed = await seedForeignRepo(foreignStateDir);
178
- assert.equal(wasInjectedGlobal(seed.checkpointId, "sess_fresh", indexDir), false);
179
- await rebuildFromSqlite(() => [{ repoId: foreignStateDir, stateDir: foreignStateDir }], (sd) => {
180
- const store = new VectorStore({ stateDir: sd, dedupSim: 0.9 });
181
- return vectorList(store, seed.sessionId).map((cp) => ({
182
- sessionId: seed.sessionId,
183
- checkpointId: cp.checkpointId,
184
- embedding: cp.embedding,
185
- }));
186
- });
187
- const pg = await initVectorIndex();
188
- assert.ok(pg, "PGlite index should initialize (WASM available)");
189
- const sess = "sess_fresh";
190
- const selfStore = new VectorStore({ stateDir: selfStateDir, dedupSim: 0.9 });
191
- const r = await recallAndInlineAsync({ sessionId: sess, query: "foreign repo authentication jwt", limit: 3, source: "command", crossRepo: true, globalIndexDir: indexDir }, selfStore);
192
- assert.equal(r.toInject.length, 1, "fresh foreign checkpoint injected");
193
- assert.equal(wasInjectedGlobal(seed.checkpointId, sess, indexDir), true, "recorded machine-wide");
194
- }
195
- finally {
196
- await closeVectorIndex();
197
- closeIndexStore();
198
- delete process.env.MEGACOMPACT_VECTOR_INDEX_DIR;
199
- rmSync(indexDir, { recursive: true, force: true });
200
- rmSync(foreignStateDir, { recursive: true, force: true });
201
- rmSync(selfStateDir, { recursive: true, force: true });
202
- }
203
- });
204
- // ---- F3: format-once — one preamble, [1..n] numbering, cap respected ----
205
- //
206
- // The fix (landed async, extended to sync here) accumulates the hit list and
207
- // calls formatRecallBlock ONCE at the end, so a multi-hit block carries exactly
208
- // one preamble and contiguous [1..n] labels instead of one preamble per hit.
209
- test("F3 (sync): multi-hit injection has exactly one preamble and [1..n] numbering", () => {
210
- const s = store();
211
- compactSession({ sessionId: SESS, messages: [msg("user", "alpha module wiring and bootstrap sequence"), msg("assistant", "ok", "Edit")], keepFrom: 2, timestamp: 1 }, s);
212
- compactSession({ sessionId: SESS, messages: [msg("user", "beta module config and env resolution"), msg("assistant", "ok", "Edit")], keepFrom: 2, timestamp: 2 }, s);
213
- compactSession({ sessionId: SESS, messages: [msg("user", "gamma module shutdown and cleanup hooks"), msg("assistant", "ok", "Edit")], keepFrom: 2, timestamp: 3 }, s);
214
- const r = recallAndInline({ sessionId: SESS, query: "module wiring config shutdown", limit: 5, source: "command", skipInjected: false }, s);
215
- assert.ok(r.toInject.length >= 2, "at least two hits injected (got " + r.toInject.length + ")");
216
- // Exactly one preamble (the old per-hit format produced one per hit).
217
- const preamble = "The following compacted context was recalled";
218
- assert.equal(r.block.split(preamble).length - 1, 1, "exactly one preamble for a multi-hit block");
219
- // Contiguous [1..n] numbering.
220
- for (let i = 1; i <= r.toInject.length; i++) {
221
- assert.ok(r.block.includes(`[${i}]`), `block includes [${i}]`);
222
- }
223
- // No out-of-range label (e.g. [n+1]) leaks in.
224
- assert.ok(!r.block.includes(`[${r.toInject.length + 1}]`), "no extra-numbered label");
225
- });
226
- test("F3 (sync): recallMaxTokens caps mid-stream with exactly one preamble", () => {
227
- const s = store();
228
- compactSession({ sessionId: SESS, messages: [msg("user", "alpha module wiring and bootstrap sequence"), msg("assistant", "ok", "Edit")], keepFrom: 2, timestamp: 1 }, s);
229
- compactSession({ sessionId: SESS, messages: [msg("user", "beta module config and env resolution"), msg("assistant", "ok", "Edit")], keepFrom: 2, timestamp: 2 }, s);
230
- compactSession({ sessionId: SESS, messages: [msg("user", "gamma module shutdown and cleanup hooks"), msg("assistant", "ok", "Edit")], keepFrom: 2, timestamp: 3 }, s);
231
- // A tight ceiling that fits the first checkpoint (~33 body tokens) but stops
232
- // before the second (~65 cumulative). F3: body-only counting (one preamble at
233
- // format time, not per hit), matching the async path.
234
- const r = recallAndInline({ sessionId: SESS, query: "module wiring config shutdown", limit: 5, source: "command", skipInjected: false, recallMaxTokens: 50 }, s);
235
- assert.ok(r.toInject.length < 3, "cap stopped before all three injected");
236
- assert.ok(r.toInject.length >= 1, "at least one injected under the cap");
237
- assert.equal(r.block.split("The following compacted context was recalled").length - 1, 1, "still exactly one preamble under the cap");
238
- });
239
- test("F3 (async): multi-hit cross-repo injection has exactly one preamble and [1..n] numbering", async () => {
240
- if (process.env.MEGACOMPACT_PGLITE_DISABLED === "true") {
241
- return;
242
- } // skip when WASM index is off
243
- const indexDir = mkdtempSync(join(tmpdir(), "mc-f3a-"));
244
- const foreignStateDir = mkdtempSync(join(tmpdir(), "mc-f3a-foreign-"));
245
- const selfStateDir = mkdtempSync(join(tmpdir(), "mc-f3a-self-"));
246
- process.env.MEGACOMPACT_VECTOR_INDEX_DIR = mkdtempSync(join(tmpdir(), "mc-f3a-vidx-"));
247
- try {
248
- await closeVectorIndex();
249
- // Seed multiple distinct foreign checkpoints so the cross-repo query yields
250
- // more than one hit (needed to assert [1..n] numbering).
251
- const foreign = new VectorStore({ stateDir: foreignStateDir, dedupSim: 0.9 });
252
- const fsess = "sess_foreign_f3";
253
- const summaries = [
254
- "foreign repo authentication jwt token validation",
255
- "foreign repo database connection pooling and retry",
256
- "foreign repo logging telemetry and tracing spans",
257
- ];
258
- const cids = [];
259
- for (let i = 0; i < summaries.length; i++) {
260
- const res = compactSession({ sessionId: fsess, messages: [msg("user", summaries[i]), msg("assistant", "ok", "Edit")], keepFrom: 2, timestamp: i + 1 }, foreign);
261
- if (res.checkpointId)
262
- cids.push(res.checkpointId);
263
- }
264
- await rebuildFromSqlite(() => [{ repoId: foreignStateDir, stateDir: foreignStateDir }], (sd) => {
265
- const st = new VectorStore({ stateDir: sd, dedupSim: 0.9 });
266
- return vectorList(st, fsess).map((cp) => ({
267
- sessionId: fsess, checkpointId: cp.checkpointId, embedding: cp.embedding,
268
- }));
269
- });
270
- const pg = await initVectorIndex();
271
- assert.ok(pg, "PGlite index should initialize");
272
- const selfStore = new VectorStore({ stateDir: selfStateDir, dedupSim: 0.9 });
273
- const r = await recallAndInlineAsync({ sessionId: "sess_f3", query: "foreign repo", limit: 5, source: "command", crossRepo: true, skipInjected: false, globalIndexDir: indexDir }, selfStore);
274
- assert.ok(r.toInject.length >= 2, "at least two cross-repo hits (got " + r.toInject.length + ")");
275
- assert.equal(r.block.split("The following compacted context was recalled").length - 1, 1, "exactly one preamble for a multi-hit async block");
276
- for (let i = 1; i <= r.toInject.length; i++) {
277
- assert.ok(r.block.includes(`[${i}]`), `async block includes [${i}]`);
278
- }
279
- assert.ok(!r.block.includes(`[${r.toInject.length + 1}]`), "no extra-numbered label (async)");
280
- }
281
- finally {
282
- await closeVectorIndex();
283
- closeIndexStore();
284
- delete process.env.MEGACOMPACT_VECTOR_INDEX_DIR;
285
- rmSync(indexDir, { recursive: true, force: true });
286
- rmSync(foreignStateDir, { recursive: true, force: true });
287
- rmSync(selfStateDir, { recursive: true, force: true });
288
- }
289
- });
290
- // ---- F2: cross-repo injected-set bypass ----------------------------------
291
- //
292
- // When the same session resumes in a DIFFERENT repo, the per-repo session_state
293
- // has no injection marker for the foreign checkpoint (different stateDir), so
294
- // only the machine-wide injected-set (shared globalIndexDir) can block a
295
- // re-inject. The F2 fix ensures globalIndexDir is always resolved (via
296
- // getIndexDir in the extension), so wasInjectedGlobal is consulted; without
297
- // the fix, globalIndexDir was undefined and foreign checkpoints re-injected
298
- // every resume. This test passes globalIndexDir explicitly (simulating the
299
- // resolver default) and does NOT set MEGACOMPACT_INDEX_DIR.
300
- test("F2: cross-repo hit is not re-injected when resuming the same session in a different repo (shared index dir)", async () => {
301
- if (process.env.MEGACOMPACT_PGLITE_DISABLED === "true") {
302
- return;
303
- } // skip when WASM index is off
304
- const indexDir = mkdtempSync(join(tmpdir(), "mc-f2-"));
305
- const foreignStateDir = mkdtempSync(join(tmpdir(), "mc-f2-foreign-"));
306
- const selfStateDir1 = mkdtempSync(join(tmpdir(), "mc-f2-self1-"));
307
- const selfStateDir2 = mkdtempSync(join(tmpdir(), "mc-f2-self2-"));
308
- process.env.MEGACOMPACT_VECTOR_INDEX_DIR = mkdtempSync(join(tmpdir(), "mc-f2-vidx-"));
309
- try {
310
- await closeVectorIndex();
311
- const seed = await seedForeignRepo(foreignStateDir);
312
- await rebuildFromSqlite(() => [{ repoId: foreignStateDir, stateDir: foreignStateDir }], (sd) => {
313
- const st = new VectorStore({ stateDir: sd, dedupSim: 0.9 });
314
- return vectorList(st, seed.sessionId).map((cp) => ({
315
- sessionId: seed.sessionId, checkpointId: cp.checkpointId, embedding: cp.embedding,
316
- }));
317
- });
318
- const pg = await initVectorIndex();
319
- assert.ok(pg, "PGlite index should initialize");
320
- const sess = "sess_resume";
321
- // Repo B: first recall — fresh foreign checkpoint is injected AND recorded
322
- // in the shared machine-wide index.
323
- const storeB = new VectorStore({ stateDir: selfStateDir1, dedupSim: 0.9 });
324
- const r1 = await recallAndInlineAsync({ sessionId: sess, query: "foreign repo authentication jwt", limit: 3, source: "command", crossRepo: true, globalIndexDir: indexDir }, storeB);
325
- assert.equal(r1.toInject.length, 1, "first recall (repo B) injects the foreign checkpoint");
326
- assert.equal(wasInjectedGlobal(seed.checkpointId, sess, indexDir), true, "recorded in the shared index");
327
- // Repo C: SAME session resumed in a DIFFERENT repo. The per-session injected
328
- // set in repo C's store is empty (different stateDir), so only the shared
329
- // global injected-set can block re-injection.
330
- const storeC = new VectorStore({ stateDir: selfStateDir2, dedupSim: 0.9 });
331
- assert.equal(vectorWasInjected(storeC, sess, seed.checkpointId), false, "repo C per-session set is empty (different stateDir)");
332
- const r2 = await recallAndInlineAsync({ sessionId: sess, query: "foreign repo authentication jwt", limit: 3, source: "command", crossRepo: true, globalIndexDir: indexDir }, storeC);
333
- assert.equal(r2.toInject.length, 0, "second recall (repo C) does NOT re-inject (machine-wide global dedup)");
334
- }
335
- finally {
336
- await closeVectorIndex();
337
- closeIndexStore();
338
- delete process.env.MEGACOMPACT_VECTOR_INDEX_DIR;
339
- rmSync(indexDir, { recursive: true, force: true });
340
- rmSync(foreignStateDir, { recursive: true, force: true });
341
- rmSync(selfStateDir1, { recursive: true, force: true });
342
- rmSync(selfStateDir2, { recursive: true, force: true });
343
- }
344
- });
345
- test("F2: without globalIndexDir, cross-repo hits are skipped (not injected undeduped)", async () => {
346
- if (process.env.MEGACOMPACT_PGLITE_DISABLED === "true") {
347
- return;
348
- } // skip when WASM index is off
349
- const foreignStateDir = mkdtempSync(join(tmpdir(), "mc-f2b-foreign-"));
350
- const selfStateDir = mkdtempSync(join(tmpdir(), "mc-f2b-self-"));
351
- process.env.MEGACOMPACT_VECTOR_INDEX_DIR = mkdtempSync(join(tmpdir(), "mc-f2b-vidx-"));
352
- try {
353
- await closeVectorIndex();
354
- const seed = await seedForeignRepo(foreignStateDir);
355
- await rebuildFromSqlite(() => [{ repoId: foreignStateDir, stateDir: foreignStateDir }], (sd) => {
356
- const st = new VectorStore({ stateDir: sd, dedupSim: 0.9 });
357
- return vectorList(st, seed.sessionId).map((cp) => ({
358
- sessionId: seed.sessionId, checkpointId: cp.checkpointId, embedding: cp.embedding,
359
- }));
360
- });
361
- const pg = await initVectorIndex();
362
- assert.ok(pg, "PGlite index should initialize");
363
- // No globalIndexDir → the F2 guard skips foreign hits rather than injecting
364
- // them undeduped. Same-repo hits (none here) would still pass.
365
- const selfStore = new VectorStore({ stateDir: selfStateDir, dedupSim: 0.9 });
366
- const r = await recallAndInlineAsync({ sessionId: "sess_nodir", query: "foreign repo authentication jwt", limit: 3, source: "command", crossRepo: true }, selfStore);
367
- assert.equal(r.toInject.length, 0, "foreign hit skipped when globalIndexDir is unset (no undeduped injection)");
368
- }
369
- finally {
370
- await closeVectorIndex();
371
- closeIndexStore();
372
- delete process.env.MEGACOMPACT_VECTOR_INDEX_DIR;
373
- rmSync(foreignStateDir, { recursive: true, force: true });
374
- rmSync(selfStateDir, { recursive: true, force: true });
375
- }
376
- });
377
- test("cleanup", () => {
378
- rmSync(baseTmp, { recursive: true, force: true });
379
- });