Ë
    ãß²j¬–  ã                   ó	  — U d 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
Z
ddlmZ ddlmZmZmZmZmZ ddlZddlmZ  ej,                  e«      Zdededefd	„Zdd
lmZmZmZmZm Z m!Z! ddl"m#Z# ddl$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+ ddl,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3 ddl4m5Z5m6Z6m7Z7 ddl8m9Z9m:Z:m;Z; ddl<m=Z=m>Z>m?Z? �ddedee   dee   deg ef   fd„Z@ e@dd¬«      ZA e@ddd¬«      ZB e@dd«      ZC e@ddd¬«      ZD e@d «      ZE e@d!d"«      ZF e@d#d$«      ZGd%eg ef   deHfd&„ZId'edeHfd(„ZJdeHfd)„ZKdeHfd*„ZLdeHfd+„ZMd,ZNdefd-„ZO eO«       xZPZQdefd.„ZRdeeef   fd/„ZSd0eeef   defd1„ZT eUh d2£«      ZV e	j®                  d3e	j°                  «      ZY eUh d4£«      ZZ eUh d5£«      Z[d6„ dd7d8fd9„ d:d;d<fd=„ d>d?d@fdAdBdC„ dDdEdFfdGdH„ dIdJdKfdL„ dMdNdOfdP„ dQdRdSfdTœ
Z\eee]f   e^dU<   dVedefdW„Z_dXedYed0eeef   ddfdZ„Z`d[ede]fd\„Zad]edXedYed0eeef   d^ee   ddfd_„ZbdYed[ed`eeeef      daeHde]f
db„Zcd0eeef   dceed   d[ee   fdd„Zede]fde„Zfdfee   d[ed`eeeef      daeHde]f
dg„Zgdhee   dieHdefdj„Zhdked[edleidefdm„ZjdXedYed[ed0eeef   d`eeeef      daeHd^ee   defdn„Zk G do„ dpel«      Zmdqee   dredsende]fdt„Zo	 	 �ddXedfee   dceed   d^ee   d[ee   defdu„ZpdeHfdv„ZqdeHfdw„Zrdx„ dy„ dz„ d{„ eqerd|„ d}„ d~„ d„ d€„ d�œZseeeg eHf   f   e^d‚<   deHfdƒ„Ztdd„lumvZvmwZw d…edefd†„Zxdeyfd‡„Zzdˆd‰dŠd‹dŒd�œd‹ exdŽ«      d�œd�d�d�œd‹d‘d�œd‹d’d�œd“œdXgd”œd•œZ{ evjø                  dˆd–e{d—„ etd˜ez¬™«       ddšl}m~Z~ dd›lmZ ddœl}m€Z€ dd�lm�Z� ddl‚Z‚ddžlƒm„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�Z�d¢Z‘d£Z’d¤Z“d¥Z”e”Z•i d¦d§“d¨d©“dªd«“d¬d­“d®d¯“d°d±“d²d³“d´dµ“d¶d·“d¸d¹“dºd»“d¼d½“d¾d¿“dÀdÁ“dÂdÃ“dÄdÅ“dÆdÇ“i dÈdÉ“dÊdË“dÌdÍ“dÎdÏ“dÐdÑ“dÒdÓ“dÔdÕ“dÖd×“dØdÙ“dÚdÛ“dÜdÝ“dÞdß“dàdá“dâdã“dädå“dædç“dèdé“¥i dêdë“dìdí“dîdï“dðdñ“dòdó“dôdõ“död÷“dødù“dúdû“düdý“dþdÿ“�d �d“�d�d“�d�d“�d�d“�d�d	“�d
�d“¥�d�d�d�d�d�d�d�dœ¥Z–�d„ Z—y(  a6  Text-to-speech tool: config resolution, built-in provider dispatch, output policy, registration.

Built-ins: Edge (free default), ElevenLabs, OpenAI, DeepInfra, MiniMax, Mistral, Gemini, xAI,
local NeuTTS / KittenTTS / Piper; plus ``type: command`` providers under ``tts.providers.<name>``
and plugin-registered ones. Output is Opus (.ogg) on voice-bubble platforms, MP3 elsewhere.
Sibling ``tts_tool_*`` modules hold backends/delivery/lifecycle; they read the seams defined
here (config, provider resolution, lazy SDK importers) through ``_origin()`` at call time.
é    N)ÚPath)ÚCallableÚDictÚAnyÚListÚOptional)Údisplay_hermes_homeÚenv_varÚprovider_idÚreturnc                 ó    — ddl m}  || |«      S )z\Resolve a TTS provider API key via the shared voice-key resolver (config > env/.env > pool).r   )Úresolve_provider_secret)Útools.tool_backend_helpersr   )r
   r   r   s      ú3/home/ubuntu/.hermes/hermes-agent/tools/tts_tool.pyÚ_resolve_provider_keyr      s   € åBÙ" 7¨KÓ8Ð8ó    )ÚBUILTIN_TTS_PROVIDERSÚ#_configured_command_tts_output_pathÚ_generate_command_ttsÚ_get_command_tts_output_formatÚ _is_command_tts_voice_compatibleÚ _resolve_command_provider_config)ÚNOUS_MANAGED_PROVIDER)Ú_resolve_max_text_lengthÚ_build_audio_delivery_filesÚ_convert_to_opusÚ_remove_quietlyÚ_repair_ogg_containerÚ_resolve_audio_delivery_profileÚ_split_text_for_tts)Ú_generate_edge_ttsÚ_generate_elevenlabsÚ_generate_gemini_ttsÚ_generate_minimax_ttsÚ_generate_mistral_ttsÚ_generate_xai_ttsÚ_resolve_minimax_tts_runtime)Ú_generate_kittenttsÚ_generate_neuttsÚ_generate_piper_tts)Ú_dispatch_to_plugin_providerÚ_plugin_provider_is_availableÚ$_plugin_provider_is_voice_compatible)Ú_generate_deepinfra_ttsÚ_generate_openai_ttsÚ_has_openai_audio_backendÚmoduleÚattrÚfeaturec                 óR   ‡ ‡‡— ˆˆˆ fd„}d‰ j                  d«      d   › �|_        |S )a~  Lazy SDK importer: returns ``module`` (or ``module.attr``), raising ImportError when absent.

    ``feature`` names a ``tools.lazy_deps`` feature to best-effort install first (users who enabled
    a provider in config.yaml never ran the post-setup hook); any failure there falls through so
    the raw import still raises cleanly. sounddevice also raises OSError without PortAudio.c                  óÎ   •— ‰r2t        j                  t        «      5  ddlm}   | ‰d¬«       d d d «       t        j                  ‰«      }‰rt        |‰«      S |S # 1 sw Y   Œ.xY w)Nr   )ÚensureF)Úprompt)Ú
