
    Oj!                       d Z ddlmZ ddlZddlZddlZddddZd5d	Zd6d
Zd7d8dZ	i ddddddddddddddddddddddddddd dd!dd"dd#d$d$d$d%Z
d9d&Zd'Z ej                  d(e d)ej                        Z ej                  d(e d*ej                        Z ej                  d(e d+ej                        Z ej                  d(e d,e d-ej                        Z ej                  d(e d.ej                        Z ej                  d(e d/ej                        Z ej                  d(e d0ej                        Z ej                  d1ej                        Zd:d2Zd;d3Zd<d4Zy)=u^  Reflexes — instant local handling for trivial commands.

"Volume up", "pause the music", "open Discord" should feel like a light
switch, not a conversation: no LLM round-trip, no thinking pause. The engine
calls try_reflex() with each final transcript BEFORE sending it to the brain;
a match executes immediately (media keys / Start-menu launch) and returns a
short spoken confirmation. No match returns None and the utterance flows to
Claude as usual.

Deliberately conservative: only short, simple, unambiguous phrasings match
(no "and"/"then"/questions) — anything with nuance belongs to the brain.
    )annotationsN         )	playpause	nexttrack	prevtrackcodec                N     dd l ddlm d fd} |d        |d       y )Nr   )NSEventc                    | rdnd}dz  |z  }j                  dd|ddd d|d	      }j                  j                  |j                                y )	Ni 
  i   r      )r   r   r      )]otherEventWithType_location_modifierFlags_timestamp_windowNumber_context_subtype_data1_data2_CGEventPostkCGHIDEventTapCGEvent)downflagsdata1evr   Quartzr
   s       :/Users/ahmed/devFolder/Ultron/claude-voice/voice/reflex.py_postz_mac_media_key.<locals>._post   s^    5u$kkfeQ4E2? 	 	600"**,?    TF)r   boolreturnNone)r   AppKitr   )r
   r   r   r   s   ` @@r   _mac_media_keyr!      s    @ 
$K	%Lr   c                :    t        j                  dd| gdd       y )N	osascriptz-eTr   capture_outputtimeout)
subprocessrun)scripts    r   _osar*   *   s    NNKv.tQOr   c                <   t         j                  dk(  rd| dk(  rt        dd|z   d       y | dk(  rt        dd|z   d       y | dk(  rt        d	       y t        |      D ]  }t	        t
        |            y d
d l}t        |      D ]  }|j                  |         y )NdarwinvolumeupzEset volume output volume ((output volume of (get volume settings)) +    )
volumedownzEset volume output volume ((output volume of (get volume settings)) - 
volumemutezEset volume output muted (not (output muted of (get volume settings)))r   )sysplatformr*   ranger!   _NX	pyautoguipress)keytimes_r6   s       r   _pressr;   .   s    
||x* @@AE	{!M N 	 L  @@AE	{!M N 	 L  A B
 	 5\s3x( "5\ r   chromezGoogle Chromezgoogle chromevscodezVisual Studio Codezvs codezvisual studioteamszMicrosoft TeamswordzMicrosoft WordexcelzMicrosoft Excel
powerpointzMicrosoft PowerPointoutlookzMicrosoft OutlooksettingszSystem Settingszsystem settingspreferencesbrowserzthe browserzfile explorerFinder)filesexplorerc                   t         j                  dk7  rddlm}  ||       S | j	                         j                  d      }t        j                  t        j                  |j                               ||j                         g      D ]5  }|st        j                  dd|gdd	      }|j                  dk(  s1d|fc S  d
| fS )z8Open an app by spoken name. Returns (ok, resolved_name).r,   r   )shell_launchz.!?openz-aTr   r$   F)r2   r3   voice.desktop_controlrJ   striprstripdictfromkeys_MAC_APP_ALIASESgetlowertitler'   r(   
returncode)namerJ   ncandrs        r   _launchrZ   P   s    
||x6D!!

E"A!!!''),a;=NNFD$/*.;<<1:= $;r   z7(?:please\s+|jarvis[,\s]+|can\s+you\s+|could\s+you\s+)?^zn(?:turn\s+(?:the\s+)?volume\s+up|volume\s+up|raise\s+(?:the\s+)?volume|louder|turn\s+it\s+up)(?P<mod>.{0,12})$zu(?:turn\s+(?:the\s+)?volume\s+down|volume\s+down|lower\s+(?:the\s+)?volume|quieter|turn\s+it\s+down)(?P<mod>.{0,12})$zB(?:mute|unmute)\s+(?:the\s+)?(?:sound|audio|volume|music|pc)[.!]?$zU(?:pause|stop|resume|play|unpause)\s+(?:the\s+)?(?:music|song|media|playback)[.!]?$|^z(?:pause|resume)[.!]?$z:(?:next|skip)(?:\s+(?:the\s+)?(?:song|track|music))?[.!]?$z((?:previous|last)\s+(?:song|track)[.!]?$z7(?:open|launch|start)\s+(?P<app>[\w .&'+-]{2,32})[.!]?$zX\b(and|then|after|before|search|find|go\s+to|type|click|tell|send|message|play\s+some)\bc                `    | xs dj                         }d|v sd|v sd|v ryd|v sd|v sd|v ry	y
)N lotwaymax
   bitlittleslight      )rS   )modms     r   
