§
    ‰eîi� ã                   óR  — 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m	Z	 ddl
mZmZmZ ddlmZ ddlmZ ddlmZ ddlmZ  ej        e¦  «        Z e	e¦  «        j        j                             ¦   «         Zd	Zd
eeef         deeef         fd„Zd
eeef         deeef         fd„Z d
eeef         dededdfd„Z!dede"fd„Z#dgg d¢g d¢g d¢g d¢g d¢ddgg d¢g d¢g d¢g d¢g d¢g d¢g d¢g d¢d œZ$d
eeef         defd!„Z%d
eeef         d"eddfd#„Z&dd$l'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0 dd%l1m2Z2m3Z3 d&efd'„Z4dd(l5m6Z6m7Z7m8Z8m9Z9 de"fd)„Z:d®d*edz  ddfd+„Z;d¯d-ed.ed/e"defd0„Z<d°d-ed1e=d.e>d2edz  de>f
d3„Z?d°d-ed1e=d.e>d2edz  de>f
d4„Z@d±d-ed.e"de"fd6„ZAd®d&ed7e=d8e=de=fd9„ZBd:eCfd;„ZDd
eCfd<„ZEd
eCfd=„ZFd,d>œd
eCd?e"fd@„ZGde"fdA„ZHde"fdB„ZIde"fdC„ZJd
eCfdD„ZKd
eCfdE„ZLd
eCfdF„ZMd
eCfdG„ZNd
eCfdH„ZOdI„ ZPdJ„ ZQdKede=fdL„ZRdM„ ZSdN„ ZTdO„ ZUdP„ ZVdQ„ ZWdR„ ZXdS„ ZYdT„ ZZdU„ Z[dV„ Z\dW„ Z]dX„ Z^dY„ Z_dZ„ Z`d[„ Zad\„ Zbd]d^ePfd_d`eQfdadbeSfdcddeYfdedfeZfdgdhe[fdidjeUfdkdleVfdmdneWfdodpe\fdqdre]fdsdte^fdudve_fdwdxeXfdydze`fd{d|eafd}d~ebfgZcd
eCfd„Zdd²d
eCd€e"fd�„Zed
eCde"fd‚„Zfdƒedefd„„Zgd
eCd…edee         fd†„Zhd
eCd…edƒede"fd‡„Zi eedˆz  ¦  «        d‰z  dŠz  d‹z  dŒz  Zjd�„ ZkdŽd�d�d‘d’d“d”d•d–d—œ	Zld˜eCfd™„Zmdše	de"fd›„Zndœd�eGfdždŸeLfd d¡eMfd¢d£edfd¤d¥eefd¦d§eOfgZod¨„ Zpdee=e                  fd©„Zqdª„ Zrd
eCd«e"fd¬„Zsd
eCfd­„ZtdS )³uÌ  
Interactive setup wizard for Hermes Agent.

Modular wizard with independently-runnable sections:
  1. Model & Provider â€” choose your AI provider and model
  2. Terminal Backend â€” where your agent runs commands
  3. Agent Settings â€” iterations, compression, session reset
  4. Messaging Platforms â€” connect Telegram, Discord, etc.
  5. Tools â€” configure TTS, web search, image generation, etc.

Config files are stored in ~/.hermes/ for easy access.
é    N)ÚPath)ÚOptionalÚDictÚAny)Úget_nous_subscription_features)Úmanaged_nous_tools_enabled)Úbase_url_hostname)Úget_optional_skills_dirz*https://hermes-agent.nousresearch.com/docsÚconfigÚreturnc                 óö   — |                       d¦  «        }t          |t          ¦  «        rt          |¦  «        S t          |t          ¦  «        r*|                     ¦   «         rd|                     ¦   «         iS i S )NÚmodelÚdefault)ÚgetÚ
isinstanceÚdictÚstrÚstrip)r   Úcurrent_models     ú2/home/div/.hermes/hermes-agent/hermes_cli/setup.pyÚ_model_config_dictr   #   st   € Ø—J’J˜wÑ'Ô'€MÝ�-¥Ñ&Ô&ð #Ý�MÑ"Ô"Ð"Ý�-¥Ñ%Ô%ð 2¨-×*=Ò*=Ñ*?Ô*?ð 2Ø˜=×.Ò.Ñ0Ô0Ð1Ð1Ø€Ió    c                 óx   — |                       d¦  «        }t          |t          ¦  «        rt          |¦  «        ni S ©NÚcredential_pool_strategies©r   r   r   )r   Ú
strategiess     r   Ú_get_credential_pool_strategiesr   ,   s6   € Ø—’Ð8Ñ9Ô9€JÝ)¨*µdÑ;Ô;ÐC�4�
ÑÔÐÀÐCr   ÚproviderÚstrategyc                 ó@   — |sd S t          | ¦  «        }|||<   || d<   d S r   )r   )r   r   r    r   s       r   Ú_set_credential_pool_strategyr"   1   s7   € Øð ØˆÝ0°Ñ8Ô8€JØ#€JˆxÑØ+5€FÐ'Ñ(Ð(Ð(r   c                 óv   — | r| dk    rdS | dk    rdS ddl m} |                     | ¦  «        }|sdS |j        dv S )NÚcustomFÚ
openrouterTr   ©ÚPROVIDER_REGISTRY>   Úapi_keyÚoauth_device_code)Úhermes_cli.authr'   r   Ú	auth_type)r   r'   Úpconfigs      r   Ú"_supports_same_provider_pool_setupr-   9   sj   € Øð �x 8Ò+Ð+ØˆuØ�<ÒÐØˆtØ1Ð1Ð1Ð1Ð1Ð1à×#Ò# HÑ-Ô-€GØð ØˆuØÔÐ @Ð@Ð@r   úcopilot-acp)úgpt-5.4zgpt-5.4-miniz
gpt-5-miniúgpt-5.3-codexzgpt-5.2-codexúgpt-4.1úgpt-4oúgpt-4o-minizclaude-opus-4.6zclaude-sonnet-4.6zclaude-sonnet-4.5zclaude-haiku-4.5zgemini-2.5-prozgrok-code-fast-1)zgemini-3.1-pro-previewzgemini-3-pro-previewzgemini-3-flash-previewzgemini-3.1-flash-lite-preview)úglm-5.1úglm-5zglm-4.7zglm-4.5zglm-4.5-flash)ú	kimi-k2.6ú	kimi-k2.5zkimi-k2-thinkingzkimi-k2-turbo-previewzstep-3.5-flashzstep-3.5-flash-2603)ztrinity-large-thinkingztrinity-large-previewztrinity-mini)zMiniMax-M2.7zMiniMax-M2.5zMiniMax-M2.1z
MiniMax-M2)úanthropic/claude-opus-4.6úanthropic/claude-sonnet-4.6zopenai/gpt-5zgoogle/gemini-3-flash)r8   r9   zopenai/gpt-5.4zgoogle/gemini-3-pro-previewzgoogle/gemini-3-flash-preview)r/   r0   zclaude-sonnet-4-6zgemini-3-flashr5   r7   úminimax-m2.7)r6   r7   r4   r5   zmimo-v2.5-proz	mimo-v2.5zmimo-v2-prozmimo-v2-omnir:   zminimax-m2.5zqwen3.6-pluszqwen3.5-plus)zQwen/Qwen3.5-397B-A17Bz"Qwen/Qwen3-235B-A22B-Thinking-2507z#Qwen/Qwen3-Coder-480B-A35B-Instructzdeepseek-ai/DeepSeek-R1-0528zdeepseek-ai/DeepSeek-V3.2zmoonshotai/Kimi-K2.5)r.   ÚcopilotÚgeminiÚzaiúkimi-codingúkimi-coding-cnÚstepfunÚarceeÚminimaxú
minimax-cnú
ai-gatewayÚkilocodezopencode-zenzopencode-goÚhuggingfacec                 óê   — |                       d¦  «        }t          |t          ¦  «        rHt          |                      d¦  «        pd¦  «                             ¦   «                              ¦   «         S dS )NÚagentÚreasoning_effortÚ )r   r   r   r   r   Úlower)r   Ú	agent_cfgs     r   Ú_current_reasoning_effortrM   s   sc   € Ø—
’
˜7Ñ#Ô#€IÝ�)�TÑ"Ô"ð LÝ�9—=’=Ð!3Ñ4Ô4Ð:¸Ñ;Ô;×AÒAÑCÔC×IÒIÑKÔKÐKØˆ2r   Úeffortc                 ór   — |                       d¦  «        }t          |t          ¦  «        si }|| d<   ||d<   d S )NrH   rI   r   )r   rN   rL   s      r   Ú_set_reasoning_effortrP   z   sD   € Ø—
’
˜7Ñ#Ô#€IÝ�i¥Ñ&Ô&ð $Øˆ	Ø#ˆˆw‰Ø$*€IÐ Ñ!Ð!Ð!r   )	ÚDEFAULT_CONFIGÚget_hermes_homeÚget_config_pathÚget_env_pathÚload_configÚsave_configÚsave_env_valueÚget_env_valueÚensure_hermes_home)ÚColorsÚcolorÚtitlec                 óŒ   — t          ¦   «          t          t          d| › �t          j        t          j        ¦  «        ¦  «         dS )zPrint a section header.u   â—† N)Úprintr[   rZ   ÚCYANÚBOLD)r\   s    r   Úprint_headerra   •   s5   € å	�G„G€GÝ	�%��u��¥¤­V¬[Ñ
9Ô
9Ñ:Ô:Ð:Ð:Ð:r   )Úprint_errorÚ
print_infoÚprint_successÚprint_warningc                  óœ   — t          t          dd¦  «        } | €dS 	 t          |                      ¦   «         ¦  «        S # t          $ r Y dS w xY w)z;Return True when stdin looks like a usable interactive TTY.ÚstdinNF)ÚgetattrÚsysÚboolÚisattyÚ	Exception)rg   s    r   Úis_interactive_stdinrm   £   sZ   € å•C˜ $Ñ'Ô'€EØ€}ØˆuðÝ�E—L’L‘N”NÑ#Ô#Ð#øÝð ð ð Øˆuˆuðøøøs   œ = ½
AÁ
AÚreasonc                 óê  — t          ¦   «          t          t          dt          j        t          j        ¦  «        ¦  «         t          ¦   «          | rt          | ¦  «         t          d¦  «         t          ¦   «          t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          ¦   «          t          d¦  «         t          d¦  «         t          ¦   «          d	S )
z8Print guidance for headless/non-interactive setup flows.u)   âš• Hermes Setup â€” Non-interactive modez+The interactive wizard cannot be used here.z@Configure Hermes using environment variables or config commands:z)  hermes config set model.provider customz;  hermes config set model.base_url http://localhost:8080/v1z1  hermes config set model.default your-model-namez?Or set OPENROUTER_API_KEY / OPENAI_API_KEY in your environment.zERun 'hermes setup' in an interactive terminal to use the full wizard.N)r^   r[   rZ   r_   r`   rc   )rn   s    r   Ú#print_noninteractive_setup_guidancerp   ®   sÑ   € å	�G„G€GÝ	�%Ð;½V¼[Í&Ì+Ñ
VÔ
VÑWÔWÐWÝ	�G„G€GØð Ý�6ÑÔÐÝÐ<Ñ=Ô=Ð=Ý	�G„G€GÝÐQÑRÔRÐRÝÐ:Ñ;Ô;Ð;ÝÐLÑMÔMÐMÝÐBÑCÔCÐCÝ	�G„G€GÝÐPÑQÔQÐQÝÐVÑWÔWÐWÝ	�G„G€G€G€Gr   FÚquestionr   Úpasswordc                 ó~  — |r	| › d|› d�}n| › d�}	 |r2ddl }|                      t          |t          j        ¦  «        ¦  «        }n't	          t          |t          j        ¦  «        ¦  «        }|                     ¦   «         p|pdS # t          t          f$ r& t          ¦   «          t          j
        d¦  «         Y dS w xY w)z'Prompt for input with optional default.ú [ú]: ú: r   NrJ   é   )Úgetpassr[   rZ   ÚYELLOWÚinputr   ÚKeyboardInterruptÚEOFErrorr^   ri   Úexit)rq   r   rr   Údisplayrx   Úvalues         r   Úpromptr€   Á   sÏ   € àð "ØÐ-Ð- Ð-Ð-Ð-ˆˆà�/�/�/ˆðØð 	9ØˆNˆNˆNà—O’O¥E¨'µ6´=Ñ$AÔ$AÑBÔBˆEˆEå�% ­¬Ñ7Ô7Ñ8Ô8ˆEà�{Š{‰}Œ}Ð- Ð-¨2Ð-øÝ�xÐ(ð ð ð Ý‰ŒˆÝŒ�‰Œˆˆˆˆðøøøs   ’A2B Â3B<Â;B<ÚchoicesÚdescriptionc                 ó.   — ddl m}  || ||d|¬¦  «        S )z?Single-select menu using curses. Delegates to curses_radiolist.r   )Úcurses_radiolistéÿÿÿÿ)ÚselectedÚcancel_returnsr‚   )Úhermes_cli.curses_uir„   )rq   r�   r   r‚   r„   s        r   Ú_curses_prompt_choicer‰   Ö   s2   € à5Ð5Ð5Ð5Ð5Ð5ØÐ˜H g¸ÐPRÐ`kÐlÑlÔlÐlr   c           	      óº  — t          | |||¬¦  «        }|dk    r5||k    rt          d¦  «         t          ¦   «          |S t          ¦   «          |S t          t          | t          j        ¦  «        ¦  «         t          |¦  «        D ]X\  }}||k    rdnd}||k    r.t          t          d|› d|› �t          j        ¦  «        ¦  «         ŒCt          d|› d|› �¦  «         ŒYt          d|d	z   › d
�¦  «         	 	 t          t          dt          |¦  «        › d|d	z   › d�t          j
        ¦  «        ¦  «        }|s|S t          |¦  «        d	z
  }d|cxk    rt          |¦  «        k     rn n|S t          dt          |¦  «        › �¦  «         nS# t          $ r t          d¦  «         Y n8t          t          f$ r% t          ¦   «          t!          j        d	¦  «         Y nw xY wŒè)z˜Prompt for a choice from a list with arrow key navigation.

    Escape keeps the current default (skips the question).
    Ctrl+C exits the wizard.
    )r‚   r   z  Skipped (keeping current)u   â—�u   â—‹ú  Ú z  Enter for default (rw   z)  Ctrl+C to exitTz  Select [1-z] (z): z$Please enter a number between 1 and zPlease enter a number)r‰   rc   r^   r[   rZ   ry   Ú	enumerateÚGREENrz   ÚlenÚDIMÚintrb   Ú
ValueErrorr{   r|   ri   r}   )	rq   r�   r   r‚   ÚidxÚiÚchoiceÚmarkerr   s	            r   Úprompt_choicer—   Ý   s+  € õ   ¨'°7ÈÐ
TÑ
TÔ
T€CØ
ˆa‚x€xØ�'Š>ˆ>ÝÐ4Ñ5Ô5Ð5Ý‰GŒGˆGØˆNÝ‰ŒˆØˆ
å	�%��&œ-Ñ
(Ô
(Ñ)Ô)Ð)Ý˜wÑ'Ô'ð *ð *‰	ˆˆ6Ø˜wš,˜,��¨EˆØ�Š<ˆ<Ý•%Ð.˜VÐ.Ð. fÐ.Ð.µ´Ñ=Ô=Ñ>Ô>Ð>Ð>åÐ(�vÐ(Ð( Ð(Ð(Ñ)Ô)Ð)Ð)åÐE w°¡{ÐEÐEÐEÑFÔFÐFðð	ÝÝÐF¥S¨¡\¤\ÐFÐF°gÀ±kÐFÐFÐFÍÌ
ÑSÔSñô ˆEð ð Ø�Ý�e‘*”*˜q‘.ˆCØ�CÐ&Ð&Ò&Ð&�#˜g™,œ,Ò&Ð&Ð&Ð&Ð&Ø�
ÝÐM½sÀ7¹|¼|ÐMÐMÑNÔNÐNÐNøÝð 	1ð 	1ð 	1ÝÐ/Ñ0Ô0Ð0Ð0Ð0Ý!¥8Ð,ð 	ð 	ð 	Ý‰GŒGˆGÝŒH�Q‰KŒKˆKˆKˆKð	øøøðs%   Ã6AF	 Ä80F	 Å)F	 Æ	GÆ$2GÇGTc                 óh  — |rdnd}	 	 t          t          | › d|› d�t          j        ¦  «        ¦  «                             ¦   «                              ¦   «         }n9# t          t          f$ r% t          ¦   «          t          j
        d¦  «         Y nw xY w|s|S |dv rdS |dv rd	S t          d
¦  «         Œ¬)z=Prompt for yes/no. Ctrl+C exits, empty input returns default.zY/nzy/NTrt   ru   rw   )ÚyÚyes)ÚnÚnoFzPlease enter 'y' or 'n')rz   r[   rZ   ry   r   rK   r{   r|   r^   ri   r}   rb   )rq   r   Údefault_strr   s       r   Úprompt_yes_norž     sÚ   € à"Ð-�%�%¨€Kð/ð	å•e˜xÐ;Ð;¨;Ð;Ð;Ð;½V¼]ÑKÔKÑLÔLß’‘”ß’‘”ð ˆEøõ
 "¥8Ð,ð 	ð 	ð 	Ý‰GŒGˆGÝŒH�Q‰KŒKˆKˆKˆKð	øøøð ð 	ØˆNØ�LÐ Ð Ø�4Ø�KÐÐØ�5ÝÐ-Ñ.Ô.Ð.ð#/s   ‰AA Á3BÂBÚitemsÚpre_selectedc                 ó†   — |€g }ddl m}  || |t          |¦  «        t          |¦  «        ¬¦  «        }t          |¦  «        S )u  
    Display a multi-select checklist and return the indices of selected items.

    Each item in `items` is a display string. `pre_selected` is a list of
    indices that should be checked by default. A "Continue â†’" option is
    appended at the end â€” the user toggles items with Space and confirms
    with Enter on "Continue â†’".

    Falls back to a numbered toggle interface when simple_term_menu is
    unavailable.

    Returns:
        List of selected indices (not including the Continue option).
    Nr   )Úcurses_checklist)r‡   )rˆ   r¢   ÚsetÚsorted)r\   rŸ   r    r¢   Úchosens        r   Úprompt_checklistr¦      sb   € ð ÐØˆà5Ð5Ð5Ð5Ð5Ð5àÐØØÝˆLÑÔÝ˜<Ñ(Ô(ð	ñ ô €Fõ �&‰>Œ>Ðr   Úvarc           
      ót  — |                       dg ¦  «        }d                     |dd…         ¦  «        }t          |¦  «        dk    r|dt          |¦  «        dz
  › d�z  }t          ¦   «          t          t	          d|                       d| d	         ¦  «        › d
�t
          j        ¦  «        ¦  «         t          ¦   «          |rt          d|› �¦  «         |                       d¦  «        rt          d| d         › �¦  «         t          ¦   «          |                       d¦  «        r/t          d|                       d| d	         ¦  «        › �d¬¦  «        }n,t          d|                       d| d	         ¦  «        › �¦  «        }|r't          | d	         |¦  «         t          d¦  «         dS t          d¦  «         dS )zEDisplay a nicely formatted API key input screen for a single env var.Útoolsú, Né   z, +z moreõ     â”€â”€â”€ r‚   Únameõ
    â”€â”€â”€z  Enables: Úurlz  Get your key at: rr   r‹   r€   T©rr   õ     âœ“ Savedz/  Skipped (configure later with 'hermes setup'))r   Újoinr�   r^   r[   rZ   r_   rc   r€   rW   rd   re   )r§   r©   Ú	tools_strr   s       r   Ú_prompt_api_keyr´   =  s¯  € à�GŠG�G˜RÑ Ô €EØ—	’	˜%   œ)Ñ$Ô$€IÝ
ˆ5�z„z�A‚~€~ØÐ0�3˜u™:œ:¨™>Ð0Ð0Ð0Ñ0ˆ	å	�G„G€GÝ	�%ÐN˜sŸwšw }°c¸&´kÑBÔBÐNÐNÐNÕPVÔP[Ñ
\Ô
\Ñ]Ô]Ð]Ý	�G„G€GØð .ÝÐ, Ð,Ð,Ñ-Ô-Ð-Ø
‡w‚wˆu�~„~ð 7ÝÐ5¨¨U¬Ð5Ð5Ñ6Ô6Ð6Ý	�G„G€Gà
‡w‚wˆzÑÔð >ÝÐ<˜CŸGšG H¨c°&¬kÑ:Ô:Ð<Ð<ÀtÐLÑLÔLˆˆåÐ<˜CŸGšG H¨c°&¬kÑ:Ô:Ð<Ð<Ñ=Ô=ˆàð IÝ�s˜6”{ EÑ*Ô*Ð*Ý�mÑ$Ô$Ð$Ð$Ð$åÐGÑHÔHÐHÐHÐHr   c                 óŠ  — t          ¦   «          t          d¦  «         g }t          | ¦  «        }	 ddlm}  |¦   «         }n# t
          $ r g }Y nw xY w|r|                     d¦  «         n|                     d¦  «         t          d¦  «        r|                     d¦  «         n|                     d¦  «         |j        j	        r|                     d	¦  «         nX|j        j
        r7d
}|j        j        rd|j        j        › d�}|                     |ddf¦  «         n|                     d¦  «         |j        j        }|j        j	        r|                     d¦  «         nl|j        j
        r#d}|rd|› d�}|                     |ddf¦  «         n=d}|dk    rd}n|dk    rd}n|dk    rd}n|dk    rd}|                     dd|f¦  «         |j        j	        r|                     d¦  «         nÇ|j        j
        r|                     d¦  «         n¥d}		 ddlm}
 dd lm}  |¦   «           |
¦   «         D ]<}|j        d!k    rŒ	 |                     ¦   «         r	|j        }	 nŒ-# t
          $ r Y Œ9w xY wn# t
          $ r Y nw xY w|	r|                     d"|	› d�ddf¦  «         n|                     d#¦  «         |                      d$i ¦  «                             d%d&¦  «        }|j        j	        r|                     d'¦  «         �nÚ|d(k    r&t          d)¦  «        r|                     d*¦  «         �n®|d+k    r5t          d,¦  «        st          d-¦  «        r|                     d.¦  «         �ns|d/k    r&t          d0¦  «        r|                     d1¦  «         �nG|d2k    r&t          d3¦  «        r|                     d4¦  «         �n|d5k    r4t          d6¦  «        st          d7¦  «        r|                     d8¦  «         ná|d9k    r^	 |j                             d9¦  «        du}n# t
          $ r d}Y nw xY w|r|                     d:¦  «         n“|                     d;¦  «         n}|d<k    rb	 ddl}|j                             d<¦  «        du}n# t
          $ r d}Y nw xY w|r|                     d=¦  «         n+|                     d>¦  «         n|                     d?¦  «         |j        j	        r|                     d@¦  «         n�|                      dAi ¦  «                             dB¦  «        dCk    r8|j        j        r|                     dD¦  «         n@|                     dE¦  «         n*t9          ¦   «         r|j        r|                     dF¦  «         t          dG¦  «        r%t          dH¦  «        r|                     dI¦  «         n:t          dG¦  «        r|                     dJ¦  «         n|                     dK¦  «         t          dL¦  «        r|                     dM¦  «         	 ddNlm}  |dO¦  «        pi }|                     dP¦  «        s|                     dQ¦  «        r|                     dR¦  «         n# t
          $ r Y nw xY wt          dS¦  «        r|                     dT¦  «         n|                     dU¦  «         |                     dV¦  «         |                     dW¦  «         |                     dX¦  «         tA          dY„ |D ¦   «         ¦  «        }tC          |¦  «        }tE          |› dZ|› d[�¦  «         t          ¦   «          |D ]‚\  }}}|r.t          d\tG          d]tH          j%        ¦  «        › d^|› �¦  «         Œ6t          d\tG          d_tH          j&        ¦  «        › d^|› d^tG          d`|› d�tH          j'        ¦  «        › �¦  «         Œƒt          ¦   «          da„ |D ¦   «         }|r>tQ          db¦  «         ddcl)m*} tQ          dd |¦   «         › de�¦  «         t          ¦   «          t          ¦   «          t          tG          dftH          j%        ¦  «        ¦  «         t          tG          dgtH          j%        ¦  «        ¦  «         t          tG          dhtH          j%        ¦  «        ¦  «         t          ¦   «          ddcl)m*} t          tG          di |¦   «         › dj�tH          j+        tH          j,        ¦  «        ¦  «         t          ¦   «          t          d\tG          dktH          j-        ¦  «        › dlt]          ¦   «         › �¦  «         t          d\tG          dmtH          j-        ¦  «        › dlt_          ¦   «         › �¦  «         t          d\tG          dntH          j-        ¦  «        › do|› dp�¦  «         t          ¦   «          t          tG          dqtH          j'        ¦  «        ¦  «         t          ¦   «          t          tG          drtH          j+        tH          j,        ¦  «        ¦  «         t          ¦   «          t          d\tG          dstH          j%        ¦  «        › dt�¦  «         t          d\tG          dutH          j%        ¦  «        › dv�¦  «         t          d\tG          dwtH          j%        ¦  «        › dx�¦  «         t          d\tG          dytH          j%        ¦  «        › dz�¦  «         t          d\tG          d{tH          j%        ¦  «        › d|�¦  «         t          ¦   «          t          d\tG          d}tH          j%        ¦  «        › d~�¦  «         t          d\tG          dtH          j%        ¦  «        › d€�¦  «         t          d\tG          d�tH          j%        ¦  «        › �¦  «         t          d‚¦  «         t          ¦   «          t          dƒ¦  «         t          d\tG          d„t]          ¦   «         › �tH          j'        ¦  «        › �¦  «         t          d\tG          d„t_          ¦   «         › �tH          j'        ¦  «        › �¦  «         t          ¦   «          t          tG          dqtH          j'        ¦  «        ¦  «         t          ¦   «          t          tG          d…tH          j+        tH          j,        ¦  «        ¦  «         t          ¦   «          t          d\tG          d†tH          j%        ¦  «        › d‡�¦  «         t          d\tG          dˆtH          j%        ¦  «        › d‰�¦  «         t          d\tG          dŠtH          j%        ¦  «        › d‹�¦  «         t          ¦   «          dS )Œz#Print the setup completion summary.zTool Availability Summaryr   ©Úget_available_vision_backends)úVision (image analysis)TN)r¸   Fzrun 'hermes setup' to configureÚOPENROUTER_API_KEY)úMixture of AgentsTN)rº   Fr¹   )z(Web Search & Extract (Nous subscription)TNúWeb Search & ExtractzWeb Search & Extract (ú)TN)r»   FzUEXA_API_KEY, PARALLEL_API_KEY, FIRECRAWL_API_KEY/FIRECRAWL_API_URL, or TAVILY_API_KEY)z%Browser Automation (Nous Browser Use)TNzBrowser AutomationzBrowser Automation (zVnpm install -g agent-browser, set CAMOFOX_URL, or configure Browser Use or BrowserbaseÚBrowserbasezOnpm install -g agent-browser and set BROWSERBASE_API_KEY/BROWSERBASE_PROJECT_IDzBrowser Usez8npm install -g agent-browser and set BROWSER_USE_API_KEYÚCamofoxÚCAMOFOX_URLzLocal browserznpm install -g agent-browserF)z$Image Generation (Nous subscription)TN)úImage GenerationTN)Úlist_providers)Ú_ensure_plugins_discoveredÚfalzImage Generation ()rÀ   FzFAL_KEY or OPENAI_API_KEYÚttsr   Úedge)z-Text-to-Speech (OpenAI via Nous subscription)TNÚ
