From 3d273ff853a7137764de93f946513b2f3519fc50 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Sat, 13 Dec 2025 01:02:21 +0900 Subject: [PATCH] fix(hooks): use last assistant message tokens instead of cumulative sum MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously, token calculation accumulated ALL assistant messages' tokens, causing incorrect usage display (e.g., 524.9%) after compaction. Now uses only the last message's input tokens, which reflects the actual current context window usage. 🤖 GENERATED WITH ASSISTANCE OF [OhMyOpenCode](https://github.com/code-yeongyu/oh-my-opencode) --- src/hooks/context-window-monitor.ts | 9 ++++----- src/hooks/grep-output-truncator.ts | 10 +++++----- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/hooks/context-window-monitor.ts b/src/hooks/context-window-monitor.ts index 11e477f..ce8d756 100644 --- a/src/hooks/context-window-monitor.ts +++ b/src/hooks/context-window-monitor.ts @@ -52,11 +52,10 @@ export function createContextWindowMonitorHook(ctx: PluginInput) { const lastAssistant = assistantMessages[assistantMessages.length - 1] if (lastAssistant.providerID !== "anthropic") return - const totalInputTokens = assistantMessages.reduce((sum, m) => { - const inputTokens = m.tokens?.input ?? 0 - const cacheReadTokens = m.tokens?.cache?.read ?? 0 - return sum + inputTokens + cacheReadTokens - }, 0) + // Use only the last assistant message's input tokens + // This reflects the ACTUAL current context window usage (post-compaction) + const lastTokens = lastAssistant.tokens + const totalInputTokens = (lastTokens?.input ?? 0) + (lastTokens?.cache?.read ?? 0) const actualUsagePercentage = totalInputTokens / ANTHROPIC_ACTUAL_LIMIT diff --git a/src/hooks/grep-output-truncator.ts b/src/hooks/grep-output-truncator.ts index 7b5405a..ec8d1f3 100644 --- a/src/hooks/grep-output-truncator.ts +++ b/src/hooks/grep-output-truncator.ts @@ -98,11 +98,11 @@ export function createGrepOutputTruncatorHook(ctx: PluginInput) { if (assistantMessages.length === 0) return - const totalInputTokens = assistantMessages.reduce((sum, m) => { - const inputTokens = m.tokens?.input ?? 0 - const cacheReadTokens = m.tokens?.cache?.read ?? 0 - return sum + inputTokens + cacheReadTokens - }, 0) + // Use only the last assistant message's input tokens + // This reflects the ACTUAL current context window usage (post-compaction) + const lastAssistant = assistantMessages[assistantMessages.length - 1] + const lastTokens = lastAssistant.tokens + const totalInputTokens = (lastTokens?.input ?? 0) + (lastTokens?.cache?.read ?? 0) const remainingTokens = ANTHROPIC_ACTUAL_LIMIT - totalInputTokens