From 6a2efafce56f03cfd0e1e564cd865657ff75b20e Mon Sep 17 00:00:00 2001 From: uzairansaruzi Date: Wed, 15 Jul 2026 23:44:47 -0400 Subject: [PATCH 1/7] Allow onboarding and clipboard-only dictation without Accessibility. MDM and privacy-conscious users were blocked finishing setup when Accessibility stayed Needed. Soft-gate that permission, fall back to clipboard output, and expose menu-bar Start/Stop so basic dictation still works. Co-authored-by: Cursor --- Sources/Fluid/ContentView.swift | 98 ++++++++++----- Sources/Fluid/Persistence/SettingsStore.swift | 13 ++ Sources/Fluid/Services/MenuBarManager.swift | 43 +++++++ .../Fluid/Services/NotificationService.swift | 52 ++++++++ Sources/Fluid/Services/TypingService.swift | 7 +- .../Fluid/UI/OnboardingTryoutStepView.swift | 114 ++++++++++++++---- Sources/Fluid/UI/SettingsView.swift | 16 ++- Sources/Fluid/UI/WelcomeView.swift | 82 ++++++++++--- 8 files changed, 351 insertions(+), 74 deletions(-) diff --git a/Sources/Fluid/ContentView.swift b/Sources/Fluid/ContentView.swift index 051c4f19..c63c848b 100644 --- a/Sources/Fluid/ContentView.swift +++ b/Sources/Fluid/ContentView.swift @@ -619,6 +619,14 @@ struct ContentView: View { self.audioObserver.startObserving() self.asr.initialize() self.menuBarManager.configure(asrService: self.appServices.asr) + self.menuBarManager.configureDictationControls( + start: { [self] in + self.startRecording() + }, + stop: { [self] in + await self.stopAndProcessTranscription() + } + ) self.refreshDevices() if self.selectedInputUID.isEmpty, let defIn = AudioDevice.getDefaultInputDevice()?.uid { @@ -1330,6 +1338,10 @@ struct ContentView: View { openAccessibilitySettings: self.openAccessibilitySettings, restartApp: self.restartApp, menuBarManager: self.menuBarManager, + stopAndProcessTranscription: { + await self.stopAndProcessTranscription(route: .onboardingSandbox) + }, + startRecording: self.startRecording, activeShortcutRecordingTarget: self.$activeShortcutRecordingTarget, shortcutRecordingMessage: self.$shortcutRecordingMessage, theme: self.theme @@ -2365,26 +2377,35 @@ struct ContentView: View { } // When FluidVoice itself is frontmost, the bound editor already receives `finalText`. // Avoid re-inserting or overwriting the clipboard in that self-target case. + let accessibilityTrusted = AXIsProcessTrusted() + let shouldForceClipboardFallback = shouldPersistOutputs && !isFluidFrontmost && !accessibilityTrusted let shouldCopyToClipboard = shouldPersistOutputs && - SettingsStore.shared.copyTranscriptionToClipboard && - !isFluidFrontmost + !isFluidFrontmost && + (SettingsStore.shared.copyTranscriptionToClipboard || shouldForceClipboardFallback) + var didCopyToClipboard = false if shouldCopyToClipboard { ClipboardService.copyToClipboard(finalText) + didCopyToClipboard = true AnalyticsService.shared.capture( .outputDelivered, properties: [ "mode": AnalyticsMode.dictation.rawValue, "method": AnalyticsOutputMethod.clipboard.rawValue, + "clipboard_only_output": shouldForceClipboardFallback, ] ) } + if shouldForceClipboardFallback { + NotificationService.showClipboardOnlyOutput() + } + var didTypeExternally = false - let shouldTypeExternally = shouldPersistOutputs && !isFluidFrontmost + let shouldTypeExternally = shouldPersistOutputs && !isFluidFrontmost && accessibilityTrusted DebugLogger.shared.debug( - "Typing decision → frontmost: \(frontmostName), fluidFrontmost: \(isFluidFrontmost), editorFocused: \(self.isTranscriptionFocused), willTypeExternally: \(shouldTypeExternally)", + "Typing decision → frontmost: \(frontmostName), fluidFrontmost: \(isFluidFrontmost), editorFocused: \(self.isTranscriptionFocused), accessibilityTrusted: \(accessibilityTrusted), willTypeExternally: \(shouldTypeExternally)", source: "ContentView" ) @@ -2434,7 +2455,7 @@ struct ContentView: View { aiProvider: modelInfo.provider ) } else if shouldPersistOutputs, - SettingsStore.shared.copyTranscriptionToClipboard == false, + !didCopyToClipboard, SettingsStore.shared.saveTranscriptionHistory { AnalyticsService.shared.capture( @@ -2735,16 +2756,24 @@ struct ContentView: View { let frontmostApp = NSWorkspace.shared.frontmostApplication let isFluidFrontmost = frontmostApp?.bundleIdentifier == Bundle.main.bundleIdentifier + let accessibilityTrusted = AXIsProcessTrusted() + let shouldForceClipboardFallback = !isFluidFrontmost && !accessibilityTrusted + let shouldCopyToClipboard = !isFluidFrontmost && + (SettingsStore.shared.copyTranscriptionToClipboard || shouldForceClipboardFallback) - if SettingsStore.shared.copyTranscriptionToClipboard, !isFluidFrontmost { + if shouldCopyToClipboard { ClipboardService.copyToClipboard(finalText) } + if shouldForceClipboardFallback { + NotificationService.showClipboardOnlyOutput() + } + let focusedPID = TypingService.captureSystemFocusedPID() ?? NSWorkspace.shared.frontmostApplication?.processIdentifier NotchContentState.shared.recordingTargetPID = focusedPID - let shouldTypeExternally = !isFluidFrontmost + let shouldTypeExternally = !isFluidFrontmost && accessibilityTrusted if shouldTypeExternally { let typingTarget = self.resolveTypingTargetPID() if typingTarget.shouldRestoreOriginalFocus { @@ -2860,7 +2889,13 @@ struct ContentView: View { let frontmostApp = NSWorkspace.shared.frontmostApplication let isFluidFrontmost = frontmostApp?.bundleIdentifier?.contains("fluid") == true - let shouldTypeExternally = !isFluidFrontmost || self.isTranscriptionFocused == false + let accessibilityTrusted = AXIsProcessTrusted() + let shouldForceClipboardFallback = !isFluidFrontmost && !accessibilityTrusted + if shouldForceClipboardFallback { + ClipboardService.copyToClipboard(finalText) + NotificationService.showClipboardOnlyOutput() + } + let shouldTypeExternally = (!isFluidFrontmost || self.isTranscriptionFocused == false) && accessibilityTrusted if shouldTypeExternally { let typingTarget = self.resolveTypingTargetPID() if typingTarget.shouldRestoreOriginalFocus { @@ -2901,34 +2936,40 @@ struct ContentView: View { if !self.rewriteModeService.rewrittenText.isEmpty { DebugLogger.shared.info("Rewrite successful, typing result (chars: \(self.rewriteModeService.rewrittenText.count))", source: "ContentView") - // Copy to clipboard as backup - if SettingsStore.shared.copyTranscriptionToClipboard { + // Copy to clipboard as backup (or as primary delivery without Accessibility) + let accessibilityTrusted = AXIsProcessTrusted() + if SettingsStore.shared.copyTranscriptionToClipboard || !accessibilityTrusted { ClipboardService.copyToClipboard(self.rewriteModeService.rewrittenText) AnalyticsService.shared.capture( .outputDelivered, properties: [ "mode": AnalyticsMode.rewrite.rawValue, "method": AnalyticsOutputMethod.clipboard.rawValue, + "clipboard_only_output": !accessibilityTrusted, ] ) } - // Type the rewritten text - let typingTarget = self.resolveTypingTargetPID() - if typingTarget.shouldRestoreOriginalFocus { - await self.restoreFocusToRecordingTarget() + // Type the rewritten text when Accessibility is available + if accessibilityTrusted { + let typingTarget = self.resolveTypingTargetPID() + if typingTarget.shouldRestoreOriginalFocus { + await self.restoreFocusToRecordingTarget() + } + self.asr.typeTextToActiveField( + self.rewriteModeService.rewrittenText, + preferredTargetPID: typingTarget.pid + ) + AnalyticsService.shared.capture( + .outputDelivered, + properties: [ + "mode": AnalyticsMode.rewrite.rawValue, + "method": AnalyticsOutputMethod.typed.rawValue, + ] + ) + } else { + NotificationService.showClipboardOnlyOutput() } - self.asr.typeTextToActiveField( - self.rewriteModeService.rewrittenText, - preferredTargetPID: typingTarget.pid - ) - AnalyticsService.shared.capture( - .outputDelivered, - properties: [ - "mode": AnalyticsMode.rewrite.rawValue, - "method": AnalyticsOutputMethod.typed.rawValue, - ] - ) // Clear the rewrite service state for next use self.rewriteModeService.clearState() @@ -3760,10 +3801,6 @@ extension ContentView { self.asr.micStatus == .authorized } - private var onboardingAccessibilityReady: Bool { - self.accessibilityEnabled - } - private var onboardingAIReady: Bool { self.settings.onboardingAISkipped || DictationAIPostProcessingGate.isProviderConfigured() } @@ -3822,9 +3859,6 @@ extension ContentView { if !self.onboardingMicrophoneReady { missing.append("microphone access") } - if !self.onboardingAccessibilityReady { - missing.append("Accessibility access") - } if !allowsAIConfiguration, !self.onboardingAIReady { missing.append("AI choice") } diff --git a/Sources/Fluid/Persistence/SettingsStore.swift b/Sources/Fluid/Persistence/SettingsStore.swift index 4cb7c599..4abddd60 100644 --- a/Sources/Fluid/Persistence/SettingsStore.swift +++ b/Sources/Fluid/Persistence/SettingsStore.swift @@ -2336,6 +2336,14 @@ final class SettingsStore: ObservableObject { } } + var onboardingAccessibilitySkipped: Bool { + get { self.defaults.bool(forKey: Keys.onboardingAccessibilitySkipped) } + set { + objectWillChange.send() + self.defaults.set(newValue, forKey: Keys.onboardingAccessibilitySkipped) + } + } + var onboardingSelectedLanguageID: String { get { let stored = self.defaults.string(forKey: Keys.onboardingSelectedLanguageID)? @@ -2396,6 +2404,7 @@ final class SettingsStore: ObservableObject { self.defaults.set(false, forKey: Keys.onboardingAISkipped) self.defaults.set(false, forKey: Keys.onboardingPlaygroundValidated) self.defaults.set(false, forKey: Keys.onboardingPlaygroundSkipped) + self.defaults.set(false, forKey: Keys.onboardingAccessibilitySkipped) self.defaults.set("en", forKey: Keys.onboardingSelectedLanguageID) } else { self.defaults.set(true, forKey: Keys.onboardingCompleted) @@ -2403,6 +2412,7 @@ final class SettingsStore: ObservableObject { self.defaults.set(false, forKey: Keys.onboardingAISkipped) self.defaults.set(false, forKey: Keys.onboardingPlaygroundValidated) self.defaults.set(false, forKey: Keys.onboardingPlaygroundSkipped) + self.defaults.set(false, forKey: Keys.onboardingAccessibilitySkipped) self.defaults.set("en", forKey: Keys.onboardingSelectedLanguageID) } } @@ -2416,6 +2426,7 @@ final class SettingsStore: ObservableObject { self.defaults.set(false, forKey: Keys.onboardingAISkipped) self.defaults.set(false, forKey: Keys.onboardingPlaygroundValidated) self.defaults.set(false, forKey: Keys.onboardingPlaygroundSkipped) + self.defaults.set(false, forKey: Keys.onboardingAccessibilitySkipped) self.defaults.set("en", forKey: Keys.onboardingSelectedLanguageID) self.defaults.set(false, forKey: Keys.playgroundUsed) } @@ -2443,6 +2454,7 @@ final class SettingsStore: ObservableObject { self.defaults.set(false, forKey: Keys.onboardingAISkipped) self.defaults.set(false, forKey: Keys.onboardingPlaygroundValidated) self.defaults.set(false, forKey: Keys.onboardingPlaygroundSkipped) + self.defaults.set(false, forKey: Keys.onboardingAccessibilitySkipped) } private func hasLegacyUsageSignals() -> Bool { @@ -4857,6 +4869,7 @@ private extension SettingsStore { static let onboardingAISkipped = "OnboardingAISkipped" static let onboardingPlaygroundValidated = "OnboardingPlaygroundValidated" static let onboardingPlaygroundSkipped = "OnboardingPlaygroundSkipped" + static let onboardingAccessibilitySkipped = "OnboardingAccessibilitySkipped" static let onboardingSelectedLanguageID = "OnboardingSelectedLanguageID" // Command Mode Keys diff --git a/Sources/Fluid/Services/MenuBarManager.swift b/Sources/Fluid/Services/MenuBarManager.swift index 6621b54e..8d1a669e 100644 --- a/Sources/Fluid/Services/MenuBarManager.swift +++ b/Sources/Fluid/Services/MenuBarManager.swift @@ -17,6 +17,7 @@ final class MenuBarManager: NSObject, ObservableObject, NSMenuDelegate { // Cached menu items to avoid rebuilding entire menu private var statusMenuItem: NSMenuItem? + private var startStopDictationMenuItem: NSMenuItem? private var copyLastTranscriptMenuItem: NSMenuItem? private var rollbackMenuItem: NSMenuItem? private var microphoneMenuItem: NSMenuItem? @@ -25,6 +26,8 @@ final class MenuBarManager: NSObject, ObservableObject, NSMenuDelegate { // References to app state private weak var asrService: ASRService? private var cancellables = Set() + private var startDictationCallback: (() -> Void)? + private var stopDictationCallback: (() async -> Void)? /// Overlay management (persistent, independent of window lifecycle) private var overlayVisible: Bool = false @@ -97,6 +100,15 @@ final class MenuBarManager: NSObject, ObservableObject, NSMenuDelegate { .store(in: &self.cancellables) } + func configureDictationControls( + start: @escaping () -> Void, + stop: @escaping () async -> Void + ) { + self.startDictationCallback = start + self.stopDictationCallback = stop + self.updateMenuItemsText() + } + private func handleOverlayState(isRunning: Bool, asrService: ASRService) { self.overlayBench("handle_state isRunning=\(isRunning) overlayVisible=\(self.overlayVisible) processing=\(self.isProcessingActive) mode=\(self.currentOverlayMode.rawValue)") @@ -466,6 +478,15 @@ final class MenuBarManager: NSObject, ObservableObject, NSMenuDelegate { menu.addItem(statusItem) } + let startStopItem = NSMenuItem( + title: "Start Dictation", + action: #selector(toggleDictationFromMenu(_:)), + keyEquivalent: "" + ) + startStopItem.target = self + menu.addItem(startStopItem) + self.startStopDictationMenuItem = startStopItem + let copyLastTranscriptItem = NSMenuItem( title: "Copy Last Transcript", action: #selector(copyLastTranscript(_:)), @@ -555,6 +576,8 @@ final class MenuBarManager: NSObject, ObservableObject, NSMenuDelegate { let hotkeyInfo = hotkeyDisplay.isEmpty ? "" : " (\(hotkeyDisplay))" let statusTitle = self.isRecording ? "Recording...\(hotkeyInfo)" : "Ready to Record\(hotkeyInfo)" self.statusMenuItem?.title = statusTitle + self.startStopDictationMenuItem?.title = self.isRecording ? "Stop Dictation" : "Start Dictation" + self.startStopDictationMenuItem?.isEnabled = self.startDictationCallback != nil && self.stopDictationCallback != nil self.copyLastTranscriptMenuItem?.isEnabled = self.canCopyLastTranscript self.microphoneMenuItem?.isEnabled = true @@ -644,6 +667,26 @@ final class MenuBarManager: NSObject, ObservableObject, NSMenuDelegate { DebugLogger.shared.info("Menu action: Copied latest transcription to clipboard", source: "MenuBarManager") } + @objc private func toggleDictationFromMenu(_ sender: Any?) { + if self.isRecording { + guard let stopDictationCallback else { + DebugLogger.shared.warning("Menu action: Stop Dictation requested but callback is missing", source: "MenuBarManager") + return + } + DebugLogger.shared.info("Menu action: Stop Dictation", source: "MenuBarManager") + Task { @MainActor in + await stopDictationCallback() + } + } else { + guard let startDictationCallback else { + DebugLogger.shared.warning("Menu action: Start Dictation requested but callback is missing", source: "MenuBarManager") + return + } + DebugLogger.shared.info("Menu action: Start Dictation", source: "MenuBarManager") + startDictationCallback() + } + } + @objc private func selectMicrophone(_ sender: NSMenuItem) { guard self.isRecording == false else { return } guard let uid = sender.representedObject as? String, !uid.isEmpty else { return } diff --git a/Sources/Fluid/Services/NotificationService.swift b/Sources/Fluid/Services/NotificationService.swift index e0922581..b5344b53 100644 --- a/Sources/Fluid/Services/NotificationService.swift +++ b/Sources/Fluid/Services/NotificationService.swift @@ -10,6 +10,7 @@ enum NotificationService { static let aiProcessingFallback = "aiProcessingFallback" static let audioCaptureFallback = "audioCaptureFallback" static let commandModeFailure = "commandModeFailure" + static let clipboardOnlyOutput = "clipboardOnlyOutput" } static func showAudioCaptureFallback( @@ -111,6 +112,34 @@ enum NotificationService { } } + static func showClipboardOnlyOutput() { + let center = UNUserNotificationCenter.current() + center.getNotificationSettings { settings in + switch settings.authorizationStatus { + case .authorized, .provisional, .ephemeral: + self.deliverClipboardOnlyOutput(using: center) + case .notDetermined: + center.requestAuthorization(options: [.alert]) { granted, requestError in + if let requestError { + DebugLogger.shared.warning( + "Notification permission request failed: \(requestError.localizedDescription)", + source: "NotificationService" + ) + } + guard granted else { return } + self.deliverClipboardOnlyOutput(using: center) + } + case .denied: + DebugLogger.shared.debug( + "Skipping clipboard-only notification because notification permission is denied", + source: "NotificationService" + ) + @unknown default: + break + } + } + } + private static func deliverAIProcessingFallback(error: String, using center: UNUserNotificationCenter) { let content = UNMutableNotificationContent() content.title = "AI Enhancement failed" @@ -189,4 +218,27 @@ enum NotificationService { } } } + + private static func deliverClipboardOnlyOutput(using center: UNUserNotificationCenter) { + let content = UNMutableNotificationContent() + content.title = "Copied to clipboard" + content.body = "Enable Accessibility for auto-paste and global hotkeys." + content.sound = nil + content.userInfo = [UserInfoKey.kind: Kind.clipboardOnlyOutput] + + let request = UNNotificationRequest( + identifier: "clipboard-only-output-\(UUID().uuidString)", + content: content, + trigger: nil + ) + + center.add(request) { addError in + if let addError { + DebugLogger.shared.warning( + "Failed to show clipboard-only notification: \(addError.localizedDescription)", + source: "NotificationService" + ) + } + } + } } diff --git a/Sources/Fluid/Services/TypingService.swift b/Sources/Fluid/Services/TypingService.swift index 3d76d70e..0f4c3668 100644 --- a/Sources/Fluid/Services/TypingService.swift +++ b/Sources/Fluid/Services/TypingService.swift @@ -296,9 +296,10 @@ final class TypingService { // Check accessibility permissions first guard AXIsProcessTrusted() else { - self.bench("request_return reason=accessibility_not_trusted") - self.log("[TypingService] ERROR: Accessibility permissions required for text injection") - self.log("[TypingService] Current accessibility status: \(AXIsProcessTrusted())") + self.bench("request_return reason=accessibility_not_trusted clipboard_fallback=true") + self.log("[TypingService] Accessibility unavailable — copying transcript to clipboard instead of injecting") + let copied = ClipboardService.copyToClipboard(text) + self.log("[TypingService] Clipboard fallback \(copied ? "succeeded" : "failed") for \(text.count) characters") return } diff --git a/Sources/Fluid/UI/OnboardingTryoutStepView.swift b/Sources/Fluid/UI/OnboardingTryoutStepView.swift index ee5f0166..1c72e231 100644 --- a/Sources/Fluid/UI/OnboardingTryoutStepView.swift +++ b/Sources/Fluid/UI/OnboardingTryoutStepView.swift @@ -10,7 +10,9 @@ struct OnboardingTryoutStepView: View { let isRecordingShortcut: Bool let shortcutRecordingMessage: String? let footerHint: String? + let showsInAppRecordControl: Bool let onToggleShortcut: () -> Void + let onToggleRecording: (() -> Void)? @Environment(\.accessibilityReduceMotion) private var reduceMotion @Environment(\.theme) private var theme @@ -19,6 +21,7 @@ struct OnboardingTryoutStepView: View { @State private var isShortcutKeyPressed = false @State private var isShortcutGlowActive = false @State private var shortcutAnimationRevision = 0 + @State private var isRecordHovered = false init( finalText: Binding, @@ -29,7 +32,9 @@ struct OnboardingTryoutStepView: View { isRecordingShortcut: Bool, shortcutRecordingMessage: String?, footerHint: String? = nil, - onToggleShortcut: @escaping () -> Void + showsInAppRecordControl: Bool = false, + onToggleShortcut: @escaping () -> Void, + onToggleRecording: (() -> Void)? = nil ) { self._finalText = finalText self.language = language @@ -39,7 +44,9 @@ struct OnboardingTryoutStepView: View { self.isRecordingShortcut = isRecordingShortcut self.shortcutRecordingMessage = shortcutRecordingMessage self.footerHint = footerHint + self.showsInAppRecordControl = showsInAppRecordControl self.onToggleShortcut = onToggleShortcut + self.onToggleRecording = onToggleRecording } private static let languageExamples: [String: [String]] = [ @@ -162,27 +169,41 @@ struct OnboardingTryoutStepView: View { let shape = RoundedRectangle(cornerRadius: 18, style: .continuous) return VStack(spacing: 14) { - HStack { - Spacer() - self.changeShortcutButton - } - .frame(height: 0) - .offset(y: 8) - - self.shortcutVisual - .padding(.top, 10) + if self.showsInAppRecordControl { + self.inAppRecordControl + .padding(.top, 10) - self.actionHintRow - - if let shortcutRecordingMessage, - self.isRecordingShortcut, - !shortcutRecordingMessage.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty - { - Label(shortcutRecordingMessage, systemImage: "exclamationmark.triangle.fill") - .font(self.theme.typography.captionSmall) - .foregroundStyle(Color.orange.opacity(0.92)) - .lineLimit(1) + Text(self.isRunning ? "Listening… Speak now, then stop when you're done." : "Use Record to try dictation without Accessibility.") + .font(self.theme.typography.captionStrong) + .foregroundStyle(Color.white.opacity(0.62)) + .multilineTextAlignment(.center) + .lineLimit(2) .minimumScaleFactor(0.82) + .frame(maxWidth: .infinity) + .padding(.top, 2) + } else { + HStack { + Spacer() + self.changeShortcutButton + } + .frame(height: 0) + .offset(y: 8) + + self.shortcutVisual + .padding(.top, 10) + + self.actionHintRow + + if let shortcutRecordingMessage, + self.isRecordingShortcut, + !shortcutRecordingMessage.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty + { + Label(shortcutRecordingMessage, systemImage: "exclamationmark.triangle.fill") + .font(self.theme.typography.captionSmall) + .foregroundStyle(Color.orange.opacity(0.92)) + .lineLimit(1) + .minimumScaleFactor(0.82) + } } self.editorPanel @@ -202,7 +223,58 @@ struct OnboardingTryoutStepView: View { ) ) .accessibilityElement(children: .combine) - .accessibilityLabel("Dictation shortcut \(self.shortcutDisplay). Press once to start. Press again to stop.") + .accessibilityLabel( + self.showsInAppRecordControl + ? "In-app dictation tryout. Record to start. Stop to finish." + : "Dictation shortcut \(self.shortcutDisplay). Press once to start. Press again to stop." + ) + } + + private var inAppRecordControl: some View { + let shape = Capsule() + let title = self.isRunning ? "Stop Recording" : "Start Recording" + let fillOpacity = self.isRecordHovered ? 0.16 : 0.10 + let ringOpacity = self.isRecordHovered ? 0.50 : 0.18 + + return Button { + self.onToggleRecording?() + } label: { + HStack(spacing: 10) { + Image(systemName: self.isRunning ? "stop.fill" : "mic.fill") + .font(.system(size: 14, weight: .bold)) + Text(title) + .font(.system(size: 15, weight: .semibold)) + .lineLimit(1) + } + .foregroundStyle(.white.opacity(0.94)) + .padding(.horizontal, 22) + .frame(height: 46) + .background( + shape + .fill(self.isRunning ? Color.red.opacity(0.78) : FluidOnboardingLandingColors.blue.opacity(0.92)) + .overlay(shape.fill(Color.white.opacity(fillOpacity))) + .overlay( + shape.stroke( + FluidOnboardingLandingColors.blue.opacity(ringOpacity), + lineWidth: self.isRecordHovered ? 1.4 : 1 + ) + ) + .shadow( + color: (self.isRunning ? Color.red : FluidOnboardingLandingColors.blue) + .opacity(self.isRecordHovered ? 0.36 : 0.18), + radius: self.isRecordHovered ? 18 : 12, + x: 0, + y: 6 + ) + ) + .contentShape(shape) + } + .buttonStyle(.plain) + .focusable(false) + .onHover { isHovered in + self.isRecordHovered = isHovered + } + .accessibilityLabel(title) } private var changeShortcutButton: some View { diff --git a/Sources/Fluid/UI/SettingsView.swift b/Sources/Fluid/UI/SettingsView.swift index 356b5a7e..5c0b15d5 100644 --- a/Sources/Fluid/UI/SettingsView.swift +++ b/Sources/Fluid/UI/SettingsView.swift @@ -1011,13 +1011,14 @@ struct SettingsView: View { HStack(spacing: 6) { Image(systemName: "exclamationmark.triangle.fill") .foregroundStyle(self.theme.palette.warning) - Text("Accessibility permissions required") + Text("Clipboard-only mode") .font(self.theme.typography.bodyStrong) .foregroundStyle(self.theme.palette.warning) } - Text("Required for global hotkey functionality") + Text("Accessibility is required for global hotkeys and auto-paste. Until then, use menu bar Start/Stop Dictation or in-app Record — transcripts copy to the clipboard.") .font(self.theme.typography.bodySmall) .foregroundStyle(self.settingsSecondaryText) + .fixedSize(horizontal: false, vertical: true) } Spacer() @@ -1053,6 +1054,17 @@ struct SettingsView: View { .buttonStyle(.bordered) .controlSize(.small) } + + Divider().opacity(0.2) + + self.optionToggleRow( + title: "Copy to Clipboard", + description: "Keeps transcripts available for ⌘V. Recommended while Accessibility is off.", + isOn: self.$copyToClipboard + ) + .onChange(of: self.copyToClipboard) { _, newValue in + SettingsStore.shared.copyTranscriptionToClipboard = newValue + } } } } diff --git a/Sources/Fluid/UI/WelcomeView.swift b/Sources/Fluid/UI/WelcomeView.swift index 7d70c779..b88f0fcf 100644 --- a/Sources/Fluid/UI/WelcomeView.swift +++ b/Sources/Fluid/UI/WelcomeView.swift @@ -642,6 +642,8 @@ struct OnboardingFlowView: View { let openAccessibilitySettings: () -> Void let restartApp: () -> Void let menuBarManager: MenuBarManager + let stopAndProcessTranscription: () async -> Void + let startRecording: () -> Void @Binding var activeShortcutRecordingTarget: ShortcutRecordingTarget? @Binding var shortcutRecordingMessage: String? let theme: AppTheme @@ -723,11 +725,11 @@ struct OnboardingFlowView: View { case .voiceModel: return "Choose the best local engine for your language." case .permissions: - return "Allow FluidVoice to listen and type into other apps." + return "Allow FluidVoice to listen. Accessibility unlocks hotkeys and auto-paste." case .aiEnhancement: return "Optional: Configure AI post-processing or skip this step." case .playground: - return "Use your dictation shortcut once before finishing setup." + return "Try dictation once before finishing setup." } } } @@ -863,6 +865,14 @@ struct OnboardingFlowView: View { self.isMicrophoneReady && self.isAccessibilityReady } + private var canSkipAccessibility: Bool { + self.isMicrophoneReady && !self.isAccessibilityReady + } + + private var shouldUseInAppPlaygroundRecording: Bool { + !self.isAccessibilityReady || self.settings.onboardingAccessibilitySkipped + } + private var isAIReady: Bool { self.settings.onboardingAISkipped || DictationAIPostProcessingGate.isProviderConfigured() } @@ -1389,7 +1399,8 @@ struct OnboardingFlowView: View { continueAction: @escaping () -> Void, skipTitle: String? = nil, canSkip: Bool = false, - skipAction: (() -> Void)? = nil + skipAction: (() -> Void)? = nil, + skipButtonWidth: CGFloat = 132 ) -> some View { let canNavigateBack = !self.isModelPreparationInProgress && !self.asr.isRunning && !self.isRecordingAnyShortcut @@ -1409,7 +1420,8 @@ struct OnboardingFlowView: View { self.cinematicFooterButton( title: skipTitle, kind: .skip, - isEnabled: canSkip + isEnabled: canSkip, + width: skipButtonWidth ) { skipAction() } @@ -1432,6 +1444,7 @@ struct OnboardingFlowView: View { title: String, kind: OnboardingFooterButton, isEnabled: Bool, + width: CGFloat = 132, action: @escaping () -> Void ) -> some View { let isPrimary = kind == .next @@ -1442,7 +1455,7 @@ struct OnboardingFlowView: View { title: title, systemImage: nil, tone: isPrimary ? .primary : .secondary, - width: 132, + width: width, height: 48, fontSize: 16, iconSize: 14, @@ -1688,9 +1701,10 @@ struct OnboardingFlowView: View { .lineSpacing(4) .padding(.bottom, 16) - Text("Two quick permissions make dictation work anywhere.") + Text("Microphone is required. Accessibility is recommended for hotkeys and auto-paste.") .font(.system(size: 15, weight: .medium)) .foregroundStyle(Color.white.opacity(0.62)) + .multilineTextAlignment(.center) .padding(.bottom, 28) VStack(spacing: 14) { @@ -1720,10 +1734,18 @@ struct OnboardingFlowView: View { } if !self.isAccessibilityReady { - Text("Already enabled it? FluidVoice will update when macOS confirms access.") - .font(.system(size: 12, weight: .medium)) - .foregroundStyle(Color.white.opacity(0.42)) - .padding(.top, 2) + VStack(alignment: .leading, spacing: 8) { + Text("Already enabled it? FluidVoice will update when macOS confirms access.") + .font(.system(size: 12, weight: .medium)) + .foregroundStyle(Color.white.opacity(0.42)) + + Text("Without Accessibility you won't get global hotkeys, auto-paste into other apps, or Edit Mode selection. You can still dictate from the app or menu bar — transcripts copy to the clipboard for ⌘V.") + .font(.system(size: 12, weight: .medium)) + .foregroundStyle(Color.white.opacity(0.52)) + .fixedSize(horizontal: false, vertical: true) + } + .frame(maxWidth: .infinity, alignment: .leading) + .padding(.top, 2) } } .frame(width: 560) @@ -1735,10 +1757,18 @@ struct OnboardingFlowView: View { self.cinematicFooter( continueTitle: "Continue", - canContinue: self.canContinue - ) { - self.handlePrimaryAction() - } + canContinue: self.canContinue, + continueAction: { + self.settings.onboardingAccessibilitySkipped = false + self.handlePrimaryAction() + }, + skipTitle: self.canSkipAccessibility ? "Continue without Accessibility" : nil, + canSkip: self.canSkipAccessibility, + skipAction: self.canSkipAccessibility ? { + self.skipAccessibilityPermission() + } : nil, + skipButtonWidth: 248 + ) } FluidOnboardingLandingHoverTracker( @@ -1820,7 +1850,11 @@ struct OnboardingFlowView: View { isRunning: self.asr.isRunning, isRecordingShortcut: self.isRecordingPrimaryShortcut, shortcutRecordingMessage: self.isRecordingPrimaryShortcut ? self.shortcutRecordingMessage : nil, - onToggleShortcut: self.togglePrimaryShortcutRecording + showsInAppRecordControl: self.shouldUseInAppPlaygroundRecording, + onToggleShortcut: self.togglePrimaryShortcutRecording, + onToggleRecording: self.shouldUseInAppPlaygroundRecording ? { + self.toggleInAppPlaygroundRecording() + } : nil ) } .frame(maxWidth: .infinity) @@ -1883,7 +1917,7 @@ struct OnboardingFlowView: View { if self.accessibilitySetupInProgress { return "Use the floating guide to drag \(self.appDisplayName) into the Accessibility apps list." } - return "Open Settings, then use the floating guide to add \(self.appDisplayName)." + return "Recommended for global hotkeys and auto-paste. Open Settings, then use the floating guide to add \(self.appDisplayName)." } private var appDisplayName: String { @@ -2675,6 +2709,22 @@ struct OnboardingFlowView: View { } } + private func toggleInAppPlaygroundRecording() { + if self.asr.isRunning { + Task { + await self.stopAndProcessTranscription() + } + } else { + self.startRecording() + } + } + + private func skipAccessibilityPermission() { + self.settings.onboardingAccessibilitySkipped = true + self.settings.copyTranscriptionToClipboard = true + self.goNext() + } + private func resetTryoutValidationForSetupChange() { self.settings.onboardingPlaygroundValidated = false self.settings.onboardingPlaygroundSkipped = false From 1727021f3712570c537fc1d7a9992fbb086b038e Mon Sep 17 00:00:00 2001 From: uzairansaruzi Date: Thu, 16 Jul 2026 00:01:08 -0400 Subject: [PATCH 2/7] Add PR screenshots for Accessibility soft-gate onboarding UI. Co-authored-by: Cursor --- .../627/01-permissions-soft-gate.png | Bin 0 -> 53001 bytes .../627/02-playground-in-app-record.png | Bin 0 -> 28320 bytes .../627/03-settings-clipboard-only.png | Bin 0 -> 33118 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 .github/screenshots/627/01-permissions-soft-gate.png create mode 100644 .github/screenshots/627/02-playground-in-app-record.png create mode 100644 .github/screenshots/627/03-settings-clipboard-only.png diff --git a/.github/screenshots/627/01-permissions-soft-gate.png b/.github/screenshots/627/01-permissions-soft-gate.png new file mode 100644 index 0000000000000000000000000000000000000000..f546226e0e668c3843b87afc244f1bd42e9c6db5 GIT binary patch literal 53001 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

QW6ZQH?x6E7hFpGL6V>cddi0ifC2M0}l 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 literal 0 HcmV?d00001 diff --git a/.github/screenshots/627/02-playground-in-app-record.png b/.github/screenshots/627/02-playground-in-app-record.png new file mode 100644 index 0000000000000000000000000000000000000000..e7399e63fae5fca25a3c61aeedf56e4b4b0db4b2 GIT binary patch literal 28320 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

!} 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 literal 0 HcmV?d00001 From f2192720736fc53e65c25ee183b2433c73cb9b75 Mon Sep 17 00:00:00 2001 From: uzairansaruzi Date: Thu, 16 Jul 2026 00:08:12 -0400 Subject: [PATCH 3/7] Address PR review: clipboard fallback, notification ID, menu training guard. Keep clipboard-only delivery when Fluid is frontmost without Accessibility, replace stacked clipboard notifications with a stable ID, and disable menu Start/Stop during dictionary training. Co-authored-by: Cursor --- Sources/Fluid/ContentView.swift | 23 ++++++----- Sources/Fluid/Services/MenuBarManager.swift | 39 ++++++++++++++----- .../Fluid/Services/NotificationService.swift | 4 +- 3 files changed, 46 insertions(+), 20 deletions(-) diff --git a/Sources/Fluid/ContentView.swift b/Sources/Fluid/ContentView.swift index c63c848b..9117b207 100644 --- a/Sources/Fluid/ContentView.swift +++ b/Sources/Fluid/ContentView.swift @@ -2375,13 +2375,16 @@ struct ContentView: View { model: transcriptionModelInfo.model ) } - // When FluidVoice itself is frontmost, the bound editor already receives `finalText`. - // Avoid re-inserting or overwriting the clipboard in that self-target case. + // When FluidVoice itself is frontmost and Accessibility works, the bound + // editor already receives `finalText` — skip clipboard overwrite there. + // In clipboard-only mode (!Accessibility), still copy even when Fluid is + // frontmost so in-app / menu-bar recordings are not dropped. let accessibilityTrusted = AXIsProcessTrusted() - let shouldForceClipboardFallback = shouldPersistOutputs && !isFluidFrontmost && !accessibilityTrusted - let shouldCopyToClipboard = shouldPersistOutputs && - !isFluidFrontmost && - (SettingsStore.shared.copyTranscriptionToClipboard || shouldForceClipboardFallback) + let shouldForceClipboardFallback = shouldPersistOutputs && !accessibilityTrusted + let shouldCopyToClipboard = shouldPersistOutputs && ( + shouldForceClipboardFallback || + (!isFluidFrontmost && SettingsStore.shared.copyTranscriptionToClipboard) + ) var didCopyToClipboard = false if shouldCopyToClipboard { @@ -2757,9 +2760,9 @@ struct ContentView: View { let frontmostApp = NSWorkspace.shared.frontmostApplication let isFluidFrontmost = frontmostApp?.bundleIdentifier == Bundle.main.bundleIdentifier let accessibilityTrusted = AXIsProcessTrusted() - let shouldForceClipboardFallback = !isFluidFrontmost && !accessibilityTrusted - let shouldCopyToClipboard = !isFluidFrontmost && - (SettingsStore.shared.copyTranscriptionToClipboard || shouldForceClipboardFallback) + let shouldForceClipboardFallback = !accessibilityTrusted + let shouldCopyToClipboard = shouldForceClipboardFallback || + (!isFluidFrontmost && SettingsStore.shared.copyTranscriptionToClipboard) if shouldCopyToClipboard { ClipboardService.copyToClipboard(finalText) @@ -2890,7 +2893,7 @@ struct ContentView: View { let frontmostApp = NSWorkspace.shared.frontmostApplication let isFluidFrontmost = frontmostApp?.bundleIdentifier?.contains("fluid") == true let accessibilityTrusted = AXIsProcessTrusted() - let shouldForceClipboardFallback = !isFluidFrontmost && !accessibilityTrusted + let shouldForceClipboardFallback = !accessibilityTrusted if shouldForceClipboardFallback { ClipboardService.copyToClipboard(finalText) NotificationService.showClipboardOnlyOutput() diff --git a/Sources/Fluid/Services/MenuBarManager.swift b/Sources/Fluid/Services/MenuBarManager.swift index 8d1a669e..4dfcb34d 100644 --- a/Sources/Fluid/Services/MenuBarManager.swift +++ b/Sources/Fluid/Services/MenuBarManager.swift @@ -88,6 +88,13 @@ final class MenuBarManager: NSObject, ObservableObject, NSMenuDelegate { } .store(in: &self.cancellables) + asrService.$isDictionaryTrainingCaptureActive + .receive(on: DispatchQueue.main) + .sink { [weak self] _ in + self?.updateMenu() + } + .store(in: &self.cancellables) + // Subscribe to partial transcription updates for streaming preview asrService.$partialTranscription .receive(on: DispatchQueue.main) @@ -570,6 +577,18 @@ final class MenuBarManager: NSObject, ObservableObject, NSMenuDelegate { } } + private var canToggleDictationFromMenu: Bool { + guard self.startDictationCallback != nil, self.stopDictationCallback != nil else { + return false + } + // Dictionary training owns recording; diverting stop into the dictation + // pipeline would desync training UI and emit the sample as a transcript. + if self.asrService?.isDictionaryTrainingCaptureActive == true { + return false + } + return true + } + private func updateMenuItemsText() { // Update status text with hotkey info let hotkeyDisplay = SettingsStore.shared.primaryDictationShortcutDisplayString @@ -577,7 +596,7 @@ final class MenuBarManager: NSObject, ObservableObject, NSMenuDelegate { let statusTitle = self.isRecording ? "Recording...\(hotkeyInfo)" : "Ready to Record\(hotkeyInfo)" self.statusMenuItem?.title = statusTitle self.startStopDictationMenuItem?.title = self.isRecording ? "Stop Dictation" : "Start Dictation" - self.startStopDictationMenuItem?.isEnabled = self.startDictationCallback != nil && self.stopDictationCallback != nil + self.startStopDictationMenuItem?.isEnabled = self.canToggleDictationFromMenu self.copyLastTranscriptMenuItem?.isEnabled = self.canCopyLastTranscript self.microphoneMenuItem?.isEnabled = true @@ -668,20 +687,22 @@ final class MenuBarManager: NSObject, ObservableObject, NSMenuDelegate { } @objc private func toggleDictationFromMenu(_ sender: Any?) { + guard self.canToggleDictationFromMenu else { + DebugLogger.shared.info( + "Menu action: Start/Stop Dictation ignored (callbacks missing or dictionary training active)", + source: "MenuBarManager" + ) + return + } + if self.isRecording { - guard let stopDictationCallback else { - DebugLogger.shared.warning("Menu action: Stop Dictation requested but callback is missing", source: "MenuBarManager") - return - } + guard let stopDictationCallback else { return } DebugLogger.shared.info("Menu action: Stop Dictation", source: "MenuBarManager") Task { @MainActor in await stopDictationCallback() } } else { - guard let startDictationCallback else { - DebugLogger.shared.warning("Menu action: Start Dictation requested but callback is missing", source: "MenuBarManager") - return - } + guard let startDictationCallback else { return } DebugLogger.shared.info("Menu action: Start Dictation", source: "MenuBarManager") startDictationCallback() } diff --git a/Sources/Fluid/Services/NotificationService.swift b/Sources/Fluid/Services/NotificationService.swift index b5344b53..4234660a 100644 --- a/Sources/Fluid/Services/NotificationService.swift +++ b/Sources/Fluid/Services/NotificationService.swift @@ -226,8 +226,10 @@ enum NotificationService { content.sound = nil content.userInfo = [UserInfoKey.kind: Kind.clipboardOnlyOutput] + // Stable ID so repeated clipboard-only dictations replace the previous + // banner instead of stacking identical Notification Center entries. let request = UNNotificationRequest( - identifier: "clipboard-only-output-\(UUID().uuidString)", + identifier: "clipboard-only-output", content: content, trigger: nil ) From 8398ce8c56c2c830ff1b149a0ad785cde899fa1b Mon Sep 17 00:00:00 2001 From: uzairansaruzi Date: Thu, 16 Jul 2026 00:12:05 -0400 Subject: [PATCH 4/7] Address Greptile follow-ups on playground UI and TypingService feedback. Show hotkey tryout whenever Accessibility is available, and surface the clipboard-only confirmation from TypingService's Accessibility fallback path. Co-authored-by: Cursor --- Sources/Fluid/Services/TypingService.swift | 5 +++++ Sources/Fluid/UI/WelcomeView.swift | 4 +++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Sources/Fluid/Services/TypingService.swift b/Sources/Fluid/Services/TypingService.swift index 0f4c3668..d345ca49 100644 --- a/Sources/Fluid/Services/TypingService.swift +++ b/Sources/Fluid/Services/TypingService.swift @@ -300,6 +300,11 @@ final class TypingService { self.log("[TypingService] Accessibility unavailable — copying transcript to clipboard instead of injecting") let copied = ClipboardService.copyToClipboard(text) self.log("[TypingService] Clipboard fallback \(copied ? "succeeded" : "failed") for \(text.count) characters") + if copied { + Task { @MainActor in + NotificationService.showClipboardOnlyOutput() + } + } return } diff --git a/Sources/Fluid/UI/WelcomeView.swift b/Sources/Fluid/UI/WelcomeView.swift index b88f0fcf..0e125182 100644 --- a/Sources/Fluid/UI/WelcomeView.swift +++ b/Sources/Fluid/UI/WelcomeView.swift @@ -870,7 +870,9 @@ struct OnboardingFlowView: View { } private var shouldUseInAppPlaygroundRecording: Bool { - !self.isAccessibilityReady || self.settings.onboardingAccessibilitySkipped + // Prefer hotkey tryout whenever Accessibility is available now, even if + // the user previously skipped it earlier in this onboarding session. + !self.isAccessibilityReady } private var isAIReady: Bool { From c33e6cf4fd42d8f62d650a052011d5cd2456643c Mon Sep 17 00:00:00 2001 From: uzairansaruzi Date: Thu, 16 Jul 2026 09:23:03 -0400 Subject: [PATCH 5/7] Address Codex review: sandbox menu-bar stops and clipboard UI sync. Route menu-bar stop through the same onboarding sandbox selection as hotkeys, and keep the Settings clipboard toggle synced when onboarding writes SettingsStore directly. Co-authored-by: Cursor --- Sources/Fluid/ContentView.swift | 8 +++++++- Sources/Fluid/Persistence/SettingsStore.swift | 5 ++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/Sources/Fluid/ContentView.swift b/Sources/Fluid/ContentView.swift index 9117b207..6cf2a010 100644 --- a/Sources/Fluid/ContentView.swift +++ b/Sources/Fluid/ContentView.swift @@ -350,6 +350,11 @@ struct ContentView: View { .onReceive(NotificationCenter.default.publisher(for: .settingsBackupDidRestore)) { _ in self.reloadSettingsStateAfterBackupRestore() } + .onChange(of: self.settings.copyTranscriptionToClipboard) { _, newValue in + // Keep Settings toggle in sync when onboarding skip (or other writers) + // update SettingsStore directly. + self.copyToClipboard = newValue + } .toolbar { if !self.settings.shouldShowOnboarding { ToolbarItemGroup(placement: .primaryAction) { @@ -624,7 +629,8 @@ struct ContentView: View { self.startRecording() }, stop: { [self] in - await self.stopAndProcessTranscription() + let route = self.currentDictationOutputRouteForHotkeyStop() + await self.stopAndProcessTranscription(route: route) } ) self.refreshDevices() diff --git a/Sources/Fluid/Persistence/SettingsStore.swift b/Sources/Fluid/Persistence/SettingsStore.swift index 4abddd60..8de477d8 100644 --- a/Sources/Fluid/Persistence/SettingsStore.swift +++ b/Sources/Fluid/Persistence/SettingsStore.swift @@ -1772,7 +1772,10 @@ final class SettingsStore: ObservableObject { var copyTranscriptionToClipboard: Bool { get { self.defaults.bool(forKey: Keys.copyTranscriptionToClipboard) } - set { self.defaults.set(newValue, forKey: Keys.copyTranscriptionToClipboard) } + set { + objectWillChange.send() + self.defaults.set(newValue, forKey: Keys.copyTranscriptionToClipboard) + } } var preferredInputDeviceUID: String? { From 6f55cac2b6793e8cf6f28bdef52e162b7492d0f1 Mon Sep 17 00:00:00 2001 From: uzairansaruzi Date: Thu, 16 Jul 2026 09:48:59 -0400 Subject: [PATCH 6/7] Gate clipboard-only notification on write success and block menu start mid-stop. Avoid false "Copied to clipboard" banners when pasteboard write fails, and keep Start Dictation disabled while a menu-bar stop is still processing. Co-authored-by: Cursor --- Sources/Fluid/ContentView.swift | 62 ++++++++++++--------- Sources/Fluid/Services/MenuBarManager.swift | 16 +++++- 2 files changed, 51 insertions(+), 27 deletions(-) diff --git a/Sources/Fluid/ContentView.swift b/Sources/Fluid/ContentView.swift index 6cf2a010..6722344f 100644 --- a/Sources/Fluid/ContentView.swift +++ b/Sources/Fluid/ContentView.swift @@ -2394,19 +2394,20 @@ struct ContentView: View { var didCopyToClipboard = false if shouldCopyToClipboard { - ClipboardService.copyToClipboard(finalText) - didCopyToClipboard = true - AnalyticsService.shared.capture( - .outputDelivered, - properties: [ - "mode": AnalyticsMode.dictation.rawValue, - "method": AnalyticsOutputMethod.clipboard.rawValue, - "clipboard_only_output": shouldForceClipboardFallback, - ] - ) + didCopyToClipboard = ClipboardService.copyToClipboard(finalText) + if didCopyToClipboard { + AnalyticsService.shared.capture( + .outputDelivered, + properties: [ + "mode": AnalyticsMode.dictation.rawValue, + "method": AnalyticsOutputMethod.clipboard.rawValue, + "clipboard_only_output": shouldForceClipboardFallback, + ] + ) + } } - if shouldForceClipboardFallback { + if shouldForceClipboardFallback, didCopyToClipboard { NotificationService.showClipboardOnlyOutput() } @@ -2770,11 +2771,12 @@ struct ContentView: View { let shouldCopyToClipboard = shouldForceClipboardFallback || (!isFluidFrontmost && SettingsStore.shared.copyTranscriptionToClipboard) + var didCopyToClipboard = false if shouldCopyToClipboard { - ClipboardService.copyToClipboard(finalText) + didCopyToClipboard = ClipboardService.copyToClipboard(finalText) } - if shouldForceClipboardFallback { + if shouldForceClipboardFallback, didCopyToClipboard { NotificationService.showClipboardOnlyOutput() } @@ -2888,8 +2890,9 @@ struct ContentView: View { self.pendingAIReprocessText = nil } + var didCopyToClipboard = false if SettingsStore.shared.copyTranscriptionToClipboard { - ClipboardService.copyToClipboard(finalText) + didCopyToClipboard = ClipboardService.copyToClipboard(finalText) } let focusedPID = TypingService.captureSystemFocusedPID() @@ -2901,8 +2904,12 @@ struct ContentView: View { let accessibilityTrusted = AXIsProcessTrusted() let shouldForceClipboardFallback = !accessibilityTrusted if shouldForceClipboardFallback { - ClipboardService.copyToClipboard(finalText) - NotificationService.showClipboardOnlyOutput() + if !didCopyToClipboard { + didCopyToClipboard = ClipboardService.copyToClipboard(finalText) + } + if didCopyToClipboard { + NotificationService.showClipboardOnlyOutput() + } } let shouldTypeExternally = (!isFluidFrontmost || self.isTranscriptionFocused == false) && accessibilityTrusted if shouldTypeExternally { @@ -2947,16 +2954,19 @@ struct ContentView: View { // Copy to clipboard as backup (or as primary delivery without Accessibility) let accessibilityTrusted = AXIsProcessTrusted() + var didCopyToClipboard = false if SettingsStore.shared.copyTranscriptionToClipboard || !accessibilityTrusted { - ClipboardService.copyToClipboard(self.rewriteModeService.rewrittenText) - AnalyticsService.shared.capture( - .outputDelivered, - properties: [ - "mode": AnalyticsMode.rewrite.rawValue, - "method": AnalyticsOutputMethod.clipboard.rawValue, - "clipboard_only_output": !accessibilityTrusted, - ] - ) + didCopyToClipboard = ClipboardService.copyToClipboard(self.rewriteModeService.rewrittenText) + if didCopyToClipboard { + AnalyticsService.shared.capture( + .outputDelivered, + properties: [ + "mode": AnalyticsMode.rewrite.rawValue, + "method": AnalyticsOutputMethod.clipboard.rawValue, + "clipboard_only_output": !accessibilityTrusted, + ] + ) + } } // Type the rewritten text when Accessibility is available @@ -2976,7 +2986,7 @@ struct ContentView: View { "method": AnalyticsOutputMethod.typed.rawValue, ] ) - } else { + } else if didCopyToClipboard { NotificationService.showClipboardOnlyOutput() } diff --git a/Sources/Fluid/Services/MenuBarManager.swift b/Sources/Fluid/Services/MenuBarManager.swift index 4dfcb34d..7e1f898a 100644 --- a/Sources/Fluid/Services/MenuBarManager.swift +++ b/Sources/Fluid/Services/MenuBarManager.swift @@ -37,6 +37,11 @@ final class MenuBarManager: NSObject, ObservableObject, NSMenuDelegate { /// overlay. During post-processing we want the overlay to stay visible until processing ends. private var isProcessingActive: Bool = false + /// Menu-bar Stop can return before transcription/AI cleanup finishes, and `isRunning` + /// flips false first — without this gate the item becomes Start and can start a new + /// recording mid-stop (hotkeys use the same pattern via `isProcessingStop`). + private var isProcessingMenuDictationStop = false + @Published var isRecording: Bool = false /// One-shot navigation requests from the menu bar into the main window UI. @@ -586,6 +591,9 @@ final class MenuBarManager: NSObject, ObservableObject, NSMenuDelegate { if self.asrService?.isDictionaryTrainingCaptureActive == true { return false } + if self.isProcessingMenuDictationStop { + return false + } return true } @@ -689,7 +697,7 @@ final class MenuBarManager: NSObject, ObservableObject, NSMenuDelegate { @objc private func toggleDictationFromMenu(_ sender: Any?) { guard self.canToggleDictationFromMenu else { DebugLogger.shared.info( - "Menu action: Start/Stop Dictation ignored (callbacks missing or dictionary training active)", + "Menu action: Start/Stop Dictation ignored (callbacks missing, training active, or stop in flight)", source: "MenuBarManager" ) return @@ -698,7 +706,13 @@ final class MenuBarManager: NSObject, ObservableObject, NSMenuDelegate { if self.isRecording { guard let stopDictationCallback else { return } DebugLogger.shared.info("Menu action: Stop Dictation", source: "MenuBarManager") + self.isProcessingMenuDictationStop = true + self.updateMenuItemsText() Task { @MainActor in + defer { + self.isProcessingMenuDictationStop = false + self.updateMenuItemsText() + } await stopDictationCallback() } } else { From 47786e757e609fd4d6e78c812f5618324fb3a198 Mon Sep 17 00:00:00 2001 From: uzairansaruzi Date: Thu, 16 Jul 2026 09:59:41 -0400 Subject: [PATCH 7/7] Disable menu Start during any in-flight dictation stop. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Track stop→transcribe depth on MenuBarManager from ContentView so hotkey and in-app stops keep Start Dictation disabled, not only menu-initiated stops. Co-authored-by: Cursor --- Sources/Fluid/ContentView.swift | 5 +++ Sources/Fluid/Services/MenuBarManager.swift | 42 +++++++++++++++------ 2 files changed, 36 insertions(+), 11 deletions(-) diff --git a/Sources/Fluid/ContentView.swift b/Sources/Fluid/ContentView.swift index 6722344f..16f882ea 100644 --- a/Sources/Fluid/ContentView.swift +++ b/Sources/Fluid/ContentView.swift @@ -2046,6 +2046,11 @@ struct ContentView: View { DebugLogger.shared.info("Output route selected: \(route.rawValue)", source: "ContentView") self.appBench("stop_path_enter route=\(route.rawValue)") + // Disable menu Start/Stop for the full stop window — including hotkey and + // in-app stops, where isRunning flips false before transcription finishes. + self.menuBarManager.beginDictationStopProcessing() + defer { self.menuBarManager.endDictationStopProcessing() } + // Check if we're in rewrite or command mode let modeAtStop = self.activeRecordingMode let wasRewriteMode = modeAtStop == .edit || self.isRecordingForRewrite diff --git a/Sources/Fluid/Services/MenuBarManager.swift b/Sources/Fluid/Services/MenuBarManager.swift index 7e1f898a..fd832d06 100644 --- a/Sources/Fluid/Services/MenuBarManager.swift +++ b/Sources/Fluid/Services/MenuBarManager.swift @@ -37,10 +37,14 @@ final class MenuBarManager: NSObject, ObservableObject, NSMenuDelegate { /// overlay. During post-processing we want the overlay to stay visible until processing ends. private var isProcessingActive: Bool = false - /// Menu-bar Stop can return before transcription/AI cleanup finishes, and `isRunning` - /// flips false first — without this gate the item becomes Start and can start a new - /// recording mid-stop (hotkeys use the same pattern via `isProcessingStop`). - private var isProcessingMenuDictationStop = false + /// Depth of in-flight stop→transcribe work (menu, hotkey, or in-app). + /// `isRunning` flips false before that work finishes; without this the menu becomes Start + /// and can begin a new recording mid-stop (mirrors GlobalHotkeyManager.`isProcessingStop`). + private var dictationStopProcessingCount = 0 + + private var isProcessingDictationStop: Bool { + self.dictationStopProcessingCount > 0 + } @Published var isRecording: Bool = false @@ -390,6 +394,24 @@ final class MenuBarManager: NSObject, ObservableObject, NSMenuDelegate { } } + /// Keeps Start/Stop Dictation disabled for the full stop→transcribe window, + /// including stops initiated from hotkeys or in-app Record (not only the menu item). + /// Nested begin/end is supported so menu + ContentView can both track the same stop. + func beginDictationStopProcessing() { + self.dictationStopProcessingCount += 1 + if self.dictationStopProcessingCount == 1 { + self.updateMenuItemsText() + } + } + + func endDictationStopProcessing() { + guard self.dictationStopProcessingCount > 0 else { return } + self.dictationStopProcessingCount -= 1 + if self.dictationStopProcessingCount == 0 { + self.updateMenuItemsText() + } + } + /// Ends processing and waits for the recording overlay's exit transition. /// Output paths normally call this asynchronously after insertion dispatch /// so the exit animation cannot delay text delivery. @@ -591,7 +613,7 @@ final class MenuBarManager: NSObject, ObservableObject, NSMenuDelegate { if self.asrService?.isDictionaryTrainingCaptureActive == true { return false } - if self.isProcessingMenuDictationStop { + if self.isProcessingDictationStop { return false } return true @@ -706,13 +728,11 @@ final class MenuBarManager: NSObject, ObservableObject, NSMenuDelegate { if self.isRecording { guard let stopDictationCallback else { return } DebugLogger.shared.info("Menu action: Stop Dictation", source: "MenuBarManager") - self.isProcessingMenuDictationStop = true - self.updateMenuItemsText() + // Begin immediately so Start stays disabled before the Task runs; + // ContentView also begins/ends around stopAndProcessTranscription. + self.beginDictationStopProcessing() Task { @MainActor in - defer { - self.isProcessingMenuDictationStop = false - self.updateMenuItemsText() - } + defer { self.endDictationStopProcessing() } await stopDictationCallback() } } else {