contextlibÚsuppressÚ	ExceptionÚtools.lazy_depsr6   Ú	importlibÚimport_moduleÚgetattr)r6   Úmodr2   r3   r1   s     €€€r   Ú_importz_sdk_importer.<locals>._import<   s\   ø€ ÙÜ×$Ñ$¤YÓ/ñ .Ý2Ù�w uÕ-÷.ô ×%Ñ% fÓ-ˆÙ%)Œw�s˜DÓ!Ð2¨sÐ2÷	.ð .ús   �AÁA$Ú_import_ú.r   )ÚsplitÚ__name__)r1   r2   r3   r@   s   ``` r   Ú_sdk_importerrE   6   s-   ú€ ö3ð " &§,¡,¨sÓ"3°AÑ"6Ð!7Ð8€GÔØ€Nr   Úedge_ttsztts.edge)r3   zelevenlabs.clientÚ
ElevenLabsztts.elevenlabsÚopenaiÚOpenAIzmistralai.clientÚMistralztts.mistralÚsounddeviceÚ	kittenttsÚ	KittenTTSÚpiperÚ
PiperVoiceÚimporterc                 ó2   — 	  | «        y# t         $ r Y yw xY w©NTF)ÚImportError)rP   s    r   Ú_importablerT   P   s!   € ðÙŒ
ØøÜò Ùðús   ‚
 Š	•Únamec                 ód   — 	 t         j                  j                  | «      d uS # t        $ r Y yw xY w)NF)r<   ÚutilÚ	find_specr:   )rU   s    r   Ú_package_installedrY   X   s3   € ðÜ�~‰~×'Ñ'¨Ó-°TÐ9Ð9øÜò Ùðús   ‚ # £	/®/c                  ó   — t        d«      S )NÚneutts©rY   © r   r   Ú_check_neutts_availabler^   _   s   € Ô.@ÀÓ.JÐ'Jr   c                  ó   — t        d«      S )NrL   r\   r]   r   r   Ú_check_kittentts_availabler`   `   s   € Ô1CÀKÓ1PÐ*Pr   c                  ó   — t        d«      S )NrN   r\   r]   r   r   Ú_check_piper_availablerb   a   s   € Ô-?ÀÓ-HÐ&Hr   Úedgec                  ó2   — ddl m}  t         | dd«      «      S )Nr   ©Úget_hermes_dirzcache/audioÚaudio_cache)Úhermes_constantsrf   Ústrre   s    r   Ú_get_default_output_dirrj   h   s   € Ý/Ü‰~˜m¨]Ó;Ó<Ð<r   c                  ó<   — t         t        k7  rt         S t        «       S )u8  The active profile's audio output dir at call time (long-lived runtimes switch profiles
    after import); a monkeypatched ``DEFAULT_OUTPUT_DIR`` wins.

    Same bug class as skills_tool (f8723c478) and skills_sync (#65828): long-lived multi-profile runtimes
    (dashboard console, TUI/Desktop backend, cron, kanban workers) import this module once under the launch
    HERMES_HOME and later scope requests to a different profile via
    ``hermes_constants.set_hermes_home_override()`` â€” a frozen module constant keeps writing synthesized
    audio into the launch profile's cache instead of the active profile's (#98749). Keep the legacy
    ``DEFAULT_OUTPUT_DIR`` module attribute for tests and external patchers; when it has not been patched,
    re-resolve from the live profile-scoped HERMES_HOME on every call.
    )ÚDEFAULT_OUTPUT_DIRÚ_DEFAULT_OUTPUT_DIR_AT_IMPORTrj   r]   r   r   Ú_default_output_dirrn   p   s   € ô Ô:Ò:Ü!Ð!Ü"Ó$Ð$r   c                  óâ   — 	 ddl m}   | «       j                  d«      xs i S # t        $ r t        j                  d«       Y i S t        $ r#}t        j                  d|d¬«       Y d}~i S d}~ww xY w)	z8Return the ``tts`` config section ({} when unavailable).r   )Úload_configÚttsz9hermes_cli.config not available, using default TTS configzFailed to load TTS config: %sT©Úexc_infoN)Úhermes_cli.configrp   ÚgetrS   ÚloggerÚdebugr:   Úwarning)rp   Úes     r   Ú_load_tts_configrz   �   so   € ðJÝ1Ù‹}× Ñ  Ó'Ò-¨2Ð-øÜò RÜ�‰ÐPÕQð €Iô ò JÜ�‰Ð6¸ÀDˆ×IÐIØ€IûðJús   ‚" ¢A.ÁA.ÁA)Á)A.Ú
tts_configc                 ó†   — | j                  d«      xs t        j                  «       j                  «       }|t        k(  rdS |S )z¹Configured provider or the free default (inference credentials never imply consent to paid
    speech); ``nous`` is serviced by the OpenAI path through the managed openai-audio gateway.ÚproviderrH   )ru   ÚDEFAULT_PROVIDERÚlowerÚstripr   )r{   r}   s     r   Ú_get_providerr�   �   s=   € ð —‘˜zÓ*Ò>Ô.>×EÑEÓG×MÑMÓO€HØÔ#8Ò8ˆ8ÐF¸hÐFr   >   ÚfeishuÚmatrixÚsignalÚtelegramÚwhatsappz,media:\s*[`'\"*_]*(?:[`'\"]|[a-z]:[/\\]|~?/)>   ÚgeminirH   ÚmistralÚ
elevenlabs>   Úxairc   rN   r[   ÚminimaxrL   c                  ó    — t        t        «      S ©N)rT   Ú_import_elevenlabsr]   r   r   ú<lambda>r�   ¨   s   € œ;Ô'9Ó:€ r   r"   z`ElevenLabs provider selected but 'elevenlabs' package not installed. Run: pip install elevenlabsc                  ó    — t        t        «      S r�   ©rT   Ú_import_openai_clientr]   r   r   r�   r�   ª   s   € ”{Ô#8Ó9€ r   z
OpenAI TTSr/   z<OpenAI provider selected but 'openai' package not installed.c                  ó    — t        t        «      S r�   r‘   r]   r   r   r�   r�   ¬   s   € œ+Ô&;Ó<€ r   zDeepInfra TTSr.   z;DeepInfra TTS uses the 'openai' SDK but it isn't installed.)NzMiniMax TTSr$   N)NzxAI TTSr&   Nc                  ó    — t        t        «      S r�   )rT   Ú_import_mistral_clientr]   r   r   r�   r�   °   s   € œÔ$:Ó;€ r   zMistral Voxtral TTSr%   zoMistral provider selected but 'mistralai' package not installed. Run `hermes setup` to install Mistral support.)NzGoogle Gemini TTSr#   Nc                  ó   — t        «       S r�   ©r^   r]   r   r   r�   r�   ´   s
   € Ô.Ó0€ r   zNeuTTS (local)r)   zœNeuTTS provider selected but neutts is not installed. Run hermes setup and choose NeuTTS, or install espeak-ng and run python -m pip install -U neutts[all].c                  ó    — t        t        «      S r�   )rT   Ú_import_kittenttsr]   r   r   r�   r�   ·   s   € œ+Ô&7Ó8€ r   zKittenTTS (local, ~25MB)r(   zïKittenTTS provider selected but 'kittentts' package not installed. Run 'hermes setup tts' and choose KittenTTS, or install manually: pip install https://github.com/KittenML/KittenTTS/releases/download/0.8.1/kittentts-0.8.1-py3-none-any.whlc                  ó    — t        t        «      S r�   )rT   Ú_import_piperr]   r   r   r�   r�   »   s   € ”k¤-Ó0€ r   zPiper (local)r*   z˜Piper provider selected but 'piper-tts' package not installed. Run 'hermes tools' and select Piper under TTS, or install manually: pip install piper-tts)
r‰   rH   Ú	deepinfrar‹   rŠ   rˆ   r‡   r[   rL   rN   Ú_BUILTIN_DISPATCHÚmessagec                 ó6   — t        j                  d| dœd¬«      S )NF)ÚsuccessÚerror©Úensure_ascii)ÚjsonÚdumps)rž   s    r   Ú_error_jsonr¦   Á   s   € Ü�:‰: %°'Ñ:ÈÔOÐOr   ÚtextÚfile_strc                 óÐ   ‡ ‡‡— ˆˆ ˆfd„}	 ddl m}  |d¬«      5 }|j                  |«      j                  d¬«       ddd«       y# 1 sw Y   yxY w# t        $ r
  |«        Y yw xY w)	zVRun the async Edge generator from sync code (worker thread; direct run if that fails).c                  óD   •— t        j                  t        ‰‰ ‰«      «      S r�   )ÚasyncioÚrunr!   )r¨   r§   r{   s   €€€r   r�   z_run_edge_tts.<locals>.<lambda>Ç   s   ø€ ”'—+‘+Ô0°°xÀÓLÓM€ r   r   ©ÚThreadPoolExecutoré   )Úmax_workersé<   )ÚtimeoutN)Úconcurrent.futuresr®   ÚsubmitÚresultÚRuntimeError)r§   r¨   r{   r¬   r®   Úpools   ```   r   Ú_run_edge_ttsr¸   Å   s\   ú€ å
M€CðÝ9Ù¨AÔ.ð 	0°$Ø�K‰K˜Ó×#Ñ#¨BÐ#Ô/÷	0÷ 	0ñ 	0ûäò ÙŽðús-   ŒA ›"A½A ÁAÁA ÁA ÁA%Á$A%r}   c                 óð   — t         j                  | «      }|� |\  }}}}| |� |«       st        |«      fS dfS t        t        «      r| dfS t        «       rt        j                  d«       y| t        d«      fS )z¥SDK check -> ``(engine, None)`` or ``(provider, error_json)``. Unknown names take the Edge
    default; without edge-tts NeuTTS is the fallback (engine != provider).Nz9Edge TTS not available, falling back to NeuTTS (local)...)r[   NzhNo TTS provider available. Install edge-tts (pip install edge-tts) or set up NeuTTS for local synthesis.)r�   ru   r¦   rT   Ú_import_edge_ttsr^   rv   Úinfo)r}   ÚentryÚ	availableÚ_labelÚ
