Extract service initialization for headless operation#2
Closed
Newarr wants to merge 7 commits intorefactor/derive-isrecording-from-statefrom
Closed
Extract service initialization for headless operation#2Newarr wants to merge 7 commits intorefactor/derive-isrecording-from-statefrom
Newarr wants to merge 7 commits intorefactor/derive-isrecording-from-statefrom
Conversation
9 tasks
08cabe2 to
705ff94
Compare
c522a3a to
0a8df8c
Compare
TranscriptionEngine and other coordinator-owned services were created inside ContentView.task, making background recording impossible without a visible window. Add ensureServicesInitialized() on AppRuntime so services can be created early from AppDelegate. ContentView.task now only creates view-local services (KnowledgeBase, SuggestionEngine).
705ff94 to
27fd880
Compare
0a8df8c to
049c999
Compare
Add acoustic echo cancellation via Apple Voice Processing. Enables setVoiceProcessingEnabled on AVAudioEngine mic input to cancel speaker echo that causes duplicate transcription. On by default with toggle in Settings > Recording. Closes yazinsai#88
Redesign NotesView: 2-tab model with batch cleanup Replaces the 3-state Raw/Refined/Notes detail view with a clean 2-tab segmented picker (Transcript / Notes). Adds batch transcript cleanup via TranscriptCleanupEngine for on-demand refinement of past sessions. Based on the design direction from @Newarr in PRs yazinsai#82 and yazinsai#83 — thank you for the original work! Reimplemented to keep drain() timeout at 5s and strip unrelated scope changes. Closes yazinsai#82, closes yazinsai#83.
Add structured Markdown meeting output (openoats/v1) Produces `.md` files in ~/Documents/OpenOats/ alongside existing `.txt` output. YAML frontmatter with date, duration, participants, ASR engine, and meeting app. Body sections: Summary, Action Items, Decisions, Transcript (high-signal first). Speaker-attributed transcript lines with relative timestamps. Three processing stages: raw transcript (always written at finalization), LLM-enriched sections inserted when notes are generated. Existing .txt output is preserved unchanged. Includes format specification, example transcript, and 42 unit tests. Closes no issues — new capability.
Derive isRecording from coordinator state machine Replace writable stored `_isRecording` property with a computed property that reads directly from the coordinator's authoritative `MeetingState`. Eliminates stale-value risk from the 100ms polling loop. Also adds `MeetingMetadata.manual()` static factory to deduplicate inline metadata construction across call sites.
Newarr
pushed a commit
that referenced
this pull request
Mar 22, 2026
- Make cancel() async and await task completion to prevent data races (#1) - Move session-switch guard before backfillRefinedText to prevent stale writes (#3) - Cancel cleanup engine in teardownMeetingDetection (#4) - Add .pre-llm.md backup before overwriting Markdown with LLM sections (yazinsai#10) - Add safety documentation for nonisolated(unsafe) vars (#2) - Add unit tests for chunkRecords and parseResponse (#5) https://claude.ai/code/session_01QTKjQDQpoVqFrPJM8bp218
4 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
TranscriptionEngine,TranscriptLogger,RefinementEngine, andAudioRecorderare created insideContentView.task. This means background recording is impossible without a visible main window -- the services simply don't exist.Solution
Add
ensureServicesInitialized(settings:coordinator:)onAppRuntimewith an idempotency guard. Coordinator-owned services are created once on first call (from AppDelegate or ContentView, whichever runs first). ContentView.task now only creates view-local services (KnowledgeBase,SuggestionEngine).ContentView.taskcallsmakeServices()and assigns all 6 servicesensureServicesInitialized()creates coordinator services; ContentView creates only view-local servicesChanged files
AppRuntime.swiftensureServicesInitialized()withdidInitializeServicesguardContentView.swiftensureServicesInitialized(), create only KnowledgeBase + SuggestionEngine locallyTest plan
PR 2 of 4 in the menu bar background mode series.
Depends on: #1 Derive isRecording from state machine
Next: #3 Add menu bar status item and popover