Skip to content

Commit c4c4780

Browse files
authored
fix: preserve original first message context during conversation condensing (#7939)
1 parent 08d7f80 commit c4c4780

File tree

3 files changed

+26
-13
lines changed

3 files changed

+26
-13
lines changed

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -229,9 +229,9 @@ describe("Condense", () => {
229229

230230
const result = getMessagesSinceLastSummary(messages)
231231

232-
// Should include a user message prefix for Bedrock compatibility, the summary, and messages after
232+
// Should include the original first user message for context preservation, the summary, and messages after
233233
expect(result[0].role).toBe("user")
234-
expect(result[0].content).toBe("Please continue from the following summary:")
234+
expect(result[0].content).toBe("First message") // Preserves original first message
235235
expect(result[1]).toEqual(messages[2]) // The summary
236236
expect(result[2]).toEqual(messages[3])
237237
expect(result[3]).toEqual(messages[4])
@@ -249,9 +249,9 @@ describe("Condense", () => {
249249

250250
const result = getMessagesSinceLastSummary(messages)
251251

252-
// Should only include from the last summary
252+
// Should only include from the last summary with original first message preserved
253253
expect(result[0].role).toBe("user")
254-
expect(result[0].content).toBe("Please continue from the following summary:")
254+
expect(result[0].content).toBe("First message") // Preserves original first message
255255
expect(result[1]).toEqual(messages[3]) // Second summary
256256
expect(result[2]).toEqual(messages[4])
257257
expect(result[3]).toEqual(messages[5])

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ describe("getMessagesSinceLastSummary", () => {
3636
expect(result).toEqual(messages)
3737
})
3838

39-
it("should return messages since the last summary with prepended user message", () => {
39+
it("should return messages since the last summary with original first user message", () => {
4040
const messages: ApiMessage[] = [
4141
{ role: "user", content: "Hello", ts: 1 },
4242
{ role: "assistant", content: "Hi there", ts: 2 },
@@ -47,14 +47,14 @@ describe("getMessagesSinceLastSummary", () => {
4747

4848
const result = getMessagesSinceLastSummary(messages)
4949
expect(result).toEqual([
50-
{ role: "user", content: "Please continue from the following summary:", ts: 0 },
50+
{ role: "user", content: "Hello", ts: 1 },
5151
{ role: "assistant", content: "Summary of conversation", ts: 3, isSummary: true },
5252
{ role: "user", content: "How are you?", ts: 4 },
5353
{ role: "assistant", content: "I'm good", ts: 5 },
5454
])
5555
})
5656

57-
it("should handle multiple summary messages and return since the last one with prepended user message", () => {
57+
it("should handle multiple summary messages and return since the last one with original first user message", () => {
5858
const messages: ApiMessage[] = [
5959
{ role: "user", content: "Hello", ts: 1 },
6060
{ role: "assistant", content: "First summary", ts: 2, isSummary: true },
@@ -65,7 +65,7 @@ describe("getMessagesSinceLastSummary", () => {
6565

6666
const result = getMessagesSinceLastSummary(messages)
6767
expect(result).toEqual([
68-
{ role: "user", content: "Please continue from the following summary:", ts: 0 },
68+
{ role: "user", content: "Hello", ts: 1 },
6969
{ role: "assistant", content: "Second summary", ts: 4, isSummary: true },
7070
{ role: "user", content: "What's new?", ts: 5 },
7171
])

src/core/condense/index.ts

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -223,11 +223,24 @@ export function getMessagesSinceLastSummary(messages: ApiMessage[]): ApiMessage[
223223
const messagesSinceSummary = messages.slice(lastSummaryIndex)
224224

225225
// Bedrock requires the first message to be a user message.
226+
// We preserve the original first message to maintain context.
226227
// See https://github.com/RooCodeInc/Roo-Code/issues/4147
227-
const userMessage: ApiMessage = {
228-
role: "user",
229-
content: "Please continue from the following summary:",
230-
ts: messages[0]?.ts ? messages[0].ts - 1 : Date.now(),
228+
if (messagesSinceSummary.length > 0 && messagesSinceSummary[0].role !== "user") {
229+
// Get the original first message (should always be a user message with the task)
230+
const originalFirstMessage = messages[0]
231+
if (originalFirstMessage && originalFirstMessage.role === "user") {
232+
// Use the original first message unchanged to maintain full context
233+
return [originalFirstMessage, ...messagesSinceSummary]
234+
} else {
235+
// Fallback to generic message if no original first message exists (shouldn't happen)
236+
const userMessage: ApiMessage = {
237+
role: "user",
238+
content: "Please continue from the following summary:",
239+
ts: messages[0]?.ts ? messages[0].ts - 1 : Date.now(),
240+
}
241+
return [userMessage, ...messagesSinceSummary]
242+
}
231243
}
232-
return [userMessage, ...messagesSinceSummary]
244+
245+
return messagesSinceSummary
233246
}

0 commit comments

Comments
 (0)