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.
- package/dist/extensions/dashboard-server/api-contracts/cache-stripes.js +8 -0
- package/dist/extensions/dashboard-server/api-contracts/endpoints.js +32 -0
- package/dist/extensions/dashboard-server/api-contracts/memory-map.js +1 -0
- package/dist/extensions/dashboard-server/api-contracts/memory.js +8 -0
- package/dist/extensions/dashboard-server/api-contracts/provider-cache.js +1 -0
- package/dist/extensions/dashboard-server/api-contracts/setup.js +10 -0
- package/dist/extensions/dashboard-server/index-reader.js +6 -2
- package/dist/extensions/dashboard-server/routes-cache.js +135 -47
- package/dist/extensions/dashboard-server/routes-game.js +3 -0
- package/dist/extensions/dashboard-server/routes-memory-map.js +50 -0
- package/dist/extensions/dashboard-server/routes-memory.js +51 -0
- package/dist/extensions/dashboard-server/routes-repo.js +2 -2
- package/dist/extensions/dashboard-server/routes-setup.js +267 -0
- package/dist/extensions/dashboard-server/routes.js +4 -0
- package/dist/extensions/dashboard-server/server.js +13 -1
- package/dist/extensions/mega-commands.js +189 -1
- package/dist/extensions/mega-compact.js +5 -0
- package/dist/extensions/mega-config.js +7 -0
- package/dist/extensions/mega-events/agent-handlers.js +19 -4
- package/dist/extensions/mega-events/compact-handlers.js +1 -0
- package/dist/extensions/mega-events/context-handler.js +45 -92
- package/dist/extensions/mega-events/context-hwm.js +51 -0
- package/dist/extensions/mega-events/error-classifier.js +16 -5
- package/dist/extensions/mega-events/mirror-append.js +107 -0
- package/dist/extensions/mega-events/outage-advisor.js +7 -1
- package/dist/extensions/mega-events/perf-handler.js +134 -2
- package/dist/extensions/mega-events/recall-tail.js +59 -0
- package/dist/extensions/mega-events/separated-prompt.js +248 -0
- package/dist/extensions/mega-events/session-handlers.js +15 -8
- package/dist/extensions/mega-runtime/env-loader.js +56 -0
- package/dist/extensions/mega-runtime/reset-runtime.js +6 -0
- package/dist/extensions/mega-runtime/runtime-snapshot.js +1 -0
- package/dist/extensions/mega-runtime/runtime.js +7 -0
- package/dist/extensions/mega-runtime/snapshot.js +1 -0
- package/dist/extensions/mega-runtime/widget.js +5 -0
- package/dist/src/cache-stripe-impl.js +288 -0
- package/dist/src/cache-stripe.js +11 -0
- package/dist/src/config/stopwords.js +24 -0
- package/dist/src/config.js +17 -0
- package/dist/src/embedder.js +41 -2
- package/dist/src/memoryGraph.js +299 -0
- package/dist/src/memoryStats.js +75 -0
- package/dist/src/monitoring.js +13 -0
- package/dist/src/prefix-break.js +43 -0
- package/dist/src/pricing.js +1 -1
- package/dist/src/queryExpansion.js +163 -0
- package/dist/src/queryReformulation/cache.js +123 -0
- package/dist/src/queryReformulation/rrf.js +29 -0
- package/dist/src/queryReformulation/tfidf.js +61 -0
- package/dist/src/queryReformulation/vagueness.js +33 -0
- package/dist/src/queryReformulation.js +225 -0
- package/dist/src/recallMetrics.js +258 -0
- package/dist/src/store/sqlite/cache-stripes.js +133 -0
- package/dist/src/store/sqlite/fts5-search.js +68 -0
- package/dist/src/store/sqlite/perf-samples.js +145 -16
- package/dist/src/store/sqlite/schema.js +60 -1
- package/dist/src/store/sqlite.js +1 -0
- package/dist/src/store/turns/memory-store.js +8 -0
- package/dist/src/store/turns/sqlite-store.js +14 -3
- package/dist/src/store/turns/types.js +18 -1
- package/dist/src/store/vectorIndex.js +55 -10
- package/dist/src/tiered-router/types.js +18 -0
- package/dist/src/tieredRouter.js +421 -0
- package/dist/src/vectorStore.js +8 -6
- package/extensions/dashboard-client/dist/assets/{AchievementTiles-vEo2MtE2.js → AchievementTiles-DR9cLGDL.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{AchievementTiles-vEo2MtE2.js.map → AchievementTiles-DR9cLGDL.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/AchievementsTab-svNUgJ1e.js +2 -0
- package/extensions/dashboard-client/dist/assets/{AchievementsTab-DjxfYrDc.js.map → AchievementsTab-svNUgJ1e.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/CacheTab-ASwhOMjR.js +2 -0
- package/extensions/dashboard-client/dist/assets/CacheTab-ASwhOMjR.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/{ConfigTab-Cm6ymbmx.js → ConfigTab-CmmWheuW.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{ConfigTab-Cm6ymbmx.js.map → ConfigTab-CmmWheuW.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{EventsTab-DXWl_YzI.js → EventsTab-CFE7jLsa.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{EventsTab-DXWl_YzI.js.map → EventsTab-CFE7jLsa.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/GameTab-CJAX_th_.js +2 -0
- package/extensions/dashboard-client/dist/assets/{GameTab-BLDudcO5.js.map → GameTab-CJAX_th_.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{MaintenanceTab-DLkKCztn.js → MaintenanceTab-P4SUsvMf.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{MaintenanceTab-DLkKCztn.js.map → MaintenanceTab-P4SUsvMf.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/MemoryMapTab-BBiH76eF.js +2 -0
- package/extensions/dashboard-client/dist/assets/MemoryMapTab-BBiH76eF.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/{MetricsTab-Cq4u-rZF.js → MetricsTab-CHQscixy.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{MetricsTab-Cq4u-rZF.js.map → MetricsTab-CHQscixy.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/OverviewTab-DBs4DJdd.js +2 -0
- package/extensions/dashboard-client/dist/assets/{OverviewTab-D4kGvsiQ.js.map → OverviewTab-DBs4DJdd.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/ReposTab-DeFz76L5.js +2 -0
- package/extensions/dashboard-client/dist/assets/ReposTab-DeFz76L5.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/{SessionsTab-DZC2-GCn.js → SessionsTab-BWNsj1OB.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{SessionsTab-DZC2-GCn.js.map → SessionsTab-BWNsj1OB.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/SetupTab-uS6A0xmw.js +2 -0
- package/extensions/dashboard-client/dist/assets/SetupTab-uS6A0xmw.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/TimeSavedCard-CiqCOQuL.js +2 -0
- package/extensions/dashboard-client/dist/assets/TimeSavedCard-CiqCOQuL.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/{TopicsTab-01G71hv1.js → TopicsTab-BWWQxltv.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{TopicsTab-01G71hv1.js.map → TopicsTab-BWWQxltv.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{TurnsTab-DLRg0LZT.js → TurnsTab-CVz4f4-o.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{TurnsTab-DLRg0LZT.js.map → TurnsTab-CVz4f4-o.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/format-COjDIVGj.js +2 -0
- package/extensions/dashboard-client/dist/assets/format-COjDIVGj.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/index-CUNn22iV.css +1 -0
- package/extensions/dashboard-client/dist/assets/index-DrktNOoT.js +42 -0
- package/extensions/dashboard-client/dist/assets/index-DrktNOoT.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/pricing-CvE4NllQ.js +2 -0
- package/extensions/dashboard-client/dist/assets/pricing-CvE4NllQ.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/{useSSE-BBYt5UPB.js → useSSE-Bf5LOLSi.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{useSSE-BBYt5UPB.js.map → useSSE-Bf5LOLSi.js.map} +1 -1
- package/extensions/dashboard-client/dist/index.html +2 -2
- package/extensions/dashboard-client/src/App.tsx +28 -8
- package/extensions/dashboard-client/src/api/client.ts +29 -0
- package/extensions/dashboard-client/src/components/ActiveReposTable.tsx +21 -12
- package/extensions/dashboard-client/src/components/CacheHitRateTrendCard.tsx +100 -0
- package/extensions/dashboard-client/src/components/ProviderCacheCard.tsx +56 -0
- package/extensions/dashboard-client/src/components/SavingsByModelTable.tsx +38 -57
- package/extensions/dashboard-client/src/components/StripeDistributionCard.tsx +110 -0
- package/extensions/dashboard-client/src/components/TabBar.tsx +49 -4
- package/extensions/dashboard-client/src/main.tsx +1 -0
- package/extensions/dashboard-client/src/styles/base.css +30 -0
- package/extensions/dashboard-client/src/styles/cache.css +167 -0
- package/extensions/dashboard-client/src/tabs/CacheTab.tsx +75 -12
- package/extensions/dashboard-client/src/tabs/MemoryMapTab.tsx +440 -0
- package/extensions/dashboard-client/src/tabs/SetupTab.tsx +418 -0
- package/extensions/dashboard-client/tsconfig.json +3 -2
- package/extensions/dashboard-client/vite.config.ts +2 -0
- package/extensions/dashboard-server/api-contracts/cache-stripes.ts +49 -0
- package/extensions/dashboard-server/api-contracts/endpoints.ts +66 -3
- package/extensions/dashboard-server/api-contracts/index.ts +22 -0
- package/extensions/dashboard-server/api-contracts/memory-map.ts +50 -0
- package/extensions/dashboard-server/api-contracts/memory.ts +27 -0
- package/extensions/dashboard-server/api-contracts/multi-repo.ts +231 -231
- package/extensions/dashboard-server/api-contracts/provider-cache.ts +37 -0
- package/extensions/dashboard-server/api-contracts/setup.ts +80 -0
- package/extensions/dashboard-server/index-reader.ts +138 -121
- package/extensions/dashboard-server/routes-cache.ts +186 -75
- package/extensions/dashboard-server/routes-game.ts +3 -0
- package/extensions/dashboard-server/routes-memory-map.ts +105 -0
- package/extensions/dashboard-server/routes-memory.ts +63 -0
- package/extensions/dashboard-server/routes-repo.ts +36 -36
- package/extensions/dashboard-server/routes-setup.ts +293 -0
- package/extensions/dashboard-server/routes.ts +4 -0
- package/extensions/dashboard-server/server.ts +12 -0
- package/extensions/mega-commands.ts +211 -1
- package/extensions/mega-compact.ts +5 -0
- package/extensions/mega-config.ts +27 -0
- package/extensions/mega-events/agent-handlers.ts +20 -4
- package/extensions/mega-events/compact-handlers.ts +1 -0
- package/extensions/mega-events/context-handler.ts +53 -110
- package/extensions/mega-events/context-hwm.ts +85 -0
- package/extensions/mega-events/error-classifier.ts +15 -4
- package/extensions/mega-events/mirror-append.ts +155 -0
- package/extensions/mega-events/outage-advisor.ts +11 -5
- package/extensions/mega-events/perf-handler.ts +190 -6
- package/extensions/mega-events/recall-tail.ts +88 -0
- package/extensions/mega-events/separated-prompt.ts +329 -0
- package/extensions/mega-events/session-handlers.ts +14 -7
- package/extensions/mega-runtime/env-loader.ts +55 -0
- package/extensions/mega-runtime/helpers.ts +14 -0
- package/extensions/mega-runtime/reset-runtime.ts +6 -0
- package/extensions/mega-runtime/runtime-snapshot.ts +1 -0
- package/extensions/mega-runtime/runtime.ts +7 -0
- package/extensions/mega-runtime/snapshot.ts +6 -0
- package/extensions/mega-runtime/widget-types.ts +3 -0
- package/extensions/mega-runtime/widget.ts +5 -0
- package/package.json +5 -2
- package/src/cache-stripe-impl.ts +385 -0
- package/src/cache-stripe.ts +18 -0
- package/src/config/stopwords.ts +25 -0
- package/src/config.ts +26 -0
- package/src/embedder.ts +42 -2
- package/src/memoryGraph.ts +438 -0
- package/src/memoryStats.ts +107 -0
- package/src/monitoring.ts +35 -0
- package/src/prefix-break.ts +83 -0
- package/src/pricing.ts +2 -2
- package/src/queryExpansion.ts +206 -0
- package/src/queryReformulation/cache.ts +169 -0
- package/src/queryReformulation/rrf.ts +51 -0
- package/src/queryReformulation/tfidf.ts +79 -0
- package/src/queryReformulation/vagueness.ts +38 -0
- package/src/queryReformulation.ts +355 -0
- package/src/recallMetrics.ts +388 -0
- package/src/store/sqlite/cache-stripes.ts +196 -0
- package/src/store/sqlite/fts5-search.ts +90 -0
- package/src/store/sqlite/perf-samples.ts +218 -23
- package/src/store/sqlite/schema.ts +60 -1
- package/src/store/sqlite.ts +1 -0
- package/src/store/turns/memory-store.ts +10 -1
- package/src/store/turns/sqlite-store.ts +27 -15
- package/src/store/turns/types.ts +21 -0
- package/src/store/vectorIndex.ts +71 -11
- package/src/tiered-router/types.ts +64 -0
- package/src/tieredRouter.ts +489 -0
- package/src/vectorStore.ts +9 -5
- package/dist/extensions/conflict-scan.test.js +0 -115
- package/dist/extensions/dashboard-server/api-contracts.test.js +0 -884
- package/dist/extensions/dashboard-server/html.test.js +0 -52
- package/dist/extensions/dashboard-server/perf-server.test.js +0 -80
- package/dist/extensions/dashboard-server/routes-cache.test.js +0 -248
- package/dist/extensions/dashboard-server/server.test.js +0 -120
- package/dist/extensions/dashboard-server-s32.test.js +0 -181
- package/dist/extensions/dashboard-server.test.js +0 -339
- package/dist/extensions/mega-cache-replay.test.js +0 -400
- package/dist/extensions/mega-compact-s38.test.js +0 -1383
- package/dist/extensions/mega-compact.test.js +0 -1112
- package/dist/extensions/mega-events.test.js +0 -47
- package/dist/extensions/mega-game-cmds.test.js +0 -163
- package/dist/extensions/mega-runtime/snapshot.test.js +0 -127
- package/dist/extensions/mega-runtime/state.test.js +0 -266
- package/dist/extensions/mega-runtime/widget.test.js +0 -343
- package/dist/extensions/mega-shutdown-widget.test.js +0 -121
- package/dist/extensions/mega-teamrun.test.js +0 -156
- package/dist/extensions/mega-trim.test.js +0 -58
- package/dist/extensions/mega-turn-store.test.js +0 -68
- package/dist/src/boundary.test.js +0 -170
- package/dist/src/compact.test.js +0 -78
- package/dist/src/config/themes.test.js +0 -94
- package/dist/src/dedup/dedup.test.js +0 -41
- package/dist/src/dedup/l1.test.js +0 -50
- package/dist/src/dedup/raptor/buildHistory.test.js +0 -292
- package/dist/src/dedup/raptor/multilevel-serve.test.js +0 -229
- package/dist/src/dedup/raptor/multilevel.test.js +0 -238
- package/dist/src/dedup/raptor/promote.test.js +0 -69
- package/dist/src/dedup/raptor/raptor.test.js +0 -248
- package/dist/src/dedup/raptor/retrieval.test.js +0 -95
- package/dist/src/dedup/raptor/serve-gate.test.js +0 -298
- package/dist/src/dedup/sprint12.test.js +0 -219
- package/dist/src/dedup-engine.test.js +0 -472
- package/dist/src/driftDetection.test.js +0 -87
- package/dist/src/e2e.test.js +0 -698
- package/dist/src/engine.test.js +0 -111
- package/dist/src/extractive.test.js +0 -147
- package/dist/src/fork.test.js +0 -81
- package/dist/src/game/scoring.test.js +0 -98
- package/dist/src/httpEmbedder.test.js +0 -277
- package/dist/src/importance.test.js +0 -372
- package/dist/src/intent.test.js +0 -78
- package/dist/src/log.test.js +0 -42
- package/dist/src/mechanical-fix.test.js +0 -65
- package/dist/src/memory.test.js +0 -70
- package/dist/src/memoryConsolidate.test.js +0 -38
- package/dist/src/memoryOps.test.js +0 -129
- package/dist/src/memoryRecall.test.js +0 -171
- package/dist/src/memoryRoundtrip.test.js +0 -137
- package/dist/src/metrics/turns.test.js +0 -152
- package/dist/src/mirror/mirror.test.js +0 -185
- package/dist/src/raptor-inject-summaries.test.js +0 -162
- package/dist/src/ratio.bench.test.js +0 -897
- package/dist/src/recall.integration.test.js +0 -77
- package/dist/src/recall.test.js +0 -379
- package/dist/src/sprint14.test.js +0 -219
- package/dist/src/sprint4x-rag-verification.test.js +0 -93
- package/dist/src/store/compression.test.js +0 -139
- package/dist/src/store/memoryIndex.test.js +0 -51
- package/dist/src/store/migrate.test.js +0 -139
- package/dist/src/store/pgOpenGuard.test.js +0 -74
- package/dist/src/store/phase01.test.js +0 -81
- package/dist/src/store/phase04.test.js +0 -54
- package/dist/src/store/sprint10.test.js +0 -186
- package/dist/src/store/sqlite/game-achievements.test.js +0 -67
- package/dist/src/store/sqlite/game-scores.test.js +0 -106
- package/dist/src/store/sqlite/game-state.test.js +0 -76
- package/dist/src/store/sqlite/global-index.test.js +0 -136
- package/dist/src/store/sqlite/mechanical-fix.test.js +0 -146
- package/dist/src/store/sqlite/perf-samples.test.js +0 -146
- package/dist/src/store/sqlite/raptor.test.js +0 -106
- package/dist/src/store/sqlite/turns.test.js +0 -183
- package/dist/src/store/sqlite.cachehit.test.js +0 -55
- package/dist/src/store/sqlite.dbmaint.test.js +0 -158
- package/dist/src/store/sqlite.dbmirror.test.js +0 -184
- package/dist/src/store/turns/contract-compliance.test.js +0 -428
- package/dist/src/store/turns/memory-store.test.js +0 -9
- package/dist/src/store/turns/migrations.test.js +0 -138
- package/dist/src/store/turns/sqlite-store.test.js +0 -144
- package/dist/src/store/vectorIndex.test.js +0 -123
- package/dist/src/store.test.js +0 -161
- package/dist/src/supersede.test.js +0 -36
- package/dist/src/topics/cluster.test.js +0 -150
- package/dist/src/topics/store.test.js +0 -117
- package/dist/src/types.test.js +0 -9
- package/dist/src/vector-search-cache.test.js +0 -157
- package/dist/src/vectorStore.test.js +0 -479
- package/dist/src/wiki.test.js +0 -171
- package/extensions/conflict-scan.test.ts +0 -129
- package/extensions/dashboard-client/dist/assets/AchievementsTab-DjxfYrDc.js +0 -2
- package/extensions/dashboard-client/dist/assets/CacheTab-Dnpv94wq.js +0 -2
- package/extensions/dashboard-client/dist/assets/CacheTab-Dnpv94wq.js.map +0 -1
- package/extensions/dashboard-client/dist/assets/GameTab-BLDudcO5.js +0 -2
- package/extensions/dashboard-client/dist/assets/OverviewTab-D4kGvsiQ.js +0 -2
- package/extensions/dashboard-client/dist/assets/ReposTab-C0Wnrf2u.js +0 -2
- package/extensions/dashboard-client/dist/assets/ReposTab-C0Wnrf2u.js.map +0 -1
- package/extensions/dashboard-client/dist/assets/TimeSavedCard-UqljSyP-.js +0 -2
- package/extensions/dashboard-client/dist/assets/TimeSavedCard-UqljSyP-.js.map +0 -1
- package/extensions/dashboard-client/dist/assets/index-BEdKlpAB.css +0 -1
- package/extensions/dashboard-client/dist/assets/index-BX0bcgLu.js +0 -42
- package/extensions/dashboard-client/dist/assets/index-BX0bcgLu.js.map +0 -1
- package/extensions/dashboard-server/api-contracts.test.ts +0 -1065
- package/extensions/dashboard-server/html.test.ts +0 -62
- package/extensions/dashboard-server/perf-server.test.ts +0 -101
- package/extensions/dashboard-server/routes-cache.test.ts +0 -302
- package/extensions/dashboard-server/server.test.ts +0 -131
- package/extensions/dashboard-server-s32.test.ts +0 -195
- package/extensions/dashboard-server.test.ts +0 -382
- package/extensions/mega-cache-replay.test.ts +0 -526
- package/extensions/mega-compact-s38.test.ts +0 -1433
- package/extensions/mega-compact.test.ts +0 -1509
- package/extensions/mega-events.test.ts +0 -55
- package/extensions/mega-game-cmds.test.ts +0 -197
- package/extensions/mega-runtime/snapshot.test.ts +0 -139
- package/extensions/mega-runtime/state.test.ts +0 -262
- package/extensions/mega-runtime/widget.test.ts +0 -468
- package/extensions/mega-shutdown-widget.test.ts +0 -141
- package/extensions/mega-teamrun.test.ts +0 -176
- package/extensions/mega-trim.test.ts +0 -64
- package/extensions/mega-turn-store.test.ts +0 -108
- package/src/boundary.test.ts +0 -187
- package/src/compact.test.ts +0 -99
- package/src/config/themes.test.ts +0 -116
- package/src/dedup/dedup.test.ts +0 -46
- package/src/dedup/l1.test.ts +0 -57
- package/src/dedup/raptor/buildHistory.test.ts +0 -353
- package/src/dedup/raptor/multilevel-serve.test.ts +0 -273
- package/src/dedup/raptor/multilevel.test.ts +0 -325
- package/src/dedup/raptor/promote.test.ts +0 -82
- package/src/dedup/raptor/raptor.test.ts +0 -297
- package/src/dedup/raptor/retrieval.test.ts +0 -118
- package/src/dedup/raptor/serve-gate.test.ts +0 -348
- package/src/dedup/sprint12.test.ts +0 -242
- package/src/dedup-engine.test.ts +0 -670
- package/src/driftDetection.test.ts +0 -100
- package/src/e2e.test.ts +0 -843
- package/src/engine.test.ts +0 -123
- package/src/extractive.test.ts +0 -174
- package/src/fork.test.ts +0 -94
- package/src/game/scoring.test.ts +0 -103
- package/src/httpEmbedder.test.ts +0 -286
- package/src/importance.test.ts +0 -538
- package/src/intent.test.ts +0 -87
- package/src/log.test.ts +0 -47
- package/src/mechanical-fix.test.ts +0 -70
- package/src/memory.test.ts +0 -92
- package/src/memoryConsolidate.test.ts +0 -47
- package/src/memoryOps.test.ts +0 -148
- package/src/memoryRecall.test.ts +0 -194
- package/src/memoryRoundtrip.test.ts +0 -155
- package/src/metrics/turns.test.ts +0 -165
- package/src/mirror/mirror.test.ts +0 -240
- package/src/raptor-inject-summaries.test.ts +0 -228
- package/src/ratio.bench.test.ts +0 -1316
- package/src/recall.integration.test.ts +0 -96
- package/src/recall.test.ts +0 -467
- package/src/sprint14.test.ts +0 -245
- package/src/sprint4x-rag-verification.test.ts +0 -119
- package/src/store/compression.test.ts +0 -168
- package/src/store/memoryIndex.test.ts +0 -61
- package/src/store/migrate.test.ts +0 -158
- package/src/store/pgOpenGuard.test.ts +0 -89
- package/src/store/phase01.test.ts +0 -88
- package/src/store/phase04.test.ts +0 -58
- package/src/store/sprint10.test.ts +0 -214
- package/src/store/sqlite/game-achievements.test.ts +0 -80
- package/src/store/sqlite/game-scores.test.ts +0 -132
- package/src/store/sqlite/game-state.test.ts +0 -89
- package/src/store/sqlite/global-index.test.ts +0 -222
- package/src/store/sqlite/mechanical-fix.test.ts +0 -162
- package/src/store/sqlite/perf-samples.test.ts +0 -169
- package/src/store/sqlite/raptor.test.ts +0 -139
- package/src/store/sqlite/turns.test.ts +0 -218
- package/src/store/sqlite.cachehit.test.ts +0 -68
- package/src/store/sqlite.dbmaint.test.ts +0 -193
- package/src/store/sqlite.dbmirror.test.ts +0 -229
- package/src/store/turns/contract-compliance.test.ts +0 -562
- package/src/store/turns/memory-store.test.ts +0 -15
- package/src/store/turns/migrations.test.ts +0 -161
- package/src/store/turns/sqlite-store.test.ts +0 -161
- package/src/store/vectorIndex.test.ts +0 -140
- package/src/store.test.ts +0 -191
- package/src/supersede.test.ts +0 -42
- package/src/topics/cluster.test.ts +0 -176
- package/src/topics/store.test.ts +0 -132
- package/src/types.test.ts +0 -10
- package/src/vector-search-cache.test.ts +0 -190
- package/src/vectorStore.test.ts +0 -533
- 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-
|
|
2
|
-
//# sourceMappingURL=useSSE-
|
|
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
|
package/extensions/dashboard-client/dist/assets/{useSSE-BBYt5UPB.js.map → useSSE-Bf5LOLSi.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSSE-
|
|
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-
|
|
8
|
-
<link rel="stylesheet" crossorigin href="./assets/index-
|
|
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
|
-
|
|
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
|
|
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 === "
|
|
106
|
-
|
|
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
|
-
*
|
|
5
|
-
* Cache Hits 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
|
-
|
|
47
|
-
|
|
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'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 & cost mega-compact has reclaimed, grouped by
|
|
124
|
-
|
|
125
|
-
|
|
124
|
+
How much context & 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
|
|
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
|
|
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
|
-
|
|
196
|
-
</td>
|
|
197
|
-
<td className="num">
|
|
198
|
-
|
|
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.
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
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
|
-
{
|
|
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
|
-
|
|
249
|
-
|
|
250
|
-
|
|
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
|
);
|