When normal sync doesn't pick up new data (only syncs since lastSync),
Force Sync clears server data and resyncs all messages from scratch.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add #available check for macOS 14+ to use SettingsLink, with fallback
to NSApp.sendAction for macOS 13. This fixes the build on older targets.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace @Environment(\.openSettings) (macOS 14+) with SettingsLink
(macOS 13+) for broader compatibility. The popover closes automatically
due to .transient behavior when another window appears.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace NSApp.sendAction approach with @Environment(\.openSettings)
which is the proper way to open Settings in SwiftUI menu bar apps.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Use .foregroundStyle(.tertiary) instead of .foregroundColor(.tertiary)
to fix ShapeStyle vs Color type mismatch error
- Restore double-paren selector format Selector(("...")) to suppress
warnings about private Objective-C selectors
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add ./generate-version.sh call in install.sh before swift build
to ensure AppVersion.swift is regenerated with latest VERSION.json
- Fix openSettings() selector syntax: remove extra parentheses from
Selector(("...")) and add fallback for macOS 12 and earlier
- Remove test comment
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Test pipeline with local apricot deployment.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Trigger pipeline detection test for conversation-assistant deployments.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Close popover before opening settings to prevent UI interference
- Activate app explicitly (required for menu bar apps to show windows)
- Use version-appropriate selector (showSettingsWindow: for macOS 14+,
showPreferencesWindow: for macOS 13)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add SyncError enum to detect and categorize sync failures
- Show clear UI message when Full Disk Access is denied
- Add "Open Settings" button to directly open macOS Privacy settings
- Add "Retry" button to re-attempt connection after granting access
- Disable sync button when Full Disk Access is required
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add checkVerification method to APIClient
- Update MenuBarView with registrationCode binding
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add @MainActor to SyncManager class for thread-safe @Published properties
- Add @MainActor to AppDelegate to access SyncManager.shared
- Make conversationDisplayName optional in DTO (iMessage has empty names)
- Add UUID validation for senderId (phone numbers aren't valid UUIDs)
- Add display name fallback logic in sync service
- Add debug logging throughout sync pipeline
- Exclude test files from production build
Fixes: "Last Sync: Never" showing despite successful sync
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add AI conversation assistant service.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>