§
    øžyjvD ã                   óà  — d Z ddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
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  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#i ddg“dg d¢“dg d¢“dg d¢“dg d¢“dg d¢“dg d¢“dddg“d g d!¢“d"g d#¢“d$g d#¢“d%g d&¢“d'g d(¢“d)g d*¢“d+g d,¢“d-g d.¢“Z$d	eeef         d
efd/„Z%d	eeef         d0ed
dfd1„Z&dd2l'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2 dd3l3m4Z4m5Z5 d4efd5„Z6dd6l7m8Z8m9Z9m:Z:m;Z; dd7l<m=Z= d
e"fd8„Z>d¡d9edz  d
dfd:„Z?d¢d<ed=ed>e"d
efd?„Z@ ejA        d@¦  «        ZBdAed
efdB„ZCd£d<edCeDd=eEdDedz  d
eEf
dE„ZFd£d<edCeDd=eEdDedz  d
eEf
dF„ZGd
e"fdG„ZHd¤d<ed=e"d
e"fdI„ZId¡d4edJeDdKeDd
eDfdL„ZJdMeKfdN„ZLd	eKfdO„ZMd	eKfdP„ZNd	eKfdQ„ZOd¡dRedz  d
eKeef         fdS„ZPd;dTœd	eKdUe"fdV„ZQd
e"fdW„ZRd
e"fdX„ZSd
e"fdY„ZTd
e"fdZ„ZUd
e"fd[„ZVd	eKfd\„ZWd	eKfd]„ZXd	eKfd^„ZYd	eKfd_„ZZd	eKfd`„Z[ ejA        da¦  «        Z\dbed
e"fdc„Z]dd„ Z^d
edz  fde„Z_d
edz  fdf„Z`d
edz  fdg„Zadh„ Zbdi„ Zcdj„ Zddk„ Zed	eKfdl„Zfd¥d	eKdme"fdn„Zgd	eKfdo„Zhd	eKd
e"fdp„Zidqed
efdr„Zjd	eKdsed
ee         fdt„Zkd	eKdsedqed
e"fdu„Zl eedvz  ¦  «        dwz  dxz  dyz  dzz  Zmd{„ Znd|d}d~dd€d�d‚dƒd„d…œ	Zod†eKfd‡„Zpdˆed
e"fd‰„ZqdŠd‹eQfdŒd�eXfdŽd�eYfd�d‘effd’d“egfd”d•ehfd–d—e[fgZrd	eKd
dfd˜„Zsd™„ Ztd	eKdše"fd›„Zud	eKfdœ„Zvd	eKfd�„Zwd	eKdše"fdž„Zxd	eKfdŸ„Zyd	eKfd „Zzd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)Ú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     ú6/home/ragecks/.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!   2   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,   :   sj   € Øð �x 8Ò+Ð+ØˆuØ�<ÒÐØˆtØ1Ð1Ð1Ð1Ð1Ð1à×#Ò# HÑ-Ô-€GØð ØˆuØÔÐ @Ð@Ð@r   zcopilot-acpÚcopilot)úgpt-5.4zgpt-5.4-miniz
gpt-5-miniúgpt-5.3-codexzgpt-5.2-codexzgpt-4.1zgpt-4ozgpt-4o-minizclaude-opus-4.6úclaude-sonnet-5zclaude-sonnet-4.6zclaude-sonnet-4.5zclaude-haiku-4.5zgemini-2.5-proÚgemini)zgemini-3.1-pro-previewzgemini-3-pro-previewzgemini-3.6-flashzgemini-3.1-flash-lite-previewÚvertex)zgoogle/gemini-3.1-pro-previewúgoogle/gemini-3-pro-previewúgoogle/gemini-3-flash-previewz$google/gemini-3.1-flash-lite-previewzgoogle/gemini-2.5-prozgoogle/gemini-2.5-flashÚzai)zglm-5.2úglm-5.1úglm-5zglm-4.7zglm-4.5zglm-4.5-flashzkimi-coding)úkimi-k3ú	kimi-k2.6ú	kimi-k2.5zkimi-k2-thinkingzkimi-k2-turbo-previewzkimi-coding-cnÚstepfunzstep-3.5-flashzstep-3.5-flash-2603Úarcee)ztrinity-large-thinkingztrinity-large-previewztrinity-miniÚminimax)zMiniMax-M2.7zMiniMax-M2.5zMiniMax-M2.1z
MiniMax-M2z
minimax-cnz
ai-gateway)úanthropic/claude-opus-4.6úanthropic/claude-sonnet-4.6zopenai/gpt-5zgoogle/gemini-3-flashÚkilocode)zanthropic/claude-sonnet-5r>   r?   zopenai/gpt-5.4r3   r4   zopencode-zen)r.   r/   r0   zclaude-sonnet-4-6zgemini-3-flashr7   r:   úminimax-m2.7zopencode-go)r8   r9   r:   r6   r7   zmimo-v2.5-proz	mimo-v2.5zmimo-v2-prozmimo-v2-omnirA   zminimax-m2.5zqwen3.7-maxzqwen3.6-pluszqwen3.5-plusÚhuggingface)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.5c                 óê   — |                       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_effortrI   y   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 )NrD   rE   r   )r
   rJ   rH   s      r   Ú_set_reasoning_effortrL   €   sD   € Ø—
’
˜7Ñ#Ô#€IÝ�i¥Ñ&Ô&ð $Øˆ	Ø#ˆˆw‰Ø$*€IÐ Ñ!Ð!Ð!r   )Úcfg_getÚDEFAULT_CONFIGÚget_hermes_homeÚget_config_pathÚget_env_pathÚload_configÚsave_configÚsave_env_valueÚremove_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)ÚprintrY   rX   ÚCYANÚBOLD)rZ   s    r   Úprint_headerr_   �   s5   € å	�G„G€GÝ	�%��u��¥¤­V¬[Ñ
9Ô
9Ñ:Ô:Ð:Ð:Ð:r   )Úprint_errorÚ
print_infoÚprint_successÚprint_warning)Úmasked_secret_promptc                  óœ   — 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)rf   s    r   Úis_interactive_stdinrl   ¬   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\   rY   rX   r]   r^   ra   )rm   s    r   Ú#print_noninteractive_setup_guidancero   ·   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�}	 |r(t          t          |t          j        ¦  «        ¦  «        }n't	          t          |t          j        ¦  «        ¦  «        }t          |¦  «        }|                     ¦   «         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.ú [ú]: ú: rF   é   N)rd   rY   rX   ÚYELLOWÚinputÚ_sanitize_pasted_inputr   ÚKeyboardInterruptÚEOFErrorr\   rh   Úexit)rp   r   rq   ÚdisplayÚvalueÚcleaneds         r   Úpromptr€   Ê   sÏ   € àð "ØÐ-Ð- Ð-Ð-Ð-ˆˆà�/�/�/ˆð
Øð 	9Ý(­¨w½¼Ñ)FÔ)FÑGÔGˆEˆEå�% ­¬Ñ7Ô7Ñ8Ô8ˆEå(¨Ñ/Ô/ˆØ�}Š}‰ŒÐ/ 'Ð/¨RÐ/øÝ�xÐ(ð ð ð Ý‰ŒˆÝŒ�‰Œˆˆˆˆðøøøs   ’A7B
 Â
3CÃ Cz\x1b\[\s*200~|\x1b\[\s*201~r~   c                 ój   — t          | t          ¦  «        r| s| S t                               d| ¦  «        S )z@Strip terminal bracketed-paste control markers from pasted text.rF   )r   r   Ú_BRACKETED_PASTE_PATTERNÚsub)r~   s    r   ry   ry   á   s6   € å�e�SÑ!Ô!ð ¨ð ØˆÝ#×'Ò'¨¨EÑ2Ô2Ð2r   Ú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‡   )rp   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 (rv   z)  Ctrl+C to exitTz  Select [1-z] (z): z$Please enter a number between 1 and zPlease enter a number)rŒ   ra   r\   rY   rX   rw   Ú	enumerateÚGREENrx   ÚlenÚDIMÚintr`   Ú
ValueErrorrz   r{   rh   r|   )	rp   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c                  óŽ   — t           j                             dd¦  «                             ¦   «                              ¦   «         dv S )uH  True when no human is available to answer a prompt.

    The dashboard/desktop spawn CLI actions with ``stdin=DEVNULL`` and
    ``HERMES_NONINTERACTIVE=1`` (see ``hermes_cli/web_server.py``). In that
    context an ``input()`` raises ``EOFError`` immediately, so a prompt that
    aborts on EOF kills the spawned action â€” this is what made the desktop
    "restart gateway" fail when the Windows gateway service was not yet
    installed (the start path asks "Install it now?" with no one to answer).
    Honour the explicit env flag here so callers fall back to their default.
    ÚHERMES_NONINTERACTIVErF   >   Ú1ÚonÚyesÚtrue)ÚosÚenvironr   r   rG   © r   r   Úis_noninteractiver¤     s@   € õ Œ:�>Š>Ð1°2Ñ6Ô6×<Ò<Ñ>Ô>×DÒDÑFÔFð Kð ð r   Tc                 ó°  — t          ¦   «         r|S |rdnd}	 	 t          t          | › d|› d�t          j        ¦  «        ¦  «                             ¦   «                              ¦   «         }nM# t          $ r% t          ¦   «          t          j
        d¦  «         Y nt          $ r t          ¦   «          |cY S 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.

    Non-interactive callers (``HERMES_NONINTERACTIVE=1`` or a closed/redirected
    stdin) have no one to answer, so fall back to ``default`` instead of
    aborting the whole process.
    zY/nzy/NTrs   rt   rv   >   ÚyrŸ   >   ÚnÚnoFzPlease enter 'y' or 'n')r¤   rx   rY   rX   rw   r   rG   rz   r\   rh   r|   r{   r`   )rp   r   Údefault_strr~   s       r   Úprompt_yes_norª   -  s  € õ ÑÔð Øˆà"Ð-�%�%¨€Kð/ð	å•e˜xÐ;Ð;¨;Ð;Ð;Ð;½V¼]ÑKÔKÑLÔLß’‘”ß’‘”ð ˆEøõ
 !ð 	ð 	ð 	Ý‰GŒGˆGÝŒH�Q‰KŒKˆKˆKˆKÝð 	ð 	ð 	õ ‰GŒGˆGØˆNˆNˆNð	øøøð ð 	ØˆNØ�LÐ Ð Ø�4Ø�KÐÐØ�5ÝÐ-Ñ.Ô.Ð.ð//s   ™AA+ Á+,B5ÂB5Â4B5Ú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 curses is
    unavailable.

    Returns:
        List of selected indices (not including the Continue option).
    Nr   )Úcurses_checklist)rŠ   )r‹   r®   ÚsetÚsorted)rZ   r«   r¬   r®   Úchosens        r   Úprompt_checklistr²   S  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: rq   rŽ   r€   T©rq   õ     âœ“ Savedz/  Skipped (configure later with 'hermes setup'))r   Újoinr’   r\   rY   rX   r]   ra   r€   rT   rb   rc   )r³   rµ   Ú	tools_strr~   s       r   Ú_prompt_api_keyrÀ   p  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                 ó*  — 	 ddl m}  |¦   «          d}n# t          $ r d}Y nw xY w|sJt          ¦   «          t	          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          ¦   «          t          d	¦  «         g }t          | ¦  «        }	 dd
lm	}  |¦   «         }n# t          $ r g }Y nw xY w|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%¦  «         |j        j        r| 
                    d&¦  «         n…	 dd!lm} dd"lm}  |¦   «          d} |¦   «         D ]0}	 |                     ¦   «         r	|j        } nŒ!# t          $ r Y Œ-w xY wn# t          $ r d}Y nw xY w|r| 
                    d'|› d�ddf¦  «         t5          | d(d)d*¬+¦  «        }|j        j        r| 
                    d,¦  «         �nà|d-k    r&t9          d.¦  «        r| 
                    d/¦  «         �n´|d0k    r5t9          d1¦  «        st9          d2¦  «        r| 
                    d3¦  «         �ny|d4k    r&t9          d5¦  «        r| 
                    d6¦  «         �nM|d7k    r&t9          d8¦  «        r| 
                    d9¦  «         �n!|d:k    r4t9          d;¦  «        st9          d<¦  «        r| 
                    d=¦  «         nç|d>k    rc	 t:          j                             d>¦  «        du}n# t          $ r d}Y nw xY w|r| 
                    d?¦  «         n”| 
                    d@¦  «         n~|dAk    rc	 t:          j                             dA¦  «        du}n# t          $ r d}Y nw xY w|r| 
                    dB¦  «         n+| 
                    dC¦  «         n| 
                    dD¦  «         t5          | dEd)dF¬+¦  «        pdF}|j          !                    dE¦  «        }|�|j        r| 
                    dG¦  «         �n9|d0k    r4t9          d1¦  «        st9          d2¦  «        r| 
                    dH¦  «         nÿ|dIk    r%t9          dJ¦  «        r| 
                    dK¦  «         nÔ|d-k    r%t9          d.¦  «        r| 
                    dL¦  «         n©|dMk    r| 
                    dN¦  «         n�|dOk    r%t9          dP¦  «        r| 
                    dQ¦  «         nb	 t:          j                             dR¦  «        du}n# t          $ r d}Y nw xY w|r| 
                    dS¦  «         n| 
                    dT¦  «         |j"        j        r| 
                    dU¦  «         nwt5          | dVdW¦  «        dXk    r8|j"        j#        r| 
                    dY¦  «         n@| 
                    dZ¦  «         n*tI          ¦   «         r|j%        r| 
                    d[¦  «         t9          d\¦  «        r| 
                    d]¦  «         	 dd^l m&}  |d_¦  «        pi }| !                    d`¦  «        s| !                    da¦  «        r| 
                    db¦  «         n# t          $ r Y nw xY wt9          dc¦  «        r| 
                    dd¦  «         n| 
                    de¦  «         | 
                    df¦  «         | 
                    dg¦  «         | 
                    dh¦  «         tO          di„ |D ¦   «         ¦  «        }tQ          |¦  «        }t          |› dj|› dk�¦  «         t          ¦   «          |D ]‚\  }}}|r.t          dltS          dmtT          j+        ¦  «        › dn|› �¦  «         Œ6t          dltS          dotT          j,        ¦  «        › dn|› dntS          dp|› d�tT          j-        ¦  «        › �¦  «         Œƒt          ¦   «          dq„ |D ¦   «         } | r>t	          dr¦  «         ddsl.m/}! t	          dt |!¦   «         › du�¦  «         t          ¦   «          t          ¦   «          t          tS          dvtT          j+        ¦  «        ¦  «         t          tS          dwtT          j+        ¦  «        ¦  «         t          tS          dxtT          j+        ¦  «        ¦  «         t          ¦   «          ddsl.m/}! t          tS          dy |!¦   «         › dz�tT          j0        tT          j1        ¦  «        ¦  «         t          ¦   «          t          dltS          d{tT          j2        ¦  «        › d|tg          ¦   «         › �¦  «         t          dltS          d}tT          j2        ¦  «        › d|ti          ¦   «         › �¦  «         t          dltS          d~tT          j2        ¦  «        › d|› d€�¦  «         t          ¦   «          t          tS          d�tT          j-        ¦  «        ¦  «         t          ¦   «          t          tS          d‚tT          j0        tT          j1        ¦  «        ¦  «         t          ¦   «          t          dltS          dƒtT          j+        ¦  «        › d„�¦  «         t          dltS          d…tT          j+        ¦  «        › d†�¦  «         t          dltS          d‡tT          j+        ¦  «        › dˆ�¦  «         t          dltS          d‰tT          j+        ¦  «        › dŠ�¦  «         t          dltS          d‹tT          j+        ¦  «        › dŒ�¦  «         t          ¦   «          t          dltS          d�tT          j+        ¦  «        › dŽ�¦  «         t          dltS          d�tT          j+        ¦  «        › d��¦  «         t          dltS          d‘tT          j+        ¦  «        › �¦  «         t          d’¦  «         t          ¦   «          t          d“¦  «         t          dltS          d”tg          ¦   «         › �tT          j-        ¦  «        › �¦  «         t          dltS          d”ti          ¦   «         › �tT          j-        ¦  «        › �¦  «         t          ¦   «          t          tS          d�tT          j-        ¦  «        ¦  «         t          ¦   «          t          tS          d•tT          j0        tT          j1        ¦  «        ¦  «         t          ¦   «          t          dltS          d–tT          j+        ¦  «        › d—�¦  «         t          dltS          d˜tT          j+        ¦  «        › d™�¦  «         t          dltS          dštT          j+        ¦  «        › d›�¦  «         t          ¦   «          dS )œz#Print the setup completion summary.r   )Úresolve_providerTFu?   No inference provider is configured â€” Hermes cannot chat yet.z&  Finish this one step with either of:z5    hermes model            (pick any provider/model)z;    hermes setup --portal   (Nous Portal OAuth, no API key)zTool Availability Summary)Úget_available_vision_backends)úVision (image analysis)TN)rÄ   Fzrun 'hermes setup' to configure)z(Web Search & Extract (Nous subscription)TNúWeb Search & ExtractzWeb Search & Extract (ú)N)rÅ   FzbEXA_API_KEY, PARALLEL_API_KEY, FIRECRAWL_API_KEY/FIRECRAWL_API_URL, TAVILY_API_KEY, or SEARXNG_URL)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 browserzAnpm install -g agent-browser && agent-browser install --with-deps)z$Image Generation (Nous subscription)TN)úImage GenerationTN)Úlist_providers)Ú_ensure_plugins_discoveredÚfalzImage Generation ()rÊ   FzFAL_KEY or OPENAI_API_KEY)z,Video Generation (FAL via Nous subscription)TNzVideo Generation (Úttsr   Úedge©r   )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)TNr=   ÚMINIMAX_API_KEY)zText-to-Speech (MiniMax)TNÚmistralÚMISTRAL_API_KEY)z Text-to-Speech (Mistral Voxtral)TNr1   Ú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ÚsttÚlocal)z-Speech-to-Text (OpenAI via Nous subscription)TN)zSpeech-to-Text (OpenAI)TNÚgroqÚGROQ_API_KEY)zSpeech-to-Text (Groq Whisper)TN)z"Speech-to-Text (ElevenLabs Scribe)TNÚxai)zSpeech-to-Text (xAI)TNÚ	deepinfraÚDEEPINFRA_API_KEY)zSpeech-to-Text (DeepInfra)TNÚfaster_whisper)zSpeech-to-Text (Local Whisper)TN)u0   Speech-to-Text (Local Whisper â€” not installed)Fu%   run 'hermes tools' â†’ Speech-to-Text)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Ú
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 )rv   Nr£   )Ú.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)5r)   rÂ   rk   r\   rc   ra   r_   r   Úagent.auxiliary_clientrÃ   ÚappendÚwebÚmanaged_by_nousÚ	availableÚcurrent_providerÚbrowserÚ	image_genÚagent.image_gen_registryrË   Úhermes_cli.pluginsrÌ   r¹   Úis_availableÚdisplay_nameÚ	video_genÚagent.video_gen_registryrM   rÎ   rV   Ú	importlibÚutilÚ	find_specÚfeaturesr   rè   Údirect_overrider   Únous_auth_presentrê   Úsumr’   rY   rX   r‘   ÚREDr“   Úhermes_constantsrù   r]   r^   rw   rP   rQ   )"r
   Úhermes_homerÂ   Ú_provider_readyÚtool_statusÚsubscription_featuresrÃ   Ú_vision_backendsÚlabelÚbrowser_providerÚmissing_browser_hintÚ_img_backendrË   rÌ   Ú_pÚ_list_video_providersÚ_ensure_pluginsÚ_video_backendÚ_vpÚtts_providerÚ	neutts_okÚkittentts_okÚstt_providerÚ_stt_featureÚfw_okrê   Ú_spotify_stateÚavailable_countÚtotal_countr¹   r  Úmissing_varÚdisabled_toolsÚ_dhhs"                                     r   Ú_print_setup_summaryr/  Œ  s²  € ð Ø4Ð4Ð4Ð4Ð4Ð4àÐÑÔÐØˆˆøÝð  ð  ð  Øˆˆˆð øøøàð RÝ‰ŒˆÝÐWÑXÔXÐXÝÐ;Ñ<Ô<Ð<ÝÐJÑKÔKÐKÝÐPÑQÔQÐQõ 
