+
    lHàj�C  ã                  óú  € 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	t	^ RI
t
^ RIHt ^ RIHt ^ RIHtHtHtHt ^ RIH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 R ltR R ltR4R 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$]%! 0 R5m4      t&^xt'R%t(]%! 0 R6m4      t)R&t*]! ] ]&R'7      t+]! ]"]&R(7      t,]! ]#]'R)7      t-R* R+ lt.R4R, R- llt/R. R/ lt0R0 R1 lt1R2 R3 lt2R# )7aº  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               ó$   € V ^8„  d   QhRRRRRR/# )é   Úcommand_templateÚstrÚpositionÚintÚreturnúOptional[str]© )Úformats   "Ú?/home/ubuntu/.hermes/hermes-agent/tools/tts_command_provider.pyÚ__annotate__r      s!   € ÷ ñ ¨#ð ¸ð Àñ ó    c                óæ   € RpRp^ pWA8  de   W,          pVR8X  d   VR8X  d   RpM@VR8X  d    V'       d   RpM.VR8X  d   RpM$VR8X  d   RpMVR9   d   TpMVR8X  d
   V^,          pV^,          pKj  V# )zRReturn the shell quote char (``'``/``"``) active right before *position*, or None.NFÚ'Ú"Ú\T)r   r   r   )r   r   ÚquoteÚescapedÚiÚchars   &&    r   Úshell_quote_contextr      s…   € à€EØ€GØ	€AØ
Œ,ØÕ"ˆØ�CŒ<Ø�sŒ{Ø�øØ�cŒ\ßØ‘Ø˜”Ø‘Ø˜”Ø�øØ�ZÔØ‰EØ�TŒ\Ø��FˆAØ	ˆQ�ŠØ€Lr   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úvaluer   Úquote_contextr   r   r   )r   s   "r   r   r   6   s&   € ÷ Wñ W Sð W¸ð WÈ3ñ Wr   c                óJ  € VR8X  d   V P                  RR4      # VR8X  dC   V P                  RR4      P                  RR4      P                  RR4      P                  R	R
4      # \        P                  R8X  d   \        P                  ! V .4      # \
        P                  ! V 4      # )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   )r!   r"   s   &&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               ó$   € V ^8„  d   QhRRRRRR/# )r   r   r   Úplaceholderszdict[str, str]r   r   )r   s   "r   r   r   ?   s"   € ÷ ñ ¨cð Àð ÐTWñ r   c                ó,  a aa€ RP                  R S 4       4      p\        P                  ! RV RV R24      p. oR V VV3R llpVP                  VS 4      P	                  RR	4      P	                  R
