using MeetingAssistant.MeetingNotes; namespace MeetingAssistant.Recording; internal static class MeetingArtifactContentDetector { private static readonly string[] DefaultAssistantContextLines = [ "# Assistant Context", "## Live Context" ]; public static async Task IsDefaultOnlyAsync( MeetingSessionArtifacts artifacts, CancellationToken cancellationToken) { if (!File.Exists(artifacts.MeetingNotePath) || !File.Exists(artifacts.TranscriptPath) || !File.Exists(artifacts.AssistantContextPath)) { return false; } var meetingNote = await File.ReadAllTextAsync(artifacts.MeetingNotePath, cancellationToken); var transcript = await File.ReadAllTextAsync(artifacts.TranscriptPath, cancellationToken); var assistantContext = await File.ReadAllTextAsync(artifacts.AssistantContextPath, cancellationToken); return IsDefaultOnlyMeetingNote(meetingNote) && IsDefaultOnlyTranscript(transcript) && IsDefaultOnlyAssistantContext(assistantContext); } private static bool IsDefaultOnlyMeetingNote(string content) { return string.IsNullOrWhiteSpace(MarkdownDocumentParser.SplitOptional(content).Body); } private static bool IsDefaultOnlyTranscript(string content) { var body = MarkdownDocumentParser.SplitOptional(content).Body; return GetMeaningfulLines(body) .All(line => string.Equals(line, "# Meeting Transcript", StringComparison.OrdinalIgnoreCase)); } private static bool IsDefaultOnlyAssistantContext(string content) { var body = MarkdownDocumentParser.SplitOptional(content).Body; return GetMeaningfulLines(body) .All(line => DefaultAssistantContextLines.Contains(line, StringComparer.OrdinalIgnoreCase)); } private static IEnumerable GetMeaningfulLines(string body) { return body .Split(["\r\n", "\n"], StringSplitOptions.None) .Select(line => line.Trim()) .Where(line => !string.IsNullOrWhiteSpace(line)); } }