fix(agent): preserve up to 30 media refs during history compaction

Both v3 mid-loop compaction and v2 background summarization were
dropping MediaRefs when summarizing old messages, making previously
shared images/documents permanently inaccessible to the agent.

Now collect up to 30 most recent MediaRefs from compacted messages
and attach them to the summary/first-kept message so they survive
the compaction cycle.
This commit is contained in:
viettranx committed 2026-04-13 19:09:29 +07:00
1 parent 1ea24ef8e2
commit 5dc696e3c6
2 files changed
+40 -2

No files matched your search

+15 -2
View File
@@ -100,9 +100,22 @@ func (l *Loop) compactMessagesInPlace(ctx context.Context, messages []providers.
return nil
}
// Collect MediaRefs from compacted messages (keep up to 30 most recent).
const maxPreservedMediaRefs = 30
var preservedRefs []providers.MediaRef
for i := len(toSummarize) - 1; i >= 0 && len(preservedRefs) < maxPreservedMediaRefs; i-- {
for _, ref := range toSummarize[i].MediaRefs {
preservedRefs = append(preservedRefs, ref)
if len(preservedRefs) >= maxPreservedMediaRefs {
break
}
}
}
summary := providers.Message{
Role: "user",
Content: "[Summary of earlier conversation]\n" + SanitizeAssistantContent(resp.Content),
Role: "user",
Content: "[Summary of earlier conversation]\n" + SanitizeAssistantContent(resp.Content),
MediaRefs: preservedRefs,
}
result := make([]providers.Message, 0, 1+keepCount)
result = append(result, summary)
+25
View File
@@ -292,8 +292,33 @@ func (l *Loop) maybeSummarize(ctx context.Context, sessionKey string) {
return
}
// Collect MediaRefs from messages about to be truncated (keep up to 30 most recent).
const maxPreservedMediaRefs = 30
var preservedRefs []providers.MediaRef
for i := len(toSummarize) - 1; i >= 0 && len(preservedRefs) < maxPreservedMediaRefs; i-- {
for _, ref := range toSummarize[i].MediaRefs {
preservedRefs = append(preservedRefs, ref)
if len(preservedRefs) >= maxPreservedMediaRefs {
break
}
}
}
l.sessions.SetSummary(sctx, sessionKey, SanitizeAssistantContent(resp.Content))
l.sessions.TruncateHistory(sctx, sessionKey, keepLast)
// Inject preserved MediaRefs into the first kept message so they survive truncation.
if len(preservedRefs) > 0 {
kept := l.sessions.GetHistory(sctx, sessionKey)
if len(kept) > 0 {
kept[0].MediaRefs = append(preservedRefs, kept[0].MediaRefs...)
// Cap total refs on this message at maxPreservedMediaRefs.
if len(kept[0].MediaRefs) > maxPreservedMediaRefs {
kept[0].MediaRefs = kept[0].MediaRefs[:maxPreservedMediaRefs]
}
l.sessions.SetHistory(sctx, sessionKey, kept)
}
}
l.sessions.IncrementCompaction(sctx, sessionKey)
// Mirror SessionMetaKeyLastCompactionAt from the v3 prune/compact path
// so the legacy v2 post-turn summarizer also surfaces compaction cadence.