�G„G€GÝÐ,Ñ-Ô-Ð-à€KÝ:¸6ÑBÔBÐðØHÐHÐHÐHÐHÐHà8Ð8Ñ:Ô:ÐÐøÝð ð ð ØÐÐÐðøøøð ð bØ×ÒÐBÑCÔCÐCÐCà×ÒÐ`ÑaÔaÐað Ô Ô0ð bØ×ÒÐSÑTÔTÐTÐTØ	Ô	"Ô	,ð bØ&ˆØ Ô$Ô5ð 	[ØZÐ-BÔ-FÔ-WÐZÐZÐZˆEØ×Ò˜E 4¨Ð.Ñ/Ô/Ð/Ð/à×Òð  añ  	bô  	bð  	bð -Ô4ÔEÐØÔ$Ô4ð 
Ø×ÒÐPÑQÔQÐQÐQØ	Ô	&Ô	0ð 
Ø$ˆØð 	?Ø>Ð+;Ð>Ð>Ð>ˆEØ×Ò˜E 4¨Ð.Ñ/Ô/Ð/Ð/àwÐØ˜}Ò,Ð,ð=ð !Ð ð  Ò.Ð.àJð !Ð ð  Ò*Ð*Ø#0Ð Ð Ø Ò0Ð0àSð !ð 	×ÒØ! 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ð
 Ô&Ô6ð UØ×ÒÐWÑXÔXÐXÐXð	"ØXÐXÐXÐXÐXÐXØXÐXÐXÐXÐXÐXØˆOÑÔÐØ!ˆNØ,Ð,Ñ.Ô.ð ð �ðØ×'Ò'Ñ)Ô)ð Ø),Ô)9˜Ø˜ðøõ !ð ð ð Ø�Hðøøøøøåð 	"ð 	"ð 	"Ø!ˆNˆNˆNð	"øøøàð 	UØ×ÒÐ F°^Ð FÐ FÐ FÈÈdÐSÑTÔTÐTõ ˜6 5¨*¸fÐEÑEÔE€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õ ˜6 5¨*¸gÐFÑFÔFÐQÈ'€LØ(Ô1×5Ò5°eÑ<Ô<€LØÐ LÔ$@ÐØ×ÒÐXÑYÔYÐYÑYØ	˜Ò	!Ð	!ÝÐ.Ñ/Ô/ð 
"Ý3@ÐAQÑ3RÔ3Rð 
"ð 	×ÒÐBÑCÔCÐCÐCØ	˜Ò	Ð	¥M°.Ñ$AÔ$AÐ	Ø×ÒÐHÑIÔIÐIÐIØ	˜Ò	%Ð	%­-Ð8LÑ*MÔ*MÐ	%Ø×ÒÐMÑNÔNÐNÐNØ	˜Ò	Ð	Ø×ÒÐ?Ñ@Ô@Ð@Ð@Ø	˜Ò	$Ð	$­Ð7JÑ)KÔ)KÐ	$Ø×ÒÐEÑFÔFÐFÐFð	Ý”N×,Ò,Ð-=Ñ>Ô>ÀdÐJˆEˆEøÝð 	ð 	ð 	ØˆEˆEˆEð	øøøàð 	Ø×ÒÐMÑNÔNÐNÐNà×ÒØtñô ð ð Ô"Ô2ð ]Ø×ÒÐNÑOÔOÐOÐOÝ	�˜ YÑ	/Ô	/°7Ò	:Ð	:Ø Ô&Ô6ð 	ZØ×ÒÐMÑNÔNÐNÐNà×ÒÐXÑYÔYÐYÐYÝ	#Ñ	%Ô	%ð ]Ð*?Ô*Qð ]Ø×ÒÐ[Ñ\Ô\Ð\õ �\Ñ"Ô"ð 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Ó   ‚ •$£$Â"B3 Â3CÃCÉ.J+ É<JÊJ+ Ê
J'Ê$J+ Ê&J'Ê'J+ Ê+
J8Ê7J8Ì$M& Ì7MÍM& Í
M"ÍM& Í!M"Í"M& Í&M5Í4M5Ó!S. Ó.S=Ó<S=Ô5!U ÕU&Õ%U&Û![5 Û5\Ü\ß2Aa á
aáa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�   r¦   rŸ   r    Úcontainer_cpurv   ú  CPU coresÚcontainer_memoryé   ú  Memory in MB (5120 = 5GB)Úcontainer_diské È  z  Disk in MB (51200 = 50GB)N)
Ú
setdefaultr\   ra   r   r€   rG   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_resourcesrD  Õ  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c                 ó6  — |                       di ¦  «        }t          ¦   «          t          d¦  «         t          d¦  «         t          d¦  «         ddlm} |                     d¦  «        pd}d	                     |¦  «        }t          d
|› d�|¦  «                             ¦   «         p|}||vrt          d|› d|› d�¦  «         ||v r|nd}||d<   t          d|¦  «         |                     dd¦  «        }|rdn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¦  «        dvrt          d¦  «         d|d<   t          ¦   «          t          d ¦  «         t          d!¦  «         t!          ¦   «         }|rt          d"¦  «         t#          d#¦  «         t          d$t%          d%¦  «        pd&d¬'¦  «        }t          d(t%          d)¦  «        p|                     d*d&¦  «        ¦  «        }t          d+t%          d,¦  «        p|                     d-d&¦  «        ¦  «        }|rt          d%|¦  «         |rt          d)|¦  «         |rt          d,|¦  «         d.S d.S )/zLPrompt for Vercel Sandbox settings without exposing unsupported disk sizing.ræ   zVercel Sandbox settings:z/  Filesystem persistence uses Vercel snapshots.zX  Snapshots restore files only; live processes do not continue after sandbox recreation.r   )Ú_SUPPORTED_VERCEL_RUNTIMESÚvercel_runtimeÚnode24r¶   z  Runtime (rÆ   zUnsupported Vercel runtime 'z', keeping ú.ÚTERMINAL_VERCEL_RUNTIMEr1  TrŸ   r¨   z-  Persist filesystem with snapshots? (yes/no)>   r�   r¦   rŸ   r    r2  rv   r3  r4  r5  r6  r7  r8  >   r   r8  zVVercel Sandbox does not support custom disk sizing; resetting container_disk to 51200.zVercel authentication:z=  Use a long-lived Vercel access token plus project/team IDs.z1  Found defaults in nearest .vercel/project.json.ÚVERCEL_OIDC_TOKENz    Vercel access tokenÚVERCEL_TOKENrF   r¼   z    Vercel project IDÚVERCEL_PROJECT_IDÚ	projectIdz    Vercel team IDÚVERCEL_TEAM_IDÚorgIdN)r9  r\   ra   Útools.terminal_toolrF  r   r¾   r€   r   rc   rT   rG   r   r:  r•   r”   Ú_read_nearest_vercel_projectrU   rV   )r
   ræ   rF  Úcurrent_runtimeÚsupported_labelÚruntimer;  r<  r>  r?  r@  rA  Úlinked_projectÚtokenÚprojectÚteams                   r   Ú_prompt_vercel_sandbox_settingsrZ  ÿ  s¢  € à× Ò  ¨RÑ0Ô0€Hå	�G„G€GÝÐ)Ñ*Ô*Ð*ÝÐ@ÑAÔAÐAÝÐiÑjÔjÐjà>Ð>Ð>Ð>Ð>Ð>à—l’lÐ#3Ñ4Ô4Ð@¸€OØ—i’iÐ :Ñ;Ô;€OÝÐ5 ?Ð5Ð5Ð5°ÑGÔG×MÒMÑOÔOÐbÐSb€GØÐ0Ð0Ð0ÝÐ[°WÐ[Ð[ÈÐ[Ð[Ð[Ñ\Ô\Ð\Ø%4Ð8RÐ%RÐ%R�/�/ÐX`ˆØ!(€HÐÑÝÐ,¨gÑ6Ô6Ð6à—l’lÐ#9¸4Ñ@Ô@€OØ,Ð6�E�E°$€MÝ'-Ø7¸ñ(ô (ç‚e�g„gÐ*ð(+€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¡|¤|ˆÐ#Ñ$Ð$øÝð ð ð Øˆðøøøð ‡|‚|Ð$ eÑ,Ô,°JÐ>Ð>ÝÐnÑoÔoÐoØ!&€HÐÑå	�G„G€GÝÐ'Ñ(Ô(Ð(ÝÐNÑOÔOÐOÝ1Ñ3Ô3€NØð HÝÐFÑGÔGÐGåÐ(Ñ)Ô)Ð)ÝÐ,­m¸NÑ.KÔ.KÐ.QÈrÐ\`ÐaÑaÔa€EÝØÝÐ)Ñ*Ô*ÐQ¨n×.@Ò.@ÀÈbÑ.QÔ.Qñô €Gõ ØÝÐ&Ñ'Ô'ÐJ¨>×+=Ò+=¸gÀrÑ+JÔ+Jñô €Dð ð .Ý�~ uÑ-Ô-Ð-Øð 5ÝÐ*¨GÑ4Ô4Ð4Øð /ÝÐ'¨Ñ.Ô.Ð.Ð.Ð.ð/ð /s$   ÅE- Å-
E:Å9E:Æ1G Ç
GÇGÚstartc                 ó6  — | pt          j        ¦   «                              ¦   «         }|                     ¦   «         r|j        }|g|j        ¢R D ]Ê}|dz  dz  }|                     ¦   «         sŒ	 t          j        | 	                    d¬¦  «        ¦  «        }n # t          t          j        f$ r i cY c S w xY wt          |t          ¦  «        si c S d„ |                     d¦  «        |                     d¦  «        dœ                     ¦   «         D ¦   «         c S i S )	z=Read project/team defaults from the nearest Vercel link file.z.vercelzproject.jsonúutf-8)Úencodingc                 ól   — i | ]1\  }}t          |t          ¦  «        ¯|                     ¦   «         ¯.||“Œ2S r£   )r   r   r   )rñ   Úkeyr~   s      r   ú
<dictcomp>z0_read_nearest_vercel_project.<locals>.<dictcomp>T  sR   € ð 
ð 
ð 
á��Uõ ˜%¥Ñ%Ô%ð
ð +0¯+ª+©-¬-ð
Ø�ð
ð 
ð 
r   rN  rP  )rN  rP  )r   ÚcwdÚresolveÚis_fileÚparentÚparentsÚexistsÚjsonÚloadsÚ	read_textÚOSErrorÚJSONDecodeErrorr   r   r   r«   )r[  ÚcurrentÚ	directoryÚproject_fileÚdatas        r   rR  rR  D  sO  € àÐ"�œ™
œ
×+Ò+Ñ-Ô-€GØ‡‚ÑÔð !Ø”.ˆàÐ0 ¤Ð0Ð0ð 
ð 
ˆ	Ø  9Ñ,¨~Ñ=ˆØ×"Ò"Ñ$Ô$ð 	Øð	Ý”:˜l×4Ò4¸gÐ4ÑFÔFÑGÔGˆDˆDøÝ�Ô-Ð.ð 	ð 	ð 	ØˆIˆIˆIˆIˆIð	øøøå˜$¥Ñ%Ô%ð 	ØˆIˆIˆIð
ð 
ð "ŸXšX kÑ2Ô2ØŸš 'Ñ*Ô*ðð ÷ Še‰gŒgð
ñ 
ô 
ð 	
ð 	
ð 	
ð €Is   Á.(BÂB4Â3B4)Úquickrq  c                óB  — 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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   )rR   rS   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: ú*You can try again later with: hermes modelN)Úhermes_cli.configrR   rS   r_   ra   Ú
_DOCS_BASEr\   Úhermes_cli.mainrt  Ú
SystemExitrz   rk   ÚloggerÚdebugrc   ÚclearÚupdate)r
   rq  rR   rS   rt  ÚexcÚ
