feat(macos): merge the native Mac app into v2.2 - #103
Merged
Conversation
Carried over from working tree when branching native-macos off v2.2. Not part of the macOS migration work; preserved here so migration commits stay clean. Cherry-pick to v2.2 if needed. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Agent-executable plan: phases 0-4 with per-task verification loops, exit criteria, and the categorized 74-site Catalyst-conditional punch list. Phase 0 (cross-platform groundwork) starts on this branch. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Delete the SFSafariViewController wrapper and the sheet/onChange Catalyst fallback dance at all three call sites. Help and console links now open via the openURL environment on every platform, removing six targetEnvironment(macCatalyst) conditionals. Verified: iOS Simulator and Mac Catalyst builds green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Replace the UIDocumentPickerViewController wrappers with cross-platform SwiftUI: audio/transcript import now uses .fileImporter (with security-scoped access held for the whole import), archive/audio export uses .fileMover (same move-from-staging semantics as forExporting:). Deletes DocumentPickerCoordinator.swift and DocumentExportPicker.swift. Behavior note: fileImporter returns security-scoped URLs instead of asCopy:true local copies; access is wrapped at the call site so the import managers are unchanged. Manual QA: audio import, transcript import, archive-to-iCloud export on both iOS and Catalyst. Verified: iOS Simulator and Mac Catalyst builds green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
New Platform/PlatformApp.swift provides PlatformApp (open/canOpen, isActive/isInBackground/isProtectedDataAvailable), PlatformLifecycle (notification names), and PlatformBackgroundTask (begin/end/remaining) as cross-platform facades. UIKit-backed on iOS/Catalyst; native macOS implementations land in Phase 2 (NSWorkspace, ProcessInfo activities, NSApplication notifications). Migrated call sites in SummaryManager, EnhancedTranscriptionManager, BackgroundProcessingManager, WyomingWhisperClient, OnDeviceLLMEngine, MLXSwiftEngine, SummariesView, SystemIntegrationManager, SettingsView, BisonNotesAIApp, AudioRecorderViewModel(+Background/+Interruptions). Left as-is by design: AppDelegate/app-entry delegate adaptor, WatchConnectivityManager (iOS-only), and the four window-scene share sheet sites (port in Phase 2.5). Verified: iOS Simulator + Mac Catalyst builds green, unit tests pass. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
v2.2's 8c5a2a6 carries the same accessibility WIP already preserved here as 294b723. Conflicts were the Phase 0.2 picker refactor vs the old picker code (kept the fileImporter version) and the generated SwiftLint baseline (took v2.2's). Net tree change vs previous HEAD: SwiftLintBaseline.json only. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Adds a native macOS app target 'BisonNotes AI macOS' (same bundle ID, same synced source group, same SPM deps + llama.xcframework, Catalyst entitlements) plus a shared scheme. Fences iOS-only APIs behind #if os(iOS) / canImport(UIKit) and extends the Platform shim layer so the shared SwiftUI/Core Data codebase compiles natively. Platform layer additions: - PlatformApp: NSWorkspace open, NSApplication lifecycle notifications, PlatformDevice (isRunningOnMac, vendorIdentifier), PlatformPasteboard, PlatformAlert (NSAlert/UIAlertController), PlatformBackgroundTask macOS no-ops - PlatformColors: UIKit system color names -> AppKit dynamic colors - PlatformViewShims: toolbar placements, nav-bar/keyboard modifiers, fullScreenCover->sheet, page/wheel picker styles Stubbed for Phase 2 (marked TODO(macos-phase2)): AVAudioSession stack (Core Audio, §2.2/2.3), PDF/RTF export and share sheet (§2.5). AppDelegate split into AppDelegateCore + UIKit/AppKit adaptor subclasses. Verified green: macOS native, iOS Simulator, and Mac Catalyst builds. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: OpenAI Codex <codex@openai.com>
Co-authored-by: OpenAI Codex <codex@openai.com>
Co-authored-by: OpenAI Codex <codex@openai.com>
Co-authored-by: OpenAI Codex <codex@openai.com>
Co-authored-by: OpenAI Codex <codex@openai.com>
Co-authored-by: OpenAI Codex <codex@openai.com>
Co-authored-by: OpenAI Codex <codex@openai.com>
Ignore ScreenCaptureKit tracks that contain only digital silence, mix directly from the PCM microphone scratch recording, and apply safe two-source gain staging. Co-authored-by: OpenAI Codex <codex@openai.com>
Replace Mac background-task placeholders with ProcessInfo activities, remove iOS expiration and scheduler ceremony from Mac builds, and advance the migration plan through Phase 2.4. Co-authored-by: OpenAI Codex <codex@openai.com>
Generate native RTF and paginated PDF summaries with AppKit and Core Text, present summary and diagnostic files through NSSharingServicePicker, and advance the migration plan through Phase 2.5. Co-authored-by: OpenAI Codex <codex@openai.com>
Co-authored-by: OpenAI Codex <codex@openai.com>
Co-authored-by: OpenAI Codex <codex@openai.com>
Co-authored-by: OpenAI Codex <codex@openai.com>
Co-authored-by: OpenAI Codex <codex@openai.com>
Co-authored-by: OpenAI Codex <codex@openai.com>
Co-authored-by: OpenAI Codex <codex@openai.com>
Co-authored-by: OpenAI Codex <codex@openai.com>
Use a single native scroll owner for transcript segments and add explicit Done and Escape dismissal for summaries opened from the transcript window. Co-authored-by: OpenAI Codex <codex@openai.com>
Record native Share extension, WidgetKit, and App Intent parity; link the two deferred extension follow-ups and retain signed shortcut runtime QA. Co-authored-by: OpenAI Codex <codex@openai.com>
Regenerate the baseline from the full current source tree so the normal lint gate reports only new violations after the Phase 2 and Phase 3 file growth. Co-authored-by: OpenAI Codex <codex@openai.com>
Co-authored-by: OpenAI Codex <codex@openai.com>
Co-authored-by: OpenAI Codex <codex@openai.com>
Expose the 27B MLX model only in the native macOS catalog and document its storage and memory requirements. Co-authored-by: OpenAI Codex <codex@openai.com>
Use a single native Settings navigation hierarchy with Mac-specific layouts for MLX and acknowledgements, while preserving iOS and Catalyst presentation behavior. Keep Bonsai 27B thinking enabled with a hidden reasoning budget, strip reasoning before parsing, and cover summary, task, reminder, and title extraction with focused tests. Co-authored-by: OpenAI Codex <codex@openai.com>
Co-authored-by: OpenAI Codex <codex@openai.com>
bisonbet
marked this pull request as ready for review
July 22, 2026 01:14
Owner
Author
|
@copilot can you review this PR? |
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.
Summary
Why
The Catalyst application carries platform-specific recording, navigation, windowing, and lifecycle limitations that prevent a consistently native Mac experience. This branch moves those paths to native macOS implementations while keeping shared data and cross-platform behavior intact.
The latest archive changes also remove the pushed-list disclosure pattern that could wedge the Mac responder chain. The Mac landing pages now show the three newest summaries or transcripts and expand older, non-empty month sections inline.
Impact
Mac users receive a native application with Mac-appropriate windows, sheets, device handling, long-running processing, and local MLX inference. Existing Catalyst data remains available under the same bundle container. iOS and Mac Catalyst continue to compile from the shared codebase during the beta/cutover period.
Validation
git diff --check: passeddocs/macos-phase-4.1-data-continuity-report.md1a952f3fa196142a71e9095ccddfceb6f5cd867bRemaining beta QA
This is intentionally a draft for Phase 4.2 TestFlight/real-world soak. Outstanding signed-app checks include microphone changes during recording, long hidden-window transcription and summarization, archive bookmark restoration after relaunch, and the full Settings destination walkthrough.