+
    lHàjBž  ã                  óH  a € 0 t $ R t^ RIHt ^ RIt^ RIt^RIHtHt ]! 4       t	]	P                  t
]P                  ! 4       tRsR]R&   RsR]R&   RsR]R	&   RsR]R
&   ^ sR tR’R R lltR R ltR R ltR R ltR R ltR R ltR R ltR tR R ltR R ltR R  ltR! R" ltR# R$ lt R% R& lt!]P                  ! 4       t"Rs#R']R(&   R) R* lt$R“R+ R, llt%]P                  ! 4       t&R-s'](! 4       t)R.]R/&   R0 R1 lt*R2 R3 lt+R4 R5 lt,R6 R7 lt-R8 R9 lt.R: R; lt/R< R= lt0R> R? lt1R@ RA lt2RB t3RC RD lt4]P                  ! 4       t5Rs6R]RE&   Rs7RF t8RG RH lt9RI RJ lt:]P                  ! 4       t;R-s<RKRLRMRN/RO RP llt=RQ RR lt>RS RT lt?RU RV lt@RW RX ltARY RZ ltB]
! R[4      R\ R] l4       tC]
! R^4      R_ R` l4       tC]
! Ra4      Rb Rc l4       tC]
! Rd4      Re Rf l4       tC]
! Rg4      Rh Ri l4       tC]
! Rj4      Rk Rl l4       tC]
! Rm4      Rn Ro l4       tC]
! Rp4      Rq Rr l4       tC]
! Rs4      Rt Ru l4       tCRv Rw ltDRx Ry ltERz R{ ltFR| R} ltGR~]DR]ER€]ER�]G/tH]
! R‚4      Rƒ R„ l4       tCR… R† ltIR‡ tJRˆ tKR‰ tL]
! RŠ4      R‹ RŒ l4       tC]
! R�4      RŽ R� l4       tCR� R‘ ltMR# )”z¾Voice / TTS / wake-word JSON-RPC handlers and their process-global state (one mic, one speaker
per process). Bodies are rebound onto server.py's globals (method_ctx.bind_module), used bare.
)ÚannotationsN)ÚHandlerRegistryÚbind_moduleÚ ÚstrÚ_voice_event_sidzOptional[Transport]Ú_voice_wake_ownerÚ_voice_event_transportÚ_voice_capture_sidc                 ó2   € \        4       ;'       g    \        # ©N)Úcurrent_transportÚ_stdio_transport© ó    Ú>/home/ubuntu/.hermes/hermes-agent/tui_gateway/methods_voice.pyÚ_caller_transportr      s   € ÜÓ×2Ð2Ô"2Ð2r   c               ó$   € V ^8„  d   QhRRRRRR/# )é   Úeventr   Úpayloadzdict | NoneÚreturnÚNoner   )Úformats   "r   Ú__annotate__r   #   s!   € ÷ 	#ñ 	#�sð 	# [ð 	#¸Dñ 	#r   c                óú   € \         ;_uu_ 4        \        \        r2RRR4       Xe   \        V4      MRp \	        V XV4       Ve   \        V4       R# R#   + '       g   i     LB; i  Te   \        T4       i i ; i)zXEmit toward the session that most recently turned voice on (empty sid = active session).N)Ú_voice_sid_lockr   r	   Úbind_transportÚ_emitÚreset_transport)r   r   ÚsidÚ	transportÚtokens   &&   r   Ú_voice_emitr#   #   sg   € ç	ŽÜ)Ô+AˆY÷ 
à)2Ò)>ŒN˜9Ô%ÀD€Eð#Üˆe�S˜'Ô"àÒÜ˜EÖ"ñ ÷ 
�ûð ÒÜ˜EÕ"ð ús   �AµA( ÁA%	Á(A:c               ó   € V ^8„  d   QhRR/# ©r   r   r   r   )r   s   "r   r   r   /   s   € ÷ %ñ %˜Dñ %r   c                 óŽ   € \         ;_uu_ 4        \        R up sR R R 4       X e   \        V 4       R # R #   + '       g   i     L#; ir   )r   r   Ú_wake_resume_if_owner©Úowners    r   Ú_resume_voice_waker*   /   s4   € ç	ŽÜ#4°dÐ ˆÐ ÷ 
àÒÜ˜eÖ$ñ ÷ 
�ús	   �
4´A	c               ó   € V ^8„  d   QhRR/# ©r   r   Úboolr   )r   s   "r   r   r   7   s   € ÷ =ñ =˜Tñ =r   c                 ód   € \         P                  P                  R R4      P                  4       R8H  # )ÚHERMES_VOICEr   Ú1©ÚosÚenvironÚgetÚstripr   r   r   Ú_voice_mode_enabledr6   7   s%   € Ü�:‰:�>‰>˜.¨"Ó-×3Ñ3Ó5¸Ñ<Ð<r   c               ó   € V ^8„  d   QhRR/# r,   r   )r   s   "r   r   r   ;   s   € ÷ ;ñ ;¨$ñ ;r   c                óf   €  ^ RI Hp V! V 4      pVf   \        4       # T#   \         d    Rp Li ; i)z²Push-to-talk gate: a shared-owner local session's own gateway ``/voice`` mode (what Ink's
``/voice on`` sets through slash.exec, T9); the sidecar's env flag for its own sessions.)Úlocal_voice_enabledN)Úgateway.session_configr9   ÚImportErrorr6   )Ú
session_idr9   Úhelds   &  r   Ú_session_voice_enabledr>   ;   s?   € ðÝ>Ù" :Ó.ˆð %)¢LÔÓ Ð:°dÐ:øô ô ØŠðús   ‚   0¯0c               ó   € V ^8„  d   QhRR/# r,   r   )r   s   "r   r   r   F   s   € ÷ ñ ¨$ñ r   c                óJ   €  ^ RI Hp V! V R4      RJ #   \         d     R# i ; i)z¤Turn a shared-owner session's own voice mode off (spoken stop, no-speech limit); False when
no owner in this process holds it (the sidecar's env flag is the state).)Úset_local_voice_modeÚoffTF)r:   rA   r;   )r<   rA   s   & r   Ú_set_session_voice_offrC   F   s.   € ðÝ?Ù# J°Ó6¸$Ð>Ð>øÜô Úðús   ‚ “"¡"c               ó   € V ^8„  d   QhRR/# r%   r   )r   s   "r   r   r   P   s   € ÷ 
ñ 
¨tñ 
r   c                óZ  € \         ;_uu_ 4        V '       d   V \        8w  d    RRR4       R# \        ^,          sRRR4       \        P                  ! \
        4      ;_uu_ 4        ^ RIHp V! 4        RRR4       \        4        R#   + '       g   i     LT; i  + '       g   i     L/; i)zYEnd *session_id*'s live capture (not another session's) and drop its late text callbacks.N©Ústop_continuous)	r   r
   Ú_voice_capture_genÚ
contextlibÚsuppressÚ	ExceptionÚhermes_cli.voicerG   r*   )r<   rG   s   & r   Ú_stop_session_voice_capturerM   P   sj   € ÷ 
Žß˜ZÔ+=Ô=Ø÷ 
‰ô 	˜aÕÐ÷ 
ô 
×	Ò	œY×	'Õ	'Ý4ÙÔ÷ 
(ô Ö÷ 
�ú÷ 
(×	'ús   �B®BÁ%BÂB	ÂB*	c               ó   € V ^8„  d   QhRR/# r,   r   )r   s   "r   r   r   ]   s   € ÷ (ñ (�tñ (r   c                 óT   €  ^ RI Hp  \        T ! 4       4      #   \         d     R# i ; i)é    ©Úis_continuous_activeF)rL   rR   r;   r-   rQ   s    r   Ú_capture_liverS   ]   s/   € ðÝ9ô Ñ$Ó&Ó'Ð'øô ô Úðús   ‚ ˜'¦'c                óx   a a€ \         ;_uu_ 4        \        oRRR4       V V3R lpV#   + '       g   i     L; i)zX*fn* while the capture it was registered for is still current; a no-op once invalidated.Nc                 óŽ   <€ \         ;_uu_ 4        S\        8H  pR R R 4       X'       d	   S! V !   R # R #   + '       g   i     L"; ir   ©r   rH   )ÚargsÚcurrentÚfnÚgens   * €€r   ÚcallÚ%_voice_capture_callback.<locals>.callj   s/   ø€ ßŽ_ØÔ/Ñ/ˆG÷ çÙ�ŒIñ ÷ �_ús	   �
4´A	rV   )rY   r[   rZ   s   f @r   Ú_voice_capture_callbackr]   e   s&   ù€ ç	ŽÜ ˆ÷ 
öð
 €K÷ 
�ús   ‘)©9	c               ó   € V ^8„  d   QhRR/# r,   r   )r   s   "r   r   r   r   s   € ÷ Añ A˜Dñ Ar   c                 ód   € \         P                  P                  R R4      P                  4       R8H  # )ÚHERMES_VOICE_TTSr   r0   r1   r   r   r   Ú_voice_tts_enabledra   r   s&   € Ü�:‰:�>‰>Ð,¨bÓ1×7Ñ7Ó9¸SÑ@Ð@r   c               ó$   € V ^8„  d   QhRRRRRR/# ©r   Ú	stop_loopr-   Ústop_ttsr   r   r   )r   s   "r   r   r   v   s!   € ÷ 	/ñ 	/ $ð 	/°$ð 	/¸4ñ 	/r   c                ó¢  € R;\         P                  R&   \         P                  R&   V '       d9   \        P                  ! \        4      ;_uu_ 4        ^ RIHp V! 4        RRR4       V'       d:   \        P                  ! \        4      ;_uu_ 4        \        RR7       RRR4       R# R#   + '       g   i     LS; i  + '       g   i     R# ; i)zWFlip voice + TTS off; optionally halt the continuous loop / cut live TTS (best-effort).Ú0r/   r`   rF   NF©Ú
user_barge)r2   r3   rI   rJ   rK   rL   rG   Ú_tts_stream_stop)rd   re   rG   s   $$ r   Ú_end_voice_chatrk   v   s�   € àBEÐE„B‡J�Jˆ~Ñ¤§¡Ð,>Ñ!?ßÜ× Ò ¤×+Õ+Ý8ÙÔ÷ ,÷ Ü× Ò ¤×+Õ+Ü¨Õ.÷ ,Ñ+ñ ÷ ,×+ú÷ ,×+Ð+ús   ÁB*ÂB=Â*B:	Â=C	c               ó$   € V ^8„  d   QhRRRRRR/# rc   r   )r   s   "r   r   r   ‚   s!   € ÷ /ñ /°dð /Àdð /Ètñ /r   c               óî   € \        V 4      '       g   \        WR7       R# V'       d:   \        P                  ! \        4      ;_uu_ 4        \        RR7       RRR4       R# R#   + '       g   i     R# ; i)zµA stop phrase (spoken, typed or full-duplex) ends *session_id*'s voice chat: a shared-owner
session through its own mode (which ends only its capture); else the sidecar's env flags.©rd   re   Frh   N)rC   rk   rI   rJ   rK   rj   )r<   rd   re   s   &$$r   Ú_end_session_voice_chatro   ‚   sJ   € ô " *×-Ò-Ü )×?ß	Ü× Ò ¤×+Õ+Ü¨Õ.÷ ,Ñ+ñ 
ß+×+Ð+ús   Á
A#Á#A4	c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úleaser   Úactiver-   r   r   r   )r   s   "r   r   r   Œ   s&   € ÷ 	Rñ 	R˜Cð 	R¨ð 	R°$ñ 	Rr   c                ól   a a€ VV 3R lp\         P                  ! VRS  2RR7      P                  4        R# )z€Acquire/release a TTS lease off the RPC thread (acquiring warms a local engine; must not
block the toggle's reply). Best-effort.c                 ó    <€  ^ RI Hp Hp S'       d   T MT! S4       R#   \         d$   p\        P                  RSST4        Rp?R# Rp?ii ; i)rP   )Úacquire_tts_leaseÚrelease_tts_leasez(voice: tts lease %s active=%s failed: %sN)Útools.tts_tool_lifecycleru   rv   rK   ÚloggerÚdebug)ru   rv   Úerr   rq   s      €€r   Ú_runÚ_tts_lease_async.<locals>._run�   sF   ø€ ð	WßUß"(ÑÐ.?Ð?ÀÖGøÜô 	WÜ�L‰LÐCÀUÈFÐTU×VÒVûð	Wús   ƒ “
 ŸAªAÁAz
