[9/12] refactor: rewire app services onto native stack (persistence, logging, audio, dictation, meetings, tray) - #18
Conversation
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Rewrites AppDataStore and SettingsStore to persist through AtomicJsonFile so a crash or power loss mid-write cannot truncate user settings, and moves API keys behind the DPAPI secret store. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Reports on the native runtime, installed models and hardware instead of the Python worker, and bounds log growth. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…cognition Feeds capture buffers through the streaming PCM normaliser, journals capture state for meeting recovery, applies the dictation temp-audio and benchmark retention policies, and adds process-scoped loopback capture. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Switches the dictation coordinator off the Python worker and onto the native client, adopts the hotkey gesture model and conflict probe, and reworks dictionary correction and active-app paste around the new pipeline output. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…cycle Drives the recording coordinator through the explicit session state machine with journalling, live transcription, gap recovery and audio health monitoring, and moves detection onto the new URL parser, candidate resolver and presence signals. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Aligns summarisation, PDF/markdown export and prompt handling with the new transcript timeline and speaker aliases, and surfaces which provider handled a summary. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Reworks tray state for the new runtime status, makes toasts placement aware, and hardens startup registration. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Adds product/company/version metadata, the Muesli application icon and an application manifest declaring per-monitor DPI awareness and the supported Windows versions. Ships the privacy notice alongside the app and exposes internals to the test assembly. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ntime qualification Rewrites App startup to enforce single instance, qualify the native runtime and models before the window opens, restore the model catalog and lifecycle services, and route unhandled exceptions to the log. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Two disposal races surfaced as an "unexpected error" dialog on exit. ToastNotificationService: DispatcherTimer.Stop() does not cancel a tick already queued on the dispatcher, and WPF closes every window during application shutdown while the service still held its _window reference. The queued tick ran after teardown, reached ShowIndicator, and called Show() on a closed Window, which WPF rejects. Nothing caught it, so it reached the global unhandled-exception handler. Guard with a _disposed flag set before Stop() and checked in both the tick handler and ShowIndicator, and subscribe to Window.Closed so a window closed by WPF clears the field and a fresh one is created rather than a dead instance being reused. DictationCoordinator: Dispose() disposed _gate while the global hotkey was still live, so every subsequent keypress awaited a disposed SemaphoreSlim. This logged ObjectDisposedException five or more times per millisecond and left the dictation hotkey silently dead just before the crash. StartAsync now returns early once disposed, and Dispose is idempotent. Verified over three graceful start/shutdown cycles plus a fresh launch: Unhandled UI exception, "after a Window has closed", ObjectDisposedException, and "Could not start dictation microphone" all drop from repeated occurrences to zero, with no ERROR entries in the fresh log slice. Full suite passes 484/484. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
f370425 to
6516144
Compare
|
Claude encountered an error after 4m 16s —— View job Claude is reviewing this PR
|

This PR (9/12): rewire app services onto the native stack
Commits:
c4b38c9refactor: app data and settings onto atomic persistence —Services/AppDataStore.cs,Services/SettingsStore.csf4baa65refactor: logging and runtime diagnostics for the native stack —Services/AppLogService.cs,Services/RuntimeDiagnosticsService.cs,docs/WINDOWS_PRIVACY.mdb781d04refactor: microphone and system audio capture for streaming recognition —Services/AudioCaptureService.cs,Services/SystemAudioCaptureService.cs3c57865refactor: dictation onto the native transcription client —Services/DictationCoordinator.cs,Services/ActiveAppPasteService.cs,Services/DictionaryCorrectionService.cs,Services/GlobalHotkeyService.csf3e01derefactor: meeting recording and detection onto the session lifecycle —Services/MeetingRecordingCoordinator.cs,Services/MeetingDetectionService.cs32e5942refactor: meeting summary, export and prompt services —Services/MeetingSummaryService.cs,Services/MeetingExporter.cs,Services/MeetingPromptService.cs552cdd9refactor: tray, toast and startup registration —Services/TrayIconService.cs,Services/ToastNotificationService.cs,Services/StartupRegistrationService.cs17fe008feat: application identity, icon and manifest —app.manifest,Assets/muesli.ico,App.xamle5a6839feat: rebuild application shell around single-instance startup and runtime qualification —App.xaml.cs25 files, +5,196/−1,140.
Review focus
SettingsStore/AppDataStore— migration onto PR 2's atomic persistence; no torn writes on crash.AudioCaptureService— reworked for streaming recognition; normalizes 1/2/>2-channel input to 16 kHz mono (this natively covers the "non-stereo mic crash" that was patched onmainafter this stack was cut — see PR 1 divergence notes).RuntimeDiagnosticsService— surfaces CUDA/runtime readiness (covers the "Parakeet unavailable on non-NVIDIA" diagnostic intent frommain).DictationCoordinator+GlobalHotkeyService+ActiveAppPasteService— dictation now runs on the PR 3 native client via the PR 5 state machine.App.xaml.cs— startup ordering: single-instance gate → runtime qualification → shell.Expected — do not flag:
MainWindowstill runs the old pipeline here — PR 10 rebuilds it and removes the Python worker (TranscriptionWorkerClientis deleted there, not here). Dead-looking references are cleaned up in PR 10.Test evidence
--no-restore); 484/484 passing.CapturePrivacyAndRuntimeTests,ToastNotificationServiceTests,SecretsAndSettingsTests,Phase2DictationTests.Previous: #17 | Next: #19