diff --git a/src/agents/compaction.test.ts b/src/agents/compaction.test.ts index d1a790f89..1cfacda9a 100644 --- a/src/agents/compaction.test.ts +++ b/src/agents/compaction.test.ts @@ -30,6 +30,20 @@ describe("splitMessagesByTokenShare", () => { expect(parts[1]?.length).toBeGreaterThan(0); expect(parts.flat().length).toBe(messages.length); }); + + it("preserves message order across parts", () => { + const messages: AgentMessage[] = [ + makeMessage(1, 4000), + makeMessage(2, 4000), + makeMessage(3, 4000), + makeMessage(4, 4000), + makeMessage(5, 4000), + makeMessage(6, 4000), + ]; + + const parts = splitMessagesByTokenShare(messages, 3); + expect(parts.flat().map((msg) => msg.timestamp)).toEqual(messages.map((msg) => msg.timestamp)); + }); }); describe("pruneHistoryForContextShare", () => { @@ -53,6 +67,29 @@ describe("pruneHistoryForContextShare", () => { expect(pruned.messages.length).toBeGreaterThan(0); }); + it("keeps the newest messages when pruning", () => { + const messages: AgentMessage[] = [ + makeMessage(1, 4000), + makeMessage(2, 4000), + makeMessage(3, 4000), + makeMessage(4, 4000), + makeMessage(5, 4000), + makeMessage(6, 4000), + ]; + const totalTokens = estimateMessagesTokens(messages); + const maxContextTokens = Math.max(1, Math.floor(totalTokens * 0.5)); // budget = 25% + const pruned = pruneHistoryForContextShare({ + messages, + maxContextTokens, + maxHistoryShare: 0.5, + parts: 2, + }); + + const keptIds = pruned.messages.map((msg) => msg.timestamp); + const expectedSuffix = messages.slice(-keptIds.length).map((msg) => msg.timestamp); + expect(keptIds).toEqual(expectedSuffix); + }); + it("keeps history when already within budget", () => { const messages: AgentMessage[] = [makeMessage(1, 1000)]; const maxContextTokens = 2000;