tts-lease-T)ÚtargetÚnameÚdaemonN)Ú	threadingÚThreadÚstart)rq   rr   r{   s   ff r   Ú_tts_lease_asyncrƒ   Œ   s-   ù€ öWô ×Ò˜D¨°E°7Ð';ÀDÔI×OÑOÖQr   c               ó   € V ^8„  d   QhRR/# )r   r   Úlistr   )r   s   "r   r   r   ˜   s   € ÷ Cñ C˜4ñ Cr   c                 óÞ   € \         ;_uu_ 4        \        P                  4        U u. uF  q P                  R 4      '       g   K  V NK  	  up uuRRR4       # u up i   + '       g   i     R# ; i)ÚrunningN)Ú_sessions_lockÚ	_sessionsÚvaluesr4   )Úss    r   Ú_running_sessionsrŒ   ˜   sC   € ß	ŽÜ$×+Ñ+Ô-ÓBÑ-�a·±°y×1A—�Ñ-ÑB÷ 
ŠùÚB÷ 
�ˆús"   �A¦AÁAÁ	AÁAÁA,	c               ó   € V ^8„  d   QhRR/# r,   r   )r   s   "r   r   r   �   s   € ÷ ñ ˜dñ r   c                 óN   €  \        \        4       4      #   \         d     R# i ; i)z\Voice busy-probe: silent captures during a long turn don't count toward the no-speech limit.F)r-   rŒ   rK   r   r   r   Ú_any_session_runningr�   �   s(   € ðÜÔ%Ó'Ó(Ð(øÜô Úðús   ‚ •$£$zOptional[dict]Ú_tts_stream_statec               ó   € V ^8„  d   QhRR/# )r   r   zOptional[queue.Queue]r   )r   s   "r   r   r   ¬   s   € ÷ ñ Ð0ñ r   c                 óÚ  € \        4       '       g   R#  ^ RIHp  ^ RIHp V ! 4       '       g   R#  \        4        \        P                  4       p\        P                  ! 4       \        P                  ! 4       rC\        P                  ! YY43RR7      P                  4        \        ;_uu_ 4        RTRT/sRRR4       \        4        T#   \
         d     R# i ; i  + '       g   i     L.; i)zDStart a per-turn streaming TTS consumer; None when TTS can't stream.N)Úcheck_tts_requirements)Ústream_tts_to_speakerT©r}   rW   r   ÚstopÚdone)ra   Útools.tts_toolr“   Útools.tts_tool_speakerr”   rK   rj   ÚqueueÚQueuer€   ÚEventr�   r‚   Ú_tts_stream_lockr�   Ú_arm_barge_listener_if_enabled)r“   r”   Ú
text_queuer–   r—   s        r   Ú_tts_stream_beginr    ¬   sµ   € ä×ÒÙðÝ9Ý@Ù%×'Ò'Ùð (ô ÔÜ#Ÿk™k›m€JÜ—’Ó"¤I§O¢OÓ$5ˆ$Ü×ÒÐ1ÀTÐ8PÐY]Ô^×dÑdÔfç	Ö	Ø# T¨6°4Ð8Ð÷ 
ä"Ô$ØÐøô ô Úðú÷ 
×	ús   ”C Â-CÃCÃCÃC*	c               ó    € V ^8„  d   QhRRRR/# )r   ri   r-   r   r   r   )r   s   "r   r   r   Â   s   € ÷ ñ  ð °ñ r   c                ó  € \         ;_uu_ 4        \        RupsRRR4       Xf   R# V '       db   VR,          P                  4       '       gE   ^ RIp^ RIHp \        P                  RRP                  VP                  4       4      4       V! 4        TR,          P                  4        \        P                  ! \        4      ;_uu_ 4        ^ RIHp V! 4        RRR4       R#   + '       g   i     LÐ; i  + '       g   i     R# ; i)z‹Cut in-flight streaming TTS. *user_barge* latches the interruption for the next turn's
model note; ``False`` for mode changes (/voice off).Nr—   ©Úmark_speech_interruptedu]   TTS CUT: _tts_stream_stop(user_barge=True) â€” new turn or interrupt cutting in-flight TTS
%sr   r–   ©Ústop_playback)r�   r�   Úis_setÚ	tracebackÚtools.tts_streamingr¤   rx   ry   ÚjoinÚformat_stackÚsetrI   rJ   rK   Útools.voice_moder¦   )ri   Ústater¨   r¤   r¦   s   &    r   rj   rj   Â   s²   € ÷ 
Ö	Ü#4°dÐ ˆÐ ÷ 
à‚}Ùß˜% �-×.Ñ.×0Ò0ÛÝ?Ü�‰ð ;Ø<>¿G¹GÀI×DZÑDZÓD\Ó<]ô	_áÔ!Ø	ˆ&…M×ÑÔÜ	×	Ò	œY×	'Õ	'Ý2ÙŒ÷ 
(Ñ	'÷ 
×	ú÷ 
(×	'Ð	'ús   �
C!Ã	C4Ã!C1	Ã4D	Fz,set[tuple[threading.Event, threading.Event]]Ú_fd_speak_pipelinesc               ó   € V ^8„  d   QhRR/# r%   r   )r   s   "r   r   r   á   s   € ÷ bñ b 4ñ br   c                 óâ   € \         ;_uu_ 4        \        '       d    RRR4       R# RsRRR4       \        P                  ! \        RRR7      P                  4        R#   + '       g   i     L=; i)uE   Arm the process-global full-duplex listener (idempotent â€” one mic).NTzvoice-full-duplex©r}   r   r~   )Ú_fd_listener_lockÚ_fd_listener_activer€   r�   Ú_full_duplex_listenerr‚   r   r   r   Ú_arm_full_duplex_listenerr¶   á   sP   € ÷ 
Ö	ßÓØ÷ 
Ñ	ð #Ð÷ 
ô ×ÒÔ1¸$ÐEXÔY×_Ñ_Öa÷	 
×	ús   �A§AÁA.	c               ó   € V ^8„  d   QhRR/# r%   r   )r   s   "r   r   r   ë   s   € ÷ $ñ $¨ñ $r   c                 ó‚   € \        4       '       d/   \        4       P                  RR4      '       d   \        4        R# R# R# )zMArm the listener when voice mode is on and ``voice.barge_in`` isn't disabled.Úbarge_inTN)r6   Ú_voice_cfg_dictr4   r¶   r   r   r   rž   rž   ë   s/   € ä×Ò¤Ó!2×!6Ñ!6°zÀ4×!HÒ!HÜ!Ö#ñ "IÑr   c               ó   € V ^8„  d   QhRR/# r,   r   )r   s   "r   r   r   ñ   s   € ÷ 6ñ 6˜ñ 6r   c            	     óˆ  € \         ;_uu_ 4        \        p RRR4       \        ;_uu_ 4        X e   V R,          .M. \         UUu. uF  w  rVNK	  	  upp,           pRRR4       \        ;QJ d    R X 4       F  '       g   K   R# 	  R# ! R X 4       4      #   + '       g   i     LŠ; iu uppi   + '       g   i     L]; i)zHTrue while any TTS (streaming pipeline or fallback speak) is unfinished.Nr—   c              3  óJ   "  € T F  qP                  4       '       * x € K  	  R # 5ir   )r§   )Ú.0r—   s   & r   Ú	<genexpr>Ú"_fd_tts_pending.<locals>.<genexpr>÷   s   é € Ð5©W T—;‘;“=× Ñ «Wùs   ‚!#TF)r�   r�   r³   r¯   Úany)r®   Ú_stopr—   Úpendings       r   Ú_fd_tts_pendingrÄ   ñ   s‰   € ç	Ö	Ü!ˆ÷ 
ç	Ö	Ø&+Ò&7�E˜&•M‘?¸RÕ\oÔCpÑ\oÉ[ÈUÃDÑ\oÒCpÕpˆ÷ 
ç‹3Ñ5©WÓ5�3Œ3Ð5Š3Ð5ˆ3Ñ5©WÓ5Ó5Ð5÷	 
×	üó Dq÷ 
×	ús(   �B¬B1ÁB+Á
B1ÂB(	Â+B1Â1C	c               ó   € V ^8„  d   QhRR/# r%   r   )r   s   "r   r   r   ú   s   € ÷  (ñ  (˜tñ  (r   c            	     ó¬  a	a
€  ^ RI Hp Ho	Hp R V	3R llp\        P
                  ! 4       o
R V
3R llp\        \        4       4      w  rET ! TS	Y4;'       g    RVR7      pV'       d   S
P                  4       '       g    \        ;_uu_ 4        Rs
RRR4       R#  V! V4      pVP                  R	4      '       dP   VP                  R
4      ;'       g    RP                  4       '       d!   \        VR
,          P                  4       4       \        P                  ! \         4      ;_uu_ 4        \"        P%                  V4       RRR4       \        ;_uu_ 4        Rs
RRR4       R#   + '       g   i     R# ; i  + '       g   i     L?; i  \        P                  ! \         4      ;_uu_ 4        \"        P%                  T4       RRR4       i   + '       g   i     i ; i; i  \&         d!   p\(        P+                  RT4        Rp?LÀRp?ii ; i  + '       g   i     R# ; i  \        ;_uu_ 4        Rs
RRR4       i   + '       g   i     i ; i; i)z\Mic live from utterance-submit to turn-complete; a trip transcribes -> ``voice.transcript``.)Úfull_duplex_listenÚis_audio_output_activeÚtranscribe_recordingc               ó   € V ^8„  d   QhRR/# r,   r   )r   s   "r   r   Ú+_full_duplex_listener.<locals>.__annotate__  s   € ÷ 	Yñ 	Y˜dñ 	Yr   c                 ó’   <€ \        4       '       * ;'       g1    \        4       ;'       g    \        4       ;'       g    S ! 4       '       * # r   )r6   r�   rÄ   )rÈ   s   €r   Ú_should_stopÚ+_full_duplex_listener.<locals>._should_stop  sA   ø€ Ü*Ó,Ô,÷ Yð YÜ$Ó&×WÐW¬/Ó*;×WÐWÑ?UÓ?Wô1Yð Yr   c               ó    € V ^8„  d   QhRRRR/# ©r   Úphaser   r   r   r   )r   s   "r   r   rË     s   € ÷ 	ñ 	˜sð 	 tñ 	r   c                ó>   <€ SP                  4        \        V 4       R # r   )r¬   Ú_fd_trip)rÑ   Útrippeds   &€r   Ú_on_triggerÚ*_full_duplex_listener.<locals>._on_trigger  s   ø€ Ø�K‰KŒMÜ�UŽOr   N)Ú
is_playingÚ
on_triggerÚ
multiplierÚgrace_msFÚsuccessÚ
transcriptr   zfull-duplex listener failed: %s)r­   rÇ   rÈ   rÉ   r€   rœ   Ú_fd_barge_paramsrº   r§   r³   r´   r4   r5   Ú_deliver_fd_transcriptrI   rJ   ÚOSErrorr2   ÚunlinkrK   rx   ry   )rÇ   rÉ   rÍ   rÕ   ÚmultrÚ   Úwav_pathÚresultrz   rÈ   rÔ   s            @@r   rµ   rµ   ú   s›  ù€ ð(÷	<ñ 	<÷	Yð 	Yô —/’/Ó#ˆ÷	ð 	ô *¬/Ó*;Ó<‰ˆÙ% lÐ?UØ1<ÏÈÐQUØ/7ô9ˆ÷ ˜WŸ^™^×-Ò-Ø÷ ÖØ"'Ð÷ Ñð	$Ù)¨(Ó3ˆFØ�z‰z˜)×$Ò$¨&¯*©*°\Ó*B×*HÐ*HÀb×)OÑ)O×)QÒ)QÜ& v¨lÕ';×'AÑ'AÓ'CÔDä×$Ò$¤W×-Õ-Ü—	‘	˜(Ô#÷ .÷
 ÖØ"'Ð÷ ××Òú÷ .×-û”×$Ò$¤W×-Õ-Ü—	‘	˜(Ô#÷ .×-×-Ð-þäô ;Ü�‰Ð6¸×:Ñ:ûð;ú÷ ×Ðû×ÖØ"'Ð÷ ××ÐýsÆ   „A#G# Á(G# ÂE$ÂF Â:F ÃF Ã) F Ä	"G# Ä+E8ÅG# ÅHÅ$E5	Å8F	ÆG# ÆH% ÆG# Æ#G Æ.G	Ç	G ÇGÇG Ç G# Ç#HÇ.H	ÈH% È	HÈH% ÈH"	È%IÈ4I 	È7	IÉ IÉIc               ó    € V ^8„  d   QhRRRR/# )r   ÚcfgÚdictr   ztuple[float, int]r   )r   s   "r   r   r     s   € ÷ \ñ \˜$ð \Ð#4ñ \r   c           	     óT   a € V 3R lpV! R R^ 4      pV\        ^ V! R RR4      4      3# )zR``(threshold multiplier, grace ms)`` from the voice config; malformed -> defaults.c                ór   <€  V ! SP                  W4      4      #   \        \        3 d    T ! T4      u # i ; ir   )r4   Ú	TypeErrorÚ
ValueError)ÚconvÚkeyÚdefaultrå   s   &&&€r   ÚnumÚ_fd_barge_params.<locals>.num  s:   ø€ ð	!Ù˜Ÿ™ Ó-Ó.Ð.øÜœ:Ð&ô 	!Ù˜“=Ò ð	!ús   ƒ š6µ6c                ó,   € \        T ;'       g    ^ 4      # )rP   )Úfloat©Úvs   &r   Ú<lambda>Ú"_fd_barge_params.<locals>.<lambda>$  s   € œ˜qŸv˜v Aœr   Úbarge_in_threshold_multiplierc                ó8   € \        \        V 4      R ,          4      # )iè  )Úintrñ   rò   s   &r   rô   rõ   %  s   € ¤c¬%°«(°T­/Ô&:r   Úbarge_in_grace_secondsg      à?)Úmax)rå   rî   rá   s   f  r   rÝ   rÝ     s8   ø€ õ!ñ
 Ñ&Ð(GÈÓK€DØ”�Q™Ñ:Ð<TÐVYÓZÓ[Ð[Ð[r   c               ó    € V ^8„  d   QhRRRR/# rÐ   r   )r   s   "r   r   r   (  s   € ÷ %ñ %�Cð %˜Dñ %r   c                óà  € ^ RI Hp ^ RIHp V! 4        V R8X  d   \        P                  R4       M\        P                  R4       \        RR7       \        ;_uu_ 4        \         F  w  r4VP                  4        K  	  RRR4       V! 4        V R8w  dy    \        4        Fi  pVP                  R	4      pVf   K  \        VR
4      '       g   K.  \        P                  ! \        4      ;_uu_ 4        VP!                  4        RRR4       Kk  	  \#        R4       R#   + '       g   i     L£; i  + '       g   i     Kž  ; i  \         d!   p\        P                  RT4        Rp?LZRp?ii ; i)zÐListener tripped: latch the interruption, cut TTS FIRST (so a stale reply can never
speak), and during generation also interrupt every running turn (the ``agent.interrupt()``
seam ``session.interrupt`` uses).r£   r¥   Úplaybackz5TTS CUT: full-duplex listener tripped during playbackuO   full-duplex listener tripped during generation â€” interrupting running turn(s)Trh   NÚagentÚ	interruptz'voice interjection interrupt failed: %szvoice.interrupted)r©   r¤   r­   r¦   rx   ry   rj   r³   r¯   r¬   rŒ   r4   ÚhasattrrI   rJ   rK   rÿ   r#   )rÑ   r¤   r¦   rÂ   Ú_doner‹   rþ   rz   s   &       r   rÓ   rÓ   (  s  € õ <Ý.ÙÔØ�
ÔÜ�‰ÐLÕMä�‰ð 4ô 	5ô  Õ%ß	Ö	ß/‰LˆEØ�I‰IŽKñ 0÷ 
ñ „OØ�
Ôð	GÜ&Ö(�ØŸ™˜g›�ØÔ$¬°¸×)DÔ)DÜ#×,Ò,¬Y×7Õ7ØŸ™Ô)÷ 8Ñ7ñ )ô Ð#Ö$÷ 
×	ú÷ 8×7Ð7ûäô 	GÜ�L‰LÐBÀA×FÑFûð	GúsH   Á  DÂE Â;E Ã"E Ã1D.ÄE ÄD+	Ä.D?Ä9	E ÅE-ÅE(Å(E-c               ó    € V ^8„  d   QhRRRR/# ©r   Útextr   r   r   r   )r   s   "r   r   r   F  s   € ÷ hñ h ð h¨ñ hr   c                ó  €  ^ RI Hp V! V 4      pV'       d,   \        ;_uu_ 4        \        pRRR4       \        XRRR7       \        RV'       d   RRRV /4       R# RV /4       R#   \         d    Rp Lfi ; i  + '       g   i     LU; i)	z¦Emit the captured interjection; a bare stop phrase also ends the voice chat. The stop
check must never break delivery (stubbed voice_mode in tests, partial installs).)Úis_voice_stop_phraseFNTrn   úvoice.transcriptÚstop_phraser  )Útools.voice_mode_transcriptr  rK   r   r   ro   r#   )r  r  Úis_stopr    s   &   r   rÞ   rÞ   F  st   € ðÝDÙ& tÓ,ˆ÷ ßŽ_Ü"ˆC÷ ä ¨t¸eÕDÜÐ"Ï7 ]°D¸&À$Ð$GÖgÐY_ÐaeÐXfÖgøô ô ØŠðú÷ �_ús   ‚A' ¦A:Á'A7Á6A7Á:B
	c               ó    € V ^8„  d   QhRRRR/# r  r   )r   s   "r   r   r   U  s   € ÷ %ñ % ð %¨ñ %r   c                ód  a aaa€ ^ RI Ho \        P                  ! 4       \        P                  ! 4       uoo\        ;_uu_ 4        \
        P                  SS34       RRR4       VVVV 3R lp\        P                  ! VRR7      P                  4        \        4        R#   + '       g   i     LK; i)z[speak_text registered in ``_fd_speak_pipelines`` so the listener can cut it / waits for it.)Ú
speak_textNc            	     óž  <€  S! SS4       S P                  4        \        ;_uu_ 4        \        P	                  SS 34       R R R 4       R #   \          d    S! S4        LUi ; i  + '       g   i     R # ; i  S P                  4        \        ;_uu_ 4        \        P	                  SS 34       R R R 4       i   + '       g   i     i ; i; ir   )ré   r¬   r³   r¯   Údiscard)r—   r  r–   r  s   €€€€r   Ú_speakÚ&_speak_text_with_barge.<locals>._speak\  s”   ø€ ð	:Ù�t˜TÔ"ð �H‰HŒJß"Ö"Ü#×+Ñ+¨T°4¨LÔ9÷ #Ñ"øô	 ô 	Ù�tÖð	ú÷ #×"Ð"ûð �H‰HŒJß"Ö"Ü#×+Ñ+¨T°4¨LÔ9÷ #×"×"Ð"ýsF   ƒ	A ªA%ÁA"ÁA9 Á!A"Á"A9 Á%A6	Á9CÂB9	Â0	CÂ9C	ÃCT)r}   r   )
rL   r  r€   rœ   r³   r¯   Úaddr�   r‚   rž   )r  r  r—   r  r–   s   f @@@r   Ú_speak_text_with_barger  U  sp   û€ å+Ü—’Ó"¤I§O¢OÓ$5€J€Dˆ$ß	Ö	Ü×Ñ  t Ô-÷ 
÷:ð :ô ×Ò˜F¨4Ô0×6Ñ6Ô8Ü"Ö$÷ 
×	ús   ÁBÂB/	c               ó   € V ^8„  d   QhRR/# ©r   r   ræ   r   )r   s   "r   r   r   i  s   € ÷ <ñ <˜ñ <r   c                 óœ   € \        4       p \        V \        4      '       d   V P                  R4      MRp\        V\        4      '       d   V# / # )u/  Shape-safe ``voice:`` block (no deep-merged defaults: any YAML shape possible; bad â†’ {}).

``_load_cfg()`` does not deep-merge DEFAULT_CONFIG, so both the root AND ``voice`` may be any YAML
scalar / list / None. A hand-edit like ``voice: true`` or a malformed top-level config that parses to a
scalar would otherwise break ``.get("â€¦")`` and take every ``voice.*`` branch down with it (Copilot
round-3..7 review on 19835). Coerce through ``isinstance`` at every level so malformed config falls back
to an empty dict instead of crashing /voice. See #19835.
ÚvoiceN)Ú	_load_cfgÚ
isinstanceræ   r4   )rå   Ú	voice_cfgs     r   rº   rº   i  s>   € ô ‹+€CÜ$.¨s´D×$9Ò$9�—‘˜Ô ¸t€IÜ" 9¬d×3Ò3ˆ9Ð;¸Ð;r   c                ón   € \        V \        \        34      '       d   \        V \        4      '       g   V # T# )uX   Numeric config value, else *default*; bool excluded (``silence_threshold: true`` â‰  1).)r  rø   rñ   r-   )Úvaluerí   s   &&r   Ú_voice_cfg_numberr  w  s*   € ä˜u¤s¬E l×3Ò3¼JÀuÌd×<SÒ<Sˆ5Ð`ÐY`Ð`r   c               ó   € V ^8„  d   QhRR/# r  r   )r   s   "r   r   r   |  s   € ÷ nñ n dñ nr   c                 ó¬   € \        4       P                  R4      p\        V\        4      '       d   V'       d   TMRpR\	        4       RVR\        4       /V C# )z—``{enabled, record_key, tts, **extra}``: record_key (default ``ctrl+b``) rides every voice.toggle
branch so a tts toggle never resets a custom binding.Ú
record_keyzctrl+bÚenabledÚtts)rº   r4   r  r   r6   ra   )Úextrar   s   , r   Ú_voice_status_payloadr$  |  sM   € ô !Ó"×&Ñ& |Ó4€JÜ)¨*´c×:Ò:¿z‘Èx€JØÔ*Ó,¨l¸JÈÔOaÓOcÐmÐglÐmÐmr   Ú_wake_owner_transportc                 ót   € \         ;_uu_ 4        \        \        3uuR R R 4       #   + '       g   i     R # ; ir   )Ú
_wake_lockr%  Ú_wake_owner_surfacer   r   r   Ú_wake_owner_snapshotr)  �  s   € ß	ŽÜ$Ô&9Ð9÷ 
��‹ús   �&¦7	c               ó    € V ^8„  d   QhRRRR/# )r   r!   Ú	Transportr   r-   r   )r   s   "r   r   r   ’  s   € ÷ ñ ¨9ð ¸ñ r   c                ó  € \         ;_uu_ 4        \        V Jd    RRR4       R# RRussRRR4        ^ RIHp V! V R7       R#   + '       g   i     L"; i  \
         d"   p\        P                  RT4        Rp?R# Rp?ii ; i)zFRelease the wake lease iff ``transport`` is the current gateway owner.NFr   )Ústop_listeningr(   zwake stop failed: %sT)r'  r%  r(  Útools.wake_wordr-  rK   rx   ry   )r!   r-  rz   s   &  r   Ú_release_wake_for_transportr/  ’  ss   € ÷ 
