From 20b1ebb6682c50827413dca8a45834e9b88de5b7 Mon Sep 17 00:00:00 2001 From: Charles Vien Date: Tue, 7 Apr 2026 21:37:42 -0700 Subject: [PATCH 1/2] Include output_tokens in context usage calculation --- packages/agent/src/adapters/claude/claude-agent.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/agent/src/adapters/claude/claude-agent.ts b/packages/agent/src/adapters/claude/claude-agent.ts index 6774b73a6..d2d4b1dae 100644 --- a/packages/agent/src/adapters/claude/claude-agent.ts +++ b/packages/agent/src/adapters/claude/claude-agent.ts @@ -530,6 +530,11 @@ export class ClaudeAcpAgent extends BaseAcpAgent { } // Store latest assistant usage (excluding subagents) + // Sum all token types as a proxy for post-turn context occupancy: + // current turn's output will become next turn's input. + // Note: per the Anthropic API, input_tokens excludes cache tokens — + // cache_read and cache_creation are reported separately, so summing + // all four fields is not double-counting. if ( "usage" in message.message && message.parent_tool_use_id === null @@ -544,6 +549,7 @@ export class ClaudeAcpAgent extends BaseAcpAgent { }; lastAssistantTotalUsage = usage.input_tokens + + usage.output_tokens + usage.cache_read_input_tokens + usage.cache_creation_input_tokens; From 9e310fab79cda1fc6bd2a3f5d6f3f4ff617d915a Mon Sep 17 00:00:00 2001 From: Charles Vien Date: Tue, 7 Apr 2026 22:09:11 -0700 Subject: [PATCH 2/2] Reset context usage to zero on compaction --- packages/agent/src/adapters/claude/claude-agent.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/agent/src/adapters/claude/claude-agent.ts b/packages/agent/src/adapters/claude/claude-agent.ts index d2d4b1dae..54842af00 100644 --- a/packages/agent/src/adapters/claude/claude-agent.ts +++ b/packages/agent/src/adapters/claude/claude-agent.ts @@ -371,8 +371,18 @@ export class ClaudeAcpAgent extends BaseAcpAgent { switch (message.type) { case "system": if (message.subtype === "compact_boundary") { + // Send used:0 immediately so the client doesn't keep showing + // the stale pre-compaction context size until the next turn. lastAssistantTotalUsage = 0; promptReplayed = true; + await this.client.sessionUpdate({ + sessionId: params.sessionId, + update: { + sessionUpdate: "usage_update", + used: 0, + size: lastContextWindowSize, + }, + }); } if (message.subtype === "local_command_output") { promptReplayed = true;