build method

AiContext build({
  1. required FlutterAnalysisResult result,
  2. required List<PrioritizedGroup> prioritized,
  3. required List<RootCauseCandidate> rootCauses,
  4. String? flutterVersion,
  5. String? dartVersion,
  6. String? channel,
  7. String? javaVersion,
  8. String? androidSdkPath,
  9. String? agpVersion,
  10. String? gradleVersion,
  11. String? kotlinVersion,
  12. String? compileSdk,
  13. String? targetSdk,
  14. String? minSdk,
})

Builds a compact AiContext from analysis results.

result is used only for counts — individual diagnostics are NOT included. prioritized supplies the top issues per priority tier. rootCauses are the deterministic root cause candidates. Environment fields come from the toolchain evidence.

Implementation

AiContext build({
  required FlutterAnalysisResult result,
  required List<PrioritizedGroup> prioritized,
  required List<RootCauseCandidate> rootCauses,
  String? flutterVersion,
  String? dartVersion,
  String? channel,
  String? javaVersion,
  String? androidSdkPath,
  String? agpVersion,
  String? gradleVersion,
  String? kotlinVersion,
  String? compileSdk,
  String? targetSdk,
  String? minSdk,
}) {
  // Analyzer summary — counts only.
  final analyzerSummary = <String, int>{
    'total': result.allIssues.length,
    'errors': result.errors.length,
    'warnings': result.warnings.length,
    'infos': result.infos.length,
  };

  // Top issues per priority tier (max 5 each).
  final topCritical = _topN(prioritized, IssuePriority.critical, 5);
  final topHigh = _topN(prioritized, IssuePriority.high, 5);
  final topMedium = _topN(prioritized, IssuePriority.medium, 5);

  // Root cause summaries.
  final rcSummaries = rootCauses.map((rc) {
    return RootCauseSummary(
      title: rc.title,
      summary: rc.summary,
      priority: rc.priority.displayName,
      confidence: rc.confidence.label,
      occurrenceCount: rc.occurrenceCount,
      affectedFileCount: rc.affectedFiles.length,
      affectedFiles: rc.affectedFiles,
      relatedRules: rc.relatedRules,
      evidenceSummary:
          rc.evidence.map((e) => e.source.label + ': ' + e.value).toList(),
    );
  }).toList();

  return AiContext(
    projectInfo: {
      'flutter': flutterVersion,
      'dart': dartVersion,
      'channel': channel,
    },
    environmentInfo: {
      'java': javaVersion,
      'android_sdk': androidSdkPath,
    },
    androidInfo: {
      'agp': agpVersion,
      'gradle': gradleVersion,
      'kotlin': kotlinVersion,
      'compile_sdk': compileSdk,
      'target_sdk': targetSdk,
      'min_sdk': minSdk,
    },
    analyzerSummary: analyzerSummary,
    topCritical: topCritical,
    topHigh: topHigh,
    topMedium: topMedium,
    rootCauses: rcSummaries,
  );
}