ŽÜ ¨	Ó1Ø÷ 
‰ð 6:¸2Ð2ÐÐ2÷ 
ð0Ý2Ù˜YÕ'ñ ÷ 
�ûô ô 0Ü�‰Ð+¨Q×/Ð/Ùûð0ús'   �A¥A³A ÁA	ÁBÁ"A>Á>Bc               ó   € V ^8„  d   QhRR/# r,   r   )r   s   "r   r   r   ¡  s   € ÷ Dñ D Tñ Dr   c                 óH   € \        4       w  rV R J;'       d    \        V 4      # r   )r)  r/  )r)   Ú_surfaces     r   Ú_release_gateway_wake_ownerr3  ¡  s%   € Ü*Ó,�O€EØ˜Ð×CÐCÔ!<¸UÓ!CÐCr   Úretry_secondsg      .@Úretry_intervalg      ð?c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   r)   r+  r4  rñ   r5  r   r-   r   )r   s   "r   r   r   ª  s*   € ÷ !ñ ! ð !¸eð !Ø*/ð!Ø:>ñ!r   c               óx  a aaa€ ^ RI Ho  S! S R7      #   \         d!   p\        P	                  RT4        Rp?MRp?ii ; i\
        ;_uu_ 4        \        '       d    RRR4       R# RsRRR4       M  + '       g   i     M; iR T TTT3R llp\        P                  ! TRR	R