elevenlabsÚELEVENLABS_API_KEY)zText-to-Speech (ElevenLabs)TNÚopenaiÚVOICE_TOOLS_OPENAI_KEYÚOPENAI_API_KEY)zText-to-Speech (OpenAI)TNrB   ÚMINIMAX_API_KEY)zText-to-Speech (MiniMax)TNÚmistralÚMISTRAL_API_KEY)z Text-to-Speech (Mistral Voxtral)TNr<   ÚGEMINI_API_KEYÚGOOGLE_API_KEY)zText-to-Speech (Google Gemini)TNÚneutts)zText-to-Speech (NeuTTS local)TN)u)   Text-to-Speech (NeuTTS â€” not installed)Fúrun 'hermes setup tts'Ú	kittentts)z Text-to-Speech (KittenTTS local)TN)u,   Text-to-Speech (KittenTTS â€” not installed)FrÑ   )zText-to-Speech (Edge TTS)TN)z#Modal Execution (Nous subscription)TNÚterminalÚbackendÚmodal)zModal Execution (direct Modal)TN)zModal ExecutionFzrun 'hermes setup terminal')z0Modal Execution (optional via Nous subscription)TNÚTINKER_API_KEYÚWANDB_API_KEY)úRL Training (Tinker)TN)rØ   Fr×   )rØ   FrÖ   Ú
HASS_TOKEN)zSmart Home (Home Assistant)TN)Úget_provider_auth_stateÚspotifyÚaccess_tokenÚrefresh_token)zSpotify (PKCE OAuth)TNÚGITHUB_TOKEN)úSkills Hub (GitHub)TN)rß   FrÞ   )zTerminal/CommandsTN)zTask Planning (todo)TN)zSkills (view, create, edit)TNc              3   ó&   K  — | ]\  }}}|¯d V — ŒdS )rw   N© )Ú.0Ú_Úavails      r   ú	<genexpr>z'_print_setup_summary.<locals>.<genexpr>  s-   è è € ÐDÐD¡  5¨!¸eÐD˜!ÐDÐDÐDÐDÐDÐDr   ú/z tool categories available:z   u   âœ“rŒ   u   âœ—z	(missing c                 ó"   — g | ]\  }}}|°||f‘ŒS rá   rá   )râ   r­   rä   r§   s       r   ú
<listcomp>z(_print_setup_summary.<locals>.<listcomp>   s(   € ÐSÐSÐSÑ&6 d¨E°3ÈUÐS�t˜S�kÐSÐSÐSr   zDSome tools are disabled. Run 'hermes setup tools' to configure them,©Údisplay_hermes_homezor edit z+/.env directly to add the missing API keys.õ±   â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�uA   â”‚              âœ“ Setup Complete!                          â”‚õ±   â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜u   ðŸ“� All your files are in z/:z	Settings:r‹   z	API Keys:zData:ú      z/cron/, sessions/, logs/u´   â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€u    ðŸ“� To edit your configuration:zhermes setupz           Re-run the full wizardzhermes setup modelz    Change model/providerzhermes setup terminalz Change terminal backendzhermes setup gatewayz  Configure messagingzhermes setup toolsz    Configure tool providerszhermes configz         View current settingszhermes config editz    Open config in your editorzhermes config set <key> <value>z.                          Set a specific valuez   Or edit the files directly:znano u   ðŸš€ Ready to go!Úhermesz              Start chattingzhermes gatewayz      Start messaging gatewayzhermes doctorz       Check for issues)0r^   ra   r   Úagent.auxiliary_clientr·   rl   ÚappendrX   ÚwebÚmanaged_by_nousÚ	availableÚcurrent_providerÚbrowserÚ	image_genÚagent.image_gen_registryrÁ   Úhermes_cli.pluginsrÂ   r­   Úis_availableÚdisplay_namer   rÄ   ÚutilÚ	find_specÚimportlib.utilrÕ   Údirect_overrider   Únous_auth_presentr*   rÚ   Úsumr�   rc   r[   rZ   rŽ   ÚREDr�   re   Úhermes_constantsrê   r_   r`   ry   rS   rT   )r   Úhermes_homeÚtool_statusÚsubscription_featuresr·   Ú_vision_backendsÚlabelÚbrowser_providerÚmissing_browser_hintÚ_img_backendrÁ   rÂ   Ú_pÚtts_providerÚ	importlibÚ	neutts_okÚkittentts_okrÚ   Ú_spotify_stateÚavailable_countÚtotal_countr­   ró   Úmissing_varÚdisabled_toolsÚ_dhhs                             r   Ú_print_setup_summaryr  Y  sý  € õ 
�G„G€GÝÐ,Ñ-Ô-Ð-à€KÝ:¸6ÑBÔBÐðØHÐHÐHÐHÐHÐHà8Ð8Ñ:Ô:ÐÐøÝð ð ð ØÐÐÐðøøøð ð bØ×ÒÐBÑCÔCÐCÐCà×ÒÐ`ÑaÔaÐaõ Ð)Ñ*Ô*ð OØ×ÒÐ<Ñ=Ô=Ð=Ð=à×ÒÐMÑNÔNÐNð Ô Ô0ð UØ×ÒÐSÑTÔTÐTÐTØ	Ô	"Ô	,ð UØ&ˆØ Ô$Ô5ð 	[ØZÐ-BÔ-FÔ-WÐZÐZÐZˆEØ×Ò˜E 4¨Ð.Ñ/Ô/Ð/Ð/à×Òð  Tñ  	Uô  	Uð  	Uð -Ô4ÔEÐØÔ$Ô4ð 
Ø×ÒÐPÑQÔQÐQÐQØ	Ô	&Ô	0ð 
Ø$ˆØð 	?Ø>Ð+;Ð>Ð>Ð>ˆEØ×Ò˜E 4¨Ð.Ñ/Ô/Ð/Ð/àwÐØ˜}Ò,Ð,ð=ð !Ð ð  Ò.Ð.àJð !Ð ð  Ò*Ð*Ø#0Ð Ð Ø Ò0Ð0Ø#AÐ Ø×ÒØ! 5Ð*>Ð?ñ	
ô 	
ð 	
ð Ô&Ô6ð YØ×ÒÐOÑPÔPÐPÐPØ	Ô	(Ô	2ð YØ×ÒÐ;Ñ<Ô<Ð<Ð<ð ˆð	Ø?Ð?Ð?Ð?Ð?Ð?ØEÐEÐEÐEÐEÐEà&Ð&Ñ(Ô(Ð(Ø$�nÑ&Ô&ð ð �Ø”7˜eÒ#Ð#ØðØ—’Ñ(Ô(ð Ø')¤˜Ø˜ðøõ !ð ð ð Ø�Hðøøøøøåð 	ð 	ð 	ØˆDð	øøøàð 	YØ×ÒÐ D°\Ð DÐ DÐ DÀdÈDÐQÑRÔRÐRÐRà×ÒÐWÑXÔXÐXð —:’:˜e RÑ(Ô(×,Ò,¨Z¸Ñ@Ô@€LØÔ Ô0ð "FØ×ÒÐXÑYÔYÐYÑYØ	˜Ò	%Ð	%­-Ð8LÑ*MÔ*MÐ	%Ø×ÒÐFÑGÔGÐGÑGØ	˜Ò	!Ð	!ÝÐ.Ñ/Ô/ð 
"Ý3@ÐAQÑ3RÔ3Rð 
"ð 	×ÒÐBÑCÔCÐCÑCØ	˜Ò	"Ð	"¥}Ð5FÑ'GÔ'GÐ	"Ø×ÒÐCÑDÔDÐDÑDØ	˜Ò	"Ð	"¥}Ð5FÑ'GÔ'GÐ	"Ø×ÒÐKÑLÔLÐLÑLØ	˜Ò	!Ð	!¥}Ð5EÑ'FÔ'FÐ	!Í-ÐXhÑJiÔJiÐ	!Ø×ÒÐIÑJÔJÐJÐJØ	˜Ò	!Ð	!ð	Ø!œ×0Ò0°Ñ:Ô:À$ÐFˆIˆIøÝð 	ð 	ð 	ØˆIˆIˆIð	øøøàð 	oØ×ÒÐLÑMÔMÐMÐMà×ÒÐmÑnÔnÐnÐnØ	˜Ò	$Ð	$ð	!Ø!Ð!Ð!Ð!Ø$œ>×3Ò3°KÑ@Ô@ÈÐLˆLˆLøÝð 	!ð 	!ð 	!Ø ˆLˆLˆLð	!øøøàð 	rØ×ÒÐOÑPÔPÐPÐPà×ÒÐpÑqÔqÐqÐqà×ÒÐDÑEÔEÐEàÔ"Ô2ð ]Ø×ÒÐNÑOÔOÐOÐOØ	�Š�J Ñ	#Ô	#×	'Ò	'¨	Ñ	2Ô	2°gÒ	=Ð	=Ø Ô&Ô6ð 	ZØ×ÒÐMÑNÔNÐNÐNà×ÒÐXÑYÔYÐYÐYÝ	#Ñ	%Ô	%ð ]Ð*?Ô*Qð ]Ø×ÒÐ[Ñ\Ô\Ð\õ Ð%Ñ&Ô&ð N­=¸Ñ+IÔ+Ið NØ×ÒÐ?Ñ@Ô@Ð@Ð@Ý	Ð'Ñ	(Ô	(ð NØ×ÒÐKÑLÔLÐLÐLà×ÒÐLÑMÔMÐMõ �\Ñ"Ô"ð HØ×ÒÐFÑGÔGÐGðØ;Ð;Ð;Ð;Ð;Ð;Ø0Ð0°Ñ;Ô;ÐA¸rˆØ×Ò˜nÑ-Ô-ð 	E°×1CÒ1CÀOÑ1TÔ1Tð 	EØ×ÒÐCÑDÔDÐDøøÝð ð ð Øˆðøøøõ �^Ñ$Ô$ð KØ×ÒÐ>Ñ?Ô?Ð?Ð?à×ÒÐIÑJÔJÐJð ×ÒÐ8Ñ9Ô9Ð9ð ×ÒÐ;Ñ<Ô<Ð<ð ×ÒÐBÑCÔCÐCõ ÐDÐD¨{ÐDÑDÔDÑDÔD€OÝ�kÑ"Ô"€Kå�/ÐLÐL KÐLÐLÐLÑMÔMÐMÝ	�G„G€Gà(3ð ð Ñ$ˆˆi˜Øð 	ÝÐ;�˜e¥V¤\Ñ2Ô2Ð;Ð;°TÐ;Ð;Ñ<Ô<Ð<Ð<åØg•e˜E¥6¤:Ñ.Ô.ÐgÐg°ÐgÐg½Ð>XÈ+Ð>XÐ>XÐ>XÕZ`ÔZdÑ8eÔ8eÐgÐgñô ð ð õ 
�G„G€GàSÐS¸+ÐSÑSÔS€NØð ÝØRñ	
ô 	
ð 	
ð 	AÐ@Ð@Ð@Ð@Ð@ÝÐT  ¡¤ÐTÐTÐTÑUÔUÐUÝ‰Œˆõ 
�G„G€GÝ	Ýð @õ  BHô  BNñ	
ô 	
ñô ð õ
 
ÝØOÕQWÔQ]ñ	
ô 	
ñô ð õ
 
Ýð @õ  BHô  BNñ	
ô 	
ñô ð õ
 
�G„G€Gð =Ð<Ð<Ð<Ð<Ð<Ý	�%Ð8¨d¨d©f¬fÐ8Ð8Ð8½&¼+ÅvÄ{Ñ
SÔ
SÑTÔTÐTÝ	�G„G€GÝ	Ð
H•�k¥6¤=Ñ1Ô1Ð
HÐ
Hµ_Ñ5FÔ5FÐ
HÐ
HÑIÔIÐIÝ	Ð
E•�k¥6¤=Ñ1Ô1Ð
EÐ
Eµ\±^´^Ð
EÐ
EÑFÔFÐFÝ	ØX�e�G�Vœ]Ñ+Ô+ÐXÐX°;ÐXÐXÐXñô ð õ 
�G„G€Gå	�%�
�FœJÑ
'Ô
'Ñ(Ô(Ð(Ý	�G„G€GÝ	�%Ð2µF´KÅÄÑ
MÔ
MÑNÔNÐNÝ	�G„G€GÝ	Ð
U•�n¥f¤lÑ3Ô3Ð
UÐ
UÐ
UÑVÔVÐVÝ	Ð
T•Ð*­F¬LÑ9Ô9Ð
TÐ
TÐ
TÑUÔUÐUÝ	Ð
V•Ð-­v¬|Ñ<Ô<Ð
VÐ
VÐ
VÑWÔWÐWÝ	Ð
R•Ð,­f¬lÑ;Ô;Ð
RÐ
RÐ
RÑSÔSÐSÝ	Ð
W•Ð*­F¬LÑ9Ô9Ð
WÐ
WÐ
WÑXÔXÐXÝ	�G„G€GÝ	Ð
T•�o¥v¤|Ñ4Ô4Ð
TÐ
TÐ
TÑUÔUÐUÝ	ØW�eÐ(­&¬,Ñ7Ô7ÐWÐWÐWñô ð õ 
Ð
H•Ð7½¼ÑFÔFÐ
HÐ
HÑIÔIÐIÝ	Ð
:Ñ;Ô;Ð;Ý	�G„G€GÝ	Ð
*Ñ+Ô+Ð+Ý	Ð
@•Ð1�oÑ/Ô/Ð1Ð1µ6´:Ñ>Ô>Ð
@Ð
@ÑAÔAÐAÝ	Ð
=•Ð.�l™nœnÐ.Ð.µ´
Ñ;Ô;Ð
=Ð
=Ñ>Ô>Ð>Ý	�G„G€Gå	�%�
�FœJÑ
'Ô
'Ñ(Ô(Ð(Ý	�G„G€GÝ	�%Ð#¥V¤[µ&´+Ñ
>Ô
>Ñ?Ô?Ð?Ý	�G„G€GÝ	Ð
K•�h¥¤Ñ-Ô-Ð
KÐ
KÐ
KÑLÔLÐLÝ	Ð
T•Ð&­¬Ñ5Ô5Ð
TÐ
TÐ
TÑUÔUÐUÝ	Ð
M•�o¥v¤|Ñ4Ô4Ð
MÐ
MÐ
MÑNÔNÐNÝ	�G„G€G€G€Gs~   °A ÁAÁAÈ.I3 ÉI"ÉI3 É"
I/É,I3 É.I/É/I3 É3
J É?J ÐP! Ð!P0Ð/P0Ñ( R	 Ò	RÒRØ"AY5 Ù5
ZÚZc                 ó<  — |                       di ¦  «        }t          ¦   «          t          d¦  «         |                     dd¦  «        }|rdnd}t          d¦  «         t          d¦  «         t	          d	|¦  «        }|                     ¦   «         d
v |d<   |                     dd¦  «        }t	          dt          |¦  «        ¦  «        }	 t          |¦  «        |d<   n# t          $ r Y nw xY w|                     dd¦  «        }t	          dt          |¦  «        ¦  «        }	 t          |¦  «        |d<   n# t          $ r Y nw xY w|                     dd¦  «        }	t	          dt          |	¦  «        ¦  «        }
	 t          |
¦  «        |d<   dS # t          $ r Y dS w xY w)zMPrompt for container resource settings (Docker, Singularity, Modal, Daytona).rÓ   zContainer Resource Settings:Úcontainer_persistentTrš   rœ   z5  Persistent filesystem keeps files between sessions.z;  Set to 'no' for ephemeral sandboxes that reset each time.z.  Persist filesystem across sessions? (yes/no))rš   Útruer™   Ú1Úcontainer_cpurw   z  CPU coresÚcontainer_memoryi   z  Memory in MB (5120 = 5GB)Úcontainer_diski È  z  Disk in MB (51200 = 50GB)N)
Ú
setdefaultr^   rc   r   r€   rK   r   Úfloatr’   r‘   )r   rÓ   Úcurrent_persistÚpersist_labelÚpersist_strÚcurrent_cpuÚcpu_strÚcurrent_memÚmem_strÚcurrent_diskÚdisk_strs              r   Ú_prompt_container_resourcesr)  g  sÛ  € à× Ò  ¨RÑ0Ô0€Hå	�G„G€GÝÐ-Ñ.Ô.Ð.ð —l’lÐ#9¸4Ñ@Ô@€OØ,Ð6�E�E°$€MÝÐFÑGÔGÐGÝÐLÑMÔMÐMÝØ8¸-ñô €Kð (3×'8Ò'8Ñ':Ô':Ð>WÐ'W€HÐ#Ñ$ð —,’,˜°Ñ2Ô2€KÝ�]¥C¨Ñ$4Ô$4Ñ5Ô5€GðÝ$)¨'¡N¤Nˆ�Ñ!Ð!øÝð ð ð Øˆðøøøð —,’,Ð1°4Ñ8Ô8€KÝÐ2µC¸Ñ4DÔ4DÑEÔE€GðÝ'*¨7¡|¤|ˆÐ#Ñ$Ð$øÝð ð ð Øˆðøøøð —<’<Ð 0°%Ñ8Ô8€LÝÐ3µS¸Ñ5FÔ5FÑGÔG€HðÝ%(¨¡]¤]ˆÐ!Ñ"Ð"Ð"øÝð ð ð Øˆˆðøøøs6   ÃC Ã
C+Ã*C+Ä"D5 Ä5
EÅEÅ9F Æ
FÆF©Úquickr+  c                ó  — ddl m}m} t          d¦  «         t	          d¦  «         t	          dt
          › d�¦  «         t          ¦   «          ddlm} 	  |¦   «          n‚# t          t          f$ r  t          ¦   «          t	          d¦  «         Y nRt          $ rF}t                               d	|¦  «         t          d
|› �¦  «         t	          d¦  «         Y d}~nd}~ww xY w |¦   «         }|                     d|                      d¦  «        ¦  «        | d<   d|v r|d         | d<   n|                      dd¦  «         d}|                      d¦  «        }t#          |t$          ¦  «        r|                     d¦  «        }|dk    }	|�s:t'          |¦  «        �r*	 ddlm}
 ddlm} ddlm}  ||¦  «        }|                     ¦   «         }t7          |¦  «        }t9          d„ |D ¦   «         ¦  «        }||z
  }t          ¦   «          t          d¦  «         t	          d¦  «         t	          d¦  «         t	          d¦  «         t          ¦   «          |dk    rt	          d|› d|› d|› d|› d�	¦  «         nt	          d|› d|› �¦  «         t;          dd¦  «        rp | |
|d dddddddd!ddd"¬#¦  «        ¦  «          ||¦  «        }t7          |                     ¦   «         ¦  «        }t	          d$|› d%�¦  «         t;          dd¦  «        °p|d&k    r‚g d'¢}t=          | ¦  «                             |d(¦  «        }dd&d)d*œ                     |d¦  «        }t?          d+||¦  «        }g d*¢|         }tA          | ||¦  «         tC          d,|› d-|› �¦  «         n2# t          $ r%}t                               d.|¦  «         Y d}~nd}~ww xY w|rd}nS	 dd/l"m#} tI           |¦   «         ¦  «        }n# t          $ r tI          ¦   «         }Y nw xY wtK          |¦  «         }||v rd}|�rDd0d1d2d3d4d5d6d7d8d9d:d;d<œ}|                     ||pd=¦  «        }t          ¦   «          t          d>¦  «         t	          d?|› �¦  «         t	          d@¦  «         t	          dA¦  «         t          ¦   «          g dB¢}t?          dC|d)¦  «        }|dk    rWtM          dDdE¬F¦  «         '                    ¦   «         }|r!tQ          dG|¦  «         tC          dH¦  «         �nat	          dI¦  «         �nP|d&k    �r:tM          dJ¦  «         '                    ¦   «         pdK}dL} tS          |¦  «        dMk    }!|!rdN} tM          | dE¬F¦  «         '                    ¦   «         }"|"rÉtQ          dO|"¦  «         |  *                    dPi ¦  «         *                    dQi ¦  «        }#||#dR<   |!r9g dS¢}$|$dTgz   }%t?          dU|%d¦  «        }&|&t7          |$¦  «        k     r|$|&         ndV}'n!tM          dW¦  «         '                    ¦   «         }'tQ          dX|'¦  «         tC          dY|› �|'rd|'› dZ�nd z   ¦  «         nt	          dI¦  «         nt	          d[¦  «          || ¦  «         |s|dk    rtW          | ¦  «         dS dS dS )\uã  Configure the inference provider and default model.

    Delegates to ``cmd_model()`` (the same flow used by ``hermes model``)
    for provider selection, credential prompting, and model picking.
    This ensures a single code path for all provider setup â€” any new
    provider added to ``hermes model`` is automatically available here.

    When *quick* is True, skips credential rotation, vision, and TTS
    configuration â€” used by the streamlined first-time quick setup.
    r   )rU   rV   zInference Providerz.Choose how to connect to your main chat model.ú
   Guide: z/integrations/providers)Úselect_provider_and_modelzProvider setup skipped.z0select_provider_and_model error during setup: %sz%Provider setup encountered an error: z*You can try again later with: hermes modelNr   Úcustom_providersr   Únous)ÚSimpleNamespace)Ú	load_pool)Úauth_add_commandc              3   ó|   K  — | ]7}t          t          |d d¦  «        ¦  «                             d¦  «        ¯3dV — Œ8dS )ÚsourcerJ   Úmanualrw   N)r   rh   Ú
startswith)râ   Úentrys     r   rå   z'setup_model_provider.<locals>.<genexpr>×  sK   è è € ÐpÐp U½½WÀUÈHÐVXÑ=YÔ=YÑ9ZÔ9Z×9eÒ9eÐfnÑ9oÔ9oÐp˜qÐpÐpÐpÐpÐpÐpr   z!Same-Provider Fallback & RotationzHHermes can keep multiple credentials for one provider and rotate betweenzCthem when a credential is exhausted or rate-limited. This preserveszEyour primary provider while reducing interruptions from quota issues.zCurrent pooled credentials for rv   z (z	 manual, z$ auto-detected from env/shared auth)z2Add another credential for same-provider fallback?FrJ   g      .@é,  )r   r+   r  r(   Ú
portal_urlÚinference_urlÚ	client_idÚscopeÚ
no_browserÚtimeoutÚinsecureÚ	ca_bundleÚmin_key_ttl_secondszProvider pool now has z credential(s).rw   )uU   Fill-first / sticky â€” keep using the first healthy credential until it is exhausteduJ   Round robin â€” rotate to the next healthy credential after each selectionu5   Random â€” pick a random healthy credential each timeÚ
fill_firsté   )rC  Úround_robinÚrandomz'Select same-provider rotation strategy:zSaved z rotation strategy: z7Could not configure same-provider fallback in setup: %sr¶   zNous Portal API keyzGitHub CopilotzGitHub Copilot ACPz
Z.AI / GLMzKimi / MoonshotzKimi / Moonshot (China)zStepFun Step PlanÚMiniMaxz
MiniMax CNÚ	AnthropiczVercel AI Gatewayzyour custom endpoint)znous-apir;   r.   r=   r>   r?   r@   rB   rC   Ú	anthropicrD   r$   zyour providerz"Vision & Image Analysis (optional)z+Vision uses a separate multimodal backend. z=doesn't currently provide one Hermes can auto-use for vision,z4so choose a backend now or skip and configure later.)u<   OpenRouter â€” uses Gemini (free tier at openrouter.ai/keys)uB   OpenAI-compatible endpoint â€” base URL, API key, and vision modelzSkip for nowzConfigure vision:z  OpenRouter API keyTr°   r¹   u/   OpenRouter key saved â€” vision will use Geminiu%   Skipped â€” vision won't be availablez  Base URL (blank for OpenAI)zhttps://api.openai.com/v1z	  API keyzapi.openai.comz  OpenAI API keyrÊ   Ú	auxiliaryÚvisionÚbase_url)r2   r3   r1   zgpt-4.1-minizgpt-4.1-nanozUse default (gpt-4o-mini)zSelect vision model:r3   z0  Vision model (blank = use main/custom default)ÚAUXILIARY_VISION_MODELzVision configured with r¼   uR   Skipped â€” add later with 'hermes setup' or configure AUXILIARY_VISION_* settings),Úhermes_cli.configrU   rV   ra   rc   Ú
_DOCS_BASEr^   Úhermes_cli.mainr.  Ú
SystemExitr{   rl   ÚloggerÚdebugre   r   Úpopr   r   r-   Útypesr1  Úagent.credential_poolr2  Úhermes_cli.auth_commandsr3  Úentriesr�   r   rž   r   r—   r"   rd   rï   r·   r£   rj   r€   r   rW   r	   r  Ú_setup_tts_provider)(r   r+  rU   rV   r.  ÚexcÚ
_refreshedÚselected_providerÚ_mÚnous_subscription_selectedr1  r2  r3  ÚpoolrX  Úentry_countÚmanual_countÚ
auto_countÚstrategy_labelsÚcurrent_strategyÚdefault_strategy_idxÚstrategy_idxÚstrategy_valueÚ_vision_needs_setupr·   r  Ú_prov_namesÚ_prov_displayÚ_vision_choicesÚ_vision_idxÚ_or_keyÚ	_base_urlÚ_api_key_labelÚ_is_native_openaiÚ_oai_keyÚ_vauxÚ_oai_vision_modelsÚ_vm_choicesÚ_vm_idxÚ_selected_vision_models(                                           r   Úsetup_model_providerrw  ›  s	  € ð ;Ð:Ð:Ð:Ð:Ð:Ð:Ð:åÐ%Ñ&Ô&Ð&ÝÐ?Ñ@Ô@Ð@ÝÐ?�JÐ?Ð?Ð?Ñ@Ô@Ð@Ý	�G„G€Gð :Ð9Ð9Ð9Ð9Ð9ðAØ!Ð!Ñ#Ô#Ð#Ð#øÝÕ)Ð*ð .ð .ð .Ý‰ŒˆÝÐ,Ñ-Ô-Ð-Ð-Ð-Ýð Að Að AÝ�ŠÐGÈÑMÔMÐMÝÐC¸cÐCÐCÑDÔDÐDÝÐ?Ñ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@øøøøðAøøøð �‘”€JØ —n’n W¨f¯jªj¸Ñ.AÔ.AÑBÔB€Fˆ7�OØ˜ZÐ'Ð'Ø%/Ð0BÔ%CˆÐ!Ñ"Ð"à�
Š
Ð% tÑ,Ô,Ð,ð ÐØ	�Š�GÑ	Ô	€BÝ�"•dÑÔð /ØŸFšF :Ñ.Ô.Ðà!2°fÒ!<Ðð ñ JYÕ7Ð8IÑJÔJñ JYðI	YØ-Ð-Ð-Ð-Ð-Ð-Ø7Ð7Ð7Ð7Ð7Ð7ØAÐAÐAÐAÐAÐAà�9Ð.Ñ/Ô/ˆDØ—l’l‘n”nˆGÝ˜g™,œ,ˆKÝÐpÐp¨gÐpÑpÔpÑpÔpˆLØ$ |Ñ3ˆJÝ‰GŒGˆGÝÐ<Ñ=Ô=Ð=ÝØZñô ð õ ØUñô ð õ ØWñô ð õ ‰GŒGˆGØ˜AŠ~ˆ~Ýð`Ð6Gð `ð `È;ð `ð `Ø$ð`ð `Ø/9ð`ð `ð `ñô ð ð õ
 Ð_Ð=NÐ_Ð_ÐR]Ð_Ð_Ñ`Ô`Ð`åÐ TÐV[Ñ\Ô\ð RØ Ð Ø#�OØ!2Ø"$Ø"Ø $Ø#'Ø&*Ø"&Ø"Ø#(Ø $Ø!&Ø"&Ø,2ðñ ô ñô ð ð" !�yÐ!2Ñ3Ô3�Ý! $§,¢,¡.¤.Ñ1Ô1�ÝÐP°KÐPÐPÐPÑQÔQÐQõ)  Ð TÐV[Ñ\Ô\ð Rð, ˜QŠˆð#ð #ð #�õ
 $CÀ6Ñ#JÔ#J×#NÒ#NÐO`ÐbnÑ#oÔ#oÐ à"#Ø#$Øð(ð (÷ ’#Ð&¨Ñ*Ô*ð	 %õ
  -Ø=Ø#Ø(ñ ô  �ð
 "IÐ!HÐ!HÈÔ!V�Ý-¨fÐ6GÈÑXÔXÐXÝÐ^Ð'8Ð^Ð^ÈnÐ^Ð^Ñ_Ô_Ð_øøÝð 	Yð 	Yð 	YÝ�LŠLÐRÐTWÑXÔXÐXÐXÐXÐXÐXÐXøøøøð	Yøøøð ð (Ø#ÐÐð	%ØLÐLÐLÐLÐLÐLÝ"Ð#@Ð#@Ñ#BÔ#BÑCÔCÐÐøÝð 	%ð 	%ð 	%Ý"™uœuÐÐÐð	%øøøõ #'Ð'7Ñ"8Ô"8Ð8ÐàÐ 0Ð0Ð0Ø"'Ðàñ Emà-Ø'Ø/ØØ,Ø7Ø*Ø Ø&Ø$Ø-Ø,ð
ð 
ˆð $ŸšÐ(9Ð;LÐ;_ÐP_Ñ`Ô`ˆå‰ŒˆÝÐ9Ñ:Ô:Ð:ÝÐPÀÐPÐPÑQÔQÐQÝÐRÑSÔSÐSÝÐIÑJÔJÐJÝ‰Œˆð
ð 
ð 
ˆõ
 $Ð$7¸È!ÑLÔLˆà˜!ÒÐÝÐ3¸dÐCÑCÔC×IÒIÑKÔKˆGØð DÝÐ3°WÑ=Ô=Ð=ÝÐOÑPÔPÐPÑPåÐBÑCÔCÐCÑCØ˜AÒÑÝÐ>Ñ?Ô?×EÒEÑGÔGÐfÐKfˆIØ(ˆNÝ 1°)Ñ <Ô <Ð@PÒ PÐØ ð 4Ø!3�Ý˜n°tÐ<Ñ<Ô<×BÒBÑDÔDˆHØð DÝÐ/°Ñ:Ô:Ð:à×)Ò)¨+°rÑ:Ô:×EÒEÀhÐPRÑSÔS�Ø$-��jÑ!Ø$ð 
