generateBranchSummary function

Future<BranchSummaryResult> generateBranchSummary(
  1. List<SessionRecord> entries, {
  2. required SummarizeFn summarize,
  3. int tokenBudget = 0,
  4. String? customInstructions,
  5. 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,
  );
}