From cc9044e091abbd6384411924a5e516152f698a73 Mon Sep 17 00:00:00 2001 From: renovate-bot Date: Sat, 12 Sep 2026 02:45:18 +0000 Subject: [PATCH 1/6] chore(deps): update dependency microsoft.entityframeworkcore.sqlite to 10.0.12 --- MeetingAssistant/MeetingAssistant.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MeetingAssistant/MeetingAssistant.csproj b/MeetingAssistant/MeetingAssistant.csproj index da76ee0..84e8273 100644 --- a/MeetingAssistant/MeetingAssistant.csproj +++ b/MeetingAssistant/MeetingAssistant.csproj @@ -24,7 +24,7 @@ - + From 5dce5fd35061cfc28143bb6d084fcbab8b543208 Mon Sep 17 00:00:00 2001 From: renovate-bot Date: Sat, 12 Sep 2026 02:45:33 +0000 Subject: [PATCH 2/6] chore(deps): update microsoftspeechversion to 1.51.2 --- MeetingAssistant/MeetingAssistant.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MeetingAssistant/MeetingAssistant.csproj b/MeetingAssistant/MeetingAssistant.csproj index da76ee0..02b9f6b 100644 --- a/MeetingAssistant/MeetingAssistant.csproj +++ b/MeetingAssistant/MeetingAssistant.csproj @@ -5,7 +5,7 @@ enable enable true - 1.51.1 + 1.51.2 From c6a50d307ed92dadec81f8562763177fd3445c17 Mon Sep 17 00:00:00 2001 From: renovate-bot Date: Sat, 12 Sep 2026 02:45:52 +0000 Subject: [PATCH 3/6] chore(deps): update dependency naudio to 2.4.0 --- MeetingAssistant/MeetingAssistant.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MeetingAssistant/MeetingAssistant.csproj b/MeetingAssistant/MeetingAssistant.csproj index da76ee0..8bd7767 100644 --- a/MeetingAssistant/MeetingAssistant.csproj +++ b/MeetingAssistant/MeetingAssistant.csproj @@ -25,7 +25,7 @@ - + From e23d04a38c7d7cd0585df4e78ccee2cde97ee832 Mon Sep 17 00:00:00 2001 From: renovate-bot Date: Sat, 12 Sep 2026 02:46:02 +0000 Subject: [PATCH 4/6] chore(deps): update dependency naudio to v3 --- MeetingAssistant/MeetingAssistant.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MeetingAssistant/MeetingAssistant.csproj b/MeetingAssistant/MeetingAssistant.csproj index da76ee0..2d3f043 100644 --- a/MeetingAssistant/MeetingAssistant.csproj +++ b/MeetingAssistant/MeetingAssistant.csproj @@ -25,7 +25,7 @@ - + From 40d10d634a92a173539f35f935d195f579e51cc3 Mon Sep 17 00:00:00 2001 From: Codex Automation Date: Thu, 17 Sep 2026 13:27:49 +0200 Subject: [PATCH 5/6] fix: reference WinMM explicitly for shared sample playback --- MeetingAssistant/MeetingAssistant.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/MeetingAssistant/MeetingAssistant.csproj b/MeetingAssistant/MeetingAssistant.csproj index 33894c9..7a3f675 100644 --- a/MeetingAssistant/MeetingAssistant.csproj +++ b/MeetingAssistant/MeetingAssistant.csproj @@ -26,6 +26,7 @@ + From 568bedb77af1c71305bd647e2b30e3905db83a76 Mon Sep 17 00:00:00 2001 From: Codex Automation Date: Thu, 17 Sep 2026 13:34:47 +0200 Subject: [PATCH 6/6] fix: isolate Windows sample playback for NAudio 3 --- MeetingAssistant.Tests/HealthEndpointTests.cs | 12 ++++++++++++ MeetingAssistant/Program.cs | 4 ++++ .../WorkflowRulesEditorSamplePlaybackQueue.cs | 11 +++++++++++ docs/meeting-workflow-engine.md | 2 ++ openspec/specs/meeting-session/spec.md | 8 ++++++++ 5 files changed, 37 insertions(+) diff --git a/MeetingAssistant.Tests/HealthEndpointTests.cs b/MeetingAssistant.Tests/HealthEndpointTests.cs index 615ec4e..911de71 100644 --- a/MeetingAssistant.Tests/HealthEndpointTests.cs +++ b/MeetingAssistant.Tests/HealthEndpointTests.cs @@ -1,6 +1,7 @@ using System.Net; using System.Net.Http.Json; using MeetingAssistant.Recording; +using MeetingAssistant.Workflow; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc.Testing; using Microsoft.AspNetCore.TestHost; @@ -41,6 +42,17 @@ public sealed class HealthEndpointTests : IClassFixture(); + + var result = await playback.QueueAsync(1, [1, 2]); + + Assert.Contains("Windows build", result); + Assert.DoesNotContain("Queued", result); + } + [Fact] public async Task ApplicationStartupDeletesStaleTemporaryRecordings() { diff --git a/MeetingAssistant/Program.cs b/MeetingAssistant/Program.cs index 43f3baa..055e2ef 100644 --- a/MeetingAssistant/Program.cs +++ b/MeetingAssistant/Program.cs @@ -132,7 +132,11 @@ builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); +#if WINDOWS builder.Services.AddSingleton(); +#else +builder.Services.AddSingleton(); +#endif builder.Services.AddSingleton(); builder.Services.AddTransient(); #if WINDOWS diff --git a/MeetingAssistant/Workflow/WorkflowRulesEditorSamplePlaybackQueue.cs b/MeetingAssistant/Workflow/WorkflowRulesEditorSamplePlaybackQueue.cs index c024ac2..6f073fa 100644 --- a/MeetingAssistant/Workflow/WorkflowRulesEditorSamplePlaybackQueue.cs +++ b/MeetingAssistant/Workflow/WorkflowRulesEditorSamplePlaybackQueue.cs @@ -8,6 +8,7 @@ public interface IWorkflowRulesEditorSamplePlaybackQueue Task QueueAsync(int sampleId, byte[] wavBytes, CancellationToken cancellationToken = default); } +#if WINDOWS public sealed class WorkflowRulesEditorSamplePlaybackQueue : IWorkflowRulesEditorSamplePlaybackQueue, IDisposable { private readonly Channel channel = Channel.CreateUnbounded(); @@ -98,3 +99,13 @@ public sealed class WorkflowRulesEditorSamplePlaybackQueue : IWorkflowRulesEdito private sealed record QueuedSample(int SampleId, byte[] WavBytes); } +#else +public sealed class UnavailableWorkflowRulesEditorSamplePlaybackQueue : IWorkflowRulesEditorSamplePlaybackQueue +{ + public Task QueueAsync(int sampleId, byte[] wavBytes, CancellationToken cancellationToken = default) + { + cancellationToken.ThrowIfCancellationRequested(); + return Task.FromResult("Speaker sample playback requires the Windows build of Meeting Assistant."); + } +} +#endif diff --git a/docs/meeting-workflow-engine.md b/docs/meeting-workflow-engine.md index 8287fd9..d091405 100644 --- a/docs/meeting-workflow-engine.md +++ b/docs/meeting-workflow-engine.md @@ -1,5 +1,7 @@ # Meeting Workflow Engine +The interactive rules and identities editor can queue speaker samples for playback in the Windows build. The neutral build reports that playback requires the Windows build; it does not enqueue audio or initialize Windows audio devices. + Meeting Assistant has a small local workflow engine for meeting-specific automation. It is intended for rules that are too personal or environment-specific to hard-code, such as adding default attendees, cleaning meeting titles, binding projects, or adding context notes when known speakers are detected. The workflow engine is deliberately narrow. It runs from a local YAML file, evaluates rules against the current meeting note read from disk, and applies a small set of meeting-safe mutations. diff --git a/openspec/specs/meeting-session/spec.md b/openspec/specs/meeting-session/spec.md index a922882..af180c1 100644 --- a/openspec/specs/meeting-session/spec.md +++ b/openspec/specs/meeting-session/spec.md @@ -285,6 +285,8 @@ The rules and identities editor agent SHALL receive speaker identity tools to se The rules and identities editor agent SHALL receive speaker sample tools to list, read, delete, and queue playback of samples linked to identities. The delete sample tool SHALL refuse to delete the last remaining sample for an identity. +Speaker sample playback SHALL use the Windows audio implementation only in the Windows-targeted build. The neutral build SHALL return an actionable unavailable response instead of reporting a sample as queued for playback. + The first model request caused by each user-submitted chat turn SHALL send the `X-Initiator: user` header, while follow-up model requests within that same turn, such as tool-call continuations, SHALL send `X-Initiator: agent`. Meeting Assistant SHALL provide a diagnostic endpoint that opens the workflow rules editor through the same window service used by the tray menu. @@ -337,6 +339,12 @@ Meeting Assistant SHALL provide a diagnostic endpoint that opens the workflow ru - **AND** it can list, read, delete, and queue playback of identity samples - **AND** deleting the last sample for an identity is refused +#### Scenario: Neutral build refuses speaker playback +- **GIVEN** Meeting Assistant runs from its neutral target build +- **WHEN** an agent requests playback of a speaker sample +- **THEN** the application reports that playback requires the Windows build +- **AND** does not report that the sample was queued + #### Scenario: User sends a rules-editing chat turn - **GIVEN** the rules editor chat window is open - **WHEN** the user types a prompt and presses Enter