Ë
    ãß²j¾<  ã                  óÔ  — d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlmZ ddlmZ ddlmZmZmZmZ ddlmZ d#d„Zd$d	„Zd%d
„Zd&d„Zd'd„Zd(d„Zd)d„Z	 d*	 	 	 	 	 	 	 d+d„Zd,d„Zd-d„Zd.d„Z 	 	 	 	 	 	 	 	 d/d„Z!d0d„Z"d1d„Z# e$h d£«      Z%dZ&dZ' e$h d£«      Z(dZ) eee%¬«      Z* ee!e%¬«      Z+ ee"e&¬«      Z,d2d„Z-d*d3d„Z.d.d „Z/d4d!„Z0	 	 	 	 	 	 	 	 	 	 	 	 d5d"„Z1y)6aº  Shared runner for user-configured shell ("command") TTS/STT providers.

``tts.providers.<name>: {type: command, command: "piper -f {output_path} < {input_path}"}``
(and the ``stt.`` twin): ``{placeholders}`` are shell-quoted for their surrounding quote
context, ``{{``/``}}`` stay literal. Owns the quote-aware rendering, the idle-timeout
process runner and the generic ``<section>.providers.<name>`` readers, re-imported by
``tts_tool``/``transcription_tools`` under their historical private names. TTS placeholders:
``{input_path}``/``{text_path}``, ``{output_path}``, ``{format}``, ``{voice}``, ``{model}``,
``{speed}``. Built-in provider names always win over a same-named ``providers`` entry.
é    )ÚannotationsN)Úpartial)ÚPath)ÚAnyÚDictÚ	FrozenSetÚOptional)Úis_truthy_valuec                ó¬   — d}d}d}||k  rH| |   }|dk(  r|dk(  r.d}n+|dk(  r|rd}n!|dk(  rd}n|dk(  rd}n|dv r|}n
|dk(  r|d	z  }|d	z  }||k  rŒH|S )
zRReturn the shell quote char (``'``/``"``) active right before *position*, or None.NFr   ú'ú"ú\T)r   r   é   © )Úcommand_templateÚpositionÚquoteÚescapedÚiÚchars         ú?/home/ubuntu/.hermes/hermes-agent/tools/tts_command_provider.pyÚshell_quote_contextr      s’   € à€EØ€GØ	€AØ
ˆhŠ,Ø Ñ"ˆØ�CŠ<Ø�sŠ{Ø‘Ø�cŠ\ÙØ‘Ø˜’Ø‘Ø˜’Ø‘Ø�ZÑØ‰EØ�TŠ\Ø�‰FˆAØ	ˆQ‰ˆð! ˆh‹,ð" €Ló    c                ó:  — |dk(  r| j                  dd«      S |dk(  rB| j                  dd«      j                  dd«      j                  dd«      j                  d	d
«      S t        j                  dk(  rt        j                  | g«      S t        j                  | «      S )zGQuote a placeholder value for its position in a shell command template.r   z'\''r   r   z\\z\"ú$z\$ú`z\`Únt)ÚreplaceÚosÚnameÚ
subprocessÚlist2cmdlineÚshlexr   )ÚvalueÚquote_contexts     r   Úquote_command_placeholderr&   6   s‰   € à˜ÒØ�}‰}˜S 'Ó*Ð*Ø˜ÒØ�}‰}˜T 6Ó*×2Ñ2°3¸Ó>×FÑFÀsÈEÓR×ZÑZÐ[^Ð`eÓfÐfÜ/1¯w©w¸$ªŒ:×"Ñ" E 7Ó+ÐVÄEÇKÁKÐPUÓDVÐVr   c                ó$  ‡ ‡‡— dj                  d„ ‰D «       «      }t        j                  d|› d|› d�«      }g Šdˆ ˆˆfd„}|j                  |‰ «      j	                  dd«      j	                  d	d
«      }‰D ]  \  }}|j	                  ||«      }Œ |S )zMReplace ``{name}`` placeholders (quote-aware) while preserving ``{{``/``}}``.Ú|c              3  óF   K  — | ]  }t        j                  |«      –— Œ y ­w©N)ÚreÚescape)Ú.0r    s     r   ú	<genexpr>z*render_command_template.<locals>.<genexpr>A   s   è ø€ Ò>¨”R—Y‘Y˜t—_Ñ>ùs   ‚!z(?<!\$)(?:\{\{(?P<double>z)\}\}|\{(?P<single>z)\})c                óâ   •— | j                  d«      xs | j                  d«      }dt        ‰«      › d�}t        ‰|   t        ‰| j	                  «       «      «      }‰j                  ||f«       |S )NÚdoubleÚsingleÚ__HERMES_CMD_PLACEHOLDER_Ú__)ÚgroupÚlenr&   r   ÚstartÚappend)Úmatchr    ÚtokenÚquotedr   ÚplaceholdersÚreplacementss       €€€r   Úreplace_matchz.render_command_template.<locals>.replace_matchE   sn   ø€ Ø�{‰{˜8Ó$Ò=¨¯©°HÓ(=ˆØ+¬C°Ó,=Ð+>¸bÐAˆÜ*¨<¸Ñ+=Ô?RÐScÐej×epÑepÓerÓ?sÓtˆØ×Ñ˜U F˜OÔ,Øˆr   z{{ú{z}}ú})r8   zre.Match[str]ÚreturnÚstr)Újoinr+   ÚcompileÚsubr   )	r   r;   ÚnamesÚpatternr=   Úrenderedr9   r$   r<   s	   ``      @r   Úrender_command_templaterH   ?   sœ   ú€ à�H‰HÑ>°Ô>Ó>€EÜ�j‰jÐ7¸°wÐ>TÐUZÐT[Ð[`ÐaÓb€GØ*,€L÷ð �{‰{˜=Ð*:Ó;×CÑCÀDÈ#ÓN×VÑVÐW[Ð]`Óa€HØ$ò 2‰ˆˆuØ×#Ñ# E¨5Ó1‰ð2à€Or   c                ó:  — 	 | j                  |j                  «      }|j                  d¬«      D ]  }	  t        ||«      «        Œ  t        ||«      «        y# | j                  $ r Y Œ:w xY w# | j                  $ r Y yt
        $ r  t        ||«      «        Y yw xY w)zIApply ``terminate``/``kill`` to *proc* and all descendants (best effort).T)Ú	recursiveN)ÚProcessÚpidÚchildrenÚgetattrÚNoSuchProcessÚ	Exception)ÚpsutilÚprocÚmethodÚparentÚchilds        r   Ú_signal_process_treerV   R   s¢   € ð Ø—‘ §¡Ó)ˆØ—_‘_¨t�_Ó4ò 	ˆEðØ&”˜˜vÓ&Õ(ð	ð
 	 Œ�˜ÓÕ!øð ×'Ñ'ò Ùðûð ×Ñò ÙÜò  ØŒ��fÓÖð ús:   ‚0A- ³AÁA- ÁA*Á'A- Á)A*Á*A- Á-BÁ>BÂBc           	     ó  ‡ ‡— ‰ j                  «       �yt        j                  dk(  r^	 t        j                  ddddt        ‰ j                  «      gt        j                  t        j                  dt        j                  ¬«       y	 d	dl
Š‰€ˆ fd
„nˆ ˆfd„} |d«       	 ‰ j                  d¬«       y# t        $ r ‰ j                  «        Y yw xY w# t        $ r dŠY ŒUw xY w# t        j                  $ r  |d«       Y yw xY w)zCBest-effort termination of a shell process and all of its children.Nr   Útaskkillz/Fz/Tz/PIDé   )ÚstdoutÚstderrÚtimeoutÚstdinr   c                ó&   •—  t        ‰| «      «       S r*   )rN   )ÚmrR   s    €r   ú<lambda>z0terminate_command_process_tree.<locals>.<lambda>r   s   ø€ Ð)œ  qÓ)Ó+€ r   c                ó   •— t        ‰‰| «      S r*   )rV   )r_   rR   rQ   s    €€r   r`   z0terminate_command_process_tree.<locals>.<lambda>s   s   ø€ Ô2°6¸4ÀÓC€ r   Ú	terminateé   ©r\   Úkill)Úpollr   r    r!   ÚrunrA   rL   ÚDEVNULLrP   re   rQ   ÚImportErrorÚwaitÚTimeoutExpired)rR   ÚsignalrQ   s   ` @r   Úterminate_command_process_treerm   b   sé   ù€ à‡y�yƒ{ÐØÜ	‡w�w�$‚ð	Ü�N‰N˜J¨¨d°F¼CÀÇÁ»MÐJÔS]×SeÑSeÜ",×"4Ñ"4¸aÄz×GYÑGYõ[ð 	ðÛð 17°Ô+ÜCð á
ˆ;ÔðØ�	‰	˜!ˆ	Õøô ò 	Ø�I‰I�KØð	ûô
 ò ØŠðûô ×$Ñ$ò ÙˆvŽðús6   ¨AB3 ÂC Â C# Â3CÃCÃC ÃC Ã#DÄ Dc                óà   — | j                  d«      }t        |t        t        f«      rA|D �cg c]5  }t	        |«      j                  «       sŒt	        |«      j                  «       ‘Œ7 c}S g S c c}w )z^``env_passthrough`` allowlist: parent env vars copied back into the secret-scrubbed child env.Úenv_passthrough)ÚgetÚ