pØ)mÐ)mÐ)mÐ&Ø"4Ð8SÐ7TÑ"T�KÝ+Ð,BÀKÐQRÑSÔS�Gð #¥SÐ);Ñ%<Ô%<Ò<Ð<ð +¨7Ô3Ð3à*ð +Ð*õ .4Ð4fÑ-gÔ-g×-mÒ-mÑ-oÔ-oÐ*ÝÐ7Ð9OÑPÔPÐPÝØ9¨iÐ9Ð9Ø9OÐWÐ5Ð2Ð5Ð5Ð5Ð5ÐUWñYñô ð ð õ
 ÐBÑCÔCÐCÐCåÐkÑlÔlÐlð €K�ÑÔÐàð $Ð&¨&Ò0Ð0Ý˜FÑ#Ô#Ð#Ð#Ð#ð$ð $Ð0Ð0sI   Á
A Á.CÂ	CÂ<CÃCÆG6N Î
N>ÎN9Î9N>ÏO% Ï%P Ï?P c                  óZ   — t          j        d¦  «        dupt          j        d¦  «        duS )z Check if espeak-ng is installed.ú	espeak-ngNÚespeak)ÚshutilÚwhichrá   r   r   Ú_check_espeak_ngr}  }  s,   € åŒ<˜Ñ$Ô$¨DÐ0ÐVµF´LÀÑ4JÔ4JÐRVÐ4VÐVr   c            	      ó  — ddl } ddl}t          ¦   «         �sCt          ¦   «          t	          d¦  «         |j        dk    rt          d¦  «         n*|j        dk    rt          d¦  «         nt          d¦  «         t          ¦   «          t          d	d
¦  «        r´	 |j        dk    r|                      g d¢d
¬¦  «         n>|j        dk    r|                      g d¢d
¬¦  «         n|                      g d¢d
¬¦  «         t          d¦  «         nO# | j
        t          f$ r,}t	          d|› �¦  «         t          d¦  «         Y d}~dS d}~ww xY wt	          d¦  «         t          ¦   «          t          d¦  «         t          d¦  «         t          ¦   «          	 |                      |j        ddddddgd
d¬¦  «         t          d¦  «         d
S # | j
        | j        f$ r,}t          d|› �¦  «         t          d ¦  «         Y d}~dS d}~ww xY w)!zHInstall NeuTTS dependencies with user approval. Returns True on success.r   Nz,NeuTTS requires espeak-ng for phonemization.Údarwinz$Install with: brew install espeak-ngÚwin32z%Install with: choco install espeak-ngz(Install with: sudo apt install espeak-ngzInstall espeak-ng now?T)ÚbrewÚinstallry  )Úcheck)Úchocor‚  ry  ú-y)ÚsudoÚaptr‚  r…  ry  zespeak-ng installedz+Could not install espeak-ng automatically: z,Please install it manually and re-run setup.FzJespeak-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.ú-mÚpipr‚  ú-Uzneutts[all]ú--quietr9  ©rƒ  r?  zneutts installed successfullyzFailed to install neutts: z2Try manually: python -m pip install -U neutts[all])Ú
subprocessri   r}  r^   re   Úplatformrc   rž   Úrunrd   ÚCalledProcessErrorÚFileNotFoundErrorÚ
executableÚTimeoutExpiredrb   )r�  ri   Úes      r   Ú_install_neutts_depsr•  ‚  s„  € àÐÐÐØ€J€J€Jõ ÑÔñ hÝ‰ŒˆÝÐDÑEÔEÐEØŒ<˜8Ò#Ð#ÝÐ=Ñ>Ô>Ð>Ð>ØŒ\˜WÒ$Ð$ÝÐ>Ñ?Ô?Ð?Ð?åÐAÑBÔBÐBÝ‰ŒˆÝÐ1°4Ñ8Ô8ð 	hðØ”< 8Ò+Ð+Ø—N’NÐ#CÐ#CÐ#CÈ4�NÑPÔPÐPÐPØ”\ WÒ,Ð,Ø—N’NÐ#JÐ#JÐ#JÐRV�NÑWÔWÐWÐWà—N’NÐ#PÐ#PÐ#PÐX\�NÑ]Ô]Ð]ÝÐ3Ñ4Ô4Ð4Ð4øØÔ1Õ3DÐEð ð ð ÝÐOÈAÐOÐOÑPÔPÐPÝÐIÑJÔJÐJØ�u�u�u�u�uøøøøðøøøõ
 ÐfÑgÔgÐgõ 
�G„G€GÝÐ4Ñ5Ô5Ð5ÝÐMÑNÔNÐNÝ	�G„G€Gð
Ø�ŠØŒ^˜T 5¨)°T¸=È)ÐTØ ð 	ñ 	
ô 	
ð 	
õ 	Ð5Ñ6Ô6Ð6ØˆtøØÔ)¨:Ô+DÐEð ð ð ÝÐ4°Ð4Ð4Ñ5Ô5Ð5ÝÐGÑHÔHÐHØˆuˆuˆuˆuˆuøøøøðøøøs1   ÂA2D ÄE	Ä!EÅE	Æ3G ÇHÇ!HÈHc            
      ób  — ddl } ddl}d}t          ¦   «          t          d¦  «         t          ¦   «          	 |                      |j        dddd|d	d
gdd¬¦  «         t          d¦  «         dS # | j        | j        f$ r0}t          d|› �¦  «         t          d|› d�¦  «         Y d}~dS d}~ww xY w)zKInstall KittenTTS dependencies with user approval. Returns True on success.r   Nz^https://github.com/KittenML/KittenTTS/releases/download/0.8.1/kittentts-0.8.1-py3-none-any.whlzOInstalling kittentts Python package (~25-80MB model downloaded on first use)...rˆ  r‰  r‚  rŠ  Ú	soundfiler‹  Tr9  rŒ  z kittentts installed successfullyzFailed to install kittentts: z(Try manually: python -m pip install -U 'z' soundfileF)
r�  ri   r^   rc   r�  r’  rd   r�  r“  rb   )r�  ri   Ú	wheel_urlr”  s       r   Ú_install_kittentts_depsr™  ´  sþ   € àÐÐÐØ€J€J€Jð	1ð õ 
�G„G€GÝÐ`ÑaÔaÐaÝ	�G„G€Gð
Ø�ŠØŒ^˜T 5¨)°T¸9ÀkÐS\Ð]Ø ð 	ñ 	
ô 	
ð 	
õ 	Ð8Ñ9Ô9Ð9ØˆtøØÔ)¨:Ô+DÐEð ð ð ÝÐ7°AÐ7Ð7Ñ8Ô8Ð8ÝÐT¸iÐTÐTÐTÑUÔUÐUØˆuˆuˆuˆuˆuøøøøðøøøs   ·4A- Á-B.Á>%B)Â)B.c           
      ó¢  — |                       di ¦  «        }|                      dd¦  «        }t          | ¦  «        }dddddd	d
dddœ	}|                      ||¦  «        }t          ¦   «          t          d¦  «         t	          d|› �¦  «         t          ¦   «          g }g }t          ¦   «         r1|j        r*|                     d¦  «         |                     d¦  «         |                     g d¢¦  «         |                     g d¢¦  «         |                     d|› d�¦  «         t          |¦  «        dz
  }t          d||¦  «        }	|	|k    rdS ||	         }
|
dk    }|
dk    r>d}
t	          d¦  «         t          d¦  «        st          d¦  «        rt          d¦  «         |
dk    rÐ	 |j                             d¦  «        du}n# t          $ r d}Y nw xY w|rt!          d¦  «         �nt          ¦   «          t	          d ¦  «         t	          d!¦  «         t	          d"¦  «         t          ¦   «          t#          d#d$¦  «        r!t%          ¦   «         st          d%¦  «         d}
�n¡t	          d&¦  «         d}
�nŽ|
d'k    rft          d(¦  «        }|sSt          ¦   «          t'          d)d$¬*¦  «        }|r!t)          d(|¦  «         t!          d+¦  «         �n5t          d,¦  «         d}
�n"|
dk    rw|sut          d¦  «        pt          d¦  «        }|sSt          ¦   «          t'          d-d$¬*¦  «        }|r!t)          d|¦  «         t!          d.¦  «         �n¸t          d,¦  «         d}
�n¥|
d/k    rxt          d0¦  «        }|set          ¦   «          t'          d1d$¬*¦  «        }|r!t)          d0|¦  «         t!          d2¦  «         �nLd3d4lm} t          d5 |¦   «         › d6�¦  «         d}
�n'|
d7k    rft          d8¦  «        }|sSt          ¦   «          t'          d9d$¬*¦  «        }|r!t)          d8|¦  «         t!          d:¦  «         �nÎt          d,¦  «         d}
�n»|
d;k    rft          d<¦  «        }|sSt          ¦   «          t'          d=d$¬*¦  «        }|r!t)          d<|¦  «         t!          d>¦  «         �nbt          d,¦  «         d}
�nO|
d?k    r‚t          d@¦  «        pt          dA¦  «        }|sat          ¦   «          t	          dB¦  «         t'          dCd$¬*¦  «        }|r t)          d@|¦  «         t!          dD¦  «         nÙt          d,¦  «         d}
nÇ|
dEk    rÁ	 d3dl}|j                             dE¦  «        du}n# t          $ r d}Y nw xY w|rt!          dF¦  «         n{t          ¦   «          t	          dG¦  «         t	          dH¦  «         t          ¦   «          t#          dId$¦  «        r t1          ¦   «         st          dJ¦  «         d}
nt	          dK¦  «         d}
d| vri | d<   |
| d         d<   t3          | ¦  «         t!          dL|                      |
|
¦  «        › �¦  «         dS )Mz@Interactive TTS provider selection with install flow for NeuTTS.rÄ   r   rÅ   zEdge TTSÚ
ElevenLabsz
OpenAI TTSzxAI TTSzMiniMax TTSzMistral Voxtral TTSzGoogle Gemini TTSÚNeuTTSÚ	KittenTTS)	rÅ   rÆ   rÈ   ÚxairB   rÌ   r<   rÐ   rÒ   z"Text-to-Speech Provider (optional)z	Current: zCNous Subscription (managed OpenAI TTS, billed to your subscription)znous-openai)	z-Edge TTS (free, cloud-based, no setup needed)z+ElevenLabs (premium quality, needs API key)z(OpenAI TTS (good quality, needs API key)z$xAI TTS (Grok voices, needs API key)z<MiniMax TTS (high quality with voice cloning, needs API key)z>Mistral Voxtral TTS (multilingual, native Opus, needs API key)zJGoogle Gemini TTS (30 prebuilt voices, prompt-controllable, needs API key)z5NeuTTS (local on-device, free, ~300MB model download)z<KittenTTS (local on-device, free, lightweight ~25-80MB ONNX)úKeep current (r¼   rw   zSelect TTS provider:NrÈ   zKOpenAI TTS will use the managed Nous gateway and bill to your subscription.rÉ   rÊ   ziDirect OpenAI credentials are still configured and may take precedence until removed from ~/.hermes/.env.rÐ   FzNeuTTS is already installedzNeuTTS requires:uH     â€¢ Python package: neutts (~50MB install + ~300MB model on first use)u,     â€¢ System package: espeak-ng (phonemizer)z Install NeuTTS dependencies now?Tz9NeuTTS installation incomplete. Falling back to Edge TTS.zISkipping install. Set tts.provider to 'neutts' after installing manually.rÆ   rÇ   zElevenLabs API keyr°   zElevenLabs API key savedz.No API key provided. Falling back to Edge TTS.zOpenAI API key for TTSzOpenAI TTS API key savedrž  ÚXAI_API_KEYzxAI API key for TTSzxAI TTS API key savedr   ré   zQNo 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.rB   rË   zMiniMax API key for TTSzMiniMax TTS API key savedrÌ   rÍ   zMistral API key for TTSzMistral TTS API key savedr<   rÎ   rÏ   z<Get a free API key at https://aistudio.google.com/app/apikeyzGemini API key for TTSzGemini TTS API key savedrÒ   zKittenTTS is already installedzCKittenTTS is lightweight (~25-80MB, CPU-only, no API key required).z:Voices: Jasper, Bella, Luna, Bruno, Rosie, Hugo, Kiki, LeozInstall KittenTTS now?z<KittenTTS installation incomplete. Falling back to Edge TTS.zLSkipping install. Set tts.provider to 'kittentts' after installing manually.zTTS provider set to: )r   r   r^   ra   rc   r   rÿ   rð   Úextendr�   r—   rX   re   rû   rü   rl   rd   rž   r•  r€   rW   r  rê   rý   r™  rV   )r   Ú
tts_configrô   r  Úprovider_labelsÚcurrent_labelr�   Ú	providersÚkeep_current_idxr“   r†   Úselected_via_nousr  Úalready_installedÚexistingr(   r  s                    r   rY  rY  Í  sž  € à—’˜E 2Ñ&Ô&€JØ!—~’~ j°&Ñ9Ô9ÐÝ:¸6ÑBÔBÐð Ø"ØØØ Ø(Ø%ØØ ð
ð 
€Oð $×'Ò'Ð(8Ð:JÑKÔK€Må	�G„G€GÝÐ5Ñ6Ô6Ð6ÝÐ*˜=Ð*Ð*Ñ+Ô+Ð+Ý	�G„G€Gà€GØ€IÝ!Ñ#Ô#ð (Ð(=Ô(Oð (Ø�ŠÐ\Ñ]Ô]Ð]Ø×Ò˜Ñ'Ô'Ð'Ø‡N‚Nð
	
ð 
	
ð 
	
ñô ð ð ×ÒÐsÐsÐsÑtÔtÐtØ‡N‚NÐ4 MÐ4Ð4Ð4Ñ5Ô5Ð5Ý˜7‘|”| aÑ'ÐÝ
Ð.°Ð9IÑ
JÔ
J€Cà
ÐÒÐØˆà˜Œ~€HØ  MÒ1ÐØ�=Ò Ð ØˆÝÐ`ÑaÔaÐaÝÐ1Ñ2Ô2ð 	µmÐDTÑ6UÔ6Uð 	ÝØ{ñô ð ð �8ÒÐð	&Ø )¤× 8Ò 8¸Ñ BÔ BÈ$Ð NÐÐøÝð 	&ð 	&ð 	&Ø %ÐÐÐð	&øøøð ð 	"ÝÐ7Ñ8Ô8Ð8Ñ8å‰GŒGˆGÝÐ)Ñ*Ô*Ð*ÝÐaÑbÔbÐbÝÐEÑFÔFÐFÝ‰GŒGˆGÝÐ?ÀÑFÔFð "Ý+Ñ-Ô-ð &Ý!Ð"]Ñ^Ô^Ð^Ø%�HùåÐfÑgÔgÐgØ!�‘à	�\Ò	!Ð	!Ý Ð!5Ñ6Ô6ˆØð 	"Ý‰GŒGˆGÝÐ1¸DÐAÑAÔAˆGØð "ÝÐ3°WÑ=Ô=Ð=ÝÐ8Ñ9Ô9Ð9Ñ9åÐNÑOÔOÐOØ!�ùà	�XÒ	Ð	Ð&7Ð	Ý Ð!9Ñ:Ô:Ð]½mÐL\Ñ>]Ô>]ˆØð 	"Ý‰GŒGˆGÝÐ5ÀÐEÑEÔEˆGØð "ÝÐ7¸ÑAÔAÐAÝÐ8Ñ9Ô9Ð9Ñ9åÐNÑOÔOÐOØ!�ùà	�UÒ	Ð	Ý  Ñ/Ô/ˆØð 	"Ý‰GŒGˆGÝÐ2¸TÐBÑBÔBˆGØð 
"Ý˜}¨gÑ6Ô6Ð6ÝÐ5Ñ6Ô6Ð6Ñ6àHÐHÐHÐHÐHÐHÝð0Ø-1¨T©V¬Vð0ð 0ð 0ñô ð ð
 "�ùà	�YÒ	Ð	Ý Ð!2Ñ3Ô3ˆØð 	"Ý‰GŒGˆGÝÐ6ÀÐFÑFÔFˆGØð "ÝÐ0°'Ñ:Ô:Ð:ÝÐ9Ñ:Ô:Ð:Ñ:åÐNÑOÔOÐOØ!�ùà	�YÒ	Ð	Ý Ð!2Ñ3Ô3ˆØð 	"Ý‰GŒGˆGÝÐ6ÀÐFÑFÔFˆGØð "ÝÐ0°'Ñ:Ô:Ð:ÝÐ9Ñ:Ô:Ð:Ñ:åÐNÑOÔOÐOØ!�ùà	�XÒ	Ð	Ý Ð!1Ñ2Ô2ÐUµmÐDTÑ6UÔ6UˆØð 		"Ý‰GŒGˆGÝÐUÑVÔVÐVÝÐ5ÀÐEÑEÔEˆGØð "ÝÐ/°Ñ9Ô9Ð9ÝÐ8Ñ9Ô9Ð9Ð9åÐNÑOÔOÐOØ!�øà	�[Ò	 Ð	 ð	&Ø!Ð!Ð!Ð!Ø )¤× 8Ò 8¸Ñ EÔ EÈTÐ QÐÐøÝð 	&ð 	&ð 	&Ø %ÐÐÐð	&øøøð ð 	"ÝÐ:Ñ;Ô;Ð;Ð;å‰GŒGˆGÝÐ\Ñ]Ô]Ð]ÝÐSÑTÔTÐTÝ‰GŒGˆGÝÐ5°tÑ<Ô<ð "Ý.Ñ0Ô0ð &Ý!Ð"`ÑaÔaÐaØ%�HøåÐiÑjÔjÐjØ!�ð �FÐÐØˆˆu‰Ø (€Fˆ5„M�*ÑÝ�ÑÔÐÝÐS¨/×*=Ò*=¸hÈÑ*QÔ*QÐSÐSÑTÔTÐTÐTÐTs$   Æ)G ÇGÇGÕ U' Õ'U6Õ5U6c                 ó$   — t          | ¦  «         dS )z.Standalone TTS setup (for 'hermes setup tts').N)rY  ©r   s    r   Ú	setup_ttsr¬  �  s   € å˜ÑÔÐÐÐr   c           	      óF  — ddl }t          d¦  «         t          d¦  «         t          d¦  «         t          dt          › d�¦  «         t	          ¦   «          |                      di ¦  «                             d	d
¦  «        }|                     ¦   «         dk    }g d¢}d
dddddœ}ddddddœ}d}|r$|                     d¦  «         d||<   ||d<   |dz  }|}|                     d|› d�¦  «         |||<   t          d||¦  «        }	|                     |	¦  «        }
|	|k    rt          d|› �¦  «         dS |
|  	                    di ¦  «        d	<   |
d
k    �r4t          d¦  «         t          d¦  «         t	          ¦   «          t          d ¦  «         t          d!¦  «         t          d"¦  «         |                      di ¦  «                             d#d$¦  «        }t          d%|pt          t          j        ¦   «         ¦  «        ¦  «        }|r|| d         d#<   t	          ¦   «          t          d&¦  «        }|rt          d'¦  «         �	nlt!          d(d)¦  «        r2t          d*d+¬,¦  «        }|rt#          d&|¦  «         t          d-¦  «         �	n(|
dk    r¼t          d.¦  «         t%          j        d¦  «        }|st)          d/¦  «         t          d0¦  «         nt          d1|› �¦  «         |                      di ¦  «                             d2d3¦  «        }t          d4|¦  «        }|| d         d2<   t#          d5|¦  «         t+          | ¦  «         �nf|
dk    rÐt          d6¦  «         t%          j        d7¦  «        pt%          j        d¦  «        }|st)          d8¦  «         t          d9¦  «         nt          d:|› �¦  «         |                      di ¦  «                             d;d<¦  «        }t          d=|¦  «        }|| d         d;<   t#          d>|¦  «         t+          | ¦  «         �n�|
dk    �rýt          d?¦  «         t          d@¦  «         ddAlm} ddBlm} t5          t7          ¦   «         ot9          | ¦  «        j        o
 |d¦  «        ¦  «        } ||                      di ¦  «                             dC¦  «        ¦  «        }d)}|r@dDdEg}|dFk    rd}n|dGk    rd}nt          dH¦  «        rdnd}t          dI||¦  «        }|dk    }|rIdF| d         dC<   t          dJ¦  «         t          dH¦  «        st          dK¦  «        rt          dL¦  «         �nÇdG| d         dC<   t          dM¦  «         	 t=          d¦  «         n³# t>          $ r¦ t          dN¦  «         ddl }t%          j        dO¦  «        }|r)| !                    |dPdQdRtD          j#        dgd+d+¬S¦  «        }n'| !                    tD          j#        dTdPdQdgd+d+¬S¦  «        }|j$        dk    rt          dU¦  «         nt)          dV¦  «         Y nw xY wt	          ¦   «          t          dW¦  «         t          dX¦  «         t          dH¦  «        }|rft          dY¦  «         t!          dZd)¦  «        rFt          d[d+¬,¦  «        }t          d\d+¬,¦  «        } |rt#          dH|¦  «         | rt#          dK| ¦  «         nFt          d[d+¬,¦  «        }t          d\d+¬,¦  «        } |rt#          dH|¦  «         | rt#          dK| ¦  «         t+          | ¦  «         �nŒ|
dk    �rQt          d]¦  «         t          d^¦  «         t          d_¦  «         t          d`¦  «         	 t=          d¦  «         nû# t>          $ rî t          da¦  «         ddl }t%          j        dO¦  «        }|r)| !                    |dPdQdRtD          j#        dgd+d+¬S¦  «        }n'| !                    tD          j#        dTdPdQdgd+d+¬S¦  «        }|j$        dk    rt          db¦  «         nWt)          dc¦  «         |j%        rAt          dd|j%         &                    ¦   «          '                    ¦   «         de         › �¦  «         Y nw xY wt	          ¦   «          t          df¦  «        }!|!rRt          dg¦  «         t!          dhd)¦  «        r2t          did+¬,¦  «        }"|"rt#          df|"¦  «         t          dj¦  «         n2t          did+¬,¦  «        }"|"rt#          df|"¦  «         t          dk¦  «         |                      di ¦  «                             dld3¦  «        }t          dm|¦  «        }|| d         dl<   t#          dn|¦  «         t+          | ¦  «         �n4|
dk    �r-t          do¦  «         t          dp¦  «         t          dq¦  «        pd$}#t          dr|#¦  «        }$|$rt#          dq|$¦  «         t          ds¦  «        pd$}%t          dt|%ptQ          j)        dud$¦  «        ¦  «        }&|&rt#          ds|&¦  «         t          dv¦  «        pdw}'t          dx|'¦  «        }(|(r|(dwk    rt#          dv|(¦  «         t          dy¦  «        pd$})t          t          j        ¦   «         dzz  d{z  ¦  «        }*t          d||)p|*¦  «        }+|+rt#          dy|+¦  «         |$rþt!          d}d+¦  «        rît          d~¦  «         ddl }g d¢},|+r|, *                    d€|+g¦  «         |(r|(dwk    r|, *                    d�|(g¦  «         |,                     |&r|&› d‚|$› �n|$¦  «         |,                     dƒ¦  «         | !                    |,d+d+d„¬…¦  «        }|j$        dk    rt          d†¦  «         n8t)          d‡|j%         &                    ¦   «         › �¦  «         t          dˆ¦  «         t#          d‰|
¦  «         |
dk    r*t#          dŠ| d                              dCd‹¦  «        ¦  «         tW          | ¦  «         t	          ¦   «          t          dŒ|
› �¦  «         dS )�z)Configure the terminal execution backend.r   NúTerminal Backendz1Choose where Hermes runs shell commands and code.z8This affects tool execution, file access, and isolation.r-  z/developer-guide/environmentsrÓ   rÔ   ÚlocalÚLinux)z.Local - run directly on this machine (default)z7Docker - isolated container with configurable resourcesz Modal - serverless cloud sandboxzSSH - run on a remote machinez2Daytona - persistent cloud development environmentÚdockerrÕ   ÚsshÚdaytona)r   rw   rD  r«   é   rw   rD  r«   r´  )r¯  r±  rÕ   r²  r³  é   z.Singularity/Apptainer - HPC-friendly containerÚsingularityrŸ  r¼   zSelect terminal backend:zKeeping current backend: zTerminal backend: Localz&Commands run directly on this machine.z)Working directory for messaging sessions:z7  When using Hermes via Telegram/Discord, this is wherezD  the agent starts. CLI mode always starts in the current directory.ÚcwdrJ   z  Messaging working directoryÚSUDO_PASSWORDzSudo password: configuredz<Enable sudo support? (stores password for apt install, etc.)Fz  Sudo passwordTr°   zSudo password savedzTerminal backend: DockerzDocker not found in PATH!z3Install Docker: https://docs.docker.com/get-docker/zDocker found: Údocker_imagez*nikolaik/python-nodejs:python3.11-nodejs20z  Docker imageÚTERMINAL_DOCKER_IMAGEz'Terminal backend: Singularity/ApptainerÚ	apptainerz(Singularity/Apptainer not found in PATH!z@Install: https://apptainer.org/docs/admin/main/installation.htmlzFound: Úsingularity_imagez3docker://nikolaik/python-nodejs:python3.11-nodejs20z  Container imageÚTERMINAL_SINGULARITY_IMAGEzTerminal backend: Modalz@Serverless cloud sandboxes. Each session gets its own container.)Úis_managed_tool_gateway_ready)Únormalize_modal_modeÚ
modal_modezUse my Nous subscriptionzUse my own Modal accountÚmanagedÚdirectÚMODAL_TOKEN_IDz,Select how Modal execution should be billed:zPModal execution will use the managed Nous gateway and bill to your subscription.ÚMODAL_TOKEN_SECRETzZDirect Modal credentials are still configured, but this backend is pinned to managed mode.z+Requires a Modal account: https://modal.comzInstalling modal SDK...Úuvr‰  r‚  ú--python©Úcapture_outputÚtextrˆ  zmodal SDK installedu2   Install failed â€” run manually: pip install modalzModal authentication:z/  Get your token at: https://modal.com/settingsz!  Modal token: already configuredz  Update Modal credentials?z    Modal Token IDz    Modal Token SecretzTerminal backend: Daytonaz*Persistent cloud development environments.zBEach session gets a dedicated sandbox with filesystem persistence.zSign up at: https://daytona.iozInstalling daytona SDK...zdaytona SDK installedu4   Install failed â€” run manually: pip install daytonaú	  Error: r…   ÚDAYTONA_API_KEYz%  Daytona API key: already configuredz  Update API key?z    Daytona API keyz    Updatedz    ConfiguredÚdaytona_imagez  Sandbox imageÚTERMINAL_DAYTONA_IMAGEzTerminal backend: SSHz)Run commands on a remote machine via SSH.ÚTERMINAL_SSH_HOSTz  SSH host (hostname or IP)ÚTERMINAL_SSH_USERz
  SSH userÚUSERÚTERMINAL_SSH_PORTÚ22z
  SSH portÚTERMINAL_SSH_KEYz.sshÚid_rsaz  SSH private key pathz  Test SSH connection?z  Testing connection...)r²  ú-ozBatchMode=yesrÕ  zConnectTimeout=5z-iz-pú@zecho oké
   )rÈ  rÉ  r?  z  SSH connection successful!z  SSH connection failed: z'  Check your SSH key and host settings.ÚTERMINAL_ENVÚTERMINAL_MODAL_MODEÚautozTerminal backend set to: ),rŽ  ra   rc   rO  r^   r   Úsystemrð   r—   r  rd   r€   r   r   ÚhomerX   rž   rW   r{  r|  re   r)  Útools.managed_tool_gatewayr¾  Útools.tool_backend_helpersr¿  rj   r   r   rÿ   Ú