_generatorÚmissing_errors         r   Ú_select_builtin_enginerÁ   Ð   sŽ   € ô ×!Ñ! (Ó+€EØÐØ7<Ñ4ˆ	�6˜: }Ø¸	Ð8MÑV_ÔVaœ+ mÓ4ÐlÐlÐgkÐlÐlÜÔ#Ô$Ø˜ˆ~ÐÜÔ Ü�‰ÐOÔPØØ”[ð	0ó1ð 1ð 1r   ÚengineÚinstructionsc                 óâ   — t         j                  | «      }t        j                  d|r|d   nd«       |€t	        |||«       y| dk(  rt        ||||¬«       y t        «       |d      |||«       y)z+Run the already-selected built-in *engine*.zGenerating speech with %s...r¯   zEdge TTSNrH   )rÃ   é   )r�   ru   rv   r»   r¸   r/   Úglobals)rÂ   r§   r¨   r{   rÃ   r¼   s         r   Ú_synthesize_builtinrÇ   á   si   € ä×!Ñ! &Ó)€EÜ
‡K�KÐ.¹E°°a²ÀzÔRØ€}Ü�d˜H jÕ1Ø	�8Ò	Ü˜T 8¨ZÀlÖSàŒ‹	�%˜‘(Ñ˜D (¨JÕ7r   Úcommand_provider_configÚ	want_opusc                 ó^  — |�t        |«      }ng|t        vrt        |«      }nS|r.|t        v r&| j	                  d«      st        | «      }|r|dfS | dfS |t        v }| |xr |xr | j	                  d«      fS |s| dfS | j	                  d«      st        | «      xs | } | | j	                  d«      fS )aR  Voice-bubble eligibility (Opus-converting when needed) -> ``(path, voice_compatible)``.

    Command/plugin providers are documents unless they opt in via ``voice_compatible``; native-Opus
    built-ins qualify when the platform wants Opus and they wrote .ogg; MP3/WAV built-ins are
    ffmpeg-converted only when the platform needs Opus.z.oggTF)r   r   r-   Ú_FFMPEG_OPUS_PROVIDERSÚendswithr   Ú_NATIVE_OPUS_PROVIDERS)r¨   r}   rÈ   rÉ   Úopted_inÚ	opus_pathÚnatives          r   Ú_finalize_voice_deliveryrÑ   í   sÏ   € ð Ð*Ü3Ð4KÓL‰Ø	Ô.Ñ	.Ü7¸ÓA‰Ù	�xÔ#9Ñ9À(×BSÑBSÐTZÔB[Ü$ XÓ.ˆ	Ù$-�	˜4Ð ÐD°H¸eÐ3DÐDàÔ3Ð3ˆØ˜ÒK IÒK°(×2CÑ2CÀFÓ2KÐKÐKÙØ˜ˆÐð ×Ñ˜VÔ$Ü# HÓ-Ò9°ˆØ�X×&Ñ& vÓ.Ð.Ð.r   Úspeedc                 ó¬   — |�%i | ¥dt        dt        dt        |«      «      «      i¥} | |r|j                  «       j	                  «       fS t        | «      fS )z{Apply per-call ``speed`` (clamped, on a shallow copy so the cached config isn't mutated) and
    resolve the provider name.rÒ   g      Ð?g      @)ÚmaxÚminÚfloatr   r€   r�   )r{   rÒ   r}   s      r   Ú_apply_call_overridesr×   
  sW   € ð ÐØO˜
ÐO G¬S°´s¸3ÄÀeÃÓ7MÓ-NÑOˆ
Ø±8�x—~‘~Ó'×-Ñ-Ó/ÐZÐZÄÈzÓAZÐZÐZr   c                  óP   — ddl m}   | dd«      j                  «       }||t        v fS )u]   ``(platform, wants_opus)`` â€” platforms delivering voice bubbles only as Ogg/Opus want Opus.r   )Úget_session_envÚHERMES_SESSION_PLATFORMÚ )Úgateway.session_contextrÙ   r   ÚOPUS_VOICE_PLATFORMS)rÙ   Úplatforms     r   Ú_session_platformrß     s,   € å7ÙÐ8¸"Ó=×CÑCÓE€HØ�XÔ!5Ð5Ð5Ð5r   Úoutput_pathc                 ó†  — | rºddl m}m}  || «      rdt        d«      fS t        j                  | «      rdt        d«      fS  || «      rdt        d| › d�«      fS t        | «      j                  «       }|�t        ||«      }ddl	m
}m}  |t        |«      «      s |t        |«      «      rvdt        d	|› d
�«      fS |�t        |«      }	n|r
|t        v rdnd}	t        j                  j!                  «       j#                  d«      }
t        t%        «       «      d|
› d|	› �z  }|j&                  j)                  dd¬«       |dfS )ab  Pick the output file -> ``(Path, None)`` or ``(None, error_json)``.

    A caller path is rejected on ``..`` traversal (bug or prompt-injection; absolute is fine) and
    on protected credential/system locations. Default ``<audio cache>/tts_<timestamp>.<ext>``: the
    command format, ``.ogg`` for native-Opus providers on Opus platforms, else ``.mp3``.r   )Úhas_traversal_componentÚhas_unsafe_path_charsNzWoutput_path contains control characters or line separators; use a plain filesystem pathz=output_path must not contain a media directive (MEDIA:<path>)z/output_path contains '..' traversal component: zM. Use an absolute path or one relative to the current directory without '..'.)Úis_write_approval_requiredÚis_write_deniedz;output_path targets a protected credential or system path: z(. Choose a normal audio output location.ÚoggÚmp3z%Y%m%d_%H%M%S_%fÚtts_rB   T)ÚparentsÚexist_ok)Útools.path_securityrâ   rã   r¦   Ú_MEDIA_DIRECTIVE_REÚsearchr   Ú
