using MeetingAssistant.MeetingNotes; using YamlDotNet.Serialization; namespace MeetingAssistant.Workflow; public sealed class MeetingWorkflowRulesFile { [YamlMember(Alias = "rules")] public List Rules { get; set; } = []; } public sealed class MeetingWorkflowRule { [YamlMember(Alias = "name")] public string Name { get; set; } = ""; [YamlMember(Alias = "on")] public List On { get; set; } = []; [YamlMember(Alias = "if")] public List If { get; set; } = []; [YamlMember(Alias = "steps")] public List Steps { get; set; } = []; } public sealed class MeetingWorkflowTrigger { [YamlMember(Alias = "created")] public object? Created { get; set; } [YamlMember(Alias = "state_transition")] public MeetingWorkflowStateTransitionTrigger? StateTransition { get; set; } [YamlMember(Alias = "speaker_identified")] public MeetingWorkflowSpeakerIdentifiedTrigger? SpeakerIdentified { get; set; } [YamlMember(Alias = "transcript_line")] public MeetingWorkflowTranscriptLineTrigger? TranscriptLine { get; set; } [YamlMember(Alias = "attendee_added")] public MeetingWorkflowAttendeeAddedTrigger? AttendeeAdded { get; set; } } public sealed class MeetingWorkflowStateTransitionTrigger { [YamlMember(Alias = "from")] public string? From { get; set; } [YamlMember(Alias = "to")] public string? To { get; set; } } public sealed class MeetingWorkflowSpeakerIdentifiedTrigger { [YamlMember(Alias = "name")] public string? Name { get; set; } } public sealed class MeetingWorkflowTranscriptLineTrigger { [YamlMember(Alias = "speaker")] public string? Speaker { get; set; } } public sealed class MeetingWorkflowAttendeeAddedTrigger { [YamlMember(Alias = "equals")] public string? EqualsValue { get; set; } [YamlMember(Alias = "contains")] public string? Contains { get; set; } [YamlMember(Alias = "regex")] public string? Regex { get; set; } } public sealed class MeetingWorkflowCondition { [YamlMember(Alias = "condition")] public string? Condition { get; set; } [YamlMember(Alias = "and")] public List? And { get; set; } [YamlMember(Alias = "or")] public List? Or { get; set; } [YamlMember(Alias = "not")] public MeetingWorkflowCondition? Not { get; set; } } public sealed class MeetingWorkflowStep { [YamlMember(Alias = "uses")] public string Uses { get; set; } = ""; [YamlMember(Alias = "property")] public string? Property { get; set; } [YamlMember(Alias = "name")] public string? Name { get; set; } [YamlMember(Alias = "value")] public string? Value { get; set; } } public sealed record MeetingWorkflowTemplateModel( MeetingWorkflowMeetingModel Meeting, MeetingWorkflowEventModel Event, MeetingWorkflowSpeakerModel? Speaker, MeetingWorkflowTranscriptModel? Transcript, MeetingWorkflowAttendeeModel? Attendee); public sealed record MeetingWorkflowMeetingModel( string Title, IReadOnlyList Attendees, IReadOnlyList Projects, string State); public sealed record MeetingWorkflowEventModel( string Type, string? From, string? To); public sealed record MeetingWorkflowSpeakerModel(string Name); public sealed record MeetingWorkflowTranscriptModel(string Line, string Speaker); public sealed record MeetingWorkflowAttendeeModel(string Name); internal static class MeetingWorkflowStateNames { public static string ToRuleName(AssistantContextState state) { return state switch { AssistantContextState.CollectingMetadata => "collecting metadata", AssistantContextState.Transcribing => "transcribing", AssistantContextState.SpeakerRecognition => "speaker recognition", AssistantContextState.Summarizing => "summarizing", AssistantContextState.Finished => "finished", AssistantContextState.Error => "error", _ => "error" }; } public static bool EqualsRuleName(AssistantContextState state, string? value) { return string.IsNullOrWhiteSpace(value) || string.Equals(ToRuleName(state), value.Trim(), StringComparison.OrdinalIgnoreCase); } }