prepareBranchEntries function

BranchPreparation prepareBranchEntries(
  1. List<SessionRecord> entries, {
  2. int tokenBudget = 0,
})

Prepare entries for summarization within tokenBudget (omp's prepareBranchEntries): walks NEWEST to OLDEST, keeping the most recent context when the branch is too long. File operations accumulate from ALL entries — including nested branch-summary details — even past the budget. tokenBudget: 0 means no limit.

Implementation

BranchPreparation prepareBranchEntries(
  List<SessionRecord> entries, {
  int tokenBudget = 0,
}) {
  final messages = <Message>[];
  final fileOps = createFileOps();
  var totalTokens = 0;

  // First pass: cumulative file tracking from nested branch summaries, so
  // file lists survive summarization-of-summaries (omp parity).
  _accumulateNestedFileOps(entries, fileOps);

  // Second pass: newest to oldest, until the token budget is exhausted.
  for (var i = entries.length - 1; i >= 0; i--) {
    final entry = entries[i];
    final entryMessages = _entryToMessages(entry);
    if (entryMessages.isEmpty) continue;
    for (final message in entryMessages) {
      extractFileOpsFromMessage(message, fileOps);
    }
    final tokens = entryMessages.fold<int>(
      0,
      (sum, message) => sum + estimateTokens(message),
    );
    if (_exceedsBudget(tokenBudget, totalTokens, tokens)) {
      if (_squeezeInSummaryEntry(entry, tokenBudget, totalTokens)) {
        messages.insertAll(0, entryMessages);
        totalTokens += tokens;
      }
      break;
    }
    messages.insertAll(0, entryMessages);
    totalTokens += tokens;
  }
  return BranchPreparation(
    messages: messages,
    fileOps: fileOps,
    totalTokens: totalTokens,
  );
}