7      P                  4        R# )u{  Resume the wake detector for ``owner``, self-healing a busy microphone: reopening right after
a voice turn can fail while the device is still being released (browser WebRTC tracks release
async), so an exception retries in a background thread until it sticks, the lease changes hands,
or ``retry_seconds`` elapses. ``False`` (lease gone / other owner) is final â€” never retried.)Úresume_listeningr(   z#wake resume failed (will retry): %sNFTc               ó   € V ^8„  d   QhRR/# r%   r   )r   s   "r   r   Ú+_wake_resume_if_owner.<locals>.__annotate__»  s   € ÷ 2ñ 2�Dñ 2r   c            	     ó¨  <€ \         P                  4       S,           p  \         P                  4       V 8  d�   \         P                  S4       \        P                  ! \
        4      ;_uu_ 4        S! SR 7      '       d   \        P                  R4        RRR4       \        ;_uu_ 4        Rs	RRR4       R# \        P                  R4       \        ;_uu_ 4        Rs	RRR4       R#   + '       g   i     R# ; i  + '       g   i     Kî  ; i  + '       g   i     R# ; i  \        ;_uu_ 4        Rs	RRR4       i   + '       g   i     i ; i; i)r(   z"wake: detector resumed after retryNFul   wake: could not resume detector after voice turn (microphone still busy?) â€” toggle the wake word to re-arm)ÚtimeÚ	monotonicÚsleeprI   rJ   rK   rx   ÚinfoÚ_wake_resume_retry_lockÚ_wake_resume_retry_activeÚwarning)Údeadliner)   r8  r5  r4  s    €€€€r   Ú_retryÚ%_wake_resume_if_owner.<locals>._retry»  sà   ø€ ä—>‘>Ó# mÕ3ˆð	2Ü—.‘.Ó" XÔ-Ü—
‘
˜>Ô*Ü×(Ò(¬×3Õ3Ù'¨e×4Ó4ÜŸ™Ð$HÔIØ÷ 4÷ )Ö(Ø,1Ð)÷ )Ñ(ô �N‰Nð Yô Z÷ )Ö(Ø,1Ð)÷ )×(×(Ò(ú÷ 4×3Ð3ú÷ )×(Ð(û×(Ö(Ø,1Ð)÷ )×(×(Ð(ýsZ   žAD# Á.&C;ÂD# Â*C'Â7D# ÃDÃ'C8	Ã;D	Ä	D# ÄD 	Ä#EÄ2D>	Ä5	EÄ>EÅ	Ezwake-resume-retryr²   )
r.  r8  rK   rx   ry   r@  rA  r€   r�   r‚   )r)   r4  r5  rz   rD  r8  s   fdd  @r   r'   r'   ª  s•   û€ õ 1ð?Ù eÔ,Ð,øÜô ?Ü�‰Ð:¸A×>Ñ>ûð?ú÷ 
!Ö	 ß$Ó$Ø÷ 
!Ñ	 ð %)Ð!÷ 
!×	 ×	 Ð	 ú÷
2ó 2ô ×Ò˜F¨4Ð6IÔJ×PÑPÔRÙs$   Œ •A  ;»A ÁA4Á)A4Á4B	c               ó    € V ^8„  d   QhRRRR/# )r   r!  r-   r   r   )r   s   "r   r   r   Î  s   € ÷ ñ  4ð ¨Dñ r   c                ó’   €  ^ RI Hp \        V! RV 4      4      #   \         d"   p\        P                  RY4        Rp?R# Rp?ii ; i)zSWrite ``wake_word.enabled``; only for explicit gestures (ear toggle, /wake on|off).)Úsave_config_valuezwake_word.enabledz0wake: failed to persist wake_word.enabled=%s: %sNF)ÚclirH  r-   rK   rx   rB  )r!  rH  rz   s   &  r   Ú_persist_wake_enabledrJ  Î  s@   € ðÝ)ÜÑ%Ð&9¸7ÓCÓDÐDøÜô Ü�‰ÐIÈ7ÔVÝûðús   ‚ šA¥AÁAc               ó    € V ^8„  d   QhRRRR/# )r   Úfieldr   r   ræ   r   )r   s   "r   r   r   Ø  s   € ÷ Qñ Q˜cð Q°4ñ Qr   c                ó8   € \        YTRV'       d   RMR/VC4      # )zS``{field: ok, reason: None | "not_owner", **extra}`` for the owner-gated wake RPCs.ÚreasonNÚ	not_owner©Ú_ok)ÚridrL  Úokr#  s   &&&,r   Ú_owner_resultrT  Ø  s   € äˆs˜B ·"©$¸+ÐOÈÐOÓPÐPr   c               ó    € V ^8„  d   QhRRRR/# )r   Úframeræ   r   r   )r   s   "r   r   r   Ý  s   € ÷ mñ m˜ð m $ñ mr   c                óN   € R V P                  R R4      RV P                  RR4      /# )Úsample_rateé€>  Úframe_lengthi   )r4   )rV  s   &r   Ú_frame_fieldsr[  Ý  s)   € Ø˜5Ÿ9™9 ]°EÓ:¸NÈEÏIÉIÐVdÐfjÓLkÐlÐlr   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   rå   ræ   ÚparamsÚsurfacer   r   ztuple[str, dict]r   )r   s   "r   r   r   á  s/   € ÷ Xñ X�Tð X 4ð X°#ð XÐ:Jñ Xr   c                ó�   € ^ RI HpHp VR9   ;'       g    \        VP	                  R4      4      pV! WR7      pWc! / V CRV/C4      3# )u¬   ``(capture_mode, requirements)``; capture stamped so the probe matches what would arm.
Desktop (gui) prefers client capture (Mac mic â†’ wake.feed PCM); CLI/TUI stay local.)Úcheck_wake_word_requirementsÚresolve_capture_modeÚclient_capture)Úprefer_clientÚcapture)ÚguiÚdesktop)r.  r`  ra  r-   r4   )rå   r]  r^  r`  ra  rc  Úcapture_modes   &&&    r   Ú_wake_proberh  á  sR   € ÷ SØÐ1Ñ1×WÐW´T¸&¿*¹*ÐEUÓ:VÓ5W€MÙ'¨ÔI€LØÐ5Ð6V¸Ð6V¸iÈÑ6VÓWÐWÐWr   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r    r   ÚphraseÚnew_sessionr-   r   )r   s   "r   r   r   ê  s!   € ÷ ñ ¨ð °cð Èñ r   c                ó&   a aaa€ R VVVV 3R llpV# )z]On-detect callback: pause, verify ownership, emit ``wake.detected`` on the owner's transport.c               ó   € V ^8„  d   QhRR/# r%   r   )r   s   "r   r   Ú*_wake_detect_handler.<locals>.__annotate__ì  s   € ÷ #ñ #˜ñ #r   c            
     ó²  <€ ^ RI Hp HpHp V! S	R7      '       d   V! S	4      '       g   R# \	        S	4      '       d   \        S	4       R# V ! 4       ;'       g    SR3w  r4\        P                  RS\        S	4      P                  V4       \        S	4      p \        RSRT;'       g    SRT;'       g    RR	S/4       \        V4       R#   \        T4       i ; i)