isinstanceÚlistÚtuplerA   Ústrip)ÚconfigÚrawÚxs      r   Úcommand_env_passthroughrx   {   sO   € à
�*‰*Ð&Ó
'€CÜ>HÈÌtÔUZÈmÔ>\ CÖ:˜q¬3¨q«6¯<©<­>ŒC�‹F�L‰L�NÒ:ÐdÐbdÐdùÒ:s   ¬A+ÁA+c                óÀ   — d| j                   fd| j                  ffD ��cg c]  \  }}|sŒ	|› d|j                  «       › �‘Œ }}}dj                  |«      xs dS c c}}w )zU``stderr: ...; stdout: ...`` for a failed command provider, or ``no command output``.r[   rZ   ú: z; zno command output)r[   rZ   rt   rB   )ÚexcÚstreamÚtextÚpartss       r   Úcommand_failure_detailr   �   sc   € à?GÈÏÉÐ>TÐW_Ðad×akÑakÐVlÐ=m×v©\¨V°TÒqu�ˆx�r˜$Ÿ*™*›,˜Ò(Ðv€EÑvØ�9‰9�UÓÒ2Ð2Ð2ùó ws
    
A«Ac                óÎ  ‡— ddl m} ddlm}  |d¬«      }|xs g D ])  }t        j
                  j                  |«      }|€Œ%|||<   Œ+ t        j                  dk(  rdt        t        dd«      ind	d
i}t        j                  | fd
t        j                  t        j                  d
dd ||«      t        j                  dœ|¤Ž}	t        j                  «       Šg g dœ}
ddh}dˆfd„}d|	j                  fd|	j                   ffD ��cg c]  \  }}t#        j$                  |||fd
¬«      ‘Œ! }}}|D ]  }|j'                  «        Œ t)        j*                  «       |z   }d}|r�|t)        j*                  «       z
  }|dk  rd
}nb	 ‰j                  t-        d|«      ¬«      \  }}|€|j1                  |«       ŒU|
|   j3                  |«       t)        j*                  «       |z   }|rŒ�|s2	 |	j5                  t7        d|t)        j*                  «       z
  «      ¬«       |rnt;        |	«       |D ]  }|j=                  d¬«       Œ ‰j?                  «       s:‰jA                  «       \  }}|r|