R4      pS F  w  rgVP	                  Wg4      pK  	  V# )zMReplace ``{name}`` placeholders (quote-aware) while preserving ``{{``/``}}``.Ú|c              3  óN   "  € T F  p\         P                  ! V4      x € K  	  R # 5i©N)ÚreÚescape)Ú.0r)   s   & r   Ú	<genexpr>Ú*render_command_template.<locals>.<genexpr>A   s   é € Ð>±¨”R—Y’Y˜t—_�_³ùs   ‚#%z(?<!\$)(?:\{\{(?P<double>z)\}\}|\{(?P<single>z)\})c               ó    € V ^8„  d   QhRRRR/# )r   Úmatchzre.Match[str]r   r   r   )r   s   "r   r   Ú-render_command_template.<locals>.__annotate__E   s   € ÷ ñ ˜]ð ¨sñ r   c                óô   <€ V P                  R 4      ;'       g    V P                  R4      pR\        S4       R2p\        SV,          \        SV P	                  4       4      4      pSP                  W#34       V# )ÚdoubleÚsingleÚ__HERMES_CMD_PLACEHOLDER_Ú__)ÚgroupÚlenr-   r   ÚstartÚappend)r:   r)   ÚtokenÚquotedr   r/   Úreplacementss   &   €€€r   Úreplace_matchÚ.render_command_template.<locals>.replace_matchE   so   ø€ Ø�{‰{˜8Ó$×=Ð=¨¯©°HÓ(=ˆØ+¬C°Ó,=Ð+>¸bÐAˆÜ*¨<¸Õ+=Ô?RÐScÐej×epÑepÓerÓ?sÓtˆØ×Ñ˜U˜OÔ,Øˆr   z{{Ú{z}}Ú})Újoinr4   ÚcompileÚsubr'   )	r   r/   ÚnamesÚpatternrH   ÚrenderedrE   r!   rG   s	   ff      @r   Úrender_command_templaterR   ?   s˜   ú€ à�H‰HÑ>±Ó>Ó>€EÜ�jŠjÐ7¸°wÐ>TÐUZÐT[Ð[`ÐaÓb€GØ*,€L÷ò ð �{‰{˜=Ð*:Ó;×CÑCÀDÈ#ÓN×VÑVÐW[Ð]`Óa€HÛ$‰ˆØ×#Ñ# EÓ1Šñ %à€Or   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   Úpsutilr   Úprocúsubprocess.PopenÚmethodr   r   ÚNoner   )r   s   "r   r   r   R   s)   € ÷  ñ   ð  Ð,<ð  Àcð  Èdñ  r   c                óL  €  V P                  VP                  4      pVP                  RR7       F  p \        WB4      ! 4        K  	  \        W24      ! 4        R#   T P                   d     K>  i ; i  T P                   d     R# \
         d    \        Y4      ! 4         R# i ; i)zIApply ``terminate``/``kill`` to *proc* and all descendants (best effort).T)Ú	recursiveN)ÚProcessÚpidÚchildrenÚgetattrÚNoSuchProcessÚ	Exception)rT   rU   rW   ÚparentÚchilds   &&&  r   Ú_signal_process_treerc   R   s‘   € ð Ø—‘ §¡Ó)ˆØ—_‘_¨t�_Ö4ˆEðÜ˜Ô&Ö(ñ 5ô
 	�ÔÖ!øð ×'Ñ'ô Úðûð ×Ñô ÚÜô  Ü�Ô×ð ús@   ‚0A1 ³AÁA1 ÁA.Á*A1 Á-A.Á.A1 Á1B#ÂB#ÂB#Â"B#c               ó    € V ^8„  d   QhRRRR/# )r   rU   rV   r   rX   r   )r   s   "r   r   r   b   s   € ÷ ñ Ð)9ð ¸dñ r   c           
     óJ  a a€ S P                  4       e   R# \        P                  R8X  dn    ^ RIHp \
        P                  ! RRRR\        S P                  4      .\
        P                  \
        P                  ^\
        P                  V! 4       RR	7       R#  ^ RIoSf   V 3R
 lMV V3R lpV! R4        S P                  ^R7       R#   \         d    S P                  4         R# i ; i  \         d    Ro L_i ; i  \
        P                   d    T! R4        R# i ; i)zCBest-effort termination of a shell process and all of its children.Nr&   )Úwindows_hide_flagsÚtaskkillz/Fz/Tz/PIDF)ÚstdoutÚstderrÚtimeoutÚstdinÚcreationflagsÚcheckc                ó&   <€ \        SV 4      ! 4       # r3   )r^   )ÚmrU   s   &€r   Ú<lambda>Ú0terminate_command_process_tree.<locals>.<lambda>v   s   ø€ œ  qÔ)Ô+r   c                ó   <€ \        SSV 4      # r3   )rc   )ro   rU   rT   s   &€€r   rp   rq   w   s   ø€ Ô2°6¸4ÀÔCr   Ú	terminate©rj   Úkill)Úpollr(   r)   Úhermes_cli._subprocess_compatrf   r*   Úrunr   r\   ÚDEVNULLr`   ru   rT   ÚImportErrorÚwaitÚTimeoutExpired)rU   rf   ÚsignalrT   s   f  @r   Úterminate_command_process_treer~   b   s÷   ù€ à‡y�yƒ{ÒÙÜ	‡w�w�$„ð	õ IÜ�NŠN˜J¨¨d°F¼CÀÇÁ»MÐJÔS]×SeÑSeÜ",×"4Ñ"4¸aÄz×GYÑGYÙ);Ó)=ÀUõLñ
 	ðÛð 17²Õ+ÝCð á
