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,329 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* extensions/mega-events/separated-prompt.ts — A1+A2 PLAN_V2 Phase 2+3
|
|
3
|
+
* Message Separation + Cache-Optimized Prompt Builder:
|
|
4
|
+
* - buildSeparatedPrompt(): Basic 4-layer message separation (Phase 2).
|
|
5
|
+
* - buildCacheOptimizedPrompt(): Insert Layer 2 (vector-optimized stable
|
|
6
|
+
* context) between summary (Layer 1) and thread (Layer 3), ordered by
|
|
7
|
+
* stripe stability DESC (Phase 3).
|
|
8
|
+
* - detectTopicShift(): Cosine-similarity-based topic-shift detection.
|
|
9
|
+
* - cosineSimilarity(): cosine similarity of two Float32Array embeddings.
|
|
10
|
+
*
|
|
11
|
+
* Layer order (Phase 3): 0 (system) -> 1 (summary) -> 2 (cache stripes) ->
|
|
12
|
+
* 3 (thread: user/assistant turns) -> 4 (tool results at tail).
|
|
13
|
+
*
|
|
14
|
+
* Feature-gated by MEGACOMPACT_CACHE_STRIPING (default OFF).
|
|
15
|
+
* MEGACOMPACT_MESSAGE_SEPARATION must also be ON for any layering to occur.
|
|
16
|
+
* Flag-OFF = byte-identical to pre-sprint — returns messages unchanged.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import type { AgentMessage } from "@earendil-works/pi-agent-core";
|
|
20
|
+
import { openStore } from "../../src/store/sqlite/utils.js";
|
|
21
|
+
import { getStateDir } from "../../src/store.js";
|
|
22
|
+
|
|
23
|
+
// ─── Exported types ──────────────────────────────────────────────────────────
|
|
24
|
+
|
|
25
|
+
export interface SeparatedPromptOptions {
|
|
26
|
+
/** Path to the SQLite store directory. Defaults to getStateDir(). */
|
|
27
|
+
stateDir?: string;
|
|
28
|
+
/** Conversation/agent ID for stripe lookups. Defaults to 'main'. */
|
|
29
|
+
conversationId?: string;
|
|
30
|
+
/** Current turn index for embedding_cache lookups. Defaults to 0. */
|
|
31
|
+
turnIndex?: number;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface CacheStripeRow {
|
|
35
|
+
chunk_id: string;
|
|
36
|
+
stripe: number;
|
|
37
|
+
stability: number;
|
|
38
|
+
assigned_at: number;
|
|
39
|
+
epoch_id: string | null;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export interface EmbeddingCacheRow {
|
|
43
|
+
content_hash: string;
|
|
44
|
+
embedding: Buffer;
|
|
45
|
+
computed_at: number;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// ─── Constants ───────────────────────────────────────────────────────────────
|
|
49
|
+
|
|
50
|
+
/** Default stripe limit: top 10 most stable chunks. */
|
|
51
|
+
const DEFAULT_STRIPE_LIMIT = 10;
|
|
52
|
+
|
|
53
|
+
/** Topic-shift threshold: similarity below this triggers a stripe refresh. */
|
|
54
|
+
const TOPIC_SHIFT_THRESHOLD = 0.7;
|
|
55
|
+
|
|
56
|
+
// ─── Build separated prompt (Phase 2) ────────────────────────────────────────
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Reorganize messages into stable layers for better prompt caching.
|
|
60
|
+
*
|
|
61
|
+
* Layer order: 0 (system) -> 1 (summary) -> 3 (thread: user/assistant turns) ->
|
|
62
|
+
* 4 (tool results at tail).
|
|
63
|
+
*
|
|
64
|
+
* Feature gate: MEGACOMPACT_MESSAGE_SEPARATION env var. When OFF (default),
|
|
65
|
+
* returns `messages` unchanged (byte-identical to pre-sprint).
|
|
66
|
+
*/
|
|
67
|
+
export function buildSeparatedPrompt(
|
|
68
|
+
messages: AgentMessage[],
|
|
69
|
+
_opts?: SeparatedPromptOptions,
|
|
70
|
+
): AgentMessage[] {
|
|
71
|
+
const flag = process.env.MEGACOMPACT_MESSAGE_SEPARATION;
|
|
72
|
+
if (flag === "0" || flag === "false" || flag === undefined || flag === "") {
|
|
73
|
+
return messages;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// pi's AgentMessage union has no "system" role — the system prompt lives in
|
|
77
|
+
// AgentState.systemPrompt, separate from this array. The cache-relevant,
|
|
78
|
+
// low-risk transformation is moving volatile tool results/executions to the
|
|
79
|
+
// tail so the stable prefix (user/assistant/summaries/custom) stays contiguous.
|
|
80
|
+
// Discriminate by role only — never reach into `.content`/`.tool_calls`,
|
|
81
|
+
// which are variant-specific and require narrowing.
|
|
82
|
+
const main: AgentMessage[] = [];
|
|
83
|
+
const tail: AgentMessage[] = [];
|
|
84
|
+
for (const m of messages) {
|
|
85
|
+
if (m.role === "toolResult" || m.role === "bashExecution") {
|
|
86
|
+
tail.push(m);
|
|
87
|
+
} else {
|
|
88
|
+
main.push(m);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (tail.length === 0) return messages; // nothing to reorder — byte-identical
|
|
92
|
+
return [...main, ...tail];
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// ─── Cosine similarity ───────────────────────────────────────────────────────
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Compute cosine similarity between two Float32Array embeddings.
|
|
99
|
+
* Returns a value in [0, 1] where 1 = identical direction.
|
|
100
|
+
* Returns 0 if either vector is zero or inputs are mismatched.
|
|
101
|
+
*/
|
|
102
|
+
export function cosineSimilarity(a: Float32Array, b: Float32Array): number {
|
|
103
|
+
if (a.length !== b.length || a.length === 0) return 0;
|
|
104
|
+
|
|
105
|
+
let dot = 0;
|
|
106
|
+
let normA = 0;
|
|
107
|
+
let normB = 0;
|
|
108
|
+
|
|
109
|
+
for (let i = 0; i < a.length; i++) {
|
|
110
|
+
dot += a[i] * b[i];
|
|
111
|
+
normA += a[i] * a[i];
|
|
112
|
+
normB += b[i] * b[i];
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const denom = Math.sqrt(normA) * Math.sqrt(normB);
|
|
116
|
+
if (denom === 0) return 0;
|
|
117
|
+
|
|
118
|
+
return dot / denom;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// ─── Buffer ↔ Float32Array helpers ───────────────────────────────────────────
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Decode a Float32Array from a Buffer (little-endian float32 blob).
|
|
125
|
+
* Returns null on empty/undefined input.
|
|
126
|
+
*/
|
|
127
|
+
export function decodeEmbeddingBlob(buf: Buffer | undefined | null): Float32Array | null {
|
|
128
|
+
if (!buf || buf.length === 0) return null;
|
|
129
|
+
return new Float32Array(buf.buffer, buf.byteOffset, buf.byteLength / 4);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Encode a Float32Array into a Buffer for DB storage.
|
|
134
|
+
*/
|
|
135
|
+
export function encodeEmbeddingBlob(vec: Float32Array): Buffer {
|
|
136
|
+
return Buffer.from(vec.buffer, vec.byteOffset, vec.byteLength);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// ─── Topic-shift detection ───────────────────────────────────────────────────
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Detect whether the conversation topic has shifted between the current turn
|
|
143
|
+
* and the previous turn. Uses cosine similarity between topic embeddings.
|
|
144
|
+
*
|
|
145
|
+
* Returns `true` when similarity < TOPIC_SHIFT_THRESHOLD (0.7), meaning the
|
|
146
|
+
* stable cache prefix may need reordering.
|
|
147
|
+
*
|
|
148
|
+
* Returns `false` (no shift) when either embedding is missing.
|
|
149
|
+
*/
|
|
150
|
+
export function detectTopicShift(
|
|
151
|
+
currentEmb: Float32Array | null | undefined,
|
|
152
|
+
previousEmb: Float32Array | null | undefined,
|
|
153
|
+
): boolean {
|
|
154
|
+
if (!currentEmb || !previousEmb) return false;
|
|
155
|
+
return cosineSimilarity(currentEmb, previousEmb) < TOPIC_SHIFT_THRESHOLD;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// ─── Load embeddings from store ──────────────────────────────────────────────
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Load the topic embedding for a given turn from the embedding_cache table.
|
|
162
|
+
* Returns null if no embedding is stored for that turn.
|
|
163
|
+
*/
|
|
164
|
+
export function loadTopicEmbedding(
|
|
165
|
+
stateDir: string,
|
|
166
|
+
conversationId: string,
|
|
167
|
+
turnIndex: number,
|
|
168
|
+
): Float32Array | null {
|
|
169
|
+
const db = openStore(stateDir);
|
|
170
|
+
try {
|
|
171
|
+
const row = db.prepare(
|
|
172
|
+
`SELECT embedding FROM embedding_cache WHERE content_hash = ?`,
|
|
173
|
+
).get(`topic:${conversationId}:${turnIndex}`) as { embedding: Buffer } | undefined;
|
|
174
|
+
|
|
175
|
+
if (!row) return null;
|
|
176
|
+
return decodeEmbeddingBlob(row.embedding);
|
|
177
|
+
} finally {
|
|
178
|
+
db.close();
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Store a topic embedding for a given turn in the embedding_cache table.
|
|
184
|
+
* Idempotent (INSERT OR REPLACE).
|
|
185
|
+
*/
|
|
186
|
+
export function storeTopicEmbedding(
|
|
187
|
+
stateDir: string,
|
|
188
|
+
conversationId: string,
|
|
189
|
+
turnIndex: number,
|
|
190
|
+
embedding: Float32Array,
|
|
191
|
+
): void {
|
|
192
|
+
const db = openStore(stateDir);
|
|
193
|
+
try {
|
|
194
|
+
const contentHash = `topic:${conversationId}:${turnIndex}`;
|
|
195
|
+
const blob = encodeEmbeddingBlob(embedding);
|
|
196
|
+
db.prepare(
|
|
197
|
+
`INSERT OR REPLACE INTO embedding_cache (content_hash, embedding, computed_at) VALUES (?, ?, ?)`,
|
|
198
|
+
).run(contentHash, blob, Date.now());
|
|
199
|
+
} finally {
|
|
200
|
+
db.close();
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// ─── Cache stripe management ─────────────────────────────────────────────────
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Refresh cache stripe assignments from the cache_stripes table for a given
|
|
208
|
+
* conversation/epoch. Returns rows ordered by stability DESC.
|
|
209
|
+
*
|
|
210
|
+
* This is called at the start of each turn (or on topic-shift) to ensure the
|
|
211
|
+
* stripe assignments reflect the latest stability scores.
|
|
212
|
+
*/
|
|
213
|
+
export function refreshStripeAssignments(
|
|
214
|
+
stateDir: string,
|
|
215
|
+
epochId: string,
|
|
216
|
+
limit = DEFAULT_STRIPE_LIMIT,
|
|
217
|
+
): CacheStripeRow[] {
|
|
218
|
+
const db = openStore(stateDir);
|
|
219
|
+
try {
|
|
220
|
+
const rows = db.prepare(
|
|
221
|
+
`SELECT chunk_id, stripe, stability, assigned_at, epoch_id
|
|
222
|
+
FROM cache_stripes
|
|
223
|
+
WHERE epoch_id = ?
|
|
224
|
+
ORDER BY stability DESC
|
|
225
|
+
LIMIT ?`,
|
|
226
|
+
).all(epochId, limit) as unknown as CacheStripeRow[];
|
|
227
|
+
|
|
228
|
+
return rows;
|
|
229
|
+
} finally {
|
|
230
|
+
db.close();
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// ─── Build cache-optimized prompt (Phase 3) ──────────────────────────────────
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Build a cache-optimized prompt with 5 layers:
|
|
238
|
+
* 0 (system) -> 1 (summary) -> 2 (cache stripes) -> 3 (thread) -> 4 (tool)
|
|
239
|
+
*
|
|
240
|
+
* Feature gate: MEGACOMPACT_CACHE_STRIPING (default OFF). When OFF, delegates
|
|
241
|
+
* to buildSeparatedPrompt (byte-identical to Phase 2 behavior).
|
|
242
|
+
*
|
|
243
|
+
* When ON but MEGACOMPACT_MESSAGE_SEPARATION is OFF, also delegates to
|
|
244
|
+
* buildSeparatedPrompt (which returns messages unchanged).
|
|
245
|
+
*/
|
|
246
|
+
export function buildCacheOptimizedPrompt(
|
|
247
|
+
messages: AgentMessage[],
|
|
248
|
+
opts?: SeparatedPromptOptions,
|
|
249
|
+
): AgentMessage[] {
|
|
250
|
+
const flag = process.env.MEGACOMPACT_CACHE_STRIPING;
|
|
251
|
+
if (flag === "0" || flag === "false" || flag === undefined || flag === "") {
|
|
252
|
+
// Flag OFF: delegate to buildSeparatedPrompt (byte-identical).
|
|
253
|
+
return buildSeparatedPrompt(messages, opts);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// Build the base 4-layer structure first.
|
|
257
|
+
const base = buildSeparatedPrompt(messages, opts);
|
|
258
|
+
|
|
259
|
+
// If base equals messages, separation is OFF — return unchanged.
|
|
260
|
+
if (base === messages) return base;
|
|
261
|
+
|
|
262
|
+
const stateDir = opts?.stateDir ?? getStateDir();
|
|
263
|
+
|
|
264
|
+
// Layer 1 = leading branch/compaction summaries (the stable summary layer).
|
|
265
|
+
// There is no "system" role in pi's AgentMessage union, so Layer 0 is empty.
|
|
266
|
+
// Count leading summaries to find where to insert the cache-stripe layer.
|
|
267
|
+
let layer1End = 0;
|
|
268
|
+
for (let i = 0; i < base.length; i++) {
|
|
269
|
+
const r = base[i].role;
|
|
270
|
+
if (r === "branchSummary" || r === "compactionSummary") {
|
|
271
|
+
layer1End = i + 1;
|
|
272
|
+
} else {
|
|
273
|
+
break;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// Lay out the result: Layer 1 (summaries) first.
|
|
278
|
+
const result: AgentMessage[] = base.slice(0, layer1End);
|
|
279
|
+
|
|
280
|
+
// Insert Layer 2: cache stripes (stable context ordered by stability DESC).
|
|
281
|
+
// Try to find the most recent epoch.
|
|
282
|
+
const db = openStore(stateDir);
|
|
283
|
+
let epochId: string | null = null;
|
|
284
|
+
try {
|
|
285
|
+
const epoch = db.prepare(
|
|
286
|
+
`SELECT epoch_id FROM checkpoint_epochs ORDER BY created_at DESC LIMIT 1`,
|
|
287
|
+
).get() as { epoch_id: string } | undefined;
|
|
288
|
+
epochId = epoch?.epoch_id ?? null;
|
|
289
|
+
} finally {
|
|
290
|
+
db.close();
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
if (epochId) {
|
|
294
|
+
const stripes = refreshStripeAssignments(stateDir, epochId);
|
|
295
|
+
if (stripes.length > 0) {
|
|
296
|
+
// Build a single user message with concatenated stripe content.
|
|
297
|
+
const stripeBlocks: string[] = [];
|
|
298
|
+
for (const s of stripes) {
|
|
299
|
+
// Load chunk content from context_chunks table.
|
|
300
|
+
const db2 = openStore(stateDir);
|
|
301
|
+
try {
|
|
302
|
+
const chunk = db2.prepare(
|
|
303
|
+
`SELECT normalized_text FROM context_chunks WHERE id = ?`,
|
|
304
|
+
).get(s.chunk_id) as { normalized_text: string } | undefined;
|
|
305
|
+
if (chunk?.normalized_text) {
|
|
306
|
+
stripeBlocks.push(chunk.normalized_text);
|
|
307
|
+
}
|
|
308
|
+
} finally {
|
|
309
|
+
db2.close();
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
if (stripeBlocks.length > 0) {
|
|
314
|
+
result.push({
|
|
315
|
+
role: "user",
|
|
316
|
+
content: stripeBlocks.join("\n\n---\n\n"),
|
|
317
|
+
timestamp: Date.now(),
|
|
318
|
+
} as AgentMessage);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
// Append remaining layers (3: thread, 4: tool results).
|
|
324
|
+
for (let i = layer1End; i < base.length; i++) {
|
|
325
|
+
result.push(base[i]);
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
return result;
|
|
329
|
+
}
|
|
@@ -169,13 +169,20 @@ export function registerSessionHandlers(
|
|
|
169
169
|
} catch {
|
|
170
170
|
/* non-fatal: intent polling never breaks the agent loop */
|
|
171
171
|
}
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
172
|
+
// S53: when recallTailInject is ON, the staged blocks are injected as a
|
|
173
|
+
// user-role tail message by the context handler (recall-tail.ts), NOT
|
|
174
|
+
// here. This prepend path is the legacy behavior (flag OFF = byte-
|
|
175
|
+
// identical pre-sprint). captureModel + rewind-intent consumption above
|
|
176
|
+
// stay unconditional regardless of the flag.
|
|
177
|
+
if (!config.recallTailInject) {
|
|
178
|
+
const cpBlock = runtime.pendingRecallBlock;
|
|
179
|
+
const memBlock = runtime.pendingMemoryRecallBlock;
|
|
180
|
+
if (!cpBlock && !memBlock) return;
|
|
181
|
+
runtime.pendingRecallBlock = undefined;
|
|
182
|
+
runtime.pendingMemoryRecallBlock = undefined;
|
|
183
|
+
const composed = [cpBlock, memBlock].filter(Boolean).join("\n\n");
|
|
184
|
+
return { systemPrompt: `${event.systemPrompt}\n\n${composed}` };
|
|
185
|
+
}
|
|
179
186
|
});
|
|
180
187
|
|
|
181
188
|
pi.on("session_shutdown", async (_event, ctx) => {
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* mega-runtime/env-loader.ts — load `.mega-compact.env` from the state dir.
|
|
3
|
+
*
|
|
4
|
+
* The /mega-setup wizard and the dashboard Setup tab write a `.mega-compact.env`
|
|
5
|
+
* file with the user's chosen embedder configuration. Without a loader, that
|
|
6
|
+
* file is write-only dead weight — config is read from process.env at startup
|
|
7
|
+
* (mega-config.ts:loadConfig), so the file was never applied.
|
|
8
|
+
*
|
|
9
|
+
* This loader runs BEFORE loadConfig in the extension entry. It parses the
|
|
10
|
+
* file (KEY=VALUE lines, # comments, quoted values) and applies each key to
|
|
11
|
+
* process.env ONLY if it is not already set — so shell profile / inline env
|
|
12
|
+
* vars always win over the file (the user can override without editing it).
|
|
13
|
+
*
|
|
14
|
+
* Non-fatal: a missing or malformed file never breaks the extension.
|
|
15
|
+
*
|
|
16
|
+
* PREVENT-PI-004: reads a local file only — no network.
|
|
17
|
+
* PREVENT-001: no JSON here; line parser is null/empty-safe.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
21
|
+
import { join } from "node:path";
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Load `.mega-compact.env` from `stateDir` into `process.env`.
|
|
25
|
+
* Keys already set in the environment win (file does not override shell).
|
|
26
|
+
*/
|
|
27
|
+
export function loadMegaEnv(stateDir: string): void {
|
|
28
|
+
const envPath = join(stateDir, ".mega-compact.env");
|
|
29
|
+
if (!existsSync(envPath)) return;
|
|
30
|
+
let content: string;
|
|
31
|
+
try {
|
|
32
|
+
content = readFileSync(envPath, "utf-8");
|
|
33
|
+
} catch {
|
|
34
|
+
return; // unreadable — non-fatal
|
|
35
|
+
}
|
|
36
|
+
for (const line of content.split("\n")) {
|
|
37
|
+
const trimmed = line.trim();
|
|
38
|
+
if (!trimmed || trimmed.startsWith("#")) continue;
|
|
39
|
+
const eq = trimmed.indexOf("=");
|
|
40
|
+
if (eq < 0) continue;
|
|
41
|
+
const key = trimmed.slice(0, eq).trim();
|
|
42
|
+
if (!key) continue;
|
|
43
|
+
let val = trimmed.slice(eq + 1).trim();
|
|
44
|
+
if (
|
|
45
|
+
(val.startsWith('"') && val.endsWith('"')) ||
|
|
46
|
+
(val.startsWith("'") && val.endsWith("'"))
|
|
47
|
+
) {
|
|
48
|
+
val = val.slice(1, -1);
|
|
49
|
+
}
|
|
50
|
+
// Shell / inline env vars win over the file.
|
|
51
|
+
if (process.env[key] === undefined) {
|
|
52
|
+
process.env[key] = val;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -37,6 +37,13 @@ export interface SessionRuntime {
|
|
|
37
37
|
dedupAttempts: number; // total compaction attempts (for hit-rate denominator)
|
|
38
38
|
tokensSaved: number; // this session-instance only: reset on session_start
|
|
39
39
|
lastCompactAt: number | null; // wall-clock ms of the last compaction this session
|
|
40
|
+
// S53A: prefix-break classification timestamps (wall-clock ms).
|
|
41
|
+
lastRecallAt: number | null; // last recall injection this session
|
|
42
|
+
lastInjectAt: number | null; // last tail injection this session
|
|
43
|
+
// S53A: previous cache_hit_pct for drop detection.
|
|
44
|
+
_prevCacheHitPct: number | null;
|
|
45
|
+
// A3: rolling cache health score (0-1) cached between turns for trend detection.
|
|
46
|
+
_lastCacheHealthScore: number | undefined;
|
|
40
47
|
lastNativeCompactAt: number | null; // COMPACT-DEDUP FIX: wall-clock ms of the last NATIVE pi compaction (session_compact event) — used by the agent_end/legacy race guard to skip a redundant ctx.compact() that would throw "Already compacted".
|
|
41
48
|
// S25: live dashboard counters (reset on session_start, mirrored to SQLite).
|
|
42
49
|
compactCount: number; // compactions performed this session-instance
|
|
@@ -72,8 +79,15 @@ export interface SessionRuntime {
|
|
|
72
79
|
// R3c: one guarded compact per error signature (avoids re-compacting the
|
|
73
80
|
// same poisoned region repeatedly).
|
|
74
81
|
poisonedCompactSignatures: Set<string>; // signatures already attempted a compact for
|
|
82
|
+
// S53: recall tail injection state — tracks whether a tail was injected this turn.
|
|
83
|
+
recallInjectedThisTurn: boolean;
|
|
75
84
|
// R7: poisoned-context event counter for the dashboard.
|
|
76
85
|
poisonedCount: number;
|
|
86
|
+
// R13: set when the extension sends a nudge (error-retry, resume, compact)
|
|
87
|
+
// that will trigger the next turn. The turn_end handler checks this flag and
|
|
88
|
+
// skips error classification for extension-initiated turns — prevents the
|
|
89
|
+
// feedback loop where our own nudges get misclassified as errors.
|
|
90
|
+
extensionInitiatedTurn: boolean;
|
|
77
91
|
}
|
|
78
92
|
|
|
79
93
|
// ── ownVersion ─────────────────────────────────────────────────────────────
|
|
@@ -54,6 +54,10 @@ export function resetRuntimeImpl(
|
|
|
54
54
|
dedupAttempts: 0,
|
|
55
55
|
tokensSaved: 0,
|
|
56
56
|
lastCompactAt: null,
|
|
57
|
+
lastRecallAt: null,
|
|
58
|
+
lastInjectAt: null,
|
|
59
|
+
_prevCacheHitPct: null,
|
|
60
|
+
_lastCacheHealthScore: undefined,
|
|
57
61
|
lastNativeCompactAt: null,
|
|
58
62
|
compactCount: 0,
|
|
59
63
|
recallInjections: 0,
|
|
@@ -70,7 +74,9 @@ export function resetRuntimeImpl(
|
|
|
70
74
|
poisonedAdviseSent: false,
|
|
71
75
|
providerOutageAdvised: false,
|
|
72
76
|
poisonedCompactSignatures: new Set(),
|
|
77
|
+
recallInjectedThisTurn: false,
|
|
73
78
|
poisonedCount: 0,
|
|
79
|
+
extensionInitiatedTurn: false,
|
|
74
80
|
};
|
|
75
81
|
self.trimCache = null; // v0.8.6: never replay a stale trim into a new session
|
|
76
82
|
self.statusKey = undefined;
|
|
@@ -267,6 +267,7 @@ export function snapshotImpl(
|
|
|
267
267
|
armed,
|
|
268
268
|
modelSnap,
|
|
269
269
|
providerCachePct,
|
|
270
|
+
perTurnCacheHitPct: self.rt._prevCacheHitPct ?? undefined,
|
|
270
271
|
});
|
|
271
272
|
self.widgetData = _snapResult.widgetData;
|
|
272
273
|
// S33: consume the flare after copying it into widgetData so it fires
|
|
@@ -87,6 +87,10 @@ export class MegaRuntime {
|
|
|
87
87
|
dedupAttempts: 0,
|
|
88
88
|
tokensSaved: 0,
|
|
89
89
|
lastCompactAt: null,
|
|
90
|
+
lastRecallAt: null,
|
|
91
|
+
lastInjectAt: null,
|
|
92
|
+
_prevCacheHitPct: null,
|
|
93
|
+
_lastCacheHealthScore: undefined,
|
|
90
94
|
lastNativeCompactAt: null,
|
|
91
95
|
compactCount: 0,
|
|
92
96
|
recallInjections: 0,
|
|
@@ -103,7 +107,10 @@ export class MegaRuntime {
|
|
|
103
107
|
poisonedAdviseSent: false,
|
|
104
108
|
providerOutageAdvised: false,
|
|
105
109
|
poisonedCompactSignatures: new Set(),
|
|
110
|
+
// S53: tracks whether withRecallTail injected this turn (consumed at turn_end).
|
|
111
|
+
recallInjectedThisTurn: false,
|
|
106
112
|
poisonedCount: 0,
|
|
113
|
+
extensionInitiatedTurn: false,
|
|
107
114
|
};
|
|
108
115
|
// v0.8.6 cache-stability: the cached live-trim view for the current
|
|
109
116
|
// compaction epoch. Set after a fresh runCompact + computeLiveTrimCut, and
|
|
@@ -106,6 +106,11 @@ export interface SnapshotInput {
|
|
|
106
106
|
} | null;
|
|
107
107
|
|
|
108
108
|
lastActivityAt: number;
|
|
109
|
+
|
|
110
|
+
/** A3: per-turn cache hit percentage (most recent turn's ratio, separate
|
|
111
|
+
* from providerCachePct which is the running average). Optional — when null
|
|
112
|
+
* the cache-hit line is omitted from the widget. */
|
|
113
|
+
perTurnCacheHitPct?: number;
|
|
109
114
|
}
|
|
110
115
|
|
|
111
116
|
export interface SnapshotResult {
|
|
@@ -220,6 +225,7 @@ export function computeMegaSnapshot(p: SnapshotInput): SnapshotResult {
|
|
|
220
225
|
cachePct,
|
|
221
226
|
megaCacheFlare: p.megaCacheFlare,
|
|
222
227
|
megaCacheFlarePct: p.megaCacheFlarePct,
|
|
228
|
+
perTurnCacheHitPct: p.perTurnCacheHitPct ?? cachePct,
|
|
223
229
|
levelUpFlare: p.levelUpFlare,
|
|
224
230
|
achievementFlare: p.achievementFlare,
|
|
225
231
|
achievementFlareTitles: p.achievementFlareTitles,
|
|
@@ -77,4 +77,7 @@ export interface WidgetData {
|
|
|
77
77
|
startedAt: number;
|
|
78
78
|
durationMs: number;
|
|
79
79
|
} | null;
|
|
80
|
+
/** A3: per-turn cache hit percentage (most recent turn's hit/miss ratio,
|
|
81
|
+
* 0–100). Separate from cachePct (running average) for trend visibility. */
|
|
82
|
+
perTurnCacheHitPct?: number;
|
|
80
83
|
}
|
|
@@ -131,6 +131,11 @@ export function buildWidgetLines(
|
|
|
131
131
|
`${C.gray}mem${C.reset} ${wd.embedderName} · ${wd.chk} chunks · ${C.blue}comp ${wd.compStr}${C.reset}`,
|
|
132
132
|
`${C.gray}drift${C.reset} ${wd.driftStatus === "ok" ? C.green : C.amber}${wd.driftStatus}${C.reset}`,
|
|
133
133
|
`${C.gray}compact${C.reset} ${sinceCompactStr(wd.sinceCompact)}`,
|
|
134
|
+
...(wd.perTurnCacheHitPct != null
|
|
135
|
+
? [
|
|
136
|
+
`${C.gray}cache hit${C.reset} this turn ${C.green}${Math.round(wd.perTurnCacheHitPct)}%${C.reset}`,
|
|
137
|
+
]
|
|
138
|
+
: []),
|
|
134
139
|
].join(sep);
|
|
135
140
|
// Wrap to terminal width and pad each line
|
|
136
141
|
const wrapped = wrapLine(content, width - 2, panelBg); // 2-char indent
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pi-mega-compact",
|
|
3
|
-
"version": "0.11.
|
|
3
|
+
"version": "0.11.6",
|
|
4
4
|
"description": "Layered, local, vector-backed context compressor for pi — supersede/collapse/cluster compaction with deduped inline recall.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "BSD-3-Clause",
|
|
@@ -28,7 +28,10 @@
|
|
|
28
28
|
"extensions/dashboard-client/dist",
|
|
29
29
|
"src",
|
|
30
30
|
"README.md",
|
|
31
|
-
"LICENSE"
|
|
31
|
+
"LICENSE",
|
|
32
|
+
"!dist/**/*.test.js",
|
|
33
|
+
"!dist/**/*.test.js.map",
|
|
34
|
+
"!**/*.test.ts"
|
|
32
35
|
],
|
|
33
36
|
"pi": {
|
|
34
37
|
"extensions": [
|