@@ -794,7 +794,10 @@ async fn end_session(inner: &Arc<Inner>) -> Result<(), String> {
794794 }
795795 } ;
796796 if !proceed_to_insert {
797- log:: info!( "[coord] cancel detected before insert — discarding output (chars={})" , polished. chars( ) . count( ) ) ;
797+ log:: info!(
798+ "[coord] cancel detected before insert — discarding output (chars={})" ,
799+ polished. chars( ) . count( )
800+ ) ;
798801 return Ok ( ( ) ) ;
799802 }
800803
@@ -916,6 +919,15 @@ fn hotkey_injection_dry_run_enabled() -> bool {
916919fn ensure_microphone_permission ( inner : & Arc < Inner > ) -> Result < ( ) , String > {
917920 use crate :: permissions:: { self , PermissionStatus } ;
918921
922+ #[ cfg( target_os = "windows" ) ]
923+ {
924+ let _ = inner;
925+ if permissions:: windows_microphone_access_explicitly_denied ( ) {
926+ return Err ( "需要麦克风权限,当前状态: Denied" . to_string ( ) ) ;
927+ }
928+ return Ok ( ( ) ) ;
929+ }
930+
919931 let status = permissions:: check_microphone ( ) ;
920932 if matches ! (
921933 status,
@@ -1144,6 +1156,35 @@ mod tests {
11441156 assert_eq ! ( state. phase, SessionPhase :: Starting ) ;
11451157 assert ! ( state. pending_stop) ;
11461158 }
1159+
1160+ #[ tokio:: test]
1161+ async fn repeated_pressed_edge_during_hold_session_does_not_restart ( ) {
1162+ let coordinator = Coordinator :: new ( ) ;
1163+ coordinator
1164+ . inner
1165+ . prefs
1166+ . set ( crate :: types:: UserPreferences {
1167+ hotkey : crate :: types:: HotkeyBinding {
1168+ trigger : HotkeyTrigger :: RightControl ,
1169+ mode : HotkeyMode :: Hold ,
1170+ } ,
1171+ ..Default :: default ( )
1172+ } )
1173+ . unwrap ( ) ;
1174+ coordinator. inner . state . lock ( ) . phase = SessionPhase :: Listening ;
1175+ coordinator
1176+ . inner
1177+ . hotkey_trigger_held
1178+ . store ( true , Ordering :: SeqCst ) ;
1179+
1180+ handle_pressed_edge ( & coordinator. inner ) . await ;
1181+
1182+ assert_eq ! (
1183+ coordinator. inner. state. lock( ) . phase,
1184+ SessionPhase :: Listening
1185+ ) ;
1186+ assert ! ( coordinator. inner. hotkey_trigger_held. load( Ordering :: SeqCst ) ) ;
1187+ }
11471188}
11481189
11491190fn enabled_phrases ( inner : & Arc < Inner > ) -> Vec < String > {
0 commit comments