rP   )Úget_last_matchÚowns_listenerÚpause_listeningr(   Nr   z<wake.detected: emitting to sid=%r (transport=%s, profile=%r)zwake.detectedrj  ÚprofileÚstart_new_session)r.  rp  rq  rr  Ú_transport_is_deadr/  rx   r?  ÚtypeÚ__name__r   r   r   )
rp  rq  rr  Úmatched_phraseÚmatched_profiler"   rk  rj  r    r!   s
         €€€€r   Ú
_on_detectÚ(_wake_detect_handler.<locals>._on_detectì  sÁ   ø€ ßRÑRÙ Y×/Ó/±}ÀY×7OÒ7OÙÜ˜i×(Ò(Ü'¨	Ô2Ùá*8Ó*:×*JÐ*J¸vÀr¸lÑ'ˆÜ�‰ÐRØœ˜i›×1Ñ1°?ô	Dä˜yÓ)ˆð	#Ü�/ 3Ø˜.×2Ð2¨F°I¸×?VÐ?VÐRVØ# [ð)2ô 3ô ˜EÖ"øŒO˜EÕ"ús   ÂC	 Â2
C	 Ã	Cr   )r!   r    rj  rk  rz  s   ffff r   Ú_wake_detect_handlerr|  ê  s   û€ ÷#ó #ð$ Ðr   zgateway.capabilitiesc               ó    € V ^8„  d   QhRRRR/# ©r   r]  ræ   r   r   )r   s   "r   r   r     s   € ÷ Zñ Z�4ð Z˜Dñ Zr   c                ó<   € ^ RI Hp \        V R\        V4      /4      # )zœWhat THIS BUILD enforces (a client withholds unless advertised), sourced from the enforcing
module, never config: a believed-but-absent capability is worse.)ÚPER_SESSION_EXCLUSIVE_SUBMITÚper_session_exclusive_submit)Úhermes_cli.active_sessionsr€  rQ  r-   )rR  r]  r€  s   && r   Ú_rƒ    s!   € õ HÜˆsÐ3´TÐ:VÓ5WÐXÓYÐYr   zclient.capabilitiesc               ó    € V ^8„  d   QhRRRR/# r~  r   )r   s   "r   r   r   
  s   € ÷ hñ h�4ð h˜Dñ hr   c                ó²  € ^ RI Hp ^ RIHp ^ RIHp \        4       pRV9   d+   VP                  V\        VP                  R4      4      4       RV9   db   \        VR4      '       dP   V! VP                  VP                  R4      4      Vn        VP                  '       d   ^ RIHp VP                  4        \        V R\!        VP"                  4      RR	/4      # )
