+
    jHàjÖ3  ã            
       óÂ  € R t ^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RIHt ]P                  ! R4      t
R R ltRR. R-O3R	R
. R.O3RR. R/O3/tR R ltR R ltR R ltR R lt. R0Ot] U Uu/ uF  w  rWP%                  R4      ^ ,          bK  	  upp tRR1RR2RR3RR4RR5/tRRRR6R]3RRRR7R ]3/tR! R" ltR# R$ ltR% tR& tR' R( ltR) R* ltR+ R, lt^ RIHt R# u upp i )8a  Text-to-speech provider setup (provider picker, API-key prompts, local engine installs, xAI OAuth).
setup.py names are resolved through the module object so test patches on ``hermes_cli.setup.<name>``
take effect; setup.py re-exports the public entry points.N)Útool_backend_helpers)Únous_subscriptionzhermes_cli.setupc                ó0   € V ^8„  d   QhR\         R\        /# )é   ÚextraÚreturn)ÚstrÚbool)Úformats   "Ú9/home/ubuntu/.hermes/hermes-agent/hermes_cli/setup_tts.pyÚ__annotate__r      s   € ÷ ñ œcð ¤dñ ó    c                ó"  € ^ RI p VP                  V .RR7       \
        P                  ! T  R24       R#   TP                  \        \        3 d>   p\
        P                  ! RT  RT 24       \
        P                  ! R4        Rp?R# Rp?ii ; i)	zGRecord the engine in PM's dependency union; activate it on next launch.NT)ÚexplicitzFailed to install z: zRetry with: hermes setup ttsFz% installed. Restart Hermes to use it.)	ÚpmÚ	sync_venvÚInstallErrorÚOSErrorÚ
ValueErrorÚ_setupÚprint_errorÚ
print_infoÚprint_success)r   r   Úexcs   &  r   Ú_install_tts_extrar      s‚   € ãðØ
�‰�e�W tˆÔ,ô
 ×Ò˜E˜7Ð"GÐHÔIÙøð �O‰OœW¤jÐ1ô Ü×ÒÐ/°¨w°b¸¸Ð>Ô?Ü×ÒÐ8Ô9Ýûðús   †5 µBÁ2B	Â	BÚdarwinz$Install with: brew install espeak-ngÚwin32z%Install with: choco install espeak-ngÚlinuxz(Install with: sudo apt install espeak-ngc                ó$   € V ^8„  d   QhR\         /# ©r   r   ©r	   )r
   s   "r   r   r   %   s   € ÷ (ñ (œdñ (r   c                 ój  € ^ RI Hp  V ! R4      '       g   \        P                  ! R4       R# \        P
                  ! R4      '       gñ   \        P
                  ! R4      '       gÕ   \        P                  \        P                  \        R,          4      w  r\        4        \        P                  ! R4       \        P                  ! V4       \        4        \        P                  ! R	R
4      '       d1    \        P                  ! VR
R7       \        P                   ! R4       M\        P                  ! R4       \        P&                  ! RRRR4       \)        R4      #   \        P"                  \$        3 d;   p\        P                  ! RT 24       \        P                  ! R4        Rp?R# Rp?ii ; i)zHInstall NeuTTS dependencies with user approval. Returns True on success.©Úextra_supportedÚneuttsz0NeuTTS is not supported by this Python/platform.Fú	espeak-ngÚespeakr   z,NeuTTS requires espeak-ng for phonemization.zInstall espeak-ng now?T)Úcheckzespeak-ng installedz+Could not install espeak-ng automatically: z,Please install it manually and re-run setup.NzJespeak-ng is required for NeuTTS. Install it manually before using NeuTTS.z#Installing neutts Python package...z<This will also download the TTS model (~300MB) on first use.)Ú	pm.extrasr#   r   r   ÚshutilÚwhichÚ_ESPEAK_INSTALLÚgetÚsysÚplatformÚprintÚprint_warningr   Úprompt_yes_noÚ
subprocessÚrunr   ÚCalledProcessErrorÚFileNotFoundErrorÚ_infor   )r#   ÚhintÚinstall_cmdÚes       r   Ú_install_neutts_depsr:   %   s5  € å)á˜8×$Ò$Ü×ÒÐMÔNÙÜ�LŠL˜×%Ò%¬¯ª°h×)?Ò)?Ü+×/Ñ/´·±¼oÈgÕ>VÓWÑˆÜŒÜ×ÒÐKÔLÜ×Ò˜$ÔÜŒÜ×ÒÐ 8¸$×?Ò?ðÜ—’˜{°$Õ7Ü×$Ò$Ð%:Õ;ô × Ò Ð!mÔnä
‡L‚L�Ð<Ø
HÈ$ôPä˜hÓ'Ð'øô ×1Ñ1Ô3DÐEô Ü×$Ò$Ð'RÐSTÐRUÐ%VÔWÜ×!Ò!Ð"PÔQÝûðús   Ã4.E ÅF2Å8/F-Æ-F2c                ó$   € V ^8„  d   QhR\         /# r   r    )r
   s   "r   r   r   B   s   € ÷ +ñ +¤ñ +r   c                 óH   € \         P                  ! RRR4       \        R4      # )zKInstall KittenTTS dependencies with user approval. Returns True on success.NzOInstalling kittentts Python package (~25-80MB model downloaded on first use)...Ú	kittentts)r   r6   r   © r   r   Ú_install_kittentts_depsr?   B   s   € ä
