fix(coding-agent): count custom messages in compaction budget

closes #6326
This commit is contained in:
Mario Zechner
2026-07-09 12:45:26 +02:00
parent e9fa5a68a1
commit a6f720e6ca
3 changed files with 97 additions and 80 deletions
@@ -18,6 +18,7 @@ import {
import {
buildSessionContext,
type CompactionEntry,
type CustomMessageEntry,
type ModelChangeEntry,
migrateSessionEntries,
parseSessionEntries,
@@ -134,6 +135,21 @@ function createThinkingLevelEntry(thinkingLevel: string): ThinkingLevelChangeEnt
return entry;
}
function createCustomMessageEntry(content: string): CustomMessageEntry {
const id = `test-id-${entryCounter++}`;
const entry: CustomMessageEntry = {
type: "custom_message",
id,
parentId: lastId,
timestamp: new Date().toISOString(),
customType: "test",
content,
display: true,
};
lastId = id;
return entry;
}
function extractText(messages: AgentMessage[]): string {
return messages
.map((message) => {
@@ -338,6 +354,25 @@ describe("findCutPoint", () => {
expect(result.turnStartIndex).toBe(2); // Turn 2 starts at index 2
}
});
it("should budget context-visible custom message entries", () => {
const entries: SessionEntry[] = [
createMessageEntry(createUserMessage("hi")),
createMessageEntry(createAssistantMessage("hello")),
createCustomMessageEntry("x".repeat(4000)),
createMessageEntry(createAssistantMessage("ok")),
];
const tinyBudget = findCutPoint(entries, 0, entries.length, 1);
expect(tinyBudget.firstKeptEntryIndex).toBe(3);
expect(tinyBudget.isSplitTurn).toBe(true);
expect(tinyBudget.turnStartIndex).toBe(2);
const customFitsBudget = findCutPoint(entries, 0, entries.length, 2);
expect(customFitsBudget.firstKeptEntryIndex).toBe(2);
expect(customFitsBudget.isSplitTurn).toBe(false);
expect(customFitsBudget.turnStartIndex).toBe(-1);
});
});
describe("buildSessionContext", () => {