calculateMessagesToKeepIndex function
Calculate the starting index for messages to keep after compaction.
Implementation
int calculateMessagesToKeepIndex(
List<CompactMessage> messages,
int lastSummarizedIndex,
) {
if (messages.isEmpty) return 0;
final config = getSessionMemoryCompactConfig();
int startIndex = lastSummarizedIndex >= 0
? lastSummarizedIndex + 1
: messages.length;
int totalTokens = 0;
int textBlockMessageCount = 0;
for (int i = startIndex; i < messages.length; i++) {
totalTokens += estimateMessageTokens([messages[i]]);
if (hasTextBlocks(messages[i])) textBlockMessageCount++;
}
if (totalTokens >= config.maxTokens) {
return adjustIndexToPreserveAPIInvariants(messages, startIndex);
}
if (totalTokens >= config.minTokens &&
textBlockMessageCount >= config.minTextBlockMessages) {
return adjustIndexToPreserveAPIInvariants(messages, startIndex);
}
// Find floor at last compact boundary
int floorIdx = 0;
for (int i = messages.length - 1; i >= 0; i--) {
if (messages[i].isCompactBoundary) {
floorIdx = i + 1;
break;
}
}
for (int i = startIndex - 1; i >= floorIdx; i--) {
final msgTokens = estimateMessageTokens([messages[i]]);
totalTokens += msgTokens;
if (hasTextBlocks(messages[i])) textBlockMessageCount++;
startIndex = i;
if (totalTokens >= config.maxTokens) break;
if (totalTokens >= config.minTokens &&
textBlockMessageCount >= config.minTextBlockMessages) {
break;
}
}
return adjustIndexToPreserveAPIInvariants(messages, startIndex);
}