+
    „WÝjZž  ã                  óœ   € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	H
t
 ^ RIHt ^ RIHt R R ltR tR	 R
 lt ! R R4      tR# )uV  Voice mode (recording, STT, TTS, full-duplex barge-in) and wake-word listener handlers for the interactive CLI

Mixin split out of ``cli.py``; bound onto ``HermesCLI`` via the MRO. cli.py-internal
symbols are imported LAZILY inside each method (``from cli import ...``) â€” the mixin
never imports ``cli`` at module load time (import cycle).
)ÚannotationsN)Út)Ú	is_termux)ÚOptionalc               ó    € V ^8„  d   QhRRRR/# )é   ÚnameÚstrÚreturnÚdict© )Úformats   "ÚNC:\Users\johnn\AppData\Local\hermes\hermes-agent\hermes_cli\cli_voice_mixin.pyÚ__annotate__r      s   € ÷ ñ ˜#ð  $ñ ó    c                ó–   €  ^ RI Hp V! 4       P                  V 4      p\        V\        4      '       d   V# / #   \
         d    / u # i ; i)a  ``load_config()[name]`` coerced to a dict.

Shape-safe: a hand-edited ``voice: true`` / ``voice: cmd+b`` leaves the section as a
non-dict; return {} so callers fall back to documented defaults instead of crashing on
``.get()``. Config load failures also yield {}.
©Úload_config)Úhermes_cli.configr   ÚgetÚ
isinstancer   Ú	Exception)r   r   Úsections   &  r   Ú_config_sectionr      sG   € ðÝ1Ù“-×#Ñ# DÓ)ˆÜ$ W¬d×3Ò3ˆwÐ;¸Ð;øÜô ØŠ	ðús   ‚38 ¶8 ¸AÁAc                ón   € \        V \        \        34      '       d   \        V \        4      '       g   V # T# )uÐ   ``value`` if it is a real int/float, else ``default``.

``bool`` is excluded â€” it subclasses int, so a hand-edited ``silence_threshold: true``
would otherwise be forwarded as ``1`` instead of falling back.
)r   ÚintÚfloatÚbool)ÚvalueÚdefaults   &&r   Ú_numeric_orr    %   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
   ÚNoner   )r   s   "r   r   r   .   s   € ÷ ñ ˜Tñ r   c                óº   €  V '       d@   \         P                  P                  V 4      '       d   \         P                  ! V 4       R # R # R #   \         d     R # i ; i©N)ÚosÚpathÚisfileÚunlinkÚOSError©r'   s   &r   Ú_unlink_quietlyr,   .   s@   € ðß”B—G‘G—N‘N 4×(Ò(Ü�IŠI�dŽOñ )‰4øäô Úðús   ‚A Š$A ¯A ÁAÁAc                  ó  € ] tR t^6tR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 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 tR tR,R R  lltR,R! R" lltR# tR$ tR% tR& R' ltR( tR) tR*tR+# )-ÚCLIVoiceMixinznVoice mode (recording, STT, TTS, full-duplex barge-in) and wake-word listener handlers for the interactive CLIc               ó   € V ^8„  d   QhRR/# r"   r   )r   s   "r   r   ÚCLIVoiceMixin.__annotate__9   s   € ÷ #ñ # 4ñ #r   c                óŠ   € \        V R4      '       d1   V P                  '       d   V P                  P                  4        R# R# R# )zFRepaint the TUI (audio level indicator / status) when the app is live.Ú_appN)Úhasattrr2   Ú
invalidate©Úselfs   &r   Ú_voice_invalidateÚCLIVoiceMixin._voice_invalidate9   s/   € ä�4˜× Ò  T§Y§Y YØ�I‰I× Ñ Ö"ñ &/Ñ r   c                ó  a aaa€ ^ RI HpHoHoHo \        S RR4      '       d   R# ^ RIHpHp V! 4       pVR,          '       g‚   \        4       '       d@   RVP                  RR	4      9   d   \        \        R
4      4      h\        \        R4      4      h\        \        R4      R,           VP                  RR	4      ,           4      hVP                  RVP                  R4      4      '       g   \        \        R4      4      hS P                  ;_uu_ 4        S P                  '       d    RRR4       R# RS n        RRR4       \        R4      pS P                   f    V! 4       S n        S P                   pR	S n        S P&                  Vn        \+        VP                  R4      ^È4      Vn        \+        VP                  R4      R4      Vn        \+        VP                  R4      R4      pVe   V^ 8”  d   TMRMRVn        VVVV 3R lpS P3                  R^R7        S P                   P5                  VR7       S P7                  4       p	\        S P                   RR4      '       d   \        RT	R7      p
M+\        4       '       d   \        R T	R7      p
M\        R!T	R7      p
S! RT \        R"4       S R#S R$T
 R%S 2
4       T 3R& lp\8        P:                  ! TRR'7      P5                  4        R#   + '       g   i     ELº; i  \"         d:    S P                  ;_uu_ 4        RS n        RRR4       h   + '       g   i     h ; ii ; i  \"         d:    S P                  ;_uu_ 4        RS n        RRR4       h   + '       g   i     h ; ii ; i)(z*Start capturing audio from the microphone.©Ú_ACCENTÚ_DIMÚ_RSTÚ_cprintÚ_should_exitFN)Úcreate_audio_recorderÚcheck_voice_requirementsÚaudio_availablez'Termux:API Android app is not installedÚdetailsÚ z cli.voice.err_termux_app_missingzcli.voice.err_mic_accesszcli.voice.err_audio_captureÚ
Ústt_availableÚstt_key_setzcli.voice.err_stt_providerTÚvoiceÚsilence_thresholdÚsilence_durationg      @Úmax_recording_secondsç        g      ^@c                 ó  <€ SP                   ;_uu_ 4        SP                  '       g    RRR4       R#  RRR4       S! RS  \        R4       S 24       SP                  4        SP	                  4        R#   + '       g   i     LJ; i)z>Called by AudioRecorder when silence is detected after speech.NrE   zcli.voice.silence_autostop)Ú_voice_lockÚ_voice_recordingr   r7   Ú_voice_stop_and_transcribe)r<   r=   r>   r6   s   €€€€r   Ú_on_silenceÚ9CLIVoiceMixin._voice_start_recording.<locals>._on_silencen   so   ø€ à×!×!Ó!Ø×,×,Ð,Ø÷ "Ñ!Ø,÷ "ñ �b˜˜œqÐ!=Ó>Ð?À¸vÐFÔGØ×"Ñ"Ô$Ø×+Ñ+Ö-÷ "×!ús   –A7Á7B	ip  ©Ú	frequencyÚcount)Úon_silence_stopÚsupports_silence_autostopzcli.voice.hint_continuous©Úshortcutzcli.voice.hint_termuxzcli.voice.hint_stopzcli.voice.recordingÚ Ú(Ú)c                 óâ   <€  SP                   ;_uu_ 4        SP                  p RRR4       X '       g   R# SP                  4        \        P                  ! R4       K\    + '       g   i     LB; i)TNg333333Ã?)rN   rO   r7   ÚtimeÚsleep)Ústill_recordingr6   s    €r   Ú_refresh_levelÚ<CLIVoiceMixin._voice_start_recording.<locals>._refresh_levelŠ   sI   ø€ ØØ×%×%Ó%Ø&*×&;Ñ&;�O÷ &ç&ÙØ×&Ñ&Ô(Ü—
’
˜4Ö ÷ &×%ús   —AÁA.	©ÚtargetÚdaemon)Úclir;   r<   r=   r>   ÚgetattrÚtools.voice_moder@   rA   Ú_is_termux_environmentr   ÚRuntimeErrorr   rN   rO   r   Ú_voice_recorderr   Ú_voice_live_textÚ_voice_on_live_partialÚon_live_partialr    Ú_silence_thresholdÚ_silence_durationÚ_max_recording_secondsÚ_voice_beepÚstartÚ_voice_record_key_labelÚ	threadingÚThread)r6   r;   r@   rA   ÚreqsÚ	voice_cfgÚrecÚ_max_recrQ   Ú_labelÚ_recording_hintra   r<   r=   r>   s   f           @@@r   Ú_voice_start_recordingÚ$CLIVoiceMixin._voice_start_recording>   s
  û€ ç4Ó4Ü�4˜¨×/Ò/ÙßTá'Ó)ˆØÐ%×&Ô&Ü%×'Ò'à<ÀÇÁÈÐTVÓ@WÔWÜ&¤qÐ)KÓ'LÓMÐMÜ"¤1Ð%?Ó#@ÓAÐAô œqÐ!>Ó?À$ÕFÈÏÉÐR[Ð]_ÓI`Õ`ÓaÐaØ�x‰x˜¨¯©°-Ó)@×AÒAÜœqÐ!=Ó>Ó?Ð?ð ××ÓØ×$×$Ð$Ø÷ Ñð %)ˆDÔ!÷ ô
 $ GÓ,ˆ	ð ×ÑÒ'ðÙ'<Ó'>�Ô$ð ×"Ñ"ˆØ "ˆÔØ"×9Ñ9ˆÔÜ!,¨Y¯]©]Ð;NÓ-OÐQTÓ!UˆÔÜ +¨I¯M©MÐ:LÓ,MÈsÓ SˆÔä˜yŸ}™}Ð-DÓEÀtÓLˆØLTÒL`°(¸Q´,¡hÁCÐfkˆÔ"÷	.ð 	.ð 	×Ñ 3¨aÐÔ0ð	Ø× Ñ ×&Ñ&°{Ð&ÔCð
 ×-Ñ-Ó/ˆÜ�4×'Ñ'Ð)DÀd×KÒKÜÐ ;ÀfÔM‰OÜ#×%Ò%ÜÐ 7À&ÔI‰OäÐ 5ÀÔGˆOÙ�"�W�IœaÐ 5Ó6Ð7¸°v¸Q¸t¸fÀAÀoÐEVÐVWÐX\ÐW]Ð^Ô_õ	!ô 	×Ò °tÔ<×BÑBÖD÷ ×Ðûô ô Ø×%×%Ó%Ø,1�DÔ)÷ &à÷ &Ö%àúðûô: ô 	Ø×!×!Ó!Ø(-�Ô%÷ "à÷ "Ö!àúð	úsZ   ÄK*Ä2K*ÅK> ÈM Ë*K;	Ë>MÌL.Ì%	MÌ.L>Ì9	MÍN	Í$M5Í,	N	Í5NÎ 	N	c               ó$   € V ^8„  d   QhRRRRRR/# )r   rT   r   rU   r
   r#   r   )r   s   "r   r   r0   ”   s!   € ÷ ñ ¨ð °Cð ¸Dñ r   c               óz   € V P                  4       '       d    ^ RIHp V! WR7       R# R#   \         d     R# i ; i)z9Play a record start/stop beep when enabled; never raises.)Ú	play_beeprS   N)Ú_voice_beeps_enabledrh   r�   r   )r6   rT   rU   r�   s   &$$ r   rr   ÚCLIVoiceMixin._voice_beep”   s:   € à×$Ñ$×&Ò&ðÝ6Ù I×;ñ 'øô ô Úðús   ˜+ «:¹:c               ó   € V ^8„  d   QhRR/# )r   r
   zOptional[str]r   )r   s   "r   r   r0   �   s   € ÷ 'ñ ' -ñ 'r   c                ó`  € \        R4      p\        VP                  R4      ;'       g    R4      P                  4       P	                  4       R8X  dO   VP                  R4      ;'       g    / p\        V\        4      '       g   / pVP                  R4      ;'       g    R# VP                  R4      # )zÅSTT model override from config, or None for the provider default.