expanduserr   Úagent.file_safetyrä   rå   ri   r   rÍ   ÚdatetimeÚnowÚstrftimern   ÚparentÚmkdir)rà   r}   rÈ   rÉ   râ   rã   Ú	file_pathrä   rå   ÚextÚ	timestamps              r   Ú_resolve_output_baserø     s{  € ñ ßVÙ  Ô-Øœð.ó/ð /ð /ô
 ×%Ñ% kÔ2ØœØOóQð Qð Qá" ;Ô/ØœØAÀ+Àð O^ð ^ó_ð _ð _ô ˜Ó%×0Ñ0Ó2ˆ	Ø"Ð.Ü;¸IÐG^Ó_ˆIßQÙœ3˜y›>Ô*Ñ.HÌÈYËÔ.XØœØMØ�+ÐEðGóHð Hð Hð #Ð.Ü0Ð1HÓI‰Cá$¨Ô5KÑ)K‘%ÐQVˆCÜ×%Ñ%×)Ñ)Ó+×4Ñ4Ð5GÓHˆ	ÜÔ,Ó.Ó/°D¸¸À1ÀSÀEÐ2JÑJˆ	Ø×Ñ×Ñ 4°$ÐÔ7Ø�dˆ?Ðr   ÚpathsÚvoice_compatiblec                 óD   — dj                  d„ | D «       «      }|rd|› �S |S )z_``MEDIA:<path>`` lines; the ``[[audio_as_voice]]`` marker asks the platform for a voice bubble.Ú
c              3   ó&   K  — | ]	  }d |› �–— Œ y­w)zMEDIA:Nr]   )Ú.0Úpaths     r   ú	<genexpr>z_media_tag.<locals>.<genexpr>E  s   è ø€ Ò<¨d˜F 4 &œ/Ñ<ùs   ‚z[[audio_as_voice]]
)Újoin)rù   rú   Ú	media_tags      r   Ú
_media_tagr  C  s+   € à—	‘	Ñ<°eÔ<Ó<€IÙ1AÐ! ) Ð-ÐPÀyÐPr   ÚprefixÚexcc                 ó~   — | › d|› d|› �}t         j                  d|t        |t        «       ¬«       t	        |d¬«      S )zeLog and wrap a synthesis failure as the standard error envelope (traceback except for config errors).z (ú): z%srr   F©r    )rv   r¡   Ú
isinstanceÚ
ValueErrorÚ
tool_error)r  r}   r  Ú	error_msgs       r   Ú_tool_failurer  I  sA   € à�(˜"˜X˜J c¨#¨Ð/€IÜ
‡L�L��y¬z¸#¼zÓ/JÐ+J€LÔKÜ�i¨Ô/Ð/r   c                ó"  — 	 |�&t         j                  d|«       t        | ||||«      }n=|t        vrt	        | |||«      x}	 �|}n!t        |«      \  }}|r|S t        || |||«       t        j                  j                  |«      r"t        j                  j                  |«      dk(  rt        d|› d�«      S t        |«      }t        ||||«      \  }}	t         j                  d|t        j                  j                  |«      d›|«       t        j                  d|t!        |g|	«      ||	d	œd
¬«      S # t"        $ r}
t%        d||
«      cY d}
~
S d}
~
wt&        $ r}
t%        d||
«      cY d}
~
S d}
~
wt(        $ r}
t%        d||
«      cY d}
~
S d}
~
ww xY w)ae  Synthesize one provider-safe chunk into *file_str*; returns the result envelope.

    Command providers resolve BEFORE built-in dispatch, but built-in names short-circuit so
    ``tts.providers.openai.command`` can't shadow OpenAI. Plugins fire only for names that are
    neither; a None return falls through to built-in dispatch (unknown -> Edge default).Nz3Generating speech with command TTS provider '%s'...r   z-TTS generation produced no output (provider: ú)ú,TTS audio saved: %s (%s bytes, provider: %s)ú,T)r    rõ   r  r}   rú   Fr¢   zTTS configuration errorzTTS dependency missingzTTS generation failed)rv   r»   r   r   r+   rÁ   rÇ   Úosrÿ   ÚexistsÚgetsizer¦   r   rÑ   r¤   r¥   r  r
  r  ÚFileNotFoundErrorr:   )r§   r¨   r}   r{   rÈ   rÉ   rÃ   Ú_plugin_pathr¡   rú   ry   s              r   Ú_text_to_speech_singler  P  s   € ð%CØ"Ð.Ü�K‰KÐMÈxÔXÜ,Ø�h Ð*AÀ:óO‰Hð Ô2Ñ2Ü8¸¸xÈÐS]Ó^Ð^ˆLØð8ð $‰Hä4°XÓ>‰OˆH�eÙØ�Ü ¨$°¸*ÀlÔSÜ�w‰w�~‰~˜hÔ'¬2¯7©7¯?©?¸8Ó+DÈÒ+IÜÐ!NÈxÈjÐXYÐZÓ[Ð[ô )¨Ó2ˆÜ%=Ø�hÐ 7¸ó&DÑ"ˆÐ"ä�‰ÐBÀHÔQS×QXÑQX×Q`ÑQ`ÐaiÓQjÐklÐPmÐpxÔyÜ�z‰zØ¨(ÄÈXÈJÐXhÓAiØ Ð6Fñ
ð ôð 	øô ò EÜÐ6¸À!ÓDÕDûÜò DÜÐ5°xÀÓCÕCûÜò CÜÐ4°hÀÓBÕBûðCúsP   ‚AD2 ÁAD2 Â7A:D2 Ä2	FÄ;EÅFÅFÅE+Å%FÅ+FÅ7F	ÆFÆ	Fc                   ó   — e Zd ZdZy)Ú_ChunkFailedzWOne chunk's synthesis returned an error envelope; message is the final tool error text.N)rD   Ú
__module__Ú__qualname__Ú__doc__r]   r   r   r  r  �  s   „ Úar   r  ÚchunksÚ	base_pathÚgenerated_artifactsc           
      óx  — |d   }g }g }t        | d¬«      D �]c  \  }}|}	t        | «      dkD  r-|j                  |j                  › d|d›|j                  › �«      }	|j                  t        |	«      «       t        |t        |	«      fi |¤Ž}
	 t        j                  |