_vol_timesri      sC    	AzUaZ5A:zX]h!mr   c                x   ddl m}m} | dk(  rt        dd ||      z         y| dk(  rt        dd ||      z         y	| d
v rt        d       y| dk(  rt        d       y| dk(  rt        d       y| dk(  rt        d       y| dk(  rt        d       y| dk(  r# ||      }|syt	        |      \  }}|rd| dS dS y)z?Execute a classified intent. Returns the confirmation to speak.r   )app_name
multiplier	volume_upr-   re   Volume up, sir.volume_downr0   Volume down, sir.)
mute_soundunmute_soundr1   
Done, sir.pause_mediar   zPaused, sir.resume_mediazPlaying, sir.
next_trackr   Next track, sir.
prev_trackr	   Going back, sir.open_appNOpening , sir.)voice.intentrk   rl   r;   rZ   )intenttextrk   rl   rV   okmatcheds          r   _run_intentr      s    1z1z$//0 |QD!112"//|{{{!{!~dmG-/'&)9T9r   c                   | xs dj                         }|syt        j                  |      ry	 ddlm}  |       }|:|j                  |      \  }}|#t        ||      }|t        d| d|dd       |S y	 t        |j                               d	kD  ry	 t        j                  |      }|rMt        j                  |j                  d
      xs d      s%t        dt        |j                  d
                   yt         j                  |      }|rMt        j                  |j                  d
      xs d      s%t        dt        |j                  d
                   yt"        j                  |      rt        d       yt$        j                  |      rt        d       yt&        j                  |      rt        d       yt(        j                  |      rt        d       yt*        j                  |      }|r4t-        |j                  d      j                               \  }}	|rd|	 dS y	 y# t        $ r Y w xY w# t        $ r Y yw xY w)uo  Execute a trivial command instantly. Returns the spoken confirmation,
    or None when the utterance isn't a reflex (send it to the brain).

    Primary path: the SEMANTIC intent router (voice/intent.py) — matches
    meaning ("I can't hear this" -> volume_up) and stands down when unsure.
    The regexes below are only the fallback when model2vec is missing.
    r]   Nr   )
get_routerz       [reflex: z (z.2fz)]   rg   r-   rn   r0   rp   r1   rs   r   r   rw   r	   ry   appr{   r|   )rM   _COMPLEXsearchr}   r   classifyr   print	Exceptionlensplit_VOL_UPmatchgroupr;   ri   	_VOL_DOWN	_VOL_MUTE_MEDIA_PAUSE_MEDIA_NEXT_MEDIA_PREV_OPENrZ   )
r   tr   routerr~   scoreoutrh   r   r   s
             r   
try_reflexr      s    
Aq+"OOA.MFE!!&!,?,VHBuSkDEJ  1779~MM!X__QWWU^%9r::z!''%.9:$OOAX__QWWU^%9r:<AGGEN!;<&??1< a ;Q;%Q;%KKN!!''%."6"6"89KB!'&11	  E  @  sK   AH0 A#I  ;A#I   I    I  ! I   I  #A	I  0	H=<H= 	II)r
   intr   r   )r)   strr   r   )   )r8   r   r9   r   r   r   )rV   r   r   ztuple[bool, str])rg   r   r   r   )r~   r   r   r   r   
str | None)r   r   r   r   )__doc__
__future__r   rer'   r2   r5   r!   r*   r;   rQ   rZ   _FILLERcompileIr   r   r   r   r   r   r   r   ri   r   r    r   r   <module>r      sv   # 	  

 Rb9 P*
o
.
"
$-/C
  
 #23G
 	
 !'(8	

 

 !-.D
 "
 %/0A
 (
 +89J
 
 !.
 X
 )1h
 $ E
"**	  TT# BJJ	  TT#	 BJJ	  	 rzz	 --4I5KMDD
 bjj	KLDD
 bjj	9:BDDB

	JKDD	

 2:: @ACGB;r   