ˆ;ÔðØ�	‰	˜!ˆ	Öøô ô 	Ø�I‰I�KÙð	ûô
 ô ØŠðûô ×$Ñ$ô Ùˆv�ðús6   ­A*C ÂC. Â8D ÃC+Ã*C+Ã.C>Ã=C>ÄD"Ä!D"c               ó    € V ^8„  d   QhRRRR/# )r   Úconfigúdict[str, Any]r   Úlistr   )r   s   "r   r   r      s   € ÷ eñ e Nð e°tñ er   c                óþ   € V P                  R4      p\        V\        \        34      '       dK   V Uu. uF=  p\	        V4      P                  4       '       g   K$  \	        V4      P                  4       NK?  	  up# . # u upi )z^``env_passthrough`` allowlist: parent env vars copied back into the secret-scrubbed child env.Úenv_passthrough)ÚgetÚ
isinstancer‚   Útupler   Ústrip)r€   ÚrawÚxs   &  r   Úcommand_env_passthroughr‹      sX   € à
�*‰*Ð&Ó
'€CÜ>HÈÌtÔUZÈm×>\Ò>\¡CÓ:¡C˜q¬3¨q«6¯<©<¯>ŒNŒC�‹F�L‰LŽN¡CÑ:ÐdÐbdÐdùÒ:s   ²!A:ÁA:c               ó    € V ^8„  d   QhRRRR/# )r   Úexczsubprocess.CalledProcessErrorr   r   r   )r   s   "r   r   r   …   s   € ÷ 3ñ 3Ð =ð 3À#ñ 3r   c                óÜ   € RV P                   3RV P                  33 UUu. uF$  w  rV'       g   K  V RVP                  4        2NK&  	  pppRP                  V4      ;'       g    R# u uppi )zU``stderr: ...; stdout: ...`` for a failed command provider, or ``no command output``.ri   rh   ú: z; zno command output)ri   rh   rˆ   rL   )r�   ÚstreamÚtextÚpartss   &   r   Úcommand_failure_detailr“   …   sj   € à?GÈÏÉÐ>TÐW_Ðad×akÑakÐVlÑ=mÔvÑ=m©\¨VÔquÔ(�ˆx�r˜$Ÿ*™*›,˜Ó(Ñ=m€EÑvØ�9‰9�UÓ×2Ð2Ð2Ð2ùó ws
    A(±A(c               ó    € V ^8„  d   QhRRRR/# )r   Úos_namer   r   r�   r   )r   s   "r   r   r   ‹   s   € ÷ 'ñ '¨ð '°ñ 'r   c                ó6   € ^ RI Hp V R8X  d
   RV! 4       /# RR/# )uí  Process-group spawn kwargs for a command-provider child, per platform.

On Windows the shell=True spawn routes through cmd.exe, a console-subsystem
shim: with only CREATE_NEW_PROCESS_GROUP it allocates a *visible* console
window flash on every provider run from a windowless host (pythonw gateway,
TUI, Desktop). The shared detach bundle (hermes_cli._subprocess_compat.
windows_detach_flags_without_breakaway) adds CREATE_NO_WINDOW so the child
owns a hidden console its descendants inherit instead â€” deliberately without
CREATE_BREAKAWAY_FROM_JOB: this child is foreground-owned and killed by us on
idle timeout, so job teardown propagation must keep working. POSIX keeps the
session detach (setsid) so the tree can be signalled on idle timeout.
)Ú&windows_detach_flags_without_breakawayr&   rl   Ústart_new_sessionT)rw   r—   )r•   r—   s   & r   Úprovider_popen_group_kwargsr™   ‹   s)   € õ UØ�$„ØÑ!GÓ!IÐJÐJØ Ð&Ð&r   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   Úcommandr   rj   Úfloatr„   zOptional[list]r   zsubprocess.CompletedProcessr   )r   s   "r   r   r   ž   s8   € ÷ PQñ PQØðPQØ ðPQØ3AðPQà ñPQr   c                ó�  a€ ^ RI Hp ^ RIHp ^ RIHp V! RR7      pT;'       g    .  F3  pV! V\        P                  P                  V4      4      pVf   K/  W†V&   K5  	  \        \        P                  4      p	\        P                  ! V 3RRR\        P                  R	\        P                  R
RRRRRRV! V4      R\        P                  /V	B p
\        P                   ! 4       oR. R	. /pRR	0pR V3R llpRV
P"                  3R	V
P$                  33 UUu. uF  w  rï\&        P(                  ! WÞV3RR7      NK!  	  pppV F  pVP+                  4        K  	  \,        P.                  ! 4       V,           pRpV'       d“   V\,        P.                  ! 4       ,
          pV^ 8:  d   RpMl SP                  \1        RV4      R7      w  ppTf   TP5                  T4       Ke  Y¾,          P7                  T4       \,        P.                  ! 4       T,           pKš  V'       g8    V
P9                  \;        RV\,        P.                  ! 4       ,
          4      R7       V'       ds   \?        V
4       V F  pVPA                  RR7       K  	  SPC                  4       '       g7   SPE                  4       w  ppV'       g   K3  W¾,          P7                  V4       KL  RPA                  VR,          4      RPA                  VR	,          4      ppV'       d/   \        P<                  ! WVVR7      \        P<                  ! W4      hV
PF                  '       d%   \        PH                  ! V
PF                  V VVR7      h\        PJ                  ! W
PF                  VV4      # u uppi   \        P2                   d     EK0  i ; i  \        P<                   d    Rp ELui ; i)u1  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.)Údelegated_child_subprocess_env)Úresolve_passthrough_value)Úhermes_subprocess_envF)Úinherit_credentialsÚshellTrh   ri   r‘   Úencodingúutf-8Úerrorsr'   Úenvrk   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r)   r   r�   r   r   rX   r   )r   s   "r   r   Ú*run_command_provider.<locals>.__annotate__»   s!   € ÷ 
+ñ 
+˜#ð 
+ sð 
+¨tñ 
+r   c                óV  <€ \        VR R4      ;'       g    Rp\        \        VRR4      RR4      p  Vf   VP                  R4      MV! R4      P                  VRR7      pV'       g   MSP                  W34       KL  SP                  V R34       R#   SP                  T R34       i ; i)r£   Nr¤   ÚbufferÚread1i   r'   )r¥   )r^   ÚreadÚdecodeÚput)r)   r�   r£   r«   ÚchunkÚoutput_queues   &&   €r   Úread_streamÚ)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   ²6B Á)B ÂB()ÚtargetÚargsÚdaemongš™™™™™©?rt   g        g      à?Ú )Úoutputri   )&Úagent.delegation_contextrž   Útools.env_passthroughrŸ   Útools.environments.localr    r(   Úenvironr…   r™   r)   r*   ÚPopenÚPIPEry   ÚqueueÚQueuerh   ri   Ú	threadingÚThreadrC   ÚtimeÚ	monotonicÚminÚEmptyÚdiscardrD   r{   Úmaxr|   r~   rL   ÚemptyÚ
get_nowaitÚ
returncodeÚCalledProcessErrorÚCompletedProcess)r›   rj   r„   rž   rŸ   r    ÚscrubbedÚkeyr!   rA   rU   ÚchunksÚopen_streamsr±   r)   r�   ÚreadersÚreaderÚdeadlineÚ	timed_outÚ	remainingr¯   rh   ri   r°   s   &&&                     @r   Úrun_command_providerrÖ   ž   sE  ø€ õ HÝ?Ý>Ù$¸Ô?€HØ×$Ð$ "Ò$ˆñ *¨#¬r¯z©z¯~©~¸cÓ/BÓCˆØÔØ!�S‹Mñ %ô (¬¯©Ó0€EÜ×Ò˜Gñ ?¨4ð ?¼
¿¹ð ?ÔPZ×P_ÑP_ð ?Ø!%ð?Ø07ð?Ø@Ið?ÙOmÐnvÓOwð?ä",×"4Ñ"4ð?à8=ñ?€Dô <A¿;º;»=€LØ$,¨b°(¸BÐ#?€FØ˜hÐ'€L÷
+ð 
+ð &.¨t¯{©{Ð$;¸hÈÏÉÐ=TÑ#UôWÙ#U‘<�4ô ×Ò {À¸ÐPT×UÙ#Uð ñ WãˆØ�‰Žñ ä�~Š~Ó 'Õ)€HØ€Iß
ØœtŸ~š~Ó/Õ/ˆ	Ø˜Œ>ØˆIØð	Ø&×*Ñ*´3°t¸YÓ3GÐ*ÓH‰KˆD�%ð Š=Ø× Ñ  Ô&ÙØ�×Ñ˜EÔ"Ü—>’>Ó# gÕ-Šßð	Ø�I‰Iœc # x´$·.².Ó2BÕ'BÓCˆIÔD÷ Ü& tÔ,ÛˆFØ�K‰K ˆKÖ$ñ à×$Ñ$×&Ò&Ø&×1Ñ1Ó3‰KˆD�%ß‰uØ•×#Ñ# EÖ*Ø—W‘W˜V HÕ-Ó.°·±¸¸xÕ8HÓ0IˆF€FßÜ×'Ò'¨ÀÐPVÔWÜ×%Ò% gÓ7ð	9à‡‡€Ü×+Ò+¨D¯O©O¸WÈVÐ\bÔcÐcÜ×&Ò& w·±ÀÈÓPÐPùóOWøô �{‰{ô 	Ûð	ûô ×(Ñ(ô 	Ø‹Ið	ús*   Ä%NÆ%N È6N* ÎN'Î&N'Î*OÏOc               ó$   € V ^8„  d   QhRRRRRR/# )r   r€   r�   r)   r   r   r   )r   s   "r   r   r   ò   s!   € ÷ 8ñ 8 .ð 8¸ð 8Àñ 8r   c                óˆ   € \        V \        4      '       d   V P                  V4      MRp\        V\        4      '       d   V# / # )z;Return ``config[name]`` if it's a dict, else an empty dict.N)r†   Údictr…   )r€   r)   Úsections   && r   Ú_get_provider_sectionrÛ   ò   s5   € ä",¨V´T×":Ò":ˆf�j‰j˜ÔÀ€GÜ  ¬$×/Ò/ˆ7Ð7°RÐ7r   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   r€   r�   r)   r   Úbuiltinsúfrozenset[str]r   r   )r   s   "r   r   r   ø   s/   € ÷ Wñ W >ð W¸ð WÈð WÐ[iñ Wr   c                ó¬   € \        V R4      P                  V4      p\        V\        4      '       d   V# VP	                  4       V9  d   \        W4      # / # )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Û   r…   r†   rÙ   Úlower)r€   r)   rÝ   rÚ   s   &&& r   Ú_named_provider_configrâ   ø   sL   € ô $ F¨KÓ8×<Ñ<¸TÓB€GÜ�'œ4× Ò ØˆØ26·*±*³,ÀhÔ2NÔ  Ó.ÐVÐTVÐVr   c               ó    € V ^8„  d   QhRRRR/# ©r   r€   r�   r   Úboolr   )r   s   "r   r   r     s   € ÷ [ñ [¨ð [¸4ñ [r   c                óP  € \        V \        4      '       g   R# \        V P                  R4      ;'       g    R4      P	                  4       P                  4       pV P                  R4      pVR9   ;'       d2    \        V\        4      ;'       d    \        VP	                  4       4      # )zRTrue when *config* declares a command-type provider (has a non-empty ``command``).FÚtyper¶   r›   )r¶   r›   )r†   rÙ   r   r…   rˆ   rá   rå   )r€   Úptyper›   s   &  r   Ú_is_command_provider_configré     sz   € ä�fœd×#Ò#ÙÜ�—
‘
˜6Ó"×(Ð( bÓ)×/Ñ/Ó1×7Ñ7Ó9€EØ�j‰j˜Ó#€GØ�OÑ#×ZÐZ¬
°7¼CÓ(@×ZÐZÄTÈ'Ï-É-Ë/ÓEZÐZr   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   Úproviderr   r€   r�   ÚreservedrÞ   r   zOptional[dict[str, Any]]r   )r   s   "r   r   r   
  s2   € ÷ Añ AØðAØ)ðAØ5CðAØH`ñAr   c                ó´   € T ;'       g    RP                  4       P                  4       pV'       d   W29   d   R# \        WV4      p\        V4      '       d   V# R# )z^Config of a user-declared command provider; None for *reserved* names, unknown or non-command.r¶   N)rá   rˆ   râ   ré   )rë   r€   rì   rÎ   Únameds   &&&  r   Ú_resolve_command_configrï   
  sL   € ð �>ˆ>�r×
 Ñ
 Ó
"×
(Ñ
(Ó
*€Cß�#”/ÙÜ" 6°Ó9€EÜ/°×6Ò6ˆ5Ð@¸DÐ@r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r€   r�   Údefaultrœ   r   r   )r   s   "r   r   r     s!   € ÷ 2ñ 2˜^ð 2°eð 2Àñ 2r   c                óÊ   € V P                  RV P                  RV4      4      p \        V4      pT^ 8”  d   T# \        T4      #   \        \        3 d    \        T4      u # i ; i)z]Timeout in seconds (``timeout`` > ``timeout_seconds``); invalid or non-positive -> *default*.rj   Útimeout_seconds)r…   rœ   Ú	TypeErrorÚ
ValueError)r€   rñ   r‰   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               ó(   € V ^8„  d   QhRRRRRRRR/# )r   r€   r�   ÚformatsrÞ   rñ   r   r   r   )r   s   "r   r   r     s*   € ÷ .ñ . >ð .¸Nð .ÐUXð .Ð]`ñ .r   c                óê   € V P                  R4      ;'       g    V P                  R4      ;'       g    Tp\        V4      P                  4       P                  4       P	                  R4      pWA9   d   V# T# )zEValidated ``format``/``output_format`` from *config*, else *default*.r   Úoutput_formatÚ.)r…   r   rá   rˆ   Úlstrip)r€   rø   rñ   r‰   Úfmts   &&&  r   Ú_command_output_formatrþ     s\   € à
�*‰*�XÓ
×
HÐ
H &§*¡*¨_Ó"=×
HÐ
HÀ€CÜ
ˆc‹(�.‰.Ó
×
 Ñ
 Ó
"×
)Ñ
)¨#Ó
.€CØ”.ˆ3Ð- gÐ-r   Úmp3iˆ  )rÝ   )rì   )rñ   c               ó   € V ^8„  d   QhRR/# )r   Ú
tts_configr�   r   )r   s   "r   r   r   7  s   € ÷ ñ ¨ñ r   c              #  óê   "  € \        V R4      P                  4        FP  w  r\        V\        4      '       g   K  VP	                  4       \
        9  g   K8  \        V4      '       g   KK  W3x € KR  	  R# 5i)zDYield (name, config) pairs for every declared command-type provider.rà   N)rÛ   Úitemsr†   r   rá   ÚBUILTIN_TTS_PROVIDERSré   )r  r)   Úcfgs   &  r   Ú_iter_command_providersr  7  sP   é € ä*¨:°{ÓC×IÑIÖK‰	ˆÜ�dœC× Ô  T§Z¡Z£\Ô9NÖ%NÔSnÐor×SsÔSsØ�)ŒOó Lùs   ‚3A3ºA3ÁA3Á(A3c               ó$   € V ^8„  d   QhRRRRRR/# )r   r€   r�   Úoutput_pathr   r   r   r   )r   s   "r   r   r   >  s'   € ÷ iñ i¨>ð iÈð iÐadñ ir   c                óÚ   € V'       dA   \        V4      P                  P                  4       P                  4       P	                  R4      MRpV\
        9   d   V# \        V \
        \        4      # )zZValidated output format: the output path's suffix wins, then ``format``/``output_format``.rû   r¶   )r   Úsuffixrá   rˆ   rü   ÚCOMMAND_TTS_OUTPUT_FORMATSrþ   Ú!DEFAULT_COMMAND_TTS_OUTPUT_FORMAT)r€   r  r
  s   && r   Ú_get_command_tts_output_formatr  >  sS   € çEPŒT�+Ó×%Ñ%×+Ñ+Ó-×3Ñ3Ó5×<Ñ<¸SÔAÐVX€FØÔ+Ô+ØˆÜ! &Ô*DÔFgÓhÐhr   c               ó    € V ^8„  d   QhRRRR/# rä   r   )r   s   "r   r   r   F  s   € ÷ Bñ B¨^ð BÀñ Br   c                ó8   € \        V P                  RR4      4      # )z>True only when the user explicitly opted in to voice delivery.Úvoice_compatibleF)r	   r…   )r€   s   &r   Ú _is_command_tts_voice_compatibler  F  s   € ä˜6Ÿ:™:Ð&8¸%Ó@ÓAÐAr   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úpathr   r€   r�   r   r   )r   s   "r   r   r   K  s&   € ÷ Jñ J¨dð J¸Nð JÈtñ Jr   c                ó<   € V P                  R\        V4       24      # )zKReturn an output path whose extension matches the provider's output_format.rû   )Úwith_suffixr  )r  r€   s   &&r   Ú#_configured_command_tts_output_pathr  K  s!   € à×Ñ˜aÔ >¸vÓ FÐGÐHÓIÐIr   c               ó0   € V ^8„  d   QhRRRRRRRRRRRR/# )	r   r‘   r   r  Úprovider_namer€   r�   r  r   r   )r   s   "r   r   r   P  s<   € ÷ !ñ !Ø