‡L‚L�ÐhÐjnÔoÜ˜kÓ*Ð*r   c                ó$   € V ^8„  d   QhR\         /# r   r    )r
   s   "r   r   r   H   s   € ÷ ñ ¬ñ r   c                 ór   €  ^ RI Hp  \        V ! 4       P                  R4      4      #   \         d     R# i ; i)z¤True iff xAI Grok OAuth credentials are stored locally, so TTS/STT setup can skip the
API-key prompt for users who logged in via ``hermes model`` -> xAI Grok OAuth.©Úget_xai_oauth_auth_statusÚ	logged_inF)Úhermes_cli.authrC   r	   r,   Ú	ExceptionrB   s    r   Ú_xai_oauth_logged_in_for_setuprG   H   s6   € ðÝ=ÜÑ-Ó/×3Ñ3°KÓ@ÓAÐAøÜô Úðús   ‚$' §6µ6c                ó$   € V ^8„  d   QhR\         /# r   r    )r
   s   "r   r   r   R   s   € ÷ ñ ¬ñ r   c            	     óÖ  €  ^ RI Hp HpHpHp \        P                  ! RR4        T! T ! 4       '       * R7      pT! TR,          TP                  R4      TP                  R	R
4      TP                  R4      RRR7       T! RR4       R#   \
         d%   p\        P                  ! RT 24        Rp?R# Rp?ii ; i  \
         d%   p\        P                  ! RT 24        Rp?R# Rp?ii ; i)u  Run the xAI Grok OAuth device-code login from inside the setup wizard. Saves OAuth tokens
