namespace MeetingAssistant.Recording; public interface IMeetingInactivityPromptService { Task ShowStopPromptAsync( MeetingInactivityPromptRequest request, Func handleResponseAsync, CancellationToken cancellationToken); Task DismissAllAsync(CancellationToken cancellationToken); } public sealed record MeetingInactivityPromptRequest( TimeSpan InactivityDuration, DateTimeOffset SuggestedEndTime, int PromptIndex, TimeSpan Threshold); public enum MeetingInactivityPromptResponse { Dismissed, Continue, Pause, Stop } internal sealed record MeetingInactivityPromptAction( string Content, string ResponseArgument, MeetingInactivityPromptResponse Response); internal static class MeetingInactivityPromptActions { public static IReadOnlyList All { get; } = [ new("Yes", "stop", MeetingInactivityPromptResponse.Stop), new("No", "continue", MeetingInactivityPromptResponse.Continue), new("Pause transcription", "pause", MeetingInactivityPromptResponse.Pause) ]; public static MeetingInactivityPromptResponse ParseResponse(string? value) { return All.FirstOrDefault(action => action.ResponseArgument.Equals(value, StringComparison.OrdinalIgnoreCase)) ?.Response ?? MeetingInactivityPromptResponse.Continue; } } public sealed class NoopMeetingInactivityPromptService : IMeetingInactivityPromptService { public Task ShowStopPromptAsync( MeetingInactivityPromptRequest request, Func handleResponseAsync, CancellationToken cancellationToken) { return Task.CompletedTask; } public Task DismissAllAsync(CancellationToken cancellationToken) { return Task.CompletedTask; } }