ð!Øð!Ø03ð!Ø=Kð!ØYgð!àñ!r   c                ó  € \        VP                  R4      ;'       g    R4      P                  4       pV'       g   \        RV R24      h\	        V4      P                  4       pVP                  P                  RRR7       VP                  4       '       d   VP                  4        \        V4      p\        P                  ! 4       ;_uu_ 4       p\	        V4      R,          p	V	P                  V RR	7       R
\        V	4      R\        V	4      R\        V4      R\        V\        V4      4      R\        VP                  RR4      4      R\        VP                  RR4      4      R\        VP                  RVP                  RR4      4      4      /p
\        WZ4      p \!        W·\#        V4      R7        RRR4       TP                  4       '       d    TP1                  4       P2                  ^ 8:  d   \)        RT RT 24      h\        T4      #   \$        P&                   d   p\)        RT RTR R24      ThRp?i\$        P*                   d.   p\)        RT RTP,                   R\/        T4       24      ThRp?ii ; i  + '       g   i     LÒ; i)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£   Ú
input_pathÚ	text_pathr  r   ÚvoiceÚmodelÚspeed)r„   zTTS provider 'z' timed out after ÚgÚsNz' exited with code r�   z' produced no output at )r   r…   rˆ   rõ   r   Ú
expanduserra   ÚmkdirÚexistsÚunlinkÚ_get_command_tts_timeoutÚtempfileÚTemporaryDirectoryÚ
write_textr  rR   rÖ   r‹   r*   r|   ÚRuntimeErrorrË   rÊ   r“   ÚstatÚst_size)r‘   r  r  r€   r  r   r·   rj   Útmpdirr  r/   r›   r�   s   &&&&&        r   Ú_generate_command_ttsr/  P  s0  € ô
 ˜6Ÿ:™: iÓ0×6Ð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Ø”S˜Ÿ™ G¨RÓ0Ó1°7¼CÀÇ