_refresheds          r   Úsetup_model_providerr€  i  sp  € ð ;Ð:Ð:Ð:Ð:Ð:Ð:Ð:åÐ%Ñ&Ô&Ð&ÝÐ?Ñ@Ô@Ð@ÝÐ?�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Ø
‡L‚L�N„N€NØ
‡M‚M�*ÑÔÐð €K�ÑÔÐÐÐs   Á
A Á.CÂ	CÂ<CÃC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          ¦   «          ddlm} 	  |g d¢d¬¦  «        }n9# t          $ r,}t          d|› �¦  «         t          d¦  «         Y d}~dS d}~ww xY w|j        dk    rt          d¦  «         d
S |j        pd                     ¦   «         }t          d|r
|dd…         nd› �¦  «         t          d¦  «         dS )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Úinstallr‚  )Úcheck)Úchocor‹  r‚  ú-y)ÚsudoÚaptr‹  rŽ  r‚  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.©Ú_pip_install)ú-Uzneutts[all]ú--quieté,  ©ÚtimeoutzFailed to install neutts: z-Try manually: uv pip install -U 'neutts[all]'zneutts installed successfullyrF   úinstall failed)Ú
subprocessrh   r†  r\   rc   Úplatformra   rª   Úrunrb   ÚCalledProcessErrorÚFileNotFoundErrorÚhermes_cli.tools_configr’  rk   r`   Ú
returncodeÚstderrr   )r™  rh   Úer’  ÚresultÚerrs         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ð 5Ð4Ð4Ð4Ð4Ð4ðØ�Ð>Ð>Ð>ÈÐLÑLÔLˆˆøÝð ð ð ÝÐ4°Ð4Ð4Ñ5Ô5Ð5ÝÐBÑCÔCÐCØˆuˆuˆuˆuˆuøøøøðøøøð Ô˜AÒÐÝÐ5Ñ6Ô6Ð6ØˆtØŒ=Ð˜B×
%Ò
%Ñ
'Ô
'€CÝÐU¸#Ð-S¨S°°#°¬Y¨YÐCSÐUÐUÑVÔVÐVÝÐ>Ñ?Ô?Ð?Øˆ5s1   ÂA2D ÄE	Ä!EÅE	ÆF, Æ,
G"Æ6!GÇG"c                  óÜ  — d} t          ¦   «          t          d¦  «         t          ¦   «          ddlm} 	  |d| ddgd¬	¦  «        }n=# t          $ r0}t          d
|› �¦  «         t          d| › d�¦  «         Y d}~dS d}~ww xY w|j        dk    rt          d¦  «         dS |j        pd 	                    ¦   «         }t          d
|r
|dd…         nd› �¦  «         t          d| › d�¦  «         dS )zKInstall KittenTTS dependencies with user approval. Returns True on success.z^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“  Ú	soundfiler”  r•  r–  zFailed to install kittentts: z!Try manually: uv pip install -U 'z' soundfileNFz kittentts installed successfullyTrF   r˜  )
r\   ra   rž  r’  rk   r`   rŸ  rb   r   r   )Ú	wheel_urlr’  r¢  r¡  r£  s        r   Ú_install_kittentts_depsr¨  à  sG  € ð	1ð õ 
�G„G€GÝÐ`ÑaÔaÐaÝ	�G„G€Gà4Ð4Ð4Ð4Ð4Ð4ðØ�˜t Y°¸YÐGÐQTÐUÑUÔUˆˆøÝð ð ð ÝÐ7°AÐ7Ð7Ñ8Ô8Ð8ÝÐM°yÐMÐMÐMÑNÔNÐNØˆuˆuˆuˆuˆuøøøøðøøøð Ô˜AÒÐÝÐ8Ñ9Ô9Ð9ØˆtØŒ=Ð˜B×
%Ò
%Ñ
'Ô
'€CÝÐX¸SÐ0V°°D°S°D´	°	ÐFVÐXÐXÑYÔYÐYÝÐI°9ÐIÐIÐIÑJÔJÐJØˆ5s   µA Á
BÁ%A<Á<Bc                  ó†   — 	 ddl m}  t           | ¦   «                              d¦  «        ¦  «        S # t          $ r Y dS w xY w)zÕTrue iff xAI Grok OAuth credentials are already stored locally.

    Lets TTS / STT setup skip the API-key prompt for users who logged in
    through ``hermes model`` -> xAI Grok OAuth (SuperGrok / Premium+).
    r   ©Úget_xai_oauth_auth_statusÚ	logged_inF)r)   r«  ri   r   rk   rª  s    r   Ú_xai_oauth_logged_in_for_setupr­  ü  sa   € ðØ=Ð=Ð=Ð=Ð=Ð=åÐ-Ð-Ñ/Ô/×3Ò3°KÑ@Ô@ÑAÔAÐAøÝð ð ð Øˆuˆuðøøøs   ‚/2 ²
A ¿A c                  óî  — 	 ddl m} m}m}m} n*# t
          $ r}t          d|› �¦  «         Y d}~dS d}~ww xY w | ¦   «          }t          ¦   «          t          d¦  «         	  ||¬¦  «        } ||d         | 	                    d	¦  «        | 	                    d
d¦  «        | 	                    d¦  «        dd¬¦  «          |dd¦  «         dS # t
          $ r}t          d|› �¦  «         Y d}~dS d}~ww xY w)u�  Run the xAI Grok OAuth device-code login from inside the setup wizard.

    Saves OAuth tokens only. Does **not** switch the active inference
    provider or rewrite ``model.provider`` â€” callers (TTS setup, tools
    config) only need credentials for side tools.

    Returns True on success, False on any failure (the caller falls back
    to whatever the user picked next, e.g. Edge TTS).
    r   )Ú_is_remote_sessionÚ_save_xai_oauth_tokensÚ_xai_oauth_device_code_loginÚunsuppress_credential_sourcez$xAI Grok OAuth helpers unavailable: NFz6Signing in to xAI Grok OAuth (SuperGrok / Premium+)...)Úopen_browserÚtokensÚ	discoveryÚredirect_urirF   Úlast_refreshr(   )rµ  r¶  r·  Ú	auth_modeÚ
set_activez	xai-oauthÚdevice_codeTzxAI Grok OAuth login failed: )
r)   r¯  r°  r±  r²  rk   rc   r\   ra   r   )r¯  r°  r±  r²  r~  r³  Úcredss          r   Ú_run_xai_oauth_login_from_setupr¼  
  sƒ  € ð	ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
øõ ð ð ð ÝÐB¸SÐBÐBÑCÔCÐCØˆuˆuˆuˆuˆuøøøøðøøøð *Ð)Ñ+Ô+Ð+€LÝ	�G„G€GÝÐGÑHÔHÐHðØ,Ð,¸,ÐGÑGÔGˆØÐØ�(ŒOØ—i’i Ñ,Ô,ØŸš >°2Ñ6Ô6ØŸš >Ñ2Ô2Ø)Øð	
ñ 	
ô 	
ð 	
ð 	%Ð$ [°-Ñ@Ô@Ð@ØˆtøÝð ð ð ÝÐ;°cÐ;Ð;Ñ<Ô<Ð<Øˆuˆuˆuˆuˆuøøøøðøøøs)   ‚ �
6™1±6Á"A)C Ã
C4ÃC/Ã/C4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Õ	 t          j                             d¦  «        du}n# t           $ r d}Y nw xY w|rt#          d¦  «         �nJt          ¦   «          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+¦  «         �ndt          d,¦  «         d}
�nQ|
dk    rw|sut          d¦  «        pt          d¦  «        }|sSt          ¦   «          t)          d-d$¬*¦  «        }|r!t+          d|¦  «         t#          d.¦  «         �nçt          d,¦  «         d}
�nÔ|
d/k    �r¥t-          ¦   «         }t          d0¦  «        }|rt#          d1¦  «         nØ|rt#          d2¦  «         nÆt          ¦   «          t          d3g d4¢d5¬6¦  «        }|d5k    r0t/          ¦   «         rt#          d7¦  «         n€t          d8¦  «         d}
nn|dk    rWt)          d9d$¬*¦  «        }|r t+          d0|¦  «         t#          d:¦  «         n5d5d;lm} t          d< |¦   «         › d=�¦  «         d}
nt          d>¦  «         d}
|
d/k    r–t          ¦   «          t)          d?¦  «        }|rw|                     ¦   «         rc|                     ¦   «         |                      di ¦  «                             d/i ¦  «        d@<   t#          dA|                     ¦   «         › �¦  «         �n(|
dBk    rft          dC¦  «        }|sSt          ¦   «          t)          dDd$¬*¦  «        }|r!t+          dC|¦  «         t#          dE¦  «         �nÏt          d,¦  «         d}
�n¼|
dFk    rft          dG¦  «        }|sSt          ¦   «          t)          dHd$¬*¦  «        }|r!t+          dG|¦  «         t#          dI¦  «         �nct          d,¦  «         d}
�nP|
dJk    r‚t          dK¦  «        pt          dL¦  «        }|sat          ¦   «          t	          dM¦  «         t)          dNd$¬*¦  «        }|r t+          dK|¦  «         t#          dO¦  «         nÚt          d,¦  «         d}
nÈ|
dPk    rÂ	 t          j                             dP¦  «        du}n# t           $ r d}Y nw xY w|rt#          dQ¦  «         n{t          ¦   «          t	          dR¦  «         t	          dS¦  «         t          ¦   «          t%          dTd$¦  «        r t9          ¦   «         st          dU¦  «         d}
nt	          dV¦  «         d}
d| vri | d<   |
| d         d<   t;          | ¦  «         t#          dW|                      |
|
¦  «        › �¦  «         dS )Xz@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Ó   râ   r=   r×   r1   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)u0   xAI TTS (Grok voices â€” OAuth login or 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Æ   rv   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_KEYzGxAI TTS will use your xAI Grok OAuth (SuperGrok / Premium+) credentialsz*xAI TTS will use your existing XAI_API_KEYz(How do you want xAI TTS to authenticate?)uD   Sign in with xAI Grok OAuth (SuperGrok / Premium+) â€” browser loginz#Paste an xAI API key (console.x.ai)u   Skip â†’ fallback to Edge TTSr   )r„   r   u6   Logged in â€” xAI TTS will use these OAuth credentialsz@xAI Grok OAuth login did not complete. Falling back to Edge TTS.zxAI API key for TTSzxAI TTS API key savedrø   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.z*xAI TTS skipped. Falling back to Edge TTS.z:xAI voice_id (Enter for 'eve', or paste a custom voice ID)Úvoice_idzxAI voice_id set to: r=   rÖ   zMiniMax API key for TTSzMiniMax TTS API key savedr×   rØ   zMistral API key for TTSzMistral TTS API key savedr1   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\   r_   ra   r   r  rÿ   Úextendr’   rš   rV   rc   r  r  r  rk   rb   rª   r¤  r€   rT   r­  r¼  r  rù   r   r9  r¨  rS   )r
   Ú
tts_configr  r  Úprovider_labelsÚcurrent_labelr„   Ú	providersÚkeep_current_idxr–   r‰   Úselected_via_nousÚalready_installedÚexistingr'   Úoauth_logged_inÚexisting_api_keyÚ
choice_idxr.  rÃ  s                       r   Ú_setup_tts_providerrÐ  5  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Ò	Ñ	õ
 9Ñ:Ô:ˆÝ(¨Ñ7Ô7Ðàð ,	"Ýðñô ð ð ð ð '	"ÝÐFÑGÔGÐGÐGå‰GŒGˆGÝ&Ø:ðð ð ð
 ðñ ô ˆJð ˜QŠˆÝ2Ñ4Ô4ð 	&Ý!ØPñô ð ð õ "ð4ñô ð ð  &�H�HØ˜q’�Ý Ð!6ÀÐFÑFÔF�Øð 
&Ý" =°'Ñ:Ô:Ð:Ý!Ð"9Ñ:Ô:Ð:Ð:àLÐLÐLÐLÐLÐLÝ!ð4Ø59°T±V´Vð4ð 4ð 4ñô ð ð
  &�H�HåÐJÑKÔKÐKØ!�à�uÒÐÝ‰GŒGˆGÝÐZÑ[Ô[ˆHØð J˜HŸNšNÑ,Ô,ð JØQY×Q_ÒQ_ÑQaÔQa�×!Ò! %¨Ñ,Ô,×7Ò7¸¸rÑBÔBÀ:ÑNÝÐH°h·n²nÑ6FÔ6FÐHÐHÑIÔIÐIùð 
�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Ù9!Z ÚZ*Ú)Z*c                 ó$   — t          | ¦  «         dS )z.Standalone TTS setup (for 'hermes setup tts').N)rÐ  ©r
   s    r   Ú	setup_ttsrÓ  !  s   € å˜ÑÔÐÐÐr   c           	      ób  — ddl }t          d¦  «         t          d¦  «         t          d¦  «         t          dt          › d�¦  «         t	          ¦   «          t          | dd	d
¬¦  «        }|                     ¦   «         dk    }g d¢}d
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    rZt          d!¦  «         t          d"¦  «         | d          
                    d#t          t          j        ¦   «         ¦  «        ¦  «         �	nv|
dk    �rt          d$¦  «         t          j        d¦  «        }|st#          d%¦  «         t          d&¦  «         nt          d'|› �¦  «         | d          
                    d(d)¦  «         t	          ¦   «          t          d*¦  «         t          d+¦  «         t          d,¦  «         t%          d-d.¦  «        rQ|  
                    d/i ¦  «        }d0|d1<   | 
                    d2d0¦  «         t          d3¦  «         t          d4¦  «         �nat          d5¦  «         �nP|
dk    rˆt          d6¦  «         t          j        d7¦  «        pt          j        d¦  «        }|st#          d8¦  «         t          d9¦  «         nt          d:|› �¦  «         | d          
                    d;d<¦  «         �nÂ|
dk    �rt          d=¦  «         t          d>¦  «         dd?lm} dd@lm} t/          t1          ¦   «         ot3          | ¦  «        j        o
 |d¦  «        ¦  «        } |t          | ddA¦  «        ¦  «        }d.}|r@dBdCg}|dDk    rd}n|dEk    rd}nt7          dF¦  «        rdnd}t          dG||¦  «        }|dk    }|rIdD| d         dA<   t          dH¦  «         t7          dF¦  «        st7          dI¦  «        rt          dJ¦  «         �n®dE| d         dA<   t          dK¦  «         	 t9          d¦  «         n[# t:          $ rN t          dL¦  «         ddMlm}  |dg¦  «        }|j         dk    rt          dN¦  «         nt#          dO¦  «         Y nw xY wt	          ¦   «          t          dP¦  «         t          dQ¦  «         t7          dF¦  «        }|rgt          dR¦  «         t%          dSd.¦  «        rFtC          dTd0¬U¦  «        }tC          dVd0¬U¦  «        }|rtE          dF|¦  «         |rtE          dI|¦  «         �n„tC          dTd0¬U¦  «        }tC          dVd0¬U¦  «        }|rtE          dF|¦  «         |rtE          dI|¦  «         �n<|
dk    �r±t          dW¦  «         t          dX¦  «         t          dY¦  «         t          dZ¦  «         	 t9          d¦  «         n£# t:          $ r– t          d[¦  «         ddMlm}  |dg¦  «        }|j         dk    rt          d\¦  «         nWt#          d]¦  «         |j#        rAt          d^|j#         $                    ¦   «          %                    ¦   «         d_         › �¦  «         Y nw xY wt	          ¦   «          t7          d`¦  «        }|rRt          da¦  «         t%          dbd.¦  «        r2tC          dcd0¬U¦  «        }|rtE          d`|¦  «         t          dd¦  «         n2tC          dcd0¬U¦  «        }|rtE          d`|¦  «         t          de¦  «         | d          
                    dfd)¦  «         �n„|
