diff --git a/openless-all/app/crates/openless-core/src/provider_resolution.rs b/openless-all/app/crates/openless-core/src/provider_resolution.rs index 53bea1e29..18705908c 100644 --- a/openless-all/app/crates/openless-core/src/provider_resolution.rs +++ b/openless-all/app/crates/openless-core/src/provider_resolution.rs @@ -79,3 +79,65 @@ pub(crate) async fn resolve_session_provider( keep_loaded_secs: None, }) } + +#[cfg(test)] +mod tests { + use super::*; + use crate::credentials::{ChannelMutation, CredentialDirectory, InMemoryCredentialStore}; + + #[tokio::test] + async fn reordered_asr_channel_wins_over_stale_preference() { + let store = Arc::new(InMemoryCredentialStore::default()); + let directory = CredentialDirectory::new(store.clone()); + for provider_type in ["foundry-local-whisper", "volcengine", "volcengine"] { + directory + .mutate_channel(ChannelMutation::Create { + kind: ChannelKind::Asr, + provider_type: provider_type.into(), + name: provider_type.into(), + }) + .await + .unwrap(); + } + directory + .mutate_channel(ChannelMutation::Reorder { + kind: ChannelKind::Asr, + ids: vec![ + "volcengine-2".into(), + "volcengine".into(), + "foundry-local-whisper".into(), + ], + }) + .await + .unwrap(); + assert_eq!( + directory.active_provider(ProviderSlot::Asr).await.unwrap(), + "volcengine-2" + ); + + let credential_store: Arc = store; + for stale_preference in ["foundry-local-whisper", "volcengine"] { + let resolved = resolve_session_provider( + &credential_store, + ProviderSlot::Asr, + stale_preference, + ) + .await + .unwrap(); + assert_eq!(resolved.provider_id, "volcengine-2"); + assert_eq!(resolved.provider_type, "volcengine"); + } + } + + #[tokio::test] + async fn empty_asr_selection_uses_legacy_preference_fallback() { + let credential_store: Arc = + Arc::new(InMemoryCredentialStore::default()); + let resolved = + resolve_session_provider(&credential_store, ProviderSlot::Asr, "volcengine") + .await + .unwrap(); + assert_eq!(resolved.provider_id, "volcengine"); + assert_eq!(resolved.provider_type, "volcengine"); + } +} diff --git a/openless-all/app/src-tauri/src/lib.rs b/openless-all/app/src-tauri/src/lib.rs index 36487b9e1..2c56a69f0 100644 --- a/openless-all/app/src-tauri/src/lib.rs +++ b/openless-all/app/src-tauri/src/lib.rs @@ -633,7 +633,7 @@ fn run_desktop() { #[cfg(not(target_os = "windows"))] let coordinator = Arc::new(coordinator::Coordinator::new()); let core_backend = coordinator.backend(); - // Runtime effects and active-provider mirroring follow Core startup/recovery + // Runtime effects follow Core startup/recovery // in tauri_events::start; pending restore must not mutate the old vault here. let builder = tauri::Builder::default(); // macOS:胶囊要叠到别的 app 的全屏 Space 之上,必须是「非激活 NSPanel」(普通 diff --git a/openless-all/app/src-tauri/src/tauri_events.rs b/openless-all/app/src-tauri/src/tauri_events.rs index a4352035b..10d437da3 100644 --- a/openless-all/app/src-tauri/src/tauri_events.rs +++ b/openless-all/app/src-tauri/src/tauri_events.rs @@ -64,13 +64,6 @@ pub fn start(app: AppHandle, backend: Arc) { return; } let preferences = backend.get_preferences(); - if !preferences.active_asr_provider.is_empty() { - if let Err(error) = - crate::commands::sync_active_asr_provider_to_vault(&preferences.active_asr_provider) - { - log::warn!("[startup] active ASR provider mirror failed: {error}"); - } - } #[cfg(target_os = "windows")] { let target = openless_core::WindowsKeyboardRuntimeTarget::from(&preferences);