pi-mega-compact 0.11.4 → 0.11.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (381) hide show
  1. package/dist/extensions/dashboard-server/api-contracts/cache-stripes.js +8 -0
  2. package/dist/extensions/dashboard-server/api-contracts/endpoints.js +32 -0
  3. package/dist/extensions/dashboard-server/api-contracts/memory-map.js +1 -0
  4. package/dist/extensions/dashboard-server/api-contracts/memory.js +8 -0
  5. package/dist/extensions/dashboard-server/api-contracts/provider-cache.js +1 -0
  6. package/dist/extensions/dashboard-server/api-contracts/setup.js +10 -0
  7. package/dist/extensions/dashboard-server/index-reader.js +6 -2
  8. package/dist/extensions/dashboard-server/routes-cache.js +135 -47
  9. package/dist/extensions/dashboard-server/routes-game.js +3 -0
  10. package/dist/extensions/dashboard-server/routes-memory-map.js +50 -0
  11. package/dist/extensions/dashboard-server/routes-memory.js +51 -0
  12. package/dist/extensions/dashboard-server/routes-repo.js +2 -2
  13. package/dist/extensions/dashboard-server/routes-setup.js +267 -0
  14. package/dist/extensions/dashboard-server/routes.js +4 -0
  15. package/dist/extensions/dashboard-server/server.js +13 -1
  16. package/dist/extensions/mega-commands.js +189 -1
  17. package/dist/extensions/mega-compact.js +5 -0
  18. package/dist/extensions/mega-config.js +7 -0
  19. package/dist/extensions/mega-events/agent-handlers.js +19 -4
  20. package/dist/extensions/mega-events/compact-handlers.js +1 -0
  21. package/dist/extensions/mega-events/context-handler.js +45 -92
  22. package/dist/extensions/mega-events/context-hwm.js +51 -0
  23. package/dist/extensions/mega-events/error-classifier.js +16 -5
  24. package/dist/extensions/mega-events/mirror-append.js +107 -0
  25. package/dist/extensions/mega-events/outage-advisor.js +7 -1
  26. package/dist/extensions/mega-events/perf-handler.js +134 -2
  27. package/dist/extensions/mega-events/recall-tail.js +59 -0
  28. package/dist/extensions/mega-events/separated-prompt.js +248 -0
  29. package/dist/extensions/mega-events/session-handlers.js +15 -8
  30. package/dist/extensions/mega-runtime/env-loader.js +56 -0
  31. package/dist/extensions/mega-runtime/reset-runtime.js +6 -0
  32. package/dist/extensions/mega-runtime/runtime-snapshot.js +1 -0
  33. package/dist/extensions/mega-runtime/runtime.js +7 -0
  34. package/dist/extensions/mega-runtime/snapshot.js +1 -0
  35. package/dist/extensions/mega-runtime/widget.js +5 -0
  36. package/dist/src/cache-stripe-impl.js +288 -0
  37. package/dist/src/cache-stripe.js +11 -0
  38. package/dist/src/config/stopwords.js +24 -0
  39. package/dist/src/config.js +17 -0
  40. package/dist/src/embedder.js +41 -2
  41. package/dist/src/memoryGraph.js +299 -0
  42. package/dist/src/memoryStats.js +75 -0
  43. package/dist/src/monitoring.js +13 -0
  44. package/dist/src/prefix-break.js +43 -0
  45. package/dist/src/pricing.js +1 -1
  46. package/dist/src/queryExpansion.js +163 -0
  47. package/dist/src/queryReformulation/cache.js +123 -0
  48. package/dist/src/queryReformulation/rrf.js +29 -0
  49. package/dist/src/queryReformulation/tfidf.js +61 -0
  50. package/dist/src/queryReformulation/vagueness.js +33 -0
  51. package/dist/src/queryReformulation.js +225 -0
  52. package/dist/src/recallMetrics.js +258 -0
  53. package/dist/src/store/sqlite/cache-stripes.js +133 -0
  54. package/dist/src/store/sqlite/fts5-search.js +68 -0
  55. package/dist/src/store/sqlite/perf-samples.js +145 -16
  56. package/dist/src/store/sqlite/schema.js +60 -1
  57. package/dist/src/store/sqlite.js +1 -0
  58. package/dist/src/store/turns/memory-store.js +8 -0
  59. package/dist/src/store/turns/sqlite-store.js +14 -3
  60. package/dist/src/store/turns/types.js +18 -1
  61. package/dist/src/store/vectorIndex.js +55 -10
  62. package/dist/src/tiered-router/types.js +18 -0
  63. package/dist/src/tieredRouter.js +421 -0
  64. package/dist/src/vectorStore.js +8 -6
  65. package/extensions/dashboard-client/dist/assets/{AchievementTiles-vEo2MtE2.js → AchievementTiles-DR9cLGDL.js} +2 -2
  66. package/extensions/dashboard-client/dist/assets/{AchievementTiles-vEo2MtE2.js.map → AchievementTiles-DR9cLGDL.js.map} +1 -1
  67. package/extensions/dashboard-client/dist/assets/AchievementsTab-svNUgJ1e.js +2 -0
  68. package/extensions/dashboard-client/dist/assets/{AchievementsTab-DjxfYrDc.js.map → AchievementsTab-svNUgJ1e.js.map} +1 -1
  69. package/extensions/dashboard-client/dist/assets/CacheTab-ASwhOMjR.js +2 -0
  70. package/extensions/dashboard-client/dist/assets/CacheTab-ASwhOMjR.js.map +1 -0
  71. package/extensions/dashboard-client/dist/assets/{ConfigTab-Cm6ymbmx.js → ConfigTab-CmmWheuW.js} +2 -2
  72. package/extensions/dashboard-client/dist/assets/{ConfigTab-Cm6ymbmx.js.map → ConfigTab-CmmWheuW.js.map} +1 -1
  73. package/extensions/dashboard-client/dist/assets/{EventsTab-DXWl_YzI.js → EventsTab-CFE7jLsa.js} +2 -2
  74. package/extensions/dashboard-client/dist/assets/{EventsTab-DXWl_YzI.js.map → EventsTab-CFE7jLsa.js.map} +1 -1
  75. package/extensions/dashboard-client/dist/assets/GameTab-CJAX_th_.js +2 -0
  76. package/extensions/dashboard-client/dist/assets/{GameTab-BLDudcO5.js.map → GameTab-CJAX_th_.js.map} +1 -1
  77. package/extensions/dashboard-client/dist/assets/{MaintenanceTab-DLkKCztn.js → MaintenanceTab-P4SUsvMf.js} +2 -2
  78. package/extensions/dashboard-client/dist/assets/{MaintenanceTab-DLkKCztn.js.map → MaintenanceTab-P4SUsvMf.js.map} +1 -1
  79. package/extensions/dashboard-client/dist/assets/MemoryMapTab-BBiH76eF.js +2 -0
  80. package/extensions/dashboard-client/dist/assets/MemoryMapTab-BBiH76eF.js.map +1 -0
  81. package/extensions/dashboard-client/dist/assets/{MetricsTab-Cq4u-rZF.js → MetricsTab-CHQscixy.js} +2 -2
  82. package/extensions/dashboard-client/dist/assets/{MetricsTab-Cq4u-rZF.js.map → MetricsTab-CHQscixy.js.map} +1 -1
  83. package/extensions/dashboard-client/dist/assets/OverviewTab-DBs4DJdd.js +2 -0
  84. package/extensions/dashboard-client/dist/assets/{OverviewTab-D4kGvsiQ.js.map → OverviewTab-DBs4DJdd.js.map} +1 -1
  85. package/extensions/dashboard-client/dist/assets/ReposTab-DeFz76L5.js +2 -0
  86. package/extensions/dashboard-client/dist/assets/ReposTab-DeFz76L5.js.map +1 -0
  87. package/extensions/dashboard-client/dist/assets/{SessionsTab-DZC2-GCn.js → SessionsTab-BWNsj1OB.js} +2 -2
  88. package/extensions/dashboard-client/dist/assets/{SessionsTab-DZC2-GCn.js.map → SessionsTab-BWNsj1OB.js.map} +1 -1
  89. package/extensions/dashboard-client/dist/assets/SetupTab-uS6A0xmw.js +2 -0
  90. package/extensions/dashboard-client/dist/assets/SetupTab-uS6A0xmw.js.map +1 -0
  91. package/extensions/dashboard-client/dist/assets/TimeSavedCard-CiqCOQuL.js +2 -0
  92. package/extensions/dashboard-client/dist/assets/TimeSavedCard-CiqCOQuL.js.map +1 -0
  93. package/extensions/dashboard-client/dist/assets/{TopicsTab-01G71hv1.js → TopicsTab-BWWQxltv.js} +2 -2
  94. package/extensions/dashboard-client/dist/assets/{TopicsTab-01G71hv1.js.map → TopicsTab-BWWQxltv.js.map} +1 -1
  95. package/extensions/dashboard-client/dist/assets/{TurnsTab-DLRg0LZT.js → TurnsTab-CVz4f4-o.js} +2 -2
  96. package/extensions/dashboard-client/dist/assets/{TurnsTab-DLRg0LZT.js.map → TurnsTab-CVz4f4-o.js.map} +1 -1
  97. package/extensions/dashboard-client/dist/assets/format-COjDIVGj.js +2 -0
  98. package/extensions/dashboard-client/dist/assets/format-COjDIVGj.js.map +1 -0
  99. package/extensions/dashboard-client/dist/assets/index-CUNn22iV.css +1 -0
  100. package/extensions/dashboard-client/dist/assets/index-DrktNOoT.js +42 -0
  101. package/extensions/dashboard-client/dist/assets/index-DrktNOoT.js.map +1 -0
  102. package/extensions/dashboard-client/dist/assets/pricing-CvE4NllQ.js +2 -0
  103. package/extensions/dashboard-client/dist/assets/pricing-CvE4NllQ.js.map +1 -0
  104. package/extensions/dashboard-client/dist/assets/{useSSE-BBYt5UPB.js → useSSE-Bf5LOLSi.js} +2 -2
  105. package/extensions/dashboard-client/dist/assets/{useSSE-BBYt5UPB.js.map → useSSE-Bf5LOLSi.js.map} +1 -1
  106. package/extensions/dashboard-client/dist/index.html +2 -2
  107. package/extensions/dashboard-client/src/App.tsx +28 -8
  108. package/extensions/dashboard-client/src/api/client.ts +29 -0
  109. package/extensions/dashboard-client/src/components/ActiveReposTable.tsx +21 -12
  110. package/extensions/dashboard-client/src/components/CacheHitRateTrendCard.tsx +100 -0
  111. package/extensions/dashboard-client/src/components/ProviderCacheCard.tsx +56 -0
  112. package/extensions/dashboard-client/src/components/SavingsByModelTable.tsx +38 -57
  113. package/extensions/dashboard-client/src/components/StripeDistributionCard.tsx +110 -0
  114. package/extensions/dashboard-client/src/components/TabBar.tsx +49 -4
  115. package/extensions/dashboard-client/src/main.tsx +1 -0
  116. package/extensions/dashboard-client/src/styles/base.css +30 -0
  117. package/extensions/dashboard-client/src/styles/cache.css +167 -0
  118. package/extensions/dashboard-client/src/tabs/CacheTab.tsx +75 -12
  119. package/extensions/dashboard-client/src/tabs/MemoryMapTab.tsx +440 -0
  120. package/extensions/dashboard-client/src/tabs/SetupTab.tsx +418 -0
  121. package/extensions/dashboard-client/tsconfig.json +3 -2
  122. package/extensions/dashboard-client/vite.config.ts +2 -0
  123. package/extensions/dashboard-server/api-contracts/cache-stripes.ts +49 -0
  124. package/extensions/dashboard-server/api-contracts/endpoints.ts +66 -3
  125. package/extensions/dashboard-server/api-contracts/index.ts +22 -0
  126. package/extensions/dashboard-server/api-contracts/memory-map.ts +50 -0
  127. package/extensions/dashboard-server/api-contracts/memory.ts +27 -0
  128. package/extensions/dashboard-server/api-contracts/multi-repo.ts +231 -231
  129. package/extensions/dashboard-server/api-contracts/provider-cache.ts +37 -0
  130. package/extensions/dashboard-server/api-contracts/setup.ts +80 -0
  131. package/extensions/dashboard-server/index-reader.ts +138 -121
  132. package/extensions/dashboard-server/routes-cache.ts +186 -75
  133. package/extensions/dashboard-server/routes-game.ts +3 -0
  134. package/extensions/dashboard-server/routes-memory-map.ts +105 -0
  135. package/extensions/dashboard-server/routes-memory.ts +63 -0
  136. package/extensions/dashboard-server/routes-repo.ts +36 -36
  137. package/extensions/dashboard-server/routes-setup.ts +293 -0
  138. package/extensions/dashboard-server/routes.ts +4 -0
  139. package/extensions/dashboard-server/server.ts +12 -0
  140. package/extensions/mega-commands.ts +211 -1
  141. package/extensions/mega-compact.ts +5 -0
  142. package/extensions/mega-config.ts +27 -0
  143. package/extensions/mega-events/agent-handlers.ts +20 -4
  144. package/extensions/mega-events/compact-handlers.ts +1 -0
  145. package/extensions/mega-events/context-handler.ts +53 -110
  146. package/extensions/mega-events/context-hwm.ts +85 -0
  147. package/extensions/mega-events/error-classifier.ts +15 -4
  148. package/extensions/mega-events/mirror-append.ts +155 -0
  149. package/extensions/mega-events/outage-advisor.ts +11 -5
  150. package/extensions/mega-events/perf-handler.ts +190 -6
  151. package/extensions/mega-events/recall-tail.ts +88 -0
  152. package/extensions/mega-events/separated-prompt.ts +329 -0
  153. package/extensions/mega-events/session-handlers.ts +14 -7
  154. package/extensions/mega-runtime/env-loader.ts +55 -0
  155. package/extensions/mega-runtime/helpers.ts +14 -0
  156. package/extensions/mega-runtime/reset-runtime.ts +6 -0
  157. package/extensions/mega-runtime/runtime-snapshot.ts +1 -0
  158. package/extensions/mega-runtime/runtime.ts +7 -0
  159. package/extensions/mega-runtime/snapshot.ts +6 -0
  160. package/extensions/mega-runtime/widget-types.ts +3 -0
  161. package/extensions/mega-runtime/widget.ts +5 -0
  162. package/package.json +5 -2
  163. package/src/cache-stripe-impl.ts +385 -0
  164. package/src/cache-stripe.ts +18 -0
  165. package/src/config/stopwords.ts +25 -0
  166. package/src/config.ts +26 -0
  167. package/src/embedder.ts +42 -2
  168. package/src/memoryGraph.ts +438 -0
  169. package/src/memoryStats.ts +107 -0
  170. package/src/monitoring.ts +35 -0
  171. package/src/prefix-break.ts +83 -0
  172. package/src/pricing.ts +2 -2
  173. package/src/queryExpansion.ts +206 -0
  174. package/src/queryReformulation/cache.ts +169 -0
  175. package/src/queryReformulation/rrf.ts +51 -0
  176. package/src/queryReformulation/tfidf.ts +79 -0
  177. package/src/queryReformulation/vagueness.ts +38 -0
  178. package/src/queryReformulation.ts +355 -0
  179. package/src/recallMetrics.ts +388 -0
  180. package/src/store/sqlite/cache-stripes.ts +196 -0
  181. package/src/store/sqlite/fts5-search.ts +90 -0
  182. package/src/store/sqlite/perf-samples.ts +218 -23
  183. package/src/store/sqlite/schema.ts +60 -1
  184. package/src/store/sqlite.ts +1 -0
  185. package/src/store/turns/memory-store.ts +10 -1
  186. package/src/store/turns/sqlite-store.ts +27 -15
  187. package/src/store/turns/types.ts +21 -0
  188. package/src/store/vectorIndex.ts +71 -11
  189. package/src/tiered-router/types.ts +64 -0
  190. package/src/tieredRouter.ts +489 -0
  191. package/src/vectorStore.ts +9 -5
  192. package/dist/extensions/conflict-scan.test.js +0 -115
  193. package/dist/extensions/dashboard-server/api-contracts.test.js +0 -884
  194. package/dist/extensions/dashboard-server/html.test.js +0 -52
  195. package/dist/extensions/dashboard-server/perf-server.test.js +0 -80
  196. package/dist/extensions/dashboard-server/routes-cache.test.js +0 -248
  197. package/dist/extensions/dashboard-server/server.test.js +0 -120
  198. package/dist/extensions/dashboard-server-s32.test.js +0 -181
  199. package/dist/extensions/dashboard-server.test.js +0 -339
  200. package/dist/extensions/mega-cache-replay.test.js +0 -400
  201. package/dist/extensions/mega-compact-s38.test.js +0 -1383
  202. package/dist/extensions/mega-compact.test.js +0 -1112
  203. package/dist/extensions/mega-events.test.js +0 -47
  204. package/dist/extensions/mega-game-cmds.test.js +0 -163
  205. package/dist/extensions/mega-runtime/snapshot.test.js +0 -127
  206. package/dist/extensions/mega-runtime/state.test.js +0 -266
  207. package/dist/extensions/mega-runtime/widget.test.js +0 -343
  208. package/dist/extensions/mega-shutdown-widget.test.js +0 -121
  209. package/dist/extensions/mega-teamrun.test.js +0 -156
  210. package/dist/extensions/mega-trim.test.js +0 -58
  211. package/dist/extensions/mega-turn-store.test.js +0 -68
  212. package/dist/src/boundary.test.js +0 -170
  213. package/dist/src/compact.test.js +0 -78
  214. package/dist/src/config/themes.test.js +0 -94
  215. package/dist/src/dedup/dedup.test.js +0 -41
  216. package/dist/src/dedup/l1.test.js +0 -50
  217. package/dist/src/dedup/raptor/buildHistory.test.js +0 -292
  218. package/dist/src/dedup/raptor/multilevel-serve.test.js +0 -229
  219. package/dist/src/dedup/raptor/multilevel.test.js +0 -238
  220. package/dist/src/dedup/raptor/promote.test.js +0 -69
  221. package/dist/src/dedup/raptor/raptor.test.js +0 -248
  222. package/dist/src/dedup/raptor/retrieval.test.js +0 -95
  223. package/dist/src/dedup/raptor/serve-gate.test.js +0 -298
  224. package/dist/src/dedup/sprint12.test.js +0 -219
  225. package/dist/src/dedup-engine.test.js +0 -472
  226. package/dist/src/driftDetection.test.js +0 -87
  227. package/dist/src/e2e.test.js +0 -698
  228. package/dist/src/engine.test.js +0 -111
  229. package/dist/src/extractive.test.js +0 -147
  230. package/dist/src/fork.test.js +0 -81
  231. package/dist/src/game/scoring.test.js +0 -98
  232. package/dist/src/httpEmbedder.test.js +0 -277
  233. package/dist/src/importance.test.js +0 -372
  234. package/dist/src/intent.test.js +0 -78
  235. package/dist/src/log.test.js +0 -42
  236. package/dist/src/mechanical-fix.test.js +0 -65
  237. package/dist/src/memory.test.js +0 -70
  238. package/dist/src/memoryConsolidate.test.js +0 -38
  239. package/dist/src/memoryOps.test.js +0 -129
  240. package/dist/src/memoryRecall.test.js +0 -171
  241. package/dist/src/memoryRoundtrip.test.js +0 -137
  242. package/dist/src/metrics/turns.test.js +0 -152
  243. package/dist/src/mirror/mirror.test.js +0 -185
  244. package/dist/src/raptor-inject-summaries.test.js +0 -162
  245. package/dist/src/ratio.bench.test.js +0 -897
  246. package/dist/src/recall.integration.test.js +0 -77
  247. package/dist/src/recall.test.js +0 -379
  248. package/dist/src/sprint14.test.js +0 -219
  249. package/dist/src/sprint4x-rag-verification.test.js +0 -93
  250. package/dist/src/store/compression.test.js +0 -139
  251. package/dist/src/store/memoryIndex.test.js +0 -51
  252. package/dist/src/store/migrate.test.js +0 -139
  253. package/dist/src/store/pgOpenGuard.test.js +0 -74
  254. package/dist/src/store/phase01.test.js +0 -81
  255. package/dist/src/store/phase04.test.js +0 -54
  256. package/dist/src/store/sprint10.test.js +0 -186
  257. package/dist/src/store/sqlite/game-achievements.test.js +0 -67
  258. package/dist/src/store/sqlite/game-scores.test.js +0 -106
  259. package/dist/src/store/sqlite/game-state.test.js +0 -76
  260. package/dist/src/store/sqlite/global-index.test.js +0 -136
  261. package/dist/src/store/sqlite/mechanical-fix.test.js +0 -146
  262. package/dist/src/store/sqlite/perf-samples.test.js +0 -146
  263. package/dist/src/store/sqlite/raptor.test.js +0 -106
  264. package/dist/src/store/sqlite/turns.test.js +0 -183
  265. package/dist/src/store/sqlite.cachehit.test.js +0 -55
  266. package/dist/src/store/sqlite.dbmaint.test.js +0 -158
  267. package/dist/src/store/sqlite.dbmirror.test.js +0 -184
  268. package/dist/src/store/turns/contract-compliance.test.js +0 -428
  269. package/dist/src/store/turns/memory-store.test.js +0 -9
  270. package/dist/src/store/turns/migrations.test.js +0 -138
  271. package/dist/src/store/turns/sqlite-store.test.js +0 -144
  272. package/dist/src/store/vectorIndex.test.js +0 -123
  273. package/dist/src/store.test.js +0 -161
  274. package/dist/src/supersede.test.js +0 -36
  275. package/dist/src/topics/cluster.test.js +0 -150
  276. package/dist/src/topics/store.test.js +0 -117
  277. package/dist/src/types.test.js +0 -9
  278. package/dist/src/vector-search-cache.test.js +0 -157
  279. package/dist/src/vectorStore.test.js +0 -479
  280. package/dist/src/wiki.test.js +0 -171
  281. package/extensions/conflict-scan.test.ts +0 -129
  282. package/extensions/dashboard-client/dist/assets/AchievementsTab-DjxfYrDc.js +0 -2
  283. package/extensions/dashboard-client/dist/assets/CacheTab-Dnpv94wq.js +0 -2
  284. package/extensions/dashboard-client/dist/assets/CacheTab-Dnpv94wq.js.map +0 -1
  285. package/extensions/dashboard-client/dist/assets/GameTab-BLDudcO5.js +0 -2
  286. package/extensions/dashboard-client/dist/assets/OverviewTab-D4kGvsiQ.js +0 -2
  287. package/extensions/dashboard-client/dist/assets/ReposTab-C0Wnrf2u.js +0 -2
  288. package/extensions/dashboard-client/dist/assets/ReposTab-C0Wnrf2u.js.map +0 -1
  289. package/extensions/dashboard-client/dist/assets/TimeSavedCard-UqljSyP-.js +0 -2
  290. package/extensions/dashboard-client/dist/assets/TimeSavedCard-UqljSyP-.js.map +0 -1
  291. package/extensions/dashboard-client/dist/assets/index-BEdKlpAB.css +0 -1
  292. package/extensions/dashboard-client/dist/assets/index-BX0bcgLu.js +0 -42
  293. package/extensions/dashboard-client/dist/assets/index-BX0bcgLu.js.map +0 -1
  294. package/extensions/dashboard-server/api-contracts.test.ts +0 -1065
  295. package/extensions/dashboard-server/html.test.ts +0 -62
  296. package/extensions/dashboard-server/perf-server.test.ts +0 -101
  297. package/extensions/dashboard-server/routes-cache.test.ts +0 -302
  298. package/extensions/dashboard-server/server.test.ts +0 -131
  299. package/extensions/dashboard-server-s32.test.ts +0 -195
  300. package/extensions/dashboard-server.test.ts +0 -382
  301. package/extensions/mega-cache-replay.test.ts +0 -526
  302. package/extensions/mega-compact-s38.test.ts +0 -1433
  303. package/extensions/mega-compact.test.ts +0 -1509
  304. package/extensions/mega-events.test.ts +0 -55
  305. package/extensions/mega-game-cmds.test.ts +0 -197
  306. package/extensions/mega-runtime/snapshot.test.ts +0 -139
  307. package/extensions/mega-runtime/state.test.ts +0 -262
  308. package/extensions/mega-runtime/widget.test.ts +0 -468
  309. package/extensions/mega-shutdown-widget.test.ts +0 -141
  310. package/extensions/mega-teamrun.test.ts +0 -176
  311. package/extensions/mega-trim.test.ts +0 -64
  312. package/extensions/mega-turn-store.test.ts +0 -108
  313. package/src/boundary.test.ts +0 -187
  314. package/src/compact.test.ts +0 -99
  315. package/src/config/themes.test.ts +0 -116
  316. package/src/dedup/dedup.test.ts +0 -46
  317. package/src/dedup/l1.test.ts +0 -57
  318. package/src/dedup/raptor/buildHistory.test.ts +0 -353
  319. package/src/dedup/raptor/multilevel-serve.test.ts +0 -273
  320. package/src/dedup/raptor/multilevel.test.ts +0 -325
  321. package/src/dedup/raptor/promote.test.ts +0 -82
  322. package/src/dedup/raptor/raptor.test.ts +0 -297
  323. package/src/dedup/raptor/retrieval.test.ts +0 -118
  324. package/src/dedup/raptor/serve-gate.test.ts +0 -348
  325. package/src/dedup/sprint12.test.ts +0 -242
  326. package/src/dedup-engine.test.ts +0 -670
  327. package/src/driftDetection.test.ts +0 -100
  328. package/src/e2e.test.ts +0 -843
  329. package/src/engine.test.ts +0 -123
  330. package/src/extractive.test.ts +0 -174
  331. package/src/fork.test.ts +0 -94
  332. package/src/game/scoring.test.ts +0 -103
  333. package/src/httpEmbedder.test.ts +0 -286
  334. package/src/importance.test.ts +0 -538
  335. package/src/intent.test.ts +0 -87
  336. package/src/log.test.ts +0 -47
  337. package/src/mechanical-fix.test.ts +0 -70
  338. package/src/memory.test.ts +0 -92
  339. package/src/memoryConsolidate.test.ts +0 -47
  340. package/src/memoryOps.test.ts +0 -148
  341. package/src/memoryRecall.test.ts +0 -194
  342. package/src/memoryRoundtrip.test.ts +0 -155
  343. package/src/metrics/turns.test.ts +0 -165
  344. package/src/mirror/mirror.test.ts +0 -240
  345. package/src/raptor-inject-summaries.test.ts +0 -228
  346. package/src/ratio.bench.test.ts +0 -1316
  347. package/src/recall.integration.test.ts +0 -96
  348. package/src/recall.test.ts +0 -467
  349. package/src/sprint14.test.ts +0 -245
  350. package/src/sprint4x-rag-verification.test.ts +0 -119
  351. package/src/store/compression.test.ts +0 -168
  352. package/src/store/memoryIndex.test.ts +0 -61
  353. package/src/store/migrate.test.ts +0 -158
  354. package/src/store/pgOpenGuard.test.ts +0 -89
  355. package/src/store/phase01.test.ts +0 -88
  356. package/src/store/phase04.test.ts +0 -58
  357. package/src/store/sprint10.test.ts +0 -214
  358. package/src/store/sqlite/game-achievements.test.ts +0 -80
  359. package/src/store/sqlite/game-scores.test.ts +0 -132
  360. package/src/store/sqlite/game-state.test.ts +0 -89
  361. package/src/store/sqlite/global-index.test.ts +0 -222
  362. package/src/store/sqlite/mechanical-fix.test.ts +0 -162
  363. package/src/store/sqlite/perf-samples.test.ts +0 -169
  364. package/src/store/sqlite/raptor.test.ts +0 -139
  365. package/src/store/sqlite/turns.test.ts +0 -218
  366. package/src/store/sqlite.cachehit.test.ts +0 -68
  367. package/src/store/sqlite.dbmaint.test.ts +0 -193
  368. package/src/store/sqlite.dbmirror.test.ts +0 -229
  369. package/src/store/turns/contract-compliance.test.ts +0 -562
  370. package/src/store/turns/memory-store.test.ts +0 -15
  371. package/src/store/turns/migrations.test.ts +0 -161
  372. package/src/store/turns/sqlite-store.test.ts +0 -161
  373. package/src/store/vectorIndex.test.ts +0 -140
  374. package/src/store.test.ts +0 -191
  375. package/src/supersede.test.ts +0 -42
  376. package/src/topics/cluster.test.ts +0 -176
  377. package/src/topics/store.test.ts +0 -132
  378. package/src/types.test.ts +0 -10
  379. package/src/vector-search-cache.test.ts +0 -190
  380. package/src/vectorStore.test.ts +0 -533
  381. package/src/wiki.test.ts +0 -217
