prepareBranchEntries function
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,
);
}