|   j3                  |«       ‰j?                  «       sŒ:dj=                  |
d   «      dj=                  |
d   «      }}|r.t        j8                  | |||¬«      t        j8                  | |«      ‚|	jB                  r#t        jD                  |	jB                  | ||¬«      ‚t        jF                  | |	jB                  ||«      S c c}}w # t        j.                  $ r Y �Œìw xY w# t        j8                  $ r d
}Y �ŒQw xY w)u=  Run a command-provider shell command with process-tree idle cleanup.
    ``timeout`` is an IDLE timeout, reset whenever the command emits output â€” a slow-but-alive
    provider survives, a silently stalled one is killed. Child env is scrubbed of Hermes secrets
    while propagating delegated-child lineage markers.r   )Údelegated_child_subprocess_env)Úhermes_subprocess_envF)Úinherit_credentialsr   ÚcreationflagsÚCREATE_NEW_PROCESS_GROUPÚstart_new_sessionTúutf-8r   )ÚshellrZ   r[   r}   ÚencodingÚerrorsÚenvr]   )rZ   r[   rZ   r[   c                ó:  •— t        |dd «      xs d}t        t        |dd «      dd «      }	 	 |€|j                  d«      n |d«      j                  |d¬«      }|sn‰j                  | |f«       ŒC	 ‰j                  | d f«       y # ‰j                  | d f«       w xY w)Nr‰   r‡   ÚbufferÚread1i   r   )rŠ   )rN   ÚreadÚdecodeÚput)r    r|   r‰   rŽ   ÚchunkÚoutput_queues        €r   Úread_streamz)run_command_provider.<locals>.read_stream    s¨   ø€ Ü˜6 :¨tÓ4Ò?¸ˆÜœ ¨°$Ó7¸À$ÓGˆð	+ØØ.3¨m˜Ÿ™ EÔ*ÁÀuÃ×ATÑATÐU]ÐfoÐATÓAp�ÙØØ× Ñ  $¨ Ô/ð	 ð ð ×Ñ˜d D˜\Õ*øˆL×Ñ˜d D˜\Õ*ús   ¬AB ÂB)ÚtargetÚargsÚdaemongš™™™™™©?rd   g        g      à?Ú )Úoutputr[   )r    rA   r|   r   r@   ÚNone)$Úagent.delegation_contextr�   Útools.environments.localr‚   r   Úenvironrp   r    rN   r!   ÚPopenÚPIPErh   ÚqueueÚQueuerZ   r[   Ú	threadingÚThreadr6   ÚtimeÚ	monotonicÚminÚEmptyÚdiscardr7   rj   Úmaxrk   rm   rB   ÚemptyÚ