@@ -0,0 +1,2 @@
1
+ const n={"claude-sonnet-4":3e-6,"claude-3.5-sonnet":3e-6,"claude-3-opus":15e-6,"claude-3-haiku":25e-8,"claude-3.5-haiku":8e-7,"gpt-4o":25e-7,"gpt-4o-mini":15e-8,"gpt-4-turbo":1e-5,"gpt-3.5-turbo":5e-7,"gemini-2.5-pro":125e-8,"gemini-2.5-flash":15e-8,"gemini-2.0-flash":1e-7,"deepseek-chat":14e-8,"deepseek-reasoner":55e-8,codestral:3e-7,"mistral-large":2e-6,"llama-3.1-405b":133e-8,"llama-3.1-70b":8e-7,"llama-3.1-8b":5e-8};function r(e){if(n[e]!=null)return n[e];for(const[a,t]of Object.entries(n))if(e.startsWith(a))return t}function s(e,a,t){if(t<=0)return{cacheReadSaved:0,cacheWriteCost:0,netSaved:0};const c=e*t*.9,o=a*t*.25;return{cacheReadSaved:c,cacheWriteCost:o,netSaved:c-o}}export{s as c,r as l};
2
+ //# sourceMappingURL=pricing-CvE4NllQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pricing-CvE4NllQ.js","sources":["../../../../src/pricing.ts"],"sourcesContent":["/**\n * pricing.ts — Reusable pricing constants and cache-savings computation.\n *\n * Single source of truth for provider prompt-cache pricing multipliers and\n * known model input rates. Extracted from routes-cache.ts inline arithmetic.\n *\n * PREVENT-PI-004: compute-only, zero network. No SQL, no IO.\n */\n\n// ─── Cache Pricing Multipliers ──────────────────────────────────────────────\n\n/**\n * Fraction of input cost saved per cache-read token.\n * Cache reads cost 10% of full input → you save 90% of the input cost.\n */\nexport const CACHE_READ_MULTIPLIER = 0.9;\n\n/**\n * Fraction of input cost incurred as a premium per cache-write token.\n * Cache writes cost 125% of full input → a 25% premium over a normal input token.\n */\nexport const CACHE_WRITE_MULTIPLIER = 0.25;\n\n// ─── Known Model Input Rates ─────────────────────────────────────────────────\n// USD per input token. Exact-match first, then prefix-match.\n\nexport const MODEL_INPUT_RATES: Record<string, number> = {\n\t\"claude-sonnet-4\": 3e-6, // $3/Mtok\n\t\"claude-3.5-sonnet\": 3e-6,\n\t\"claude-3-opus\": 15e-6,\n\t\"claude-3-haiku\": 0.25e-6,\n\t\"claude-3.5-haiku\": 0.8e-6,\n\t\"gpt-4o\": 2.5e-6,\n\t\"gpt-4o-mini\": 0.15e-6,\n\t\"gpt-4-turbo\": 10e-6,\n\t\"gpt-3.5-turbo\": 0.5e-6,\n\t\"gemini-2.5-pro\": 1.25e-6,\n\t\"gemini-2.5-flash\": 0.15e-6,\n\t\"gemini-2.0-flash\": 0.1e-6,\n\t\"deepseek-chat\": 0.14e-6,\n\t\"deepseek-reasoner\": 0.55e-6,\n\tcodestral: 0.3e-6,\n\t\"mistral-large\": 2e-6,\n\t\"llama-3.1-405b\": 1.33e-6,\n\t\"llama-3.1-70b\": 0.8e-6,\n\t\"llama-3.1-8b\": 0.05e-6,\n};\n\n/**\n * Look up the input-token rate (USD) for a model string.\n * Exact match first, then prefix match (e.g. \"claude-sonnet-4-20250514\" → 3e-6).\n */\nexport function lookupModelInputRate(model: string): number | undefined {\n\t// exact match first\n\tif (MODEL_INPUT_RATES[model] != null) return MODEL_INPUT_RATES[model];\n\t// prefix match\n\tfor (const [key, rate] of Object.entries(MODEL_INPUT_RATES)) {\n\t\tif (model.startsWith(key)) return rate;\n\t}\n\treturn undefined;\n}\n\n// ─── Cache Savings Computation ──────────────────────────────────────────────\n\nexport interface CacheSavings {\n\treadonly cacheReadSaved: number;\n\treadonly cacheWriteCost: number;\n\treadonly netSaved: number;\n}\n\n/**\n * Compute dollar savings from provider prompt cache read/write token counts.\n *\n * @param totalCacheRead — total cache-read tokens over the lifetime.\n * @param totalCacheWrite — total cache-write tokens over the lifetime.\n * @param inputRate — the model's input-token rate in USD (e.g. 3e-6 for Sonnet).\n * @returns `{ cacheReadSaved, cacheWriteCost, netSaved }` — or all zeros when\n * `inputRate` is zero or negative.\n */\nexport function computeCacheSavings(\n\ttotalCacheRead: number,\n\ttotalCacheWrite: number,\n\tinputRate: number,\n): CacheSavings {\n\tif (inputRate <= 0) {\n\t\treturn { cacheReadSaved: 0, cacheWriteCost: 0, netSaved: 0 };\n\t}\n\tconst cacheReadSaved = totalCacheRead * inputRate * CACHE_READ_MULTIPLIER;\n\tconst cacheWriteCost = totalCacheWrite * inputRate * CACHE_WRITE_MULTIPLIER;\n\treturn {\n\t\tcacheReadSaved,\n\t\tcacheWriteCost,\n\t\tnetSaved: cacheReadSaved - cacheWriteCost,\n\t};\n}\n"],"names":["MODEL_INPUT_RATES","lookupModelInputRate","model","key","rate","computeCacheSavings","totalCacheRead","totalCacheWrite","inputRate","cacheReadSaved","cacheWriteCost"],"mappings":"AA0BO,MAAMA,EAA4C,CACxD,kBAAmB,KACnB,oBAAqB,KACrB,gBAAiB,MACjB,iBAAkB,MAClB,mBAAoB,KACpB,SAAU,MACV,cAAe,MACf,cAAe,KACf,gBAAiB,KACjB,iBAAkB,OAClB,mBAAoB,MACpB,mBAAoB,KACpB,gBAAiB,MACjB,oBAAqB,MACrB,UAAW,KACX,gBAAiB,KACjB,iBAAkB,OAClB,gBAAiB,KACjB,eAAgB,IACjB,EAMO,SAASC,EAAqBC,EAAmC,CAEvE,GAAIF,EAAkBE,CAAK,GAAK,KAAM,OAAOF,EAAkBE,CAAK,EAEpE,SAAW,CAACC,EAAKC,CAAI,IAAK,OAAO,QAAQJ,CAAiB,EACzD,GAAIE,EAAM,WAAWC,CAAG,EAAG,OAAOC,CAGpC,CAmBO,SAASC,EACfC,EACAC,EACAC,EACe,CACf,GAAIA,GAAa,EAChB,MAAO,CAAE,eAAgB,EAAG,eAAgB,EAAG,SAAU,CAAA,EAE1D,MAAMC,EAAiBH,EAAiBE,EAAY,GAC9CE,EAAiBH,EAAkBC,EAAY,IACrD,MAAO,CACN,eAAAC,EACA,eAAAC,EACA,SAAUD,EAAiBC,CAAA,CAE7B"}
@@ -1,2 +1,2 @@
1
- import{r as e}from"./index-BX0bcgLu.js";function R(i={}){const{maxEvents:c=500,maxReconnects:l=5}=i,[f,v]=e.useState([]),[E,n]=e.useState("connecting"),[S,p]=e.useState(0),[m,d]=e.useState(null),o=e.useRef(0),s=e.useRef(null),r=e.useCallback(()=>{s.current&&s.current.close(),n("connecting");const t=new EventSource("/api/events");s.current=t,t.onopen=()=>{n("connected"),o.current=0},t.onmessage=g=>{try{const x=JSON.parse(g.data);v(u=>{const a=[...u,x];return a.length>c?a.slice(-c):a}),p(u=>u+1),d(Date.now())}catch{}},t.onerror=()=>{t.close(),o.current<l?(o.current+=1,n("connecting"),setTimeout(r,1e3)):n("disconnected")}},[c,l]);return e.useEffect(()=>(r(),()=>{s.current?.close()}),[r]),{events:f,status:E,eventCount:S,lastEventAt:m}}export{R as u};
2
- //# sourceMappingURL=useSSE-BBYt5UPB.js.map
1
+ import{r as e}from"./index-DrktNOoT.js";function R(i={}){const{maxEvents:c=500,maxReconnects:l=5}=i,[f,v]=e.useState([]),[E,n]=e.useState("connecting"),[S,p]=e.useState(0),[m,d]=e.useState(null),o=e.useRef(0),s=e.useRef(null),r=e.useCallback(()=>{s.current&&s.current.close(),n("connecting");const t=new EventSource("/api/events");s.current=t,t.onopen=()=>{n("connected"),o.current=0},t.onmessage=g=>{try{const x=JSON.parse(g.data);v(u=>{const a=[...u,x];return a.length>c?a.slice(-c):a}),p(u=>u+1),d(Date.now())}catch{}},t.onerror=()=>{t.close(),o.current<l?(o.current+=1,n("connecting"),setTimeout(r,1e3)):n("disconnected")}},[c,l]);return e.useEffect(()=>(r(),()=>{s.current?.close()}),[r]),{events:f,status:E,eventCount:S,lastEventAt:m}}export{R as u};
2
+ //# sourceMappingURL=useSSE-Bf5LOLSi.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useSSE-BBYt5UPB.js","sources":["../../src/hooks/useSSE.ts"],"sourcesContent":["/**\n * dashboard-client/src/hooks/useSSE.ts — Server-Sent Events hook.\n *\n * Connects to /api/events, provides real-time event stream.\n * SPRINT-B1: basic connection. SPRINT-D1: reconnect with backoff.\n */\n\nimport { useState, useEffect, useRef, useCallback } from 'react';\nimport type { SseEvent } from '../../../dashboard-server/api-contracts';\n\nexport type SseStatus = 'connecting' | 'connected' | 'disconnected' | 'error';\n\nexport interface UseSSEResult {\n events: SseEvent[];\n status: SseStatus;\n eventCount: number;\n lastEventAt: number | null;\n}\n\nexport interface UseSSEOptions {\n /** Max events to keep in memory (ring buffer). */\n maxEvents?: number;\n /** Max reconnect attempts before giving up. */\n maxReconnects?: number;\n}\n\n// SPRINT-D1-REMAINING: exponential backoff (1s → 2s → 4s → max 30s).\n// SPRINT-D1-REMAINING: after 5 failures, set status='disconnected'.\n\nexport function useSSE(options: UseSSEOptions = {}): UseSSEResult {\n const { maxEvents = 500, maxReconnects = 5 } = options;\n const [events, setEvents] = useState<SseEvent[]>([]);\n const [status, setStatus] = useState<SseStatus>('connecting');\n const [eventCount, setEventCount] = useState(0);\n const [lastEventAt, setLastEventAt] = useState<number | null>(null);\n const reconnectCount = useRef(0);\n const sourceRef = useRef<EventSource | null>(null);\n\n const connect = useCallback(() => {\n if (sourceRef.current) {\n sourceRef.current.close();\n }\n setStatus('connecting');\n const source = new EventSource('/api/events');\n sourceRef.current = source;\n\n source.onopen = () => {\n setStatus('connected');\n reconnectCount.current = 0;\n };\n\n source.onmessage = (event) => {\n try {\n const parsed = JSON.parse(event.data) as SseEvent;\n setEvents(prev => {\n const next = [...prev, parsed];\n return next.length > maxEvents ? next.slice(-maxEvents) : next;\n });\n setEventCount(c => c + 1);\n setLastEventAt(Date.now());\n } catch {\n // non-fatal: skip malformed events\n }\n };\n\n source.onerror = () => {\n source.close();\n if (reconnectCount.current < maxReconnects) {\n reconnectCount.current += 1;\n setStatus('connecting');\n // SPRINT-D1: use exponential backoff instead of fixed delay\n setTimeout(connect, 1000);\n } else {\n setStatus('disconnected');\n }\n };\n }, [maxEvents, maxReconnects]);\n\n useEffect(() => {\n connect();\n return () => {\n sourceRef.current?.close();\n };\n }, [connect]);\n\n return { events, status, eventCount, lastEventAt };\n}\n"],"names":["useSSE","options","maxEvents","maxReconnects","events","setEvents","useState","status","setStatus","eventCount","setEventCount","lastEventAt","setLastEventAt","reconnectCount","useRef","sourceRef","connect","useCallback","source","event","parsed","prev","next","c","useEffect"],"mappings":"wCA6BO,SAASA,EAAOC,EAAyB,GAAkB,CAChE,KAAM,CAAE,UAAAC,EAAY,IAAK,cAAAC,EAAgB,GAAMF,EACzC,CAACG,EAAQC,CAAS,EAAIC,EAAAA,SAAqB,CAAA,CAAE,EAC7C,CAACC,EAAQC,CAAS,EAAIF,EAAAA,SAAoB,YAAY,EACtD,CAACG,EAAYC,CAAa,EAAIJ,EAAAA,SAAS,CAAC,EACxC,CAACK,EAAaC,CAAc,EAAIN,EAAAA,SAAwB,IAAI,EAC5DO,EAAiBC,EAAAA,OAAO,CAAC,EACzBC,EAAYD,EAAAA,OAA2B,IAAI,EAE3CE,EAAUC,EAAAA,YAAY,IAAM,CAC5BF,EAAU,SACZA,EAAU,QAAQ,MAAA,EAEpBP,EAAU,YAAY,EACtB,MAAMU,EAAS,IAAI,YAAY,aAAa,EAC5CH,EAAU,QAAUG,EAEpBA,EAAO,OAAS,IAAM,CACpBV,EAAU,WAAW,EACrBK,EAAe,QAAU,CAC3B,EAEAK,EAAO,UAAaC,GAAU,CAC5B,GAAI,CACF,MAAMC,EAAS,KAAK,MAAMD,EAAM,IAAI,EACpCd,EAAUgB,GAAQ,CAChB,MAAMC,EAAO,CAAC,GAAGD,EAAMD,CAAM,EAC7B,OAAOE,EAAK,OAASpB,EAAYoB,EAAK,MAAM,CAACpB,CAAS,EAAIoB,CAC5D,CAAC,EACDZ,EAAca,GAAKA,EAAI,CAAC,EACxBX,EAAe,KAAK,KAAK,CAC3B,MAAQ,CAER,CACF,EAEAM,EAAO,QAAU,IAAM,CACrBA,EAAO,MAAA,EACHL,EAAe,QAAUV,GAC3BU,EAAe,SAAW,EAC1BL,EAAU,YAAY,EAEtB,WAAWQ,EAAS,GAAI,GAExBR,EAAU,cAAc,CAE5B,CACF,EAAG,CAACN,EAAWC,CAAa,CAAC,EAE7BqB,OAAAA,EAAAA,UAAU,KACRR,EAAA,EACO,IAAM,CACXD,EAAU,SAAS,MAAA,CACrB,GACC,CAACC,CAAO,CAAC,EAEL,CAAE,OAAAZ,EAAQ,OAAAG,EAAQ,WAAAE,EAAY,YAAAE,CAAA,CACvC"}
1
+ {"version":3,"file":"useSSE-Bf5LOLSi.js","sources":["../../src/hooks/useSSE.ts"],"sourcesContent":["/**\n * dashboard-client/src/hooks/useSSE.ts — Server-Sent Events hook.\n *\n * Connects to /api/events, provides real-time event stream.\n * SPRINT-B1: basic connection. SPRINT-D1: reconnect with backoff.\n */\n\nimport { useState, useEffect, useRef, useCallback } from 'react';\nimport type { SseEvent } from '../../../dashboard-server/api-contracts';\n\nexport type SseStatus = 'connecting' | 'connected' | 'disconnected' | 'error';\n\nexport interface UseSSEResult {\n events: SseEvent[];\n status: SseStatus;\n eventCount: number;\n lastEventAt: number | null;\n}\n\nexport interface UseSSEOptions {\n /** Max events to keep in memory (ring buffer). */\n maxEvents?: number;\n /** Max reconnect attempts before giving up. */\n maxReconnects?: number;\n}\n\n// SPRINT-D1-REMAINING: exponential backoff (1s → 2s → 4s → max 30s).\n// SPRINT-D1-REMAINING: after 5 failures, set status='disconnected'.\n\nexport function useSSE(options: UseSSEOptions = {}): UseSSEResult {\n const { maxEvents = 500, maxReconnects = 5 } = options;\n const [events, setEvents] = useState<SseEvent[]>([]);\n const [status, setStatus] = useState<SseStatus>('connecting');\n const [eventCount, setEventCount] = useState(0);\n const [lastEventAt, setLastEventAt] = useState<number | null>(null);\n const reconnectCount = useRef(0);\n const sourceRef = useRef<EventSource | null>(null);\n\n const connect = useCallback(() => {\n if (sourceRef.current) {\n sourceRef.current.close();\n }\n setStatus('connecting');\n const source = new EventSource('/api/events');\n sourceRef.current = source;\n\n source.onopen = () => {\n setStatus('connected');\n reconnectCount.current = 0;\n };\n\n source.onmessage = (event) => {\n try {\n const parsed = JSON.parse(event.data) as SseEvent;\n setEvents(prev => {\n const next = [...prev, parsed];\n return next.length > maxEvents ? next.slice(-maxEvents) : next;\n });\n setEventCount(c => c + 1);\n setLastEventAt(Date.now());\n } catch {\n // non-fatal: skip malformed events\n }\n };\n\n source.onerror = () => {\n source.close();\n if (reconnectCount.current < maxReconnects) {\n reconnectCount.current += 1;\n setStatus('connecting');\n // SPRINT-D1: use exponential backoff instead of fixed delay\n setTimeout(connect, 1000);\n } else {\n setStatus('disconnected');\n }\n };\n }, [maxEvents, maxReconnects]);\n\n useEffect(() => {\n connect();\n return () => {\n sourceRef.current?.close();\n };\n }, [connect]);\n\n return { events, status, eventCount, lastEventAt };\n}\n"],"names":["useSSE","options","maxEvents","maxReconnects","events","setEvents","useState","status","setStatus","eventCount","setEventCount","lastEventAt","setLastEventAt","reconnectCount","useRef","sourceRef","connect","useCallback","source","event","parsed","prev","next","c","useEffect"],"mappings":"wCA6BO,SAASA,EAAOC,EAAyB,GAAkB,CAChE,KAAM,CAAE,UAAAC,EAAY,IAAK,cAAAC,EAAgB,GAAMF,EACzC,CAACG,EAAQC,CAAS,EAAIC,EAAAA,SAAqB,CAAA,CAAE,EAC7C,CAACC,EAAQC,CAAS,EAAIF,EAAAA,SAAoB,YAAY,EACtD,CAACG,EAAYC,CAAa,EAAIJ,EAAAA,SAAS,CAAC,EACxC,CAACK,EAAaC,CAAc,EAAIN,EAAAA,SAAwB,IAAI,EAC5DO,EAAiBC,EAAAA,OAAO,CAAC,EACzBC,EAAYD,EAAAA,OAA2B,IAAI,EAE3CE,EAAUC,EAAAA,YAAY,IAAM,CAC5BF,EAAU,SACZA,EAAU,QAAQ,MAAA,EAEpBP,EAAU,YAAY,EACtB,MAAMU,EAAS,IAAI,YAAY,aAAa,EAC5CH,EAAU,QAAUG,EAEpBA,EAAO,OAAS,IAAM,CACpBV,EAAU,WAAW,EACrBK,EAAe,QAAU,CAC3B,EAEAK,EAAO,UAAaC,GAAU,CAC5B,GAAI,CACF,MAAMC,EAAS,KAAK,MAAMD,EAAM,IAAI,EACpCd,EAAUgB,GAAQ,CAChB,MAAMC,EAAO,CAAC,GAAGD,EAAMD,CAAM,EAC7B,OAAOE,EAAK,OAASpB,EAAYoB,EAAK,MAAM,CAACpB,CAAS,EAAIoB,CAC5D,CAAC,EACDZ,EAAca,GAAKA,EAAI,CAAC,EACxBX,EAAe,KAAK,KAAK,CAC3B,MAAQ,CAER,CACF,EAEAM,EAAO,QAAU,IAAM,CACrBA,EAAO,MAAA,EACHL,EAAe,QAAUV,GAC3BU,EAAe,SAAW,EAC1BL,EAAU,YAAY,EAEtB,WAAWQ,EAAS,GAAI,GAExBR,EAAU,cAAc,CAE5B,CACF,EAAG,CAACN,EAAWC,CAAa,CAAC,EAE7BqB,OAAAA,EAAAA,UAAU,KACRR,EAAA,EACO,IAAM,CACXD,EAAU,SAAS,MAAA,CACrB,GACC,CAACC,CAAO,CAAC,EAEL,CAAE,OAAAZ,EAAQ,OAAAG,EAAQ,WAAAE,EAAY,YAAAE,CAAA,CACvC"}
@@ -4,8 +4,8 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>mega-compact dashboard</title>
7
- <script type="module" crossorigin src="./assets/index-BX0bcgLu.js"></script>
8
- <link rel="stylesheet" crossorigin href="./assets/index-BEdKlpAB.css">
7
+ <script type="module" crossorigin src="./assets/index-DrktNOoT.js"></script>
8
+ <link rel="stylesheet" crossorigin href="./assets/index-CUNn22iV.css">
9
9
  </head>