For the local provider, prefer stt.local.model (default ``base``) so the CLI passes
a real model name into the local STT backend.
ÚsttÚproviderrD   ÚlocalÚmodelÚbase)r   r	   r   ÚstripÚlowerr   r   )r6   Ú
stt_configÚlocal_configs   &  r   Ú_voice_stt_modelÚCLIVoiceMixin._voice_stt_model�   sŽ   € ô % UÓ+ˆ
Üˆz�~‰~˜jÓ)×/Ð/¨RÓ0×6Ñ6Ó8×>Ñ>Ó@ÀGÔKØ%Ÿ>™>¨'Ó2×8Ð8°bˆLÜ˜l¬D×1Ò1Ø!�Ø×#Ñ# GÓ,×6Ð6°Ð6Ø�~‰~˜gÓ&Ð&r   c               ó   € V ^8„  d   QhRR/# )r   r
   r	   r   )r   s   "r   r   r0   «   s   € ÷ Qñ Q Sñ Qr   c                ó”   € \        \        R4      P                  R4      ;'       g    R4      P                  4       P	                  4       # )z;Configured STT provider name (lowercased), or empty string.r†   r‡   rD   )r	   r   r   r‹   rŒ   r5   s   &r   Ú_voice_stt_providerÚ!CLIVoiceMixin._voice_stt_provider«   s7   € ä”? 5Ó)×-Ñ-¨jÓ9×?Ð?¸RÓ@×FÑFÓH×NÑNÓPÐPr   c               ó   € V ^8„  d   QhRR/# r"   r   )r   s   "r   r   r0   ¯   s   € ÷ 	Iñ 	I°ñ 	Ir   c                ó€   a aaa€ ^ RI HoHoHo VVVV 3R lp\        P
                  ! VRR7      P                  4        R# )zARestart continuous-mode recording off-thread (start() can block).©r<   r=   r>   c            	     ó®   <€  SP                  4        SP                  4        R#   \         d%   p S! S \        R T R7       S 24        Rp ? R# Rp ? ii ; i)zcli.voice.autorestart_failed©ÚerrorN)r}   r7   r   r   )Úer<   r=   r>   r6   s    €€€€r   Ú_restart_recordingÚHCLIVoiceMixin._voice_restart_recording_async.<locals>._restart_recording²   sT   ø€ ðUØ×+Ñ+Ô-Ø×&Ñ&Ö(øÜô UÙ˜4˜&¤Ð#AÈÔ!KÐ LÈTÈFÐS×TÒTûðUús   ƒ % ¥A°AÁATrc   N)rf   r<   r=   r>   ru   rv   rs   )r6   rœ   r<   r=   r>   s   f @@@r   Ú_voice_restart_recording_asyncÚ,CLIVoiceMixin._voice_restart_recording_async¯   s1   û€ ç+Ñ+÷	Uð 	Uô 	×ÒÐ 2¸4Ô@×FÑFÖHr   c               ó    € V ^8„  d   QhRRRR/# ©r   Útextr	   r
   r#   r   )r   s   "r   r   r0   º   s   € ÷ !ñ !¨3ð !°4ñ !r   c                ó2   € Wn         V P                  4        R# )zULive STT partial (``stt.streaming``): shown in the input placeholder while recording.N)rl   r7   ©r6   r¢   s   &&r   rm   Ú$CLIVoiceMixin._voice_on_live_partialº   s   € à $ÔØ×ÑÖ r   c           
     ó€  € ^ RI HpHpHpHp V P
                  ;_uu_ 4        V P                  '       g    RRR4       R# RV n        RV n        RRR4       RpRpRp V P                  Ef¨    V P
                  ;_uu_ 4        RV n        RRR4       RV n	        V P                  4         V'       d^   \        P                  P                  V4      '       d9   V'       d   V! V \        RVR7       V 24       M\        P                  ! V4       Rp\#        V RR4      p	\%        \#        V R	R4      ;'       g"    V	RJ;'       d    V	P'                  4       '       * 4      p
