Skip to content

Commit 6e02901

Browse files
committed
fix: include first message in condense summarization
- Modified summarizeConversation to include the first message when creating summary - Added test to verify first message is included in summarization content - Fixes issue where initial task context was lost after condensation Fixes #8293
1 parent d3d0967 commit 6e02901

File tree

3 files changed

+46
-3
lines changed

3 files changed

+46
-3
lines changed

.tmp/review/Roo-Code

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Subproject commit 8dbd8c4b1b72fb48be3990a8e78285a787a1828c

src/core/condense/__tests__/condense.spec.ts

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { summarizeConversation, getMessagesSinceLastSummary, N_MESSAGES_TO_KEEP
1010

1111
// Create a mock ApiHandler for testing
1212
class MockApiHandler extends BaseProvider {
13-
createMessage(): any {
13+
createMessage(systemPrompt: string, messages: Anthropic.Messages.MessageParam[], metadata?: any): any {
1414
// Mock implementation for testing - returns an async iterable stream
1515
const mockStream = {
1616
async *[Symbol.asyncIterator]() {
@@ -204,6 +204,48 @@ describe("Condense", () => {
204204
expect(result.messages).toEqual(messages)
205205
expect(result.cost).toBeGreaterThan(0)
206206
})
207+
208+
it("should include the first message in the summarization content", async () => {
209+
// Create a mock handler that captures what messages are sent for summarization
210+
let capturedMessages: any[] = []
211+
class CapturingMockApiHandler extends MockApiHandler {
212+
override createMessage(
213+
systemPrompt: string,
214+
messages: Anthropic.Messages.MessageParam[],
215+
metadata?: any,
216+
): any {
217+
// Capture the messages sent for summarization (excluding the final request message)
218+
capturedMessages = messages.slice(0, -1)
219+
return super.createMessage(systemPrompt, messages, metadata)
220+
}
221+
}
222+
223+
const capturingHandler = new CapturingMockApiHandler()
224+
const messages: ApiMessage[] = [
225+
{ role: "user", content: "Initial task: Create a TODO app" },
226+
{ role: "assistant", content: "I'll help you create a TODO app" },
227+
{ role: "user", content: "Add user authentication" },
228+
{ role: "assistant", content: "Adding authentication" },
229+
{ role: "user", content: "Add database support" },
230+
{ role: "assistant", content: "Setting up database" },
231+
{ role: "user", content: "Add API endpoints" },
232+
{ role: "assistant", content: "Creating API endpoints" },
233+
{ role: "user", content: "Deploy it" },
234+
]
235+
236+
await summarizeConversation(messages, capturingHandler, "System prompt", taskId, 5000, false)
237+
238+
// Verify that the first message was included in what gets summarized
239+
expect(capturedMessages.length).toBeGreaterThan(0)
240+
expect(capturedMessages[0]).toEqual({
241+
role: "user",
242+
content: "Initial task: Create a TODO app",
243+
})
244+
245+
// Verify all messages except the last N_MESSAGES_TO_KEEP were included
246+
const expectedMessagesToSummarize = messages.slice(0, -N_MESSAGES_TO_KEEP)
247+
expect(capturedMessages).toEqual(expectedMessagesToSummarize)
248+
})
207249
})
208250

209251
describe("getMessagesSinceLastSummary", () => {

src/core/condense/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,8 @@ export async function summarizeConversation(
103103

104104
// Always preserve the first message (which may contain slash command content)
105105
const firstMessage = messages[0]
106-
// Get messages to summarize, excluding the first message and last N messages
107-
const messagesToSummarize = getMessagesSinceLastSummary(messages.slice(1, -N_MESSAGES_TO_KEEP))
106+
// Get messages to summarize, including the first message but excluding last N messages
107+
const messagesToSummarize = getMessagesSinceLastSummary(messages.slice(0, -N_MESSAGES_TO_KEEP))
108108

109109
if (messagesToSummarize.length <= 1) {
110110
const error =

0 commit comments

Comments
 (0)