calculateMessagesToKeepIndex function

int calculateMessagesToKeepIndex(
  1. List<CompactMessage> messages,
  2. int lastSummarizedIndex
)

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);
}