diff --git a/src/four-opencode-token-budget-guard.ts b/src/four-opencode-token-budget-guard.ts index 1c6bda0..a605e5a 100644 --- a/src/four-opencode-token-budget-guard.ts +++ b/src/four-opencode-token-budget-guard.ts @@ -77,13 +77,22 @@ export const FourTokenBudgetGuardPlugin: Plugin = async (_ctx) => { if (!part || part.type !== "text" || typeof part.text !== "string") return; const sessionID = props.sessionID ?? "unknown"; - currentSessionID = sessionID; + // Only switch if new session is genuinely new (no tokens yet) + if (sessionID !== currentSessionID) { + const existingTokens = sessionTokens.get(sessionID); + if (existingTokens === 0) { + // New session — start fresh + currentSessionID = sessionID; + } + // else: keep tracking old session (compaction created new ID but tokens belong to old) + } const tokensApprox = estimateTokens(part.text); const cumulative = sessionTokens.add(sessionID, tokensApprox); const msgRole = "text-part"; // Publish to plugin bus (P4d) — fire-and-forget on every token update - busPublisher.publish(currentSessionID, tokensApprox, sessionTokens, config).catch(() => {}); + // Use the EVENT's sessionID, not currentSessionID (avoids drift when event has new ID) + busPublisher.publish(sessionID, tokensApprox, sessionTokens, config).catch(() => {}); if (cumulative >= config.softLimit) { const isHard = cumulative >= config.hardLimit; diff --git a/src/session-cache.ts b/src/session-cache.ts index b0319a0..e55e0bb 100644 --- a/src/session-cache.ts +++ b/src/session-cache.ts @@ -16,18 +16,14 @@ export class SessionTokenCache { get(sessionID: string): number { const entry = this.map.get(sessionID); if (!entry) return 0; - if (Date.now() - entry.lastAccess > this.ttlMs) { - this.map.delete(sessionID); - return 0; - } - entry.lastAccess = Date.now(); + // Don't update lastAccess here — get() is read-only return entry.tokens; } add(sessionID: string, delta: number): number { this.evictStale(); // Read own state BEFORE LRU eviction so we don't self-evict - const prev = this.get(sessionID); // touches lastAccess via get() + const prev = this.get(sessionID); // touches lastAccess (get is read-only) // If we just added a new session, may need to evict this.evictOldestIfFull(); const next = prev + delta; diff --git a/src/tui.tsx b/src/tui.tsx index 6364df0..bf64093 100644 --- a/src/tui.tsx +++ b/src/tui.tsx @@ -54,7 +54,6 @@ function TokenMeterView() { )}