__import__ÚImportErrorr�  r�  ri   r’  Ú
returncodeÚstderrr   Ú
splitlinesÚosÚgetenvr¡  rV   )-r   Ú	_platformÚcurrent_backendÚis_linuxÚterminal_choicesÚidx_to_backendÚbackend_to_idxÚnext_idxr¦  Úterminal_idxÚselected_backendÚcurrent_cwdr·  Úexisting_sudoÚ	sudo_passÚ
docker_binÚcurrent_imageÚimageÚsing_binr¾  r¿  Úmanaged_modal_availablerÀ  Úuse_managed_modalÚmodal_choicesÚdefault_modal_idxÚmodal_mode_idxr�  Úuv_binÚresultÚexisting_tokenÚtoken_idÚtoken_secretÚexisting_keyr(   Úcurrent_hostÚhostÚcurrent_userÚuserÚcurrent_portÚportÚcurrent_keyÚdefault_keyÚssh_keyÚssh_cmds-                                                r   Úsetup_terminal_backendr  —  sg  € à Ð Ð Ð ÝÐ#Ñ$Ô$Ð$ÝÐBÑCÔCÐCÝÐIÑJÔJÐJÝÐE�JÐEÐEÐEÑFÔFÐFÝ	�G„G€Gà—j’j ¨RÑ0Ô0×4Ò4°YÀÑHÔH€OØ×ÒÑ!Ô! WÒ,€Hðð ð Ðð ! X°'¸eÈ	ÐRÐR€NØ ¨A¸À!ÐPQÐRÐR€Nà€HØð Ø×ÒÐ PÑQÔQÐQØ#0ˆ�xÑ Ø(0ˆ�}Ñ%Ø�A‰ˆð  ÐØ×ÒÐ?¨_Ð?Ð?Ð?Ñ@Ô@Ð@Ø'6€NÐ#Ñ$å Ø"Ð$4Ð6Fñô €Lð &×)Ò)¨,Ñ7Ô7ÐàÐ'Ò'Ð'ÝÐ@¨Ð@Ð@ÑAÔAÐAØˆà3C€F×Ò�j "Ñ%Ô% iÑ0à˜7Ò"Ñ"ÝÐ/Ñ0Ô0Ð0ÝÐ;Ñ<Ô<Ð<õ 	‰ŒˆÝÐ>Ñ?Ô?Ð?ÝÐLÑMÔMÐMÝØRñ	
ô 	
ð 	
ð —j’j ¨RÑ0Ô0×4Ò4°U¸BÑ?Ô?ˆÝÐ4°kÐ6UÅSÍÌÉÌÑEUÔEUÑVÔVˆØð 	,Ø(+ˆF�:Ô˜uÑ%õ 	‰ŒˆÝ% oÑ6Ô6ˆØð 		9ÝÐ2Ñ3Ô3Ð3Ñ3åØNÐPUñô ð 9õ #Ð#4¸tÐDÑDÔD�	Øð 9Ý" ?°IÑ>Ô>Ð>Ý!Ð"7Ñ8Ô8Ð8ùà	˜XÒ	%Ð	%ÝÐ0Ñ1Ô1Ð1õ ”\ (Ñ+Ô+ˆ
Øð 	6ÝÐ5Ñ6Ô6Ð6ÝÐLÑMÔMÐMÐMåÐ4¨
Ð4Ð4Ñ5Ô5Ð5ð Ÿ
š
 :¨rÑ2Ô2×6Ò6ØÐHñ
ô 
ˆõ Ð'¨Ñ7Ô7ˆØ-2ˆˆzÔ˜>Ñ*ÝÐ.°Ñ6Ô6Ð6å# FÑ+Ô+Ð+Ñ+à	˜]Ò	*Ð	*ÝÐ?Ñ@Ô@Ð@õ ”< Ñ,Ô,ÐKµ´¸]Ñ0KÔ0KˆØð 	-ÝÐDÑEÔEÐEÝØRñô ð ð õ Ð+ Ð+Ð+Ñ,Ô,Ð,àŸ
š
 :¨rÑ2Ô2×6Ò6ØÐ!Vñ
ô 
ˆõ Ð*¨MÑ:Ô:ˆØ27ˆˆzÔÐ.Ñ/ÝÐ3°UÑ;Ô;Ð;å# FÑ+Ô+Ð+Ñ+à	˜WÒ	$Ñ	$ÝÐ/Ñ0Ô0Ð0ÝÐUÑVÔVÐVØLÐLÐLÐLÐLÐLØCÐCÐCÐCÐCÐCå"&Ý&Ñ(Ô(ð 7å*¨6Ñ2Ô2ÔDð7ð .Ð-¨gÑ6Ô6ñ	#
ô #
Ðð *Ð)¨&¯*ª*°ZÀÑ*DÔ*D×*HÒ*HÈÑ*VÔ*VÑWÔWˆ
Ø!ÐØ"ð 	4à*Ø*ðˆMð ˜YÒ&Ð&Ø$%Ð!Ð!Ø˜xÒ'Ð'Ø$%Ð!Ð!å)6Ð7GÑ)HÔ)HÐ$O A AÈaÐ!Ý*Ø>ØØ!ñô ˆNð
 !/°!Ò 3Ðàð ?	GØ/8ˆF�:Ô˜|Ñ,ÝÐiÑjÔjÐjÝÐ-Ñ.Ô.ð µ-Ð@TÑ2UÔ2Uð ÝØpñô ð ùð 08ˆF�:Ô˜|Ñ,ÝÐDÑEÔEÐEðXÝ˜7Ñ#Ô#Ð#Ð#øÝð Xð Xð XÝÐ4Ñ5Ô5Ð5Ø!Ð!Ð!Ð!åœ dÑ+Ô+�Øð Ø'Ÿ^š^à"Ø!Ø%Ø&ÝœNØ#ðð (,Ø!ð ,ñ ô �F�Fð (Ÿ^š^Ýœ¨¨u°iÀÐIØ'+Ø!ð ,ñ ô �Fð
 Ô$¨Ò)Ð)Ý!Ð"7Ñ8Ô8Ð8Ð8å!Ð"VÑWÔWÐWøøð7Xøøøõ< ‰GŒGˆGÝÐ.Ñ/Ô/Ð/ÝÐHÑIÔIÐIÝ*Ð+;Ñ<Ô<ˆNØð GÝÐ>Ñ?Ô?Ð?Ý Ð!>ÀÑFÔFð KÝ%Ð&:ÀTÐJÑJÔJ�HÝ#)Ð*BÈTÐ#RÑ#RÔ#R�LØð CÝ&Ð'7¸ÑBÔBÐBØ#ð KÝ&Ð';¸\ÑJÔJÐJøå!Ð"6ÀÐFÑFÔF�Ý%Ð&>ÈÐNÑNÔN�Øð ?Ý"Ð#3°XÑ>Ô>Ð>Øð GÝ"Ð#7¸ÑFÔFÐFå# FÑ+Ô+Ð+Ñ+à	˜YÒ	&Ñ	&ÝÐ1Ñ2Ô2Ð2ÝÐ?Ñ@Ô@Ð@ÝÐWÑXÔXÐXÝÐ3Ñ4Ô4Ð4ð	UÝ�yÑ!Ô!Ð!Ð!øÝð 	Uð 	Uð 	UÝÐ2Ñ3Ô3Ð3ØÐÐÐå”\ $Ñ'Ô'ˆFØð Ø#ŸšØ˜U I¨z½3¼>È9ÐUØ#'Øð (ñ ô ��ð $ŸšÝ”^ T¨5°)¸YÐGØ#'Øð (ñ ô �ð
 Ô  AÒ%Ð%ÝÐ5Ñ6Ô6Ð6Ð6åÐTÑUÔUÐUØ”=ð UÝÐS¨6¬=×+>Ò+>Ñ+@Ô+@×+KÒ+KÑ+MÔ+MÈbÔ+QÐSÐSÑTÔTÐTøøð-	Uøøøõ2 	‰ŒˆÝ$Ð%6Ñ7Ô7ˆØð 	0ÝÐ>Ñ?Ô?Ð?ÝÐ0°%Ñ8Ô8ð 1Ý Ð!6ÀÐFÑFÔF�Øð 1Ý"Ð#4°gÑ>Ô>Ð>Ý! -Ñ0Ô0Ð0øåÐ2¸TÐBÑBÔBˆGØð 0ÝÐ0°'Ñ:Ô:Ð:ÝÐ.Ñ/Ô/Ð/ð Ÿ
š
 :¨rÑ2Ô2×6Ò6ØÐIñ
ô 
ˆõ Ð(¨-Ñ8Ô8ˆØ.3ˆˆzÔ˜?Ñ+ÝÐ/°Ñ7Ô7Ð7å# FÑ+Ô+Ð+Ñ+à	˜UÒ	"Ñ	"ÝÐ-Ñ.Ô.Ð.ÝÐ>Ñ?Ô?Ð?õ %Ð%8Ñ9Ô9Ð?¸RˆÝÐ3°\ÑBÔBˆØð 	6ÝÐ.°Ñ5Ô5Ð5õ %Ð%8Ñ9Ô9Ð?¸RˆÝ�l LÐ$IµB´I¸fÀbÑ4IÔ4IÑJÔJˆØð 	6ÝÐ.°Ñ5Ô5Ð5õ %Ð%8Ñ9Ô9ÐA¸TˆÝ�l LÑ1Ô1ˆØð 	6�D˜D’L�LÝÐ.°Ñ5Ô5Ð5õ $Ð$6Ñ7Ô7Ð=¸2ˆÝ�$œ)™+œ+¨Ñ.°Ñ9Ñ:Ô:ˆÝÐ1°;Ð3MÀ+ÑNÔNˆØð 	8ÝÐ-¨wÑ7Ô7Ð7ð ð 	F•MÐ":¸DÑAÔAð 	FÝÐ0Ñ1Ô1Ð1ØÐÐÐàNÐNÐNˆGØð 0Ø—’  g˜Ñ/Ô/Ð/Øð -˜ š˜Ø—’  d˜|Ñ,Ô,Ð,Ø�NŠN¨tÐ=˜dÐ+Ð+ TÐ+Ð+Ð+¸Ñ>Ô>Ð>Ø�NŠN˜9Ñ%Ô%Ð%Ø—^’^ G¸DÀtÐUW�^ÑXÔXˆFØÔ  AÒ%Ð%ÝÐ<Ñ=Ô=Ð=Ð=åÐQ¸&¼-×:MÒ:MÑ:OÔ:OÐQÐQÑRÔRÐRÝÐDÑEÔEÐEõ �>Ð#3Ñ4Ô4Ð4Ø˜7Ò"Ð"ÝÐ,¨f°ZÔ.@×.DÒ.DÀ\ÐSYÑ.ZÔ.ZÑ[Ô[Ð[Ý�ÑÔÐÝ	�G„G€GÝÐ@Ð.>Ð@Ð@ÑAÔAÐAÐAÐAs&   Õ)U9 Õ9B-X)Ø(X)Ý*]: Ý:C5a2á1a2c                 óþ  — d|                       di ¦  «        d<   t          dd¦  «         d|                       di ¦  «        d<   d	|                       d
i ¦  «        d<   d| d
         d<   |                       di ¦  «                             ddddœ¦  «         t          | ¦  «         t	          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         dS )zDApply recommended defaults for all agent settings without prompting.éZ   rH   Ú	max_turnsÚHERMES_MAX_ITERATIONSÚ90Úallr~   Útool_progressTÚcompressionÚenabledç      à?Ú	thresholdÚsession_resetÚbothé   r´  )ÚmodeÚidle_minutesÚat_hourzApplied recommended defaults:z  Max iterations: 90z  Tool progress: allz  Compression threshold: 0.50z5  Session reset: inactivity (1440 min) + daily (4:00)z.  Run `hermes setup agent` later to customize.N)r  rW   ÚupdaterV   rd   rc   r«  s    r   Ú_apply_default_agent_settingsr  ì  s  € à24€F×Ò�g˜rÑ"Ô" ;Ñ/ÝÐ*¨DÑ1Ô1Ð1à8=€F×Ò�i Ñ$Ô$ _Ñ5à6:€F×Ò�m RÑ(Ô(¨Ñ3Ø)-€Fˆ=Ô˜+Ñ&à
×Ò�o rÑ*Ô*×1Ò1ØØØð3ð 3ñ ô ð õ �ÑÔÐÝÐ1Ñ2Ô2Ð2ÝÐ%Ñ&Ô&Ð&ÝÐ%Ñ&Ô&Ð&ÝÐ.Ñ/Ô/Ð/ÝÐFÑGÔGÐGÝÐ?Ñ@Ô@Ð@Ð@Ð@r   c           	      ó  — t          d¦  «         t          dt          › d�¦  «         t          ¦   «          t	          d¦  «        p6t          |                      di ¦  «                             dd¦  «        ¦  «        }t          d¦  «         t          d	¦  «         t          d
|› d�¦  «         t          d|¦  «        }	 t          |¦  «        }|dk    r^t          dt          |¦  «        ¦  «         ||  
                    di ¦  «        d<   |                      dd¦  «         t          d|› �¦  «         n# t          $ r t          d¦  «         Y nw xY wt          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         |                      di ¦  «                             dd¦  «        }t          d|¦  «        }|                     ¦   «         dv rZd| vri | d<   |                     ¦   «         | d         d<   t!          | ¦  «         t          d|                     ¦   «         › �¦  «         nt          d|› d|› d �¦  «         t          d!¦  «         t          d"¦  «         t          d#¦  «         d$|  
                    d%i ¦  «        d&<   |                      d%i ¦  «                             d'd(¦  «        }t          d)t          |¦  «        ¦  «        }	 t#          |¦  «        }d(|cxk    rd*k    rn n|| d%         d'<   n# t          $ r Y nw xY wt          d+| d%                              d'd(¦  «        › �¦  «         t          d,¦  «         t          d-¦  «         t          d.¦  «         t          d¦  «         t          d/¦  «         t          d0¦  «         t          d1¦  «         t          d¦  «         t          d2¦  «         t          d¦  «         g d3¢}	|                      d4i ¦  «        }
|
                     d5d6¦  «        }|
                     d7d8¦  «        }|
                     d9d:¦  «        }dd;d<d=d>œ                     |d¦  «        }t%          d?|	|¦  «        }|  
                    d4i ¦  «         |dk    rÿd6| d4         d5<   t          d@t          |¦  «        ¦  «        }	 t          |¦  «        }|dk    r|| d4         d7<   n# t          $ r Y nw xY wt          dAt          |¦  «        ¦  «        }	 t          |¦  «        }d|cxk    rdBk    rn n|| d4         d9<   n# t          $ r Y nw xY wt          dC| d4                              d7d8¦  «        › dD| d4                              d9d:¦  «        › dE�¦  «         �nU|d;k    rˆdF| d4         d5<   t          d@t          |¦  «        ¦  «        }	 t          |¦  «        }|dk    r|| d4         d7<   n# t          $ r Y nw xY wt          dC| d4                              d7d8¦  «        › dG�¦  «         nÇ|d<k    r’dH| d4         d5<   t          dAt          |¦  «        ¦  «        }	 t          |¦  «        }d|cxk    rdBk    rn n|| d4         d9<   n# t          $ r Y nw xY wt          dI| d4                              d9d:¦  «        › dE�¦  «         n/|d=k    r)dJ| d4         d5<   t          dK¦  «         t          dL¦  «         t!          | ¦  «         dS )MzSConfigure agent behavior: iterations, progress display, compression, session reset.úAgent Settingsr-  z/user-guide/configurationr  rH   r  r  z1Maximum tool-calling iterations per conversation.z3Higher = more complex tasks, but costs more tokens.zPress Enter to keep z5. Use 90 for most tasks or 150+ for open exploration.zMax iterationsr   NzMax iterations set to z%Invalid number, keeping current valuerJ   zTool Progress Displayz=Controls how much tool activity is shown (CLI and messaging).u-     off     â€” Silent, just the final responseu>     new     â€” Show tool name only when it changes (less noise)u7     all     â€” Show every tool call with a short previewu0     verbose â€” Full args, results, and debug logsr~   r  r  zTool progress mode)ÚoffÚnewr  ÚverbosezTool progress set to: zUnknown mode 'z', keeping 'ú'zContext CompressionzAAutomatically summarizes old messages when context gets too long.zNHigher threshold = compress later (use more context). Lower = compress sooner.Tr  r  r  r  z Compression threshold (0.5-0.95)gffffffî?z%Context compression threshold set to zSession Reset PolicyzJMessaging sessions (Telegram, Discord, etc.) accumulate context over time.zMEach message adds to the conversation history, which means growing API costs.zMTo manage this, sessions can automatically reset after a period of inactivityzLor at a fixed time each day. When a reset happens, the agent saves importantuR   things to its persistent memory first â€” but the conversation context is cleared.z=You can also manually reset anytime by typing /reset in chat.)zDInactivity + daily reset (recommended - reset whichever comes first)z6Inactivity only (reset after N minutes of no messages)z+Daily only (reset at a fixed hour each day)zDNever auto-reset (context lives until /reset or context compression)zKeep current settingsr  r  r  r  r  r  r´  rw   rD  r«   )r  ÚidleÚdailyÚnonezSession reset mode:z  Inactivity timeout (minutes)z%  Daily reset hour (0-23, local time)é   zSessions reset after z min idle or daily at z:00r%  z min of inactivityr&  zSessions reset daily at r'  zGSessions will never auto-reset. Context is managed only by compression.zFLong conversations will grow in cost. Use /reset manually when needed.)ra   rc   rO  r^   rX   r   r   r€   r‘   rW   r  rT  rd   r’   re   rK   rV   r  r—   )r   Úcurrent_maxÚmax_iter_strÚmax_iterÚcurrent_moder  Úcurrent_thresholdÚthreshold_strr  Úreset_choicesÚcurrent_policyÚcurrent_idleÚcurrent_hourÚdefault_resetÚ	reset_idxÚidle_strÚidle_valÚhour_strÚhour_vals                      r   Úsetup_agent_settingsr9    s‰  € õ Ð!Ñ"Ô"Ð"ÝÐA�JÐAÐAÐAÑBÔBÐBÝ	�G„G€Gõ  Ð 7Ñ8Ô8ð ½CØ�
Š
�7˜BÑÔ×#Ò# K°Ñ4Ô4ñ=ô =€Kõ ÐBÑCÔCÐCÝÐDÑEÔEÐEÝØa˜{ÐaÐaÐañô ð õ Ð*¨KÑ8Ô8€Lð?Ý�|Ñ$Ô$ˆØ�aŠ<ˆ<ÝÐ2µC¸±M´MÑBÔBÐBØ:BˆF×Ò˜g rÑ*Ô*¨;Ñ7Ø�JŠJ�{ DÑ)Ô)Ð)ÝÐ=°8Ð=Ð=Ñ>Ô>Ð>øøÝð ?ð ?ð ?ÝÐ=Ñ>Ô>Ð>Ð>Ð>ð?øøøõ ˆr�N„N€NÝÐ&Ñ'Ô'Ð'ÝÐNÑOÔOÐOÝÐ>Ñ?Ô?Ð?ÝÐOÑPÔPÐPÝÐHÑIÔIÐIÝÐAÑBÔBÐBà—:’:˜i¨Ñ,Ô,×0Ò0°À%ÑHÔH€LÝÐ&¨Ñ5Ô5€DØ‡z‚z�|„|Ð7Ð7Ð7Ø˜FÐ"Ð"Ø "ˆF�9ÑØ-1¯ZªZ©\¬\ˆˆyÔ˜/Ñ*Ý�FÑÔÐÝÐ=¨t¯zªz©|¬|Ð=Ð=Ñ>Ô>Ð>Ð>åÐH tÐHÐH¸ÐHÐHÐHÑIÔIÐIõ Ð&Ñ'Ô'Ð'ÝÐRÑSÔSÐSÝØXñô ð ð 7;€F×Ò�m RÑ(Ô(¨Ñ3àŸ
š
 =°"Ñ5Ô5×9Ò9¸+ÀtÑLÔLÐÝÐ=½sÐCTÑ?UÔ?UÑVÔV€MðÝ˜-Ñ(Ô(ˆ	Ø�)Ð#Ð#Ò#Ð#˜tÒ#Ð#Ð#Ð#Ð#Ø1:ˆF�=Ô! +Ñ.øøÝð ð ð Øˆðøøøõ Ø^°°}Ô0E×0IÒ0IÈ+ÐW[Ñ0\Ô0\Ð^Ð^ñô ð õ
 Ð'Ñ(Ô(Ð(ÝØTñô ð õ ØWñô ð õ ˆr�N„N€NÝØWñô ð õ ØVñô ð õ Ø\ñô ð õ ˆr�N„N€NÝÐNÑOÔOÐOÝˆr�N„N€Nðð ð €Mð —Z’Z °Ñ4Ô4€NØ!×%Ò% f¨fÑ5Ô5€LØ!×%Ò% n°dÑ;Ô;€LØ!×%Ò% i°Ñ3Ô3€Là¨°A¸qÐAÐA×EÒEÀlÐTUÑVÔV€MåÐ3°]ÀMÑRÔR€Ià
×Ò�o rÑ*Ô*Ð*à�A‚~€~Ø*0ˆˆÔ Ñ'ÝÐ:½CÀÑ<MÔ<MÑNÔNˆð	Ý˜8‘}”}ˆHØ˜!Š|ˆ|Ø:B��Ô'¨Ñ7øøÝð 	ð 	ð 	ØˆDð	øøøåÐAÅ3À|ÑCTÔCTÑUÔUˆð	Ý˜8‘}”}ˆHØ�HÐ"Ð"Ò"Ð" Ò"Ð"Ð"Ð"Ð"Ø5=��Ô'¨	Ñ2øøÝð 	ð 	ð 	ØˆDð	øøøåð \ F¨?Ô$;×$?Ò$?ÀÐPTÑ$UÔ$Uð  \ð  \Ðmsð  uDô  nE÷  nIò  nIð  JSð  UVñ  nWô  nWð  \ð  \ð  \ñ	
ô 	
ð 	
ñ 	
ð 
�aŠˆØ*0ˆˆÔ Ñ'ÝÐ:½CÀÑ<MÔ<MÑNÔNˆð	Ý˜8‘}”}ˆHØ˜!Š|ˆ|Ø:B��Ô'¨Ñ7øøÝð 	ð 	ð 	ØˆDð	øøøåØi F¨?Ô$;×$?Ò$?ÀÐPTÑ$UÔ$UÐiÐiÐiñ	
ô 	
ð 	
ð 	
ð 
�aŠˆØ*1ˆˆÔ Ñ'ÝÐAÅ3À|ÑCTÔCTÑUÔUˆð	Ý˜8‘}”}ˆHØ�HÐ"Ð"Ò"Ð" Ò"Ð"Ð"Ð"Ð"Ø5=��Ô'¨	Ñ2øøÝð 	ð 	ð 	ØˆDð	øøøåØU v¨oÔ'>×'BÒ'BÀ9ÈaÑ'PÔ'PÐUÐUÐUñ	
ô 	
ð 	
ð 	
ð 
�aŠˆØ*0ˆˆÔ Ñ'ÝØUñ	
ô 	
ð 	
õ 	ØTñ	
ô 	
ð 	
õ
 �ÑÔÐÐÐsm   Â>A3D2 Ä2EÅEÌ*L3 Ì3