dk    �rFt          dg¦  «         t          dh¦  «         t          di¦  «         	 t9          dj¦  «         n÷# t:          $ rê t          dk¦  «         ddl&}ddll'm(}  |¦   «         }|r)| )                    |dmdndotT          j+        djgd0d0¬p¦  «        }n'| )                    tT          j+        dqdmdndjgd0d0¬p¦  «        }|j         dk    rt          dr¦  «         nWt#          ds¦  «         |j#        rAt          d^|j#         $                    ¦   «          %                    ¦   «         d_         › �¦  «         Y nw xY wtY          | ¦  «         �n7|
dk    �r0t          dt¦  «         t          du¦  «         t7          dv¦  «        pdw} tC          dx| ¦  «        }!|!rtE          dv|!¦  «         t7          dy¦  «        pdw}"tC          dz|"pt[          j.        d{dw¦  «        ¦  «        }#|#rtE          dy|#¦  «         t7          d|¦  «        pd}}$tC          d~|$¦  «        }%|%r|%d}k    rtE          d||%¦  «         t7          d¦  «        pdw}&t          t          j        ¦   «         d€z  d�z  ¦  «        }'tC          d‚|&p|'¦  «        }(|(rtE          d|(¦  «         |!�r t%          dƒd0¦  «        rðt          d„¦  «         ddl&}g d…¢})|(r|) /                    d†|(g¦  «         |%r|%d}k    r|) /                    d‡|%g¦  «         |)                     |#r|#› dˆ|!› �n|!¦  «         |)                     d‰¦  «         | )                    |)d0d0dŠd‹dŒ¬�¦  «        }|j         dk    rt          dŽ¦  «         n8t#          d�|j#         $                    ¦   «         › �¦  «         t          d�¦  «         tE          d‘|
¦  «         |
dk    r*tE          d’| d          	                    dAd“¦  «        ¦  «         |
dk    r*tE          d”| d          	                    d•d–¦  «        ¦  «         ta          | ¦  «         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.rs  z8/user-guide/configuration#terminal-backend-configurationræ   rç   rß   rÐ   Ú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 environmentzCVercel Sandbox - cloud microVM with snapshot filesystem persistenceÚdockerrè   ÚsshÚdaytonaÚvercel_sandbox)r   rv   é   r·   é   é   rv   rÛ  r·   rÜ  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.rb  z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-nodejs20zFDocker sandboxes can be protected with the egress credential firewall.ziIt routes sandbox traffic through iron-proxy so containers receive proxy tokens instead of real API keys.zO   Docker only for now; Modal, SSH, Daytona, and Singularity are not wired yet.z.  Enable egress firewall for Docker sandboxes?FÚproxyTÚenabledÚenforce_on_dockerz!Egress firewall enabled in configzYRun `hermes egress setup` then `hermes egress start` to mint tokens and launch the proxy.zMSkipping egress firewall. You can enable it later with `hermes egress setup`.z'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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...r‘  zmodal SDK installedu5   Install failed â€” run manually: uv pip install modalzModal authentication:z/  Get your token at: https://modal.com/settingsz!  Modal token: already configuredz  Update Modal credentials?z    Modal Token IDr¼   z    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 installedu7   Install failed â€” run manually: uv pip install daytonaz	  Error: rˆ   ÚDAYTONA_API_KEYz%  Daytona API key: already configuredz  Update API key?z    Daytona API keyz    Updatedz    ConfiguredÚdaytona_imagez Terminal backend: Vercel SandboxzDCloud microVM sandboxes with snapshot-backed filesystem persistence.z=Requires the optional SDK: pip install 'hermes-agent[vercel]'ÚvercelzInstalling vercel SDK...)Ú	ensure_uvÚpipr‹  z--python)Úcapture_outputÚtextz-mzvercel SDK installeduC   Install failed â€” run manually: pip install 'hermes-agent[vercel]'zTerminal backend: SSHz)Run commands on a remote machine via SSH.ÚTERMINAL_SSH_HOSTrF   z  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 okr]  Úreplaceé
   )rò  ró  r^  Úerrorsr—  z  SSH connection successful!z  SSH connection failed: z'  Check your SSH key and host settings.ÚTERMINAL_ENVÚTERMINAL_MODAL_MODEÚautorJ  rG  rH  zTerminal backend set to: )1rš  r_   ra   rw  r\   rM   Úsystemrÿ   rš   r   r9  rb   r   r   Úhomer„  r…  rc   rª   Útools.managed_tool_gatewayræ  Útools.tool_backend_helpersrç  ri   r   r   r  rV   Ú
__import__ÚImportErrorrž  r’  rŸ  r€   rT   r   r   Ú
splitlinesr™  Úhermes_cli.managed_uvrð  r›  rh   Ú
executablerZ  r¡   ÚgetenvrÄ  rS   )*r
   Ú	_platformÚcurrent_backendÚis_linuxÚterminal_choicesÚidx_to_backendÚbackend_to_idxÚnext_idxrÉ  Úterminal_idxÚselected_backendÚ
docker_binÚ	proxy_cfgÚsing_binræ  rç  Úmanaged_modal_availablerè  Úuse_managed_modalÚmodal_choicesÚdefault_modal_idxÚmodal_mode_idxr’  r¢  Úexisting_tokenÚtoken_idÚtoken_secretÚexisting_keyr'   r™  rð  Úuv_binÚcurrent_hostÚhostÚcurrent_userÚuserÚcurrent_portÚportÚcurrent_keyÚdefault_keyÚssh_keyÚssh_cmds*                                             r   Úsetup_terminal_backendr-  +  s]  € à Ð Ð Ð ÝÐ#Ñ$Ô$Ð$ÝÐBÑCÔCÐCÝÐIÑJÔJÐJÝÐ`�JÐ`Ð`Ð`ÑaÔaÐaÝ	�G„G€Gå˜f j°)ÀWÐMÑMÔM€OØ×ÒÑ!Ô! WÒ,€Hðð ð Ðð ! X°'¸eÈ	ÐVfÐgÐg€NØ ¨A¸À!ÐPQÐefÐgÐg€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ÝÐ;Ñ<Ô<Ð<ð 	ˆzÔ×%Ò% e­Sµ´±´Ñ-=Ô-=Ñ>Ô>Ð>Ñ>à	˜XÒ	%Ñ	%ÝÐ0Ñ1Ô1Ð1õ ”\ (Ñ+Ô+ˆ
Øð 	6ÝÐ5Ñ6Ô6Ð6ÝÐLÑMÔMÐMÐMåÐ4¨
Ð4Ð4Ñ5Ô5Ð5ð 	ˆzÔ×%Ò%ØÐHñ	
ô 	
ð 	
õ 	‰ŒˆÝÐ[Ñ\Ô\Ð\Ýð5ñ	
ô 	
ð 	
õ 	Ø]ñ	
ô 	
ð 	
õ ÐIÈ5ÑQÔQð 	Ø×)Ò)¨'°2Ñ6Ô6ˆIØ#'ˆI�iÑ Ø× Ò Ð!4°dÑ;Ô;Ð;ÝÐ=Ñ>Ô>Ð>Ýð/ñô ð ñ õ
 Ø_ñô ð ñ ð 
˜]Ò	*Ð	*ÝÐ?Ñ@Ô@Ð@õ ”< Ñ,Ô,ÐKµ´¸]Ñ0KÔ0KˆØð 	-ÝÐDÑEÔEÐEÝØRñô ð ð õ Ð+ Ð+Ð+Ñ,Ô,Ð,ð 	ˆzÔ×%Ò%ØØAñ	
ô 	
ð 	
ñ 	
ð
 