V'       d	   ^ V n        MYV
'       gR   \#        V R
^ 4      ^,           V n        V P(                  ^8¼  d(   RV n        ^ V n        V! V \        R4       V 24       RpV P*                  '       d;   V'       g1   V P                  '       g   V'       g   V P-                  4        R# R# R# R# R# V P                  P/                  4       pV P1                  R^R7       VEf¿   V! V \        R4       V 24        V P
                  ;_uu_ 4        RV n        RRR4       RV n	        V P                  4         V'       d^   \        P                  P                  V4      '       d9   V'       d   V! V \        RVR7       V 24       M\        P                  ! V4       Rp\#        V RR4      p	\%        \#        V R	R4      ;'       g"    V	RJ;'       d    V	P'                  4       '       * 4      p
V'       d	   ^ V n        MYV
'       gR   \#        V R
^ 4      ^,           V n        V P(                  ^8¼  d(   RV n        ^ V n        V! V \        R4       V 24       RpV P*                  '       d;   V'       g1   V P                  '       g   V'       g   V P-                  4        R# R# R# R# R# V P                  4        V P3                  4       pV P5                  4       R8X  d   V! V \        RVR7       V 24       MV! V \        R4       V 24       ^ RIHp ^ RIHp V! W{R7      pVP?                  R4      '       Edj   VP?                  RR4      PA                  4       '       EdC   VR,          PA                  4       pV! V4      '       EdÏ   V! V \        R4       V 24       V PC                  4         V P
                  ;_uu_ 4        RV n        RRR4       RV n	        V P                  4         V'       d^   \        P                  P                  V4      '       d9   V'       d   V! V \        RVR7       V 24       M\        P                  ! V4       Rp\#        V RR4      p	\%        \#        V R	R4      ;'       g"    V	RJ;'       d    V	P'                  4       '       * 4      p
V'       d	   ^ V n        MYV
'       gR   \#        V R
^ 4      ^,           V n        V P(                  ^8¼  d(   RV n        ^ V n        V! V \        R4       V 24       RpV P*                  '       d;   V'       g1   V P                  '       g   V'       g   V P-                  4        R# R# R# R# R# V PD                  PG                  4        V P                  4        V PH                  PK                  V! V4      4       RpMnVP?                  R4      '       d   V! V \        R4       V 24       M?T! RT \        RVP?                  R4      ;'       g    \        R4      R7       V 24       Rp V P
                  ;_uu_ 4        RV n        RRR4       RV n	        V P                  4         V'       d^   \        P                  P                  V4      '       d9   V'       d   V! V \        RVR7       V 24       M\        P                  ! V4       Rp\#        V RR4      p	\%        \#        V R	R4      ;'       g"    V	RJ;'       d    V	P'                  4       '       * 4      p
V'       d	   ^ V n        MYV
'       gR   \#        V R
^ 4      ^,           V n        V P(                  ^8¼  d(   RV n        ^ V n        V! V \        R4       V 24       RpV P*                  '       d;   V'       g1   V P                  '       g   V'       g   V P-                  4        R# R# R# R# R#   + '       g   i     ELÎ; i  + '       g   i     EL§; i  \          d     EL;i ; i  + '       g   i     ELÝ; i  \          d     ELqi ; i  + '       g   i     ELU; i  \          d     ELéi ; i  \          d*   pT! RT \        RTR7       T 24       TRJp Rp?EL[Rp?ii ; i  + '       g   i     ELP; i  \          d     ELäi ; i  T P
                  ;_uu_ 4        RT n        RRR4       M  + '       g   i     M; iRT n	        T P                  4         T'       d^   \        P                  P                  T4      '       d9   T'       d   T! T \        RTR7       T 24       M(\        P                  ! T4       M  \          d     Mi ; iRp\#        T RR4      p	\%        \#        T R	R4      ;'       g"    T	RJ;'       d    T	P'                  4       '       * 4      p
T'       d	   ^ T n        MYT
'       gR   \#        T R
^ 4      ^,           T n        T P(                  ^8¼  d(   RT n        ^ T n        T! T \        R4       T 24       RpT P*                  '       d7   T'       g.   T P                  '       g   T'       g   T P-                  4        i i i i i ; i)zFStop recording, transcribe via STT, and queue the transcript as input.)r<   r=   Ú_VoiceInputMessager>   NFTrD   zcli.voice.recording_preservedr+   Ú_voice_tts_doneÚ_agent_runningÚ_no_speech_countzcli.voice.no_speech_stopi”  rS   zcli.voice.no_speechrˆ   zcli.voice.preparing_stt©r‰   zcli.voice.transcribing©Úis_voice_stop_phrase©Útranscribe_recordingÚsuccessÚ
transcriptúcli.voice.stop_phraserE   úcli.voice.transcription_failedrš   úcli.shared.unknown_errorr™   úcli.voice.processing_error)&rf   r<   r=   r§   r>   rN   rO   Ú_voice_processingrk   rl   r7   r&   r'   r(   r   r)   r   rg   r   Úis_setrª   Ú_voice_continuousrž   Ústoprr   r�   r“   Útools.voice_mode_transcriptr­   rh   r¯   r   r‹   Ú_disable_voice_modeÚ_attached_imagesÚclearÚ_pending_inputÚput)r6   r<   r=   r§   r>   Ú	submittedÚtranscription_failedÚwav_pathÚstop_continuous_restartÚ	_tts_doneÚ_activity_holdÚ	stt_modelr­   r¯   Úresultr±   r›   s   &                r   rP   Ú(CLIVoiceMixin._voice_stop_and_transcribe¿   s«
  € ç?Ó?ð ××ÓØ×(×(Ð(Ø÷ Ñð %*ˆDÔ!Ø%)ˆDÔ"÷	 ð ˆ	Ø$ÐØˆðM	6Ø×#Ñ#Ó+ØðH ×!×!Ó!Ø).�Ô&÷ "à$&ˆDÔ!Ø×"Ñ"Ô$ðß¤§¡§¡¨x× 8Ò 8ß+Ù 4 &¬Ð+JÐQYÔ)ZÐ([Ð\`Ð[aÐ bÕcäŸ	š	 (Ô+ð ',Ð#Ü Ð&7¸Ó>ˆIÜ!Ü˜Ð.°Ó6÷ Fð FØ TÐ)×DÐD°)×2BÑ2BÓ2DÔ.DóGˆN÷ Ø()�Õ%ß#Ü(/°Ð6HÈ!Ó(LÈqÕ(P�Ô%Ø×(Ñ(¨AÔ-Ø-2�DÔ*Ø,-�DÔ)Ù˜t˜f¤QÐ'AÓ%BÐ$CÀDÀ6ÐJÔKØ.2Ð+ð ×&×&Ð&ß!Ø×-×-Ð-ß/Ø×3Ñ3Ö5ñ 0ñ .ñ "ñ 'ðM ×+Ñ+×0Ñ0Ó2ˆHà×Ñ s°!ÐÔ4ØÓÙ˜4˜&¤Ð#8Ó!9Ð :¸4¸&ÐAÔBØð< ×!×!Ó!Ø).�Ô&÷ "à$&ˆDÔ!Ø×"Ñ"Ô$ðß¤§¡§¡¨x× 8Ò 8ß+Ù 4 &¬Ð+JÐQYÔ)ZÐ([Ð\`Ð[aÐ bÕcäŸ	š	 (Ô+ð ',Ð#Ü Ð&7¸Ó>ˆIÜ!Ü˜Ð.°Ó6÷ Fð FØ TÐ)×DÐD°)×2BÑ2BÓ2DÔ.DóGˆN÷ Ø()�Õ%ß#Ü(/°Ð6HÈ!Ó(LÈqÕ(P�Ô%Ø×(Ñ(¨AÔ-Ø-2�DÔ*Ø,-�DÔ)Ù˜t˜f¤QÐ'AÓ%BÐ$CÀDÀ6ÐJÔKØ.2Ð+ð ×&×&Ð&ß!Ø×-×-Ð-ß/Ø×3Ñ3Ö5ñ 0ñ .ñ "ñ 'ðA ×"Ñ"Ô$Ø×-Ñ-Ó/ˆIØ×'Ñ'Ó)¨WÔ4Ù˜4˜&¤Ð#<ÀIÔ!NÐ OÐPTÈvÐVÕWá˜4˜&¤Ð#;Ó!<Ð =¸d¸VÐDÔEÝHÝ=Ù)¨(ÔDˆFØ�z‰z˜)×$Ó$¨¯©°LÀ"Ó)E×)KÑ)K×)MÓ)MØ# LÕ1×7Ñ7Ó9�
Ù'¨
×3Ó3á˜t˜f¤QÐ'>Ó%?Ð$@ÀÀÐGÔHØ×,Ñ,Ô.Øð ×!×!Ó!Ø).�Ô&÷ "à$&ˆDÔ!Ø×"Ñ"Ô$ðß¤§¡§¡¨x× 8Ò 8ß+Ù 4 &¬Ð+JÐQYÔ)ZÐ([Ð\`Ð[aÐ bÕcäŸ	š	 (Ô+ð ',Ð#Ü Ð&7¸Ó>ˆIÜ!Ü˜Ð.°Ó6÷ Fð FØ TÐ)×DÐD°)×2BÑ2BÓ2DÔ.DóGˆN÷ Ø()�Õ%ß#Ü(/°Ð6HÈ!Ó(LÈqÕ(P�Ô%Ø×(Ñ(¨AÔ-Ø-2�DÔ*Ø,-�DÔ)Ù˜t˜f¤QÐ'AÓ%BÐ$CÀDÀ6ÐJÔKØ.2Ð+ð ×&×&Ð&ß!Ø×-×-Ð-ß/Ø×3Ñ3Ö5ñ 0ñ .ñ "ñ 'ða ×%Ñ%×+Ñ+Ô-Ø×&Ñ&Ô(Ø×#Ñ#×'Ñ'Ñ(:¸:Ó(FÔGØ ‘	Ø—‘˜I×&Ò&Ù˜4˜&¤Ð#8Ó!9Ð :¸4¸&ÐAÕBá˜"˜T˜F¤1Ð%EÈVÏZÉZÐX_ÓM`÷  NBð  NBÔdeð  gAó  eBô  $Cð  #Dð  EIð  DJð  Kô  LØ'+Ñ$ð
 ×!×!Ó!Ø).�Ô&÷ "à$&ˆDÔ!Ø×"Ñ"Ô$ðß¤§¡§¡¨x× 8Ò 8ß+Ù 4 &¬Ð+JÐQYÔ)ZÐ([Ð\`Ð[aÐ bÕcäŸ	š	 (Ô+ð ',Ð#Ü Ð&7¸Ó>ˆIÜ!Ü˜Ð.°Ó6÷ Fð FØ TÐ)×DÐD°)×2BÑ2BÓ2DÔ.DóGˆN÷ Ø()�Õ%ß#Ü(/°Ð6HÈ!Ó(LÈqÕ(P�Ô%Ø×(Ñ(¨AÔ-Ø-2�DÔ*Ø,-�DÔ)Ù˜t˜f¤QÐ'AÓ%BÐ$CÀDÀ6ÐJÔKØ.2Ð+ð ×&×&Ð&ß!Ø×-×-Ð-ß/Ø×3Ñ3Ö5ñ 0ñ .ñ "ñ '÷e ×Ðú÷^ "×!Ð!ûô ô Úðú÷ "×!Ð!ûô ô Úðú÷ "×!Ð!ûô ô Úðûô ô 	8Ù�b˜˜œqÐ!=ÀQÔGÐHÈÈÐOÔPØ#+°4Ð#7Ö ûð	8ú÷ "×!Ð!ûô ô Úðûð ×!×!Ó!Ø).�Ô&÷ "×!×!Ð!úà$&ˆDÔ!Ø×"Ñ"Ô$ðß¤§¡§¡¨x× 8Ò 8ß+Ù 4 &¬Ð+JÐQYÔ)ZÐ([Ð\`Ð[aÐ bÕcäŸ	š	 (Ô+ùÜô Ùðúð ',Ð#Ü Ð&7¸Ó>ˆIÜ!Ü˜Ð.°Ó6÷ Fð FØ TÐ)×DÐD°)×2BÑ2BÓ2DÔ.DóGˆN÷ Ø()�Õ%ß#Ü(/°Ð6HÈ!Ó(LÈqÕ(P�Ô%Ø×(Ñ(¨AÔ-Ø-2�DÔ*Ø,-�DÔ)Ù˜t˜f¤QÐ'AÓ%BÐ$CÀDÀ6ÐJÔKØ.2Ð+ð ×&×&Ð&ß!Ø×-×-Ð-ß/Ø×3Ñ3Õ5ð 0ð .ð "ð 'úsâ  ¡d¿dÁf Â d&Â(d: Â0$d: Ãd: Ãd: Ã7d: ÈA	f É0eÊe  Ê $e  Ëe  Ëe  Ë'e  ÐB9f Ò<%f Ó"'f Ôe2Õf Õ$f Õ3f Õ;f Öf Ú0Af Û=g5 Û>f Üf Ü,g5 Ü-"f Ýf Ý+g5 Þ gÞ(g# Þ0$g# ßg# ßg# ß7g# äd#	ä&d7	ä:e	åe	åe	å e/å.e/å2f	æfæfægæ#gçg5 çgçg5 çg 	ç#g2ç1g2ç5n=è
h	è	n=èh+è&n=éj,é$j,é3j,é;j,ên=êj,ê+n=ê,j:ê7n=ê9j:ê:6n=ë1!n=ìn=ì#A"n=în=în=î n=î(n=c               ó    € V ^8„  d   QhRRRR/# r¡   r   )r   s   "r   r   r0     s   € ÷ 	[ñ 	[°ð 	[¸ñ 	[r   c                ó^  € V P                   '       d	   V'       g   R# V P                  P                  4        \        P                  ! V P
                  V3RR7      P                  4        V P                  '       d3   \        P                  ! V P                  RR7      P                  4        R# R# )zISchedule TTS and mark it pending before continuous recording can restart.NT)rd   Úargsre   rc   )	Ú
_voice_ttsr¨   r½   ru   rv   Ú_voice_speak_responsers   r¸   Ú_voice_full_duplex_listenerr¤   s   &&r   Ú_voice_speak_response_asyncÚ)CLIVoiceMixin._voice_speak_response_async  sx   € à��ˆ§dÙØ×Ñ×"Ñ"Ô$Ü×Ò × :Ñ :À$ÀÐQUÔV×\Ñ\Ô^ð ×!×!Ð!Ü×Ò D×$DÑ$DÈTÔR×XÑXÖZñ "r   c               ó   € V ^8„  d   QhRR/# )r   r¢   r	   r   )r   s   "r   r   r0   '  s   € ÷ 5'ñ 5'¨#ñ 5'r   c           	     óè  € ^ RI HpHpHpHp V P
                  '       g   R# T P                  P                  4         ^ RIH	p ^ RI
Hp  ^ RIHp V! VRR7      p	V	'       g    V P                  P'                  4        R# W�n        \*        P,                  P/                  \0        P2                  ! 4       R4      p
\*        P4                  ! V
RR7       \*        P,                  P/                  V
R\6        P8                  ! R4       R24      pV! W›R7      p \;        V\<        4      '       d   \>        P@                  ! V4      M/ pVPC                  R4      ;'       g    VPC                  R4      ;'       g    T.pVPC                  R4      '       d   TM.  FX  p\*        P,                  PE                  V4      '       g   K*  \*        P,                  PG                  V4      ^ 8”  g   KP  V! V4       KZ  	  \'        WëVPI                  R ^4      ^ ,          R!,           .,           4       F  p\K        V4       K  	  V P                  P'                  4        R#   \         Ed%    \        P                   ! RRT4      p	\        P                   ! R	R
T	4      p	\        P                   ! RRT	4      p	\        P                   ! RR
T	4      p	\        P                   ! RR
T	4      p	\        P                   ! RR
T	4      p	\        P                   ! RRT	\        P"                  R7      p	\        P                   ! RRT	\        P"                  R7      p	\        P                   ! RRT	4      p	\        P                   ! RRT	4      p	T	P%                  4       p	 EL i ; i  \         d    / p ELNi ; i  \         d7   pTPM                  R"T4       T! T \O        R#TR$7       T 24        Rp?ELŸRp?ii ; i  T P                  P'                  4        i ; i)%zGSpeak the agent's response aloud using TTS (runs in background thread).©r<   r=   r>   ÚloggerN)Útext_to_speech_tool)Úplay_audio_file)Úprepare_spoken_text)Ú	max_charsz```[\s\S]*?```rZ   z\[([^\]]+)\]\([^)]+\)z\1zhttps?://\S+rD   z\*\*(.+?)\*\*z	\*(.+?)\*z`(.+?)`z^#+\s*)Úflagsz^\s*[-*]\s+z---+z\n{3,}z

Úhermes_voiceT)Úexist_okÚtts_z%Y%m%d_%H%M%Sz.mp3)r¢   Úoutput_pathÚ
file_pathsÚ	file_pathr°   Ú.z.oggzVoice TTS playback failed: %szcli.voice.tts_failedr™   )(rf   r<   r=   r>   rÔ   rÌ   r¨   r½   Útools.tts_toolrÕ   rh   rÖ   Útools.tts_text_normalizer×   r   ÚreÚsubÚ	MULTILINEr‹   ÚsetÚ_voice_last_tts_textr&   r'   ÚjoinÚtempfileÚ
gettempdirÚmakedirsr^   Ústrftimer   r	   ÚjsonÚloadsr   r(   ÚgetsizeÚrsplitr,   Úwarningr   )r6   r¢   r<   r=   r>   rÔ   rÕ   rÖ   r×   Útts_textÚout_dirÚmp3_pathÚ
raw_resultÚ
tts_resultÚ
play_pathsÚ	play_pathr'   r›   s   &&                r   rÍ   Ú#CLIVoiceMixin._voice_speak_response'  sþ  € ç3Ó3Ø��ˆÙØ×Ñ×"Ñ"Ô$ð/	'Ý:Ý8ð,ÝHÙ.¨t¸tÔD�÷ Øð2 × Ñ ×$Ñ$Ö&ð1 )1Ô%ô —g‘g—l‘l¤8×#6Ò#6Ó#8¸.ÓIˆGÜ�KŠK˜¨$Õ/Ü—w‘w—|‘| G¨t´D·M²MÀ/Ó4RÐ3SÐSWÐ-XÓYˆHá,°(ÔQˆJð Ü7AÀ*Ìc×7RÒ7RœTŸZšZ¨
Ô3ÐXZ�
ð $Ÿ™¨Ó5×bÐb¸*¿.¹.ÈÓ:U×:aÐ:aÐYaÐ9bˆJØ+5¯>©>¸)×+DÒ+D™ZÈ"ÒL�	Ü—7‘7—>‘> )×,Ô,´·±·±ÀÓ1KÈaÖ1OÙ# IÖ.ñ Mô ˜J°H·O±OÀCÈÓ4KÈAÕ4NÐQWÕ4WÐ)XÕXÖY�Ü Ö%ñ Zð × Ñ ×$Ñ$Ö&øôO õ ,äŸ6š6Ð"3°S¸$Ó?�ÜŸ6š6Ð":¸EÀ8ÓL�ÜŸ6š6 /°2°xÓ@�ÜŸ6š6Ð"2°E¸8ÓD�ÜŸ6š6 ,°°xÓ@�ÜŸ6š6 *¨e°XÓ>�ÜŸ6š6 )¨R°ÄÇÁÔN�ÜŸ6š6 .°"°hÄbÇlÁlÔS�ÜŸ6š6 '¨2¨xÓ8�ÜŸ6š6 )¨V°XÓ>�Ø#Ÿ>™>Ó+“ð,ûô2 ô  Ø“
ð ûô ô 	IØ�N‰NÐ:¸AÔ>Ù�t�fœQÐ5¸QÔ?Ð@ÀÀÐG×HÒHûð	Iûð × Ñ ×$Ñ$Õ&ús˜   ¼N Á	I
 ÁN Á>BN Ä.M= Ä?N ÅN Å0N Æ)N Æ9!N ÇAN É
D,M:Í6N Í9M:Í:N Í=NÎ
N ÎNÎN ÎOÎ+OÏO ÏOÏO ÏO1c               ó   € V ^8„  d   QhRR/# r"   r   )r   s   "r   r   r0   ^  s   € ÷ Sñ S¨Tñ Sr   c           
     óÎ  a aaaaaaa€ ^ RI HoHoHoHo \        S RR4      pVf   \        P                  ! 4       pVS n        VP                  4       '       d   R# TP                  4         ^ RIHp V! 4       P                  R4      ;'       g    / p\        V\        4      '       d   VP                  RR4      '       g    VP!                  4        R# ^ RIHpHoHo  \+        VP                  R	^ 4      ;'       g    ^ 4      p \1        \+        VP                  RR4      4      R,          4      p\        S RR4      oR VV V3R llpR VVVVV V3R llpT! TSTT;'       g    R\3        ^ V4      R7      p	V	'       d3   S P4                  P                  4       '       d   S P7                  V	4       MS P4                  P!                  4         VP!                  4        R#   \,        \.        3 d    R
p Lïi ; i  \,        \.        3 d    Rp LÜi ; i  \8         d7   p
S P4                  P!                  4        SP;                  RT
4        Rp
?
L€Rp
?
ii ; i  TP!                  4        i ; i)aÚ  Full-duplex agent-turn listener: mic live for the WHOLE turn.

Armed at utterance-submit (chat() start in continuous voice mode), disarmed when agent
finished + TTS played, so the user can interject during generation too. Generation
phase: speech interrupts the turn via ``self.agent.interrupt()`` (same seam as
Ctrl+C); playback phase: speech cuts TTS. Either way the captured utterance is
submitted as the next message; the stop phrase ends the voice chat in BOTH phases.
rÓ   Ú_voice_fd_activeNr   rH   Úbarge_inT)Úfull_duplex_listenÚis_audio_output_activeÚstop_playbackÚbarge_in_threshold_multiplierrL   Úbarge_in_grace_secondsg      à?iè  iô  r¨   c               ó   € V ^8„  d   QhRR/# ©r   r
   r   r   )r   s   "r   r   Ú?CLIVoiceMixin._voice_full_duplex_listener.<locals>.__annotate__�  s   € ÷ 4ñ 4 $ñ 4r   c                 óÎ   <€ \        SR R4      '       d   \        SRR4      '       g   R# \        SRR4      '       d   R# Se   SP                  4       '       g   R# S ! 4       '       * # )Ú_voice_modeFr¸   Tr©   )rg   r·   )rÿ   r6   Útts_dones   €€€r   Ú_should_stopÚ?CLIVoiceMixin._voice_full_duplex_listener.<locals>._should_stop�  sY   ø€ Ü  m°U×;Ò;ÄÈÐNaÐch×@iÒ@iÙÜ˜4Ð!1°5×9Ò9Ù àÒ'°·±×0AÒ0AÙ Ù1Ó3Ô3Ð3r   c               ó    € V ^8„  d   QhRRRR/# )r   Úphaser	   r
   r#   r   )r   s   "r   r   r  ‹  s   € ÷ Sñ S 3ð S¨4ñ Sr   c                ó8  <€ SP                   P                  4        V Sn        \        SR R4      pV R8X  d<   SP	                  R4       ^ RIHp V! 4        Ve   VP                  4        S	! 4        R# SP	                  R4       Ve   VP                  4         SP                  eJ   \        SRR4      '       d5   S! RS \        R	4       S 24       SP                  P                  4        R# R# R#   \         d   pSP	                  R
T4        Rp?R# Rp?ii ; i)Ú_voice_tts_stopNÚplaybackz5TTS CUT: full-duplex listener tripped during playback)Úmark_speech_interrupteduJ   full-duplex listener tripped during generation â€” interrupting agent turnr©   FrE   zcli.voice.interjectionz'voice interjection interrupt failed: %s)Ú_voice_barge_captureræ   Ú_voice_barge_phaserg   ÚdebugÚtools.tts_streamingr  Úagentr   Ú	interruptr   )
r  Ú
_pipe_stopr  r›   r<   r=   r>   rÔ   r6   r   s
   &   €€€€€€r   Ú_on_triggerÚ>CLIVoiceMixin._voice_full_duplex_listener.<locals>._on_trigger‹  s  ø€ ð ×)Ñ)×-Ñ-Ô/Ø*/�Ô'Ü$ TÐ+<¸dÓC�
Ø˜JÔ&Ø—L‘LÐ!XÔYÝKÙ+Ô-Ø!Ò-Ø"Ÿ™Ô(Ù!–Oð —L‘Lð2ô3ð "Ò-Ø"Ÿ™Ô(ðSØŸ:™:Ò1´g¸dÐDTÐV[×6\Ò6\Ù# b¨¨¬qÐ1IÓ/JÐ.KÈDÈ6Ð$RÔSØ ŸJ™J×0Ñ0Ö2ñ 7]Ñ1øô %ô SØŸ™Ð%NÐPQ×RÒRûðSús   ÂAC1 Ã1DÃ<DÄD)Ú
is_playingÚ
on_triggerÚ
multiplierÚgrace_msz%Voice full-duplex listener failed: %s)rf   r<   r=   r>   rÔ   rg   ru   ÚEventrü   r·   ræ   r   r   r   r   r   r½   rh   rþ   rÿ   r   r   Ú	TypeErrorÚ
ValueErrorr   Úmaxr  Ú_voice_submit_barge_utterancer   r  )r6   Ú	fd_activer   rx   rþ   Ú_multÚ	_grace_msr	  r  rÂ   r›   r<   r=   r>   rÿ   rÔ   r   r  s   f          @@@@@@@r   rÎ   Ú)CLIVoiceMixin._voice_full_duplex_listener^  s  ÿ€ ÷ 	4Ó3Ü˜DÐ"4°dÓ;ˆ	ØÒÜ!ŸšÓ)ˆIØ$-ˆDÔ!Ø×Ñ×ÒÙØ�‰ŒðB	Ý5Ù#›×)Ñ)¨'Ó2×8Ð8°bˆIÜ˜y¬$×/Ò/°I·M±MÀ*Èd×4SÒ4SØð| �O‰OÖ÷{ cÑbðÜ˜iŸm™mÐ,KÈQÓO×TÐTÐSTÓU�ð Ü¤ i§m¡mÐ4LÈcÓ&RÓ SÐVZÕ ZÓ[�	ô ˜tÐ%6¸Ó=ˆH÷4ò 4÷Sõ Sñ6 *ØÐ)?ÈKØ Ÿ=˜= D´3°q¸)Ó3DôFˆH÷ ˜D×5Ñ5×<Ñ<×>Ò>Ø×2Ñ2°8Õ<à×)Ñ)×/Ñ/Õ1ð
 �O‰OÖøôs œzÐ*ô Ø’ðûô œzÐ*ô  Ø’	ð ûôb ô 	EØ×%Ñ%×+Ñ+Ô-Ø�L‰LÐ@À!×DÑDûð	Eûð �O‰OÕús—   Á+AH Ã