only â€” does **not** switch the active provider or rewrite ``model.provider`` (callers only need
credentials for side tools). False on any failure (caller falls back).)Ú_is_remote_sessionÚ_save_xai_oauth_tokensÚ_xai_oauth_device_code_loginÚunsuppress_credential_sourcez$xAI Grok OAuth helpers unavailable: NFz6Signing in to xAI Grok OAuth (SuperGrok / Premium+)...)Úopen_browserÚtokensÚ	discoveryÚredirect_uriÚ Úlast_refreshÚoauth_device_code)rP   rQ   rS   Ú	auth_modeÚ
set_activez	xai-oauthÚdevice_codeTzxAI Grok OAuth login failed: )
rE   rJ   rK   rL   rM   rF   r   r0   r6   r,   )rJ   rK   rL   rM   r   Úcredss         r   Ú_run_xai_oauth_login_from_setuprY   R   sØ   € ð÷	*ó 	*ô ‡L‚L�ÐOÔPðÙ,Ñ>PÓ>RÔ:RÔSˆÙØ�(�O u§y¡y°Ó'=ÈEÏIÉIÐVdÐfhÓLiØŸ™ >Ó2Ð>QÐ^cõ	eñ
 	% [°-Ô@Ùøô ô Ü×ÒÐCÀCÀ5ÐIÔJÝûðûô ô Ü×ÒÐ<¸S¸EÐBÔCÝûðús/   ‚B ¦AB9 ÂB6ÂB1Â1B6Â9C(ÃC#Ã#C(Ú
elevenlabsÚopenaiÚminimaxÚmistralÚgeminir$   r=   z (ÚNeuTTSz Install NeuTTS dependencies now?Ú	KittenTTSzInstall KittenTTS now?c                ó0   € V ^8„  d   QhR\         R\         /# ©r   Úselectedr   ©r   )r
   s   "r   r   r   ‘   s   € ÷ ñ ¤ð ¬ñ r   c                ó¸  € \         V ,          w  rr4p\        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       d   V # \        4        V'       d   \        P                  ! V4       \        P
                  ! VRR7      pV'       d/   \        P                  ! W&4       \        P                  ! V4       V # \        P                  ! R4       R# )zOEnsure the key for an API-key TTS provider exists; fall back to edge otherwise.c              3   óN   "  € T F  p\         P                  ! V4      x € K  	  R # 5i)N)r   Úget_env_value)Ú.0Úvs   & r   Ú	<genexpr>Ú$_tts_api_key_step.<locals>.<genexpr>”   s   é € Ð
5©H qŒ6×Ò ×"Ð"«Hùs   ‚#%TF©Úpasswordz.No API key provided. Falling back to Edge TTS.Úedge)	Ú_TTS_API_KEY_PROVIDERSÚanyr/   r   r   ÚpromptÚsave_env_valuer   r0   )rc   Úenv_varsÚsave_varÚprompt_labelÚ	saved_msgr7   Úapi_keys   &      r   Ú_tts_api_key_steprx   ‘   s•   € ä8NÈxÕ8XÑ5€H˜°ß
ƒsÑ
5©HÓ
5‡s‡s‚sÑ
5©HÓ
5×5Ò5ØˆÜ	„GßÜ×Ò˜$ÔÜ�mŠm˜L°4Ô8€GßÜ×Ò˜hÔ0Ü×Ò˜YÔ'ØˆÜ
×ÒÐIÔJÙr   c                ó0   € V ^8„  d   QhR\         R\         /# rb   rd   )r
   s   "r   r   r   ¢   s   € ÷ ñ ¤cð ¬cñ r   c                ó  € ^ RI Hp \        V ,          w  r#rEpV! V 4      '       g   \        P                  ! V R24       V # \        P
                  ! V4      '       d   \        P                  ! V R24       V # \        4        V F  p\        P                  ! V4       K  	  \        4        \        P                  ! VR4      '       g   \        P                  ! RV  R24       R# V! 4       '       g   \        P                  ! V R24       R# V # )	zGOffer a local engine install; retain an unsupported explicit selection.r"   zt is not supported by this Python/platform. Your provider selection is saved, but speech requires a supported engine.z is already installedTz'Skipping install. Set tts.provider to 'z' after installing manually.rn   z3 installation incomplete. Falling back to Edge TTS.)
r(   r#   Ú_TTS_LOCAL_PROVIDERSr   r0   Ú_module_installedr   r/   r   r1   )rc   r#   ÚmoduleÚnameÚlinesÚquestionÚ	installerÚlines   &       r   Ú_tts_local_install_steprƒ   ¢   sê   € å)ä/CÀHÕ/MÑ,€F�% 9Ù˜8×$Ò$Ü×ÒØˆfð Xð Xô	Yð ˆÜ×Ò ×'Ò'Ü×Ò ˜vÐ%:Ð;Ô<ØˆÜ	„GÛˆÜ×Ò˜$Öñ ä	„GÜ×Ò ¨$×/Ò/Ü×ÒÐCÀHÀ:ÐMiÐjÔkÙÙ�;Š;Ü×Ò ˜vÐ%XÐYÔZÙØ€Or   c                  óV   € \        4       '       d   \        P                  ! R 4       R# R# )u6   Logged in â€” xAI TTS will use these OAuth credentialsNz@xAI Grok OAuth login did not complete. Falling back to Edge TTS.)rY   r   r   r>   r   r   Ú_xai_oauth_pathr…   ¼   s    € Ü&×(Ò(Ü×ÒÐUÔVÙÙMr   c                  óÂ   € \         P                  ! R RR7      p V '       d0   \         P                  ! RV 4       \         P                  ! R4       R# ^ RIHp RV! 4        R2# )	zxAI API key for TTSTrl   ÚXAI_API_KEYzxAI TTS API key savedN)Údisplay_hermes_homezQNo xAI API key provided for TTS. Configure XAI_API_KEY via hermes setup model or z//.env to use xAI TTS. Falling back to Edge TTS.)r   rq   rr   r   Úhermes_constantsrˆ   )rw   Ú_dhhs     r   Ú_xai_api_key_pathr‹   Ã   sV   € Ü�mŠmÐ1¸DÔA€GßÜ×Ò˜m¨WÔ5Ü×ÒÐ4Ô5ÙÝ<ðÙ“&�ÐHðJð Kr   c                ó0   € V ^8„  d   QhR\         R\        /# )r   Úconfigr   )Údictr   )r
   s   "r   r   r   Î   s   € ÷ ñ œ$ð ¤3ñ r   c                ó„  € \         P                  ! R4      '       d   \         P                  ! R4       M�\        4       '       d   \         P                  ! R4       Mh\	        4        \         P
                  ! R. RO^ R7      p\        \        R 3VR9   d   TM^,          ! 4       pV'       d   \         P                  ! V4       R# \	        4        \         P                  ! R4      ;'       g    R	P                  4       pV'       d>   W0P                  R
/ 4      P                  R/ 4      R&   \         P                  ! RV 24       R# )uÝ   xAI TTS auth. Order: existing XAI_API_KEY > existing OAuth tokens > offer both
paths â€” matches runtime, where an explicit key wins over the subscription OAuth
bearer (which 403s on metered /v1/tts). See #87045, #113727.r‡   zJxAI TTS will use your existing XAI_API_KEY (preferred over xAI Grok OAuth)zGxAI TTS will use your xAI Grok OAuth (SuperGrok / Premium+) credentialsz(How do you want xAI TTS to authenticate?)ÚchoicesÚdefaultc                  ó   € R # )z*xAI TTS skipped. Falling back to Edge TTS.r>   r>   r   r   Ú<lambda>Ú_tts_xai_step.<locals>.<lambda>Ý   s   € Ñ@lr   rn   z:xAI voice_id (Enter for 'eve', or paste a custom voice ID)rR   ÚttsÚxaiÚvoice_idzxAI voice_id set to: )uD   Sign in with xAI Grok OAuth (SuperGrok / Premium+) â€” browser loginz#Paste an xAI API key (console.x.ai)u   Skip â†’ fallback to Edge TTS)é    é   )r   rg   r   rG   r/   Úprompt_choicer…   r‹   r0   rq   ÚstripÚ
setdefault)r�   Ú
choice_idxÚfallbackr—   s   &   r   Ú_tts_xai_steprŸ   Î   sü   € ô ×Ò˜M×*Ò*Ü×ÒÐiÕjÜ	'×	)Ò	)Ü×ÒÐfÕgäŒÜ×)Ò)Ø6ò]Øfgôiˆ
ô
 $Ô%6Ñ8lÐmØ$¨Ô.‰J°Aö7ó 9ˆçÜ× Ò  Ô*ÙÜ	„GÜ—’ÐZÓ[×aÐaÐ_a×hÑhÓj€HßØIQ×Ñ˜% Ó$×/Ñ/°°rÓ:¸:ÑFÜ×ÒÐ4°X°JÐ?Ô@Ùr   c                ó$   € V ^8„  d   QhR\         /# ©r   r�   ©rŽ   )r
   s   "r   r   r   ê   s   € ÷ añ a¤ñ ar   c                ó„  € V P                  R/ 4      P                  RR4      p\        P                  W4      p\        4        \        P                  ! R4       \        P
                  ! RV 2R4       \        \        4      p\        P                  ! 4       '       d9   \        P                  ! V 4      P                  '       d   VP                  ^ R4       V UUu. uF  w  rEVNK	  	  uppRV R	2.,           p\        V4      ^,
          p\        P                  ! R
Wg4      pW‡8X  d   R# W8,          ^ ,          p	V	R8X  dh   Rp	\        P                   ! R4       \        P"                  ! R4      '       g   \        P"                  ! R4      '       d   \        P$                  ! R4       M@V	\&        9   d   \)        V	4      p	M)V	\*        9   d   \-        V	4      p	MV	R8X  d   \/        V 4      p	W�P1                  R/ 4      R&   \        P2                  ! V 4       \        P4                  ! R\        P                  W™4       24       R# u uppi )zGInteractive TTS provider selection with install flow for local engines.r•   Úproviderrn   z"Text-to-Speech Provider (optional)z	Current: Núnous-openaizKeep current (Ú)zSelect TTS provider:r[   zKOpenAI TTS will use the managed Nous gateway and bill to your subscription.ÚVOICE_TOOLS_OPENAI_KEYÚOPENAI_API_KEYziDirect OpenAI credentials are still configured and may take precedence until removed from ~/.hermes/.env.r–   zTTS provider set to: )r¥   zCNous Subscription (managed OpenAI TTS, billed to your subscription))r,   Ú_TTS_PROVIDER_LABELSr/   r   Úprint_headerr6   ÚlistÚ_TTS_PROVIDER_CHOICESr   Úmanaged_nous_tools_enabledr   Úget_nous_subscription_featuresÚnous_auth_presentÚinsertÚlenrš   r   rg   r0   r{   rƒ   ro   rx   rŸ   rœ   Úsave_configr   )
r�   Úcurrent_providerÚcurrent_labelÚoptionsÚ_Úlabelr�   Úkeep_current_idxÚidxrc   s
   &         r   Ú_setup_tts_providerrº   ê   sà  € à—z‘z %¨Ó,×0Ñ0°¸VÓDÐÜ(×,Ñ,Ð-=ÓP€MÜ	„GÜ
×ÒÐ<Ô=Ü
‡L‚L�9˜]˜OÐ,¨dÔ3ÜÔ(Ó)€GÜ×6Ò6×8Ò8Ô=N×=mÒ=mÐntÓ=u÷  >H÷  >Hð  >HØ�‰�qð bô 	cá%,Ô-¡W™˜‹u¡WÒ-°>À-ÀÐPQÐ1RÐ0SÕS€GÜ˜7“| aÕ'ÐÜ
×
Ò
Ð5°wÓ
Q€CØ
ÔÙØ�|˜A�€HØ�=Ô ØˆÜ×ÒÐgÔhÜ×ÒÐ 8×9Ò9¼V×=QÒ=QÐRb×=cÒ=cÜ× Ò ð "Fô Gøà	Ô)Ô	)Ü*¨8Ó4‰Ø	Ô+Ô	+Ü$ XÓ.‰Ø	�UÔ	Ü  Ó(ˆØ/7×Ñ�e˜RÓ  Ñ,Ü
×Ò�vÔÜ
×ÒÐ0Ô1E×1IÑ1IÈ(Ó1]Ð0^Ð_Ö`ùó) .s   ÃH<c                ó$   € V ^8„  d   QhR\         /# r¡   r¢   )r
   s   "r   r   r     s   € ÷  ñ  ”dñ  r   c                ó   € \        V 4       R# )z.Standalone TTS setup (for 'hermes setup tts').N)rº   )r�   s   &r   Ú	setup_ttsr½     s
   € ä˜Ör   )ÚbrewÚinstallr%   )Úchocor¿   r%   ú-y)ÚsudoÚaptr¿   rÁ   r%   )	)rn   z-Edge TTS (free, cloud-based, no setup needed))rZ   z+ElevenLabs (premium quality, needs API key))r[   z(OpenAI TTS (good quality, needs API key))r–   u0   xAI TTS (Grok voices â€” OAuth login or API key))r\   z<MiniMax TTS (high quality with voice cloning, needs API key))r]   z>Mistral Voxtral TTS (multilingual, native Opus, needs API key))r^   zJGoogle Gemini TTS (30 prebuilt voices, prompt-controllable, needs API key))r$   z5NeuTTS (local on-device, free, ~300MB model download))r=   z<KittenTTS (local on-device, free, lightweight ~25-80MB ONNX)))ÚELEVENLABS_API_KEYrÄ   zElevenLabs API keyzElevenLabs API key savedrR   ))r§   r¨   r§   zOpenAI API key for TTSzOpenAI TTS API key savedrR   ))ÚMINIMAX_API_KEYrÅ   zMiniMax API key for TTSzMiniMax TTS API key savedrR   ))ÚMISTRAL_API_KEYrÆ   zMistral API key for TTSzMistral TTS API key savedrR   ))ÚGEMINI_API_KEYÚGOOGLE_API_KEYrÇ   zGemini API key for TTSzGemini TTS API key savedz<Get a free API key at https://aistudio.google.com/app/apikey)zNeuTTS requires:uH     â€¢ Python package: neutts (~50MB install + ~300MB model on first use)u,     â€¢ System package: espeak-ng (phonemizer))zCKittenTTS is lightweight (~25-80MB, CPU-only, no API key required).z:Voices: Jasper, Bella, Luna, Bruno, Rosie, Hugo, Kiki, Leo) Ú__doc__Úloggingr)   r2   r-   Útoolsr   Ú
hermes_clir   Ú	getLoggerÚloggerr   r+   r:   r?   rG   rY   r¬   Úsplitr©   ro   r{   rx   rƒ   r…   r‹   rŸ   rº   r½   Úhermes_cli.setupÚsetupr   )Úkeyr·   s   00r   Ú<module>rÓ      sR  ðñ=ó Û Û Û 
Ý &Ý (à	×	Ò	Ð-Ó	.€õð  Ð5Ò7WÐXØÐ5Ò7^Ð_ØÐ8Ò:gÐhð€õ(õ:+õõò4	SÐ ñ EZÔZÑDY±j°c˜Ÿ[™[¨Ó.¨qÕ1Ò1ÑDYÒZÐ ð ð 3àð Iàð 1àð 1àð kðÐ ð ˆx˜ð@à1Ð3GðIð �+˜{ðQà*Ð,CðEðFÐ õõ"ò4NòKõõ8aõD ÷
 "ùóu [s   Á,#C