Add attendee transformation workflows

This commit is contained in:
2026-07-01 11:10:36 +02:00
parent 92e359646b
commit 5c67738939
23 changed files with 694 additions and 123 deletions
@@ -213,7 +213,12 @@ public sealed class MeetingRecordingCoordinator
currentMeetingNote = await meetingNoteStore.ReadAsync(currentMeetingNote.Path, cancellationToken);
if (suppliedMetadata is not null)
{
await ApplyMeetingMetadataAsync(currentMeetingNote, suppliedMetadata, runOptions, cancellationToken);
await ApplyMeetingMetadataAsync(
currentArtifacts,
currentMeetingNote,
suppliedMetadata,
runOptions,
cancellationToken);
currentMeetingNote = await meetingNoteStore.SaveAsync(
currentMeetingNote,
runOptions,
@@ -1030,7 +1035,7 @@ public sealed class MeetingRecordingCoordinator
}
var meetingNote = await meetingNoteStore.ReadAsync(run.MeetingNotePath, CancellationToken.None);
await ApplyMeetingMetadataAsync(meetingNote, metadata, run.Options, CancellationToken.None);
await ApplyMeetingMetadataAsync(run.Artifacts, meetingNote, metadata, run.Options, CancellationToken.None);
meetingNote = await meetingNoteStore.SaveAsync(meetingNote, run.Options, CancellationToken.None);
if (currentMeetingNote?.Path == meetingNote.Path)
{
@@ -1082,6 +1087,7 @@ public sealed class MeetingRecordingCoordinator
}
private async Task ApplyMeetingMetadataAsync(
MeetingSessionArtifacts artifacts,
MeetingNote meetingNote,
MeetingMetadata metadata,
MeetingAssistantOptions options,
@@ -1104,10 +1110,39 @@ public sealed class MeetingRecordingCoordinator
return;
}
meetingNote.Frontmatter.Attendees = await CanonicalizeAttendeesAsync(metadata.Attendees, cancellationToken);
var canonicalized = await CanonicalizeAttendeesAsync(metadata.Attendees, cancellationToken);
meetingNote.Frontmatter.Attendees = await TransformAttendeesAsync(
artifacts,
canonicalized,
options,
cancellationToken);
}
}
private async Task<List<string>> TransformAttendeesAsync(
MeetingSessionArtifacts artifacts,
IReadOnlyList<string> attendees,
MeetingAssistantOptions options,
CancellationToken cancellationToken)
{
var transformed = new List<string>();
foreach (var attendee in attendees)
{
var value = await TransformAttendeeAsync(artifacts, attendee, options, cancellationToken);
var storageValue = string.Equals(value, attendee, StringComparison.Ordinal)
? attendee.Trim()
: NormalizeAttendeeName(value);
var normalized = NormalizeAttendeeName(storageValue);
if (!string.IsNullOrWhiteSpace(normalized) &&
!transformed.Contains(normalized, StringComparer.OrdinalIgnoreCase))
{
transformed.Add(storageValue);
}
}
return transformed;
}
private async Task<List<string>> CanonicalizeAttendeesAsync(
IReadOnlyList<string> attendees,
CancellationToken cancellationToken)
@@ -1422,8 +1457,17 @@ public sealed class MeetingRecordingCoordinator
continue;
}
var transformedDisplayName = await TransformAttendeeAsync(
artifacts,
match.DisplayName.Trim(),
runOptions,
cancellationToken);
var displayName = string.Equals(transformedDisplayName, match.DisplayName.Trim(), StringComparison.Ordinal)
? match.DisplayName.Trim()
: NormalizeAttendeeName(transformedDisplayName);
var acceptedNames = match.AcceptedNames
.Append(match.DisplayName)
.Append(displayName)
.Select(NormalizeAttendeeName)
.Where(name => !string.IsNullOrWhiteSpace(name))
.Distinct(StringComparer.OrdinalIgnoreCase)
@@ -1442,7 +1486,6 @@ public sealed class MeetingRecordingCoordinator
continue;
}
var displayName = match.DisplayName.Trim();
meetingNote.Frontmatter.Attendees.Add(displayName);
existingNames.Add(NormalizeAttendeeName(displayName));
changed = true;
@@ -1502,6 +1545,18 @@ public sealed class MeetingRecordingCoordinator
return MeetingAttendeeNames.NormalizeDisplayName(attendee);
}
private async Task<string> TransformAttendeeAsync(
MeetingSessionArtifacts artifacts,
string attendee,
MeetingAssistantOptions options,
CancellationToken cancellationToken)
{
return await meetingWorkflowEngine.TransformAttendeeAsync(
MeetingWorkflowEvent.AttendeeAdded(artifacts, attendee),
options,
cancellationToken);
}
private static bool RemoveDuplicateAcceptedAliases(
List<string> attendees,
string displayName,