Á
È7ÐTVÓ@WÓ<XØ”S˜Ÿ™ G¨Z¯^©^¸GÀRÓ-HÓIÓJð	
ˆô *Ð*:Ó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óàðûð	ú÷ 
'×	&ús=   ÃC
I:ÆH	È	I7ÈH2È2I7É	I7É
(I2É2I7É7I:É:J
	r3   >   ÚxaiÚedgeÚpiperÚgeminiÚneuttsÚopenaiÚminimaxÚmistralÚ	deepinfraÚ	kittenttsÚ
elevenlabs>   ÚaacÚamrÚm4arÿ   ÚoggÚwavÚflacÚopus)3Ú__doc__Ú
__future__r   r(   r¾   r4   r,   r*   r(  rÀ   rÂ   Ú	functoolsr   Úpathlibr   Útypingr   r   r   r   Úutilsr	   r   r-   rR   rc   r~   r‹   r“   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>rM     s  ðñ	õ #ã 	Û Û 	Û Û Û Û Û Ý Ý ß 1Ó 1å !õõ2Wõõ& õ õ:eõ3õ'÷&PQõh8õWõ[õAõ2õ.ñ "ò #1ó 2Ð ð '*Ð #Ø$)Ð !Ù&Ò'aÓbÐ Ø&*Ð #ñ %Ð%;ÐF[Ô\Ð Ù#*Ð+BÐMbÔ#cÐ  Ù"Ð#3Ð=`ÔaÐ õ÷iõBõ
J÷
!r   