˜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ñ	#
ô #
Ðð *Ð)­'°&¸*ÀlÑ*SÔ*SÑTÔTˆ
Ø!ÐØ"ð 	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ð
[Ý˜7Ñ#Ô#Ð#Ð#øÝð [ð [ð [ÝÐ4Ñ5Ô5Ð5Ø@Ð@Ð@Ð@Ð@Ð@à%˜ w iÑ0Ô0�ØÔ$¨Ò)Ð)Ý!Ð"7Ñ8Ô8Ð8Ð8å!Ð"YÑZÔZÐZøøð[øøøõ ‰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ùà	˜YÒ	&Ñ	&ÝÐ1Ñ2Ô2Ð2ÝÐ?Ñ@Ô@Ð@ÝÐWÑXÔXÐXÝÐ3Ñ4Ô4Ð4ð	UÝ�yÑ!Ô!Ð!Ð!øÝð 
	Uð 
	Uð 
	UÝÐ2Ñ3Ô3Ð3Ø<Ð<Ð<Ð<Ð<Ð<à!�\ 9 +Ñ.Ô.ˆFØÔ  AÒ%Ð%ÝÐ5Ñ6Ô6Ð6Ð6åÐWÑXÔXÐXØ”=ð UÝÐS¨6¬=×+>Ò+>Ñ+@Ô+@×+KÒ+KÑ+MÔ+MÈbÔ+QÐSÐSÑTÔTÐTøøð
	Uøøøõ 	‰ŒˆÝ$Ð%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°'Ñ:Ô:Ð:ÝÐ.Ñ/Ô/Ð/ð 	ˆzÔ×%Ò%ØÐIñ	
ô 	
ð 	
ñ 	
ð 
Ð-Ò	-Ñ	-ÝÐ8Ñ9Ô9Ð9ÝÐYÑZÔZÐZÝÐRÑSÔSÐSð	UÝ�xÑ Ô Ð Ð øÝð 	Uð 	Uð 	UÝÐ1Ñ2Ô2Ð2ØÐÐÐð 8Ð7Ð7Ð7Ð7Ð7à�Y‘[”[ˆFØð Ø#ŸšØ˜U I¨z½3¼>È8ÐTØ#'Øð (ñ ô ��ð $ŸšÝ”^ T¨5°)¸XÐFØ#'Øð (ñ ô �ð
 Ô  AÒ%Ð%ÝÐ4Ñ5Ô5Ð5Ð5åÐcÑdÔdÐdØ”=ð UÝÐS¨6¬=×+>Ò+>Ñ+@Ô+@×+KÒ+KÑ+MÔ+MÈbÔ+QÐSÐSÑTÔTÐTøøð;	Uøøøõ> 	(¨Ñ/Ô/Ð/Ñ/à	˜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ÐV]ÐfoÐy{�^Ñ|Ô|ˆ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Ñ[Ô[Ð[ØÐ+Ò+Ð+ÝÐ0°&¸Ô2D×2HÒ2HÐIYÐ[cÑ2dÔ2dÑeÔeÐeÝ�ÑÔÐÝ	�G„G€GÝÐ@Ð.>Ð@Ð@ÑAÔAÐAÐAÐAs9   Ñ=R ÒAS%Ó$S%ØX( Ø(B[Û[ß_ ßC1cãcc                 óÔ  — d|                       di ¦  «        d<   t          d¦  «         d|                       di ¦  «        d<   d|                       d	i ¦  «        d
<   d| d	         d<   d|                       di ¦  «        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.é–   rD   Ú	max_turnsÚHERMES_MAX_ITERATIONSÚallr}   Útool_progressTÚcompressionrâ  ç      à?Ú	thresholdÚnoneÚsession_resetÚmodezApplied recommended defaults:z  Max iterations: 150z  Tool progress: allz  Compression threshold: 0.50z2  Session reset: never (use /reset or compression)z.  Run `hermes setup agent` later to customize.N)r9  rU   rS   rb   ra   rÒ  s    r   Ú_apply_default_agent_settingsr:  |  sú   € à25€F×Ò�g˜rÑ"Ô" ;Ñ/õ
 Ð,Ñ-Ô-Ð-à8=€F×Ò�i Ñ$Ô$ _Ñ5à6:€F×Ò�m RÑ(Ô(¨Ñ3Ø)-€Fˆ=Ô˜+Ñ&ð
 6<€F×Ò�o rÑ*Ô*¨6Ñ2å�ÑÔÐÝÐ1Ñ2Ô2Ð2ÝÐ&Ñ'Ô'Ð'ÝÐ%Ñ&Ô&Ð&ÝÐ.Ñ/Ô/Ð/ÝÐCÑDÔDÐDÝÐ?Ñ@Ô@Ð@Ð@Ð@r   c           	      óv  — t          d¦  «         t          dt          › d�¦  «         t          ¦   «          t	          t          | ddd¬¦  «        ¦  «        }t          d¦  «         t          d	¦  «         t          d
|› d�¦  «         t          d|¦  «        }	 t          |¦  «        }|dk    rP||                      di ¦  «        d<   |  	                    dd¦  «         t          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¦  «         t          d¦  «         t          | d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(<   t          | d'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          d0¦  «         t          d¦  «         t          d1¦  «         t          d2¦  «         t          d3¦  «         t          d¦  «         t          d4¦  «         t          d¦  «         g d5¢}	|                      d6i ¦  «        }
|
                     d7d8¦  «        }|
                     d9d:¦  «        }|
                     d;d<¦  «        }dd=d>d?d@œ                     |d?¦  «        }t%          dA|	|¦  «        }|                      d6i ¦  «         |dk    rÿdB| d6         d7<   t          dCt	          |¦  «        ¦  «        }	 t          |¦  «        }|dk    r|| d6         d9<   n# t          $ r Y nw xY wt          dDt	          |¦  «        ¦  «        }	 t          |¦  «        }d|cxk    rdEk    rn n|| d6         d;<   n# t          $ r Y nw xY wt          dF| d6                              d9d:¦  «        › dG| d6                              d;d<¦  «        › dH�¦  «         �nU|d=k    rˆdI| d6         d7<   t          dCt	          |¦  «        ¦  «        }	 t          |¦  «        }|dk    r|| d6         d9<   n# t          $ r Y nw xY wt          dF| d6                              d9d:¦  «        › dJ�¦  «         nÇ|d>k    r’dK| d6         d7<   t          dDt	          |¦  «        ¦  «        }	 t          |¦  «        }d|cxk    rdEk    rn n|| d6         d;<   n# t          $ r Y nw xY wt          dL| d6                              d;d<¦  «        › dH�¦  «         n/|d?k    r)d8| d6         d7<   t          dM¦  «         t          dN¦  «         t          | ¦  «         dS )OzSConfigure agent behavior: iterations, progress display, compression, session reset.úAgent Settingsrs  z/user-guide/configurationrD   r0  éZ   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   Nr1  zMax iterations set to z%Invalid number, keeping current valuerF   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 logsuc     log     â€” Silent in chat; write every tool call to ~/.hermes/logs/tool_calls.log (gateway only)r}   r3  r2  zTool progress mode>   r2  ÚlogÚnewÚoffÚ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.Tr4  râ  r6  r5  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.)z6Inactivity + daily reset (reset whichever comes first)z6Inactivity only (reset after N minutes of no messages)z+Daily only (reset at a fixed hour each day)zRNever auto-reset (recommended - context lives until /reset or context compression)zKeep current settingsr8  r9  r7  Úidle_minutesi   Úat_hourrÜ  rv   rÛ  r·   )ÚbothÚidleÚdailyr7  zSession reset mode:rE  z  Inactivity timeout (minutes)z%  Daily reset hour (0-23, local time)é   zSessions reset after z min idle or daily at z:00rF  z min of inactivityrG  zSessions reset daily at zGSessions will never auto-reset. Context is managed only by compression.zFLong conversations will grow in cost. Use /reset manually when needed.)r_   ra   rw  r\   r   rM   r€   r”   r9  ÚpoprU   rb   r•   rc   rG   rS   r:  r   rš   )r
   Úcurrent_maxÚmax_iter_strÚmax_iterÚcurrent_moder9  Úcurrent_thresholdÚthreshold_strr6  Úreset_choicesÚcurrent_policyÚcurrent_idleÚcurrent_hourÚdefault_resetÚ	reset_idxÚidle_strÚidle_valÚhour_strÚhour_vals                      r   Úsetup_agent_settingsrZ  ˜  sU  € õ Ð!Ñ"Ô"Ð"ÝÐA�JÐAÐAÐAÑBÔBÐBÝ	�G„G€Gõ •g˜f g¨{ÀBÐGÑGÔGÑHÔH€KÝÐBÑCÔCÐCÝÐDÑEÔEÐEÝØa˜{ÐaÐaÐañô ð õ Ð*¨KÑ8Ô8€Lð?Ý�|Ñ$Ô$ˆØ�aŠ<ˆ<ð
 ;CˆF×Ò˜g rÑ*Ô*¨;Ñ7Ø�JŠJ�{ DÑ)Ô)Ð)ÝÐ4Ñ5Ô5Ð5ÝÐ=°8Ð=Ð=Ñ>Ô>Ð>øøÝð ?ð ?ð ?ÝÐ=Ñ>Ô>Ð>Ð>Ð>ð?øøøõ ˆr�N„N€NÝÐ&Ñ'Ô'Ð'ÝÐNÑOÔOÐOÝÐ>Ñ?Ô?Ð?ÝÐOÑPÔPÐPÝÐHÑIÔIÐIÝÐAÑBÔBÐBÝÐtÑuÔuÐuå˜6 9¨oÀuÐMÑMÔM€LÝÐ&¨Ñ5Ô5€DØ‡z‚z�|„|Ð>Ð>Ð>Ø˜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å ¨°{ÈDÐQÑQÔQÐÝÐ=½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   ÂA%C> Ã>DÄDÊ5*K  Ë 
K-Ë,K-Ñ? R  Ò 
R-Ò,R-Ó*S9 Ó9
TÔTÖ V% Ö%
V2Ö1V2Ø*X= Ø=
Y
Ù	Y
z^\d+:[A-Za-z0-9_-]{30,}$rW  c                 óP   — t          t                               | ¦  «        ¦  «        S ©N)ri   Ú_TELEGRAM_BOT_TOKEN_REÚmatch©rW  s    r   Ú_is_valid_telegram_bot_tokenr`  M  s   € ÝÕ&×,Ò,¨UÑ3Ô3Ñ4Ô4Ð4r   c                  óÄ   — 	 ddl m}  n# t          $ r Y dS w xY wd}	 t          t	          t          ¦   «         ¦  «        ¦  «        }n# t          $ r Y nw xY w | |¬¦  «        S )zBAttempt automatic Telegram bot creation via managed QR onboarding.r   )Úauto_setup_telegram_bot_resultN)Úprofile_name)Úhermes_cli.telegram_managed_botrb  r  Ú_profile_name_from_hermes_homer   rO   rk   )rb  rc  s     r   Ú_setup_telegram_auto_resultrf  Q  s�   € ðØRÐRÐRÐRÐRÐRÐRøÝð ð ð Øˆtˆtðøøøð  $€LðÝ5µd½?Ñ;LÔ;LÑ6MÔ6MÑNÔNˆˆøÝð ð ð Øˆðøøøð *Ð)°|ÐDÑDÔDÐDs   ‚	 ‰
–�(A Á
AÁAc                 ó4   — | j         j        dk    r| j        S dS )zAReturn the active profile name when HERMES_HOME is a profile dir.ÚprofilesN)re  r¹   )r  s    r   re  re  a  s!   € àÔÔ *Ò,Ð,ØÔÐØˆ4r   c                  ó4   — t          ¦   «         } | r| j        ndS )zBAttempt automatic Telegram bot creation and return only the token.N)rf  rW  )r¢  s    r   Ú_setup_telegram_autorj  h  s   € å(Ñ*Ô*€FØ!Ð+ˆ6Œ<ˆ< tÐ+r   c                  óŽ   — t          d¦  «         	 t          dd¬¦  «        } | sd S t          | ¦  «        st          d¦  «         Œ5| S )Nz'Create a bot via @BotFather on TelegramTzTelegram bot tokenr¼   znInvalid token format. Expected: <numeric_id>:<alphanumeric_hash> (e.g., 123456789:ABCdefGHI-jklMNOpqrSTUvwxYZ))ra   r€   r`  r`   r_  s    r   Ú_prompt_telegram_bot_tokenrl  n  sh   € ÝÐ8Ñ9Ô9Ð9ð
ÝÐ+°dÐ;Ñ;Ô;ˆØð 	Ø�4Ý+¨EÑ2Ô2ð 	Ýð@ñô ð ð Øˆr   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¦  «         t          ¦   «          t          d¦  «         t          d¦  «         t          d¦  «         t          ¦   «          t          d¦  «         t          d¦  «         t          ¦   «          t	          dd¬¦  «        }d}d}| 	                    ¦   «         dk    rit          ¦   «         }|r*|j        }t          |¦  «        st          d¦  «         d}d}nd}|s+t          ¦   «          t          d¦  «         t          ¦   «          |st          ¦   «         }|sdS t          d|¦  «         t          d¦  «         t          ¦   «          t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          ¦   «          t          |d d¦  «        }|r°t!          |¦  «        }t          d!|› �¦  «         t          d"d	¦  «        rot	          d#¦  «        }|g}|                     dd¦  «                             d$¦  «        D ]}	|	r|	|vr|                     |	¦  «         Œd$                     |¦  «        }nt	          d%¦  «        }nt	          d%¦  «        }|r6|                     dd¦  «        }t          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	          d0¦  «        }|rt          d.|¦  «         dS dS t          d1¦  «         t	          d2¦  «        }|rt          d.|¦  «         dS dS )3z1Configure 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!zAdd allowed users now?Tz6   To find your Telegram user ID: message @userinfobotz"Allowed user IDs (comma-separated)r�   rF   zTelegram allowlist configuredNz/How would you like to create your Telegram bot?z  [1] Automatic (recommended)u6         Scan a QR code â†’ confirm in Telegram â†’ done.z!      No token copy-paste needed.z  [2] Manualz?      Create a bot via @BotFather yourself and paste the token.zChoice [1/2]r�   rÐ   z7Automatic setup returned an invalid Telegram bot token.zFalling back to manual setup...zTelegram token savedu,   ðŸ”’ 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)Úowner_user_idz Detected your Telegram user ID: z+Allow this Telegram account to use the bot?z7Additional allowed user IDs (comma-separated, optional)Ú,z?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!u:   ðŸ“¬ Home Channel: where Hermes delivers cron job results,z.   cross-platform messages, and notifications.z:   For Telegram DMs, this is your user ID (same as above).r   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))r_   rV   ra   rª   r€   rT   rý  rb   r\   r   rf  rW  r`  r`   rl  rg   r   Úsplitrÿ   r¾   )rÌ  Úallowed_usersr˜   rW  Úsetup_resultÚdetected_user_idÚdetected_idÚextraÚidsÚuidÚfirst_user_idÚhome_channels               r   Ú_setup_telegramr~  }  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åÐ@ÑAÔAÐAÝ	�G„G€GÝÐ.Ñ/Ô/Ð/ÝÐGÑHÔHÐHÝÐ2Ñ3Ô3Ð3Ý	�G„G€GÝˆ~ÑÔÐÝÐPÑQÔQÐQÝ	�G„G€Gå�N¨CÐ0Ñ0Ô0€FØ€EØ€Là‡|‚|�~„~˜ÒÐÝ2Ñ4Ô4ˆØð 	Ø Ô&ˆEÝ/°Ñ6Ô6ð $ÝÐUÑVÔVÐVØ�Ø#�øàˆEØð 	Ý‰GŒGˆGÝÐ8Ñ9Ô9Ð9Ý‰GŒGˆGàð -Ý*Ñ,Ô,ˆØð ØˆåÐ'¨Ñ/Ô/Ð/ÝÐ(Ñ)Ô)Ð)å	�G„G€GÝÐ=Ñ>Ô>Ð>ÝÐ2Ñ3Ô3Ð3ÝÐ7Ñ8Ô8Ð8ÝÐKÑLÔLÐLÝ	�G„G€Gå˜|¨_¸dÑCÔCÐØð 
ÝÐ*Ñ+Ô+ˆÝÐF¸ÐFÐFÑGÔGÐGÝÐFÈÑMÔMð 
	ÝÐTÑUÔUˆEØ�-ˆCØ—}’} S¨"Ñ-Ô-×3Ò3°CÑ8Ô8ð $ð $�Øð $˜3 c˜>˜>Ø—J’J˜s‘O”O�OøØŸHšH S™MœMˆMˆMå"ØQñô ˆMˆMõ ØMñ
ô 
ˆð ð WØ%×-Ò-¨c°2Ñ6Ô6ˆÝÐ/°Ñ?Ô?Ð?ÝÐ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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.z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�   rF   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)r_   rV   ra   rª   r\   r€   rc   rT   Úrstriprb   rý  r   r”   r•   )rÌ  Ú
server_urlrq   ru  r}  Úwebhook_ports         r   Ú_setup_bluebubblesr‰  ô  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)Úhermes_cli.gatewayr‹  )Ú_gateway_setup_qqbots    r   r‹  r‹  5  s)   € àGÐGÐGÐGÐGÐGØÐÑÔÐÐÐ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¦  «         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)r_   rV   ra   rª   r\   rc   r€   rT   r   r”   rb   r•   r  rù   )rÌ  r(  Úsecretr.  s       r   Ú_setup_webhooksr”  ;  sH  € å�ÑÔÐÝÐ.Ñ/Ô/€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ÝÐCÑDÔDÐDÐDÐDs   Â:<C7 Ã7DÄDc           	      óæ  ‡.‡/— ddl m}mŠ/m} t	          d¦  «         t          d¦  «         t          d¦  «         t          ¦   «           |¦   «         }g }g }t          |¦  «        D ]U\  }} ‰/|¦  «        }|                     |d         › d|d         › d	|› d
�¦  «         |dk    r|                     |¦  «         ŒVt          d||¦  «        }	|	st          d¦  «         dS |	D ]}
 |||
         ¦  «         Œdt          dt          fd„Š.t          ˆ.ˆ/fd„ |¦   «         D ¦   «         ¦  «        }|�rCt          ¦   «          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    }|                     ¦   «         d-k    }|                     ¦   «         d.k    }dd/l m}m}m}m}m}m}m}m}m}m}m}m}m }m!}m"}m#} m$}!  |¦   «         }" |¦   «         }# |¦   «         }$|$p|p|}%t          ¦   «          |$r" |¦   «         r |¦   «          t          ¦   «          |$r" |¦   «         r |¦   «          t          ¦   «          |#�r|$r | ¦   «         r |!d0¦  «         �nbtK          d1d2¦  «        rá	 |$r |¦   «          n)|r |¦   «          n|rdd3l&m'}& |& (                    ¦   «          �n# |$ rP}'tS          d4¦  «         t          |'¦  «         *                    ¦   «         D ]}(t          d5|(› �¦  «         ŒY d}'~'�nÉd}'~'w|$ r(}'tS          d6|'› �¦  «          |!d0¦  «         Y d}'~'�nžd}'~'wtV          $ r}'tS          d6|'› �¦  «         Y d}'~'�nyd}'~'ww xY w�no|"�r|$r | ¦   «         r |!d7¦  «         �nStK          d8d2¦  «        rá	 |$r |¦   «          n)|r |¦   «          n|rdd3l&m'}& |& ,                    ¦   «          �n
# |$ rP}'tS          d9¦  «         t          |'¦  «         *                    ¦   «         D ]}(t          d5|(› �¦  «         ŒY d}'~'�nºd}'~'w|$ r(}'tS          d:|'› �¦  «          |!d7¦  «         Y d}'~'�n�d}'~'wtV          $ r}'tS          d:|'› �¦  «         Y d}'~'�njd}'~'ww xY w�n`|%�rÔ|$rd;})n|rd<})nd=})tK          d>|)› d?�d2¦  «        �rl	 d}*d@}+d@},|$r |d@¬A¦  «        \  }*}+n1|r |d@¬A¦  «         d2}+n dd3l&m'}& |& -                    d@¬A¦  «         d2}+d2},t          ¦   «          |+rØ|,sÖtK          dBd2¦  «        rÆ	 |$r ||*dCk    ¬D¦  «         n|r
 |¦   «          n¥# |$ rO}'tS          d9¦  «         t          |'¦  «         *                    ¦   «         D ]}(t          d5|(› �¦  «         ŒY d}'~'nVd}'~'w|$ r'}'tS          d:|'› �¦  «          |!d7¦  «         Y d}'~'n,d}'~'wtV          $ r}'tS          d:|'› �¦  «         Y d}'~'nd}'~'ww xY w�n# tV          $ r+}'tS          dE|'› �¦  «         t          dF¦  «         Y d}'~'nØd}'~'ww xY wt          dG¦  «         |$r&t]          j/        ¦   «         dk    rt          dH¦  «         t          dI¦  «         n‰ddJl0m1}-  |-¦   «         r[t          dK¦  «         t          dL¦  «         t          dM¦  «         t          dN¦  «         t          dO¦  «         t          dP¦  «         nt          dK¦  «         t          dQ¦  «         t          d¦  «         dS dS )Rz*Configure messaging platform integrations.r   )Ú_all_platformsÚ_platform_statusÚ_configure_platformúMessaging PlatformszAConnect to messaging platforms to chat with Hermes from anywhere.z&Toggle with Space, confirm with Enter.Úemojir�   r  z  (rÆ   Ú
