diff --git a/VoiceInk/PowerMode/ActiveWindowService.swift b/VoiceInk/PowerMode/ActiveWindowService.swift index 7ec0fc8..f32f45f 100644 --- a/VoiceInk/PowerMode/ActiveWindowService.swift +++ b/VoiceInk/PowerMode/ActiveWindowService.swift @@ -52,6 +52,10 @@ class ActiveWindowService: ObservableObject { // Check for URL-specific configuration if let config = PowerModeManager.shared.getConfigurationForURL(currentURL) { logger.debug("⚙️ Found URL Configuration: \(config.name) for URL: \(currentURL)") + // Set as active configuration in PowerModeManager + await MainActor.run { + PowerModeManager.shared.setActiveConfiguration(config) + } // Apply URL-specific configuration await applyConfiguration(config) return @@ -66,78 +70,87 @@ class ActiveWindowService: ObservableObject { // Get configuration for the current app or use default if none exists let config = PowerModeManager.shared.getConfigurationForApp(bundleIdentifier) ?? PowerModeManager.shared.defaultConfig print("⚡️ Using Configuration: \(config.name) (AI Enhancement: \(config.isAIEnhancementEnabled ? "Enabled" : "Disabled"))") + + // Set as active configuration in PowerModeManager + await MainActor.run { + PowerModeManager.shared.setActiveConfiguration(config) + } + await applyConfiguration(config) } - private func applyConfiguration(_ config: PowerModeConfig) async { + /// Applies a specific configuration + func applyConfiguration(_ config: PowerModeConfig) async { guard let enhancementService = enhancementService else { return } + await MainActor.run { - // Only apply settings if power mode is enabled globally - if PowerModeManager.shared.isPowerModeEnabled { - // Apply AI enhancement settings - enhancementService.isEnhancementEnabled = config.isAIEnhancementEnabled - enhancementService.useScreenCaptureContext = config.useScreenCapture - - // Handle prompt selection - if config.isAIEnhancementEnabled { - if let promptId = config.selectedPrompt, - let uuid = UUID(uuidString: promptId) { - print("🎯 Applied Prompt: \(promptId)") - enhancementService.selectedPromptId = uuid - } else { - // Auto-select first prompt if none is selected and AI is enabled - if let firstPrompt = enhancementService.allPrompts.first { - print("🎯 Auto-selected Prompt: \(firstPrompt.title)") - enhancementService.selectedPromptId = firstPrompt.id - } + // Apply AI enhancement settings + enhancementService.isEnhancementEnabled = config.isAIEnhancementEnabled + enhancementService.useScreenCaptureContext = config.useScreenCapture + + // Handle prompt selection + if config.isAIEnhancementEnabled { + if let promptId = config.selectedPrompt, + let uuid = UUID(uuidString: promptId) { + print("🎯 Applied Prompt: \(promptId)") + enhancementService.selectedPromptId = uuid + } else { + // Auto-select first prompt if none is selected and AI is enabled + if let firstPrompt = enhancementService.allPrompts.first { + print("🎯 Auto-selected Prompt: \(firstPrompt.title)") + enhancementService.selectedPromptId = firstPrompt.id } } + } + + // Apply AI provider and model if specified + if config.isAIEnhancementEnabled, + let aiService = enhancementService.getAIService() { - // Apply AI provider and model if specified - if config.isAIEnhancementEnabled, - let aiService = enhancementService.getAIService() { + // Apply AI provider if specified, otherwise use current global provider + if let providerName = config.selectedAIProvider, + let provider = AIProvider(rawValue: providerName) { + print("🤖 Applied AI Provider: \(provider.rawValue)") + aiService.selectedProvider = provider - // Apply AI provider if specified, otherwise use current global provider - if let providerName = config.selectedAIProvider, - let provider = AIProvider(rawValue: providerName) { - print("🤖 Applied AI Provider: \(provider.rawValue)") - aiService.selectedProvider = provider - - // Apply model if specified, otherwise use default model - if let model = config.selectedAIModel, - !model.isEmpty { - print("🧠 Applied AI Model: \(model)") - aiService.selectModel(model) - } else { - print("🧠 Using default model for provider: \(aiService.currentModel)") - } + // Apply model if specified, otherwise use default model + if let model = config.selectedAIModel, + !model.isEmpty { + print("🧠 Applied AI Model: \(model)") + aiService.selectModel(model) } else { - print("🤖 Using global AI Provider: \(aiService.selectedProvider.rawValue)") + print("🧠 Using default model for provider: \(aiService.currentModel)") } + } else { + print("🤖 Using global AI Provider: \(aiService.selectedProvider.rawValue)") } - - // Apply language selection if specified - if let language = config.selectedLanguage { - print("🌐 Applied Language: \(language)") - UserDefaults.standard.set(language, forKey: "SelectedLanguage") - // Notify that language has changed to update the prompt - NotificationCenter.default.post(name: .languageDidChange, object: nil) - } - } else { - print("🔌 Power Mode is disabled globally - skipping configuration application") - return + } + + // Apply language selection if specified + if let language = config.selectedLanguage { + print("🌐 Applied Language: \(language)") + UserDefaults.standard.set(language, forKey: "SelectedLanguage") + // Notify that language has changed to update the prompt + NotificationCenter.default.post(name: .languageDidChange, object: nil) } } // Apply Whisper model selection - do this outside of MainActor to allow async operations - if PowerModeManager.shared.isPowerModeEnabled, - let whisperState = self.whisperState, + if let whisperState = self.whisperState, let modelName = config.selectedWhisperModel, let selectedModel = await whisperState.availableModels.first(where: { $0.name == modelName }) { print("🎤 Applied Whisper Model: \(selectedModel.name)") - // Apply the model selection immediately await whisperState.setDefaultModel(selectedModel) + + await whisperState.cleanupModelResources() + + do { + try await whisperState.loadModel(selectedModel) + print("🎤 Loaded Whisper Model: \(selectedModel.name)") + } catch { + print("❌ Failed to load Whisper Model: \(error.localizedDescription)") + } } } } diff --git a/VoiceInk/PowerMode/PowerModePopover.swift b/VoiceInk/PowerMode/PowerModePopover.swift index f6f2468..7baa14c 100644 --- a/VoiceInk/PowerMode/PowerModePopover.swift +++ b/VoiceInk/PowerMode/PowerModePopover.swift @@ -25,6 +25,8 @@ struct PowerModePopover: View { action: { powerModeManager.setActiveConfiguration(powerModeManager.defaultConfig) selectedConfig = powerModeManager.defaultConfig + // Apply configuration immediately + applySelectedConfiguration() } ) @@ -36,6 +38,8 @@ struct PowerModePopover: View { action: { powerModeManager.setActiveConfiguration(config) selectedConfig = config + // Apply configuration immediately + applySelectedConfiguration() } ) } @@ -53,6 +57,15 @@ struct PowerModePopover: View { selectedConfig = powerModeManager.activeConfiguration } } + + // Helper function to apply the selected configuration + private func applySelectedConfiguration() { + Task { + if let config = selectedConfig { + await ActiveWindowService.shared.applyConfiguration(config) + } + } + } } // Row view for each power mode in the popover diff --git a/VoiceInk/Whisper/WhisperState+ModelManager.swift b/VoiceInk/Whisper/WhisperState+ModelManager.swift index 65864d5..5408972 100644 --- a/VoiceInk/Whisper/WhisperState+ModelManager.swift +++ b/VoiceInk/Whisper/WhisperState+ModelManager.swift @@ -293,7 +293,7 @@ extension WhisperState { // MARK: - Resource Management func cleanupModelResources() async { - try? await Task.sleep(nanoseconds: 500_000_000) + try? await Task.sleep(nanoseconds: 300_000_000) await whisperContext?.releaseResources() whisperContext = nil