get_nowaitÚ
returncodeÚCalledProcessErrorÚCompletedProcess)Úcommandr\   ro   r�   r‚   ÚscrubbedÚkeyr$   r4   rR   ÚchunksÚopen_streamsr”   r    r|   ÚreadersÚreaderÚdeadlineÚ	timed_outÚ	remainingr’   rZ   r[   r“   s                          @r   Úrun_command_providerr¹   ‡   sS  ø€ õ HÝ>Ù$¸Ô?€HØÒ$ "ò "ˆÜ—
‘
—‘˜sÓ#ˆØÑØ!ˆH�SŠMð"ô WY×V]ÑV]ÐaeÒVeˆoœw¤zÐ3MÈqÓQÑRØ&¨Ð-ð 
ä×Ñ˜Gð ?¨4¼
¿¹ÔPZ×P_ÑP_Ø!%°À	ÑOmÐnvÓOwÜ",×"4Ñ"4ñ?à8=ñ?€Dô >C¿[¹[»]€LØ.0¸BÑ#?€FØ˜hÐ'€Lõ
+ð &.¨t¯{©{Ð$;¸hÈÏÉÐ=TÐ#U÷WÙ�4˜ô ×Ñ {¸$À¸ÐPTÖUð W€Gñ Wàò ˆØ�‰�ðä�~‰~Ó 'Ñ)€HØ€IÙ
ØœtŸ~™~Ó/Ñ/ˆ	Ø˜Š>ØˆIØð	Ø&×*Ñ*´3°t¸YÓ3GÐ*ÓH‰KˆD�%ð ˆ=Ø× Ñ  Ô&ØØˆt‰×Ñ˜EÔ"Ü—>‘>Ó# gÑ-ˆò ñ ð	Ø�I‰Iœc # x´$·.±.Ó2BÑ'BÓCˆIÔDñ Ü& tÔ,Øò 	%ˆFØ�K‰K ˆKÕ$ð	%à×$Ñ$Ô&Ø&×1Ñ1Ó3‰KˆD�%ÙØ�t‘×#Ñ# EÔ*ð ×$Ñ$Õ&ð —W‘W˜V HÑ-Ó.°·±¸¸xÑ8HÓ0IˆF€FÙÜ×'Ñ'¨°ÀÐPVÔWÜ×%Ñ% g¨wÓ7ð	9à‡‚Ü×+Ñ+¨D¯O©O¸WÈVÐ\bÔcÐcÜ×&Ñ& w°·±ÀÈÓPÐPùóOWøô �{‰{ò 	Úð	ûô ×(Ñ(ò 	Ø‹Ið	ús*   Ä$L+Å=L1 Ç!1M Ì1MÍMÍM$Í#M$c                óp   — t        | t        «      r| j                  |«      nd}t        |t        «      r|S i S )z;Return ``config[name]`` if it's a dict, else an empty dict.N)rq   Údictrp   )ru   r    Úsections      r   Ú_get_provider_sectionr½   ×   s/   € ä",¨V´TÔ":ˆf�j‰j˜ÔÀ€GÜ  ¬$Ô/ˆ7Ð7°RÐ7r   c                óœ   — t        | d«      j                  |«      }t        |t        «      r|S |j	                  «       |vrt        | |«      S i S )uÀ   ``<section>.providers.<name>`` (canonical), else ``<section>.<name>`` for non-built-in names
    only â€” refused for built-ins so a user's ``openai:`` block still means OpenAI, not a command.Ú	providers)r½   rp   rq   r»   Úlower)ru   r    Úbuiltinsr¼   s       r   Ú_named_provider_configrÂ   Ý   sK   € ô $ F¨KÓ8×<Ñ<¸TÓB€GÜ�'œ4Ô ØˆØ26·*±*³,ÀhÑ2NÔ  ¨Ó.ÐVÐTVÐVr   c                ó  — t        | t        «      syt        | j                  d«      xs d«      j	                  «       j                  «       }| j                  d«      }|dv xr+ t        |t        «      xr t        |j	                  «       «      S )zRTrue when *config* declares a command-type provider (has a non-empty ``command``).FÚtyper˜   r¯   )r˜   r¯   )rq   r»   rA   rp   rt   rÀ   Úbool)ru   Úptyper¯   s      r   Ú_is_command_provider_configrÇ   æ   sn   € ä�fœdÔ#ØÜ�—