10
10
  <body>
11
11
  <div id="root"></div>
@@ -18,6 +18,7 @@ const OverviewTab = React.lazy(() => import("./tabs/OverviewTab"));
18
18
  const ReposTab = React.lazy(() => import("./tabs/ReposTab"));
19
19
  const EventsTab = React.lazy(() => import("./tabs/EventsTab"));
20
20
  const ConfigTab = React.lazy(() => import("./tabs/ConfigTab"));
21
+ const SetupTab = React.lazy(() => import("./tabs/SetupTab"));
21
22
  const MetricsTab = React.lazy(() => import("./tabs/MetricsTab"));
22
23
  const CacheTab = React.lazy(() => import("./tabs/CacheTab"));
23
24
  const GameTab = React.lazy(() => import("./tabs/GameTab"));
@@ -26,12 +27,14 @@ const SessionsTab = React.lazy(() => import("./tabs/SessionsTab"));
26
27
  const TopicsTab = React.lazy(() => import("./tabs/TopicsTab"));
27
28
  const TurnsTab = React.lazy(() => import("./tabs/TurnsTab"));
28
29
  const MaintenanceTab = React.lazy(() => import("./tabs/MaintenanceTab"));
30
+ const MemoryMapTab = React.lazy(() => import("./tabs/MemoryMapTab"));
29
31
 