M Ì?M Ó S3 Ó3
T Ó?T Ô!*U Õ
UÕU× W8 ×8
XØXÙ%*Z Ú
ZÚZc                  óº  — t          d¦  «         t          d¦  «        } | r¢t          d¦  «         t          dd¦  «        sƒt          d¦  «        srt          d¦  «         t          dd	¦  «        rSt          d
¦  «         t	          d¦  «        }|r3t          d|                     dd¦  «        ¦  «         t          d¦  «         dS t          d¦  «         ddl}	 t	          dd	¬¦  «        }|sdS | 	                    d|¦  «        st          d¦  «         Œ<	 t          d|¦  «         t          d¦  «         t          ¦   «          t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          ¦   «          t	          d¦  «        }|r4t          d|                     dd¦  «        ¦  «         t          d¦  «         nt          d¦  «         t          ¦   «          t          d¦  «         t          d¦  «         t          d ¦  «         |r-|                     d!¦  «        d                              ¦   «         nd}|r]t          d"|› d#�d	¦  «        r$t          d$|¦  «         t          d%|› �¦  «         dS t	          d&¦  «        }|rt          d$|¦  «         dS dS t          d'¦  «         t	          d(¦  «        }|rt          d$|¦  «         dS dS ))z1Configure Telegram bot credentials and allowlist.ÚTelegramÚTELEGRAM_BOT_TOKENzTelegram: already configuredzReconfigure Telegram?FÚTELEGRAM_ALLOWED_USERSuA   âš ï¸�  Telegram has no user allowlist - anyone can use your bot!úAdd allowed users now?Tz6   To find your Telegram user ID: message @userinfobotú"Allowed user IDs (comma-separated)rŒ   rJ   zTelegram allowlist configuredNz'Create a bot via @BotFather on Telegramr   zTelegram bot tokenr°   z^\d+:[A-Za-z0-9_-]{30,}$znInvalid token format. Expected: <numeric_id>:<alphanumeric_hash> (e.g., 123456789:ABCdefGHI-jklMNOpqrSTUvwxYZ)zTelegram token savedõ,   ðŸ”’ Security: Restrict who can use your botz!   To find your Telegram user ID:z&   1. Message @userinfobot on Telegramz:   2. It will reply with your numeric ID (e.g., 123456789)ú?Allowed user IDs (comma-separated, leave empty for open access)zATelegram allowlist configured - only listed users can use the botu@   âš ï¸�  No allowlist set - anyone who finds your bot can use it!õ:   ðŸ“¬ Home Channel: where Hermes delivers cron job results,ú.   cross-platform messages, and notifications.z:   For Telegram DMs, this is your user ID (same as above).ú,zUse your user ID (z) as the home channel?ÚTELEGRAM_HOME_CHANNELzTelegram home channel set to zHHome channel ID (or leave empty to set later with /set-home in Telegram)zI   You can also set this later by typing /set-home in your Telegram chat.z*Home channel ID (leave empty to set later))ra   rX   rc   rž   r€   rW   Úreplacerd   ÚreÚmatchrb   r^   Úsplitr   )r©  Úallowed_usersrG  ÚtokenÚfirst_user_idÚhome_channels         r   Ú_setup_telegramrN  ±  s[  € å�ÑÔÐÝÐ1Ñ2Ô2€HØð ÝÐ1Ñ2Ô2Ð2ÝÐ4°eÑ<Ô<ð 
	å Ð!9Ñ:Ô:ð GÝÐ^Ñ_Ô_Ð_Ý Ð!9¸4Ñ@Ô@ð GÝÐWÑXÔXÐXÝ$*Ð+OÑ$PÔ$P�MØ$ð GÝ&Ð'?À×AVÒAVÐWZÐ\^ÑA_ÔA_Ñ`Ô`Ð`Ý%Ð&EÑFÔFÐFØˆFåÐ8Ñ9Ô9Ð9Ø€I€I€Ið
ÝÐ+°dÐ;Ñ;Ô;ˆØð 	ØˆFØ�xŠxÐ3°UÑ;Ô;ð 	Ýð@ñô ð ð ØÝÐ'¨Ñ/Ô/Ð/ÝÐ(Ñ)Ô)Ð)å	�G„G€GÝÐ=Ñ>Ô>Ð>ÝÐ2Ñ3Ô3Ð3ÝÐ7Ñ8Ô8Ð8ÝÐKÑLÔLÐLÝ	�G„G€GÝØIñô €Mð ð WÝÐ/°×1FÒ1FÀsÈBÑ1OÔ1OÑPÔPÐPÝÐYÑZÔZÐZÐZåÐUÑVÔVÐVå	�G„G€GÝÐKÑLÔLÐLÝÐ?Ñ@Ô@Ð@ÝÐKÑLÔLÐLà;HÐP�M×'Ò'¨Ñ,Ô,¨QÔ/×5Ò5Ñ7Ô7Ð7Èb€MØð BÝÐS¨mÐSÐSÐSÐUYÑZÔZð 	FÝÐ2°MÑBÔBÐBÝÐI¸-ÐIÐIÑJÔJÐJÐJÐJå!Ð"lÑmÔmˆLØð FÝÐ6¸ÑEÔEÐEÐEÐEðFð Fõ 	Ð^Ñ_Ô_Ð_ÝÐJÑKÔKˆØð 	BÝÐ2°LÑAÔAÐAÐAÐAð	Bð 	Br   c                  óÒ  — t          d¦  «         t          d¦  «        } | r°t          d¦  «         t          dd¦  «        s‘t          d¦  «        s€t          d¦  «         t          dd	¦  «        rat          d
¦  «         t	          d¦  «        }|rAt          |¦  «        }t          dd                     |¦  «        ¦  «         t          d¦  «         dS t          d¦  «         t	          dd	¬¦  «        }|sdS t          d|¦  «         t          d¦  «         t          ¦   «          t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          ¦   «          t          d¦  «         t          ¦   «          t	          d¦  «        }|rBt          |¦  «        }t          dd                     |¦  «        ¦  «         t          d¦  «         nt          d¦  «         t          ¦   «          t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t	          d¦  «        }|rt          d |¦  «         dS dS )!z0Configure Discord bot credentials and allowlist.ÚDiscordÚDISCORD_BOT_TOKENzDiscord: already configuredzReconfigure Discord?FÚDISCORD_ALLOWED_USERSu@   âš ï¸�  Discord has no user allowlist - anyone can use your bot!r>  TuJ      To find Discord ID: Enable Developer Mode, right-click name â†’ Copy IDr?  rD  zDiscord allowlist configuredNz;Create a bot at https://discord.com/developers/applicationszDiscord bot tokenr°   zDiscord token savedr@  z    To find your Discord user ID:z/   1. Enable Developer Mode in Discord settingsu'      2. Right-click your name â†’ Copy IDzB   You can also use Discord usernames (resolved on gateway start).zLAllowed user IDs or usernames (comma-separated, leave empty for open access)uF   âš ï¸�  No allowlist set - anyone in servers with your bot can use it!rB  rC  uA      To get a channel ID: right-click a channel â†’ Copy Channel IDz0   (requires Developer Mode in Discord settings)zH   You can also set this later by typing /set-home in a Discord channel.ú9Home channel ID (leave empty to set later with /set-home)ÚDISCORD_HOME_CHANNEL)
ra   rX   rc   rž   r€   Ú_clean_discord_user_idsrW   r²   rd   r^   )r©  rJ  Úcleaned_idsrK  rM  s        r   Ú_setup_discordrW  ø  s‰  € å�ÑÔÐÝÐ0Ñ1Ô1€HØð ÝÐ0Ñ1Ô1Ð1ÝÐ3°UÑ;Ô;ð 
	Ý Ð!8Ñ9Ô9ð FÝÐ]Ñ^Ô^Ð^Ý Ð!9¸4Ñ@Ô@ð FÝÐkÑlÔlÐlÝ$*Ð+OÑ$PÔ$P�MØ$ð FÝ&=¸mÑ&LÔ&L˜Ý&Ð'>ÀÇÂÈÑ@UÔ@UÑVÔVÐVÝ%Ð&DÑEÔEÐEØˆFåÐLÑMÔMÐMÝÐ&°Ð6Ñ6Ô6€EØð ØˆÝÐ&¨Ñ.Ô.Ð.ÝÐ'Ñ(Ô(Ð(å	�G„G€GÝÐ=Ñ>Ô>Ð>ÝÐ1Ñ2Ô2Ð2ÝÐ@ÑAÔAÐAÝÐ8Ñ9Ô9Ð9Ý	�G„G€GÝÐSÑTÔTÐTÝ	�G„G€GÝØVñô €Mð ð ]Ý-¨mÑ<Ô<ˆÝÐ.°·²¸Ñ0EÔ0EÑFÔFÐFÝÐ4Ñ5Ô5Ð5Ð5åÐ[Ñ\Ô\Ð\å	�G„G€GÝÐKÑLÔLÐLÝÐ?Ñ@Ô@Ð@ÝÐRÑSÔSÐSÝÐAÑBÔBÐBÝÐYÑZÔZÐZÝÐUÑVÔV€LØð =ÝÐ-¨|Ñ<Ô<Ð<Ð<Ð<ð=ð =r   Úrawc                 ó¾  — g }|                       dd¦  «                             d¦  «        D ]°}|                     ¦   «         }|                     d¦  «        r=|                     d¦  «        r(|                     d¦  «                             d¦  «        }|                     ¦   «                              d¦  «        r
|dd	…         }|r|                     |¦  «         Œ±|S )
zGStrip common Discord mention prefixes from a comma-separated ID string.rŒ   rJ   rD  z<@Ú>z<@!zuser:rµ  N)	rF  rI  r   r7  ÚendswithÚlstripÚrstriprK   rð   )rX  ÚcleanedÚuids      r   rU  rU  .  sÐ   € à€GØ�{Š{˜3 Ñ#Ô#×)Ò)¨#Ñ.Ô.ð  ð  ˆØ�iŠi‰kŒkˆØ�>Š>˜$ÑÔð 	0 C§L¢L°Ñ$5Ô$5ð 	0Ø—*’*˜UÑ#Ô#×*Ò*¨3Ñ/Ô/ˆCØ�9Š9‰;Œ;×!Ò! 'Ñ*Ô*ð 	Ø�a�b�b”'ˆCØð 	 Ø�NŠN˜3ÑÔÐøØ€Nr   c                  ó  — t          d¦  «         t          d¦  «        } | r?t          d¦  «         t          dd¦  «        s t          dd¦  «        rt	          ¦   «          dS t          d	¦  «         t          d
¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          ¦   «          t          d¦  «         t          ¦   «          t	          ¦   «          t          ¦   «          t          dd¬¦  «        }|sdS t          d|¦  «         t          dd¬¦  «        }|rt          d|¦  «         t          d¦  «         t          ¦   «          t          d¦  «         t          d¦  «         t          ¦   «          t          d¦  «        }|r5t          d| 	                    dd¦  «        ¦  «         t          d¦  «         dS t          d¦  «         t          d¦  «         dS )z Configure Slack bot credentials.ÚSlackÚSLACK_BOT_TOKENzSlack: already configuredzReconfigure Slack?FzcRegenerate the Slack app manifest with the latest command list? (recommended after `hermes update`)TNzSteps to create a Slack app:u9      1. Go to https://api.slack.com/apps â†’ Create New AppuG         Pick 'From an app manifest' â€” we'll generate one for you below.u=      2. Enable Socket Mode: Settings â†’ Socket Mode â†’ EnableuB         â€¢ Create an App-Level Token with 'connections:write' scopeu4      3. Install to Workspace: Settings â†’ Install AppzD   4. After installing, invite the bot to channels: /invite @YourBotzU   Full guide: https://hermes-agent.nousresearch.com/docs/user-guide/messaging/slack/zSlack Bot Token (xoxb-...)r°   zSlack App Token (xapp-...)ÚSLACK_APP_TOKENzSlack tokens savedr@  u\      To find a Member ID: click a user's name â†’ View full profile â†’ â‹® â†’ Copy member IDzTAllowed user IDs (comma-separated, leave empty to deny everyone except paired users)ÚSLACK_ALLOWED_USERSrŒ   rJ   zSlack allowlist configureduJ   âš ï¸�  No Slack allowlist set - unpaired users will be denied by default.zw   Set SLACK_ALLOW_ALL_USERS=true or GATEWAY_ALLOW_ALL_USERS=true only if you intentionally want open workspace access.)ra   rX   rc   rž   Ú"_write_slack_manifest_and_instructr^   r€   rW   rd   rF  re   )r©  Ú	bot_tokenÚ	app_tokenrJ  s       r   Ú_setup_slackrh  <  s=  € å�ÑÔÐÝÐ.Ñ/Ô/€HØð ÝÐ.Ñ/Ô/Ð/ÝÐ1°5Ñ9Ô9ð 		õ ð<àñô ð 5õ
 3Ñ4Ô4Ð4ØˆFåÐ-Ñ.Ô.Ð.ÝÐJÑKÔKÐKÝÐXÑYÔYÐYÝÐNÑOÔOÐOÝÐSÑTÔTÐTÝÐEÑFÔFÐFÝÐUÑVÔVÐVÝ	�G„G€GÝÐfÑgÔgÐgÝ	�G„G€Gõ
 'Ñ(Ô(Ð(å	�G„G€GÝÐ3¸dÐCÑCÔC€IØð ØˆÝÐ$ iÑ0Ô0Ð0ÝÐ3¸dÐCÑCÔC€IØð 5ÝÐ(¨)Ñ4Ô4Ð4ÝÐ&Ñ'Ô'Ð'å	�G„G€GÝÐ=Ñ>Ô>Ð>ÝÐmÑnÔnÐnÝ	�G„G€GÝØ^ñô €Mð ð NÝÐ,¨m×.CÒ.CÀCÈÑ.LÔ.LÑMÔMÐMÝÐ2Ñ3Ô3Ð3Ð3Ð3åÐbÑcÔcÐcÝð  Mñ  	Nô  	Nð  	Nð  	Nð  	Nr   c                  óà  — 	 ddl m}  ddlm}  | dd¬¦  «        }t	           |¦   «         ¦  «        dz  }|j                             dd¬	¦  «         dd
l}|                     | 	                    |dd¬¦  «        dz   d¬¦  «         t          d|› �¦  «         t          d¦  «         t          d¦  «         d
S # t          $ r,}t          d|› �¦  «         t          d¦  «         Y d
}~d
S d
}~ww xY w)u§  Generate the Slack manifest, write it under HERMES_HOME, and print
    paste-into-Slack instructions.

    Exposed as its own helper so both the initial setup flow and the
    "reconfigure? â†’ no" branch can refresh the manifest without the user
    re-entering tokens. Failures are non-fatal â€” if the manifest write
    fails for any reason, we print a warning and skip rather than abort
    the whole Slack setup.
    r   )Ú_build_full_manifest)rR   ÚHermeszYour Hermes agent on Slack)Úbot_nameÚbot_descriptionzslack-manifest.jsonT)ÚparentsÚexist_okNrD  F)ÚindentÚensure_asciiÚ
zutf-8)ÚencodingzSlack app manifest written to: u°      Paste it into https://api.slack.com/apps â†’ your app â†’ Features â†’ App Manifest â†’ Edit, then Save.  Slack will prompt to reinstall if scopes or slash commands changed.z\   Re-run `hermes slack manifest --write` anytime to refresh after Hermes adds new commands.zCouldn't write Slack manifest: zI   You can generate it manually later with: hermes slack manifest --write)Úhermes_cli.slack_clirj  r  rR   r   ÚparentÚmkdirÚjsonÚ
write_textÚdumpsrd   rc   rl   re   )rj  rR   ÚmanifestÚtargetÚ_jsonrZ  s         r   re  re  v  s†  € ð
Ø=Ð=Ð=Ð=Ð=Ð=Ø4Ð4Ð4Ð4Ð4Ð4à'Ð'ØØ8ð
ñ 
ô 
ˆõ �o�oÑ'Ô'Ñ(Ô(Ð+@Ñ@ˆØŒ×Ò D°4ÐÑ8Ô8Ð8ØÐÐÐØ×ÒØ�KŠK˜¨¸ˆKÑ?Ô?À$ÑFØð 	ñ 	
ô 	
ð 	
õ 	Ð@¸Ð@Ð@ÑAÔAÐAÝð=ñ	
ô 	
ð 	
õ
 	ð(ñ	
ô 	
ð 	
ð 	
ð 	
øõ ð 
ð 
ð 
ÝÐ=¸Ð=Ð=Ñ>Ô>Ð>Ýð,ñ	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
øøøøð
øøøs   ‚B3B7 Â7
C-Ã!C(Ã(C-c            	      óÆ  — t          d¦  «         t          d¦  «        pt          d¦  «        } | r!t          d¦  «         t          dd¦  «        sdS t          d¦  «         t          d	¦  «         t          d
¦  «         t	          ¦   «          t          d¦  «        }|r#t          d|                     d¦  «        ¦  «         t	          ¦   «          t          d¦  «         t          dd¬¦  «        }|rAt          d|¦  «         t          d¦  «        }|rt          d|¦  «         t          d¦  «         nSt          d¦  «        }|rt          d|¦  «         t          dd¬¦  «        }|rt          d|¦  «         t          d¦  «         |st          d¦  «        �rIt	          ¦   «          t          dd¦  «        }|rt          dd¦  «         t          d¦  «         |rdnd}	 t          d¦  «         �n# t          $ rù t          d|› d�¦  «         d dl}t          j        d!¦  «        }|r)|                     |d"d#d$t          j        |gdd¬%¦  «        }	n'|                     t          j        d&d"d#|gdd¬%¦  «        }	|	j        d k    rt          |› d'�¦  «         n[t%          d(|› d)�¦  «         |	j        rAt          d*|	j                             ¦   «                              ¦   «         d+         › �¦  «         Y nw xY wt	          ¦   «          t          d,¦  «         t          d-¦  «         t	          ¦   «          t          d.¦  «        }
|
r4t          d/|
                     d0d1¦  «        ¦  «         t          d2¦  «         nt          d3¦  «         t	          ¦   «          t          d4¦  «         t          d5¦  «         t          d6¦  «         t          d7¦  «        }|rt          d8|¦  «         dS dS dS )9zConfigure Matrix credentials.ÚMatrixÚMATRIX_ACCESS_TOKENÚMATRIX_PASSWORDzMatrix: already configuredzReconfigure Matrix?FNzMWorks with any Matrix homeserver (Synapse, Conduit, Dendrite, or matrix.org).zC   1. Create a bot user on your homeserver, or use your own accountzE   2. Get an access token from Element, or provide user ID + passwordz0Homeserver URL (e.g. https://matrix.example.org)ÚMATRIX_HOMESERVERræ   zCAuth: provide an access token (recommended), or user ID + password.z-Access token (leave empty for password login)Tr°   u9   User ID (@bot:server â€” optional, will be auto-detected)ÚMATRIX_USER_IDzMatrix access token savedzUser ID (@bot:server)ÚPasswordzMatrix credentials savedz$Enable end-to-end encryption (E2EE)?ÚMATRIX_ENCRYPTIONr  zE2EE enabledzmautrix[encryption]ÚmautrixzInstalling z...r   rÅ  r‰  r‚  rÆ  rÇ  rˆ  z
 installedu.   Install failed â€” run manually: pip install 'r$  rÊ  r…   r@  z-   Matrix user IDs look like @username:serverrA  ÚMATRIX_ALLOWED_USERSrŒ   rJ   zMatrix allowlist configuredõE   âš ï¸�  No allowlist set - anyone who can message the bot can use it!uI   ðŸ“¬ Home Room: where Hermes delivers cron job results and notifications.zE   Room IDs look like !abc123:server (shown in Element room settings)zD   You can also set this later by typing /set-home in a Matrix room.z6Home room ID (leave empty to set later with /set-home)ÚMATRIX_HOME_ROOM)ra   rX   rc   rž   r^   r€   rW   r]  rd   rß  rà  r�  r{  r|  r�  ri   r’  rá  re   râ  r   rã  rF  )r©  Ú
homeserverrK  Úuser_idrr   Ú	want_e2eeÚ
matrix_pkgr�  rû  rü  rJ  Ú	home_rooms               r   Ú_setup_matrixrŽ  ¡  sk  € å�ÑÔÐÝÐ2Ñ3Ô3ÐWµ}ÐEVÑ7WÔ7W€HØð ÝÐ/Ñ0Ô0Ð0ÝÐ2°EÑ:Ô:ð 	ØˆFåÐ^Ñ_Ô_Ð_ÝÐTÑUÔUÐUÝÐVÑWÔWÐWÝ	�G„G€GÝÐJÑKÔK€JØð DÝÐ*¨J×,=Ò,=¸cÑ,BÔ,BÑCÔCÐCå	�G„G€GÝÐTÑUÔUÐUÝÐBÈTÐRÑRÔR€EØð 6ÝÐ,¨eÑ4Ô4Ð4ÝÐTÑUÔUˆØð 	6ÝÐ+¨WÑ5Ô5Ð5ÝÐ1Ñ2Ô2Ð2Ð2åÐ0Ñ1Ô1ˆØð 	6ÝÐ+¨WÑ5Ô5Ð5Ý˜*¨tÐ4Ñ4Ô4ˆØð 	6ÝÐ,¨hÑ7Ô7Ð7ÝÐ4Ñ5Ô5Ð5àð 0:•Ð/Ñ0Ô0ñ 0:Ý‰ŒˆÝ!Ð"HÈ%ÑPÔPˆ	Øð 	*ÝÐ.°Ñ7Ô7Ð7Ý˜.Ñ)Ô)Ð)à.7ÐFÐ*Ð*¸Yˆ
ð	UÝ�yÑ!Ô!Ð!Ñ!øÝð 	Uð 	Uð 	UÝÐ4 ZÐ4Ð4Ð4Ñ5Ô5Ð5ØÐÐÐÝ”\ $Ñ'Ô'ˆFØð 	Ø#ŸšØ˜U I¨z½3¼>È:ÐVØ#'¨dð (ñ ô ��ð
 $ŸšÝ”^ T¨5°)¸ZÐHØ#'¨dð (ñ ô �ð Ô  AÒ%Ð%Ý Ð7Ð7Ð7Ñ8Ô8Ð8Ð8åÐ\ÈzÐ\Ð\Ð\Ñ]Ô]Ð]Ø”=ð UÝÐS¨6¬=×+>Ò+>Ñ+@Ô+@×+KÒ+KÑ+MÔ+MÈbÔ+QÐSÐSÑTÔTÐTøøð'	Uøøøõ* 	‰ŒˆÝÐAÑBÔBÐBÝÐBÑCÔCÐCÝ‰ŒˆÝÐ`ÑaÔaˆØð 	`ÝÐ1°=×3HÒ3HÈÈbÑ3QÔ3QÑRÔRÐRÝÐ7Ñ8Ô8Ð8Ð8åÐ^Ñ_Ô_Ð_å‰ŒˆÝÐ^Ñ_Ô_Ð_ÝÐZÑ[Ô[Ð[ÝÐYÑZÔZÐZÝÐSÑTÔTˆ	Øð 	:ÝÐ-¨yÑ9Ô9Ð9Ð9Ð9ða0:ð 0:ð^	:ð 	:s   ÇG- Ç-D K0Ë/K0c                  óÄ  — t          d¦  «         t          d¦  «        } | r!t          d¦  «         t          dd¦  «        sdS t          d¦  «         t          d¦  «         t          d	¦  «         t	          ¦   «          t          d