H ÃG Ã;G Ä+G5 Ä.3H Å":H ÆH Æ.I Æ/H Ç	I ÇG2Ç/H Ç1G2Ç2H Ç5HÈH È
HÈH ÈIÈ,I
ÉI É
IÉI ÉI$c               ó    € V ^8„  d   QhRRRR/# )r   rÂ   r	   r
   r#   r   )r   s   "r   r   r0   ³  s   € ÷ #6ñ #6°cð #6¸dñ #6r   c           
     ó˜  € ^ RI HpHpHpHpHp Rp ^ RIHp V! WP                  4       R7      p	V	P                  R4      '       d*   V	P                  R4      ;'       g    RP                  4       MRp
V
'       EdÇ   ^ RIHp V! V
4      '       d®   V! R	V \        R
4       V 24       V P                  4         \        V4       V P                   P#                  4        RV n        V'       gO   V P&                  '       d;   V P(                  '       d'   V P*                  '       g   V P-                  4        R# R# R# R# R# \/        V RR4      R8X  dÐ   ^ RIHp V! V
\/        V RR4      4      '       d°   VP3                  RV
4       V! R	V \        R4       V 24        \        V4       V P                   P#                  4        RV n        V'       gO   V P&                  '       d;   V P(                  '       d'   V P*                  '       g   V P-                  4        R# R# R# R# R# V P4                  P7                  V! V
4      4       RpMSV	P                  R4      '       g=   T! R	T \        RV	P                  R4      ;'       g    \        R4      R7       V 24       \        V4       V P                   P#                  4        RV n        V'       gO   V P&                  '       d;   V P(                  '       d'   V P*                  '       g   V P-                  4        R# R# R# R# R#   \8         d%   pT! R	T \        RTR7       T 24        Rp?L®Rp?ii ; i  \        T4       T P                   P#                  4        RT n        T'       gK   T P&                  '       d8   T P(                  '       d%   T P*                  '       g   T P-                  4        i i i i i ; i)zGTranscribe a barge-captured interruption and queue it as the next turn.)r<   r=   r§   r>   rÔ   Fr®   r«   r°   r±   rD   r¬   rE   r²   Nr  r  )Úis_tts_echorç   z8Dropping playback-phase barge transcript as TTS echo: %rzcli.voice.echo_ignoredTr³   rš   r´   r™   rµ   )rf   r<   r=   r§   r>   rÔ   rh   r¯   r�   r   r‹   rº   r­   r   r»   r,   r  r½   r  r  r¸   rO   rž   rg   r)  r  r¾   r¿   r   )r6   rÂ   r<   r=   r§   r>   rÔ   rÀ   r¯   rÇ   r±   r­   r)  r›   s   &&            r   r"  Ú+CLIVoiceMixin._voice_submit_barge_utterance³  sS  € çGÕGØˆ	ð	6Ý=Ù)¨(×:OÑ:OÓ:QÔRˆFØEKÇZÁZÐPY×EZÒEZ˜&Ÿ*™* \Ó2×8Ð8°b×?Ñ?ÔAÐ`bˆJßˆzÝLÙ'¨
×3Ò3Ù˜b  ¤qÐ)@Ó'AÐ&BÀ4À&ÐIÔJØ×,Ñ,Ô.Øô" ˜HÔ%Ø×%Ñ%×+Ñ+Ô-Ø&*ˆDÔ#ç ×!1×!1Ð!1°d×6L×6LÐ6LÐUY×Uj×UjÐUjØ×3Ñ3Ö5ñ VkÑ6LÑ!1‘9ô% ˜4Ð!5°tÓ<À
ÔJÝGÙ" :¬w°tÐ=SÐUWÓ/X×YÒYØŸ™ØVÐXbôdá " T F¬1Ð-EÓ+FÐ*GÈÀvÐ NÔOØô ˜HÔ%Ø×%Ñ%×+Ñ+Ô-Ø&*ˆDÔ#ç ×!1×!1Ð!1°d×6L×6LÐ6LÐUY×Uj×UjÐUjØ×3Ñ3Ö5ñ VkÑ6LÑ!1‘9ð ×#Ñ#×'Ñ'Ñ(:¸:Ó(FÔGØ ‘	Ø—Z‘Z 	×*Ò*Ù˜"˜T˜F¤1Ð%EÈVÏZÉZÐX_ÓM`÷  NBð  NBÔdeð  gAó  eBô  $Cð  #Dð  EIð  DJð  Kô  Lô ˜HÔ%Ø×%Ñ%×+Ñ+Ô-Ø&*ˆDÔ#ç ×!1×!1Ð!1°d×6L×6LÐ6LÐUY×Uj×UjÐUjØ×3Ñ3Ö5ñ VkÑ6LÑ!1‘9øô ô 	QÙ�b˜˜œqÐ!=ÀQÔGÐHÈÈÐO×PÑPûð	Qûô ˜HÔ%Ø×%Ñ%×+Ñ+Ô-Ø&*ˆDÔ#ç ×!1×!1Ð!1°d×6L×6LÐ6LÐUY×Uj×UjÐUjØ×3Ñ3Õ5ð VkÐ6LÐ!1�9úst   ’AL ÁL Á:L Â(L Ä;AL È#L È?M	 É L É"L É:L ÌMÌ"MÌ<M	 ÍMÍM	 Í	AO	ÎO	Î"O	Î4O	c               ó   € V ^8„  d   QhRR/# r  r   )r   s   "r   r   r0   Ø  s   € ÷ ñ  dñ r   c                óz   €  ^ RI Hp V! \        R4      P                  RR4      RR7      #   \         d     R# i ; i)zBReturn whether CLI voice mode should play record start/stop beeps.)Úis_truthy_valuerH   Úbeep_enabledT)r   )Úutilsr-  r   r   r   )r6   r-  s   & r   r‚   Ú"CLIVoiceMixin._voice_beeps_enabledØ  s=   € ð	Ý-Ù"¤?°7Ó#;×#?Ñ#?ÀÐPTÓ#UÐ_cÔdÐdøÜô 	Úð	ús   ‚(+ «:¹:c           	     óz  € ^ RI HpHpHpHpHp V P                  '       d   V! V \        R4       V 24       R# ^ RIH	pH
p V! 4       pVR,          '       g:   V! RV \        R4       V 24       VR,           F  p	V! R	V V	 V 24       K  	  R# V! 4       p
V
R,          '       g˜   V! RV \        R
4       V 24       V
R,          P                  R4       F  pV! R	V V V 24       K  	  V
R,          '       dA   \        4       '       d1   V! RV \        R4       V 24       V! R	V \        R4       V 24       R# V P                  ;_uu_ 4        RV n        RRR4       \        R4      P                  RR4      '       d%   V P                  ;_uu_ 4        RV n        RRR4       V P                   '       d   \        R4      MRpV P                   '       d   V P#                  R4       T! RV \        RVR7       V 24       V! R	V \        RV P%                  4       R7       V 24        ^ RIHp V! 4       pV'       d   V! R	V V V 24       V! R	V \        R4       V 24       V! R	V \        R4       V 24       R#   + '       g   i     EL1; i  + '       g   i     EL ; i  \*         d    Rp L€i ; i)z.Enable voice mode after checking requirements.©r;   Ú_BOLDr<   r=   r>   zcli.voice.already_enabledN)rA   Údetect_audio_environmentÚ	availablerE   zcli.voice.unavailable_headerÚwarningsú  zcli.voice.requirements_headerrC   Úmissing_packagesú
  zcli.voice.termux_install_cmdzcli.voice.termux_install_hintTrH   Úauto_ttsFzcli.voice.tts_enabled_suffixrD   zcli.voice.enabled)Ú