configuredzSelect platforms to configure:zENo platforms selected. Run 'hermes setup gateway' later to configure.NÚstatusr   c                 óŒ   — |                       ¦   «         }|dk    p)|                     d¦  «        p|                     d¦  «         S )Núnot configuredÚ	partiallyzplugin disabled)rG   Ú
startswith)rœ  Úss     r   Ú_is_progressz#setup_gateway.<locals>._is_progress‹  sK   € Ø�LŠL‰NŒNˆàÐ!Ò!ð /Ø�|Š|˜KÑ(Ô(ð/à�|Š|Ð-Ñ.Ô.ð
ð 	
r   c              3   ó@   •K  — | ]} ‰ ‰|¦  «        ¦  «        V — Œd S r\  r£   )rñ   Úpr¢  r—  s     €€r   rô   z setup_gateway.<locals>.<genexpr>“  sJ   øè è € ð ð Ø./ˆˆÐ%Ð% aÑ(Ô(Ñ)Ô)ðð ð ð ð ð r   u–   â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�zMessaging platforms configured!ro  rs  rn  ÚDISCORD_BOT_TOKENÚDISCORD_HOME_CHANNELÚDiscordÚSLACK_BOT_TOKENÚSLACK_HOME_CHANNELÚSlackr€  rƒ  ÚBlueBubblesÚ	QQ_APP_IDÚ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Ö  ÚDarwinÚWindows)Ú_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ÚUserSystemdUnavailableErrorÚSystemScopeRequiresRootErrorÚ$_system_scope_wizard_would_need_rootÚ_print_system_scope_remediationÚrestartz)  Restart the gateway to pick up changes?T)Úgateway_windowsu0     Restart failed â€” user systemd not reachable:rŽ   z  Restart failed: r[  z  Start the gateway service?u.     Start failed â€” user systemd not reachable:z  Start failed: ÚsystemdÚlaunchdzScheduled Taskz  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 installz<  Or as a boot-time service: 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 processrF   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)2rŒ  r–  r—  r˜  r_   ra   r\   r�   rÿ   r²   r   ri   Úanyrb   rV   rc   r¾   Úupperrš  r  r²  r³  r´  rµ  r¶  r·  r¸  r¹  rº  r»  r¼  r½  r¾  r¿  rÀ  rÁ  rÂ  rª   Ú
hermes_clirÄ  rÃ  r`   r	  rk   r[  r‹  r¡   Úgeteuidr  rÈ  )0r
   r–  r˜  Ú	platformsr«   r¬   r—   Úplatrœ  r‰   r–   Úany_messagingÚmissing_homer  Ú	_is_linuxÚ	_is_macosÚ_is_windowsr²  r³  r´  rµ  r¶  r·  r¸  r¹  rº  r»  r¼  r½  r¾  r¿  rÀ  rÁ  rÂ  Úservice_installedÚservice_runningÚsupports_systemdÚsupports_service_managerrÄ  r¡  ÚlineÚsvc_nameÚinstalled_scopeÚdid_installÚstarted_inlinerÈ  r¢  r—  s0                                                 @@r   Úsetup_gatewayrÝ  j  s‰  øø€ àXÐXÐXÐXÐXÐXÐXÐXÐXÐXåÐ&Ñ'Ô'Ð'ÝÐRÑSÔSÐSÝÐ7Ñ8Ô8Ð8Ý	�G„G€Gà�Ñ Ô €Ið €EØ€LÝ˜YÑ'Ô'ð #ð #‰ˆˆ4Ø!Ð! $Ñ'Ô'ˆØ�Š˜˜WœÐCÐC¨¨W¬ÐCÐC¸&ÐCÐCÐCÑDÔDÐDØ�\Ò!Ð!Ø×Ò Ñ"Ô"Ð"øåÐ @À%ÈÑVÔV€Hàð ÝÐZÑ[Ô[Ð[Øˆàð ,ð ,ˆØÐ˜I cœNÑ+Ô+Ð+Ð+ð
�Sð 
¥Tð 
ð 
ð 
ð 
õ ð ð ð ð ð Ø3A°>Ñ3CÔ3Cðñ ô ñ ô €Mð ñ |Ý‰ŒˆÝ�:ÑÔÐÝÐ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ˆ	Ø×&Ò&Ñ(Ô(¨IÒ5ˆð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð( 2Ð1Ñ3Ô3ÐØ-Ð-Ñ/Ô/ˆØ4Ð4Ñ6Ô6ÐØ#3Ð#O°yÐ#OÀKÐ å‰ŒˆØð 	Ð =Ð =Ñ ?Ô ?ð 	Ø0Ð0Ñ2Ô2Ð2Ý‰GŒGˆGàð 	Ð 7Ð 7Ñ 9Ô 9ð 	Ø%Ð%Ñ'Ô'Ð'Ý‰GŒGˆGàñ n	QØð :Ð$HÐ$HÑ$JÔ$Jð :Ø/Ð/°	Ñ:Ô:Ð:Ñ:ÝÐJÈDÑQÔQð :ð:Ø'ð 2Ø'˜Ñ)Ô)Ð)Ð)Ø"ð 2Ø'˜Ñ)Ô)Ð)Ð)Ø$ð 2Ø>Ð>Ð>Ð>Ð>Ð>Ø'×/Ò/Ñ1Ô1Ð1ùøØ2ð +ð +ð +ÝÐ RÑSÔSÐSÝ # A¡¤× 1Ò 1Ñ 3Ô 3ð +ð +˜Ý˜k 4˜k˜kÑ*Ô*Ð*Ð*ð+ð +ð +ð +ñ +øøøøà3ð ?ð ?ð ?õ
  Ð 8°QÐ 8Ð 8Ñ9Ô9Ð9Ø3Ð3°IÑ>Ô>Ð>Ð>Ð>Ð>Ð>Ñ>øøøøÝ ð :ð :ð :ÝÐ 8°QÐ 8Ð 8Ñ9Ô9Ð9Ð9Ð9Ð9Ð9Ñ9øøøøð:øøøñ):ð, ñ U	QØð 8Ð$HÐ$HÑ$JÔ$Jð 8Ø/Ð/°Ñ8Ô8Ð8Ñ8ÝÐ=¸tÑDÔDð 8ð8Ø'ð 0Ø%˜™œ˜˜Ø"ð 0Ø%˜™œ˜˜Ø$ð 0Ø>Ð>Ð>Ð>Ð>Ð>Ø'×-Ò-Ñ/Ô/Ð/ùøØ2ð +ð +ð +ÝÐ PÑQÔQÐQÝ # A¡¤× 1Ò 1Ñ 3Ô 3ð +ð +˜Ý˜k 4˜k˜kÑ*Ô*Ð*Ð*ð+ð +ð +ð +ñ +øøøøà3ð =ð =ð =ÝÐ 6°1Ð 6Ð 6Ñ7Ô7Ð7Ø3Ð3°GÑ<Ô<Ð<Ð<Ð<Ð<Ð<Ñ<øøøøÝ ð 8ð 8ð 8ÝÐ 6°1Ð 6Ð 6Ñ7Ô7Ð7Ð7Ð7Ð7Ð7Ñ7øøøøð8øøøñ!8ð$ &ñ @	QØð ,Ø$��Øð ,Ø$��à+�ÝØf¨hÐfÐfÐfØñô ñ -Fð$QØ&*�OØ"'�KØ%*�NØ'ð .Ø7WÐ7WÐ^cÐ7dÑ7dÔ7dÑ4˜¨¨Ø"ð .Ø'˜¨eÐ4Ñ4Ô4Ð4Ø&*˜˜ð ?Ð>Ð>Ð>Ð>Ð>Ø'×/Ò/°eÐ/Ñ<Ô<Ð<Ø&*˜Ø)-˜Ý‘G”G�GØ"ð @¨>ð @½mÐLfÐhlÑ>mÔ>mð @ð@Ø/ð 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øøøøà;ð Eð Eð EÝ'Ð(>¸1Ð(>Ð(>Ñ?Ô?Ð?Ø;Ð;¸GÑDÔDÐDÐDÐDÐDÐDÐDøøøøÝ(ð @ð @ð @Ý'Ð(>¸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Ø#ð _­¬
©¬¸Ò(9Ð(9ÝÐ]Ñ^Ô^Ð^ÝÐ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å�:ÑÔÐÐÐðy|ð |sÊ   Ð6Q ÑS,ÑARÒS,ÒSÓS,ÓS'Ó'S,Ô6U ÕW;ÕAV&Ö&W;Ö.W×W;×W6×6W;Ø%A+] ÚZ1 Ú0] Ú1]Ú6A\ Û;] Ü ]Ü\*Ü%] Ü*]Ü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)rž  rá  )r
   rÞ  rá  s      r   Úsetup_toolsrã  Z	  s1   € ð 6Ð5Ð5Ð5Ð5Ð5à€M °fÐ=Ñ=Ô=Ð=Ð=Ð=r   c                 óÊ  — t          d¦  «         t          d¦  «         t          d¦  «         |                      d¦  «        }t          |t          ¦  «        si }|| d<   |                     d¦  «        }t          |t          ¦  «        si }||d<   |                     d¦  «        du }t          d|¬	¦  «        |d<   |d         rt          d
¦  «         dS t          d¦  «         dS )z<Configure the local, privacy-safe shared-metrics subscriber.úShared Metricsz<Shared metrics contain only bounded counters and histograms.z=Packages stay under this Hermes profile and are not uploaded.Ú	telemetryÚshared_metricsrâ  TzEnable local shared metrics?rÐ   zLocal shared metrics enabled.zLocal shared metrics disabled.N)r_   ra   r   r   r   rª   rb   )r
   ræ  rç  rm  s       r   Úsetup_telemetryrè  n	  s  € åÐ!Ñ"Ô"Ð"ÝÐMÑNÔNÐNÝÐNÑOÔOÐOà—
’
˜;Ñ'Ô'€IÝ�i¥Ñ&Ô&ð (Øˆ	Ø'ˆˆ{ÑØ—]’]Ð#3Ñ4Ô4€NÝ�n¥dÑ+Ô+ð 5ØˆØ&4ˆ	Ð"Ñ#à× Ò  Ñ+Ô+¨tÐ3€GÝ -Ø&Øð!ñ !ô !€N�9Ñð �iÔ ð 5ÝÐ5Ñ6Ô6Ð6Ð6Ð6åÐ3Ñ4Ô4Ð4Ð4Ð4r   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_varsrV   )r+   Úenv_vars     r   Ú_has_keyz0_model_section_has_credentials.<locals>._has_key¤	  sF   € ØÔ/ð 	ð 	ˆGð Ð3Ò3Ð3ØÝ˜WÑ%Ô%ð Ø�t�tðàˆur   r   Nr   rF   r$   )ÚOPENROUTER_API_KEYrÕ   r-   F)r)   rë  rk   r&   ri   r   r   r   r   rG   rV   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.ú(rv   r   )rt  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t          | ddd¬¦  «        }d	|› �S |d
k    rt          | d
dd¬¦  «        }d|› �S |dk    r7ddlm}m	Š ˆfd„ |¦   «         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   r›  ræ   rç   rß   rÐ   z	backend: rD   r0  r=  zmax turns: Úgatewayr   )r–  r—  c                 ón   •— g | ]1} ‰|¦  «        r$ ‰|¦  «        d k    ¯t          |d         ¦  «        ‘Œ2S )rž  r  )rù  )rñ   rÎ  r—  s     €r   r÷   z/_get_section_config_summary.<locals>.<listcomp>ð	  s[   ø€ ð 
ð 
ð 
àØÐ Ñ%Ô%ð
ð +;Ð*:¸4Ñ*@Ô*@ÐDTÒ*TÐ*Tõ *¨$¨w¬-Ñ8Ô8à*TÐ*TÐ*Tr   r¶   rµ   rÒ   zTTS/ElevenLabsÚBROWSERBASE_API_KEYÚBrowserÚFIRECRAWL_API_KEYÚ	Firecrawl)rõ  r   r   r   r   r   rM   rŒ  r–  r—  r¾   rV   rÿ   )	r
   rú  r   rç   r0  r–  r›  rµ   r—  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Øˆ|à	˜
Ò	"Ð	"Ý˜& *¨iÀÐIÑIÔIˆØ$˜7Ð$Ð$Ð$à	˜Ò	Ð	Ý˜F G¨[À"ÐEÑEÔEˆ	Ø(˜YÐ(Ð(Ð(à	˜	Ò	!Ð	!ØGÐGÐGÐGÐGÐGÐGÐGð

ð 
ð 
ð 
à&˜Ñ(Ô(ð
ñ 
ô 
ˆ
ð
 ð 	)Ø—9’9˜ZÑ(Ô(Ð(Øˆ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Ž   ru   z  Reconfigure ú?rÐ   )r  r\   rb   rª   rG   )r
   rú  r  Úsummarys       r   Ú_skip_configured_sectionr  
  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_SCRIPTrg  r  r  Úspec_from_file_locationÚloaderÚmodule_from_specrh   Úmodulesr¹   Úexec_modulerk   rI  )ÚspecÚmodÚ_syss      r   Ú_load_openclaw_migration_moduler  %
  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 )rœ  Ú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 )rœ  Úconflictr   r!  s     r   r÷   z,_print_migration_preview.<locals>.<listcomp>]
  r"  r   c                 óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS )rœ  Úskippedr   r!  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ÚdestinationrF   Ú~rü   z<22sõ    â†’ z:  Would overwrite (conflicts with existing Hermes config):rm   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   ra   r¯   r\   rY   rX   r‘   r   rý  r   r  rG   Ú_HIGH_IMPACT_KIND_KEYWORDSr«   Úaddrw   r“   r°   )r  r«   Úmigrated_itemsÚconflict_itemsÚskipped_itemsÚwarnings_shownÚitemr'  ÚdestÚ
dest_shortÚ
kind_lowerÚ
dest_lowerÚkeywordÚwarningrm   s                  r   Ú_print_migration_previewr9  Q
  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  r  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 errorr&  r$  Ú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.rD  zFull report saved to: z,Migration complete! Continuing with setup...)r   r  Úis_dirr  rg  r\   r_   ra   rª   rP   rS   rR   r  rc   rk   rz  r{  Úresolve_selected_optionsÚMigratorrc  Úmigrater   r9  rb   )r  Úopenclaw_dirÚconfig_pathr  r¡  r‰   Údry_migratorÚpreview_reportÚpreview_summaryÚpreview_countÚmigratorr  r  r  r&  Ú	conflictsrÿ  rD  s                     r   Ú_offer_openclaw_migrationrT  ‘
  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µ   ÚToolsræ  rå  rD   r<  c                 ó‚  — ddl m} t          ¦   «          t          t          dt          j        ¦  «        ¦  «         t          t          dt          j        ¦  «        ¦  «         t          t          dt          j        ¦  «        ¦  «         t          ¦   «          t          d¦  «         t          d¦  «         t          d¦  «         t          ¦   «          t          d	¦  «         t          ¦   «          	 dd
lm}  || ¦  «         n§# t          t          t          f$ r0 t          ¦   «          t          d¦  «         t          d¦  «         Y dS t          $ rU}t                               d|¦  «         t          ¦   «          t          d|› �¦  «         t          d¦  «         Y d}~dS d}~ww xY w	  |¦   «         }t!          |t"          ¦  «        r)|                      ¦   «          |                      |¦  «         n# t          $ r Y nw xY wt          ¦   «          t)          d¦  «         t          d¦  «         t          d¦  «         dS )uØ  One-shot Nous Portal setup â€” OAuth + model pick + provider + Tool Gateway.

    Wired into ``hermes setup --portal`` and ``hermes portal``. This is the
    Nous-Portal slice of the first-time quick setup, collapsed into a single
    shareable command so a brand-new user goes from zero to a fully working
    Hermes session â€” model selected, provider set, and web/image/tts/browser
    tools routed via their Portal sub â€” without being told to run
    ``hermes setup`` and hunt for the quick-setup option.

    The login + model selection + provider switch + Tool Gateway opt-in are all
    delegated to ``_model_flow_nous`` â€” the exact same flow quick setup uses
    (``_run_first_time_quick_setup``) and the same one ``hermes model`` runs
    when you pick Nous. Routing through it (instead of hand-rolling the auth +
    provider write here) means ``hermes portal`` always offers a model picker,
    and there is a single source of truth for the Nous onboarding steps.
    r   ©rR   rú   uC   â”‚     âš• Hermes Setup â€” Nous Portal (one-shot)             â”‚rû   z7  One subscription, 300+ models, plus the Tool Gateway:z9    web search, image generation, TTS, browser automationu0       â€” all routed through your Nous Portal sub.z>  Sign up: https://portal.nousresearch.com/manage-subscription©Ú_model_flow_nousz  Setup cancelled.z+  You can retry later with `hermes portal`.Nz1_model_flow_nous error during `hermes portal`: %sz*  Nous Portal setup encountered an error: zPortal setup complete.z.  Run `hermes portal info` to inspect routing.z!  Run `hermes` to start chatting.)rv  rR   r\   rY   rX   ÚMAGENTAra   rx  rZ  rz   r{   ry  rk   rz  r{  r`   r   r   r|  r}  rb   )r
   rR   rZ  r~  r  s        r   Ú_run_portal_one_shotr\  %  so  € ð" .Ð-Ð-Ð-Ð-Ð-å	�G„G€GÝ	Ýð @ÝŒNñ	