¦  «        }|r#t          d|                     d¦  «        ¦  «         t          dd¬¦  «        }|sdS t          d|¦  «         t          d¦  «         t	          ¦   «          t          d¦  «         t          d¦  «         t          d¦  «         t	          ¦   «          t          d¦  «        }|r4t          d| 	                    dd¦  «        ¦  «         t          d¦  «         nt          d¦  «         t	          ¦   «          t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «        }|rt          d|¦  «         dS dS )z%Configure Mattermost bot credentials.Ú
MattermostÚMATTERMOST_TOKENzMattermost: already configuredzReconfigure Mattermost?FNz/Works with any self-hosted Mattermost instance.uF      1. In Mattermost: Integrations â†’ Bot Accounts â†’ Add Bot Accountz   2. Copy the bot tokenz3Mattermost server URL (e.g. https://mm.example.com)ÚMATTERMOST_URLræ   z	Bot tokenTr°   zMattermost token savedr@  u6      To find your user ID: click your avatar â†’ Profilez'   or use the API: GET /api/v4/users/merA  ÚMATTERMOST_ALLOWED_USERSrŒ   rJ   zMattermost allowlist configuredr‡  uL   ðŸ“¬ Home Channel: where Hermes delivers cron job results and notifications.uH      To get a channel ID: click channel name â†’ View Info â†’ copy the IDzK   You can also set this later by typing /set-home in a Mattermost channel.rS  ÚMATTERMOST_HOME_CHANNEL)
ra   rX   rc   rž   r^   r€   rW   r]  rd   rF  )r©  Úmm_urlrK  rJ  rM  s        r   Ú_setup_mattermostr–  ÷  sý  € å�ÑÔÐÝÐ/Ñ0Ô0€HØð ÝÐ3Ñ4Ô4Ð4ÝÐ6¸Ñ>Ô>ð 	ØˆFåÐ@ÑAÔAÐAÝÐWÑXÔXÐXÝÐ)Ñ*Ô*Ð*Ý	�G„G€GÝÐIÑJÔJ€FØð =ÝÐ'¨¯ª°sÑ);Ô);Ñ<Ô<Ð<Ý�;¨Ð.Ñ.Ô.€EØð ØˆÝÐ% uÑ-Ô-Ð-ÝÐ*Ñ+Ô+Ð+å	�G„G€GÝÐ=Ñ>Ô>Ð>ÝÐGÑHÔHÐHÝÐ8Ñ9Ô9Ð9Ý	�G„G€GÝÐ\Ñ]Ô]€MØð \ÝÐ1°=×3HÒ3HÈÈbÑ3QÔ3QÑRÔRÐRÝÐ7Ñ8Ô8Ð8Ð8åÐZÑ[Ô[Ð[å	�G„G€GÝÐ]Ñ^Ô^Ð^ÝÐYÑZÔZÐZÝÐ\Ñ]Ô]Ð]ÝÐUÑVÔV€LØð @ÝÐ0°,Ñ?Ô?Ð?Ð?Ð?ð@ð @r   c                  ó^  — t          d¦  «         t          d¦  «        } | rt          d¦  «         dS t          d¦  «         t          d¦  «         t          ¦   «          t	          dd¦  «        r?t          dd	¦  «         t          d
¦  «         t          d¦  «         t          d¦  «         dS dS )zConfigure WhatsApp bridge.ÚWhatsAppÚWHATSAPP_ENABLEDzWhatsApp: already enabledNz2WhatsApp connects via a built-in bridge (Baileys).z9Requires Node.js. Run 'hermes whatsapp' for guided setup.zEnable WhatsApp now?Tr  zWhatsApp enabledz>Run 'hermes whatsapp' to choose your mode (separate bot numberz,or personal self-chat) and pair via QR code.)ra   rX   rc   r^   rž   rW   rd   )r©  s    r   Ú_setup_whatsapprš  "  sÅ   € å�ÑÔÐÝÐ/Ñ0Ô0€HØð ÝÐ.Ñ/Ô/Ð/ØˆåÐCÑDÔDÐDÝÐJÑKÔKÐKÝ	�G„G€GÝÐ+¨TÑ2Ô2ð CÝÐ)¨6Ñ2Ô2Ð2ÝÐ(Ñ)Ô)Ð)ÝÐSÑTÔTÐTÝÐAÑBÔBÐBÐBÐBð	Cð Cr   c                  ó&   — ddl m}   | ¦   «          dS )z>Configure Weixin (personal WeChat) via iLink Bot API QR login.r   )Ú_setup_weixinN)Úhermes_cli.gatewayrœ  )Ú_gateway_setup_weixins    r   rœ  rœ  4  ó)   € àIÐIÐIÐIÐIÐIØÐÑÔÐÐÐr   c                  ó&   — ddl m}   | ¦   «          dS )z#Configure Signal via gateway setup.r   )Ú_setup_signalN)r�  r¡  )Ú_gateway_setup_signals    r   r¡  r¡  :  rŸ  r   c                  ó&   — ddl m}   | ¦   «          dS )z"Configure Email via gateway setup.r   )Ú_setup_emailN)r�  r¤  )Ú_gateway_setup_emails    r   r¤  r¤  @  ó)   € àGÐGÐGÐGÐGÐGØÐÑÔÐÐÐr   c                  ó&   — ddl m}   | ¦   «          dS )z)Configure SMS (Twilio) via gateway setup.r   )Ú
_setup_smsN)r�  r¨  )Ú_gateway_setup_smss    r   r¨  r¨  F  s)   € àCÐCÐCÐCÐCÐCØÐÑÔÐÐÐr   c                  ó&   — ddl m}   | ¦   «          dS )z%Configure DingTalk via gateway setup.r   )Ú_setup_dingtalkN)r�  r«  )Ú_gateway_setup_dingtalks    r   r«  r«  L  s)   € àMÐMÐMÐMÐMÐMØÐÑÔÐÐÐr   c                  ó&   — ddl m}   | ¦   «          dS )z*Configure Feishu / Lark via gateway setup.r   )Ú_setup_feishuN)r�  r®  )Ú_gateway_setup_feishus    r   r®  r®  R  rŸ  r   c                  ó&   — ddl m}   | ¦   «          dS )z6Configure WeCom (Enterprise WeChat) via gateway setup.r   )Ú_setup_wecomN)r�  r±  )Ú_gateway_setup_wecoms    r   r±  r±  X  r¦  r   c                  ó&   — ddl m}   | ¦   «          dS )z<Configure WeCom Callback (self-built app) via gateway setup.r   )Ú_setup_wecom_callbackN)r�  r´  )Ú	_gw_setups    r   r´  r´  ^  s#   € àEÐEÐEÐEÐEÐEØ€I�K„K€K€K€Kr   c                  óÈ  — t          d¦  «         t          d¦  «        } | r!t          d¦  «         t          dd¦  «        sdS t          d¦  «         t          d¦  «         t          d	¦  «         t          d
¦  «         t	          ¦   «          t          d¦  «         t	          ¦   «          t          d¦  «        }|st          d¦  «         dS t          d|                     d¦  «        ¦  «         t          dd¬¦  «        }|st          d¦  «         dS t          d|¦  «         t          d¦  «         t	          ¦   «          t          d¦  «         t          d¦  «         t	          ¦   «          t          d¦  «        }|r4t          d| 
                    dd¦  «        ¦  «         t          d¦  «         nt          d¦  «         t	          ¦   «          t          d¦  «         t          d¦  «         t          d¦  «        }|rt          d |¦  «         t	          ¦   «          t          d!¦  «         t          d"d¦  «        rnt          d#¦  «        }|r]	 t          d$t          t          |¦  «        ¦  «        ¦  «         t          d%|› �¦  «         n# t          $ r t          d&¦  «         Y nw xY wt	          ¦   «          t          d'¦  «         t          d(¦  «         t          d)¦  «         dS )*z'Configure BlueBubbles iMessage gateway.úBlueBubbles (iMessage)ÚBLUEBUBBLES_SERVER_URLzBlueBubbles: already configuredzReconfigure BlueBubbles?FNuC   Connects Hermes to iMessage via BlueBubbles â€” a free, open-sourcez1macOS server that bridges iMessage to any device.z4   Requires a Mac running BlueBubbles Server v1.0.0+z%   Download: https://bluebubbles.app/uN   In BlueBubbles Server â†’ Settings â†’ API, note your Server URL and Password.z6BlueBubbles server URL (e.g. http://192.168.1.10:1234)u5   Server URL is required â€” skipping BlueBubbles setupræ   zBlueBubbles server passwordTr°   u3   Password is required â€” skipping BlueBubbles setupÚBLUEBUBBLES_PASSWORDzBlueBubbles credentials savedu0   ðŸ”’ Security: Restrict who can message your botzJ   Use iMessage addresses: email (user@icloud.com) or phone (+15551234567)zIAllowed iMessage addresses (comma-separated, leave empty for open access)ÚBLUEBUBBLES_ALLOWED_USERSrŒ   rJ   z BlueBubbles allowlist configureduI   âš ï¸�  No allowlist set â€” anyone who can iMessage you can use the bot!uJ   ðŸ“¬ Home Channel: phone or email for cron job delivery and notifications.zD   You can also set this later with /set-home in your iMessage chat.z/Home channel address (leave empty to set later)ÚBLUEBUBBLES_HOME_CHANNELz6Advanced settings (defaults are fine for most setups):z$Configure webhook listener settings?z%Webhook listener port (default: 8645)ÚBLUEBUBBLES_WEBHOOK_PORTúWebhook port set to z'Invalid port number, using default 8645zBRequires the BlueBubbles Private API helper for typing indicators,zGread receipts, and tapback reactions. Basic messaging works without it.zC   Install: https://docs.bluebubbles.app/helper-bundle/installation)ra   rX   rc   rž   r^   r€   re   rW   r]  rd   rF  r   r‘   r’   )r©  Ú
server_urlrr   rJ  rM  Úwebhook_ports         r   Ú_setup_bluebubblesrÀ  f  s  € åÐ)Ñ*Ô*Ð*ÝÐ5Ñ6Ô6€HØð ÝÐ4Ñ5Ô5Ð5ÝÐ7¸Ñ?Ô?ð 	ØˆFåÐTÑUÔUÐUÝÐBÑCÔCÐCÝÐEÑFÔFÐFÝÐ6Ñ7Ô7Ð7Ý	�G„G€GÝÐ_Ñ`Ô`Ð`Ý	�G„G€GåÐPÑQÔQ€JØð ÝÐMÑNÔNÐNØˆÝÐ+¨Z×->Ò->¸sÑ-CÔ-CÑDÔDÐDåÐ3¸dÐCÑCÔC€HØð ÝÐKÑLÔLÐLØˆÝÐ)¨8Ñ4Ô4Ð4ÝÐ1Ñ2Ô2Ð2å	�G„G€GÝÐAÑBÔBÐBÝÐ[Ñ\Ô\Ð\Ý	�G„G€GÝÐfÑgÔg€MØð `ÝÐ2°M×4IÒ4IÈ#ÈrÑ4RÔ4RÑSÔSÐSÝÐ8Ñ9Ô9Ð9Ð9åÐ^Ñ_Ô_Ð_å	�G„G€GÝÐ[Ñ\Ô\Ð\ÝÐUÑVÔVÐVÝÐKÑLÔL€LØð AÝÐ1°<Ñ@Ô@Ð@å	�G„G€GÝÐGÑHÔHÐHÝÐ;¸UÑCÔCð IÝÐEÑFÔFˆØð 	IðIÝÐ9½3½sÀ<Ñ?PÔ?PÑ;QÔ;QÑRÔRÐRÝÐC°\ÐCÐCÑDÔDÐDÐDøÝð Ið Ið IÝÐGÑHÔHÐHÐHÐHðIøøøõ 
�G„G€GÝÐSÑTÔTÐTÝÐXÑYÔYÐYÝÐTÑUÔUÐUÐUÐUs   É<J ÊJ$Ê#J$c                  ó&   — ddl m}   | ¦   «          dS )z5Configure QQ Bot (Official API v2) via gateway setup.r   )Ú_setup_qqbotN)r�  rÂ  )Ú_gateway_setup_qqbots    r   rÂ  rÂ  §  r¦  r   c                  ó  — t          d¦  «         t          d¦  «        } | r!t          d¦  «         t          dd¦  «        sdS t	          ¦   «          t          d¦  «         t          d¦  «         t          d	¦  «         t	          ¦   «          t          d
¦  «         t	          ¦   «          t          d¦  «        }|r]	 t          dt          t          |¦  «        ¦  «        ¦  «         t          d|› �¦  «         n# t          $ r t          d¦  «         Y nw xY wt          dd¬¦  «        }|r t          d|¦  «         t          d¦  «         nt          d¦  «         t          dd¦  «         t	          ¦   «          t          d¦  «         ddlm} t          d |¦   «         › d�¦  «         t          d¦  «         t          d¦  «         t	          ¦   «          t          d¦  «         t          d¦  «         t	          ¦   «          t          d¦  «         dS ) zConfigure webhook integration.ÚWebhooksÚWEBHOOK_ENABLEDzWebhooks: already configuredzReconfigure webhooks?FNuD   âš   Webhook and SMS platforms require exposing gateway ports to thezE   internet. For security, run the gateway in a sandboxed environmentzB   (Docker, VM, etc.) to limit blast radius from prompt injection.zX   Full guide: https://hermes-agent.nousresearch.com/docs/user-guide/messaging/webhooks/zWebhook port (default 8644)ÚWEBHOOK_PORTr½  z'Invalid port number, using default 8644z-Global HMAC secret (shared across all routes)Tr°   ÚWEBHOOK_SECRETzWebhook secret saveduE   No secret set â€” you must configure per-route secrets in config.yamlr  zWebhooks enabled! Next steps:r   ré   z   1. Define webhook routes in z/config.yamlz3   2. Point your service (GitHub, GitLab, etc.) at:z3      http://your-server:8644/webhooks/<route-name>z   Route configuration guide:z_   https://hermes-agent.nousresearch.com/docs/user-guide/messaging/webhooks/#configuring-routesz2   Open config in your editor:  hermes config edit)ra   rX   rc   rž   r^   re   r€   rW   r   r‘   rd   r’   r  rê   )r©  r  Úsecretr  s       r   Ú_setup_webhooksrÊ  ­  s9  € å�ÑÔÐÝÐ.Ñ/Ô/€HØð ÝÐ1Ñ2Ô2Ð2ÝÐ4°eÑ<Ô<ð 	ØˆFå	�G„G€GÝÐXÑYÔYÐYÝÐYÑZÔZÐZÝÐVÑWÔWÐWÝ	�G„G€GÝÐiÑjÔjÐjÝ	�G„G€GåÐ/Ñ0Ô0€DØð Eð	EÝ˜>­3­s°4©y¬y©>¬>Ñ:Ô:Ð:ÝÐ7°Ð7Ð7Ñ8Ô8Ð8Ð8øÝð 	Eð 	Eð 	EÝÐCÑDÔDÐDÐDÐDð	Eøøøõ ÐCÈdÐSÑSÔS€FØð _ÝÐ'¨Ñ0Ô0Ð0ÝÐ,Ñ-Ô-Ð-Ð-åÐ]Ñ^Ô^Ð^åÐ$ fÑ-Ô-Ð-Ý	�G„G€GÝÐ1Ñ2Ô2Ð2Ø<Ð<Ð<Ð<Ð<Ð<ÝÐE°°±´ÐEÐEÐEÑFÔFÐFÝÐDÑEÔEÐEÝÐDÑEÔEÐEÝ	�G„G€GÝÐ.Ñ/Ô/Ð/ÝÐpÑqÔqÐqÝ	�G„G€GÝÐCÑDÔDÐDÐDÐDs   Â:<C7 Ã7DÄDr;  r<  rP  rQ  ra  rb  ÚSignalÚSIGNAL_HTTP_URLÚEmailÚEMAIL_ADDRESSzSMS (Twilio)ÚTWILIO_ACCOUNT_SIDr~  r  r�  r‘  r˜  r™  ÚDingTalkÚDINGTALK_CLIENT_IDzFeishu / LarkÚFEISHU_APP_IDzWeCom (Enterprise WeChat)ÚWECOM_BOT_IDzWeCom Callback (Self-Built App)ÚWECOM_CALLBACK_CORP_IDzWeixin (WeChat)ÚWEIXIN_ACCOUNT_IDr·  r¸  zQQ BotÚ	QQ_APP_IDzWebhooks (GitHub, GitLab, etc.)rÆ  c                 ó  — t          d¦  «         t          d¦  «         t          d¦  «         t          ¦   «          g }g }t          t          ¦  «        D ]~\  }\  }}}t          t          |¦  «        ¦  «        }|dk    r|st          t          d¦  «        ¦  «        }|r|› d�n|}|                     |¦  «         |r|                     |¦  «         Œt          d||¦  «        }	|	st          d¦  «         d	S |	D ]}
t          |
         \  }}} |¦   «          Œt          d
¦  «        pït          d¦  «        pàt          d¦  «        pÑt          d¦  «        pÂt          d¦  «        p³t          d¦  «        p¤t          d¦  «        p•t          d¦  «        p†t          d¦  «        pwt          d¦  «        pht          d¦  «        pYt          d¦  «        pJt          d¦  «        p;t          d¦  «        p,t          d¦  «        pt          d¦  «        pt          d¦  «        }|�rðt          ¦   «          t          d¦  «         t          d¦  «         g }t          d
¦  «        r$t          d¦  «        s|                     d¦  «         t          d¦  «        r$t          d¦  «        s|                     d¦  «         t          d¦  «        r$t          d ¦  «        s|                     d!¦  «         t          d¦  «        r$t          d"¦  «        s|                     d#¦  «         t          d¦  «        r3t          d$¦  «        s$t          d%¦  «        s|                     d&¦  «         |rŠt          ¦   «          t          d'd(                     |¦  «        › �¦  «         t          d)¦  «         t          d*¦  «         t          d+¦  «         |D ]'}t          d,|                     ¦   «         › d-�¦  «         Œ(d.d	l}|                     ¦   «         d/k    }|                     ¦   «         d0k    }d.d1lm}m}m}m}m}m}m}m}m}m}m}m}m}m}   |¦   «         }! |¦   «         }" |¦   «         }#|#p|}$t          ¦   «          |#r" |¦   «         r |¦   «          t          ¦   «          |#r" |¦   «         r |¦   «          t          ¦   «          |"r«t=          d2d3¦  «        r™	 |#r |¦   «          n|r
 |¦   «          �n# | $ rP}%t?          d4¦  «         tA          |%¦  «         !                    ¦   «         D ]}&t          d5|&› �¦  «         ŒY d	}%~%�nÍd	}%~%wtD          $ r}%t?          d6|%› �¦  «         Y d	}%~%�n¨d	}%~%ww xY w�nž|!r«t=          d7d3¦  «        r™	 |#r |¦   «          n|r
 |¦   «          �np# | $ rP}%t?          d8¦  «         tA          |%¦  «         !                    ¦   «         D ]}&t          d5|&› �¦  «         ŒY d	}%~%�n d	}%~%wtD          $ r}%t?          d9|%› �¦  «         Y d	}%~%�nûd	}%~%ww xY w�nñ|$�re|#rd:nd;}'t=          d<|'› d=�d3¦  «        �r	 d	}(d>})|#r |d>¬?¦  «        \  }(})n |d>¬?¦  «         d3})t          ¦   «          |)r¬t=          d@d3¦  «        rœ	 |#r ||(dAk    ¬B¦  «         n|r
 |¦   «          n{# | $ rO}%t?          d8¦  «         tA          |%¦  «         !                    ¦   «         D ]}&t          d5|&› �¦  «         ŒY d	}%~%n,d	}%~%wtD          $ r}%t?          d9|%› �¦  «         Y d	}%~%nd	}%~%ww xY wnñ# tD          $ r+}%t?          dC|%› �¦  «         t          dD¦  «         Y d	}%~%nÁd	}%~%ww xY wt          dE¦  «         |#rt          dF¦  «         t          dG¦  «         n‰d.dHl#m$}*  |*¦   «         r[t          dI¦  «         t          dJ¦  «         t          dK¦  «         t          dL¦  «         t          dM¦  «         t          dN¦  «         nt          dI¦  «         t          dO¦  «         t          d¦  «         d	S d	S )Pz*Configure messaging platform integrations.úMessaging PlatformszAConnect to messaging platforms to chat with Hermes from anywhere.z&Toggle with Space, confirm with Enter.r~  r€  z  (configured)zSelect platforms to configure:zENo platforms selected. Run 'hermes setup gateway' later to configure.Nr<  rQ  rb  rÌ  rÎ  rÏ  r‘  r  r™  rÑ  rÒ  rÓ  rÕ  r¸  rÖ  rÆ  u–   â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�zMessaging platforms configured!rE  r;  rT  rP  ÚSLACK_HOME_CHANNELra  r»  ÚBlueBubblesÚQQBOT_HOME_CHANNELÚQQ_HOME_CHANNELÚQQBotzNo home channel set for: rª   z7   Without a home channel, cron jobs and cross-platformz2   messages can't be delivered to those platforms.z1   Set one later with /set-home in your chat, or:z     hermes config set z_HOME_CHANNEL <channel_id>r   r°  ÚDarwin)Ú_is_service_installedÚ_is_service_runningÚsupports_systemd_servicesÚhas_conflicting_systemd_unitsÚhas_legacy_hermes_unitsÚ install_linux_gateway_from_setupÚ$print_systemd_scope_conflict_warningÚprint_legacy_unit_warningÚsystemd_startÚsystemd_restartÚlaunchd_installÚlaunchd_startÚlaunchd_restartÚUserSystemdUnavailableErrorz)  Restart the gateway to pick up changes?Tu0     Restart failed â€” user systemd not reachable:r‹   z  Restart failed: z  Start the gateway service?u.     Start failed â€” user systemd not reachable:z  Start failed: ÚsystemdÚlaunchdz  Install the gateway as a z. service? (runs in background, starts on boot)F)Úforcez  Start the service now?rÛ  )rÛ  z  Install failed: z.  You can try manually: hermes gateway installz/  You can install later: hermes gateway installzA  Or as a boot-time service: sudo hermes gateway install --systemz'  Or run in foreground:  hermes gateway)Úis_containerz,Start the gateway to bring your bots online:z>   hermes gateway run          # Run as container main processrJ   z4For automatic restarts, use a Docker restart policy:z*   docker run --restart unless-stopped ...z/   docker restart <container>  # Manual restartz2   hermes gateway              # Run in foreground)%ra   rc   r^   r�   Ú_GATEWAY_PLATFORMSrj   rX   rð   r¦   rd   re   r²   ÚupperrŽ  rÛ  r�  rß  rà  rá  râ  rã  rä  rå  ræ  rç  rè  ré  rê  rë  rì  rž   rb   r   rã  rl   r  rð  )+r   rŸ   r    r”   r­   Úenv_varÚ_funcÚis_configuredr  r†   r“   Ú_env_varÚ
setup_funcÚany_messagingÚmissing_homeÚplatræ  Ú	_is_linuxÚ	_is_macosrß  rà  rá  râ  rã  rä  rå  ræ  rç  rè  ré  rê  rë  rì  Úservice_installedÚservice_runningÚsupports_systemdÚsupports_service_managerr”  ÚlineÚsvc_nameÚinstalled_scopeÚdid_installrð  s+                                              r   Úsetup_gatewayr  ñ  s  € åÐ&Ñ'Ô'Ð'ÝÐRÑSÔSÐSÝÐ7Ñ8Ô8Ð8Ý	�G„G€Gð €EØ€LÝ%.Õ/AÑ%BÔ%Bð #ð #Ñ!ˆÑ!ˆD�'˜5å�]¨7Ñ3Ô3Ñ4Ô4ˆØ�8ÒÐ MÐÝ ¥Ð/@Ñ!AÔ!AÑBÔBˆMØ+8ÐB�4Ð'Ð'Ð'Ð'¸dˆØ�Š�UÑÔÐØð 	#Ø×Ò Ñ"Ô"Ð"øåÐ @À%ÈÑVÔV€Hàð ÝÐZÑ[Ô[Ð[Øˆàð ð ˆÝ%7¸Ô%<Ñ"ˆˆh˜
Øˆ
‰Œˆˆõ 	Ð*Ñ+Ô+ð 	,ÝÐ,Ñ-Ô-ð	,åÐ*Ñ+Ô+ð	,õ Ð*Ñ+Ô+ð	,õ ˜Ñ)Ô)ð		,õ
 Ð-Ñ.Ô.ð	,õ Ð+Ñ,Ô,ð	,õ Ð.Ñ/Ô/ð	,õ Ð*Ñ+Ô+ð	,õ Ð+Ñ,Ô,ð	,õ Ð-Ñ.Ô.ð	,õ ˜Ñ)Ô)ð	,õ ˜Ñ(Ô(ð	,õ Ð,Ñ-Ô-ð	,õ Ð1Ñ2Ô2ð	,õ ˜Ñ%Ô%ð	,õ  Ð*Ñ+Ô+ð# ð& ñ RÝ‰ŒˆÝ�:ÑÔÐÝÐ7Ñ8Ô8Ð8ð ˆÝÐ-Ñ.Ô.ð 	,µ}Ø#ñ8
ô 8
ð 	,ð ×Ò 
Ñ+Ô+Ð+ÝÐ,Ñ-Ô-ð 	+µmØ"ñ7
ô 7
ð 	+ð ×Ò 	Ñ*Ô*Ð*ÝÐ*Ñ+Ô+ð 	)µMÐBVÑ4WÔ4Wð 	)Ø×Ò Ñ(Ô(Ð(ÝÐ1Ñ2Ô2ð 	/½=ÐIcÑ;dÔ;dð 	/Ø×Ò Ñ.Ô.Ð.Ý˜Ñ%Ô%ð 	)ÝÐ.Ñ/Ô/ð	)Ý3@ÐARÑ3SÔ3Sð	)ð ×Ò Ñ(Ô(Ð(àð 		Ý‰GŒGˆGÝÐO°d·i²iÀÑ6MÔ6MÐOÐOÑPÔPÐPÝÐPÑQÔQÐQÝÐKÑLÔLÐLÝÐJÑKÔKÐKØ$ð ð �ÝØV¨d¯jªj©l¬lÐVÐVÐVñô ð ð ð
 	%Ð$Ð$Ð$à×$Ò$Ñ&Ô&¨'Ò1ˆ	Ø×$Ò$Ñ&Ô&¨(Ò2ˆ	ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð" 2Ð1Ñ3Ô3ÐØ-Ð-Ñ/Ô/ˆØ4Ð4Ñ6Ô6ÐØ#3Ð#@°yÐ å‰ŒˆØð 	Ð =Ð =Ñ ?Ô ?ð 	Ø0Ð0Ñ2Ô2Ð2Ý‰GŒGˆGàð 	Ð 7Ð 7Ñ 9Ô 9ð 	Ø%Ð%Ñ'Ô'Ð'Ý‰GŒGˆGàð H	QÝÐHÈ$ÑOÔOð :ð
:Ø'ð *Ø'˜Ñ)Ô)Ð)Ð)Ø"ð *Ø'˜Ñ)Ô)Ð)ùøØ2ð +ð +ð +ÝÐ RÑSÔSÐSÝ # A¡¤× 1Ò 1Ñ 3Ô 3ð +ð +˜Ý˜k 4˜k˜kÑ*Ô*Ð*Ð*ð+ð +ð +ð +ñ +øøøøå ð :ð :ð :ÝÐ 8°QÐ 8Ð 8Ñ9Ô9Ð9Ð9Ð9Ð9Ð9Ñ9øøøøð:øøøñ:ð ð ;	QÝÐ;¸TÑBÔBð 8ð
8Ø'ð (Ø%˜™œ˜˜Ø"ð (Ø%˜™œ˜ùøØ2ð +ð +ð +ÝÐ PÑQÔQÐQÝ # A¡¤× 1Ò 1Ñ 3Ô 3ð +ð +˜Ý˜k 4˜k˜kÑ*Ô*Ð*Ð*ð+ð +ð +ð +ñ +øøøøå ð 8ð 8ð 8ÝÐ 6°1Ð 6Ð 6Ñ7Ô7Ð7Ð7Ð7Ð7Ð7Ñ7øøøøð8øøøñ8ð &ñ .	QØ$4ÐC�y�y¸)ˆHÝØf¨hÐfÐfÐfØñô ñ  FðQØ&*�OØ"'�KØ'ð +Ø7WÐ7WÐ^cÐ7dÑ7dÔ7dÑ4˜¨¨à'˜¨eÐ4Ñ4Ô4Ð4Ø&*˜Ý‘G”G�GØ"ð @¥}Ð5OÐQUÑ'VÔ'Vð @ð
@Ø/ð 0Ø - °_ÈÒ5PÐ QÑ QÔ QÐ QÐ QØ!*ð 0Ø - ¡¤ øøØ:ð 3ð 3ð 3Ý'Ð(XÑYÔYÐYÝ(+¨A©¬×(9Ò(9Ñ(;Ô(;ð 3ð 3 Ý % k¨4 k kÑ 2Ô 2Ð 2Ð 2ð3ð 3ð 3ð 3ð 3øøøøå(ð @ð @ð @Ý'Ð(>¸1Ð(>Ð(>Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?øøøøð@øøøøøå ð Qð Qð QÝÐ 8°QÐ 8Ð 8Ñ9Ô9Ð9ÝÐOÑPÔPÐPÐPÐPÐPÐPÐPøøøøðQøøøõ ÐLÑMÔMÐMØ#ð dÝÐbÑcÔcÐcÝÐDÑEÔEÐEÐEà5Ð5Ð5Ð5Ð5Ð5Øˆ|‰~Œ~ð 	QÝÐIÑJÔJÐJÝÐ[Ñ\Ô\Ð\Ý˜2‘”�ÝÐQÑRÔRÐRÝÐGÑHÔHÐHÝÐLÑMÔMÐMÐMåÐIÑJÔJÐJÝÐOÑPÔPÐPå�:ÑÔÐÐÐðeRð Rs    Ó S ÓUÓ AT+Ô+UÔ8UÕUÕ-V ÖXÖAW×X×%W=×=XØ&A\ Ù+Z Ú
\ Ú\ÚA[Û\ Û\Û'[>Û9\ Û>\Ü\ Ü
\<Ü!\7Ü7\<Úfirst_installc                 ó,   — ddl m}  ||| ¬¦  «         dS )u„  Configure tools â€” delegates to the unified tools_command() in tools_config.py.

    Both `hermes setup tools` and `hermes tools` use the same flow:
    platform selection â†’ toolset toggles â†’ provider/API key configuration.

    Args:
        first_install: When True, uses the simplified first-install flow
            (no platform menu, prompts for all unconfigured API keys).
    r   )Útools_command)r  r   N)Úhermes_cli.tools_configr  )r   r  r  s      r   Úsetup_toolsr
  ½	  s1   € ð 6Ð5Ð5Ð5Ð5Ð5à€M °fÐ=Ñ=Ô=Ð=Ð=Ð=r   c                 ó„  — 	 ddl m}  |¦   «         rdS n# t          $ r Y nw xY w	 ddl m} n# t          $ r i }Y nw xY wdt          fd„}t          | t          ¦  «        r|                      d¦  «        nd}t          |t          ¦  «        ro|                     d	¦  «        pd
                     ¦   «          	                    ¦   «         }||v r |||         ¦  «        rdS |dk    rdD ]}t          |¦  «        r dS ŒdD ]}t          |¦  «        r dS Œ|                     ¦   «         D ]\  }}|dk    rŒ ||¦  «        r dS ŒdS )u  Return True when any known inference provider has usable credentials.

    Sources of truth:
      * ``PROVIDER_REGISTRY`` in ``hermes_cli.auth`` â€” lists every supported
        provider along with its ``api_key_env_vars``.
      * ``active_provider`` in the auth store â€” covers OAuth device-code /
        external-OAuth providers (Nous, Codex, Qwen, Gemini CLI, ...).
      * The legacy OpenRouter aggregator env vars, which route generic
        ``OPENAI_API_KEY`` / ``OPENROUTER_API_KEY`` values through OpenRouter.
    r   ©Úget_active_providerTr&   r   c                 óL   — | j         D ]}|dk    rŒ	t          |¦  «        r dS ŒdS )NÚCLAUDE_CODE_OAUTH_TOKENTF)Úapi_key_env_varsrX   )r,   ró  s     r   Ú_has_keyz0_model_section_has_credentials.<locals>._has_keyè	  sF   € ØÔ/ð 	ð 	ˆGð Ð3Ò3Ð3ØÝ˜WÑ%Ô%ð Ø�t�tðàˆur   r   Nr   rJ   r%   )r¹   rÊ   r;   F)r*   r  rl   r'   rj   r   r   r   r   rK   rX   rŸ   )	r   r  r'   r  Ú	model_cfgÚprovider_idró  Úpidr,   s	            r   Ú_model_section_has_credentialsr  Ñ	  s÷  € ðØ7Ð7Ð7Ð7Ð7Ð7ØÐÑ Ô ð 	Ø�4ð	øåð ð ð ØˆðøøøðØ5Ð5Ð5Ð5Ð5Ð5Ð5øÝð ð ð ØÐÐÐðøøøð�Tð ð ð ð õ (2°&½$Ñ'?Ô'?ÐI�—
’
˜7Ñ#Ô#Ð#ÀT€IÝ�)�TÑ"Ô"ð  Ø —}’} ZÑ0Ô0Ð6°B×=Ò=Ñ?Ô?×EÒEÑGÔGˆØÐ+Ð+Ð+ØˆxÐ)¨+Ô6Ñ7Ô7ð Ø�tØ˜,Ò&Ð&ØCð  ð  �Ý  Ñ)Ô)ð  Ø˜4˜4ð ð <ð ð ˆÝ˜Ñ!Ô!ð 	Ø�4�4ð	ð *×/Ò/Ñ1Ô1ð ð ‰ˆˆWð �)ÒÐØØˆ8�GÑÔð 	Ø�4�4ð	àˆ5s   ‚ •
"¡"¦- ­<»<r  c                 óf   — |                       dd¦  «        d                              ¦   «         }|p| S )zFStrip trailing parenthetical qualifiers from a gateway platform label.ú(rw   r   )rI  r   )r  Úbases     r   Ú_gateway_platform_short_labelr  
  s0   € à�;Š;�s˜AÑÔ˜qÔ!×'Ò'Ñ)Ô)€DØˆ=�5Ðr   Úsection_keyc                 óÆ  — |dk    r³t          | ¦  «        sdS |                      d¦  «        }t          |t          ¦  «        r(|                     ¦   «         r|                     ¦   «         S t          |t
          ¦  «        r9t          |                     d¦  «        p|                     d¦  «        pd¦  «        S dS |dk    r/|                      di ¦  «                             dd¦  «        }d|› �S |d	k    r/|                      d	i ¦  «                             d