‘
˜6Ó"Ò( bÓ)×/Ñ/Ó1×7Ñ7Ó9€EØ�j‰j˜Ó#€GØ�OÐ#ÒZ¬
°7¼CÓ(@ÒZÄTÈ'Ï-É-Ë/ÓEZÐZr   c                óŒ   — | xs dj                  «       j                  «       }|r||v ryt        |||«      }t        |«      r|S dS )z^Config of a user-declared command provider; None for *reserved* names, unknown or non-command.r˜   N)rÀ   rt   rÂ   rÇ   )Úproviderru   Úreservedr±   Únameds        r   Ú_resolve_command_configrÌ   ï   sK   € ð Š>�r×
 Ñ
 Ó
"×
(Ñ
(Ó
*€CÙ�#˜‘/ØÜ" 6¨3°Ó9€EÜ/°Ô6ˆ5Ð@¸DÐ@r   c                óÂ   — | j                  d| j                  d|«      «      }	 t        |«      }|dkD  r|S t        |«      S # t        t        f$ r t        |«      cY S w xY w)z]Timeout in seconds (``timeout`` > ``timeout_seconds``); invalid or non-positive -> *default*.r\   Útimeout_secondsr   )rp   ÚfloatÚ	TypeErrorÚ
ValueError)ru   Údefaultrv   r$   s       r   Ú_command_timeoutrÓ   ù   sc   € à
�*‰*�Y §
¡
Ð+<¸gÓ FÓ
G€CðÜ�c“
ˆð ˜A’Iˆ5Ð1¤5¨£>Ð1øô ”zÐ"ò Ü�W‹~Òðús   ¤A ÁAÁAc                óÎ   — | j                  d«      xs | j                  d«      xs |}t        |«      j                  «       j                  «       j	                  d«      }||v r|S |S )zEValidated ``format``/``output_format`` from *config*, else *default*.ÚformatÚoutput_formatú.)rp   rA   rÀ   rt   Úlstrip)ru   ÚformatsrÒ   rv   Úfmts        r   Ú_command_output_formatrÛ     sX   € à
�*‰*�XÓ
Ò
H &§*¡*¨_Ó"=Ò
HÀ€CÜ
ˆc‹(�.‰.Ó
×
 Ñ
 Ó
"×
)Ñ
)¨#Ó
.€CØ˜‘.ˆ3Ð- gÐ-r   >   ÚxaiÚedgeÚpiperÚgeminiÚneuttsÚopenaiÚminimaxÚmistralÚ	deepinfraÚ	kittenttsÚ
elevenlabséx   Úmp3>   ÚaacÚamrÚm4arè   ÚoggÚwavÚflacÚopusiˆ  )rÁ   )rÊ   )rÒ   c              #  óÄ   K  — t        | d«      j                  «       D ]?  \  }}t        |t        «      sŒ|j	                  «       t
        vsŒ.t        |«      sŒ:||f–— ŒA y­w)zDYield (name, config) pairs for every declared command-type provider.r¿   N)r½   Úitemsrq   rA   rÀ   ÚBUILTIN_TTS_PROVIDERSrÇ   )Ú