tts_statuszcli.voice.record_key_hintrX   )Úvoice_stop_hintzcli.voice.tts_toggle_hintzcli.voice.disable_hint)rf   r;   r3  r<   r=   r>   r  r   rh   rA   r4  Úsplitri   rN   r   r   rÌ   Ú_tts_lease_asyncrt   rº   r<  r   )r6   r;   r3  r<   r=   r>   rA   r4  Ú	env_checkrñ   rw   Úliner;  r<  Ú
_stop_hints   &              r   Ú_enable_voice_modeÚ CLIVoiceMixin._enable_voice_modeà  s¡  € ç;Õ;Ø××ÐÙ�t�fœQÐ:Ó;Ð<¸T¸FÐCÔDÙçWÙ,Ó.ˆ	Ø˜×%Ô%Ù�b˜˜	¤!Ð$BÓ"CÐ!DÀTÀFÐKÔLØ$ Z×0Ð0�Ù˜"˜T˜F 7 )¨D¨6Ð2Ö3ñ 1áá'Ó)ˆØ�K× Ô Ù�b˜˜	¤!Ð$CÓ"DÐ!EÀdÀVÐLÔMØ˜Y�×-Ñ-¨dÖ3�Ù˜"˜T˜F 4 &¨¨Ð/Ö0ñ 4àÐ&×'Ô'Ü)×+Ò+Ù˜d 5 '¬!Ð,JÓ*KÐ)LÈTÈFÐSÔTÙ˜b  ¤qÐ)HÓ'IÐ&JÈ4È&ÐQÔRÙà××ÓØ#ˆDÔ÷ ä˜7Ó#×'Ñ'¨
°E×:Ò:Ø×!×!Ó!Ø"&�”÷ "ð
 ;?¿/¿/¸/”QÐ5Ô6Èrˆ
Ø�?�?ˆ?Ø×!Ñ! $Ô'ñ 	�"�W�IœaÐ 3À
ÔKÐLÈTÈFÐSÔTÙ�"�T�Fœ1Ð8À4×C_ÑC_ÓCaÔbÐcÐdhÐciÐjÔkð	ÝCÙ(Ó*ˆJ÷ Ù�b˜˜˜z˜l¨4¨&Ð1Ô2Ù�"�T�Fœ1Ð8Ó9Ð:¸4¸&ÐAÔBÙ�"�T�Fœ1Ð5Ó6Ð7¸°vÐ>Ö?÷3 ×Ðú÷ "×!Ð!ûô" ô 	ØŠJð	ús*   ÅJÆJÈ,J* ÊJ	ÊJ'	Ê*J:Ê9J:c               ó   € V ^8„  d   QhRR/# r  r   )r   s   "r   r   r0     s   € ÷ ñ ¨tñ r   c                ó¢  € ^ RI HpHpHp \	        V\
        4      '       g   R# V P                  ;_uu_ 4        V P                  ;'       g    V P                  pRRR4       X'       g   R#  ^ RI	H
p V! V4      '       g   R#  T! RT \        R4       T 24       T P                  4        R#   + '       g   i     L\; i  \         d     R# i ; i)a¨  Typed bare stop phrase during an active voice chat ends the chat (mirrors the spoken
one; outside voice mode "stop" passes through to the agent). Exact-match via
``is_voice_stop_phrase``, so longer messages containing "stop" are never swallowed.

Saying "stop" ends the voice chat (PR #73106); TYPING the same bare stop phrase while voice mode is
on must behave identically instead of sending "stop" to the agent as a turn.
r—   FNr¬   rE   zcli.voice.stop_phrase_typedT)rf   r<   r=   r>   r   r	   rN   r  r¸   rº   r­   r   r   r»   )r6   Ú
user_inputr<   r=   r>   Úvoice_onr­   s   &&     r   Ú_typed_voice_stopÚCLIVoiceMixin._typed_voice_stop  s°   € ÷ 	,Ñ+Ü˜*¤c×*Ò*ÙØ××ÓØ×'Ñ'×AÐA¨4×+AÑ+AˆH÷ çÙð	ÝHÙ'¨
×3Ò3Ùð 4ñ 	�"�T�Fœ1Ð:Ó;Ð<¸T¸FÐCÔDØ× Ñ Ô"Ù÷ ×ûô ô 	Úð	ús   ·!B,Á+B? Â,B<	Â?CÃCc                óî  € ^ RI HpHpHpHp V P
                  ;_uu_ 4        V P                  '       d4   V P                  '       d"   V P                  P                  4        RV n        V P                  pRV n	        RV n
        RV n        RRR4       V P                  R4       Xe4   V3R lp\        P                  ! VRR7      P                  4        RV n         V P                   e,   VP#                  R4       V P                   P%                  4        ^ RIHp V! 4        V P,                  P%                  4        V! R	V \/        R
4       V 24       R#   + '       g   i     LÓ; i  \*         d     LTi ; i)z>Disable voice mode, cancel any active recording, and stop TTS.rÓ   FNc                óL   €  V P                  4        R #   \         d     R # i ; ir%   )Úshutdownr   )ry   s   &r   Ú_bg_shutdownÚ7CLIVoiceMixin._disable_voice_mode.<locals>._bg_shutdown>  s"   € ðØ—L‘L–NøÜ ô Úðús   ‚ ”#¢#Trc   z/TTS CUT: _disable_voice_mode setting stop event)r   rE   zcli.voice.disabled)rf   r<   r=   r>   rÔ   rN   rO   rk   Úcancelr  rÌ   r¸   r>  ru   rv   rs   r  Úinforæ   rh   r   r   r¨   r   )r6   r<   r=   r>   rÔ   ÚrecorderrM  r   s   &       r   r»   Ú!CLIVoiceMixin._disable_voice_mode.  s3  € ç3Ó3Ø××ÓØ×$×$Ð$¨×)=×)=Ð)=Ø×$Ñ$×+Ñ+Ô-Ø(-�Ô%Ø×+Ñ+ˆHØ$ˆDÔØ#ˆDŒOØ%*ˆDÔ"÷ ð 	×Ñ˜eÔ$àÒØ!)ô ô
 ×Ò L¸Ô>×DÑDÔFØ#'ˆDÔ ð	Ø×#Ñ#Ò/Ø—‘ÐMÔNØ×$Ñ$×(Ñ(Ô*Ý6ÙŒOð 	×Ñ× Ñ Ô"Ù�"�T�Fœ1Ð1Ó2Ð3°D°6Ð:Ö;÷= ×ûô6 ô 	Ùð	ús%   ¡$EÁAEÃAE& ÅE#	Å&E4Å3E4c                ó~   €  ^ RI Hp V! R4      '       g   R#  T P                  RR7       R#   \         d     R# i ; i)zHStart the wake-word listener at CLI startup if this surface is eligible.)Úwake_surface_enabledrf   NT)Úannounce)Útools.wake_wordrT  r   Ú_start_wake_word_listener)r6   rT  s   & r   Ú_maybe_start_wake_wordÚ$CLIVoiceMixin._maybe_start_wake_wordQ  sD   € ð	Ý<Ù'¨×.Ò.Ùð /ð 	×&Ñ&°Ð&Ö5øô ô 	Úð	ús   ‚- ­<»<c               ó    € V ^8„  d   QhRRRR/# )r   rU  r   r
   r   )r   s   "r   r   r0   [  s   € ÷ *ñ *°$ð *À4ñ *r   c                óâ  € ^ RI HpHpHpHp V'       d   TMR p ^ RIHpHpHp	H	p
 \        T RR4      '       d(   T	! T 4      '       d   T! T \        R	4       T 24       R