d¦  «        }d|› �S |dk    r*d„ t          D ¦   «         }|rd                     |¦  «        S dS |dk    r‡g }t          d¦  «        r| 	                    d¦  «         t          d¦  «        r| 	                    d¦  «         t          d¦  «        r| 	                    d¦  «         |rd                     |¦  «        S dS dS )a)  Return a short summary if a setup section is already configured, else None.

    Used after OpenClaw migration to detect which sections can be skipped.
    ``get_env_value`` is the module-level import from hermes_cli.config
    so that test patches on ``setup_mod.get_env_value`` take effect.
    r   Nr   Ú
configuredrÓ   rÔ   r¯  z	backend: rH   r  r  zmax turns: Úgatewayc                 óR   — g | ]$\  }}}t          |¦  «        ¯t          |¦  «        ‘Œ%S rá   )rX   r  )râ   r  ró  rã   s       r   rè   z/_get_section_config_summary.<locals>.<listcomp>/
  sD   € ð 
ð 
ð 
á!��w Ý˜WÑ%Ô%ð
Ý)¨%Ñ0Ô0ð
ð 
ð 
r   rª   r©   rÇ   zTTS/ElevenLabsÚBROWSERBASE_API_KEYÚBrowserÚFIRECRAWL_API_KEYÚ	Firecrawl)
r  r   r   r   r   r   rñ  r²   rX   rð   )r   r  r   rÔ   r  Ú	platformsr©   s          r   Ú_get_section_config_summaryr$  
  s  € ð �gÒÐÝ-¨fÑ5Ô5ð 	Ø�4Ø—
’
˜7Ñ#Ô#ˆÝ�e�SÑ!Ô!ð 	! e§k¢k¡m¤mð 	!Ø—;’;‘=”=Ð Ý�e�TÑ"Ô"ð 	SÝ�u—y’y Ñ+Ô+ÐQ¨u¯yªy¸Ñ/AÔ/AÐQÀ\ÑRÔRÐRØˆ|à	˜
Ò	"Ð	"Ø—*’*˜Z¨Ñ,Ô,×0Ò0°¸GÑDÔDˆØ$˜7Ð$Ð$Ð$à	˜Ò	Ð	Ø—J’J˜w¨Ñ+Ô+×/Ò/°¸RÑ@Ô@ˆ	Ø(˜YÐ(Ð(Ð(à	˜	Ò	!Ð	!ð
ð 
å%7ð
ñ 
ô 
ˆ	ð
 ð 	(Ø—9’9˜YÑ'Ô'Ð'Øˆtà	˜Ò	Ð	ØˆÝÐ-Ñ.Ô.ð 	+Ø�LŠLÐ)Ñ*Ô*Ð*ÝÐ.Ñ/Ô/ð 	$Ø�LŠL˜Ñ#Ô#Ð#ÝÐ,Ñ-Ô-ð 	&Ø�LŠL˜Ñ%Ô%Ð%Øð 	$Ø—9’9˜UÑ#Ô#Ð#Øˆtàˆ4r   c                 óÀ   — t          | |¦  «        }|sdS t          ¦   «          t          d|› d|› �¦  «         t          d|                     ¦   «         › d�d¬¦  «         S )z�Show an already-configured section summary and offer to skip.

    Returns True if the user chose to skip, False if the section should run.
    Fr‹   rv   z  Reconfigure ú?©r   )r$  r^   rd   rž   rK   )r   r  r  Úsummarys       r   Ú_skip_configured_sectionr)  G
  sr   € õ *¨&°+Ñ>Ô>€GØð ØˆuÝ	�G„G€GÝÐ)�uÐ)Ð) Ð)Ð)Ñ*Ô*Ð*ÝÐ>¨e¯kªk©m¬mÐ>Ð>Ð>ÈÐNÑNÔNÐNÐNr   zoptional-skillsÚ	migrationzopenclaw-migrationÚscriptszopenclaw_to_hermes.pyc                  ó–  — t                                ¦   «         sdS t          j                             dt           ¦  «        } | �| j        €dS t          j                             | ¦  «        }ddl}||j        | j	        <   	 | j         
                    |¦  «         n/# t          $ r" |j                             | j	        d¦  «         ‚ w xY w|S )z…Load the openclaw_to_hermes migration script as a module.

    Returns the loaded module, or None if the script can't be loaded.
    NÚopenclaw_to_hermesr   )Ú_OPENCLAW_SCRIPTÚexistsr  rû   Úspec_from_file_locationÚloaderÚmodule_from_specri   Úmodulesr­   Úexec_modulerl   rT  )ÚspecÚmodÚ_syss      r   Ú_load_openclaw_migration_moduler8  d
  sÛ   € õ
 ×"Ò"Ñ$Ô$ð ØˆtåŒ>×1Ò1ØÕ.ñô €Dð €|�t”{Ð*Øˆtå
Œ.×
)Ò
)¨$Ñ
/Ô
/€Cð ÐÐÐØ!€D„L�”ÑðØŒ×Ò Ñ$Ô$Ð$Ð$øÝð ð ð ØŒ×Ò˜œ DÑ)Ô)Ð)Øðøøøð €Js   Á?B Â,Cu\   âš  Gateway/messaging â€” this will configure Hermes to use your OpenClaw messaging channelsuE   âš  Telegram â€” this will point Hermes at your OpenClaw Telegram botuE   âš  Slack â€” this will point Hermes at your OpenClaw Slack workspaceuC   âš  Discord â€” this will point Hermes at your OpenClaw Discord botuL   âš  WhatsApp â€” this will point Hermes at your OpenClaw WhatsApp connectionuM   âš  Config values â€” OpenClaw settings may not map 1:1 to Hermes equivalentsuO   âš  Instruction file â€” may contain OpenClaw-specific setup/restart proceduresuJ   âš  Memory/context file â€” may reference OpenClaw-specific infrastructureu?   âš  Context file â€” may contain OpenClaw-specific instructions)	r  ÚtelegramÚslackÚdiscordÚwhatsappr   ÚsoulÚmemoryÚcontextÚreportc                 ó4  — |                       dg ¦  «        }|st          d¦  «         dS d„ |D ¦   «         }d„ |D ¦   «         }d„ |D ¦   «         }t          ¦   «         }|�rEt          t	          dt
          j        ¦  «        ¦  «         |D �]}|                      dd	¦  «        }|                      d
d¦  «        }|rXt          |¦  «                             t          t          j
        ¦   «         ¦  «        d¦  «        }	t          d|d›d|	› �¦  «         nt          d|› �¦  «         |                     ¦   «         }
t          |¦  «                             ¦   «         }t                               ¦   «         D ]"\  }}||
v s||v r|                     |¦  «         Œ#�Œt          ¦   «          |r|t          t	          dt
          j        ¦  «        ¦  «         |D ]D}|                      dd	¦  «        }|                      dd¦  «        }t          d|d›d|› �¦  «         ŒEt          ¦   «          |r|t          t	          dt
          j        ¦  «        ¦  «         |D ]D}|                      dd	¦  «        }|                      dd¦  «        }t          d|d›d|› �¦  «         ŒEt          ¦   «          |röt          t	          dt
          j        ¦  «        ¦  «         t#          |¦  «        D ],}t          t	          d|› �t
          j        ¦  «        ¦  «         Œ-t          ¦   «          t          t	          dt
          j        ¦  «        ¦  «         t          t	          dt
          j        ¦  «        ¦  «         t          t	          dt
          j        ¦  «        ¦  «         t          ¦   «          dS dS )zÐPrint a detailed dry-run preview of what migration would do.

    Groups items by category and adds explicit warnings for high-impact
    changes like gateway token takeover and config value differences.
    rŸ   zNothing to migrate.Nc                 óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS )ÚstatusÚmigrated©r   ©râ   r”   s     r   rè   z,_print_migration_preview.<locals>.<listcomp>›
  ó,   € ÐHÐHÐH˜A¨!¯%ª%°©/¬/¸ZÒ*GÐ*G�aÐ*GÐ*GÐ*Gr   c                 óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS )rC  ÚconflictrE  rF  s     r   rè   z,_print_migration_preview.<locals>.<listcomp>œ
  rG  r   c                 óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS )rC  ÚskippedrE  rF  s     r   rè   z,_print_migration_preview.<locals>.<listcomp>�
  s,   € ÐFÐFÐF˜1¨¯ª¨x©¬¸IÒ)EÐ)E�QÐ)EÐ)EÐ)Er   z  Would import:ÚkindÚunknownÚdestinationrJ   Ú~rí   z<22sõ    â†’ z:  Would overwrite (conflicts with existing Hermes config):rn   zalready existsr‹   z  Would skip:u     â”€â”€ Warnings â”€â”€z    zF  Note: OpenClaw config values may have different semantics in Hermes.uM     For example, OpenClaw's tool_call_execution: "auto" â‰  Hermes's yolo mode.zL  Instruction files (.md) from OpenClaw may contain incompatible procedures.)r   rc   r£   r^   r[   rZ   rŽ   r   rF  r   rÜ  rK   Ú_HIGH_IMPACT_KIND_KEYWORDSrŸ   Úaddry   r�   r¤   )r@  rŸ   Úmigrated_itemsÚconflict_itemsÚskipped_itemsÚwarnings_shownÚitemrL  ÚdestÚ
dest_shortÚ
kind_lowerÚ
dest_lowerÚkeywordÚwarningrn   s                  r   Ú_print_migration_previewr^  �
  sœ  € ð �JŠJ�w Ñ#Ô#€EØð ÝÐ(Ñ)Ô)Ð)ØˆàHÐH ÐHÑHÔH€NØHÐH ÐHÑHÔH€NØFÐF ÐFÑFÔF€Må‘U”U€Nàñ Ý�eÐ%¥v¤|Ñ4Ô4Ñ5Ô5Ð5Ø"ð 	0ñ 	0ˆDØ—8’8˜F IÑ.Ô.ˆDØ—8’8˜M¨2Ñ.Ô.ˆDØð 'Ý  ™YœY×.Ò.­sµ4´9±;´;Ñ/?Ô/?ÀÑEÔE�
ÝÐ;˜tÐ;Ð;Ð;¨zÐ;Ð;Ñ<Ô<Ð<Ð<å�o˜t�o�oÑ&Ô&Ð&ð Ÿš™œˆJÝ˜T™œŸšÑ*Ô*ˆJÝ$>×$DÒ$DÑ$FÔ$Fð 0ð 0Ñ �˜Ø˜jÐ(Ð(¨G°zÐ,AÐ,AØ"×&Ò& wÑ/Ô/Ð/øñ0õ 	‰Œˆàð Ý�eÐPÕRXÔR_Ñ`Ô`ÑaÔaÐaØ"ð 	2ð 	2ˆDØ—8’8˜F IÑ.Ô.ˆDØ—X’X˜hÐ(8Ñ9Ô9ˆFÝÐ0˜4Ð0Ð0Ð0¨Ð0Ð0Ñ1Ô1Ð1Ð1Ý‰Œˆàð Ý�e�O¥V¤ZÑ0Ô0Ñ1Ô1Ð1Ø!ð 	2ð 	2ˆDØ—8’8˜F IÑ.Ô.ˆDØ—X’X˜h¨Ñ+Ô+ˆFÝÐ0˜4Ð0Ð0Ð0¨Ð0Ð0Ñ1Ô1Ð1Ð1Ý‰Œˆð ð Ý�eÐ.µ´Ñ>Ô>Ñ?Ô?Ð?Ý˜nÑ-Ô-ð 	:ð 	:ˆGÝ•%Ð(˜wÐ(Ð(­&¬-Ñ8Ô8Ñ9Ô9Ð9Ð9Ý‰ŒˆÝ�eÐ\Õ^dÔ^kÑlÔlÑmÔmÐmÝ�eÐeÕgmÔgtÑuÔuÑvÔvÐvÝ�eÐbÕdjÔdqÑrÔrÑsÔsÐsÝ‰Œˆˆˆðð r   r  c                 ó	  — t          j        ¦   «         dz  }|                     ¦   «         sdS t                               ¦   «         sdS t          ¦   «          t          d¦  «         t          d|› �¦  «         t          d¦  «         t          ¦   «          t          dd¬¦  «        st          d	¦  «         dS t          ¦   «         }|                     ¦   «         st          t          ¦   «         ¦  «         	 t          ¦   «         }|€t          d¦  «         dS nF# t          $ r9}t          d|› �¦  «         t                               dd¬¦  «         Y d
}~dS d
}~ww xY w	 |                     d
d
d¬¦  «        }|                     |                     ¦   «         |                      ¦   «         dd
ddd
|d¬¦	  «	        }|                     ¦   «         }nF# t          $ r9}t          d|› �¦  «         t                               dd¬¦  «         Y d
}~dS d
}~ww xY w|                     di ¦  «        }|                     dd¦  «        }	|	dk    rt          ¦   «          t          d¦  «         dS t          ¦   «          t          d|	› d�¦  «         t          d¦  «         t          ¦   «          t-          |¦  «         t          dd¬¦  «        s t          d¦  «         t          d¦  «         dS 	 |                     |                     ¦   «         |                      ¦   «         dd
ddd
|d¬¦	  «	        }
|
                     ¦   «         }nF# t          $ r9}t          d|› �¦  «         t                               dd¬¦  «         Y d
}~dS d
}~ww xY w|                     di ¦  «        }|                     dd¦  «        }|                     d d¦  «        }|                     d!d¦  «        }|                     d"d¦  «        }t          ¦   «          |rt/          d#|› d$�¦  «         |rt          d%|› d&�¦  «         |rt          d%|› d'�¦  «         |rt          |› d(�¦  «         |                     d)¦  «        }|rt          d*|› �¦  «         t/          d+¦  «         dS ),a  Detect ~/.openclaw and offer to migrate during first-time setup.

    Runs a dry-run first to show the user exactly what would be imported,
    overwritten, or taken over. Only executes after explicit confirmation.

    Returns True if migration ran successfully, False otherwise.
    z	.openclawFzOpenClaw Installation DetectedzFound OpenClaw data at zDHermes can preview what would be imported before making any changes.z+Would you like to see what can be imported?Tr'  zLSkipping migration. You can run it later with: hermes claw migrate --dry-runNz Could not load migration script.z!Could not load migration script: z$OpenClaw migration module load error)Úexc_infoÚfull)Úpreset)	Úsource_rootÚtarget_rootÚexecuteÚworkspace_targetÚ	overwriteÚmigrate_secretsÚ
output_dirÚselected_optionsÚpreset_namezMigration preview failed: z OpenClaw migration preview errorr(  rD  r   z Nothing to import from OpenClaw.u   Migration Preview â€” z item(s) would be importedz5No changes have been made yet. Review the list below:zProceed with migration?zCMigration cancelled. You can run it later with: hermes claw migratezIUse --dry-run to preview again, or --preset minimal for a lighter import.zMigration failed: zOpenClaw migration errorrK  rI  Úerrorz	Imported z item(s) from OpenClaw.zSkipped zU item(s) that already exist in Hermes (use hermes claw migrate --overwrite to force).z" item(s) (not found or unchanged).u3    item(s) had errors â€” check the migration report.ri  zFull report saved to: z,Migration complete! Continuing with setup...)r   rÜ  Úis_dirr.  r/  r^   ra   rc   rž   rS   rV   rU   r8  re   rl   rR  rS  Úresolve_selected_optionsÚMigratorÚresolveÚmigrater   r^  rd   )r  Úopenclaw_dirÚconfig_pathr6  r”  r†   Údry_migratorÚpreview_reportÚpreview_summaryÚpreview_countÚmigratorr@  r(  rD  rK  Ú	conflictsÚerrorsri  s                     r   Ú_offer_openclaw_migrationr{  Ð
  s4  € õ ”9‘;”; Ñ,€LØ×ÒÑ Ô ð Øˆuå×"Ò"Ñ$Ô$ð Øˆuå	�G„G€GÝÐ1Ñ2Ô2Ð2ÝÐ7¨Ð7Ð7Ñ8Ô8Ð8ÝÐUÑVÔVÐVÝ	�G„G€GåÐFÐPTÐUÑUÔUð ÝØZñ	
ô 	
ð 	
ð ˆuõ "Ñ#Ô#€KØ×ÒÑÔð #Ý•K‘M”MÑ"Ô"Ð"ðÝ-Ñ/Ô/ˆØˆ;ÝÐ<Ñ=Ô=Ð=Ø�5ð øõ ð ð ð ÝÐ=¸!Ð=Ð=Ñ>Ô>Ð>Ý�ŠÐ;ÀdˆÑKÔKÐKØˆuˆuˆuˆuˆuøøøøðøøøðØ×/Ò/°°dÀ6Ð/ÑJÔJˆØ—|’|Ø$×,Ò,Ñ.Ô.Ø#×+Ò+Ñ-Ô-ØØ!ØØ ØØ%Øð $ñ 

ô 

ˆð &×-Ò-Ñ/Ô/ˆˆøÝð ð ð ÝÐ6°1Ð6Ð6Ñ7Ô7Ð7Ý�ŠÐ7À$ˆÑGÔGÐGØˆuˆuˆuˆuˆuøøøøðøøøð %×(Ò(¨°BÑ7Ô7€OØ#×'Ò'¨
°AÑ6Ô6€Mà˜ÒÐÝ‰ŒˆÝÐ5Ñ6Ô6Ð6Øˆuå	�G„G€GÝÐS¨-ÐSÐSÐSÑTÔTÐTÝÐFÑGÔGÐGÝ	�G„G€GÝ˜^Ñ,Ô,Ð,õ Ð2¸EÐBÑBÔBð ÝØQñ	
ô 	
ð 	
õ 	ØWñ	
ô 	
ð 	
ð ˆuðØ—<’<Ø$×,Ò,Ñ.Ô.Ø#×+Ò+Ñ-Ô-ØØ!ØØ ØØ%Øð  ñ 

ô 

ˆð ×!Ò!Ñ#Ô#ˆˆøÝð ð ð ÝÐ.¨1Ð.Ð.Ñ/Ô/Ð/Ý�ŠÐ/¸$ˆÑ?Ô?Ð?Øˆuˆuˆuˆuˆuøøøøðøøøð �jŠj˜ BÑ'Ô'€GØ�{Š{˜: qÑ)Ô)€HØ�kŠk˜) QÑ'Ô'€GØ—’˜J¨Ñ*Ô*€IØ�[Š[˜ !Ñ$Ô$€Få	�G„G€GØð EÝÐC (ÐCÐCÐCÑDÔDÐDØð @ÝÐ~˜iÐ~Ð~Ð~ÑÔÐØð KÝÐI˜gÐIÐIÐIÑJÔJÐJØð VÝ˜ÐTÐTÐTÑUÔUÐUà—’˜LÑ)Ô)€JØð :ÝÐ8¨JÐ8Ð8Ñ9Ô9Ð9åÐ@ÑAÔAÐAØˆ4sJ   Ã4D Ä
EÄ .EÅEÅA.G Ç
HÇ.H
È
HË"AL9 Ì9
M<Í.M7Í7M<r   úModel & ProviderrÄ   zText-to-SpeechrÓ   r®  r  zMessaging Platforms (Gateway)r©   ÚToolsrH   r   c                 ó|  — ddl m}m}  |¦   «         r |d¦  «         dS t          ¦   «          t	          t          | dd¦  «        ¦  «        }|r5t          t          j        t          ¦  «        ¦  «         t          d¦  «         t	          t          | dd¦  «        ¦  «        }t	          t          | d	d¦  «        ¦  «        }t          ¦   «         }t          ¦   «         }t          | d
d¦  «        }|st          ¦   «         sd}|rt          d¦  «         dS t          | dd¦  «        }	|	�r!t          D ]Ñ\  }
}}|
|	k    rÅt!          ¦   «          t!          t#          dt$          j        ¦  «        ¦  «         t!          t#          d|d›d�t$          j        ¦  «        ¦  «         t!          t#          dt$          j        ¦  «        ¦  «          ||¦  «         t          |¦  «         t!          ¦   «          t          |› d�¦  «          dS ŒÒt)          d|	› �¦  «         t+          dd                     d„ t          D ¦   «         ¦  «        › �¦  «         dS ddlm}  |¦   «         }t	          t3          d¦  «        ¦  «        pt	          t3          d¦  «        ¦  «        p|du}t!          ¦   «          t!          t#          dt$          j        ¦  «        ¦  «         t!          t#          dt$          j        ¦  «        ¦  «         t!          t#          dt$          j        ¦  «        ¦  «         t!          t#          dt$          j        ¦  «        ¦  «         t!          t#          dt$          j        ¦  «        ¦  «         t!          t#          dt$          j        ¦  «        ¦  «         d}|rŒ|rt5          ||¦  «         dS t!          ¦   «          t7          d¦  «         t          d ¦  «         t+          d!¦  «         t+          d"¦  «         t+          d#¦  «         t+          d$¦  «         t+          d%¦  «         nzt!          ¦   «          |s|rt+          d&¦  «         t!          ¦   «          t9          |¦  «        }|rt          ¦   «         }t;          d'd(d)gd¦  «        }|dk    rt=          |||¦  «         dS t7          d*¦  «         t+          d+t?          ¦   «         › �¦  «         t+          d,tA          ¦   «         › �¦  «         t+          d-|› �¦  «         t+          d.tB          › �¦  «         t!          ¦   «          t+          d/¦  «         |r;t!          ¦   «          t+          d0¦  «         t+          d1¦  «         t+          d2¦  «         |rtE          |d3d4¦  «        stG          |¦  «         |rtE          |d5d6¦  «        stI          |¦  «         |rtE          |d7d8¦  «        stK          |¦  «         |rtE          |d9d:¦  «        stM          |¦  «         |rtE          |d;d<¦  «        stO          || ¬=¦  «         t          |¦  «         tQ          ||¦  «         tS          ¦   «          dS )>uå  Run the interactive setup wizard.

    Supports full, quick, and section-specific setup:
      hermes setup           â€” full or quick (auto-detected)
      hermes setup model     â€” just model/provider
      hermes setup tts       â€” just text-to-speech
      hermes setup terminal  â€” just terminal backend
      hermes setup gateway   â€” just messaging platforms
      hermes setup tools     â€” just tool configuration
      hermes setup agent     â€” just agent settings
    r   )Ú