u  What the calling client handles. ``server_requests: true`` marks this connection as one that answers
serverâ†’client requests; a WebSocket client that never sends it gets every such request failed fast
instead of stalling the agent for the deadline (#112548).)Úlocal_desktop_client)Úserver_requests)Úregistryr‡  Údesktop_localÚauth_identity©ÚserverÚdeclines_not_shownT)Úhermes_cli.process_identityr†  Útui_gatewayr‡  Útui_gateway.contractsrˆ  r   Ú	advertiser-   r4   r   rŠ  r‰  rŒ  Úbegin_local_desktop_bootrQ  ÚsortedÚSERVER_REQUESTS)rR  r]  r†  r‡  Ú	contractsr!   rŒ  s   &&     r   rƒ  rƒ  	  s´   € õ
 AÝ+Ý;Ü!Ó#€Ið ˜FÔ"Ø×!Ñ! )¬T°&·*±*Ð=NÓ2OÓ-PÔQØ˜&Ô ¤W¨Y¸×%HÒ%HÙ"6°y×7NÑ7NÐPV×PZÑPZÐ[jÓPkÓ"lˆ	ÔØ×"×"Ð"Ý*Ø×+Ñ+Ô-ÜˆsÐ&¬¨y×/HÑ/HÓ(IÐK_ÐaeÐfÓgÐgr   Úpingc               ó    € V ^8„  d   QhRRRR/# r~  r   )r   s   "r   r   r     s   € ÷ $ñ $�4ð $˜Dñ $r   c                ó   € \        V RR/4      # )zœCheapest liveness probe, answered on the WS reader thread (works while every agent is mid-turn)
so the desktop can tell a half-open socket after sleep/wake.ÚpongTrP  ©rR  r]  s   &&r   rƒ  rƒ    s   € ô ˆs�V˜T�NÓ#Ð#r   z
wake.startc               ó    € V ^8„  d   QhRRRR/# r~  r   )r   s   "r   r   r   &  s   € ÷ 9!ñ 9!�4ð 9!˜Dñ 9!r   c                óÖ  a € \        VP                  R4      ;'       g    R4      P                  4       P                  4       p\	        4       pV 3R lp ^ RIHpHpHpH	pH
p	Hp
Hp T! 4       p\        YÑT4      w  rïTR,          '       gJ   \         P#                  R	Y/P                  R
4      4       T! RTP                  R
4      ;'       g    RTR7      # \%        TP                  R4      4      ;'       d*    TP                  R4      '       * ;'       d    \'        R4      pT'       d	   / TCRR/CpT! Y-4      '       g[   TP                  R4      '       g   RMRp\         P)                  RTTTP                  R4      TP                  R4      4       T! T4      # \+        4       w  ppTe/   \-        T4      '       g   T! T4      '       g   \/        T4       RRppTe   TTJd   T! RTR7      #  \1        T\        TP                  R4      ;'       g    R4      T
! T4      \%        TP                  RR4      4      4      pT	! TY=TR8H  R7       \2        ;_uu_ 4        Y2ussRRR4       T! 4       p\         P)                  RY/R,          TR,          TTP                  R4      4       \9        S RRRTR,          RTR,          R TR!TR"T/\;        T4      C4      #   \         d   p\        S RRT 24      u Rp?# Rp?ii ; i  T d    T! RT;'       g    RR7      u # \         d7   p\         P#                  RY,4       \        S R\        T4      4      u Rp?# Rp?ii ; i  + '       g   i     EL; i)#zãArm the wake-word listener for the calling surface ("tui" | "gui"); ``{started: False,
reason}`` when disabled/owned/not ready. ``persist: true`` (explicit gesture) also flips
``wake_word.enabled`` on; auto-arm callers omit it.r^  Úautoc                ó(   <€ \        SR RRV /VC4      # )ÚstartedFrN  rP  )rN  r#  rR  s   &,€r   ÚrefusedÚ_.<locals>.refused.  s   ø€ Ü�3˜ E¨8°VÐE¸uÐEÓFÐFr   )ÚWakeWordInUseÚdetector_frame_infoÚload_wake_word_configrq  Ústart_listeningÚwake_phraseÚwake_surface_enabledé¢  zwake module unavailable: NÚ	availableu$   wake.start(%s): not available â€” %sÚhintÚunavailabler   )rª  rd  Úpersistr!  TÚdisabledÚdisabled_for_surfacez+wake.start(%s): %s (enabled=%s, surface=%s)Úowned)Úowner_surfacer<   rt  Úclient)r)   ÚconfigÚexternal_audioz,wake.start(%s): failed to start listener: %sz9wake.start(%s): listening for %r (%s) capture=%s frame=%srj  ÚproviderrZ  rŸ  r°  Úenabled_persistedrd  )r   r4   r5   Úlowerr   r.  r¢  r£  r¤  rq  r¥  r¦  r§  rK   Ú_errrh  rx   rB  r-   rJ  r?  r)  ru  r/  r|  r'  r%  r(  rQ  r[  )rR  r]  r^  r!   r   r¢  r£  r¤  rq  r¥  r¦  r§  rz   rå   rg  Úreqsrµ  rN  Úexisting_ownerÚexisting_surfaceÚ	on_detectrV  s   f&                    r   rƒ  rƒ  %  s+  ø€ ô �&—*‘*˜YÓ'×1Ð1¨6Ó2×8Ñ8Ó:×@Ñ@ÓB€GÜ!Ó#€IõGð@÷	@÷ 	@ñ 	@ñ
  Ó
!€CÜ$ S°'Ó:Ñ€Lð �×ÔÜ�‰Ð=¸wÏÉÐQWÓHXÔYÙ�}¨4¯8©8°FÓ+;×+AÐ+A¸rÈ<ÔXÐXÜ˜VŸZ™Z¨	Ó2Ó3×nÐn¸C¿G¹GÀIÓ<NÔ8N×nÐnÔShÐimÓSnÐßØ&�Ð&�i Ñ&ˆÙ ×-Ò-ð $'§7¡7¨9×#5Ò#5‘Ð;QˆÜ�‰ÐAØ˜V S§W¡W¨YÓ%7¸¿¹ÀÓ9Kô	Má�v‹ÐÜ';Ó'=Ñ$€NÐ$ØÒ!Ô'9¸.×'IÒ'IÑQ^Ð_m×QnÒQnÜ# NÔ3Ø+/°Ð(ˆØÒ! n¸IÓ&EÙ�wÐ.>Ô?Ð?ð	'Ü(¨´C¸¿
¹
À<Ó8P×8VÐ8VÐTVÓ4WÙ)4°SÓ)9¼4ÀÇÁÐH[Ð]aÓ@bÓ;cóeˆ	á˜	¨Ø'3°xÑ'?õ	A÷ 
ŽØ5>Ð2ÐÐ2÷ 
áÓ!€EÜ
‡K�KÐKØ˜h�¨¨jÕ)9¸<ÈÏÉÐSaÓIbôdäˆsØ�4˜ 4¨¥>°:¸tÀJÕ?OØ˜Ð"5Ð7HÈ)ÐUað ô ˜Ó
ð ó !ð !øôQ ô @Ü�C˜Ð!:¸1¸#Ð>Ó?Õ?ûð@ûð< ô HÙ�wÐ.>×.FÐ.FÀ$ÔGÒGÜô 'Ü�‰ÐEÀwÔRÜ�C˜œs 1›vÓ&Õ&ûð'ú÷ 
�ˆús`   ÁK Ç)"K7 È:K7 ÉMËK4ËK/Ë)K4Ë/K4Ë7MÌ
MÌMÌMÌ+MÍ	MÍMÍM(	z	wake.stopc               ó    € V ^8„  d   QhRRRR/# r~  r   )r   s   "r   r   r   c  s   € ÷ Yñ Y�4ð Y˜Dñ Yr   c                ó  € \        \        4       4      pRpVP                  R4      '       d<    ^ RIHp \        V! 4       P                  R4      4      pT;'       d    \        R4      p\        V RW#R7      #   \         d    Rp L2i ; i)zYStop this surface's listener; ``persist: true`` also writes ``wake_word.enabled: false``.Fr¬  )r¤  r!  TÚstopped)Údisabled_persisted)	r/  r   r4   r.  r¤  r-   rK   rJ  rT  )rR  r]  r¾  r¿  r¤  Úcurrently_enableds   &&    r   rƒ  rƒ  b  s…   € ô *Ô*;Ó*=Ó>€GØÐØ‡z�z�)×Òð	%Ý=Ü $Ñ%:Ó%<×%@Ñ%@ÀÓ%KÓ LÐð /×OÐOÔ3HÈÓ3OÐÜ˜˜i¨ÔXÐXøô ô 	%Ø $Òð	%ús   ®%A6 Á6BÂBz
wake.pausec               ó    € V ^8„  d   QhRRRR/# r~  r   )r   s   "r   r   r   r  s   € ÷ 	0ñ 	0�4ð 	0˜Dñ 	0r   c                óØ   €  ^ RI Hp V! \        4       R7      p\        P	                  RV4       \        V RV4      #   \
         d#   p\        P                  RT4       Rp Rp?L5Rp?ii ; i)zBRelease the mic (e.g. while the desktop's browser captures audio).©rr  r(   zwake.pause: detector paused=%szwake.pause failed: %sFNÚpaused)r.  rr  r   rx   r?  rK   ry   rT  )rR  r]  rr  rÄ  rz   s   &&   r   rƒ  rƒ  q  s^   € ðÝ3Ù Ô'8Ó':Ô;ˆÜ�‰Ð4°fÔ=ô ˜˜h¨Ó/Ð/øô ô Ü�‰Ð,¨aÔ0Ø�ûðús   ‚-< ¼A)ÁA$Á$A)zwake.resumec               ó    € V ^8„  d   QhRRRR/# r~  r   )r   s   "r   r   r     s   € ÷ 2ñ 2�4ð 2˜Dñ 2r   c                ón   € \        \        4       4      p\        P                  RV4       \	        V RV4      # )zAReclaim the mic after a pause; no-op if the listener isn't armed.z wake.resume: detector resumed=%sÚresumed)r'   r   rx   r?  rT  )rR  r]  rÇ  s   && r   rƒ  rƒ  ~  s0   € ô $Ô$5Ó$7Ó8€GÜ
‡K�KÐ2°GÔ<Ü˜˜i¨Ó1Ð1r   zwake.statusc               ó    € V ^8„  d   QhRRRR/# r~  r   )r   s   "r   r   r   ‡  s   € ÷ #'ñ #'�4ð #'˜Dñ #'r   c           !     ó¾  €  ^ RI HpHpHpHpHpHpHp V! 4       p	\        Y‘\        VP                  R4      ;'       g    R4      P                  4       P                  4       4      w  r«\        4       w  rÍV! \        4       4      pT;'       d    V! 4       pT;'       d    V! 4       pV! V	4      pVP                  RR4      pVP                  R4      '       d   V'       g   RVR,           2pV'       d   V'       g	   V! V4      pV! 4       pV'       d<   VP                  R4      '       g	   V'       d   VP                  R4      '       d   RMR	pMGT
;'       g>    VP                  R
4      ;'       g%    \        V	P                  R
4      ;'       g    R4      p\        T RTRTRVe   TMRRVR,          RVR,          R\        V	P                  R4      ;'       g    R4      RVRVR,          RVR\!        V	P                  R4      4      RVR
VR\!        VP                  R4      4      /\#        V4      C4      #   \$         d!   p\'        T R\        T4      4      u Rp?# Rp?ii ; i)rP   )Úaudio_is_silentr£  Úget_input_device_statusÚis_listeningr¤  rq  Úsilent_audio_hintr^  r   rª  Úerrorz.Wake-word input device could not be resolved: r³  r±  Úlocalrd  r�  Ú	listeningÚowned_by_callerr°  Nrj  r´  Úconfigured_surfaceÚinput_devicer©  r!  Úaudio_silentÚlocal_input_availabler¨  )r.  rÊ  r£  rË  rÌ  r¤  rq  rÍ  rh  r   r4   r5   r¶  r)  r   rQ  r-   r[  rK   r·  )rR  r]  rÊ  r£  rË  rÌ  r¤  rq  rÍ  rå   Úprobe_capturer¸  r)   r°  rÑ  rÐ  ÚsilentrÓ  rª  rV  rd  rz   s   &&                    r   rƒ  rƒ  †  s"  € ð"'÷	E÷ 	Eñ 	Eñ $Ó%ˆÜ)¨#´s¸6¿:¹:ÀiÓ;P×;VÐ;VÐTVÓ7W×7]Ñ7]Ó7_×7eÑ7eÓ7gÓhÑˆÜ3Ó5ÑˆÙ'Ô(9Ó(;Ó<ˆØ#×6Ð6©«ˆ	Ø×0Ð0™Ó0ˆÙ.¨sÓ3ˆØ�x‰x˜ Ó#ˆØ×Ñ˜G×$Ò$¯TØCÀLÐQXÕDYÐCZÐ[ˆDßŸ$Ù$ \Ó2ˆDñ $Ó%ˆß §	¡	Ð*:× ;Ò ;¿yØ"'§)¡)Ð,<×"=Ò"=‘hÀ7‰Gà#×_Ð_ t§x¡x°	Ó':×_Ð_¼cÀ#Ç'Á'È)ÓBT×B^ÐB^ÐX^Ó>_ˆGô �3Ø˜Ð$5°Ø¨eÒ.?™]ÀTØ�d˜8•n j°$°zÕ2BØ ¤# c§g¡g¨iÓ&8×&BÐ&B¸FÓ"CØ˜L¨+°t¸KÕ7HÈ&ÐRVØ”t˜CŸG™G IÓ.Ó/°ÀÈÐT[Ø#¤T¨$¯(©(Ð3JÓ*KÓ%Lðfô Q^Ð^cÓPdðfó gð 	gøô ô 'Ü�C˜œs 1›vÓ&Õ&ûð'úsn   ‚BH1 Â8H1 ÃH1 ÃH1 Ã2H1 Ã:H1 ÄH1 Ä(H1 Ä0H1 ÅH1 ÅH1 Å.H1 ÆAH1 ÇAH1 È1IÈ<IÉIÉIz	wake.feedc               ó    € V ^8„  d   QhRRRR/# r~  r   )r   s   "r   r   r   ®  s   € ÷ /ñ /�4ð /˜Dñ /r   c                ó  € VP                  R4      ;'       g    VP                  R4      ;'       g    Rp\        V\        4      '       d   VP                  4       '       g   \	        V RR4      # ^ RIp VP                  VRR7      pT'       g   \        T R
RRR/4      # \        T4      R8”  d   \	        T RR4      # TP                  R4      e%   \        TR,          4      R9  d   \	        T RR4      #  ^ RIHp T! \        4       TR7      p\!        T R
\#        T4      4      #   \         d   p\	        T RR	T 24      u Rp?# Rp?ii ; i  \         d7   p\        P                  RT4       \	        T R\        T4      4      u Rp?# Rp?ii ; i)u´   Push client-captured PCM (``pcm``/``pcm_b64``: base64 int16 mono LE, 16 kHz only) into the
armed detector (``capture: "client"``) â€” mic-less remote backends can run openWakeWord.ÚpcmÚpcm_b64r   i¡  zwake.feed requires base64 pcmNF)Úvalidatezinvalid base64 pcm: ÚfedrN  Úemptyi ú  zpcm frame too largerX  z!wake.feed only accepts 16 kHz PCM)Ú
feed_audio)r)   Ú	pcm_int16zwake.feed failed: %sr¨  )rP   rY  )r4   r  r   r5   r·  Úbase64Ú	b64decoderK   rQ  Úlenrø   r.  rß  r   rx   ry   rT  r-   )rR  r]  Úraw_b64rá  rÚ  rz   rß  rS  s   &&      r   rƒ  rƒ  ­  s`  € ð �j‰j˜Ó×>Ð> 6§:¡:¨iÓ#8×>Ð>¸B€GÜ�gœs×#Ò#¨7¯=©=¯?ª?Ü�C˜Ð>Ó?Ð?Ûð;Ø×Ñ˜w°ÐÓ7ˆ÷ Ü�3˜  x°Ð9Ó:Ð:Ü
ˆ3ƒx�%ÔÜ�C˜Ð4Ó5Ð5Ø‡z�z�-Ó Ò,´°V¸MÕ5JÓ1KÐS]Ô1]Ü�C˜ÐBÓCÐCð'Ý.ÙÔ/Ó1¸SÔAˆô ˜˜e¤T¨"£XÓ.Ð.øô ô ;Ü�C˜Ð!5°a°SÐ9Ó:Õ:ûð;ûô ô 'Ü�‰Ð+¨QÔ/Ü�C˜œs 1›vÓ&Õ&ûð'ús<   Á3D! Ã3E	 Ä!EÄ,EÄ;EÅEÅ	F
Å+FÅ?F
ÆF
c               ó    € V ^8„  d   QhRRRR/# r~  r   )r   s   "r   r   r   È  s   € ÷ ñ  dð ¨tñ r   c                óV  € \        4       p ^ RIHp V! 4       pTP                  R Uu/ uF  qU\	        VP                  V4      4      bK  	  upVP                  R4      ;'       g    RR7       \        W4      # u upi   \         d!   p\        P                  RT4        Rp?L6Rp?ii ; i)rP   )Úcheck_voice_requirementsÚdetailsr   )rè  z2voice.toggle status: requirements probe failed: %sN)r©  Úaudio_availableÚstt_available)
r$  r­   rç  Úupdater-   r4   rK   rx   rB  rQ  )rR  r]  r   rç  r¸  Úkrz   s   &&     r   Ú_voice_toggle_statusrí  È  s�   € ô $Ó%€GðPÝ=Ù'Ó)ˆØ�‰Ñ6gÓhÑ6g°œ4 §¡¨£Ó,Ò,Ñ6gÑhØ#Ÿx™x¨	Ó2×8Ð8°bð 	ô 	:ô
 ˆsÓÐùò iøäô Pä�‰ÐKÈQ×OÑOûðPús.   ŒA= ¨#A8ÁA= Á%A= Á8A= Á=B(ÂB#Â#B(c               ó    € V ^8„  d   QhRRRR/# r~  r   )r   s   "r   r   r   ×  s   € ÷ @ñ @ Dð @¨Tñ @r   c                ó  € VP                  R 4      R8H  pV'       d   RMR\        P                  R&   RpV'       dV   \        P                  ! \
        4      ;_uu_ 4        ^ RIHp V! 4       pRRR4       \        4       '       d   \        RR	4       M ^ R