30
32
  export type TabId =
31
33
  | "overview"
32
34
  | "repos"
33
35
  | "events"
34
36
  | "config"
37
+ | "setup"
35
38
  | "metrics"
36
39
  | "cache"
37
40
  | "game"
@@ -39,23 +42,33 @@ export type TabId =
39
42
  | "sessions"
40
43
  | "topics"
41
44
  | "turns"
42
- | "maintenance";
45
+ | "maintenance"
46
+ | "memory-map";
43
47
 
44
- const TABS: Array<{ id: TabId; label: string }> = [
48
+ type TabDef = { id: TabId; label: string };
49
+
50
+ const PRIMARY_TABS: TabDef[] = [
45
51
  { id: "overview", label: "Overview" },
52
+ { id: "cache", label: "Cache" },
53
+ { id: "sessions", label: "Sessions" },
54
+ { id: "turns", label: "Turns" },
55
+ ];
56
+
57
+ const ADVANCED_TABS: TabDef[] = [
46
58
  { id: "repos", label: "Repos" },
47
59
  { id: "events", label: "Events" },
48
60
  { id: "config", label: "Config" },
61
+ { id: "setup", label: "Setup" },
49
62
  { id: "metrics", label: "Metrics" },
50
- { id: "cache", label: "Cache" },
51
63
  { id: "game", label: "Game" },
52
64
  { id: "achievements", label: "Achievements" },
53
- { id: "sessions", label: "Sessions" },
54
65
  { id: "topics", label: "Topics" },
55
- { id: "turns", label: "Turns" },
56
66
  { id: "maintenance", label: "Maintenance" },
67
+ { id: "memory-map", label: "Memory Map" },
57
68
  ];
58
69
 
70
+ const advancedTabIds = new Set<TabId>(ADVANCED_TABS.map((t) => t.id));
71
+
59
72
  export default function App(): React.ReactElement {
60
73
  const [activeTab, setActiveTab] = useState<TabId>("overview");
61
74
  const {
@@ -83,7 +96,13 @@ export default function App(): React.ReactElement {
83
96
  {version && <span className="version-pill">{version}</span>}
84
97
  </h1>
85
98
  </header>
86
- <TabBar tabs={TABS} active={activeTab} onTabChange={setActiveTab} />
99
+ <TabBar
100
+ primaryTabs={PRIMARY_TABS}
101
+ advancedTabs={ADVANCED_TABS}
102
+ advancedTabIds={advancedTabIds}
103
+ active={activeTab}
104
+ onTabChange={setActiveTab}
105
+ />
87
106
  <main className="dashboard-content">
88
107
  <React.Suspense fallback={<LoadingSpinner />}>
89
108
  {activeTab === "overview" && (
@@ -96,14 +115,15 @@ export default function App(): React.ReactElement {
96
115
  {activeTab === "repos" && <ReposTab />}
97
116
  {activeTab === "events" && <EventsTab />}
98
117
  {activeTab === "config" && <ConfigTab />}
118
+ {activeTab === "setup" && <SetupTab />}
99
119
  {activeTab === "metrics" && <MetricsTab />}
100
120
  {activeTab === "cache" && <CacheTab />}
101
121
  {activeTab === "game" && <GameTab />}
102
122
  {activeTab === "achievements" && <AchievementsTab />}
103
123
  {activeTab === "sessions" && <SessionsTab />}
104
124
  {activeTab === "topics" && <TopicsTab />}
105
- {activeTab === "turns" && <TurnsTab />}
106
- {activeTab === "maintenance" && <MaintenanceTab />}
125
+ {activeTab === "maintenance" && <MaintenanceTab />}
126
+ {activeTab === "memory-map" && <MemoryMapTab />}
107
127
  </React.Suspense>
108
128
  </main>
109
129
  </div>
@@ -40,6 +40,11 @@ import type {
40
40
  MaintenanceAction,
41
41
  MaintenanceActionResult,
42
42
  ProviderCacheResponse,
43
+ CacheStripesResponse,
44
+ SetupStatusResponse,
45
+ SetupDetectResponse,
46
+ SetupConfigureRequest,
47
+ SetupConfigureResponse,
43
48
  } from "@contracts";
44
49
 
45
50
  /** Error thrown when a dashboard API response is not 2xx. */
@@ -196,6 +201,11 @@ export function fetchProviderCache(): Promise<ProviderCacheResponse> {
196
201
  return getJson<ProviderCacheResponse>(ENDPOINTS.providerCache.path);
197
202
  }
198
203
 
204
+ /** Cache stripe distribution + health score (A3). */
205
+ export function fetchCacheStripes(): Promise<CacheStripesResponse> {
206
+ return getJson<CacheStripesResponse>(ENDPOINTS.cacheStripes.path);
207
+ }
208
+
199
209
  // ── S52: turn-by-turn memory tracking + recall + rewind ───────────────
200
210
 
201
211
  export function fetchTurns(): Promise<TurnsResponse> {
@@ -273,3 +283,22 @@ export function postMaintenanceAction(
273
283
  action,
274
284
  );
275
285
  }
286
+
287
+ // ─── Setup wizard (P0b) ────────────────────────────────────────────────────
288
+
289
+ /** GET /api/setup-status — current embedder configuration. */
290
+ export function fetchSetupStatus(): Promise<SetupStatusResponse> {
291
+ return getJson<SetupStatusResponse>(ENDPOINTS.setupStatus.path);
292
+ }
293
+
294
+ /** GET /api/setup-detect — detect available local embedder backends. */
295
+ export function fetchSetupDetect(): Promise<SetupDetectResponse> {
296
+ return getJson<SetupDetectResponse>(ENDPOINTS.setupDetect.path);
297
+ }
298
+
299
+ /** POST /api/setup-configure — write embedder config to .mega-compact.env. */
300
+ export function configureEmbedder(
301
+ body: SetupConfigureRequest,
302
+ ): Promise<SetupConfigureResponse> {
303
+ return postJson<SetupConfigureResponse>(ENDPOINTS.setupConfigure.path, body);
304
+ }
@@ -1,13 +1,15 @@
1
1
  /**
2
2
  * dashboard-client/src/components/ActiveReposTable.tsx — Active repos table.
3
3
  *
4
- * 9 columns: Repo, Model, Tier, Context %, State, Compactions s/t,
5
- * Cache Hits s/t, Compact s/t, CacheHit s/t.
4
+ * Columns: Repo, Model, Tier, Context %, State, Compactions s/t,
5
+ * Cache Hits s/t, Cache Hit %, Cache Read, Cache Write, Est. Saved,
6
+ * Compact s/t (s), CacheHit s/t (s).
6
7
  * Data from fetchServers() via useApi with 10s polling.
7
8
  */
8
9
 
9
10
  import type React from "react";
10
11
  import type { ServerEntry } from "@contracts";
12
+ import { fmtTokens } from "@/utils/format.ts";
11
13
 
12
14
  export interface ActiveReposTableProps {
13
15
  servers: ServerEntry[];
@@ -32,6 +34,8 @@ const HEADERS = [
32
34
  "Cache Hits (s/t)",
33
35
  "Cache Hit %",
34
36
  "Est. Saved",
37
+ "Cache Read",
38
+ "Cache Write",
35
39
  "Compact s/t (s)",
36
40
  "CacheHit s/t (s)",
37
41
  ] as const;
@@ -42,19 +46,16 @@ export function ActiveReposTable({
42
46
  return (
43
47
  <div className="active-repos-section">
44
48
  <p className="legend-note">
45
- Repos seen within the last 30 minutes, with their per-repo
46
- cache-hit, compaction, and time-saved (est.) totals pulled live
47
- from each repo&apos;s dashboard.json.
49
+ Repos seen within the last 30 minutes, with their per-repo cache-hit,
50
+ compaction, and time-saved (est.) totals pulled live from each
51
+ repo&apos;s dashboard.json.
48
52
  </p>
49
53
  <div className="table-scroll">
50
54
  <table className="active-repos-table">
51
55
  <thead>
52
56
  <tr>
53
57
  {HEADERS.map((h, i) => (
54
- <th
55
- key={h}
56
- className={i >= 3 && i !== 4 ? "num" : undefined}
57
- >
58
+ <th key={h} className={i >= 3 && i !== 4 ? "num" : undefined}>
58
59
  {h}
59
60
  </th>
60
61
  ))}
@@ -82,9 +83,7 @@ export function ActiveReposTable({
82
83
  };
83
84
  return (
84
85
  <tr key={r.repoRoot}>
85
- <td title={r.repoRoot}>
86
- {r.displayName || r.repoRoot}
87
- </td>
86
+ <td title={r.repoRoot}>{r.displayName || r.repoRoot}</td>
88
87
  <td>{r.model ?? "\u2014"}</td>
89
88
  <td>{r.tier ?? "\u2014"}</td>
90
89
  <td className="num">
@@ -109,6 +108,16 @@ export function ActiveReposTable({
109
108
  ? `$${r.providerCache.estimatedSaved.toFixed(2)}`
110
109
  : "—"}
111
110
  </td>
111
+ <td className="num">
112
+ {r.providerCache?.cacheRead != null
113
+ ? fmtTokens(r.providerCache.cacheRead)
114
+ : "—"}
115
+ </td>
116
+ <td className="num">
117
+ {r.providerCache?.cacheWrite != null
118
+ ? fmtTokens(r.providerCache.cacheWrite)
119
+ : "—"}
120
+ </td>
112
121
  <td className="num">
113
122
  {fmtSec(ts.compact.sessionSec)} /{" "}
114
123
  {fmtSec(ts.compact.totalSec)}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * dashboard-client/src/components/CacheHitRateTrendCard.tsx -- Cache hit-rate
3
+ * time-series trend chart (A3, PLAN_V2 Phase 4).
4
+ *
5
+ * Renders a sparkline view of cache hit rate from the /api/perf endpoint using
6
+ * real cache_hit_pct samples with timestamps. Each bar represents one sample.
7
+ * Shows the latest, average, and sample count.
8
+ *
9
+ * Uses .ov-sparkline / .ov-sparkline-bar CSS classes from cache.css.
10
+ * No external charting dependencies.
11
+ */
12
+
13
+ import type React from "react";
14
+ import type { PerfResponse, CacheHitSample } from "@contracts";
15
+
16
+ export interface CacheHitRateTrendCardProps {
17
+ perf: PerfResponse;
18
+ }
19
+
20
+ function fmtPct(n: number): string {
21
+ return `${n.toFixed(1)}%`;
22
+ }
23
+
24
+ /**
25
+ * Map a percentage (0–100) to a CSS color class:
26
+ * >= 80: green (healthy)
27
+ * >= 60: teal (fair)
28
+ * >= 40: yellow (degraded)
29
+ * >= 20: orange (poor)
30
+ * < 20: red (critical)
31
+ */
32
+ function pctColorClass(pct: number): string {
33
+ if (pct >= 80) return "ov-bar-green";
34
+ if (pct >= 60) return "ov-bar-teal";
35
+ if (pct >= 40) return "ov-bar-yellow";
36
+ if (pct >= 20) return "ov-bar-orange";
37
+ return "ov-bar-red";
38
+ }
39
+
40
+ export const CacheHitRateTrendCard: React.FC<CacheHitRateTrendCardProps> = ({
41
+ perf,
42
+ }) => {
43
+ const { cache_hit_pct: c } = perf;
44
+ const samples: CacheHitSample[] =
45
+ c.samples && c.samples.length > 0 ? c.samples : [];
46
+
47
+ return (
48
+ <div className="ov-card cache-trend-card">
49
+ <h3 className="ov-card-title">Cache Hit-Rate Trend</h3>
50
+
51
+ {/* Metric summary */}
52
+ <div className="ov-perf-summary">
53
+ <div className="ov-perf-stat">
54
+ Avg: <strong>{fmtPct(c.avg)}</strong>
55
+ </div>
56
+ <div className="ov-perf-stat">
57
+ Latest: <strong>{fmtPct(c.latest)}</strong>
58
+ </div>
59
+ <div className="ov-perf-stat">
60
+ Samples: <strong>{c.n}</strong>
61
+ </div>
62
+ </div>
63
+
64
+ {/* Sparkline bars from real samples */}
65
+ {samples.length > 0 ? (
66
+ <>
67
+ <div
68
+ className="ov-sparkline"
69
+ role="img"
70
+ aria-label={`Cache hit rate trend: ${c.n} samples, average ${fmtPct(c.avg)}, latest ${fmtPct(c.latest)}`}
71
+ >
72
+ {samples.map((s, i) => {
73
+ const barH = Math.max(2, Math.round(s.pct * 0.6));
74
+ const colorClass = pctColorClass(s.pct);
75
+ const isLatest = i === samples.length - 1;
76
+ return (
77
+ <div
78
+ key={i}
79
+ className={`ov-sparkline-bar ${colorClass}${isLatest ? " ov-bar-latest" : ""}`}
80
+ style={{ height: `${barH}px` }}
81
+ title={`${fmtPct(s.pct)} at ${new Date(s.ts).toLocaleTimeString()}`}
82
+ />
83
+ );
84
+ })}
85
+ </div>
86
+ <div className="ov-card-footer">
87
+ {samples.length} sample{samples.length !== 1 ? "s" : ""} over{" "}
88
+ {samples.length > 1
89
+ ? `${Math.round(
90
+ (samples[samples.length - 1].ts - samples[0].ts) / 1000,
91
+ )}s`
92
+ : "latest turn"}
93
+ </div>
94
+ </>
95
+ ) : (
96
+ <div className="ov-empty-state">No cache-hit samples yet</div>
97
+ )}
98
+ </div>
99
+ );
100
+ };
@@ -16,6 +16,19 @@ import {
16
16
  fmtDate,
17
17
  fmtRelativeTime,
18
18
  } from "../utils/format";
19
+ import { lookupModelInputRate } from "@pricing";
20
+
21
+ // ---------------------------------------------------------------------------
22
+ // Per-model breakdown type (mirrors the API contract).
23
+ // ---------------------------------------------------------------------------
24
+
25
+ export interface ByModelEntry {
26
+ model: string;
27
+ hitPct: number;
28
+ totalCacheRead: number;
29
+ totalCacheWrite: number;
30
+ sampleCount: number;
31
+ }
19
32
 
20
33
  // ---------------------------------------------------------------------------
21
34
  // Flattened props — destructured from ProviderCacheResponse in CacheTab.
@@ -44,6 +57,8 @@ export interface ProviderCacheCardProps {
44
57
  firstTurnAt: string | null;
45
58
  /** ISO timestamp of latest recorded turn. */
46
59
  latestTurnAt: string | null;
60
+ /** Per-model breakdown (F4). */
61
+ byModel: ByModelEntry[];
47
62
  }
48
63
 
49
64
  // ---------------------------------------------------------------------------
@@ -136,6 +151,47 @@ export function ProviderCacheCard(
136
151
  label="Last Updated"
137
152
  value={fmtRelativeTime(props.latestTurnAt)}
138
153
  />
154
+
155
+ {/* --- Per-model breakdown (F4) --- */}
156
+ {props.byModel.length > 0 && (
157
+ <>
158
+ <div className="ov-stat-section-label">Per Model</div>
159
+ {props.byModel.map((m) => {
160
+ const rate = lookupModelInputRate(m.model);
161
+ const cr =
162
+ rate != null ? (m.totalCacheRead / 1_000_000) * rate : null;
163
+ const cw =
164
+ rate != null ? (m.totalCacheWrite / 1_000_000) * rate : null;
165
+ return (
166
+ <div key={m.model} className="ov-stat-group">
167
+ <StatRow label="Model" value={m.model} />
168
+ <StatRow
169
+ label="Hit Rate"
170
+ value={`${m.hitPct.toFixed(1)}%`}
171
+ className={hitPctClass(m.hitPct)}
172
+ />
173
+ <StatRow
174
+ label="Cache Read"
175
+ value={fmtTokens(m.totalCacheRead)}
176
+ />
177
+ <StatRow
178
+ label="Cache Write"
179
+ value={fmtTokens(m.totalCacheWrite)}
180
+ />
181
+ <StatRow label="Samples" value={String(m.sampleCount)} />
182
+ <StatRow
183
+ label="$ Saved (reads)"
184
+ value={cr != null ? fmtDollars(cr) : "\u2014"}
185
+ />
186
+ <StatRow
187
+ label="Write Investment"
188
+ value={cw != null ? fmtDollars(cw) : "\u2014"}
189
+ />
190
+ </div>
191
+ );
192
+ })}
193
+ </>
194
+ )}
139
195
  </div>
140
196
  );
141
197
  }
@@ -9,6 +9,7 @@
9
9
  import type React from "react";
10
10
  import { useMemo } from "react";
11
11
  import type { IndexesIndexRow } from "@contracts";
12
+ import { computeCacheSavings } from "@pricing";
12
13
 
13
14
  export interface SavingsByModelTableProps {
14
15
  repos: IndexesIndexRow[];
@@ -120,9 +121,9 @@ export function SavingsByModelTable({
120
121
  return (
121
122
  <div className="savings-by-model">
122
123
  <p className="legend-note">
123
- How much context &amp; cost mega-compact has reclaimed, grouped by
124
- the model you were running. Compression ratio reflects
125
- workload/content, not model quality.
124
+ How much context &amp; cost mega-compact has reclaimed, grouped by the
125
+ model you were running. Compression ratio reflects workload/content, not
126
+ model quality.
126
127
  </p>
127
128
  <div className="table-scroll">
128
129
  <table className="savings-table">
@@ -157,10 +158,16 @@ export function SavingsByModelTable({
157
158
  Out $/tok
158
159
  </th>
159
160
  <th className="num">$ Saved</th>
160
- <th className="num" title="Provider prompt-cache hit rate (reads / reads+writes+tokens_in)">
161
+ <th
162
+ className="num"
163
+ title="Provider prompt-cache hit rate (reads / reads+writes+tokens_in)"
164
+ >
161
165
  Cache Hit %
162
166
  </th>
163
- <th className="num" title="Estimated provider prompt-cache savings (read tokens * 0.9 * inputRate − write tokens * 0.25 * inputRate)">
167
+ <th
168
+ className="num"
169
+ title="Estimated provider prompt-cache savings (read tokens * 0.9 * inputRate − write tokens * 0.25 * inputRate)"
170
+ >
164
171
  Cache $ Saved
165
172
  </th>
166
173
  <th className="num">Last Used</th>
@@ -176,67 +183,41 @@ export function SavingsByModelTable({
176
183
  )}
177
184
  {groups.map((g) => {
178
185
  const freed = (g.tokensIn || 0) - (g.tokensOut || 0);
179
- const usd =
180
- g.usd > 0 ? `$${g.usd.toFixed(4)}` : "\u2014";
186
+ const usd = g.usd > 0 ? `$${g.usd.toFixed(4)}` : "\u2014";
181
187
  const when = g.lastAt
182
188
  ? new Date(g.lastAt).toLocaleString()
183
189
  : "\u2014";
184
190
  const reas =
185
- g.reasoning == null
186
- ? "\u2014"
187
- : g.reasoning
188
- ? "yes"
189
- : "no";
191
+ g.reasoning == null ? "\u2014" : g.reasoning ? "yes" : "no";
190
192
  return (
191
193
  <tr key={g.model}>
192
194
  <td className="repo-model">{g.model}</td>
193
195
  <td>{g.provider}</td>
194
- <td className="num">
195
- {g.tokensIn.toLocaleString()}
196
- </td>
197
- <td className="num">
198
- {g.tokensOut.toLocaleString()}
199
- </td>
200
- <td className="num">
201
- {freed.toLocaleString()}
202
- </td>
203
- <td className="num">
204
- {collapseNum(g.ctxWindows)}
205
- </td>
206
- <td className="num">
207
- {collapseNum(g.maxTokens)}
208
- </td>
196
+ <td className="num">{g.tokensIn.toLocaleString()}</td>
197
+ <td className="num">{g.tokensOut.toLocaleString()}</td>
198
+ <td className="num">{freed.toLocaleString()}</td>
199
+ <td className="num">{collapseNum(g.ctxWindows)}</td>
200
+ <td className="num">{collapseNum(g.maxTokens)}</td>
209
201
  <td className="num">{reas}</td>
202
+ <td className="num">{g.sessions.toLocaleString()}</td>
203
+ <td className="num">{g.checkpoints.toLocaleString()}</td>
204
+ <td className="num">{collapseRate(g.inRates)}</td>
205
+ <td className="num">{collapseRate(g.outRates)}</td>
206
+ <td className="num">{usd}</td>
210
207
  <td className="num">
211
- {g.sessions.toLocaleString()}
212
- </td>
213
- <td className="num">
214
- {g.checkpoints.toLocaleString()}
208
+ {g.cacheRead > 0
209
+ ? `${(
210
+ (g.cacheRead * 100) /
211
+ (g.cacheRead + g.cacheWrite + g.tokensIn || 1)
212
+ ).toFixed(1)}%`
213
+ : "—"}
215
214
  </td>
216
215
  <td className="num">
217
- {collapseRate(g.inRates)}
216
+ {g.cacheRead > 0
217
+ ? `$${computeCacheSavings(g.cacheRead, g.cacheWrite, g.inRates[0] || 0).netSaved.toFixed(4)}`
218
+ : "—"}
218
219
  </td>
219
- <td className="num">
220
- {collapseRate(g.outRates)}
221
- </td>
222
- <td className="num">{usd}</td>
223
- <td className="num">
224
- {g.cacheRead > 0
225
- ? `${(
226
- (g.cacheRead * 100) /
227
- (g.cacheRead + g.cacheWrite + g.tokensIn || 1)
228
- ).toFixed(1)}%`
229
- : "—"}
230
- </td>
231
- <td className="num">
232
- {g.cacheRead > 0
233
- ? `$${(
234
- g.cacheRead * 0.9 * (g.inRates[0] || 0) -
235
- g.cacheWrite * 0.25 * (g.inRates[0] || 0)
236
- ).toFixed(4)}`
237
- : "—"}
238
- </td>
239
- <td className="num">{when}</td>
220
+ <td className="num">{when}</td>
240
221
  </tr>
241
222
  );
242
223
  })}
@@ -244,10 +225,10 @@ export function SavingsByModelTable({
244
225
  </table>
245
226
  </div>
246
227
  <p className="legend-note">
247
- Tokens In = Σ original region tokens dropped by compaction. Tokens
248
- Out = Σ compacted summary tokens still retained in context. Freed =
249
- Tokens In − Tokens Out (net context reclaimed). Ctx Window / Max Out
250
- / Reas. come from the latest captured model snapshot for each repo.
228
+ Tokens In = Σ original region tokens dropped by compaction. Tokens Out =
229
+ Σ compacted summary tokens still retained in context. Freed = Tokens In
230
+ − Tokens Out (net context reclaimed). Ctx Window / Max Out / Reas. come
231
+ from the latest captured model snapshot for each repo.
251
232
  </p>
252
233
  </div>
253
234
  );