is_managedÚmanaged_errorzrun setup wizardNÚresetFz Configuration reset to defaults.Úreconfigurer+  Únon_interactiveTz;Running in a non-interactive environment (no TTY detected).Úsectionrë   u   â”‚     âš• Hermes Setup â€” z<34su    â”‚rì   z configuration complete!zUnknown setup section: zAvailable sections: rª   c              3   ó"   K  — | ]
\  }}}|V — Œd S ©Nrá   )râ   Úkrã   s      r   rå   z#run_setup_wizard.<locals>.<genexpr>¥  s(   è è € Ð3TÐ3T¹'¸!¸QÀ°AÐ3TÐ3TÐ3TÐ3TÐ3TÐ3Tr   r  r¹   ÚOPENAI_BASE_URLu@   â”‚             âš• Hermes Agent Setup Wizard                â”‚u±   â”œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”¤u>   â”‚  Let's configure your Hermes Agent installation.       â”‚u>   â”‚  Press Ctrl+C at any time to exit.                     â”‚ÚReconfigurez#You already have Hermes configured.uA   Running the full wizard â€” each prompt shows your current value.z9Press Enter to keep it, or type a new value to change it.rJ   zBTip: jump straight to a section with 'hermes setup model|terminal|zC     gateway|tools|agent', or fill only missing items with --quick.u=   No existing configuration found â€” running first-time setup.z$How would you like to set up Hermes?u9   Quick setup â€” provider, model & messaging (recommended)u#   Full setup â€” configure everythingzConfiguration LocationzConfig file:  zSecrets file: zData folder:  zInstall dir:  z=You can edit these files directly or use 'hermes config edit'z%Settings were imported from OpenClaw.uG   Each section below will show what was imported â€” press Enter to keep,z#or choose to reconfigure if needed.r   r|  rÓ   r®  rH   r   r  rØ  r©   r}  )r  )*rN  r  r€  rY   rj   rh   rV   ÚcopyÚdeepcopyrQ   rd   rU   rR   rm   rp   ÚSETUP_SECTIONSr^   r[   rZ   ÚMAGENTArb   rc   r²   r*   r  rX   Ú_run_quick_setupra   r{  r—   Ú_run_first_time_quick_setuprS   rT   ÚPROJECT_ROOTr)  rw  r  r9  r  r
  r  Ú_offer_launch_chat)Úargsr  r€  Úreset_requestedÚreconfigure_requestedÚquick_requestedr   r  rƒ  r„  Úkeyr  Úfuncr  Úactive_providerÚis_existingÚmigration_ranÚ
setup_modes                     r   Úrun_setup_wizardrœ  c  s  € ð <Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ø€z�|„|ð ØˆÐ(Ñ)Ô)Ð)ØˆÝÑÔÐå�7 4¨°%Ñ8Ô8Ñ9Ô9€OØð :Ý•D”M¥.Ñ1Ô1Ñ2Ô2Ð2ÝÐ8Ñ9Ô9Ð9å ¥¨¨}¸eÑ!DÔ!DÑEÔEÐÝ�7 4¨°%Ñ8Ô8Ñ9Ô9€Oå‰]Œ]€FÝ!Ñ#Ô#€Kõ ˜dÐ$5°uÑ=Ô=€OØð Õ#7Ñ#9Ô#9ð Øˆàð Ý+ØIñ	
ô 	
ð 	
ð 	ˆõ �d˜I tÑ,Ô,€GØñ Ý .ð 	ð 	ÑˆC�˜Ø�gŠ~ˆ~Ý‘”�ÝÝð LÝœñô ñô ð õ •eÐL¸EÐLÐLÐLÐLÍfÌnÑ]Ô]Ñ^Ô^Ð^ÝÝð LÝœñô ñô ð ð ��V‘”�Ý˜FÑ#Ô#Ð#Ý‘”�Ý Ð@Ð@Ð@ÑAÔAÐAØ��ð' õ* 	Ð7¨gÐ7Ð7Ñ8Ô8Ð8ÝÐV¨$¯)ª)Ð3TÐ3TÅ^Ð3TÑ3TÔ3TÑ*TÔ*TÐVÐVÑWÔWÐWØˆð 4Ð3Ð3Ð3Ð3Ð3à)Ð)Ñ+Ô+€Oå�]Ð/Ñ0Ô0Ñ1Ô1ð 	'Ý•Ð/Ñ0Ô0Ñ1Ô1ð	'à $Ð&ð õ 
�G„G€GÝ	Ýð @ÝŒNñ	
ô 	
ñô ð õ 
ÝØNÕPVÔP^ñ	
ô 	
ñô ð õ
 
Ýð @ÝŒNñ	
ô 	
ñô ð õ 
ÝØLÍfÌnñ	
ô 	
ñô ð õ
 
ÝØLÍfÌnñ	
ô 	
ñô ð õ
 
Ýð @ÝŒNñ	
ô 	
ñô ð ð €Màð +ð ð 	Ý˜V [Ñ1Ô1Ð1ØˆFå‰ŒˆÝ�]Ñ#Ô#Ð#ÝÐ;Ñ<Ô<Ð<ÝÐVÑWÔWÐWÝÐNÑOÔOÐOÝ�2‰ŒˆÝÐWÑXÔXÐXÝÐXÑYÔYÐYÐYõ 	‰Œˆð !ð 	 Oð 	ÝÐVÑWÔWÐWÝ‰GŒGˆGõ 2°+Ñ>Ô>ˆØð 	#Ý ‘]”]ˆFå"Ð#IØGØ1ðL
ð ñô ˆ
ð
 ˜Š?ˆ?Ý'¨°¸[ÑIÔIÐIØˆFõ Ð)Ñ*Ô*Ð*ÝÐ3¥Ñ 1Ô 1Ð3Ð3Ñ4Ô4Ð4ÝÐ0¥¡¤Ð0Ð0Ñ1Ô1Ð1ÝÐ- Ð-Ð-Ñ.Ô.Ð.ÝÐ.¥Ð.Ð.Ñ/Ô/Ð/Ý	�G„G€GÝÐNÑOÔOÐOàð :Ý‰ŒˆÝÐ:Ñ;Ô;Ð;ÝÐ\Ñ]Ô]Ð]ÝÐ8Ñ9Ô9Ð9ð ð %Õ6°v¸wÐHZÑ[Ô[ð %Ý˜VÑ$Ô$Ð$ð ð 'Õ6°v¸zÐK]Ñ^Ô^ð 'Ý˜vÑ&Ô&Ð&ð ð %Õ6°v¸wÐHXÑYÔYð %Ý˜VÑ$Ô$Ð$ð ð Õ6°v¸yÐJ_Ñ`Ô`ð Ý�fÑÔÐð ð ;Õ6°v¸wÈÑPÔPð ;Ý�F¨k¨/Ð:Ñ:Ô:Ð:õ �ÑÔÐÝ˜ Ñ-Ô-Ð-åÑÔÐÐÐr   c                  ó¼   — t          j        d¦  «        } | r| dgS 	 t          j                             d¦  «        �t
          j        dddgS n# t          $ r Y nw xY wdS )z>Resolve argv for launching ``hermes chat`` in a fresh process.rî   ÚchatÚ
hermes_cliNrˆ  zhermes_cli.main)r{  r|  r  rû   rü   ri   r’  rl   )Ú
hermes_bins    r   Ú_resolve_hermes_chat_argvr¡  .  s}   € å”˜hÑ'Ô'€JØð $Ø˜FÐ#Ð#ðÝŒ>×#Ò# LÑ1Ô1Ð=Ý”N DÐ*;¸VÐDÐDð >øåð ð ð Øˆðøøøð ˆ4s   œ.A Á
AÁAc                  ó¾   — t          ¦   «          t          dd¦  «        sdS t          ¦   «         } | st          d¦  «         dS t	          j        | d         | ¦  «         dS )z7Prompt the user to jump straight into chat after setup.zLaunch hermes chat now?TNzDCould not relaunch Hermes automatically. Run 'hermes chat' manually.r   )r^   rž   r¡  rc   rä  Úexecvp)Ú	chat_argvs    r   r‘  r‘  =  sf   € å	�G„G€GÝÐ2°DÑ9Ô9ð Øˆå)Ñ+Ô+€IØð ÝÐYÑZÔZÐZØˆå„Iˆi˜Œl˜IÑ&Ô&Ð&Ð&Ð&r   r™  c                 ó8  — t          | d¬¦  «         t          | ¦  «         |                      di ¦  «                             dd¦  «         t          | ¦  «         t	          ¦   «          t          dddgd	¦  «        }|d	k    rt          | ¦  «         t          | ¦  «         t	          ¦   «          t          d
¦  «         t	          ¦   «          t          d¦  «         |d	k    rt          d¦  «         t	          ¦   «          t          | |¦  «         t          ¦   «          dS )uÝ   Streamlined first-time setup: provider + model only.

    Applies sensible defaults for TTS (Edge), terminal (local), agent
    settings, and tools â€” the user can customize later via
    ``hermes setup <section>``.
    Tr*  rÓ   rÔ   r¯  z7Connect a messaging platform? (Telegram, Discord, etc.)z"Set up messaging now (recommended)u1   Skip â€” set up later with 'hermes setup gateway'r   z#Setup complete! You're ready to go.z)  Configure all settings:    hermes setupz1  Connect Telegram/Discord:  hermes setup gatewayN)rw  r  r  rV   r^   r—   r  rd   rc   r  r‘  )r   r  r™  Úgateway_choices       r   r�  r�  K  s&  € õ ˜ tÐ,Ñ,Ô,Ð,õ " &Ñ)Ô)Ð)Ø
×Ò�j "Ñ%Ô%×0Ò0°¸GÑDÔDÐDå�ÑÔÐõ 
�G„G€GÝ"ØAà0Ø?ð	
ð 	
ñô €Nð ˜ÒÐÝ�fÑÔÐÝ�FÑÔÐå	�G„G€GÝÐ7Ñ8Ô8Ð8Ý	�G„G€GÝÐ:Ñ;Ô;Ð;Ø˜ÒÐÝÐFÑGÔGÐGÝ	�G„G€Gå˜ Ñ-Ô-Ð-åÑÔÐÐÐr   c           
      ó  — ddl m}m}m} t	          ¦   «          t          d¦  «         d„  |d¬¦  «        D ¦   «         }d„  |d¬¦  «        D ¦   «         } |¦   «         } |¦   «         \  }}	|p	|p|p||	k     }
|
s=t          d¦  «         t	          ¦   «          t          d	¦  «         t          d
¦  «         dS |�rªt	          ¦   «          t          t          |¦  «        › d�¦  «         |D ]}t	          d|d         › �¦  «         Œt	          ¦   «          |D �]N}t	          ¦   «          t	          t          d|d         › �t          j        ¦  «        ¦  «         t          d|                     dd¦  «        › �¦  «         |                     d¦  «        rt          d|d         › �¦  «         |                     d¦  «        r/t          d|                     d|d         ¦  «        › �d¬¦  «        }n,t          d|                     d|d         ¦  «        › �¦  «        }|r0t          |d         |¦  «         t          d|d         › �¦  «         �Œ6t          d|d         › �¦  «         �ŒPd„ |D ¦   «         }d„ |D ¦   «         }|r½t	          ¦   «          t          d¦  «         g }|D ]o}|                     dg ¦  «        }|r dd                     |dd …         ¦  «        › �nd}|                     |                     d|d         ¦  «        › |› �¦  «         Œpt%          d!|¦  «        }|D ]}||         }t'          |¦  «         Œ|�rJt	          ¦   «          t          d"¦  «         t          d#¦  «         t          d$¦  «         g }i }|D ]b}|d         }d%|v rd&}nd'|v rd(}nd)|v rd*}nŒ ||vr|                     |¦  «         |                     |g ¦  «                             |¦  «         Œcd+„ |D ¦   «         }t%          d,|¦  «        }|D �]†}||         }||         }d-d.d/d0œ                     |d¦  «        }t	          ¦   «          t	          t          d1|› d2|› d3�t          j        ¦  «        ¦  «         t	          ¦   «          |D �]}t          d|                     dd¦  «        › �¦  «         |                     d¦  «        rt          d|d         › �¦  «         |                     d¦  «        r/t          d|                     d|d         ¦  «        › �d¬¦  «        }n,t          d|                     d|d         ¦  «        › �¦  «        }|r&t          |d         |¦  «         t          d4¦  «         nt          d5¦  «         t	          ¦   «          �Œ�Œˆ|rht	          ¦   «          t          d6t          |¦  «        › d7�¦  «         |D ]#}t          d8|d9         › d:|d;         › �¦  «         Œ$|	| d<<   t+          | ¦  «         t-          | |¦  «         dS )=u6   Quick setup â€” only configure items that are missing.r   )Úget_missing_env_varsÚget_missing_config_fieldsÚcheck_config_versionu"   Quick Setup â€” Missing Items Onlyc                 ó<   — g | ]}|                      d ¦  «        ¯|‘ŒS ©Úis_requiredrE  ©râ   Úvs     r   rè   z$_run_quick_setup.<locals>.<listcomp>ƒ  s9   € ð ð ð ØÀÇÂÀmÑ@TÔ@TðØ	ðð ð r   F)Úrequired_onlyc                 ó<   — g | ]}|                      d ¦  «        °|‘ŒS r¬  rE  r®  s     r   rè   z$_run_quick_setup.<locals>.<listcomp>†  s9   € ð ð ð ØÀAÇEÂEÈ-ÑDXÔDXðØ	ðð ð r   z(Everything is configured! Nothing to do.z:Run 'hermes setup' and choose 'Full Setup' to reconfigure,z)or pick a specific section from the menu.Nz required setting(s) missing:u	        â€¢ r­   r‹   r‚   rJ   r¯   z  Get key at: rr   r€   Tr°   z  Saved z
  Skipped c                 óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS )ÚcategoryÚtoolrE  r®  s     r   rè   z$_run_quick_setup.<locals>.<listcomp>µ  s.   € ÐPÐPÐP˜1°A·E²E¸*Ñ4EÔ4EÈÒ4OÐ4O�QÐ4OÐ4OÐ4Or   c                 ón   — g | ]2}|                      d ¦  «        dk    ¯|                      d¦  «        °0|‘Œ3S )r³  Ú	messagingÚadvancedrE  r®  s     r   rè   z$_run_quick_setup.<locals>.<listcomp>¶  sJ   € ð ð ð àØ�5Š5�ÑÔ Ò+Ð+°A·E²E¸*Ñ4EÔ4EÐ+ð 	
à+Ð+Ð+r   zTool API Keysr©   rP  rª   rD  z(Which tools would you like to configure?rØ  z7Connect Hermes to messaging apps to chat from anywhere.z:You can configure these later with 'hermes setup gateway'.ÚTELEGRAMr;  ÚDISCORDrP  ÚSLACKra  c                 óB   — g | ]}d dddœ                      ||¦  «        ‘ŒS )u   ðŸ“± Telegramu   ðŸ’¬ Discordu
   ðŸ’¼ Slack©r;  rP  ra  rE  )râ   Úps     r   rè   z$_run_quick_setup.<locals>.<listcomp>è  sI   € ð 
ð 
ð 
ð ð	 ,Ø)Ø%ðð ÷ Šc�!�Q‰iŒið
ð 
ð 
r   z)Which platforms would you like to set up?u   ðŸ“±u   ðŸ’¬u   ðŸ’¼r¼  r¬   rŒ   r®   r±   z	  SkippedzAdding z& new config option(s) with defaults...z  Added r–  z = r   Ú_config_version)rN  r¨  r©  rª  r^   ra   rd   rc   r�   r[   rZ   r_   r   r€   rW   re   r²   rð   r¦   r´   r  rV   r  )r   r  r¨  r©  rª  Úmissing_requiredÚmissing_optionalÚmissing_configÚcurrent_verÚ
latest_verÚhas_anything_missingr§   r   Úmissing_toolsÚmissing_messagingÚchecklist_labelsr©   r³   Úselected_indicesr“   Úplatform_orderr#  r­   rú  Úplatform_labelsÚ	vars_listÚemojiÚfields                               r   rŽ  rŽ  w  s}  € ðð ð ð ð ð ð ð ð ð õ 
�G„G€GÝÐ5Ñ6Ô6Ð6ðð Ø'Ð'°eÐ<Ñ<Ô<ðñ ô Ððð Ø'Ð'°eÐ<Ñ<Ô<ðñ ô Ðð /Ð.Ñ0Ô0€NØ2Ð2Ñ4Ô4Ñ€K�ð 	ð 	$Øð	$àð	$ð ˜Ò#ð	 ð  ð ÝÐ@ÑAÔAÐAÝ‰ŒˆÝÐOÑPÔPÐPÝÐ>Ñ?Ô?Ð?Øˆð ñ :Ý‰ŒˆÝ•cÐ*Ñ+Ô+ÐJÐJÐJÑKÔKÐKØ#ð 	-ð 	-ˆCÝÐ+˜c &œkÐ+Ð+Ñ,Ô,Ð,Ð,Ý‰Œˆà#ð 	:ñ 	:ˆCÝ‰GŒGˆGÝ•%Ð*˜S œ[Ð*Ð*­F¬KÑ8Ô8Ñ9Ô9Ð9ÝÐ8˜CŸGšG M°2Ñ6Ô6Ð8Ð8Ñ9Ô9Ð9Ø�wŠw�u‰~Œ~ð :ÝÐ8¨C°¬JÐ8Ð8Ñ9Ô9Ð9à�wŠw�zÑ"Ô"ð FÝÐD C§G¢G¨H°c¸&´kÑ$BÔ$BÐDÐDÈtÐTÑTÔT��åÐD C§G¢G¨H°c¸&´kÑ$BÔ$BÐDÐDÑEÔE�àð :Ý˜s 6œ{¨EÑ2Ô2Ð2ÝÐ6¨¨V¬Ð6Ð6Ñ7Ô7Ð7Ñ7åÐ8¨3¨v¬;Ð8Ð8Ñ9Ô9Ð9Ñ9ð QÐPÐ 0ÐPÑPÔP€Mðð à!ðñ ô Ðð ð !Ý‰ŒˆÝ�_Ñ%Ô%Ð%àÐØ ð 	Yð 	YˆCØ—G’G˜G RÑ(Ô(ˆEØ:?ÐGÐ6 §	¢	¨%°°°¬)Ñ 4Ô 4Ð6Ð6Ð6ÀRˆIØ×#Ò# s§w¢w¨}¸cÀ&¼kÑ'JÔ'JÐ$WÈIÐ$WÐ$WÑXÔXÐXÐXå+Ø6Øñ
ô 
Ðð
 $ð 	!ð 	!ˆCØ Ô$ˆCÝ˜CÑ Ô Ð Ð ð ñ 9Ý‰ŒˆÝÐ*Ñ+Ô+Ð+ÝÐLÑMÔMÐMÝÐOÑPÔPÐPð ˆØˆ	Ø$ð 	7ð 	7ˆCØ�v”;ˆDØ˜TÐ!Ð!Ø!��Ø˜dÐ"Ð"Ø ��Ø˜D��Ø��àØ˜9Ð$Ð$Ø×%Ò% dÑ+Ô+Ð+Ø× Ò   rÑ*Ô*×1Ò1°#Ñ6Ô6Ð6Ð6ð
ð 
ð $ð
ñ 
ô 
ˆõ ,Ø7Øñ
ô 
Ðð
 $ð 	ñ 	ˆCØ! #Ô&ˆDØ! $œˆIØ!'°FÀVÐLÐL×PÒPÐQUÐWYÑZÔZˆEÝ‰GŒGˆGÝ•%Ð? uÐ?Ð?¨tÐ?Ð?Ð?ÅÄÑMÔMÑNÔNÐNÝ‰GŒGˆGØ ð ñ �ÝÐ< §¢¨°rÑ :Ô :Ð<Ð<Ñ=Ô=Ð=Ø—7’7˜5‘>”>ð 2ÝÐ0 C¨¤JÐ0Ð0Ñ1Ô1Ð1Ø—7’7˜:Ñ&Ô&ð JÝ"Ð#H¨¯ª°¸#¸f¼+Ñ(FÔ(FÐ#HÐ#HÐSWÐXÑXÔX�E�Eå"Ð#H¨¯ª°¸#¸f¼+Ñ(FÔ(FÐ#HÐ#HÑIÔI�EØð /Ý" 3 v¤;°Ñ6Ô6Ð6Ý! -Ñ0Ô0Ð0Ð0å! +Ñ.Ô.Ð.Ý‘”�‘ñð  ð 
Ý‰ŒˆÝØQ•c˜.Ñ)Ô)ÐQÐQÐQñ	
ô 	
ð 	
ð $ð 	Jð 	JˆEÝÐH U¨5¤\ÐHÐH°e¸IÔ6FÐHÐHÑIÔIÐIÐIð %/ˆÐ Ñ!Ý�FÑÔÐõ ˜ Ñ-Ô-Ð-Ð-Ð-r   r†  )NF)r   N)T)F)uÚ__doc__rý   r  Úloggingrä  r{  ri   rŠ  Úpathlibr   Útypingr   r   r   Úhermes_cli.nous_subscriptionr   rÞ  r   Úutilsr	   r  r
   Ú	getLoggerÚ__name__rR  Ú__file__ru  rp  r�  rO  r   r   r   r"   rj   r-   Ú_DEFAULT_PROVIDER_MODELSrM   rP   rN  rQ   rR   rS   rT   rU   rV   rW   rX   rY   Úhermes_cli.colorsrZ   r[   ra   Úhermes_cli.cli_outputrb   rc   rd   re   rm   rp   r€   Úlistr‘   r‰   r—   rž   r¦   r   r´   r  r)  rw  r}  r•  r™  rY  r¬  r  r  r9  rN  rW  rU  rh  re  rŽ  r–  rš  rœ  r¡  r¤  r¨  r«  r®  r±  r´  rÀ  rÂ  rÊ  rñ  r  r
  r  r  r$  r)  r.  r8  rQ  r^  r{  rŒ  rœ  r¡  r‘  r�  rŽ  rá   r   r   ú<module>rÛ     sm  ððð ð Ð Ð Ð Ø €€€Ø 	€	€	€	Ø €€€Ø 
€
€
€
Ø €€€Ø Ð Ð Ð Ð Ð Ø &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ð &à GÐ GÐ GÐ GÐ GÐ GØ AÐ AÐ AÐ AÐ AÐ AØ #Ð #Ð #Ð #Ð #Ð #Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4à	ˆÔ	˜8Ñ	$Ô	$€àˆt�H‰~Œ~Ô$Ô+×3Ò3Ñ5Ô5€à9€
ð˜t C¨ Hœ~ð °$°s¸C°x´.ð ð ð ð ðD¨D°°c°¬Nð D¸tÀCÈÀH¼~ð Dð Dð Dð Dð
6¨$¨s°C¨x¬.ð 6ÀCð 6ÐSVð 6Ð[_ð 6ð 6ð 6ð 6ð
A°ð 
A¸ð 
Að 
Að 
Að 
Að" 	ððð ð ð ð ð ð GÐFÐFØZÐZÐZØ]Ð]Ð]Ø Ð"7Ð8ØPÐPÐPØMÐMÐMØPÐPÐPØwÐwÐwð _ð  _ð  _Ø}Ð}Ð}ð ð  ð  ðð ð ðG(ð (Ð ðV d¨3°¨8¤nð ¸ð ð ð ð ð+ $ s¨C x¤.ð +¸#ð +À$ð +ð +ð +ð +ð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð ,Ð +Ð +Ð +Ð +Ð +Ð +Ð +ð;˜ð ;ð ;ð ;ð ;ðð ð ð ð ð ð ð ð ð ð ð ð˜dð ð ð ð ðð °°d±
ð Àdð ð ð ð ð&ð �Sð  3ð ¸ð È#ð ð ð ð ð*mð m Cð m°$ð mÀð mÐWZÐ]aÑWað mÐmpð mð mð mð mð(ð (˜Cð (¨$ð (¸ð (ÈsÐUYÉzð (Ðehð (ð (ð (ð (ðV/ð /˜Cð /¨$ð /¸$ð /ð /ð /ð /ð0ð ˜Cð ¨ð ¸Dð ÈDð ð ð ð ð:I˜ð Ið Ið Ið Ið8K ð Kð Kð Kð Kð\'¨ð 'ð 'ð 'ð 'ðh 9>ð Z$ð Z$ð Z$ ð Z$°ð Z$ð Z$ð Z$ð Z$ðDW˜$ð Wð Wð Wð Wð
/˜dð /ð /ð /ð /ðd ð ð ð ð ð2}U ð }Uð }Uð }Uð }Uð@ �dð  ð  ð  ð  ðMB 4ð MBð MBð MBð MBðj
A¨$ð Að Að Að Að2d ð dð dð dð dðXDBð DBð DBðN3=ð 3=ð 3=ðl ð ¨ð ð ð ð ð7Nð 7Nð 7Nðt(
ð (
ð (
ðVS:ð S:ð S:ðl(@ð (@ð (@ðVCð Cð Cð$ð ð ðð ð ðð ð ðð ð ðð ð ðð ð ðð ð ðð ð ð>Vð >Vð >VðBð ð ð+Eð +Eð +Eð` Ð% Ð7ØÐ# ^Ð4ØÐ Ð.ØÐ  -Ð0Øˆo˜|Ð,ØÐ)¨:Ð6ØÐ$ mÐ4ØÐ%Ð'8Ð9ØÐ# _Ð5ØÐ% Ð7Ø�o }Ð5Ø  .°,Ð?Ø&Ð(@ÐBWÐXØÐ+¨]Ð;ØÐ7Ð9KÐLØˆ{˜LÐ)Ø&Ð(9¸?ÐKð#Ð ð*D˜$ð Dð Dð Dð DðX>ð >˜ð >¨Tð >ð >ð >ð >ð(;¨4ð ;°Dð ;ð ;ð ;ð ;ð|¨ð °ð ð ð ð ð/¨ð /¸3ð /À8ÈCÄ=ð /ð /ð /ð /ðdOØðOØ"ðOØ+.ðOà	ðOð Oð Oð Oð* Ð˜LÐ+<Ñ<Ñ=Ô=Øñàñð ñð ñ	ð ðð ð ð@ nØWØTØTØ^Ø]Ø]ØZØPð
ð 
Ð ð= Tð =ð =ð =ð =ð@B¨4ð B°Dð Bð Bð Bð BðT Ð Ð"6Ð7Ø
Ð˜iÐ(ØÐ#Ð%;Ð<ØÐ/°Ð?Øˆg�{Ð#ØÐÐ 4Ð5ð€ðHð Hð HðV 8¨D°¬IÔ#6ð ð ð ð ð'ð 'ð 'ð)¨ð )Èð )ð )ð )ð )ðXc.˜Tð c.ð c.ð c.ð c.ð c.ð c.r   