I
Hp V! 4        \        R4       \!        V \#        VR7      4      #   + '       g   i     L\; i  \         d     LA\
         d!   p\        P                  RT4        Rp?LfRp?ii ; i)ÚactionÚonr0   rg   r/   r   )Úvoice_stop_hintNútui:voice-ttsTrF   z3voice: stop_continuous failed during toggle off: %sF)Ú	stop_hint)r4   r2   r3   rI   rJ   rK   r	  rò  ra   rƒ   rL   rG   r;   rx   rB  Ú_set_voice_ttsrQ  r$  )rR  r]  r!  rô  rò  rG   rz   s   &&     r   Ú_voice_toggle_moderö  ×  sÌ   € Ø�j‰j˜Ó" dÑ*€Gß(/¡°S„B‡J�Jˆ~ÑØ€Ißä× Ò ¤×+Õ+ÝCÙ'Ó)ˆI÷ ,ô ×ÒÜ˜_¨dÔ3øð	UÝ8ÙÔô
 	�uÔÜˆsÔ)°IÔ>Ó?Ð?÷! ,×+ûô ô 	ÙÜô 	UÜ�N‰NÐPÐRS×TÑTûð	Uús0   ÁC ÂC Ã C	ÃD
Ã D
Ã)D
Ã*DÄD
c               ó    € V ^8„  d   QhRRRR/# )r   rñ  r-   r   r   r   )r   s   "r   r   r   ð  s   € ÷ *ñ *�tð * ñ *r   c                ó€   € V '       d   RMR\         P                  R&   V '       g   \        RR7       \        RV 4       R# )z\Flip TTS; off silences live speech. The lease pre-loads the engine (on) / releases it (off).r0   rg   r`   Frh   ró  N)r2   r3   rj   rƒ   )rñ  s   &r   rõ  rõ  ð  s*   € ç,.¡S°C„B‡J�JÐ!Ñ"ßÜ EÕ*Ü�_ bÖ)r   c               ó    € V ^8„  d   QhRRRR/# r~  r   )r   s   "r   r   r   ø  s   € ÷ -ñ - 4ð -¨Dñ -r   c                ó”   € \        4       '       g   \        V R R4      # \        \        4       '       * 4       \	        V \        4       4      # )i®  z"enable voice mode first: /voice on)r6   r·  rõ  ra   rQ  r$  rš  s   &&r   Ú_voice_toggle_ttsrû  ø  s;   € Ü× Ò Ü�C˜ÐCÓDÐDÜÔ)Ó+Ô+Ô,ÜˆsÔ)Ó+Ó,Ð,r   Ústatusrñ  rB   r"  zvoice.togglec               ó    € V ^8„  d   QhRRRR/# r~  r   )r   s   "r   r   r     s   € ÷  ñ  �4ð  ˜Dñ  r   c                ó¸   € VP                  RR4      p\        V\        4      '       d   \        P                  V4      MRpVf   \	        V RRV 24      # V! W4      # )z¤CLI parity for ``/voice``: ``status``; ``on``/``off`` flip voice *mode* (off also tears
down the continuous loop); ``tts`` toggles speech output (requires mode on).rð  rü  Ni­  úunknown voice action: )r4   r  r   Ú_VOICE_TOGGLE_ACTIONSr·  )rR  r]  rð  Úhandlers   &&  r   rƒ  rƒ    s[   € ð �Z‰Z˜ (Ó+€FÜ3=¸fÄc×3JÒ3JÔ#×'Ñ'¨Ô/ÐPT€GØ‚Ü�C˜Ð!7¸°xÐ@ÓAÐAÙ�3ÓÐr   c               ó    € V ^8„  d   QhRRRR/# )r   r   ræ   r   r   r   )r   s   "r   r   r     s   € ÷ ñ ˜Dð  Tñ r   c                ó2   € \        R V 4       \        4        R# )r  N©r#   r*   )r   s   &r   Ú_vr_transcriptr    s   € ÜÐ" GÔ,ÜÖr   c                óH   € \        \        R RR7       \        RRRV /4       R# )FTrn   r  r  N)ro   r
   r  ©Úts   &r   Ú_vr_on_stop_phraser	    s"   € ô Ô.¸%È$ÕOÜ�M 4¨°Ð3Ö4r   c                 ó>   € \        \        4       \        R R/4       R# )Úno_speech_limitTN)rC   r
   r  r   r   r   Ú_vr_on_silent_limitr    s   € ÜÔ-Ô.ÜÐ% tÐ,Ö-r   c                óH   € \        R RV /4       V R8X  d   \        4        R# R# )zvoice.statusr®   ÚidleNr  )r®   s   &r   Ú_vr_on_statusr  "  s#   € Ü� ¨%Ð 0Ô1Ø�„ÜÖñ r   zvoice.recordc               ó    € V ^8„  d   QhRRRR/# r~  r   )r   s   "r   r   r   )  s   € ÷ H'ñ H'�4ð H'˜Dñ H'r   c                ó(  € VP                  RR4      pRpVR'9  d   \        V RRV 24      # \        4       p\        4       w  rVVe   WTJd   \	        V RR	R
R/4      #  VR8X  d.   \        VP                  R4      4      '       g   \        V RR4      # VP                  R4      ;'       g    Rp\        '       d)   V\        8w  d   \        4       '       d   \        V RR4      # \        ;_uu_ 4        T;'       g    \        s	Vs
RRR4       VR8X  d(   ^ RIHp V! RR7       \        4        \	        V RR/4      # \        RR7       ^ RIHp	 \         P"                  ! \$        4      ;_uu_ 4        ^ RIHp
 V
! \(        4       RRR4       \+        4       p\-        VP                  R4      R4      p\         P"                  ! \$        4      ;_uu_ 4        ^ RIHp V! VR7      pRRR4       V'       d   \        ;_uu_ 4        VsRRR4       \4        pT	! V! R 4      \6        V! \8        4      \-        VP                  R4      ^È4      \-        VP                  R4      R 4      RV^ 8”  d   TMR!V! \:        4      V! R" 4      R#7	      pVRJ d   \        4        M\        ;_uu_ 4        VsRRR4       \	        T RVRJ d   R	/4      # R$/4      #   + '       g   i     ELË; i  + '       g   i     ELb; i  + '       g   i     EL; i  + '       g   i     EL
; i  + '       g   i     L{; i  \$         db   pT'       g   TR8X  d   \        4        \=        T\>        4      '       d   \        T R%R&4      u Rp?# \        T R%\A        T4      4      u Rp?# Rp?ii ; i)(z­VAD-bounded push-to-talk. ``start`` emits ``voice.transcript`` when silence stops the
capture; ``stop`` forces transcription. Three silent captures emit ``no_speech_limit``.rð  r‚   Fr–   i³  rÿ  Nrü  ÚbusyrN  Ú
wake_ownedr<   i¯  u+   voice mode is off â€” enable with /voice onr   i°  z(voice capture is busy in another sessionrF   T)Úforce_transcriber¾  rh   )Ústart_continuous)Úset_voice_busy_probeÚmax_recording_secondsg      ^@rÃ  r(   c                ó   € \        R V /4      # )r  )r  r  s   &r   rô   Ú_.<locals>.<lambda>_  s   € ¬¸À¸Ô)Dr   Úsilence_thresholdÚsilence_durationg      @g        c                ó   € \        R RV /4      # )zvoice.partialr  )r#   r  s   &r   rô   r  e  s   € ¤k°/ÀFÈAÀ;Ô&Or   )	Úon_transcriptÚ	on_statusÚon_silent_limitr  r  Úauto_restartr  Úon_stop_phraseÚ
on_partialÚ	recordingi¡  u9   voice module not available â€” install audio dependencies>   r–   r‚   )!r4   r·  r   r)  rQ  r>   r
   rS   r   r   r	   rL   rG   r*   rj   r  rI   rJ   rK   r  r�   rº   r  r.  rr  r   r]   r  r  r	  r  r;   r   )rR  r]  rð  Úwake_pausedr!   Ú
