@@ -188,6 +188,35 @@ describe("Context Management", () => {
188188 // Last message should NOT be tagged (now at index 4)
189189 expect ( result . messages [ 4 ] . truncationParent ) . toBeUndefined ( )
190190 } )
191+
192+ it ( "should truncate from the effective history when earlier messages were condensed" , ( ) => {
193+ const condenseId = "prior-condense"
194+ const messages : ApiMessage [ ] = [
195+ { role : "user" , content : "Hidden user" , condenseParent : condenseId } ,
196+ { role : "assistant" , content : "Hidden assistant" , condenseParent : condenseId } ,
197+ { role : "user" , content : "Earlier summary" , isSummary : true , condenseId } ,
198+ { role : "assistant" , content : "Visible assistant 1" } ,
199+ { role : "user" , content : "Visible user 1" } ,
200+ { role : "assistant" , content : "Visible assistant 2" } ,
201+ { role : "user" , content : "Visible user 2" } ,
202+ ]
203+
204+ const result = truncateConversation ( messages , 0.5 , taskId )
205+
206+ expect ( result . messagesRemoved ) . toBe ( 2 )
207+
208+ // Messages hidden behind the summary should stay untouched.
209+ expect ( result . messages [ 0 ] . truncationParent ) . toBeUndefined ( )
210+ expect ( result . messages [ 1 ] . truncationParent ) . toBeUndefined ( )
211+
212+ // The summary remains the anchor, and truncation starts after it.
213+ expect ( result . messages [ 2 ] . isSummary ) . toBe ( true )
214+ expect ( result . messages [ 3 ] . truncationParent ) . toBe ( result . truncationId )
215+ expect ( result . messages [ 4 ] . truncationParent ) . toBe ( result . truncationId )
216+ expect ( result . messages [ 5 ] . isTruncationMarker ) . toBe ( true )
217+ expect ( result . messages [ 6 ] . truncationParent ) . toBeUndefined ( )
218+ expect ( result . messages [ 7 ] . truncationParent ) . toBeUndefined ( )
219+ } )
191220 } )
192221
193222 /**
@@ -1722,19 +1751,21 @@ describe("Context Management", () => {
17221751 const totalTokens = 70001
17231752 const condenseId = "prior-condense"
17241753 const hiddenContent = "hidden historical content " . repeat ( 4000 )
1754+ const visibleContent = "visible content that should actually be truncated " . repeat ( 200 )
17251755
17261756 const messages : ApiMessage [ ] = [
17271757 { role : "user" , content : hiddenContent , condenseParent : condenseId } ,
17281758 { role : "assistant" , content : hiddenContent , condenseParent : condenseId } ,
17291759 { role : "user" , content : hiddenContent , condenseParent : condenseId } ,
17301760 { role : "user" , content : "Earlier summary" , isSummary : true , condenseId } ,
1731- { role : "assistant" , content : "Recent visible reply" } ,
1732- { role : "user" , content : "Recent visible follow-up" } ,
1733- { role : "assistant" , content : "Most recent visible reply" } ,
1761+ { role : "assistant" , content : visibleContent } ,
1762+ { role : "user" , content : visibleContent } ,
1763+ { role : "assistant" , content : visibleContent } ,
17341764 { role : "user" , content : "" } ,
17351765 ]
17361766
17371767 const systemPrompt = "System prompt for truncation recount"
1768+ const effectiveTokensBefore = await countEffectiveHistoryTokens ( messages , systemPrompt )
17381769
17391770 const result = await manageContext ( {
17401771 messages,
@@ -1755,6 +1786,7 @@ describe("Context Management", () => {
17551786
17561787 const expectedEffectiveTokens = await countEffectiveHistoryTokens ( result . messages , systemPrompt )
17571788 expect ( result . newContextTokensAfterTruncation ) . toBe ( expectedEffectiveTokens )
1789+ expect ( result . newContextTokensAfterTruncation ) . toBeLessThan ( effectiveTokensBefore )
17581790 expect ( result . newContextTokensAfterTruncation ) . toBeLessThan ( result . prevContextTokens )
17591791 } )
17601792 } )
0 commit comments