Skip to content

Commit df2f10a

Browse files
Fix context compression loop when recent messages exceed threshold
If the last N messages are very large (e.g. big file reads), the compressed context could still exceed the threshold, causing re-compression every iteration. Now reduces the number of kept messages until the result fits under the threshold. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 56c1f96 commit df2f10a

2 files changed

Lines changed: 13 additions & 3 deletions

File tree

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "codeep",
3-
"version": "1.2.115",
3+
"version": "1.2.116",
44
"description": "AI-powered coding assistant built for the terminal. Multiple LLM providers, project-aware context, and a seamless development workflow.",
55
"type": "module",
66
"main": "dist/index.js",

src/utils/agent.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,6 @@ function compressMessages(messages: Message[], actions: ActionLog[]): Message[]
9797
if (messages.length <= RECENT_MESSAGES_TO_KEEP + 1) return messages;
9898

9999
const firstMessage = messages[0];
100-
const recentMessages = messages.slice(-RECENT_MESSAGES_TO_KEEP);
101100

102101
// Build summary from action log
103102
const fileWrites = actions.filter(a => a.type === 'write' || a.type === 'edit');
@@ -122,7 +121,18 @@ function compressMessages(messages: Message[], actions: ActionLog[]): Message[]
122121

123122
const summaryMessage: Message = { role: 'user', content: summaryLines.join('\n') };
124123

125-
debug(`Context compressed: ${totalChars} chars → keeping first + summary + last ${RECENT_MESSAGES_TO_KEEP} messages`);
124+
// Reduce recent messages kept until compressed result fits under threshold (min 2)
125+
let keep = RECENT_MESSAGES_TO_KEEP;
126+
let recentMessages = messages.slice(-keep);
127+
while (keep > 2) {
128+
const compressedChars = firstMessage.content.length + summaryMessage.content.length +
129+
recentMessages.reduce((sum, m) => sum + m.content.length, 0);
130+
if (compressedChars < CONTEXT_COMPRESS_THRESHOLD) break;
131+
keep--;
132+
recentMessages = messages.slice(-keep);
133+
}
134+
135+
debug(`Context compressed: ${totalChars} chars → keeping first + summary + last ${keep} messages`);
126136
return [firstMessage, summaryMessage, ...recentMessages];
127137
}
128138

0 commit comments

Comments
 (0)