# RT n        T! 4       pT! T4      pTR,          '       gH   T! RT \        R4       T 24       TP                  R4      '       d   T! RT TR,           T 24       R# TP                  RR
4      '       g   T! T \        R4       T 24       \        TP                  RR
4      4      T n         T
! T P"                  YR7       R
T n        RT n        ^ RI pYn        T P)                  4        T! RT \        R4       T RT \        RTR,          R7       T 24       R
#   \         d%   pT! T \        RTR7       T 24        Rp?R# Rp?ii ; i  \         d&   pT! RT \        RTR7       T 24        Rp?R# Rp?ii ; i)z<Build + start the hotword detector. Returns True on success.r:   c                 ó   € R # r%   r   )Ú_as   *r   Ú<lambda>Ú9CLIVoiceMixin._start_wake_word_listener.<locals>.<lambda>^  s   € ±Dr   )Úcheck_wake_word_requirementsÚload_wake_word_configÚowns_listenerÚstart_listeningzcli.voice.wake_unavailabler™   NFÚ_wake_word_activezcli.voice.wake_alreadyTr5  rE   z"cli.voice.wake_requirements_headerÚhintr7  Údeps_availablezcli.voice.wake_installingÚstart_new_session)ÚownerÚconfigzcli.voice.wake_start_failedzcli.voice.wake_listeningrZ   zcli.voice.wake_listening_hintÚphrase©rj  )rf   r;   r<   r=   r>   rV  r`  ra  rb  rc  r   r   rg   rd  r   r   Ú_wake_start_new_sessionÚ_on_wake_wordÚ_wake_suspendedÚ_cli_wake_ownerÚ_start_wake_watchdog)r6   rU  r;   r<   r=   r>   Úsayr`  ra  rb  rc  r›   Úcfgrw   Ú_clis   &&             r   rW  Ú'CLIVoiceMixin._start_wake_word_listener[  sÿ  € ç4Ó4ß!‰gÑ(8ˆð	÷eó eô �4Ð,¨e×4Ò4¹Àt×9LÒ9LÙ�4�&œÐ3Ó4Ð5°d°VÐ<Ô=ÙØ!&ˆÔá#Ó%ˆÙ+¨CÓ0ˆØ�K× Ô Ù�"�W�IœaÐ DÓEÐFÀtÀfÐMÔNØ�x‰x˜×ÒÙ�b˜˜˜t F�|˜n¨T¨FÐ3Ô4ÙØ�x‰xÐ(¨$×/Ò/ñ �4�&œÐ6Ó7Ð8¸¸Ð?Ô@ä'+¨C¯G©GÐ4GÈÓ,NÓ'OˆÔ$ð	Ù˜D×.Ñ.°dÕGð
 "&ˆÔØ$ˆÔÛØ#ÔØ×!Ñ!Ô#Ùˆb��	œ!Ð6Ó7Ð8¸¸¸aØˆf”QÐ6¸tÀH½~ÔNÐOÐPTÈvðWô 	XáøôG ô 	Ù�4�&œÐ7¸qÔAÐBÀ4À&ÐIÔJÝûð	ûô0 ô 	Ù�"�T�Fœ1Ð:À!ÔDÐEÀdÀVÐLÔMÝûð	ús/   ›F ÄF> ÆF;ÆF6Æ6F;Æ>G.Ç	G)Ç)G.c               ó   € V ^8„  d   QhRR/# )r   rU  r   r   )r   s   "r   r   r0   ‡  s   € ÷ rñ r°ñ rr   c                ó  € ^ RI HpHpHp ^ RI p\	        V RR4      pRV n        RV n         ^ RIHp V! V R7       VP                  V J d   RVn
        V'       d$   T! T \        V'       d   RMR4       V 24       R# R#   \         d     LQi ; i)	z(Stop and tear down the hotword detector.r—   Nrd  F)Ústop_listening©rh  zcli.voice.wake_stoppedzcli.voice.wake_not_running)rf   r<   r=   r>   rg   rd  rn  rV  rw  r   ro  r   )r6   rU  r<   r=   r>   rs  Ú
was_activerw  s   &&      r   Ú_stop_wake_word_listenerÚ&CLIVoiceMixin._stop_wake_word_listener‡  s‘   € ç+Ñ+ÛÜ˜TÐ#6¸Ó>ˆ
Ø!&ˆÔØ$ˆÔð	Ý6Ù Õ&ð ×Ñ 4Ó'Ø#'ˆDÔ ßÙ�t�fœQ¿:Ñ7ÐKgÓhÐiÐjnÐioÐpÖqñ øô	 ô 	Ùð	ús   «A> Á>BÂBc           	     óª  € ^ RI HpHpHpHpHp \        V RR4      '       d   R# V P                  '       g&   V P                  '       g   \        V RR4      '       d   R#  ^ RI	H
p V! V R7      '       g
   RV n        R#  R	T n         ^ R
I	Hp T! 4       p	T	'       dS   T	^,          '       dD   ^ RI	Hp
 T	^,          T
! 4       8w  d+   T! RT \#        RT	^,          R7       T 24       R	T n        R# T! RT \#        R4       T 24       \        T RR4      '       d    T P$                  P'                  4        \        T RR	4      '       d    T P)                  R	R7       T P*                  ;_uu_ 4        R	T n        RRR4       RT n         T P1                  4        R#   \         d   pTP                  RT4        Rp?R# Rp?ii ; i  \         d    Rp	 EL?i ; i  \         d     L°i ; i  \         d   pTP                  RT4        Rp?L°Rp?ii ; i  + '       g   i     L¤; i  \         d%   pT! T \#        RTR7       T 24        Rp?R# Rp?ii ; i)z/Fired after the detector hears the wake phrase.)r;   r<   r=   r>   rÔ   r?   FNr¶   )Úpause_listeningrx  zwake word pause failed: %sT)Úget_last_match)Ú_active_profile_namerE   zcli.voice.wake_profile_hint)Úprofilezcli.voice.wake_detectedr2   rl  )Úsilentz wake word new_session failed: %szcli.voice.wake_capture_failedr™   )rf   r;   r<   r=   r>   rÔ   rg   r©   rO   rV  r}  rd  r   r  rn  r~  r  r   r2   r4   Únew_sessionrN   r  r¸   r}   )r6   r;   r<   r=   r>   rÔ   r}  r›   r~  Ú_matchr  s   &          r   rm  ÚCLIVoiceMixin._on_wake_word˜  s"  € ç<Õ<Ü�4˜¨×/Ò/Ùà××Ð $×"7×"7Ð"7¼7À4ÐI\Ð^c×;dÒ;dÙð	Ý7Ù"¨×.Ó.Ø).�Ô&Ùð /ð  $ˆÔð	Ý6Ù#Ó%ˆF÷ �f˜Q—i”iÝ<Ø�a�yÑ0Ó2Ô2Ù˜"˜T˜F¤1Ð%BÈFÐSTÍIÔ#VÐ"WÐX\ÐW]Ð^Ô_Ø'+�Ô$Ùá�"�W�IœaÐ 9Ó:Ð;¸D¸6ÐBÔCÜ�4˜ ×&Ò&ðØ—	‘	×$Ñ$Ô&ô �4Ð2°D×9Ò9ðDØ× Ñ ¨Ð Ô-ð
 ××ÓØ#ˆDÔ÷ à!&ˆÔð	RØ×'Ñ'Ö)øôK ô 	Ø�L‰LÐ5°qÔ9Ýûð	ûô ô 	Ø‹Fð	ûô ô Ùðûô ô DØ—‘Ð?À×CÑCûðDú÷ ×ûô
 ô 	RÙ�t�fœQÐ>ÀaÔHÐIÈ$ÈÐP×QÒQûð	Rús~   ÁF Á3F ÂG ÄG ÅG& Å,HÆH# ÆF>Æ!F9Æ9F>ÇGÇGÇG#Ç"G#Ç&HÇ1HÈHÈH 	È#IÈ.IÉIc                óª   a a€ ^ RI Ho \        S RR4      '       d   R# RS n        VV 3R lp\        P
                  ! VRRR7      P                  4        R# )	zAResume the paused detector when the CLI returns to a stable idle.©rÔ   Ú_wake_watchdog_startedFNTc                 óz  <€ ^ p  \        SRR4      '       då   \        SRR4      '       gÒ   \        P                  ! R4       \        SRR4      '       g   ^ p KS  SP                  ;'       gI    SP                  ;'       g5    \        SRR4      ;'       g     SP
                  P                  4       '       * pV'       d   ^ p K»  V ^,          p V ^8¼  g   KÍ  ^ p  ^ RIHp V! SR7      '       d
   RSn	        Kî  RSn
        K÷  RSn        R
#   \         d   pSP                  R	T4        R
p?EK$  R
p?ii ; i  RSn        i ; i)é    rd  Fr?   g      Ð?rn  r¶   )Úresume_listeningrx  zwake word resume failed: %sN)rg   r^   r_   r©   rO   r¾   ÚemptyrV  rŠ  rn  rd  r   r  r‡  )Ú
idle_pollsÚbusyrŠ  r›   rÔ   r6   s       €€r   Ú_loopÚ1CLIVoiceMixin._start_wake_watchdog.<locals>._loop×  s.  ø€ ØˆJð4Ü˜dÐ$7¸×?Ò?ÌÐPTÐVdÐfk×HlÒHlÜ—J’J˜tÔ$Ü" 4Ð):¸E×BÒBØ%&˜
Ù à×+Ñ+÷ ;ð ;Ø×0Ñ0÷;ð ;ä" 4Ð)<¸eÓD÷;ð ;ð  $×2Ñ2×8Ñ8Ó:Ô:ð	 ÷
 Ø%&˜