«      }|j                  d
«      s&|j                  dd«      }t        d|› d|› d|› �«      ‚t        |j                  d«      xs |	«      }t        j                   j#                  |«      r"t        j                   j%                  |«      dk  rt        d|› d|› �«      ‚|j                  |«       |j'                  |«       |j'                  |«       �Œf ||fS # t        j                  t        f$ r t        d|› dt        |
«      dd	 › �«      ‚w xY w)a  Synthesize chunks into ``<base>.chunkNNN<ext>`` (or ``base`` alone) -> ``(encoded_paths, results)``.

    Every touched path lands in *generated_artifacts* for the caller's sweep. Raises
    :class:`_ChunkFailed` on a reported failure, ``RuntimeError`` on garbage or missing audio.r}   r¯   )Ústartz.chunkÚ03dz
TTS chunk z returned invalid JSON: NéÈ   r    r¡   zunknown errorz	 failed (r  rõ   r   z produced no final audio: )Ú	enumerateÚlenÚ	with_nameÚstemÚsuffixÚaddri   r  r¤   ÚloadsÚJSONDecodeErrorÚ	TypeErrorr¶   ru   r  r  rÿ   Úisfiler  Úappend)r  r  r  Úsingle_kwargsr}   Úencoded_pathsÚchunk_resultsÚindexÚchunkÚ
chunk_pathÚ
raw_resultÚchunk_resultr  Úactual_paths                 r   Ú_synthesize_chunksr8  …  s¾  € ð
 ˜ZÑ(€HØ!€MØ*,€MÜ! &°Ô2ó +‰ˆˆuØˆ
Üˆv‹;˜Š?Ø"×,Ñ,°	·±Ð/?¸vÀeÈCÀ[ÐQZ×QaÑQaÐPbÐ-cÓdˆJØ×Ñ¤ J£Ô0Ü+¨E´3°z³?ÑTÀmÑTˆ
ð	dÜŸ:™: jÓ1ˆLð ×Ñ 	Ô*Ø$×(Ñ(¨°/ÓBˆIÜ ¨E¨7°)¸H¸:ÀSÈÈÐTÓUÐUÜ˜,×*Ñ*¨;Ó7ÒE¸:ÓFˆÜ�w‰w�~‰~˜kÔ*¬b¯g©g¯o©o¸kÓ.JÈaÒ.OÜ ¨E¨7Ð2LÈ[ÈMÐZÓ[Ð[Ø×Ñ Ô,Ø×Ñ˜[Ô)Ø×Ñ˜\Ö*ð%+ð& ˜-Ð'Ð'øô ×$Ñ$¤iÐ0ò 	dÜ ¨E¨7Ð2JÌ3ÈzË?Ð[_Ð\_ÐK`ÐJaÐbÓcÐcð	dús   ÂFÆ7F9c                 óz	  — | r| j                  «       st        dd¬«      S 	 ddlm}  || d¬«      } | st        dd¬«      S t        t        «       ||«      \  }}t        ||«      }t        ||«      }t        | |«      }	|	st        dd¬«      S t        |	«      d	kD  r+t        j                  d
|t        |	«      t        | «      |«       t        «       \  }
}t        |
|«      }t        ||||«      \  }}|r|S t!        «       }g }	 t#        |	|||||||¬«      \  }}t%        |«      xr t'        d„ |D «       «      }|j)                  t+        |d   «      j,                  «      }t/        |t1        |«      ||¬«      \  }}|D ]9  }t        j                  d|t2        j4                  j7                  |«      d›|«       Œ; t9        j:                  d|d   |t=        ||«      |d   j?                  d|«      |t        |	«      t        |«      t%        |«      |j@                  |jB                  |jD                  dœdœ
d¬«      |D �ch c]!  }t2        j4                  jG                  |«      ’Œ# }}|D ]/  }t2        j4                  jG                  |«      |vsŒ%tI        |«       Œ1 S # t        $ r | j                  «       } Y �Œ~w xY wc c}w # tJ        $ r†}t        t1        |«      d¬«      cY d}~|D �ch c]!  }t2        j4                  jG                  |«      ’Œ# nc c}w }}|D ]/  }t2        j4                  jG                  |«      |vsŒ%tI        |«       Œ1 S d}~wtL        $ r}}tO        d||«      cY d}~|D �ch c]!  }t2        j4                  jG                  |«      ’Œ# nc c}w }}|D ]/  }t2        j4                  jG                  |«      |vsŒ%tI        |«       Œ1 S d}~wt        $ r}}tO        d||«      cY d}~|D �ch c]!  }t2        j4                  jG                  |«      ’Œ# nc c}w }}|D ]/  }t2        j4                  jG                  |«      |vsŒ%tI        |«       Œ1 S d}~ww xY w# |D �ch c]!  }t2        j4                  jG                  |«      ’Œ# nc c}w }}|D ]/  }t2        j4                  jG                  |«      |vsŒ%tI        |«       Œ1 w xY w)aV  Convert text to speech with long-form chunking; returns the JSON result envelope.

    Text is normalized, split into provider-safe chunks (never silently truncated), synthesized
    sequentially, then packed against the platform's upload limit: a failed combine keeps the
    separate valid files and no over-limit artifact is ever returned.zText is requiredFr  r   )Úprepare_spoken_textN)Ú	max_charszText is empty after TTS cleanupr¯   zFTTS text for provider %s split into %d chunks (input=%d chars, cap=%d))r}   r{   rÈ   rÉ   rÃ   c              3   óP   K  — | ]  }t        |j                  d «      «      –— Œ  y­w)rú   N)Úboolru   )rþ   Úrs     r   r   z&text_to_speech_tool.<locals>.<genexpr>Ê  s    è ø€ Ò6nÐ[\´t¸A¿E¹EÐBTÓ<U×7VÑ6nùs   ‚$&)rú   r  r  Tr}   )rÞ   Úmax_file_bytesÚtarget_file_bytes)
r    rõ   Ú
file_pathsr  r}   rú   Úchunk_countÚdelivery_file_countÚcombined_chunksÚdelivery_profiler¢   zTTS delivery errorzTTS long-form generation failed)(r€   r  Útools.tts_text_normalizer:  r:   r×   rz   r   r   r    r%  rv   r»   rß   r   rø   Úsetr8  r=  ÚallÚwith_suffixr   r(  r   ri   r  rÿ   r  r¤   r¥   r  ru   rÞ   r?  r@  Úabspathr   r  r
  r  )r§   rà   rÒ   rÃ   r}   r:  r{   rÈ   Úmax_lenr  rÞ   rÉ   rE  r  r¡   r  Úfinal_pathsr0  r1  rú   Údelivery_baserD  rÿ   Úfinal_absoluteÚartifactr  s                             r   Útext_to_speech_toolrP  £  sY  € ñ �t—z‘z”|ÜÐ,°eÔ<Ð<ðÝ@Ù" 4°4Ô8ˆñ ÜÐ;ÀUÔKÐKÜ0Ô1AÓ1CÀUÈHÓUÑ€J�Ü>¸xÈÓTÐÜ& x°Ó<€GÜ   wÓ/€FÙÜÐ,°eÔ<Ð<Ü
ˆ6ƒ{�Q‚Ü�‰Ð\Øœc &›k¬3¨t«9°gô	?ä+Ó-Ñ€HˆiÜ6°xÀÓLÐÜ+Ø�XÐ6¸	óCÑ€IˆuáØˆÜ$'£EÐØ€Kð*Ü'9Ø�IÐ2¸XÐR\Ø$;ÀyØ%ô('Ñ$ˆ�}ô   Ó.Òn´3Ñ6nÐ`mÔ6nÓ3nÐØ!×-Ñ-¬d°=ÀÑ3CÓ.D×.KÑ.KÓLˆÜ'BØœ3˜}Ó-Ð/?ÐRbô(dÑ$ˆ�_àò 	vˆDÜ�K‰KÐFÈÔQS×QXÑQX×Q`ÑQ`ÐaeÓQfÐghÐPiÐltÕuð	vä�z‰zØ¨+°a©.ÈÜ# KÐ1AÓBØ% aÑ(×,Ñ,¨Z¸ÓBÐXhÜ˜v›;¼sÀ;Ó?OÜ# OÓ4à,×5Ñ5ÐIY×IhÑIhØ%5×%GÑ%Gñ!Iñ	
ð ô	ð" =HÖH°Dœ"Ÿ'™'Ÿ/™/¨$Õ/ÐHˆÐHØ+ò 	*ˆHÜ�w‰w�‰˜xÓ(°Ò>Ü Õ)ñ	*øôe ò Ø�z‰z‹|‹ðüòb Iøô ò 3Üœ#˜c›(¨EÔ2Ô2ð =HÖH°Dœ"Ÿ'™'Ÿ/™/¨$Õ/ÑHùÒHˆÐHØ+ò 	*ˆHÜ�w‰w�‰˜xÓ(°Ò>Ü Õ)ñ	*ûô ò BÜÐ1°8¸SÓAÔAð =HÖH°Dœ"Ÿ'™'Ÿ/™/¨$Õ/ÑHùÒHˆÐHØ+ò 	*ˆHÜ�w‰w�‰˜xÓ(°Ò>Ü Õ)ñ	*ûô	 ò OÜÐ>ÀÈ#ÓNÔNà<GÖH°Dœ"Ÿ'™'Ÿ/™/¨$Õ/ÑHùÒHˆÐHØ+ò 	*ˆHÜ�w‰w�‰˜xÓ(°Ò>Ü Õ)ñ	*ûð	Oûð =HÖH°Dœ"Ÿ'™'Ÿ/™/¨$Õ/ÑHùÒHˆÐHØ+ò 	*ˆHÜ�w‰w�‰˜xÓ(°Ò>Ü Õ)ñ	*úsœ   ¡J Ã?D3J8 È6&J3ÊJ0Ê/J0Ê8	QËMËQËQ Ë&LÍQÍOÍQÍQ Í#&N
ÏQÏQ
ÏQÏQ Ï'&PÑ
QÑQ ÑR:Ñ&Q>Ñ=.R:Ò,R:c                  óJ   — 	 t        t        «       «       y# t        $ r Y yw xY wrR   )r'   rz   r
  r]   r   r   Ú_minimax_requirementsrR  è  s(   € ðÜ$Ô%5Ó%7Ô8ØøÜò Ùðús   ‚ –	"¡"c                  óp   — 	 ddl m}  t         | d¬«      j                  d«      «      S # t        $ r Y yw xY w)Nr   ©Úresolve_xai_http_credentialsT)Úprefer_api_keyÚapi_keyF)Útools.xai_httprU  r=  ru   r:   rT  s    r   Ú_xai_requirementsrY  ð  s:   € ðÝ?ô Ñ0ÀÔE×IÑIÈ)ÓTÓUÐUøÜò Ùðús   ‚&) ©	5´5c                  ó8   — t        t        «      xs
 t        «       S r�   )rT   rº   r^   r]   r   r   r�   r�   þ  s   € ”KÔ 0Ó1ÒNÔ5LÓ5N€ r   c                  óN   — t        t        «      xr t        t        dd«      «      S )NÚELEVENLABS_API_KEYr‰   )rT   rŽ   r=  r   r]   r   r   r�   r�   ÿ  s    € œ+Ô&8Ó9Ò}¼dÔCXÐYmÐo{ÓC|Ó>}€ r   c                  ó0   — t        d«      xr
 t        «       S )NrH   )rY   r0   r]   r   r   r�   r�      s   € Ô(¨Ó2ÒRÔ7PÓ7R€ r   c                  óF   — t        d«      xr t        t        dd«      «      S )NrH   ÚDEEPINFRA_API_KEYrœ   )rY   r=  r   r]   r   r   r�   r�     s    € Ô+¨HÓ5Òw¼$Ô?TÐUhÐjuÓ?vÓ:w€ r   c                  óH   — t        t        dd«      xs t        dd«      «      S )NÚGEMINI_API_KEYr‡   ÚGOOGLE_API_KEY)r=  r   r]   r   r   r�   r�     s1   € ”dÔ0Ð1AÀ8ÓLò  BÔPeÐfvð  yAó  QBó  C€ r   c                  óN   — t        t        «      xr t        t        dd«      «      S )NÚMISTRAL_API_KEYrˆ   )rT   r•   r=  r   r]   r   r   r�   r�     s    € ”{Ô#9Ó:Òx¼tÔDYÐZkÐmvÓDwÓ?x€ r   c                  ó   — t        «       S r�   r—   r]   r   r   r�   r�     s
   € Ô-Ó/€ r   c                  ó   — t        «       S r�   )r`   r]   r   r   r�   r�     s
   € Ô3Ó5€ r   c                  ó   — t        «       S r�   )rb   r]   r   r   r�   r�     s
   € Ô+Ó-€ r   )rc   r‰   rH   rœ   r‹   rŠ   r‡   rˆ   r[   rL   rN   Ú_BUILTIN_REQUIREMENTSc                  ó˜   — t        «       } t        | «      }t        || «      �yt        j	                  |«      }|� |«       S t        |«      S )z<Return whether the explicitly resolved TTS provider can run.T)rz   r�   r   rh  ru   r,   )r{   r}   Úchecks      r   Úcheck_tts_requirementsrk    sL   € ä!Ó#€JÜ˜ZÓ(€HÜ'¨°*Ó=ÐIØÜ!×%Ñ% hÓ/€EØÐ'‰5‹7ÐTÔ-JÈ8Ó-TÐTr   )Úregistryr  Úhomec                 ó   — d| › d�S )Nz9Optional custom file path to save the audio. Defaults to z/audio_cache/<timestamp>.mp3r]   )rm  s    r   Ú_output_path_descriptionro    s   € ØFÀtÀfÐLhÐiÐir   c                  óz   — t        j                  t        d   «      } t        t	        «       «      | d   d   d<   d| iS )a  Rebuild the ``output_path`` default hint from the ACTIVE profile at every get_definitions():
    the multiplexed gateway serves every profile from one process, so a path baked in at import
    would name the launch profile's home for everyone else (#95685).Ú
parametersÚ
propertiesrà   Údescription)ÚcopyÚdeepcopyÚ
TTS_SCHEMAro  r	   )Úparamss    r   Ú_tts_schema_overridesrx    s?   € ô �]‰]œ: lÑ3Ó4€FÜ9QÔReÓRgÓ9h€Fˆ<Ñ˜Ñ'¨Ñ6Ø˜&Ð!Ð!r   Útext_to_speechaŠ  Convert text to speech audio. Returns a MEDIA: path that the platform delivers as native audio. Compatible providers render as a voice bubble on Telegram; otherwise audio is sent as a regular attachment. In CLI mode, saves to ~/voice-memos/. Voice and provider are user-configured (built-in providers like edge/openai or custom command providers under tts.providers.<name>), not model-selected.ÚobjectÚstringzóThe text to convert to speech. Provider-specific per-request character caps apply automatically (OpenAI 4096, xAI 15000, MiniMax 10000, ElevenLabs 5k-40k depending on model); longer input is split into ordered chunks without silent truncation.)Útypers  zthe profile HERMES_HOMEÚnumberz™Playback speed multiplier. 1.0 = normal, 0.5 = very slow (language learning), 2.0 = fast. Range: 0.25-4.0. Overrides the speed configured in config.yaml.a  Optional voice-design guidance: tone, emotion, pacing, accent, whispering, impressions (e.g. 'Speak in a cheerful, excited whisper'). Forwarded to the OpenAI backend (gpt-4o-mini-tts and OpenAI-compatible voice-design servers). Silently ignored by backends that don't support it.a+  Optional TTS provider override. Accepts built-in names (edge, openai, elevenlabs, minimax, xai, mistral, gemini, neutts, kittentts, piper), user-declared command provider names from tts.providers.<name>, or plugin-registered names. When omitted, the configured tts.provider from config.yaml is used.)r§   rà   rÒ   rÃ   r}   )r|  rr  Úrequired)rU   rs  rq  rq   c                 ó‚   — t        dd| j                  dd«      idD �ci c]  }|| j                  |«      “Œ c}¤ŽS c c}w )Nr§   rÛ   )rà   rÒ   rÃ   r}   r]   )rP  ru   )ÚargsÚkwÚks      r   r�   r�   S  sD   € Ô2ñ  ZØ�X‰X�f˜bÓ!ð Zà#WÖ
X˜aˆ1ˆd�h‰h�q‹k‰>Ò
Xñ Z€ ùâ
Xs   ž<u   ðŸ”Š)rU   ÚtoolsetÚschemaÚhandlerÚcheck_fnÚemojiÚdynamic_schema_overrides)ÚFuture)ÚIteratorr­   )ÚTuple)Ú	dataclass)Úfield)Úurljoin)Úurlparser¯   iÀ]  rÅ   i   ÚAudioDeliveryProfile)útools.tts_tool_deliveryr�  ÚCOMMAND_TTS_OUTPUT_FORMATS)útools.tts_command_providerr’  Ú#DEFAULT_COMMAND_TTS_MAX_TEXT_LENGTH)r“  r”  Ú!DEFAULT_COMMAND_TTS_OUTPUT_FORMAT)r“  r•  Ú#DEFAULT_COMMAND_TTS_TIMEOUT_SECONDS)r“  r–  ÚDEFAULT_DEEPINFRA_TTS_VOICE)útools.tts_tool_openair—  ÚDEFAULT_EDGE_VOICE)útools.tts_tool_providersr™  ÚDEFAULT_ELEVENLABS_MODEL_ID)rš  r›  Ú%DEFAULT_ELEVENLABS_STREAMING_MODEL_ID)rš  rœ  ÚDEFAULT_ELEVENLABS_VOICE_ID)rš  r�  ÚDEFAULT_GEMINI_AUDIO_TAGS)rš  rž  ÚDEFAULT_GEMINI_TTS_BASE_URL)rš  rŸ  ÚDEFAULT_GEMINI_TTS_MODEL)rš  r   ÚDEFAULT_GEMINI_TTS_VOICE)rš  r¡  ÚDEFAULT_KITTENTTS_MODEL)útools.tts_tool_localr¢  ÚDEFAULT_KITTENTTS_VOICE)r£  r¤  ÚDEFAULT_MINIMAX_BASE_URL)rš  r¥  ÚDEFAULT_MINIMAX_CN_BASE_URL)rš  r¦  ÚDEFAULT_MINIMAX_MODEL)rš  r§  ÚDEFAULT_MINIMAX_VOICE_ID)rš  r¨  ÚDEFAULT_MISTRAL_TTS_MODEL)rš  r©  ÚDEFAULT_MISTRAL_TTS_VOICE_ID)rš  rª  ÚDEFAULT_OPENAI_BASE_URL)r˜  r«  ÚDEFAULT_OPENAI_MODEL)r˜  r¬  ÚDEFAULT_OPENAI_VOICE)r˜  r­  ÚDEFAULT_PIPER_VOICE)r£  r®  ÚDEFAULT_XAI_AUTO_SPEECH_TAGS)rš  r¯  ÚDEFAULT_XAI_BASE_URL)rš  r°  ÚDEFAULT_XAI_BIT_RATE)rš  r±  ÚDEFAULT_XAI_LANGUAGE)rš  r²  Ú.DEFAULT_XAI_OPTIMIZE_STREAMING_LATENCY_DEFAULT)rš  r³  ÚDEFAULT_XAI_SAMPLE_RATE)rš  r´  ÚDEFAULT_XAI_SPEED_DEFAULT)rš  rµ  ÚDEFAULT_XAI_SPEED_MAX)rš  r¶  ÚDEFAULT_XAI_SPEED_MIN)rš  r·  Ú&DEFAULT_XAI_TEXT_NORMALIZATION_DEFAULT)rš  r¸  ÚDEFAULT_XAI_VOICE_ID)rš  r¹  Ú ELEVENLABS_MODEL_MAX_TEXT_LENGTH)r‘  rº  ÚFALLBACK_MAX_TEXT_LENGTH)r‘  r»  ÚGEMINI_AUDIO_TAG_REWRITE_TASK)rš  r¼  ÚMANAGED_OPENAI_TTS_MODELS)r˜  r½  ÚPROVIDER_MAX_TEXT_LENGTH)r‘  r¾  ÚTTS_RESPONSE_BODY_CHUNK_BYTES)rš  r¿  ÚTTS_RESPONSE_BODY_LIMIT_BYTES)rš  rÀ  Úacquire_tts_lease)útools.tts_tool_lifecyclerÁ  Úhermes_xai_user_agent)ztools.xai_httprÃ  Úmanaged_nous_tools_enabled)útools.tool_backend_helpersrÄ  Ú%nous_tool_gateway_unavailable_message)rÅ  rÆ  Úread_selection)rÅ  rÇ  Úrelease_tts_lease)rÂ  rÈ  Úrelease_tts_provider)rÂ  rÉ  )ztools.managed_tool_gatewayÚresolve_managed_tool_gateway)rÅ  Úresolve_openai_audio_api_key)rÅ  Úselection_error)ztools.tts_tool_speakerÚstream_tts_to_speaker)rÂ  Útts_lease_holders)rÂ  Úwarm_tts_provider)zhermes_cli._subprocess_compatÚwindows_hide_flags)rÊ  rË  rÌ  rÍ  rÎ  rÏ  rÐ  c                 óÎ   — t         j                  | «      }|€t        dt        ›d| ›�«      ‚dd l}ddlm}  |t        | g|¢­Ž  t         |j                  |d   «      |d   «      S )Nzmodule z has no attribute r   )Ú	warn_oncer¯   )	Ú_PLUGIN_COMPAT_LAZYru   ÚAttributeErrorrD   r<   Úhermes_cli.plugin_compatrÒ  r>   r=   )rU   Útargetr<   rÒ  s       r   Ú__getattr__r×  »  sh   € Ü ×$Ñ$ TÓ*€FØ€~Ü˜w¤x lÐ2DÀTÀHÐMÓNÐNÛÝ2ÙŒh˜Ð&˜vÓ&ÜÐ*�9×*Ñ*¨6°!©9Ó5°v¸a±yÓAÐAr   )NN)NNNN)˜r  r«   r8   rð   Úimportlib.utilr<   r¤   Úloggingr  ÚreÚtempfileÚpathlibr   Útypingr   r   r   r   r   rt  rh   r	   Ú	getLoggerrD   rv   ri   r   Útools.tts_command_providerr   r   r   r   r   r   r   r   Útools.tts_tool_deliveryr   r   r   r   r   r   r    Útools.tts_tool_providersr!   r"   r#   r$   r%   r&   r'   Útools.tts_tool_localr(   r)   r*   Útools.tts_tool_pluginsr+   r,   r-   Útools.tts_tool_openair.   r/   r0   rE   rº   rŽ   r’   r•   Ú_import_sounddevicer™   r›   r=  rT   rY   r^   r`   rb   r~   rj   rl   rm   rn   rz   r�   Ú	frozensetrÝ   ÚcompileÚ
IGNORECASErì   rÍ   rË   r�   ÚtupleÚ__annotations__r¦   r¸   rÁ   rÇ   rÑ   rÖ   r×   rß   rø   r  ÚBaseExceptionr  r  r:   r  rG  r8  rP  rR  rY  rh  rk  Útools.registryrl  r  ro  Údictrx  rv  Úregisterr³   r‰  rŠ  r®   r‹  Úbase64ÚdataclassesrŒ  r�  rÞ   ÚqueueÚshlexÚshutilÚ
subprocessÚ	threadingÚtimeÚurllib.parserŽ  r�  ÚuuidÚGEMINI_TTS_CHANNELSÚGEMINI_TTS_SAMPLE_RATEÚGEMINI_TTS_SAMPLE_WIDTHr»  ÚMAX_TEXT_LENGTHrÓ  r×  r]   r   r   ú<module>rý     sô	  ðòó Û Û Û Û Û Û 	Û 	Û Ý ß 6Õ 6ã å 0à	ˆ×	Ñ	˜8Ó	$€ð9 3ð 9°Sð 9¸Só 9÷h÷ hõ =÷Q÷ Qñ Q÷L÷ Lñ L÷ \Ñ [÷*ñ *÷ kÑ jò˜#ð  X¨c¡]ð ÀHÈSÁMð Ð]eÐfhÐjmÐfmÑ]nó ñ" ! °ZÔ@Ð Ù"Ð#6¸ÐN^Ô_Ð Ù% h°Ó9Ð Ù&Ð'9¸9ÈmÔ\Ð Ù# MÓ2Ð Ù! +¨{Ó;Ð Ù˜g |Ó4€ð˜( 2 s 7Ñ+ð °ó ð˜Sð  Tó ð K Ó JØ P DÓ PØ H Ó Hð Ð ð= ó =ñ
 6MÓ5NÐ NÐ Ð2ð%˜Só %ð"	˜$˜s C˜x™.ó 	ðG˜d 3¨ 8™nð G°ó Gñ !Ò!WÓXÐ ð !�b—j‘jÐ!PÐRT×R_ÑR_Ó`Ð ñ #Ò#PÓQÐ Ù"Ò#]Ó^Ð ñ ;¸LÐJ`Øuðwá9¸<ÐI_ØMðOá<¸oÐOhØOðQàCØ7Ù;Ð=RÐTkðAðBð HÙ0Ð2BÐDVðxðyñ 9Ð:TÐVkðð@ñ 1°/ÐCXð&ð'ñ)'(Ð �4˜˜U˜
Ñ#ó (ð4P˜ð P ó Pð˜ð  sð ¸¸SÀ#¸X¹ð È4ó ð1 Sð 1¨Uó 1ð"	8 ð 	8¨3ð 	8¸#ð 	8È4ÐPSÐUXÐPXÉ>ð 	8ÐiqÐruÑivð 	8Ð{ó 	8ð/Øð/Ø ð/Ø;CÀDÈÈcÈÁNÑ;Sð/Ø`dð/à
ó/ð:[ d¨3°¨8¡nð [¸XÀe¹_ð [ÐX`ÐadÑXeó [ð6˜5ó 6ð'Ø˜#‘ð'Ø*-ð'ØHPÐQUÐVYÐ[^ÐV^ÑQ_ÑH`ð'Ømqð'à
ó'ðTQ�d˜3‘ið Q°4ð Q¸Có Qð0˜#ð 0¨ð 0°=ð 0ÀSó 0ð.CØ
ð.CØð.CØ+.ð.CØ<@ÀÀcÀ¹Nð.Cà% d¨3°¨8¡nÑ5ð.CàBFð.CàV^Ð_bÑVcð.Cð 	ó.Côbb�9ô bð(˜t C™yð (°Tð (ÐPSð (Ðinó (ð> LPØBFòA*Ø
ðA*Ø$ S™MðA*Ø9AÀ%¹ðA*à˜3‘-ðA*à2:¸3±-ðA*àKNóA*ðJ˜tó ð˜4ó ñ OÙ}ÙRÙwØ$Øñ CÙxÙ/Ù5Ù-ñ8/Ð �t˜C ¨"¨d¨(Ñ!3Ð3Ñ4ó /ðU ó U÷ 0ðj 3ð j¨3ó jð"˜tó "ð ð `àð !ð  Uñð
 !Ù7Ð8QÓRñð
 !ð  {ñð
 !ðañð !ðZñ	ñ- 
ðB �HñG$ñ(€
ðT €× Ñ Ø	ØØñZð $Ø
Ø2õ	4õ  &Ý Ý 1Ý Û Ý !Ý Û Û Û 	Û Û Û Û Û Ý  Ý !Û àÐ àÐ àÐ àÐ à*€ð;ØÐOð;à Ð"^ð;ð *Ð+pð;ð (Ð)lð	;ð
 *Ð+pð;ð "Ð#[ð;ð ÐLð;ð "Ð#^ð;ð ,Ð-rð;ð "Ð#^ð;ð  Ð!Zð;ð "Ð#^ð;ð Ð Xð;ð Ð Xð;ð ÐRð;ð  ÐRð!;ð" Ð Xñ#;ð$ "Ð#^ð%;ð& ÐRð';ð( Ð Xð);ð*  Ð!Zð+;ð, #Ð$`ð-;ð. ÐSð/;ð0 ÐMð1;ð2 ÐMð3;ð4 ÐJð5;ð6 #Ð$`ð7;ð8 ÐPð9;ð: ÐPð;;ð< ÐPð=;ð> 5ð  7Eð?;ð@ ÐVðA;ðB  Ð!ZðC;ðD ÐRòE;ðF ÐRðG;ðH -Ð.tðI;ðJ ÐPðK;ðL 'Ð(gðM;ðN Ð WðO;ðP $Ð%bðQ;ðR  Ð!WðS;ðT Ð WðU;ðV $Ð%bðW;ðX $Ð%bðY;ðZ ÐJð[;ñ\ ÑHð];ñ^ !Ñ"^ð_;ñ` ,Ñ-tða;ñb ÑFðc;ñd ÑJðe;ñf ÑPñg;ñh %cÙ$bÙHÙPÙJÙJÙQóu;Ð ô|Br   