generateBranchSummary function
Future<BranchSummaryResult>
generateBranchSummary(
- List<
SessionRecord> entries, { - required SummarizeFn summarize,
- int tokenBudget = 0,
- String? customInstructions,
- CancelToken? cancelToken,
Generate a summary of abandoned-branch entries (omp's
generateBranchSummary): serializes them into <conversation> tags,
ends with the fixed branch-summary prompt (or customInstructions), and
prepends the branch preamble plus the file-operation tags. Never throws:
failures surface as BranchSummaryResult.error.
Implementation
Future<BranchSummaryResult> generateBranchSummary(
List<SessionRecord> entries, {
required SummarizeFn summarize,
int tokenBudget = 0,
String? customInstructions,
CancelToken? cancelToken,
}) async {
final preparation = prepareBranchEntries(entries, tokenBudget: tokenBudget);
if (preparation.messages.isEmpty) {
return const BranchSummaryResult(summary: 'No content to summarize');
}
final instructions = customInstructions ?? branchSummaryPrompt;
final prompt =
'<conversation>\n'
'${serializeConversation(preparation.messages)}\n'
'</conversation>\n\n$instructions';
SummarizationResult result;
try {
result = await summarize(
SummarizationRequest(prompt: prompt, cancelToken: cancelToken),
);
} catch (error) {
result = SummarizationResult.failure('Branch summarization failed: $error');
}
if (result.isAborted) return const BranchSummaryResult(aborted: true);
final text = result.text;
if (text == null) {
return BranchSummaryResult(
error: result.error ?? 'Branch summarization failed',
);
}
final fileLists = computeFileLists(preparation.fileOps);
final summary =
'$branchSummaryPreamble\n$text'
'${formatFileOperations(fileLists.readFiles, fileLists.modifiedFiles)}';
return BranchSummaryResult(
summary: summary.isEmpty ? 'No summary generated' : summary,
readFiles: fileLists.readFiles,
modifiedFiles: fileLists.modifiedFiles,
);
}