Ù ð  !•O�JØ! Q–Ø%&˜
ðKÝHÙ/°d×;Ó;Ø7< Ö 4à9> Ö 6ð /4�Ö+øô  )ô KØ"ŸL™LÐ)FÈ×JÓJûðKûð /4�Õ+úsf   …A%D1 Á+D1 Á?D1 Â'D1 Â<D1 ÃD1 ÃD Ã*D Ã1D1 Ã3D Ã:D1 ÄD.ÄD)Ä"D1 Ä)D.Ä.D1 Ä1	D:zwake-watchdog)rd   re   r   )rf   rÔ   rg   r‡  ru   rv   rs   )r6   rŽ  rÔ   s   f @r   rp  Ú"CLIVoiceMixin._start_wake_watchdogÐ  sD   ù€ åÜ�4Ð1°5×9Ò9ÙØ&*ˆÔ#ö	4ô@ 	×Ò ¨d¸ÔI×OÑOÖQr   c                ó~  € ^ RI HpHpHpHpHp ^ RIHpHpH	pH
p	Hp
 V	! 4       pV! V4      pV
! V 4      pV'       d   V! 4       '       d   RMV'       d   RMRpV! RV \        R4       V 24       V! \        R\        R	V 24      R
7      4       V! \        RVR,          R7      4       V! \        RVR,          R7      4       V! \        RVP                  RR4      R7      4       T! \        R\        VP                  RR4      '       d   RMR4      R7      4       VR8X  d>   V! 4       '       d1   V! RV \        R4       V 24       V! RV \        R4       V 24       VR,          '       g.   VP                  R4      '       d   V! RV VR,           V 24       V'       g   V! RV \        R 4       V 24       R!# R!# )"z'Show current wake-word listener status.r2  )Úaudio_is_silentr`  Úis_listeningra  rb  Ú	listeningÚpausedÚoffrE   zcli.voice.wake_status_titlezcli.voice.label_statezcli.voice.state_)Ústatezcli.voice.label_phraserj  rk  zcli.voice.label_providerr‡   )r‡   zcli.voice.label_surfaceÚsurfaceÚauto)r˜  zcli.voice.label_new_sessionrg  Tzcli.shared.label_yesúcli.shared.label_no©r   r7  zcli.voice.mic_silent_warningzcli.voice.mic_silent_macos_hintr5  re  zcli.voice.wake_enable_hintN)rf   r;   r3  r<   r=   r>   rV  r’  r`  r“  ra  rb  r   r   )r6   r;   r3  r<   r=   r>   r’  r`  r“  ra  rb  rr  rw   Úownedr—  s   &              r   Ú_show_wake_word_statusÚ$CLIVoiceMixin._show_wake_word_statusù  s›  € ç;Õ;÷	õ 	ñ $Ó%ˆÙ+¨CÓ0ˆÙ˜dÓ#ˆç$©¯ª‘Ï¹XÐTYˆÙ�"�U�GœAÐ;Ó<Ð=¸d¸VÐDÔEÙ”Ð)´Ð5EÀeÀWÐ3MÓ1NÔOÔPÙ”Ð*°4¸µ>ÔBÔCÙ”Ð,°t¸JÕ7GÔHÔIÙ”Ð+°S·W±W¸YÈÓ5OÔPÔQÙ”Ð/Ü°C·G±GÐ<OÐQU×4VÒ4VÑ0Ð\qÓrôtô 	uà�KÔ¡O×$5Ò$5Ù�b˜˜	¤!Ð$BÓ"CÐ!DÀTÀFÐKÔLÙ�b˜˜œqÐ!BÓCÐDÀTÀFÐKÔLØ�K× Ô  T§X¡X¨f×%5Ò%5Ù�b˜˜˜t F�|˜n¨T¨FÐ3Ô4ßÙ�b˜˜œqÐ!=Ó>Ð?À¸vÐFÖGñ r   c               ó    € V ^8„  d   QhRRRR/# )r   Úactiver   r
   r#   r   )r   s   "r   r   r0     s   € ÷ Qñ Q tð Q°ñ Qr   c                ór   aa€ ^ RI Ho VV3R lp\        P                  ! VRRR7      P	                  4        R# )zïAcquire/release this CLI's TTS engine lease in the background.

Acquiring pre-loads the configured provider so the first reply starts hot; releasing
lets the last-holder path unload resident local models. Never blocks or fails the toggle.
r†  c                 ó¦   <€  ^ RI Hp Hp S'       d   V ! R4       R# V! R4       R#   \         d   pSP	                  RST4        Rp?R# Rp?ii ; i)r‰  )Úacquire_tts_leaseÚrelease_tts_leasezcli:voice-ttsz%voice: tts lease active=%s failed: %sN)Útools.tts_tool_lifecycler£  r¤  r   r  )r£  r¤  r›   r   rÔ   s      €€r   Ú_runÚ,CLIVoiceMixin._tts_lease_async.<locals>._run  sE   ø€ ðQßYßÙ% oÖ6á% oÖ6øÜô QØ—‘ÐDÀfÈa×PÒPûðQús   ƒ' “' �' §A²AÁAztts-lease-cliT)rd   r   re   N)rf   rÔ   ru   rv   rs   )r6   r   r¦  rÔ   s   &f @r   r>  ÚCLIVoiceMixin._tts_lease_async  s+   ù€ õ 	ö	Qô 	×Ò ¨?À4ÔH×NÑNÖPr   c                ó  € ^ RI HpHpHpHp V P
                  '       g   V! V \        R4       V 24       R# V P                  ;_uu_ 4        V P                  '       * V n        RRR4       \        V P                  '       d   RMR4      pV P                  '       d+   ^ RI	H
p V! 4       '       g   V! V \        R4       V 24       V P                  V P                  4       V! V \        RVR	7       V 24       R#   + '       g   i     L¡; i)
z!Toggle TTS output for voice mode.r:   zcli.voice.enable_first_hintNzcli.shared.label_enabledzcli.shared.label_disabled)Úcheck_tts_requirementszcli.voice.tts_no_providerzcli.voice.tts_status)Ústatus)rf   r;   r<   r=   r>   r  r   rN   rÌ   rá   rª  r>  )r6   r;   r<   r=   r>   r«  rª  s   &      r   Ú_toggle_voice_ttsÚCLIVoiceMixin._toggle_voice_tts(  sÒ   € ç4Ó4Ø××ÐÙ�t�fœQÐ<Ó=Ð>¸t¸fÐEÔFÙà××ÓØ"&§/¡/Ô1ˆDŒO÷ ä°··°Ñ-ÐFaÓbˆØ�?�?ˆ?Ý=Ù)×+Ò+Ù˜4˜&¤Ð#>Ó!?Ð @ÀÀÐGÔHØ×Ñ˜dŸo™oÔ.Ù�7�)œAÐ4¸VÔDÐEÀdÀVÐLÖM÷ ×ús   ÁC<Ã<D	c                ób  € ^ RI HpHpHp ^ RIHp V! 4       p\        R4      \        R4      rvV! RV \        R4       V 24       T! \        RV P                  '       d   TMTR7      4       T! \        R	V P                  '       d   TMTR7      4       T! \        R
V P                  '       d   \        R4      M
\        R4      R7      4       V! \        RV P                  4       R7      4       V! RV \        R4       V 24       VR,          P                  R4       F  pV! RV 24       K  	  R# )zShow current voice mode status.)r3  r=   r>   )rA   zcli.voice.state_onzcli.voice.state_offrE   zcli.voice.status_titlezcli.voice.label_moder›  zcli.voice.label_ttszcli.voice.label_recordingzcli.voice.state_yesrš  zcli.voice.label_record_keyrX   r9  zcli.voice.label_requirementsrC   z    N)rf   r3  r=   r>   rh   rA   r   r  rÌ   rO   rt   r=  )	r6   r3  r=   r>   rA   rw   Ú_onÚ_offr@  s	   &        r   Ú_show_voice_statusÚ CLIVoiceMixin._show_voice_status9  s  € ç,Ñ,Ý=á'Ó)ˆÜÐ*Ó+¬QÐ/DÓ-EˆTÙ�"�U�GœAÐ6Ó7Ð8¸¸Ð?Ô@Ù”Ð(°t×7G×7GÐ7G±ÈTÔRÔSÙ”Ð'°d·o·o°o©sÈ4ÔPÔQÙ”Ð-Ø48×4I×4IÐ4IœÐ/Ô0ÌqÐQfÓOgôiô 	jñ
 	”Ð.¸×9UÑ9UÓ9WÔXÔYÙ�$�u�gœaÐ >Ó?Ð@ÀÀÐGÔHØ˜•O×)Ñ)¨$Ö/ˆDÙ�d˜4˜&�MÖ"ó 0r   )rª   r  r¸   rü   rç   rl   r  r¶   rk   rO   rÌ   rl  rn  r‡  rd  N)F)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r7   r}   rr   r�   r“   rž   rm   rP   rÏ   rÍ   rÎ   r"  r‚   rB  rH  r»   rX  rW  rz  rm  rp  r�  r>  r¬  r±  Ú__static_attributes__r   r   r   r.   r.   6   sš   † Ùxõ#ò
TEõlõ'õQõ	Iõ!ò
[6õz	[õ5'õnSõj#6õJò3@õjò2!<òF6÷*÷Xrò"6Ròp'RòRHõ6Qò(Nö"#r   r.   )r·  Ú
__future__r   rí   r&   rã   ré   ru   r^   Ú
agent.i18nr   Úhermes_constantsr   ri   Útypingr   r   r    r,   r.   r   r   r   Ú<module>r½     sF   ðñõ #ã Û 	Û 	Û Û Û å Ý @Ý õòaõ÷U#ó U#r   