ô 	
ñô ð õ 
�%ÐUÕW]ÔWeÑ
fÔ
fÑgÔgÐgÝ	Ýð @ÝŒNñ	
ô 	
ñô ð õ 
�G„G€GÝÐHÑIÔIÐIÝÐJÑKÔKÐKÝÐAÑBÔBÐBÝ	�G„G€GÝÐOÑPÔPÐPÝ	�G„G€GðØ4Ð4Ð4Ð4Ð4Ð4àÐ˜Ñ Ô Ð Ð øÝ�x­Ð4ð 	ð 	ð 	õ 	‰ŒˆÝÐ'Ñ(Ô(Ð(ÝÐ@ÑAÔAÐAØˆˆÝð ð ð Ý�ŠÐHÈ#ÑNÔNÐNÝ‰ŒˆÝÐFÀÐFÐFÑGÔGÐGÝÐ@ÑAÔAÐAØˆˆˆˆˆøøøøðøøøðØ �[‘]”]ˆ
Ý�j¥$Ñ'Ô'ð 	&Ø�LŠL‰NŒNˆNØ�MŠM˜*Ñ%Ô%Ð%øøÝð ð ð Øˆðøøøõ 
�G„G€GÝÐ*Ñ+Ô+Ð+ÝÐ?Ñ@Ô@Ð@ÝÐ2Ñ3Ô3Ð3Ð3Ð3s3   Ã1D ÄAF'Å		F'ÅA
F"Æ"F'Æ+AG4 Ç4
HÈ H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          ¦   «         }|                     ¦   «         rldd
lm}	 |                     d|	                     ¦   «                              d¦  «        › �¦  «        }
	 ddl} |j        ||
¦  «         n# t*          $ r d}
Y nw xY wd}
t          | dd¦  «        }|st-          ¦   «         sd}|rt/          d¦  «         dS t	          t          | dd¦  «        ¦  «        rt1          |¦  «         dS t          | dd¦  «        }|�r!t2          D ]Ñ\  }}}||k    rÅt5          ¦   «          t5          t7          dt8          j        ¦  «        ¦  «         t5          t7          d|d›d�t8          j        ¦  «        ¦  «         t5          t7          dt8          j        ¦  «        ¦  «          ||¦  «         t          |¦  «         t5          ¦   «          t          |› d�¦  «          dS ŒÒt=          d|› �¦  «         t?          dd                      d„ t2          D ¦   «         ¦  «        › �¦  «         dS ddl!m"}  |¦   «         }t	          tG          d¦  «        ¦  «        pt	          tG          d¦  «        ¦  «        p|du}t5          ¦   «          t5          t7          dt8          j        ¦  «        ¦  «         t5          t7          dt8          j        ¦  «        ¦  «         t5          t7          d t8          j        ¦  «        ¦  «         t5          t7          d!t8          j        ¦  «        ¦  «         t5          t7          d"t8          j        ¦  «        ¦  «         t5          t7          dt8          j        ¦  «        ¦  «         d}|rŒ|rtI          ||¦  «         dS t5          ¦   «          tK          d#¦  «         t          d$¦  «         t?          d%¦  «         t?          d&¦  «         t?          d'¦  «         t?          d(¦  «         t?          d)¦  «         n“t5          ¦   «          |s|rt?          d*¦  «         t5          ¦   «          tM          |¦  «        }|rt          ¦   «         }tO          d+g d,¢d¦  «        }|dk    rtQ          |||¦  «         dS |d-k    rtS          |||¦  «         dS tK          d.¦  «         t?          d/t          ¦   «         › �¦  «         t?          d0tU          ¦   «         › �¦  «         t?          d1|› �¦  «         t?          d2tV          › �¦  «         t5          ¦   «          t?          d3¦  «         |r;t5          ¦   «          t?          d4¦  «         t?          d5¦  «         t?          d6¦  «         |rtY          |d7d8¦  «        st[          |¦  «         |rtY          |d9d:¦  «        st]          |¦  «         |st_          |¦  «         |rtY          |d;d<¦  «        sta          |¦  «         |rtY          |d=d>¦  «        stc          || ¬?¦  «         t          |¦  «         |
rJ|
                     ¦   «         r6t?          d@|
› �¦  «         t?          dA¦  «         t?          dB|
› dC|› �¦  «         te          ||¦  «         dS )Du   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 telemetry â€” just local shared metrics
      hermes setup agent     â€” just agent settings
    r   )Ú
is_managedÚmanaged_errorzrun setup wizardNÚresetFz Configuration reset to defaults.Úreconfigurerq  )Údatetimez
.yaml.bak.z%Y%m%d_%H%M%SÚnon_interactiveTz;Running in a non-interactive environment (no TTY detected).ÚportalÚsectionrú   u   â”‚     âš• Hermes Setup â€” z<34su    â”‚rû   z configuration complete!zUnknown setup section: zAvailable sections: r¶   c              3   ó"   K  — | ]
\  }}}|V — Œd S r\  r£   ©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.rF   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?)uX   Quick Setup (Nous Portal) â€” free OAuth login, no API keys, model + tools (recommended)uU   Full setup â€” configure every provider, tool & option yourself (bring your own keys)uQ   Blank Slate â€” everything off except the bare minimum; opt in to each capabilityrÛ  z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   rU  ræ   rÕ  rü  r™  rµ   rV  )rÞ  zPrevious config backed up to: z9If setup changed a value you customized, restore it with:z  cp r�   )3rv  r^  r_  rW   ri   rg   rS   ÚcopyÚdeepcopyrN   rb   rR   rO   rP   rg  rb  Úwith_suffixÚnowÚstrftimer„  Úcopy2rk   rl   ro   r\  ÚSETUP_SECTIONSr\   rY   rX   r[  r`   ra   r¾   r)   rë  rV   Ú_run_quick_setupr_   rT  rš   Ú_run_first_time_quick_setupÚ_run_blank_slate_setuprQ   ÚPROJECT_ROOTr  r€  r-  r:  rÝ  rã  r/  )Úargsr^  r_  Úreset_requestedÚreconfigure_requestedÚquick_requestedr
   r  rM  Ú_dtÚ_backup_pathr„  rc  re  r`  r  Úfuncrë  Úactive_providerÚis_existingÚmigration_ranÚ
setup_modes                         r   Úrun_setup_wizardr�  y  sZ  € ð <Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ø€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õ "Ñ#Ô#€KØ×ÒÑÔð Ø,Ð,Ð,Ð,Ð,Ð,Ø"×.Ò.Ø>˜Ÿš™œ×+Ò+¨OÑ<Ô<Ð>Ð>ñ
ô 
ˆð	 ØˆMˆMˆMØˆFŒL˜ lÑ3Ô3Ð3Ð3øÝð 	 ð 	 ð 	 ØˆLˆLˆLð	 øøøð ˆõ ˜dÐ$5°uÑ=Ô=€OØð Õ#7Ñ#9Ô#9ð Øˆàð Ý+ØIñ	
ô 	
ð 	
ð 	ˆõ �G�D˜( EÑ*Ô*Ñ+Ô+ð Ý˜VÑ$Ô$Ð$Øˆõ �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àð 3ð ð 	Ý˜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å"Ø2ðð ð ð
 ñ
ô 
ˆ
ð ˜Š?ˆ?Ý'¨°¸[ÑIÔIÐIØˆFØ˜Š?ˆ?Ý" 6¨;¸ÑDÔDÐDØˆ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Ñ&Ô&Ð&ð
 ð .Ý% fÑ-Ô-Ð-ð ð Õ6°v¸yÐJ_Ñ`Ô`ð Ý�fÑÔÐð ð ;Õ6°v¸wÈÑPÔPð ;Ý�F¨k¨/Ð:Ñ:Ô:Ð:õ �ÑÔÐØð 9˜×+Ò+Ñ-Ô-ð 9ÝÐB°LÐBÐBÑCÔCÐCÝÐNÑOÔOÐOÝÐ7˜<Ð7Ð7¨+Ð7Ð7Ñ8Ô8Ð8Ý˜ Ñ-Ô-Ð-Ð-Ð-s   ÅE ÅE&Å%E&r~  c                 ó  — ddl m} t          ¦   «          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 |¦   «         }|                      ¦   «          |                      |¦  «         t          | ¦  «         t!          | ¦  «         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+          | |¦  «         dS )uË  Streamlined first-time setup via Nous Portal: OAuth, model, terminal & messaging.

    Routes straight to the Nous Portal provider â€” runs the device-code OAuth
    login, picks a Nous model, then configures the terminal backend and (optionally)
    a messaging platform. Applies sensible defaults for everything else (agent
    settings, tools); the user can customize later via ``hermes setup <section>``
    or switch providers with ``hermes model``.
    r   rX  zNous Portalz5One subscription, 300+ models, plus the Tool Gateway:z8  web search, image generation, TTS, browser automation.z<Sign up: https://portal.nousresearch.com/manage-subscriptionrY  zNous Portal setup cancelled.z-_model_flow_nous error during quick setup: %sz(Nous Portal setup encountered an error: ru  Nz7Connect a messaging platform? (Telegram, Discord, etc.)z"Set up messaging now (recommended)u1   Skip â€” set up later with 'hermes setup gateway'z#Setup complete! You're ready to go.z)  Configure all settings:    hermes setupz1  Connect Telegram/Discord:  hermes setup gateway)rv  rR   r\   r_   ra   rx  rZ  rz   r{   rk   rz  r{  rc   r|  r}  r-  r:  rS   rš   rÝ  rb   r/  )r
   r  r~  rR   rZ  r~  r  Úgateway_choices           r   rs  rs  e  sL  € ð .Ð-Ð-Ð-Ð-Ð-õ 
�G„G€GÝ�ÑÔÐÝÐFÑGÔGÐGÝÐIÑJÔJÐJÝÐMÑNÔNÐNÝ	�G„G€Gð	AØ4Ð4Ð4Ð4Ð4Ð4ØÐ˜Ñ Ô Ð Ð øÝ�xÐ(ð 3ð 3ð 3Ý‰ŒˆÝÐ1Ñ2Ô2Ð2Ð2Ð2Ýð Að Að AÝ�ŠÐDÀcÑJÔJÐJÝÐFÀÐFÐFÑGÔGÐGÝÐ?Ñ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@øøøøðAøøøð �‘”€JØ
‡L‚L�N„N€NØ
‡M‚M�*ÑÔÐõ ˜6Ñ"Ô"Ð"õ " &Ñ)Ô)Ð)å�ÑÔÐõ 
�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å˜ Ñ-Ô-Ð-Ð-Ð-s   Á A2 Á2.C1Â"	C1Â+<C,Ã,C1c                 ó  — ddh}t          |¦  «        |                      di ¦  «        d<   	 ddlm} ddlm}m} t          ¦   «         }|                     d„ |D ¦   «         ¦  «         |                      |¦   «         ¦  «         | 	                    ¦   «         D ]†\  }}| 
                    d	¦  «        rŒt          |t          ¦  «        r|                     d
¦  «        rŒFt          |t          ¦  «        r|                     d¦  «        rŒq|                     |¦  «         Œ‡t          ||z
  ¦  «        }|r||                      di ¦  «        d<   dS dS # t          $ r&}	t                                d|	¦  «         Y d}	~	dS d}	~	ww xY w)uš  Write the minimal toolset state for a Blank Slate install.

    Only ``file`` and ``terminal`` are enabled. Two layers enforce this:

    1. ``platform_toolsets["cli"] = ["file", "terminal"]`` â€” an explicit list of
       configurable keys, which the resolver treats as authoritative
       (``has_explicit_config``) so default toolsets aren't re-expanded.
    2. ``agent.disabled_toolsets`` â€” a global hard-suppression list (applied last
       in ``_get_platform_tools``, overriding every other path including the
       non-configurable platform-toolset recovery that would otherwise re-add
       toolsets like ``kanban``). We list every known toolset except the two we
       keep, guaranteeing a true blank slate regardless of platform/recovery
       quirks. The user re-enables any of them later via ``hermes tools`` (which
       rewrites ``platform_toolsets``) or by editing ``agent.disabled_toolsets``.
    Úfileræ   Úplatform_toolsetsÚclir   )ÚTOOLSETS)ÚCONFIGURABLE_TOOLSETSÚ_get_plugin_toolset_keysc              3   ó"   K  — | ]
