| 1 | import type { ContextInfo, ContextPanelInfo, WireUsage } from "./types"; |
| 2 | |
| 3 | // contextSessionCache picks the session-cumulative cache hit/miss pair for the |
| 4 | // panel's session average. The shared ContextInfo is refreshed after every |
| 5 | // usage event and also drives StatusBar, so prefer it over the panel's |
| 6 | // independently throttled snapshot. Panel telemetry remains the all-sources |
| 7 | // fallback for callers without live context; executor-only wire counters only |
| 8 | // bridge the pre-refresh gap. The pair always comes from one source so the |
| 9 | // computed rate never mixes scopes. |
| 10 | export function contextSessionCache( |
| 11 | info?: Pick<ContextPanelInfo, "sessionCacheHitTokens" | "sessionCacheMissTokens"> | null, |
| 12 | context?: Pick<ContextInfo, "cacheHitTokens" | "cacheMissTokens">, |
| 13 | usage?: Pick<WireUsage, "sessionCacheHitTokens" | "sessionCacheMissTokens">, |
| 14 | ): { hit: number; miss: number } { |
| 15 | const ctxHit = context?.cacheHitTokens ?? 0; |
| 16 | const ctxMiss = context?.cacheMissTokens ?? 0; |
| 17 | if (ctxHit + ctxMiss > 0) return { hit: ctxHit, miss: ctxMiss }; |
| 18 | const infoHit = info?.sessionCacheHitTokens ?? 0; |
| 19 | const infoMiss = info?.sessionCacheMissTokens ?? 0; |
| 20 | if (infoHit + infoMiss > 0) return { hit: infoHit, miss: infoMiss }; |
| 21 | return { hit: usage?.sessionCacheHitTokens ?? 0, miss: usage?.sessionCacheMissTokens ?? 0 }; |
| 22 | } |
| 23 |