wake_ownerr2  r    rG   r  r  r  Úmax_recrr  ÚliverŸ  rz   s   &&               r   rƒ  rƒ  (  sæ  € ð �Z‰Z˜ 'Ó*€FØ€KØÐ&Ô&Ü�C˜Ð!7¸°xÐ@ÓAÐAÜ!Ó#€IÜ/Ó1Ñ€JØÒ *Ó"=Ü�3˜ 6¨8°\ÐBÓCÐCð='à�WÔÔ%;¸F¿J¹JÀ|Ó<T×%UÒ%UÜ˜˜TÐ#PÓQÐQØ�j‰j˜Ó&×,Ð,¨"ˆßÓ #Ô);Ô";ÄÇÂÜ˜˜TÐ#MÓNÐNßŽ_Ø"×6Ð6Ô&6ÐØ%.Ð"÷ ð �VÔÝ8Ù¨TÕ2ÜÔ Ü�s˜X yÐ1Ó2Ð2ô
 	 DÕ)Ý5ô × Ò ¤×+Õ+Ý=Ù Ô!5Ô6÷ ,ô $Ó%ˆ	Ü# I§M¡MÐ2IÓ$JÈEÓRˆä× Ò ¤×+Õ+Ý7Ù)°	Ô:ˆK÷ ,÷ ß –Ø$-Ð!÷ !ä&ˆÙ"ÙÑDÓEÔQ^Ù Ô!4Ó5Ü/°	·±Ð>QÓ0RÐTWÓXÜ.¨y¯}©}Ð=OÓ/PÐRUÓVØÀÈ1Ä±gÐRUÙÔ 2Ó3ÙÑOÓPôRˆð �eÓÜÕ ç –Ø%(Ð"÷ !ä�3˜¨W¸Ó-= 6ÐOÓPÐPÀ;ÐOÓPÐP÷a �_ˆ_ú÷  ,×+Ð+ú÷ ,×+Ð+ú÷ !—�ú÷ !—ûô ô 'ß˜& FÔ*ÜÔ Ü�aœ×%Ò%Ü˜˜TÐ#^Ó_Õ_Ü�C˜œs 1›vÓ&Õ&ûð'úsÎ   Á3L% ÂL% Â(L% Â7'L% ÃL% Ã-KÄ 5L% Ä64L% Å*KÅ=AL% ÇK*ÇL% Ç,L% Ç:K>Ç=BL% ÊLÊL% Ê;L% ËK	Ë	L% ËK'	Ë!	L% Ë*K;	Ë5	L% Ë>L	Ì		L% ÌL"	ÌL% Ì%NÌ0;NÍ+NÍ1NÎNÎNz	voice.ttsc               ó    € V ^8„  d   QhRRRR/# r~  r   )r   s   "r   r   r   u  s   € ÷ 	,ñ 	,�4ð 	,˜Dñ 	,r   c           	     óZ  € VP                  R R4      pV'       g   \        V RR4      #  ^ RIp\        P                  ! \        T3RR7      P                  4        \        T R	R
/4      #   \         d9   p\        T R\	        T\
        4      '       d   RM
\        T4      4      u Rp?# Rp?ii ; i)r  r   i´  ztext requiredNr¨  zvoice module not availableTr•   rü  Úspeaking)r4   r·  rL   rK   r  r;   r   r€   r�   r  r‚   rQ  )rR  r]  r  Ú
hermes_clirz   s   &&   r   rƒ  rƒ  t  s˜   € à�:‰:�f˜bÓ!€DßÜ�C˜˜Ó/Ð/ðgÛô ×ÒÔ2¸$¸ÈÔN×TÑTÔVÜˆs�X˜zÐ*Ó+Ð+øô ô gÜ�C˜¼zÈ!Ì[×?YÒ?YÑ;Ô_bÐcdÓ_eÓfÕfûðgús   ©A' Á'B*Á2-B%ÂB*Â%B*c               ó   € V ^8„  d   QhRR/# r%   r   )r   s   "r   r   r   �  s   € ÷ 0ñ 0˜ñ 0r   c                ó2   € \        \        4       V RR7       R# )rƒ  )ÚskipN)rƒ  )r   Úglobalsr‹  s   &r   Úregisterr0  �  s   € Ü”“	˜6¨×/r   r   )T)NÚ__conditional_annotations__Ú__doc__Ú
__future__r   rI   r€   Ú
method_ctxr   r   Ú	_registryÚmethodÚLockr   r   Ú__annotations__r   r	   r
   rH   r   r#   r*   r6   r>   rC   rM   rS   r]   ra   rk   ro   rƒ   rŒ   r�   r�   r�   r    rj   r³   r´   r¬   r¯   r¶   rž   rÄ   rµ   rÝ   rÓ   rÞ   r  rº   r  r$  r'  r%  r(  r)  r/  r3  r@  rA  r'   rJ  rT  r[  rh  r|  rƒ  rí  rö  rõ  rû  r   r  r	  r  r  r0  )r1  s   @r   Ú<module>r9     s@  øðôõ #ã Û ç 4áÓ€	Ø	×	Ñ	€ð —.’.Ó"€ØÐ �#Ó Ø)-Ð Ð&Ó -ð /3Ð Ð+Ó 2ð Ð �CÓ ØÐ ò3÷	#õ%õ=õ;õõ
õ(ò
õAõ	/õ/õ	RõCõ
ð —>’>Ó#Ð Ø$(Ð �>Ó (õ÷,ð4 —N’NÓ$Ð ØÐ ÙDGÃEÐ ÐAÓ Iõbõ$õ6õ (õF\õ%õ<hõ%õ(<òaõ
nð �^Š^Ó€
Ø-1Ð Ð*Ó 1ØÐ ò:õ
õDð
 $Ÿ.š.Ó*Ð Ø!Ð ð!Àdð !Ø25÷!õHõQõ
mõXõñ. ÐÓôZó  ðZñ ÐÓôhó ðhñ( ˆƒô$ó ð$ñ ˆÓô9!ó ð9!ñx ˆÓôYó ðYñ ˆÓô	0ó ð	0ñ ˆÓô2ó ð2ñ ˆÓô#'ó ð#'ñL ˆÓô/ó ð/õ4õ@õ2*õ-ð Ð" DÐ*<¸eÐEWØ	ÐðÐ ñ
 ˆÓô ó ð õò
5ò.ò
ñ ˆÓôH'ó ðH'ñV ˆÓô	,ó ð	,÷0r   