\  }}}|V — Œd S r\  r£   rg  s      r   rô   z0_blank_slate_minimal_toolsets.<locals>.<genexpr>Æ  s(   è è € Ð?Ð?™g˜a  A˜Ð?Ð?Ð?Ð?Ð?Ð?r   zhermes-ÚincludesÚposturerD   Údisabled_toolsetsz5blank-slate disabled_toolsets computation skipped: %sN)r°   r9  Útoolsetsrˆ  rž  r‰  rŠ  r¯   r}  r«   r   r   r   r   r-  rk   rz  r{  )
r
   Úkeeprˆ  r‰  rŠ  Úall_keysrh  ÚtdefÚdisabledr~  s
             r   Ú_blank_slate_minimal_toolsetsr”  ®  sÐ  € ð  �JÐ€DÝ8>¸t¹¼€F×ÒÐ)¨2Ñ.Ô.¨uÑ5ðSØ%Ð%Ð%Ð%Ð%Ð%Ø[Ð[Ð[Ð[Ð[Ð[Ð[Ð[å‘5”5ˆØ�ŠÐ?Ð?Ð)>Ð?Ñ?Ô?Ñ?Ô?Ð?Ø�ŠÐ0Ð0Ñ2Ô2Ñ3Ô3Ð3ð  —~’~Ñ'Ô'ð 	ð 	‰GˆAˆtØ�|Š|˜IÑ&Ô&ð ØÝ˜$¥Ñ%Ô%ð ¨$¯(ª(°:Ñ*>Ô*>ð ØÝ˜$¥Ñ%Ô%ð ¨$¯(ª(°9Ñ*=Ô*=ð Øð
 �LŠL˜‰OŒOˆOˆOå˜( T™/Ñ*Ô*ˆØð 	KØBJˆF×Ò˜g rÑ*Ô*Ð+>Ñ?Ð?Ð?ð	Kð 	Køåð Sð Sð SÝ�ŠÐLÈcÑRÔRÐRÐRÐRÐRÐRÐRÐRøøøøðSøøøs   ¬D E Å
F ÅE;Å;F c                 ór  — d|                       di ¦  «        d<   d|                       di ¦  «        d<   |                       di ¦  «        }d|d<   d|d	<   d|                       d
i ¦  «        d<   d|                       di ¦  «        d<   d|                       di ¦  «        d<   d|                       di ¦  «        d<   dS )zÊTurn OFF the optional config features for a Blank Slate install.

    Everything here is opt-in afterwards via ``hermes setup agent`` /
    ``hermes config set``. We keep only what's needed to run.
    r=  rD   r0  Fr4  râ  r  Úmemory_enabledÚuser_profile_enabledÚcheckpointsÚsmart_model_routingr7  r8  r9  r2  r}   r3  N)r9  )r
   Úmems     r   Ú_blank_slate_minimize_configr›  Þ  sÚ   € ð 35€F×Ò�g˜rÑ"Ô" ;Ñ/ð 7<€F×Ò�m RÑ(Ô(¨Ñ3ð ×
Ò
˜H bÑ
)Ô
)€CØ!€CÐÑØ"'€CÐÑð 7<€F×Ò�m RÑ(Ô(¨Ñ3Ø>C€F×ÒÐ+¨RÑ0Ô0°Ñ;Ø5;€F×Ò�o rÑ*Ô*¨6Ñ2ð 9>€F×Ò�i Ñ$Ô$ _Ñ5Ð5Ð5r   c                 óö  — t          ¦   «          t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          ¦   «          t          d	¦  «         t          | ¦  «         t	          | ¦  «         t          d
¦  «         t          | ¦  «         t          | ¦  «         t          | ¦  «         t	          | ¦  «         t          ¦   «          t          d¦  «         t          d¦  «         t          d¦  «         t          ¦   «          t          d¦  «         t          dddgd¦  «        }|dk    rët	          | ¦  «         	 ddl
m}  |d¦  «         n2# t          $ r%}t                               d|¦  «         Y d}~nd}~ww xY wt          ¦   «          t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          ¦   «          t          | |¦  «         dS t!          | |¦  «         dS )u,  Blank Slate setup â€” start with everything off except the bare minimum.

    Forces only the essentials to run an agent (provider + model, the file and
    terminal toolsets) and turns every other tool/skill/plugin/MCP/config
    feature OFF. After applying that minimal baseline, the user chooses one of
    two paths:

      1. Start with everything disabled â€” finish now with the minimal agent.
      2. Walk through every configuration â€” opt each capability back in.

    Either way nothing is enabled that the user did not explicitly choose.
    zBlank Slate SetupzAEverything starts OFF. First we force-enable only what's requiredz>to run an agent, then you choose whether to stop there or walku=   through enabling more â€” opting in to exactly what you want.rF   z7Forced on: Provider & Model, File Operations, Terminal.z9Everything else (web, browser, code exec, vision, memory,u=   delegation, cron, skills, plugins, MCP, â€¦) starts disabled.u&   Step 1 â€” Provider & Model (required)u   Step 2 â€” Terminal BackendzMinimal baseline applied:z0  Toolsets: file, terminal (everything else off)z6  Compression, memory, checkpoints, smart routing: offzHow far do you want to go?z'Your minimal agent is ready. What next?u<   Start with everything disabled â€” finish now (most minimal)uI   Walk through all configurations â€” opt in to tools, skills, plugins, MCPr   )Úset_bundled_skills_opt_outTz#blank-slate skill opt-out error: %sNõ3   Blank Slate setup complete â€” minimal agent ready.z!Enable anything later, on demand:z#  Enable tools:        hermes toolsú2  Seed skills:         hermes skills opt-in --syncú%  Add MCP servers:     hermes mcp addz%  Enable plugins:      hermes pluginsú)  Tune agent settings: hermes setup agent)r\   r_   ra   r€  rS   r-  r”  r›  rb   rš   Útools.skills_syncr�  rk   rz  r{  r/  Ú_blank_slate_walkthrough)r
   r  r~  Úpathr�  r~  s         r   rt  rt  ÷  s¨  € õ 
�G„G€GÝÐ$Ñ%Ô%Ð%ÝÐRÑSÔSÐSÝÐOÑPÔPÐPÝÐNÑOÔOÐOÝˆr�N„N€NÝÐHÑIÔIÐIÝÐJÑKÔKÐKÝÐNÑOÔOÐOÝ	�G„G€Gõ Ð9Ñ:Ô:Ð:Ý˜Ñ Ô Ð Ý�ÑÔÐõ Ð.Ñ/Ô/Ð/Ý˜6Ñ"Ô"Ð"õ " &Ñ)Ô)Ð)Ý  Ñ(Ô(Ð(Ý�ÑÔÐÝ	�G„G€GÝÐ-Ñ.Ô.Ð.ÝÐAÑBÔBÐBÝÐGÑHÔHÐHõ 
�G„G€GÝÐ-Ñ.Ô.Ð.ÝØ1àJØWð	
ð 	
ñô €Dð ˆq‚y€yÝ�FÑÔÐð	EØDÐDÐDÐDÐDÐDØ&Ð& tÑ,Ô,Ð,Ð,øÝð 	Eð 	Eð 	EÝ�LŠLÐ>ÀÑDÔDÐDÐDÐDÐDÐDÐDøøøøð	Eøøøå‰ŒˆÝÐKÑLÔLÐLÝÐ6Ñ7Ô7Ð7ÝÐ8Ñ9Ô9Ð9ÝÐGÑHÔHÐHÝÐ:Ñ;Ô;Ð;ÝÐ:Ñ;Ô;Ð;ÝÐ>Ñ?Ô?Ð?Ý‰ŒˆÝ˜V [Ñ1Ô1Ð1Øˆõ ˜V [Ñ1Ô1Ð1Ð1Ð1s   ÆF  Æ 
GÆ*G
Ç
Gc                 óî  — ddl m} t          ¦   «          t          d¦  «         t	          d¦  «         t          dd¬¦  «        }	 ddlm}m} |re |d¦  «          |d	¬
¦  «        }t          |t          ¦  «        r#t          |                     dg ¦  «        ¦  «        nd}t          d|› d�¦  «         n8 |d	¦  «         t	          d¦  «         t	          d¦  «         t	          d¦  «         nD# t          $ r7}t                               d|¦  «         t#          d|› �¦  «         Y d}~nd}~ww xY wt          ¦   «          t          d¦  «         t	          d¦  «         t	          d¦  «         t	          d¦  «         t          dd¬¦  «        rŒ	 ddlm}	  |	d| ¬¦  «          |¦   «         }
|                      ¦   «          |                      |
¦  «         nS# t          $ r7}t                               d|¦  «         t#          d|› �¦  «         Y d}~nd}~ww xY wt	          d¦  «         t          ¦   «          t          d¦  «         t          dd¬¦  «        rt	          d ¦  «         nt	          d!¦  «         t          ¦   «          t          d"¦  «         t          d#d¬¦  «        rt	          d$¦  «         nt	          d%¦  «         t          ¦   «          t          d&d¬¦  «        rt-          | ¦  «         t/          | ¦  «         t          ¦   «          t          d'¦  «         t	          d(¦  «         t	          d)¦  «         t	          d*¦  «         t	          d+¦  «         t          ¦   «          t1          | |¦  «         dS ),zIOpt-in walkthrough for Blank Slate: skills, tools, plugins, MCP, gateway.r   rX  zBundled Skillsz4Blank Slate ships with NO bundled skills by default.zBSeed the full bundled skill catalog? (No = start with zero skills)FrÐ   )r�  Úsync_skillsT)ÚquietÚcopiedzSeeded z bundled skills.z:No skills seeded. A .no-bundled-skills marker keeps futurez<`hermes update` runs from re-injecting them. Opt back in anyz(time with `hermes skills opt-in --sync`.z$blank-slate skill handling error: %sz'Skill setup step encountered an error: NrV  z2Pick exactly which additional toolsets to turn on.zA(file and terminal are already on; leave the rest off if you wantz the most minimal agent.)z,Open the tool selector to enable more tools?rà  râ  z#blank-slate tools_command error: %sz$Tool selector encountered an error: zAKeeping the minimal toolset. Add tools later with `hermes tools`.ÚPluginsz'Review and enable built-in plugins now?zEManage plugins with `hermes plugins list` / `hermes plugins install`.z4No plugins enabled. Add later with `hermes plugins`.zMCP ServerszAdd an MCP server now?zCAdd servers with `hermes mcp add <name> --url ... | --command ...`.z;No MCP servers configured. Add later with `hermes mcp add`.u6   Connect a messaging platform (Telegram, Discord, â€¦)?rž  z#  Enable more tools:   hermes toolsrŸ  r   r¡  )rv  rR   r\   r_   ra   rª   r¢  r�  r¦  r   r   r’   r   rb   rk   rz  r{  rc   rž  rá  r|  r}  rÝ  rS   r/  )r
   r  rR   Úseed_skillsr�  r¦  r¢  r¨  r~  rá  r  s              r   r£  r£  G  s  € à-Ð-Ð-Ð-Ð-Ð-õ 
�G„G€GÝÐ!Ñ"Ô"Ð"ÝÐEÑFÔFÐFÝØLØðñ ô €KðGØMÐMÐMÐMÐMÐMÐMÐMØð 
	Cà&Ð& uÑ-Ô-Ð-Ø �[ tÐ,Ñ,Ô,ˆFÝ6@ÀÍÑ6NÔ6NÐU•S˜Ÿš H¨bÑ1Ô1Ñ2Ô2Ð2ÐTUˆFÝÐ< FÐ<Ð<Ð<Ñ=Ô=Ð=Ð=à&Ð& tÑ,Ô,Ð,ÝÐSÑTÔTÐTÝÐUÑVÔVÐVÝÐAÑBÔBÐBøøÝð Gð Gð GÝ�ŠÐ;¸SÑAÔAÐAÝÐEÀÐEÐEÑFÔFÐFÐFÐFÐFÐFÐFøøøøðGøøøõ
 
�G„G€GÝ�ÑÔÐÝÐCÑDÔDÐDÝÐRÑSÔSÐSÝÐ*Ñ+Ô+Ð+ÝÐCÈUÐSÑSÔSð Xð		HØ=Ð=Ð=Ð=Ð=Ð=ØˆM¨°fÐ=Ñ=Ô=Ð=à$˜™œˆJØ�LŠL‰NŒNˆNØ�MŠM˜*Ñ%Ô%Ð%Ð%øÝð 	Hð 	Hð 	HÝ�LŠLÐ>ÀÑDÔDÐDÝÐFÀÐFÐFÑGÔGÐGÐGÐGÐGÐGÐGøøøøð	Høøøõ 	ÐVÑWÔWÐWõ 
�G„G€GÝ�ÑÔÐÝÐ>ÈÐNÑNÔNð KÝÐZÑ[Ô[Ð[Ð[åÐIÑJÔJÐJõ 
�G„G€GÝ�ÑÔÐÝÐ-°uÐ=Ñ=Ô=ð RÝÐXÑYÔYÐYÐYåÐPÑQÔQÐQõ 
�G„G€GÝÐMÐW\Ð]Ñ]Ô]ð Ý�fÑÔÐå�ÑÔÐå	�G„G€GÝÐGÑHÔHÐHÝÐ4Ñ5Ô5Ð5ÝÐCÑDÔDÐDÝÐ6Ñ7Ô7Ð7ÝÐ:Ñ;Ô;Ð;Ý	�G„G€Gå˜ Ñ-Ô-Ð-Ð-Ð-s2   ÁB'C- Ã-
D.Ã7-D)Ä)D.ÆAG Ç
HÇ-HÈH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_requiredr   ©rñ   Úvs     r   r÷   z$_run_quick_setup.<locals>.<listcomp>¦  s9   € ð ð ð ØÀÇÂÀmÑ@TÔ@TðØ	ðð ð r   F)Úrequired_onlyc                 ó<   — g | ]}|                      d ¦  «        °|‘ŒS r°  r   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…   rF   r»   z  Get key at: rq   r€   Tr¼   z  Saved z
  Skipped c                 óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS )ÚcategoryÚtoolr   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Úadvancedr   r²  s     r   r÷   z$_run_quick_setup.<locals>.<listcomp>Ù  sJ   € ð ð ð àØ�5Š5�ÑÔ Ò+Ð+°A·E²E¸*Ñ4EÔ4EÐ+ð 	
à+Ð+Ð+r   zTool API Keysrµ   r+  r¶   rÛ  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'.ÚTELEGRAMrn  ÚDISCORDr§  ÚSLACKrª  c                 óB   — g | ]}d dddœ                      ||¦  «        ‘ŒS )u   ðŸ“± Telegramu   ðŸ’¬ Discordu
   ðŸ’¼ Slack©rn  r§  rª  r   )rñ   r¤  s     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)rv  r¬  r­  r®  r\   r_   rb   ra   r’   rY   rX   r]   r   r€   rT   rc   r¾   rÿ   r²   rÀ   r9  rS   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_listrš  Úfields                               r   rr  rr  š  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){Ú__doc__Úimportlib.utilr  rh  Úloggingr¡   Úrer„  rh   rk  Úpathlibr   Útypingr   r   r   Úhermes_cli.nous_subscriptionr   r  r   r  r	   Ú	getLoggerÚ__name__rz  Ú__file__re  rc  ru  rw  r   r   r   r!   ri   r,   Ú_DEFAULT_PROVIDER_MODELSrI   rL   rv  rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   Úhermes_cli.colorsrX   rY   r_   Úhermes_cli.cli_outputr`   ra   rb   rc   Úhermes_cli.secret_promptrd   rl   ro   r€   Úcompiler‚   ry   Úlistr”   rŒ   rš   r¤   rª   r²   r   rÀ   r/  rD  rZ  rR  r€  r†  r¤  r¨  r­  r¼  rÐ  rÓ  r-  r:  rZ  r]  r`  rf  re  rj  rl  r~  r‰  r‹  r”  rÝ  rã  rè  rõ  rù  r  r  r  r  r,  r9  rT  rq  r\  r�  rs  r”  r›  rt  r£  rr  r£   r   r   ú<module>rà     s®  ððð ð Ð Ð Ð Ø €€€Ø €€€Ø 	€	€	€	Ø 	€	€	€	Ø €€€Ø 
€
€
€
Ø €€€Ø Ð Ð Ð Ð Ð Ø &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ð &à 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ð-ØØðð-ð ð ð ð ð	-ð( ð ð ð ð)-ð0 ð ð ð ð1-ð: 
ÐQÐQÐQð;-ð< ÐeÐeÐeð=-ð> ÐhÐhÐhð?-ð@ Ð Ð"7Ð8ðA-ðB ÐPÐPÐPðC-ðD ÐMÐMÐMðE-ðF ÐPÐPÐPðG-ðH ÐwÐwÐwðI-ðJ ð  |ð  |ð  |ðK-ðL ð  Qð  Qð  QðM-ðN ð  Yð  Yð  YðO-ðP ð ð ð ðQ-Ð ð` d¨3°¨8¤nð ¸ð ð ð ð ð+ $ s¨C x¤.ð +¸#ð +À$ð +ð +ð +ð +ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ,Ð +Ð +Ð +Ð +Ð +Ð +Ð +ð;˜ð ;ð ;ð ;ð ;ðð ð ð ð ð ð ð ð ð ð ð ð :Ð 9Ð 9Ð 9Ð 9Ð 9ð˜dð ð ð ð ðð °°d±
ð Àdð ð ð ð ð&ð �Sð  3ð ¸ð È#ð ð ð ð ð( &˜2œ:Ð&DÑEÔEÐ ð3 #ð 3¨#ð 3ð 3ð 3ð 3ðmð m Cð m°$ð mÀð mÐWZÐ]aÑWað mÐmpð mð mð mð mð(ð (˜Cð (¨$ð (¸ð (ÈsÐUYÉzð (Ðehð (ð (ð (ð (ðV˜4ð ð ð ð ð&#/ð #/˜Cð #/¨$ð #/¸$ð #/ð #/ð #/ð #/ðLð ˜Cð ¨ð ¸Dð ÈDð ð ð ð ð:I˜ð Ið Ið Ið Ið8F ð Fð Fð Fð FðR
'¨ð 'ð 'ð 'ð 'ðTB/¨Dð B/ð B/ð B/ð B/ðJð ¨¨t©ð ¸tÀCÈÀH¼~ð ð ð ð ðJ 9>ð 1ð 1ð 1 ð 1°ð 1ð 1ð 1ð 1ðrW˜$ð Wð Wð Wð Wð
6˜dð 6ð 6ð 6ð 6ðr ð ð ð ð ð8¨ð ð ð ð ð(¨ð (ð (ð (ð (ðViU ð iUð iUð iUð iUðX �dð  ð  ð  ð  ðIB 4ð IBð IBð IBð IBðb
A¨$ð Að Að Að Að8j ð jð jð jð jðd $˜œÐ$?Ñ@Ô@Ð ð5¨ð 5°ð 5ð 5ð 5ð 5ðEð Eð Eð °3¸±:ð ð ð ð ð,˜c D™jð ,ð ,ð ,ð ,ð C¨$¡Jð ð ð ð ðkBð kBð kBðn>Vð >Vð >VðBð ð ð,Eð ,Eð ,Eð^h˜$ð hð hð hð hð`>ð >˜ð >¨Tð >ð >ð >ð >ð(5˜Dð 5ð 5ð 5ð 5ð>;¨4ð ;°Dð ;ð ;ð ;ð ;ð|¨ð °ð ð ð ð ð4¨ð 4¸3ð 4À8ÈCÄ=ð 4ð 4ð 4ð 4ðn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�{Ð#ØÐ" OÐ4ØÐÐ 4Ð5ð€ðQ4 ð Q4¨$ð Q4ð Q4ð Q4ð Q4ðhi.ð i.ð i.ðXF.¨ð F.Èð F.ð F.ð F.ð F.ðR-S¨$ð -Sð -Sð -Sð -Sð`>¨ð >ð >ð >ð >ð2M2 4ð M2À4ð M2ð M2ð M2ð M2ð`P. Tð P.ð P.ð P.ð P.ðfc.˜Tð c.ð c.ð c.ð c.ð c.ð c.r   