tts_configr    Úcfgs      r   Ú_iter_command_providersrõ     sS   è ø€ ä*¨:°{ÓC×IÑIÓKò ‰	ˆˆcÜ�dœCÕ  T§Z¡Z£\Ô9NÒ%NÔSnÐorÕSsØ˜�)‹Oñùs   ‚1A ´A ÁA Á	A c                óÈ   — |r@t        |«      j                  j                  «       j                  «       j	                  d«      nd}|t
        v r|S t        | t
        t        «      S )zZValidated output format: the output path's suffix wins, then ``format``/``output_format``.r×   r˜   )r   ÚsuffixrÀ   rt   rØ   ÚCOMMAND_TTS_OUTPUT_FORMATSrÛ   Ú!DEFAULT_COMMAND_TTS_OUTPUT_FORMAT)ru   Úoutput_pathr÷   s      r   Ú_get_command_tts_output_formatrû   #  sS   € áEPŒT�+Ó×%Ñ%×+Ñ+Ó-×3Ñ3Ó5×<Ñ<¸SÔAÐVX€FØÔ+Ñ+ØˆÜ! &Ô*DÔFgÓhÐhr   c                ó8   — t        | j                  dd«      «      S )z>True only when the user explicitly opted in to voice delivery.Úvoice_compatibleF)r
   rp   )ru   s    r   Ú _is_command_tts_voice_compatiblerþ   +  s   € ä˜6Ÿ:™:Ð&8¸%Ó@ÓAÐAr   c                ó<   — | j                  dt        |«      › �«      S )zKReturn an output path whose extension matches the provider's output_format.r×   )Úwith_suffixrû   )Úpathru   s     r   Ú#_configured_command_tts_output_pathr  0  s!   € à×Ñ˜aÔ >¸vÓ FÐGÐHÓIÐIr   c                ó®  — t        |j                  d«      xs d«      j                  «       }|st        d|› d�«      ‚t	        |«      j                  «       }|j                  j                  dd¬«       |j                  «       r|j                  «        t        |«      }t        j                  «       5 }t	        |«      dz  }	|	j                  | d¬	«       t        |	«      t        |	«      t        |«      t        |t        |«      «      t        |j                  d
d«      «      t        |j                  dd«      «      t        |j                  d|j                  dd«      «      «      dœ}
t        ||
«      }	 t!        ||t#        |«      ¬«       	 ddd«       |j                  «       r|j1                  «       j2                  dk  rt)        d|› d|› �«      ‚t        |«      S # t$        j&                  $ r}t)        d|› d|d›d�«      |‚d}~wt$        j*                  $ r-}t)        d|› d|j,                  › dt/        |«      › �«      |‚d}~ww xY w# 1 sw Y   Œ¿xY w)zÆGenerate speech by running a user-configured shell command; returns the audio path it wrote.
    Raises ``ValueError`` for bad provider config, ``RuntimeError`` for timeouts / bad exits / no output.r¯   r˜   ztts.providers.z.command is not configuredT)ÚparentsÚexist_okz	input.txtr‡   )r‰   ÚvoiceÚmodelÚspeed)Ú
input_pathÚ	text_pathrú   rÕ   r  r  r  )ro   zTTS provider 'z' timed out after ÚgÚsNz' exited with code rz   r   z' produced no output at )rA   rp   rt   rÑ   r   Ú
expanduserrT   ÚmkdirÚexistsÚunlinkÚ_get_command_tts_timeoutÚtempfileÚTemporaryDirectoryÚ
write_textrû   rH   r¹   rx   r!   rk   ÚRuntimeErrorr­   r¬   r   ÚstatÚst_size)r}   rú   Úprovider_nameru   ró   r   r™   r\   Útmpdirr
  r;   r¯   r{   s                r   Ú_generate_command_ttsr  5  s"  € ô
 ˜6Ÿ:™: iÓ0Ò6°BÓ7×=Ñ=Ó?ÐÙÜ˜>¨-¨Ð8RÐSÓTÐTÜ�+Ó×)Ñ)Ó+€FØ
