Skip to content

Commit 32e7ab5

Browse files
committed
fix: allow merging regular user messages into summary in API shaping
The mergeConsecutiveApiMessages function now allows merging a regular user message that follows a summary message. Since this is API-only shaping (storage is unaffected), rewind semantics remain intact. - Remove !prev.isSummary guard to allow merge INTO summary - Keep !msg.isSummary guard to prevent merging a summary INTO something - Update tests to reflect new expected behavior
1 parent 16296c8 commit 32e7ab5

2 files changed

Lines changed: 19 additions & 3 deletions

File tree

src/core/task/__tests__/mergeConsecutiveApiMessages.spec.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,28 @@ describe("mergeConsecutiveApiMessages", () => {
1919
expect(merged[1].role).toBe("assistant")
2020
})
2121

22-
it("does not merge summary messages", () => {
22+
it("merges regular user message into a summary (API shaping only)", () => {
2323
const merged = mergeConsecutiveApiMessages([
2424
{ role: "user", content: [{ type: "text", text: "Summary" }], ts: 1, isSummary: true, condenseId: "s" },
2525
{ role: "user", content: [{ type: "text", text: "After" }], ts: 2 },
2626
])
2727

28+
expect(merged).toHaveLength(1)
29+
expect(merged[0].isSummary).toBe(true)
30+
expect(merged[0].content).toEqual([
31+
{ type: "text", text: "Summary" },
32+
{ type: "text", text: "After" },
33+
])
34+
})
35+
36+
it("does not merge a summary into a preceding message", () => {
37+
const merged = mergeConsecutiveApiMessages([
38+
{ role: "user", content: [{ type: "text", text: "Before" }], ts: 1 },
39+
{ role: "user", content: [{ type: "text", text: "Summary" }], ts: 2, isSummary: true, condenseId: "s" },
40+
])
41+
2842
expect(merged).toHaveLength(2)
43+
expect(merged[0].isSummary).toBeUndefined()
44+
expect(merged[1].isSummary).toBe(true)
2945
})
3046
})

src/core/task/mergeConsecutiveApiMessages.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ export function mergeConsecutiveApiMessages(messages: ApiMessage[], options?: {
3434
prev &&
3535
prev.role === msg.role &&
3636
mergeRoles.has(msg.role) &&
37-
// Keep summary/truncation markers isolated so rewind semantics stay clear.
38-
!prev.isSummary &&
37+
// Allow merging regular messages into a summary (API-only shaping),
38+
// but never merge a summary into something else.
3939
!msg.isSummary &&
4040
!prev.isTruncationMarker &&
4141
!msg.isTruncationMarker

0 commit comments

Comments
 (0)