‡M�M×Ñ ¨tÐÔ4Ø‡}�}„Ø�‰ŒÜ& vÓ.€GÜ	×	$Ñ	$Ó	&ð ¨&Ü˜“L ;Ñ.ˆ	Ø×Ñ˜T¨GÐÔ4ä˜i›.´s¸9³~ÔVYÐZ`ÓVaÜ4°V¼SÀ»[ÓIÜ˜Ÿ™ G¨RÓ0Ó1¼CÀÇ
Á
È7ÐTVÓ@WÓ<XÜ˜Ÿ™ G¨Z¯^©^¸GÀRÓ-HÓIÓJñ	
ˆô *Ð*:¸LÓIˆð	Ü  ¨'ÔCZÐ[aÓCbÖc÷ð$ �=‰=Œ?˜fŸk™k›m×3Ñ3°qÒ8Ü˜^¨M¨?Ð:RÐSYÐRZÐ[Ó\Ð\Üˆv‹;Ðøô ×(Ñ(ò 	hÜ °¨Ð>PÐQXÐYZÐP[Ð[\Ð]Ó^ÐdgÐgûÜ×,Ñ,ò 	ÜØ   Ð/BÀ3Ç>Á>ÐBRÐRTÔUkÐloÓUpÐTqÐróàðûð	ú÷ð ús7   Â3CIÅ5GÇIÇ1HÈIÈ(IÉIÉIÉI)r   rA   r   Úintr@   úOptional[str])r$   rA   r%   r  r@   rA   )r   rA   r;   zDict[str, str]r@   rA   )rQ   r   rR   úsubprocess.PopenrS   rA   r@   rš   )rR   r  r@   rš   )ru   úDict[str, Any]r@   rr   )r{   zsubprocess.CalledProcessErrorr@   rA   r*   )r¯   rA   r\   rÏ   ro   zOptional[list]r@   zsubprocess.CompletedProcess)ru   r  r    rA   r@   r  )ru   r  r    rA   rÁ   úFrozenSet[str]r@   r  )ru   r  r@   rÅ   )rÉ   rA   ru   r  rÊ   r  r@   zOptional[Dict[str, Any]])ru   r  rÒ   rÏ   r@   rÏ   )ru   r  rÙ   r  rÒ   rA   r@   rA   )ró   r  )ru   r  rú   r  r@   rA   )r  r   ru   r  r@   r   )r}   rA   rú   rA   r  rA   ru   r  ró   r  r@   rA   )2Ú__doc__Ú
__future__r   r   r    r+   r#   r!   r  r¢   r¤   Ú	functoolsr   Úpathlibr   Útypingr   r   r   r	   Úutilsr
   r   r&   rH   rV   rm   rx   r   r¹   r½   rÂ   rÇ   rÌ   rÓ   rÛ   Ú	frozensetrò   Ú#DEFAULT_COMMAND_TTS_TIMEOUT_SECONDSrù   rø   Ú#DEFAULT_COMMAND_TTS_MAX_TEXT_LENGTHÚ_get_named_provider_configÚ _resolve_command_provider_configr  rõ   rû   rþ   r  r  r   r   r   ú<module>r+     s„  ðñ	õ #ã 	Û Û 	Û Û Û Û Û Ý Ý ß 1Ó 1å !óó2Wóó& ó ó2eó3ð EIðLQØðLQØ ðLQØ3AðLQà óLQó`8óWó[ðAØðAØ)ðAØ5CðAØH`óAó2ó.ñ "ò #1ó 2Ð ð '*Ð #Ø$)Ð !Ù&Ò'aÓbÐ Ø&*Ð #ñ %Ð%;ÐF[Ô\Ð Ù#*Ð+BÐMbÔ#cÐ  Ù"Ð#3Ð=`ÔaÐ óôióBó
Jð
!Ø
ð!Øð!Ø03ð!Ø=Kð!ØYgð!àô!r   