§
    ‰eîi»� ã                   óZ  — U d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
mZ ddlmZ ddlmZmZmZmZmZ  ej        e¦  «        Z ej        ¦   «         dk    Z ej        d¦  «        Zi Zeeef         ed<    eh d	£¦  «        Zddl Z dd
l!m"Z"m#Z# ddl$m%Z% dZ&dddddœZ'dee         fd„Z(de)fd„Z*dee         fd„Z+defd„Z,�dÍdedefd„Z-�dÎdefd„Z.dee/         fd„Z0ddl1m2Z2 defd„Z3defd„Z4defd„Z5d„ Z6de)fd „Z7d!„ Z8d"eddfd#„Z9d$„ Z:d"efd%„Z;i d&d'“d(i “d)g “d*i “d+d,g“d-d.d/d0d1d'd2d3d4d5œ“d6i d7d8“d9d2“d:d;“d<d4“d=g “d>g “d?d@“dAdB“dCg “dDi “dEdF“dGdB“dHdB“dIdJ“dKdL“dMdN“dOd@“g dPd@dQœ¥“dRdSdTdPdPd@d'dUdVdWdPidXœ	“dYd@dZd[œ“d\d]“d^d_d`d`daœ“dbd@dcdddedfœ“dgdhdii“djd'd@g dkdlœd'd'dmdndoœdpœ“dqd2d'd'd'dSi dTdrœd2d'd'd'dsi dtœd2d'd'd'dSi dtœd2d'd'd'dTi d1duœd2d'd'd'dTi dtœd2d'd'd'dTi dtœd2d'd'd'dTi dtœd2d'd'd'dTi dtœdvœ“dwi dxdP“dydz“d{d|“d}d~“ddP“d€dP“d�dP“d‚dƒ“d„d@“d…dP“d†d‡“dˆd‰d‰dŠœ“d‹d@“dŒdP“d�i “dŽd“d�i ““d�d‘d‡i“i d’d“dPi“d”d•d–d—id˜d™dšœd›dœd�œdždŸd d¡d¢œd£d¤d¥œd'd'd¦d§d¨œd©œ“dªd@d8d«d'd¬œd&d­id&d®id¯œ“d–d°dSdPd@d±d²d³œ“d´dµd¶d·d¸œ“d¹dºd»i“d¼d@d@d½d¾d'd¿œ“dÀd'd'd'd'd@dZdÁd'd1dJd@dPdÂœ“dÃd'“dÄg d@dPdÅdPdÆœ“dÇi “dÈd'“dÉd@d'd'd@d@i d'dÊœ“dËi “dÌdÍi i“dÎdÍi i“dÏdÍi i“¥dÐd0dÑdÒœg i i dPi dPd@d@dÓdÔd@dPg g dÕœdÖœd@dd×œdØdÙidÚdÔd1dÛœd@dÜdÝi dÞœdßdPidPd.d@dÝdàœdái idâdãœ¥Z<g dä¢dådægg dç¢dègdégdêœZ=ee>ee         f         edë<   i Z?i dìdídîddPdïd@dðœ“dñdòdódôd@dõdögdïd@d÷œ“dødùdúdûd@dïd@dðœ“düdýdþdûd@dïd@dðœ“dÿ�d �dddPdïd@dðœ“�d�d�d�dd@dïd@dðœ“�d�d�dddPdïd@dðœ“�d�d	�d
�dd@dïd@dðœ“�d�d�dddPdïd@dðœ“�d�d�d�dd@dïd@dðœ“�d�d�d�dd@dïd@dðœ“�d�d�d�dd@dïd@dðœ“�d�d�dddPdïd@dðœ“�d�d�d�dd@dïd@dðœ“�d�d�d ddPdïd@dðœ“�d!�d"�d#�dd@dïd@dðœ“�d$�d%�d%�d&d@dïd@dðœ“i �d'�d(�d)ddPdïd@dðœ“�d*�d+�d+�d,d@dïd@dðœ“�d-�d.�d/ddPdïd@dðœ“�d0�d1�d2�d3d@dïd@dðœ“�d4�d5�d6ddPdïd@dðœ“�d7�d8�d9�d:d@dïd@dðœ“�d;�d<�d=ddPdïd@dðœ“�d>�d?�d@�dAd@dï�dBœ“�dC�dD�dEd'dPdï�dBœ“�dF�dG�dH�dId@dï�dBœ“�dJ�dK�dLd'dPdïd@dðœ“�dM�dN�dOddPdïd@dðœ“�dP�dQ�dR�dSdPdïd@dðœ“�dT�dU�dV�dSd@dïd@dðœ“�dW�dX�dYddPdïd@dðœ“�dZ�d[�d\�d]d@dïd@dðœ“�d^�d_�d`ddPdïd@dðœ“¥i �da�db�dc�d]d@dïd@dðœ“�dd�de�dfddPdïd@dðœ“�dg�dh�di�djd@dï�dBœ“�dk�dl�dmddPdïd@dðœ“�dn�do�dp�dqd@dïd@dðœ“�dr�ds�dtddPdïd@dðœ“�du�dv�dw�dxd@dï�dBœ“�dy�dz�d{ddPdïd@dðœ“�d|�d}�d~�ddPdïd@dðœ“�d€�d��d‚ddPdïd@dðœ“�dƒ�d„�d…�d†d@dï�dBœ“�d‡�dˆ�d‰ddPdïd@dðœ“�dŠ�d‹�dŒ�d��dŽ�d�gd@�d��d‘œ“�d’�d“�d”�d•�dŽ�d�gd@�d��d‘œ“�d–�d—�d˜�d™�dŽ�d�gd@�d��d‘œ“�dš�d›�dœddP�d�d@dðœ“�d��dž�dŸddP�d�d@dðœ“¥i �d �d¡�d¢ddP�d�d@dðœ“�d£�d¤�d¥ddP�d�d@dðœ“�d¦�d§�d¨dd@�d�d@dðœ“dè�d©�dª�d«g �d¬¢d@�d��d‘œ“�d­�d®�d¯�d°�d±�d²gd@�d��d‘œ“�d³�d´�dµ�d°�d±�d²gdP�d��d‘œ“�d¶�d·�d¸�d¹�d±�d²gd@�d��d‘œ“�dº�d»�d¼�d±�d²gdP�d��d½œ“�d¾�d¿�dÀ�dÁ�d±�d²gdP�d��d‘œ“�dÂ�dÃ�dÄ�dÅ�dÆgd@�d��d‘œ“�dÇ�dÈ�dÉ�dÊg �dË¢d@�d��d‘œ“�dÌ�dÍ�dÎ�dÏ�dÐ�dÑgd@�d��d‘œ“då�dÒ�dÓ�dÔ�dÕ�dÖgd@�d��d‘œ“dæ�d×�dØ�dÙd@�d��dBœ“�dÚ�dÛ�dÜ�dÝd@�d��dBœ“�dÞ�dß�dà�dád@�d��dBœ“�dâ�dã�dä�då�dægd@�d��d‘œ“¥i �dç�dè�dé�d��dêœ“�dë�dì�dí�dîd@�dï�dBœ“�dð�dñ�dò�dódP�dï�dBœ“�dô�dõ�dödP�dï�d÷œ“�dø�dù�dú�dûd@�dï�dBœ“�dü�dý�dþddP�dï�dBœ“�dÿ�d �dddP�dï�dBœ“�d�d�d�dd@�dï�dBœ“�d�d�d�dd@�dï�dBœ“�d	�d
�d�ddP�dï�dBœ“�d�d�ddd@�dï�dBœ“�d�d�dddP�dï�dBœ“�d�d�dddP�dï�dBœ“�d�d�dddP�dï�dBœ“�d�d�d�ddP�dï�dBœ“�d�d�ddd@�dï�dBœ“�d �d!�d"ddP�dï�dBœ“¥i �d#�d$�d%ddP�dï�dBœ“�d&�d'�d(ddP�dïd@dðœ“�d)�d*�d+ddP�dïd@dðœ“�d,�d-�d.ddP�dïd@dðœ“�d/�d0�d1ddP�dïd@dðœ“�d2�d3�d4dd@�dïd@dðœ“�d5�d6�d7�d8dP�dï�dBœ“�d9�d:�d;dd@�dï�dBœ“�d<�d=�d>ddP�dï�dBœ“�d?�d@�dA�dï�dêœ“�dB�dC�dD�dE�dï�dFœ“�dG�dH�dId@�dï�d÷œ“�dJ�dK�dL�dï�dêœ“�dM�dN�dO�dï�dêœ“�dP�dQ�dR�dï�dêœ“�dS�dT�dU�dï�dêœ“�dV�dW�dX�dï�dêœ“¥i �dY�dZ�d[�dï�dêœ“�d\�d]�d^ddP�dïd@dðœ“�d_�d`�daddP�dïd@dðœ“�db�dc�dddd@�dïd@dðœ“�de�df�dgddP�dïd@dðœ“�dh�di�djddP�dïd@dðœ“�dk�dl�dmddP�dïd@dðœ“�dn�do�dpddP�dïd@dðœ“�dq�dr�dsdd@�dïd@dðœ“�dt�du�dvddP�dï�dBœ“�dw�dx�dyddP�dï�dBœ“�dz�d{�d|dd@�dï�dBœ“�d}�d~�ddd@�d€�dBœ“�d��d‚�dƒddP�d€�dBœ“�d„�d…�d†ddP�d€�dBœ“�d‡�d…�dˆddP�d€�dBœ“�d‰�dŠ�d‹ddP�d€�dBœ“¥�dŒ�d��dŽddP�d€�dBœi¥Z@�dÏ�d�e)deeeef                  f�d�„ZA�d‘e/�d’ef�d“„ZBdeeeef                  f�d”„ZCdeeeef                  f�d•„ZDd'�d–œ�d—e�d˜edeeeef                  f�d™„ZE�dšedeeeef                  f�d›„ZF	 �dÐ�d‘eeeef                  deeeef                  f�dœ„ZG	 	 �dÑd&e�d�e�džeeeeef                           �d‘eeeef                  dee>         f
�dŸ„ZHdee>e>f         f�d „ZIh �d¡£ZJh �d¢£ZKh �d££ZLe G �d¤„ �d¥¦  «        ¦   «         ZM�dÐ�d‘eeeef                  de�d¥         f�d¦„ZN�dÐ�d‘eeeef                  ddf�d§„ZO�dÐ�d‘eeeef                  ddf�d¨„ZP�dÒ�d©e)�dªe)deeef         f�d«„ZQd«e/�d¬e/de/f�d­„ZR�d®„ ZS�d¯„ ZT�dÐ�d°„ZU�d‘eeef         deeef         f�d±„ZV�d‘eeef         deeef         f�d²„ZWdeeef         f�d³„ZXdeeef         f�d´„ZY�dµZZ�d¶Z[�d·Z\�d‘eeef         f�d¸„Z]deeef         f�d¹„Z^�dºe_de_f�d»„Z`de>f�d¼„Za�d½e�d¾edef�d¿„Zb�d½e�d¾ef�dÀ„Zc�d½ede)f�dÁ„Zd�dÐ�d¾ef�dÂ„Ze�dÐ�dÃ„Zf�dÐ�d¾ef�dÄ„Zg�d½e�d¾edeeef         f�dÅ„Zhde>f�dÆ„Zi�d½edee         f�dÇ„Zj�d½edef�dÈ„Zk�dÉ„ Zl�dÊ„ Zm�d½e�d¾ef�dË„Zn�dÌ„ ZodS (Ó  a»  
Configuration management for Hermes Agent.

Config files are stored in ~/.hermes/ for easy access:
- ~/.hermes/config.yaml  - All settings (model, toolsets, terminal, etc.)
- ~/.hermes/.env         - API keys and secrets

This module provides:
- hermes config          - Show current configuration
- hermes config edit     - Open config in editor
- hermes config set      - Set a specific value
- hermes config wizard   - Re-run setup wizard
é    N)Ú	dataclass)ÚPath)ÚDictÚAnyÚOptionalÚListÚTupleÚWindowsz^[A-Za-z_][A-Za-z0-9_]*$Ú_LAST_EXPANDED_CONFIG_BY_PATH>B   Ú	QQ_APP_IDÚQQ_STT_MODELÚTERMINAL_ENVÚWECOM_BOT_IDÚWECOM_SECRETÚWEIXIN_TOKENÚFEISHU_APP_IDÚWHATSAPP_MODEÚOPENAI_API_KEYÚQQ_STT_API_KEYÚSIGNAL_ACCOUNTÚANTHROPIC_TOKENÚMATRIX_PASSWORDÚOPENAI_BASE_URLÚQQ_HOME_CHANNELÚQQ_STT_BASE_URLÚSIGNAL_HTTP_URLÚWEIXIN_BASE_URLÚMATRIX_DEVICE_IDÚMATRIX_HOME_ROOMÚQQ_ALLOWED_USERSÚQQ_CLIENT_SECRETÚTERMINAL_SSH_KEYÚWEIXIN_DM_POLICYÚWHATSAPP_ENABLEDÚANTHROPIC_API_KEYÚFEISHU_APP_SECRETÚMATRIX_ENCRYPTIONÚTERMINAL_SSH_PORTÚWEIXIN_ACCOUNT_IDÚDINGTALK_CLIENT_IDÚFEISHU_ENCRYPT_KEYÚMATRIX_AUTO_THREADÚQQBOT_HOME_CHANNELÚQQ_ALLOW_ALL_USERSÚMATRIX_RECOVERY_KEYÚQQ_MARKDOWN_SUPPORTÚWECOM_CALLBACK_HOSTÚWECOM_CALLBACK_PORTÚWEIXIN_CDN_BASE_URLÚWEIXIN_GROUP_POLICYÚWEIXIN_HOME_CHANNELÚBLUEBUBBLES_PASSWORDÚDISCORD_HOME_CHANNELÚQQ_HOME_CHANNEL_NAMEÚSIGNAL_ALLOWED_USERSÚWECOM_CALLBACK_TOKENÚWEIXIN_ALLOWED_USERSÚMATTERMOST_REPLY_MODEÚTELEGRAM_HOME_CHANNELÚBLUEBUBBLES_SERVER_URLÚDINGTALK_CLIENT_SECRETÚMATRIX_REQUIRE_MENTIONÚQQ_GROUP_ALLOWED_USERSÚWECOM_CALLBACK_CORP_IDÚWEIXIN_ALLOW_ALL_USERSÚMATTERMOST_HOME_CHANNELÚQQBOT_HOME_CHANNEL_NAMEÚWECOM_CALLBACK_AGENT_IDÚWEIXIN_HOME_CHANNEL_NAMEÚFEISHU_VERIFICATION_TOKENÚMATRIX_FREE_RESPONSE_ROOMSÚSIGNAL_GROUP_ALLOWED_USERSÚWECOM_CALLBACK_CORP_SECRETÚWEIXIN_GROUP_ALLOWED_USERSÚWECOM_CALLBACK_ENCODING_AES_KEY)ÚColorsÚcolor)ÚDEFAULT_SOUL_MD)ÚtrueÚ1ÚyesÚHomebrewÚNixOS)ÚbrewÚhomebrewÚnixÚnixosÚreturnc                  ó  — t          j        dd¦  «                             ¦   «         } | r:|                      ¦   «         }|t          v rdS t
                               || ¦  «        S t          ¦   «         dz  }|                     ¦   «         rdS dS )z7Return the package manager owning this install, if any.ÚHERMES_MANAGEDÚ rU   z.managedN)	ÚosÚgetenvÚstripÚlowerÚ_MANAGED_TRUE_VALUESÚ_MANAGED_SYSTEM_NAMESÚgetÚget_hermes_homeÚexists)ÚrawÚ
normalizedÚmanaged_markers      ú3/home/div/.hermes/hermes-agent/hermes_cli/config.pyÚget_managed_systemrk   Q   sŠ   € å
Œ)Ð$ bÑ
)Ô
)×
/Ò
/Ñ
1Ô
1€CØ
ð :Ø—Y’Y‘[”[ˆ
ØÕ-Ð-Ð-Ø�7Ý$×(Ò(¨°SÑ9Ô9Ð9å$Ñ&Ô&¨Ñ3€NØ×ÒÑÔð ØˆwØˆ4ó    c                  ó"   — t          ¦   «         duS )a  Check if Hermes is running in package-manager-managed mode.

    Two signals: the HERMES_MANAGED env var (set by the systemd service),
    or a .managed marker file in HERMES_HOME (set by the NixOS activation
    script, so interactive shells also see it).
    N©rk   © rl   rj   Ú
is_managedrp   `   s   € õ ÑÔ tÐ+Ð+rl   c                  óB   — t          ¦   «         } | dk    rdS | dk    rdS dS )z;Return the preferred upgrade command for a managed install.rT   zbrew upgrade hermes-agentrU   zsudo nixos-rebuild switchNrn   )Úmanaged_systems    rj   Úget_managed_update_commandrs   j   s4   € å'Ñ)Ô)€NØ˜Ò#Ð#Ø*Ð*Ø˜Ò Ð Ø*Ð*Øˆ4rl   c                  ó"   — t          ¦   «         pdS )z<Return the best update command for the current installation.zhermes update)rs   ro   rl   rj   Úrecommended_update_commandru   t   s   € å%Ñ'Ô'Ð:¨?Ð:rl   úmodify this Hermes installationÚactionc                 ó  — t          ¦   «         pd}t          j        dd¦  «                             ¦   «                              ¦   «         }|dk    r|t
          v rdn|pd}d| › d|› d�S |d	k    r|pd
}d| › d|› d�S d| › d|› d�S )z/Build a user-facing error for managed installs.za package managerr\   r]   rU   rQ   zCannot z?: this Hermes installation is managed by NixOS (HERMES_MANAGED=ze).
Edit services.hermes-agent.settings in your configuration.nix and run:
  sudo nixos-rebuild switchrT   rW   zB: this Hermes installation is managed by Homebrew (HERMES_MANAGED=z#).
Use:
  brew upgrade hermes-agentz): this Hermes installation is managed by z:.
Use your package manager to upgrade or reinstall Hermes.)rk   r^   r_   r`   ra   rb   )rw   rr   rg   Úenv_hints       rj   Úformat_managed_messagerz   y   sô   € å'Ñ)Ô)Ð@Ð-@€NÝ
Œ)Ð$ bÑ
)Ô
)×
/Ò
/Ñ
1Ô
1×
7Ò
7Ñ
9Ô
9€Cà˜Ò Ð Ø Õ$8Ð8Ð8�6�6¸c¸mÀVˆð*�fð *ð *Ø'ð*ð *ð *ð	
ð ˜Ò#Ð#ØÐ$˜*ˆð*�fð *ð *Ø'ð*ð *ð *ð	
ð	C�&ð 	Cð 	CÀ>ð 	Cð 	Cð 	Cðrl   úmodify configurationc                 óV   — t          t          | ¦  «        t          j        ¬¦  «         dS )z+Print user-friendly error for managed mode.©ÚfileN)Úprintrz   ÚsysÚstderr)rw   s    rj   Úmanaged_errorr‚   •   s&   € å	Õ
  Ñ
(Ô
(­s¬zÐ:Ñ:Ô:Ð:Ð:Ð:rl   c                  ó´  — t           j                             d¦  «        dk    rdS ddlm}   | ¦   «         rdS t          ¦   «         dz  }	 i }t          |d¦  «        5 }|D ]q}|                     ¦   «         }d|v rW|                     d	¦  «        sB| 	                    d¦  «        \  }}}|                     ¦   «         ||                     ¦   «         <   Œr	 ddd¦  «         n# 1 swxY w Y   n# t          $ r Y dS w xY w|                     d
d¦  «        }|                     dd¦  «        }	|                     dd¦  «        }
|                     dd¦  «        }||	|
|dœS )a¹  Read container mode metadata from HERMES_HOME/.container-mode.

    Returns a dict with keys: backend, container_name, exec_user, hermes_bin
    or None if container mode is not active, we're already inside the
    container, or HERMES_DEV=1 is set.

    The .container-mode file is written by the NixOS activation script when
    container.enable = true. It tells the host CLI to exec into the container
    instead of running locally.
    Ú
HERMES_DEVrR   Nr   )Úis_containerz.container-modeÚrú=ú#ÚbackendÚdockerÚcontainer_namezhermes-agentÚ	exec_userÚhermesÚ
hermes_binz /data/current-package/bin/hermes)r‰   r‹   rŒ   rŽ   )r^   Úenvironrd   Úhermes_constantsr…   re   Úopenr`   Ú
startswithÚ	partitionÚFileNotFoundError)r…   Úcontainer_mode_fileÚinfoÚfÚlineÚkeyÚ_Úvaluer‰   r‹   rŒ   rŽ   s               rj   Úget_container_exec_inforœ   ž   sÄ  € õ 
„z‡~‚~�lÑ#Ô# sÒ*Ð*Øˆtà-Ð-Ð-Ð-Ð-Ð-Ø€|�~„~ð Øˆtå)Ñ+Ô+Ð.?Ñ?Ðð	ØˆÝÐ% sÑ+Ô+ð 	6¨qØð 6ð 6�Ø—z’z‘|”|�Ø˜$�;�; t§¢°sÑ';Ô';�;Ø$(§N¢N°3Ñ$7Ô$7‘M�C˜˜EØ(-¯ª©¬�D˜Ÿš™œÑ%øð	6ð	6ð 	6ð 	6ñ 	6ô 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6øøøð 	6ð 	6ð 	6ð 	6øøõ ð ð ð Øˆtˆtðøøøð �hŠh�y (Ñ+Ô+€GØ—X’XÐ.°Ñ?Ô?€NØ—’˜ hÑ/Ô/€IØ—’˜,Ð(JÑKÔK€Jð Ø(ØØ ð	ð ð s7   Á
C* ÁA5CÃC* ÃC"Ã"C* Ã%C"Ã&C* Ã*
C8Ã7C8©re   c                  ó$   — t          ¦   «         dz  S )zGet the main config file path.zconfig.yamlr�   ro   rl   rj   Úget_config_pathrŸ   Ò   s   € åÑÔ˜}Ñ,Ð,rl   c                  ó$   — t          ¦   «         dz  S )z&Get the .env file path (for API keys).z.envr�   ro   rl   rj   Úget_env_pathr¡   Ö   s   € åÑÔ˜vÑ%Ð%rl   c                  ób   — t          t          ¦  «        j        j                             ¦   «         S )z'Get the project installation directory.)r   Ú__file__ÚparentÚresolvero   rl   rj   Úget_project_rootr¦   Ú   s    € å•‰>Œ>Ô Ô'×/Ò/Ñ1Ô1Ð1rl   c                 ó6  — t          ¦   «         rdS 	 t          j                             dd¦  «                             ¦   «         }|rt          |d¦  «        nd}n# t          $ r d}Y nw xY w	 t          j        | |¦  «         dS # t          t          f$ r Y dS w xY w)uM  Set directory to owner-only access (0700 by default). No-op on Windows.

    Skipped in managed mode â€” the NixOS module sets group-readable
    permissions (0750) so interactive users in the hermes group can
    share state with the gateway service.

    The mode can be overridden via the HERMES_HOME_MODE environment variable
    (e.g. HERMES_HOME_MODE=0701) for deployments where a web server (nginx,
    caddy, etc.) needs to traverse HERMES_HOME to reach a served subdirectory.
    The execute-only bit on a directory permits cd-through without exposing
    directory listings.
    NÚHERMES_HOME_MODEr]   é   iÀ  )
rp   r^   r�   rd   r`   ÚintÚ
ValueErrorÚchmodÚOSErrorÚNotImplementedError)ÚpathÚmode_strÚmodes      rj   Ú_secure_dirr²   Þ   sÀ   € õ �|„|ð ØˆðÝ”:—>’>Ð"4°bÑ9Ô9×?Ò?ÑAÔAˆØ#+Ð6�s�8˜QÑÔÐ°ˆˆøÝð ð ð ØˆˆˆðøøøðÝ
Œ��tÑÔÐÐÐøÝÕ(Ð)ð ð ð Øˆˆðøøøs$   ’AA ÁA(Á'A(Á,B ÂBÂBc                  óŽ  — t           j                             d¦  «        st           j                             d¦  «        rdS t           j                             d¦  «        rdS 	 t          dd¦  «        5 } |                      ¦   «         }ddd¦  «         n# 1 swxY w Y   d|v sd	|v sd
|v rdS n# t          t          f$ r Y nw xY wdS )a3  Detect if we're running inside a Docker/Podman/LXC container.

    When Hermes runs in a container with volume-mounted config files, forcing
    0o600 permissions breaks multi-process setups where the gateway and
    dashboard run as different UIDs or the volume mount requires broader
    permissions.
    ÚHERMES_CONTAINERÚHERMES_SKIP_CHMODTz/.dockerenvz/proc/1/cgroupr†   NrŠ   ÚlxcÚkubepodsF)	r^   r�   rd   r¯   rf   r‘   Úreadr­   ÚIOError)r—   Úcgroup_contents     rj   Ú_is_containerr»   ø   s  € õ 
„z‡~‚~Ð(Ñ)Ô)ð ­R¬Z¯^ª^Ð<OÑ-PÔ-Pð Øˆtå	„w‡~‚~�mÑ$Ô$ð ØˆtðÝÐ" CÑ(Ô(ð 	&¨AØŸVšV™XœXˆNð	&ð 	&ð 	&ñ 	&ô 	&ð 	&ð 	&ð 	&ð 	&ð 	&ð 	&øøøð 	&ð 	&ð 	&ð 	&à�~Ð%Ð%¨°.Ð)@Ð)@ÀJÐR`ÐD`ÐD`Ø�4ð Eaøå•WÐð ð ð Øˆðøøøàˆ5s6   Á#B. Á3BÂB. ÂBÂB. ÂBÂB. Â.CÃCc                 óú   — t          ¦   «         st          ¦   «         rdS 	 t          j                             t          | ¦  «        ¦  «        rt          j        | d¦  «         dS dS # t          t          f$ r Y dS w xY w)uQ  Set file to owner-only read/write (0600). No-op on Windows.

    Skipped in managed mode â€” the NixOS activation script sets
    group-readable permissions (0640) on config files.

    Skipped in containers â€” Docker/Podman volume mounts often need broader
    permissions.  Set HERMES_SKIP_CHMOD=1 to force-skip on other systems.
    Ni€  )	rp   r»   r^   r¯   rf   Ústrr¬   r­   r®   )r¯   s    rj   Ú_secure_filer¾     s‹   € õ �|„|ð •}‘”ð ØˆðÝŒ7�>Š>�#˜d™)œ)Ñ$Ô$ð 	"ÝŒH�T˜5Ñ!Ô!Ð!Ð!Ð!ð	"ð 	"øåÕ(Ð)ð ð ð Øˆˆðøøøs    AA% Á%A:Á9A:Úhomec                 ó’   — | dz  }|                      ¦   «         rdS |                     t          d¬¦  «         t          |¦  «         dS )zISeed a default SOUL.md into HERMES_HOME if the user doesn't have one yet.zSOUL.mdNúutf-8©Úencoding)rf   Ú
write_textrP   r¾   )r¿   Ú	soul_paths     rj   Ú_ensure_default_soul_mdrÆ   #  sR   € à�yÑ €IØ×ÒÑÔð ØˆØ×Ò�°7ÐÑ;Ô;Ð;Ý�ÑÔÐÐÐrl   c                  ó®  — t          ¦   «         } t          ¦   «         rSt          j        d¦  «        }	 t	          | ¦  «         t          j        |¦  «         dS # t          j        |¦  «         w xY w|                      dd¬¦  «         t          | ¦  «         dD ]-}| |z  }|                     dd¬¦  «         t          |¦  «         Œ.t          | ¦  «         dS )a   Ensure ~/.hermes directory structure exists with secure permissions.

    In managed mode (NixOS), dirs are created by the activation script with
    setgid + group-writable (2770). We skip mkdir and set umask(0o007) so
    any files created (e.g. SOUL.md) are group-writable (0660).
    é   T)ÚparentsÚexist_ok©ÚcronÚsessionsÚlogsÚmemoriesN)re   rp   r^   ÚumaskÚ_ensure_hermes_home_managedÚmkdirr²   rÆ   )r¿   Ú	old_umaskÚsubdirÚds       rj   Úensure_hermes_homerÖ   ,  sÚ   € õ ÑÔ€DÝ�|„|ð &Ý”H˜U‘O”Oˆ	ð	 Ý'¨Ñ-Ô-Ð-åŒH�YÑÔÐÐÐø�BŒH�YÑÔÐÐøøøà�
Š
˜4¨$ˆ
Ñ/Ô/Ð/Ý�DÑÔÐØ>ð 	ð 	ˆFØ�v‘ˆAØ�GŠG˜D¨4ˆGÑ0Ô0Ð0Ý˜‰NŒNˆNˆNÝ Ñ%Ô%Ð%Ð%Ð%s   ²A ÁA-c                 óÒ   — |                       ¦   «         st          d| › d�¦  «        ‚dD ]-}| |z  }|                      ¦   «         st          |› d�¦  «        ‚Œ.t          | ¦  «         dS )zPManaged-mode variant: verify dirs exist (activation creates them), seed SOUL.md.zHERMES_HOME z7 does not exist. Run 'sudo nixos-rebuild switch' first.rË   N)Úis_dirÚRuntimeErrorrÆ   )r¿   rÔ   rÕ   s      rj   rÑ   rÑ   D  s£   € à�;Š;‰=Œ=ð 
Ýð5˜4ð 5ð 5ð 5ñ
ô 
ð 	
ð ;ð ð ˆØ�6‰MˆØ�xŠx‰zŒzð 	ÝØð 9ð 9ð 9ñô ð ð	õ ˜DÑ!Ô!Ð!Ð!Ð!rl   Úmodelr]   Ú	providersÚfallback_providersÚcredential_pool_strategiesÚtoolsetsz
hermes-cliÚagentéZ   i  é<   é   Úautoi„  é´   )Ú	max_turnsÚgateway_timeoutÚrestart_drain_timeoutÚapi_max_retriesÚservice_tierÚtool_use_enforcementÚgateway_timeout_warningÚgateway_notify_intervalÚterminalr‰   ÚlocalÚ
modal_modeÚcwdú.ÚtimeoutÚenv_passthroughÚshell_init_filesÚauto_source_bashrcTÚdocker_imageú*nikolaik/python-nodejs:python3.11-nodejs20Údocker_forward_envÚ
docker_envÚsingularity_imageú3docker://nikolaik/python-nodejs:python3.11-nodejs20Úmodal_imageÚdaytona_imageÚcontainer_cpué   Úcontainer_memoryi   Úcontainer_diski È  Úcontainer_persistentF)Údocker_volumesÚdocker_mount_cwd_to_workspaceÚpersistent_shellÚbrowseréx   é   Úmust_respondi,  Úmanaged_persistence)	Úinactivity_timeoutÚcommand_timeoutÚrecord_sessionsÚallow_private_urlsÚauto_local_for_private_urlsÚcdp_urlÚdialog_policyÚdialog_timeout_sÚcamofoxÚcheckpointsé2   )ÚenabledÚmax_snapshotsÚfile_read_max_charsi † Útool_outputiPÃ  iÐ  )Ú	max_bytesÚ	max_linesÚmax_line_lengthÚcompressionç      à?çš™™™™™É?é   )r  Ú	thresholdÚtarget_ratioÚprotect_last_nÚprompt_cachingÚ	cache_ttlÚ5mÚbedrocki  )r  Úprovider_filterÚrefresh_intervalÚasyncÚdisabled)Úguardrail_identifierÚguardrail_versionÚstream_processing_modeÚtrace)ÚregionÚ	discoveryÚ	guardrailÚ	auxiliary)ÚproviderrÚ   Úbase_urlÚapi_keyrò   Ú
extra_bodyÚdownload_timeoutih  )r4  rÚ   r5  r6  rò   r7  )r4  rÚ   r5  r6  rò   r7  Úmax_concurrency)ÚvisionÚweb_extractr  Úsession_searchÚ
skills_hubÚapprovalÚmcpÚtitle_generationÚdisplayÚcompactÚpersonalityÚkawaiiÚresume_displayÚfullÚbusy_input_modeÚ	interruptÚbell_on_completeÚshow_reasoningÚ	streamingÚfinal_response_markdownr`   Úinline_diffsÚ	show_costÚskinÚdefaultÚuser_message_previewé   )Úfirst_linesÚ
last_linesÚinterim_assistant_messagesÚtool_progress_commandÚtool_progress_overridesÚtool_preview_lengthÚ	platformsÚ	dashboardÚthemeÚprivacyÚ
redact_piiÚttsÚedgeÚvoicezen-US-AriaNeuralÚpNInz6obpgDQGcFmaJgBÚeleven_multilingual_v2)Úvoice_idÚmodel_idzgpt-4o-mini-ttsÚalloy)rÚ   r`  ÚeveÚeniÀ]  i ô )rc  ÚlanguageÚsample_rateÚbit_ratezvoxtral-mini-tts-2603z$c69964a6-ab8b-4f8a-9465-ec0925096ec8)rÚ   rc  zneuphonic/neutts-air-q4-ggufÚcpu)Ú	ref_audioÚref_textrÚ   Údevice)r4  r_  Ú
elevenlabsÚopenaiÚxaiÚmistralÚneuttsÚsttÚbase)rÚ   rh  z	whisper-1zvoxtral-mini-latest)r  r4  rî   rp  rr  zctrl+béÈ   g      @)Ú
record_keyÚmax_recording_secondsÚauto_ttsÚbeep_enabledÚsilence_thresholdÚsilence_durationÚhuman_delayÚoffi   iÄ	  )r±   Úmin_msÚmax_msÚcontextÚengineÚ
compressorÚmemoryi˜  i_  )Úmemory_enabledÚuser_profile_enabledÚmemory_char_limitÚuser_char_limitr4  Ú
delegationiX  )rÚ   r4  r5  r6  Úinherit_mcp_toolsetsÚmax_iterationsÚchild_timeout_secondsÚreasoning_effortÚmax_concurrent_childrenÚmax_spawn_depthÚorchestrator_enabledÚsubagent_auto_approveÚprefill_messages_fileÚskillsé
   )Úexternal_dirsÚtemplate_varsÚinline_shellÚinline_shell_timeoutÚguard_agent_createdÚhonchoÚtimezoneÚdiscord)Úrequire_mentionÚfree_response_channelsÚallowed_channelsÚauto_threadÚ	reactionsÚchannel_promptsÚserver_actionsÚwhatsappÚtelegramr¢  ÚslackÚ
mattermostÚmanualÚdeny)r±   rò   Ú	cron_modeÚtirithé   )r  ÚdomainsÚshared_files)r  Úredact_secretsÚtirith_enabledÚtirith_pathÚtirith_timeoutÚtirith_fail_openÚwebsite_blocklist)Úwrap_responseÚmax_parallel_jobsr±   ÚprojectÚINFO)ÚlevelÚmax_size_mbÚbackup_countzAhttps://hermes-agent.nousresearch.com/docs/api/model-catalog.jsoné   )r  ÚurlÚ	ttl_hoursrÛ   Ú
force_ipv4)Ú
auto_pruneÚretention_daysÚvacuum_after_pruneÚmin_interval_hoursÚseené   )Ú	approvalsÚcommand_allowlistÚquick_commandsÚhooksÚhooks_auto_acceptÚpersonalitiesÚsecurityrÌ   Úcode_executionÚloggingÚmodel_catalogÚnetworkrÍ   Ú
onboardingÚ_config_version)ÚFIRECRAWL_API_KEYÚBROWSERBASE_API_KEYÚBROWSERBASE_PROJECT_IDÚFAL_KEYÚVOICE_TOOLS_OPENAI_KEYÚELEVENLABS_API_KEY)r$   r   ÚWHATSAPP_ALLOWED_USERSÚSLACK_BOT_TOKENÚSLACK_APP_TOKENÚSLACK_ALLOWED_USERSÚTAVILY_API_KEYÚTERMINAL_MODAL_MODE)râ   é   r¬  r”  é   ÚENV_VARS_BY_VERSIONÚNOUS_BASE_URLzNous Portal base URL overridez.Nous Portal base URL (leave empty for default)r4  )ÚdescriptionÚpromptr½  ÚpasswordÚcategoryÚadvancedÚOPENROUTER_API_KEYz>OpenRouter API key (for vision, web scraping helpers, and MoA)zOpenRouter API keyzhttps://openrouter.ai/keysÚvision_analyzeÚmixture_of_agents)rã  rä  r½  rå  Útoolsræ  rç  ÚGOOGLE_API_KEYz<Google AI Studio API key (also recognized as GEMINI_API_KEY)zGoogle AI Studio API keyz&https://aistudio.google.com/app/apikeyÚGEMINI_API_KEYz3Google AI Studio API key (alias for GOOGLE_API_KEY)zGemini API keyÚGEMINI_BASE_URLz"Google AI Studio base URL overridez)Gemini base URL (leave empty for default)ÚXAI_API_KEYzxAI API keyzhttps://console.x.ai/ÚXAI_BASE_URLzxAI base URL overridez&xAI base URL (leave empty for default)ÚNVIDIA_API_KEYz;NVIDIA NIM API key (build.nvidia.com or local NIM endpoint)zNVIDIA NIM API keyzhttps://build.nvidia.com/ÚNVIDIA_BASE_URLzJNVIDIA NIM base URL override (e.g. http://localhost:8000/v1 for local NIM)z-NVIDIA NIM base URL (leave empty for default)ÚGLM_API_KEYzBZ.AI / GLM API key (also recognized as ZAI_API_KEY / Z_AI_API_KEY)zZ.AI / GLM API keyzhttps://z.ai/ÚZAI_API_KEYz$Z.AI API key (alias for GLM_API_KEY)zZ.AI API keyÚZ_AI_API_KEYÚGLM_BASE_URLzZ.AI / GLM base URL overridez-Z.AI / GLM base URL (leave empty for default)ÚKIMI_API_KEYzKimi / Moonshot API keyzKimi API keyzhttps://platform.moonshot.cn/ÚKIMI_BASE_URLz!Kimi / Moonshot base URL overridez'Kimi base URL (leave empty for default)ÚKIMI_CN_API_KEYzKimi / Moonshot China API keyzKimi (China) API keyÚSTEPFUN_API_KEYzStepFun Step Plan API keyzhttps://platform.stepfun.com/ÚSTEPFUN_BASE_URLz#StepFun Step Plan base URL overridez4StepFun Step Plan base URL (leave empty for default)ÚARCEEAI_API_KEYzArcee AI API keyzhttps://chat.arcee.ai/ÚARCEE_BASE_URLzArcee AI base URL overridez(Arcee base URL (leave empty for default)ÚMINIMAX_API_KEYzMiniMax API key (international)zMiniMax API keyzhttps://www.minimax.io/ÚMINIMAX_BASE_URLzMiniMax base URL overridez*MiniMax base URL (leave empty for default)ÚMINIMAX_CN_API_KEYz MiniMax API key (China endpoint)zMiniMax (China) API keyzhttps://www.minimaxi.com/ÚMINIMAX_CN_BASE_URLz!MiniMax (China) base URL overridez2MiniMax (China) base URL (leave empty for default)ÚDEEPSEEK_API_KEYz+DeepSeek API key for direct DeepSeek accesszDeepSeek API Keyz&https://platform.deepseek.com/api_keys)rã  rä  r½  rå  ræ  ÚDEEPSEEK_BASE_URLz'Custom DeepSeek API base URL (advanced)zDeepSeek Base URLÚDASHSCOPE_API_KEYz>Alibaba Cloud DashScope API key (Qwen + multi-provider models)zDashScope API Keyz-https://modelstudio.console.alibabacloud.com/ÚDASHSCOPE_BASE_URLzGCustom DashScope base URL (default: coding-intl OpenAI-compat endpoint)zDashScope Base URLÚHERMES_QWEN_BASE_URLzBQwen Portal base URL override (default: https://portal.qwen.ai/v1)z.Qwen Portal base URL (leave empty for default)ÚHERMES_GEMINI_CLIENT_IDzfGoogle OAuth client ID for google-gemini-cli (optional; defaults to Google's public gemini-cli client)uK   Google OAuth client ID (optional â€” leave empty to use the public default)z1https://console.cloud.google.com/apis/credentialsÚHERMES_GEMINI_CLIENT_SECRETz;Google OAuth client secret for google-gemini-cli (optional)z%Google OAuth client secret (optional)ÚHERMES_GEMINI_PROJECT_IDz@GCP project ID for paid Gemini tiers (free tier auto-provisions)z;GCP project ID for Gemini OAuth (leave empty for free tier)ÚOPENCODE_ZEN_API_KEYz=OpenCode Zen API key (pay-as-you-go access to curated models)zOpenCode Zen API keyzhttps://opencode.ai/authÚOPENCODE_ZEN_BASE_URLzOpenCode Zen base URL overridez/OpenCode Zen base URL (leave empty for default)ÚOPENCODE_GO_API_KEYz<OpenCode Go API key ($10/month subscription for open models)zOpenCode Go API keyÚOPENCODE_GO_BASE_URLzOpenCode Go base URL overridez.OpenCode Go base URL (leave empty for default)ÚHF_TOKENzVHugging Face token for Inference Providers (20+ open models via router.huggingface.co)zHugging Face Tokenz&https://huggingface.co/settings/tokensÚHF_BASE_URLz2Hugging Face Inference Providers base URL overridez%HF base URL (leave empty for default)ÚOLLAMA_API_KEYu>   Ollama Cloud API key (ollama.com â€” cloud-hosted open models)zOllama Cloud API keyzhttps://ollama.com/settingsÚOLLAMA_BASE_URLz?Ollama Cloud base URL override (default: https://ollama.com/v1)z)Ollama base URL (leave empty for default)ÚXIAOMI_API_KEYzhXiaomi MiMo API key for MiMo models (mimo-v2.5-pro, mimo-v2.5, mimo-v2-pro, mimo-v2-omni, mimo-v2-flash)zXiaomi MiMo API Keyzhttps://platform.xiaomimimo.comÚXIAOMI_BASE_URLzFXiaomi MiMo base URL override (default: https://api.xiaomimimo.com/v1)z)Xiaomi base URL (leave empty for default)Ú
AWS_REGIONz?AWS region for Bedrock API calls (e.g. us-east-1, eu-central-1)z
AWS RegionzIhttps://docs.aws.amazon.com/bedrock/latest/userguide/bedrock-regions.htmlÚAWS_PROFILEzFAWS named profile for Bedrock authentication (from ~/.aws/credentials)zAWS ProfileÚAZURE_FOUNDRY_API_KEYz0Azure Foundry API key for custom Azure endpointszAzure Foundry API Keyzhttps://ai.azure.com/ÚAZURE_FOUNDRY_BASE_URLzLAzure Foundry base URL (set via 'hermes model' for endpoint-specific config)zAzure Foundry base URLÚEXA_API_KEYz1Exa API key for AI-native web search and contentszExa API keyzhttps://exa.ai/Ú
web_searchr;  Útool)rã  rä  r½  rë  rå  ræ  ÚPARALLEL_API_KEYz5Parallel API key for AI-native web search and extractzParallel API keyzhttps://parallel.ai/rÓ  z-Firecrawl API key for web search and scrapingzFirecrawl API keyzhttps://firecrawl.dev/ÚFIRECRAWL_API_URLz6Firecrawl API URL for self-hosted instances (optional)z)Firecrawl API URL (leave empty for cloud)ÚFIRECRAWL_GATEWAY_URLzQExact Firecrawl tool-gateway origin override for Nous Subscribers only (optional)z9Firecrawl gateway URL (leave empty to derive from domain)ÚTOOL_GATEWAY_DOMAINz•Shared tool-gateway domain suffix for Nous Subscribers only, used to derive vendor hosts, e.g. nousresearch.com -> firecrawl-gateway.nousresearch.comzTool-gateway domain suffixÚTOOL_GATEWAY_SCHEMEz�Shared tool-gateway URL scheme for Nous Subscribers only, used to derive vendor hosts (`https` by default, set `http` for local gateway testing)zTool-gateway URL schemeÚTOOL_GATEWAY_USER_TOKENzuExplicit Nous Subscriber access token for tool-gateway requests (optional; otherwise read from the Hermes auth store)zTool-gateway user tokenz;Tavily API key for AI-native web search, extract, and crawlzTavily API keyzhttps://app.tavily.com/home)r  r;  Ú	web_crawlrÔ  uU   Browserbase API key for cloud browser (optional â€” local browser works without this)zBrowserbase API keyzhttps://browserbase.com/Úbrowser_navigateÚbrowser_clickrÕ  uC   Browserbase project ID (optional â€” only needed for cloud browser)zBrowserbase project IDÚBROWSER_USE_API_KEYuU   Browser Use API key for cloud browser (optional â€” local browser works without this)zBrowser Use API keyzhttps://browser-use.com/ÚFIRECRAWL_BROWSER_TTLz@Firecrawl browser session TTL in seconds (optional, default 300)zBrowser session TTL (seconds))rã  rä  rë  rå  ræ  ÚCAMOFOX_URLzYCamofox browser server URL for local anti-detection browsing (e.g. http://localhost:9377)zCamofox server URLz)https://github.com/jo-inc/camofox-browserrÖ  z FAL API key for image generationzFAL API keyzhttps://fal.ai/Úimage_generateÚTINKER_API_KEYzTinker API key for RL trainingzTinker API keyz/https://tinker-console.thinkingmachines.ai/keys)Úrl_start_trainingÚrl_check_statusÚrl_stop_trainingÚWANDB_API_KEYz0Weights & Biases API key for experiment trackingzWandB API keyzhttps://wandb.ai/authorizeÚrl_get_resultsr*  z?OpenAI API key for voice transcription (Whisper) and OpenAI TTSz&OpenAI API Key (for Whisper STT + TTS)z$https://platform.openai.com/api-keysÚvoice_transcriptionÚ
openai_ttsz4ElevenLabs API key for premium text-to-speech voiceszElevenLabs API keyzhttps://elevenlabs.io/ÚMISTRAL_API_KEYz7Mistral API key for Voxtral TTS and transcription (STT)zMistral API keyzhttps://console.mistral.ai/ÚGITHUB_TOKENzCGitHub token for Skills Hub (higher API rate limits, skill publish)zGitHub Tokenz"https://github.com/settings/tokensÚHONCHO_API_KEYz.Honcho API key for AI-native persistent memoryzHoncho API keyzhttps://app.honcho.devÚhoncho_contextÚHONCHO_BASE_URLz=Base URL for self-hosted Honcho instances (no API key needed)z,Honcho base URL (e.g. http://localhost:8000))rã  rä  ræ  ÚTELEGRAM_BOT_TOKENz"Telegram bot token from @BotFatherzTelegram bot tokenzhttps://t.me/BotFatherÚ	messagingÚTELEGRAM_ALLOWED_USERSzSComma-separated Telegram user IDs allowed to use the bot (get ID from @userinfobot)z+Allowed Telegram user IDs (comma-separated)zhttps://t.me/userinfobotÚTELEGRAM_PROXYzaProxy URL for Telegram connections (overrides HTTPS_PROXY). Supports http://, https://, socks5://zTelegram proxy URL (optional))rã  rä  rå  ræ  ÚDISCORD_BOT_TOKENz'Discord bot token from Developer PortalzDiscord bot tokenz+https://discord.com/developers/applicationsÚDISCORD_ALLOWED_USERSz7Comma-separated Discord user IDs allowed to use the botz*Allowed Discord user IDs (comma-separated)ÚDISCORD_REPLY_TO_MODEz‡Discord reply threading mode: 'off' (no reply references), 'first' (reply on first message only, default), 'all' (reply on every chunk)z"Discord reply mode (off/first/all)rÚ  zåSlack bot token (xoxb-). Get from OAuth & Permissions after installing your app. Required scopes: chat:write, app_mentions:read, channels:history, groups:history, im:history, im:read, im:write, users:read, files:read, files:writezSlack Bot Token (xoxb-...)zhttps://api.slack.com/appsrÛ  uÂ   Slack app-level token (xapp-) for Socket Mode. Get from Basic Information â†’ App-Level Tokens. Also ensure Event Subscriptions include: message.im, message.channels, message.groups, app_mentionzSlack App Token (xapp-...)ÚMATTERMOST_URLz3Mattermost server URL (e.g. https://mm.example.com)zMattermost server URLzhttps://mattermost.com/deploy/ÚMATTERMOST_TOKENz-Mattermost bot token or personal access tokenzMattermost bot tokenÚMATTERMOST_ALLOWED_USERSz:Comma-separated Mattermost user IDs allowed to use the botz-Allowed Mattermost user IDs (comma-separated)ÚMATTERMOST_REQUIRE_MENTIONzaRequire @mention in Mattermost channels (default: true). Set to false to respond to all messages.zRequire @mention in channelsÚ!MATTERMOST_FREE_RESPONSE_CHANNELSzJComma-separated Mattermost channel IDs where bot responds without @mentionz+Free-response channel IDs (comma-separated)ÚMATRIX_HOMESERVERz7Matrix homeserver URL (e.g. https://matrix.example.org)zMatrix homeserver URLz%https://matrix.org/ecosystem/servers/ÚMATRIX_ACCESS_TOKENz3Matrix access token (preferred over password login)zMatrix access tokenÚMATRIX_USER_IDz)Matrix user ID (e.g. @hermes:example.org)zMatrix user ID (@user:server)ÚMATRIX_ALLOWED_USERSzLComma-separated Matrix user IDs allowed to use the bot (@user:server format)z)Allowed Matrix user IDs (comma-separated)r@   zZRequire @mention in Matrix rooms (default: true). Set to false to respond to all messages.z&Require @mention in rooms (true/false)rI   zCComma-separated Matrix room IDs where bot responds without @mentionz(Free-response room IDs (comma-separated)r,   z@Auto-create threads for messages in Matrix rooms (default: true)z)Auto-create threads in rooms (true/false)r   zNStable Matrix device ID for E2EE persistence across restarts (e.g. HERMES_BOT)z)Matrix device ID (stable across restarts)r/   uƒ   Matrix recovery key for cross-signing verification after device key rotation (from Element: Settings â†’ Security â†’ Recovery Key)zMatrix recovery keyr>   zOBlueBubbles server URL for iMessage integration (e.g. http://192.168.1.10:1234)zBlueBubbles server URLzhttps://bluebubbles.app/r6   uJ   BlueBubbles server password (from BlueBubbles Server â†’ Settings â†’ API)zBlueBubbles server passwordÚBLUEBUBBLES_ALLOWED_USERSzJComma-separated iMessage addresses (email or phone) allowed to use the botz,Allowed iMessage addresses (comma-separated)ÚBLUEBUBBLES_ALLOW_ALL_USERSz-Allow all BlueBubbles users without allowlistzAllow All BlueBubbles Usersr   z.QQ Bot App ID from QQ Open Platform (q.qq.com)z	QQ App IDzhttps://q.qq.com)rã  rä  r½  ræ  r!   z*QQ Bot Client Secret from QQ Open PlatformzQQ Client Secretr    z2Comma-separated QQ user IDs allowed to use the botzQQ Allowed UsersrA   z=Comma-separated QQ group IDs allowed to interact with the botzQQ Group Allowed Usersr.   z4Allow all QQ users without an allowlist (true/false)zAllow All QQ Usersr-   z<Default QQ channel/group for cron delivery and notificationszQQ Home ChannelrE   z$Display name for the QQ home channelzQQ Home Channel NameÚ
QQ_SANDBOXz;Enable QQ sandbox mode for development testing (true/false)zQQ Sandbox ModeÚGATEWAY_ALLOW_ALL_USERSzMAllow all users to interact with messaging bots (true/false). Default: false.zAllow all users (true/false)ÚAPI_SERVER_ENABLEDzrEnable the OpenAI-compatible API server (true/false). Allows frontends like Open WebUI, LobeChat, etc. to connect.zEnable API server (true/false)ÚAPI_SERVER_KEYz®Bearer token for API server authentication. Required for non-loopback binding; server refuses to start without it. On loopback (127.0.0.1), all requests are allowed if empty.z1API server auth key (required for network access)ÚAPI_SERVER_PORTz(Port for the API server (default: 8642).zAPI server portÚAPI_SERVER_HOSTu�   Host/bind address for the API server (default: 127.0.0.1). Use 0.0.0.0 for network access â€” server refuses to start without API_SERVER_KEY.zAPI server hostÚAPI_SERVER_MODEL_NAMEz›Model name advertised on /v1/models. Defaults to the profile name (or 'hermes-agent' for the default profile). Useful for multi-user setups with OpenWebUI.zAPI server model nameÚGATEWAY_PROXY_URLu  URL of a remote Hermes API server to forward messages to (proxy mode). When set, the gateway handles platform I/O only â€” all agent work is delegated to the remote server. Use for Docker E2EE containers that relay to a host agent. Also configurable via gateway.proxy_url in config.yaml.z=Remote Hermes API server URL (e.g. http://192.168.1.100:8642)ÚGATEWAY_PROXY_KEYz�Bearer token for authenticating with the remote Hermes API server (proxy mode). Must match the API_SERVER_KEY on the remote host.zRemote API server auth keyÚWEBHOOK_ENABLEDzREnable the webhook platform adapter for receiving events from GitHub, GitLab, etc.zEnable webhooks (true/false)ÚWEBHOOK_PORTz1Port for the webhook HTTP server (default: 8644).zWebhook portÚWEBHOOK_SECRETz[Global HMAC secret for webhook signature validation (overridable per route in config.yaml).zWebhook secretÚSUDO_PASSWORDzySudo password for terminal commands requiring root access; set to an explicit empty string to try empty without promptingzSudo passwordÚsettingÚHERMES_MAX_ITERATIONSz>Maximum tool-calling iterations per conversation (default: 90)zMax iterationsÚHERMES_TOOL_PROGRESSz=(deprecated) Use display.tool_progress in config.yaml insteadu.   Tool progress (deprecated â€” use config.yaml)ÚHERMES_TOOL_PROGRESS_MODEu.   Progress mode (deprecated â€” use config.yaml)ÚHERMES_PREFILL_MESSAGES_FILEzFPath to JSON file with ephemeral prefill messages for few-shot primingzPrefill messages file pathÚHERMES_EPHEMERAL_SYSTEM_PROMPTzOEphemeral system prompt injected at API-call time (never persisted to sessions)zEphemeral system promptÚrequired_onlyc                 ó:  — g }t                                ¦   «         D ]1\  }}t          |¦  «        s|                     d|i|¥ddi¥¦  «         Œ2| sKt                               ¦   «         D ]1\  }}t          |¦  «        s|                     d|i|¥ddi¥¦  «         Œ2|S )z|
    Check which environment variables are missing.
    
    Returns list of dicts with var info for missing variables.
    ÚnameÚis_requiredTF)ÚREQUIRED_ENV_VARSÚitemsÚget_env_valueÚappendÚOPTIONAL_ENV_VARS)rZ  ÚmissingÚvar_namer–   s       rj   Úget_missing_env_varsre  ³  sÍ   € ð €Gõ ,×1Ò1Ñ3Ô3ð Lð L‰ˆ�$Ý˜XÑ&Ô&ð 	LØ�NŠN˜F HÐJ°ÐJ°mÀTÐJÐJÑKÔKÐKøð ð QÝ/×5Ò5Ñ7Ô7ð 	Qð 	Q‰NˆH�dÝ  Ñ*Ô*ð QØ—’ ¨ÐO°DÐO¸-ÈÐOÐOÑPÔPÐPøà€Nrl   ÚconfigÚ
dotted_keyc                 óÖ   — |                      d¦  «        }| }|dd…         D ];}||vs(t          |                     |¦  «        t          ¦  «        si ||<   ||         }Œ<|||d         <   dS )z°Set a value at an arbitrarily nested dotted key path.

    Creates intermediate dicts as needed, e.g. ``_set_nested(c, "a.b.c", 1)``
    ensures ``c["a"]["b"]["c"] == 1``.
    rñ   Néÿÿÿÿ)ÚsplitÚ
isinstancerd   Údict)rf  rg  r›   ÚpartsÚcurrentÚparts         rj   Ú_set_nestedrp  É  s�   € ð ×Ò˜SÑ!Ô!€EØ€GØ�c�r�c”
ð  ð  ˆØ�wÐÐ¥j°·²¸TÑ1BÔ1BÅDÑ&IÔ&IÐØˆG�D‰MØ˜$”-ˆˆØ€GˆE�"ŒIÑÐÐrl   c                  ó†   ‡‡— t          ¦   «         } g Šddt          dt          dt          fˆˆfd„Š ‰t          | ¦  «         ‰S )zÙ
    Check which config fields are missing or outdated (recursive).
    
    Walks the DEFAULT_CONFIG tree at arbitrary depth and reports any keys
    present in defaults but absent from the user's loaded config.
    r]   Údefaultsrn  Úprefixc                 ó`  •— |                       ¦   «         D ]—\  }}|                     d¦  «        rŒ|s|n|› d|› �}||vr‰                     ||d|› �dœ¦  «         ŒGt          |t          ¦  «        r;t          |                     |¦  «        t          ¦  «        r ‰|||         |¦  «         Œ˜d S )Nrš   rñ   zNew config option: )r™   rP  rã  )r_  r’   ra  rk  rl  rd   )rr  rn  rs  r™   Údefault_valueÚfull_keyÚ_checkrc  s         €€rj   rw  z)get_missing_config_fields.<locals>._checkâ  sê   ø€ Ø"*§.¢.Ñ"2Ô"2ð 	>ð 	>ÑˆC�Ø�~Š~˜cÑ"Ô"ð ØØ"(Ð?�s�s°Ð.?Ð.?¸#Ð.?Ð.?ˆHØ˜'Ð!Ð!Ø—’Ø#Ø,Ø#C¸Ð#CÐ#Cð ð  ñ ô ð ð õ
 ˜M­4Ñ0Ô0ð >µZÀÇÂÈCÑ@PÔ@PÕRVÑ5WÔ5Wð >Ø��} g¨c¤l°HÑ=Ô=Ð=øð	>ð 	>rl   )r]   )Úload_configrl  r½   ÚDEFAULT_CONFIG)rf  rw  rc  s    @@rj   Úget_missing_config_fieldsrz  Ø  sj   øø€ õ ‰]Œ]€FØ€Gð>ð >�ð >­ð >µcð >ð >ð >ð >ð >ð >ð >ð €F�>˜6Ñ"Ô"Ð"Ø€Nrl   c                  ó¦  — 	 ddl m} m} n# t          $ r g cY S w xY w | ¦   «         }|sg S t	          ¦   «         }g }|D ]“}|› d|d         › �}|                     d¦  «        }|}d}	|D ](}
t          |t          ¦  «        r|
|v r||
         }|}	Œ&d}	 |	�)t          |	t          ¦  «        r)|	 	                    ¦   «         s| 
                    |¦  «         Œ”|S )a3  Return skill-declared config vars that are missing or empty in config.yaml.

    Scans all enabled skills for ``metadata.hermes.config`` entries, then checks
    which ones are absent or empty under ``skills.config.<key>`` in the user's
    config.yaml.  Returns a list of dicts suitable for prompting.
    r   )Údiscover_all_skill_config_varsÚSKILL_CONFIG_PREFIXrñ   r™   N)Úagent.skill_utilsr|  r}  Ú	Exceptionrx  rj  rk  rl  r½   r`   ra  )r|  r}  Úall_varsrf  rc  ÚvarÚstorage_keyrm  rn  r›   ro  s              rj   Úget_missing_skill_config_varsrƒ  ô  s,  € ðØYÐYÐYÐYÐYÐYÐYÐYÐYøÝð ð ð Øˆ	ˆ	ˆ	ðøøøð .Ð-Ñ/Ô/€HØð Øˆ	å‰]Œ]€FØ$&€GØð  ð  ˆà,Ð;Ð;¨s°5¬zÐ;Ð;ˆØ×!Ò! #Ñ&Ô&ˆØˆØˆØð 	ð 	ˆDÝ˜'¥4Ñ(Ô(ð ¨T°W¨_¨_Ø! $œ-�Ø��à�Øàˆ=�Z¨­sÑ3Ô3ˆ=¸E¿KºK¹M¼Mˆ=Ø�NŠN˜3ÑÔÐøØ€Ns   ‚ ‹™©Úprovider_keyÚentryr…  c          	      ó	  — t          | t          ¦  «        sdS dddddddd	œ}h d
£}|                     ¦   «         D ]7\  }}|| v r.|| vr*t                               d|pd||¦  «         | |         | |<   Œ8t          |                      ¦   «         ¦  «        |z
  t          |                     ¦   «         ¦  «        z
  }|r>t                               d|pdd                     t          |¦  «        ¦  «        ¦  «         ddl	m
} d}dD ]�}	|                      |	¦  «        }
t          |
t          ¦  «        rd|
                     ¦   «         rP|
                     ¦   «         } ||¦  «        }|j        r|j        r|} n t                               d|pd|	|¦  «         Œ‘|sdS d}|                      d¦  «        }t          |t          ¦  «        r)|                     ¦   «         r|                     ¦   «         }n(|                     ¦   «         r|                     ¦   «         }|sdS ||dœ}|                     ¦   «         }|r||d<   |                      d¦  «        }t          |t          ¦  «        r+|                     ¦   «         r|                     ¦   «         |d<   |                      d¦  «        }t          |t          ¦  «        r+|                     ¦   «         r|                     ¦   «         |d<   |                      d¦  «        p|                      d¦  «        }t          |t          ¦  «        r+|                     ¦   «         r|                     ¦   «         |d<   |                      d¦  «        p|                      d¦  «        }t          |t          ¦  «        r+|                     ¦   «         r|                     ¦   «         |d<   |                      d¦  «        }t          |t          ¦  «        r|r||d<   n&t          |t           ¦  «        r|rd„ |D ¦   «         |d<   |                      d¦  «        }t          |t"          ¦  «        r|dk    r||d<   |                      d¦  «        }t          |t"          t$          f¦  «        r|dk    r||d<   |S )z>Return a runtime-compatible custom provider entry or ``None``.Nr6  r5  Úapi_modeÚkey_envÚdefault_modelÚcontext_lengthÚrate_limit_delay)ÚapiKeyÚbaseUrlÚapiModeÚkeyEnvÚdefaultModelÚcontextLengthÚrateLimitDelay>   Úapir½  r\  rÚ   Úmodelsr6  r‰  rˆ  r5  Ú	transportrŠ  r‹  rŒ  z[providers.%s: camelCase key '%s' auto-mapped to '%s' (use snake_case to avoid this warning)ú?z-providers.%s: unknown config keys ignored: %sú, r   ©Úurlparser]   )r5  r½  r”  uP   providers.%s: '%s' value '%s' is not a valid URL (no scheme or host) â€” skippedr\  )r\  r5  r…  r–  rÚ   r•  c                 ó€   — i | ];}t          |t          ¦  «        ¯|                     ¦   «         ¯+t          |¦  «        i “Œ<S ro   )rk  r½   r`   )Ú.0Úms     rj   ú
<dictcomp>z4_normalize_custom_provider_entry.<locals>.<dictcomp>~  sO   € ð  
ð  
ð  
Ø­*°Q½Ñ*<Ô*<ð 
ØABÇÂÁÄð 
Ý�‰FŒF�Bð 
ð  
ð  
rl   )rk  rl  r_  ÚloggerÚwarningÚsetÚkeysÚjoinÚsortedÚurllib.parserš  rd   r½   r`   ÚschemeÚnetlocÚlistrª   Úfloat)r†  r…  Ú_CAMEL_ALIASESÚ_KNOWN_KEYSÚcamelÚsnakeÚunknownrš  r5  Úurl_keyÚraw_urlÚ	candidateÚparsedr\  Úraw_namerh   r6  r‰  rˆ  Ú
model_namer•  r‹  rŒ  s                          rj   Ú _normalize_custom_provider_entryrµ    sÛ  € õ �e�TÑ"Ô"ð Øˆtð ØØØØ'Ø)Ø,ð&ð &€Nðð ð €Kð
 '×,Ò,Ñ.Ô.ð (ð (‰ˆˆuØ�Eˆ>ˆ>˜e¨5Ð0Ð0Ý�NŠNð9àÐ#  U¨Eñô ð ð
 ! œ<ˆE�%‰LøÝ�%—*’*‘,”,ÑÔ +Ñ-µ°N×4GÒ4GÑ4IÔ4IÑ0JÔ0JÑJ€GØð 
Ý�ŠØ;ØÐ˜C §¢­6°'©?¬?Ñ!;Ô!;ñ	
ô 	
ð 	
ð
 &Ð%Ð%Ð%Ð%Ð%à€HØ-ð ð ˆØ—)’)˜GÑ$Ô$ˆÝ�g�sÑ#Ô#ð 	¨¯ª©¬ð 	ØŸš™œˆIØ�X˜iÑ(Ô(ˆFØŒ}ð  ¤ð Ø$�Ø�å—’ð6à Ð' C¨°)ñô ð øð
 ð Øˆtà€DØ�yŠy˜Ñ Ô €HÝ�(�CÑ Ô ð $ X§^¢^Ñ%5Ô%5ð $Ø�~Š~ÑÔˆˆØ	×	Ò	Ñ	Ô	ð $Ø×!Ò!Ñ#Ô#ˆØð Øˆtð Øð"ð "€Jð
  ×%Ò%Ñ'Ô'€LØð 2Ø%1ˆ
�>Ñ"à�iŠi˜	Ñ"Ô"€GÝ�'�3ÑÔð 0 G§M¢M¡O¤Oð 0Ø '§¢¡¤ˆ
�9Ñà�iŠi˜	Ñ"Ô"€GÝ�'�3ÑÔð 0 G§M¢M¡O¤Oð 0Ø '§¢¡¤ˆ
�9Ñà�yŠy˜Ñ$Ô$Ð>¨¯	ª	°+Ñ(>Ô(>€HÝ�(�CÑ Ô ð 2 X§^¢^Ñ%5Ô%5ð 2Ø!)§¢Ñ!1Ô!1ˆ
�:Ñà—’˜7Ñ#Ô#ÐA u§y¢y°Ñ'AÔ'A€JÝ�*�cÑ"Ô"ð 1 z×'7Ò'7Ñ'9Ô'9ð 1Ø(×.Ò.Ñ0Ô0ˆ
�7Ñà�YŠY�xÑ Ô €FÝ�&�$ÑÔð 	
 Fð 	
Ø%ˆ
�8ÑÐÝ	�F�DÑ	!Ô	!ð 
 fð 
ð
 
ð  
Ø &ð 
ñ  
ô  
ˆ
�8Ñð —Y’YÐ/Ñ0Ô0€NÝ�.¥#Ñ&Ô&ð 6¨>¸AÒ+=Ð+=Ø'5ˆ
Ð#Ñ$à—y’yÐ!3Ñ4Ô4ÐÝÐ"¥S­% LÑ1Ô1ð :Ð6FÈ!Ò6KÐ6KØ)9ˆ
Ð%Ñ&àÐrl   Úproviders_dictc                 óÖ   — t          | t          ¦  «        sg S g }|                      ¦   «         D ]:\  }}t          |t	          |¦  «        ¬¦  «        }|�|                     |¦  «         Œ;|S )zMNormalize ``providers`` config entries into the legacy custom-provider shape.r„  )rk  rl  r_  rµ  r½   ra  )r¶  Úcustom_providersr™   r†  rh   s        rj   Ú"providers_dict_to_custom_providersr¹  �  sw   € å�n¥dÑ+Ô+ð Øˆ	à-/ÐØ$×*Ò*Ñ,Ô,ð 0ð 0‰
ˆˆUÝ5°eÍ#ÈcÉ(Ì(ÐSÑSÔSˆ
ØÐ!Ø×#Ò# JÑ/Ô/Ð/øàÐrl   c                 óº  ‡‡‡— | €t          ¦   «         } g Št          ¦   «         Št          ¦   «         Šdt          t          t          t
          f                  ddfˆˆˆfd„}|                      d¦  «        }|�4t          |t          ¦  «        sg S |D ]} |t          |¦  «        ¦  «         Œt          |                      d¦  «        ¦  «        D ]} ||¦  «         Œ‰S )ay  Return a deduplicated custom-provider view across legacy and v12+ config.

    ``custom_providers`` remains the on-disk legacy format, while ``providers``
    is the newer keyed schema.  Runtime and picker flows still need a single
    list-shaped view, but we should not materialise that compatibility layer
    back into config.yaml because it duplicates entries in UIs.
    Nr†  rZ   c                 ó>  •— | €d S t          |                      dd¦  «        pd¦  «                             ¦   «                              ¦   «         }t          |                      dd¦  «        pd¦  «                             ¦   «                              ¦   «         }t          |                      dd¦  «        pd¦  «                             ¦   «                              d¦  «                             ¦   «         }t          |                      dd¦  «        pd¦  «                             ¦   «                              ¦   «         }|||f}|r|‰v rd S |r|r|‰v rd S ‰                     | ¦  «         |r‰                     |¦  «         |r|r‰                     |¦  «         d S d S d S )Nr…  r]   r\  r5  ú/rÚ   )r½   rd   r`   ra   Úrstripra  Úadd)	r†  r…  r\  r5  rÚ   ÚpairÚ
compatibleÚseen_name_url_pairsÚseen_provider_keyss	         €€€rj   Ú_append_if_newz7get_compatible_custom_providers.<locals>._append_if_new¬  s«  ø€ Øˆ=ØˆFÝ˜5Ÿ9š9 ^°RÑ8Ô8Ð>¸BÑ?Ô?×EÒEÑGÔG×MÒMÑOÔOˆÝ�5—9’9˜V RÑ(Ô(Ð.¨BÑ/Ô/×5Ò5Ñ7Ô7×=Ò=Ñ?Ô?ˆÝ�u—y’y ¨RÑ0Ô0Ð6°BÑ7Ô7×=Ò=Ñ?Ô?×FÒFÀsÑKÔK×QÒQÑSÔSˆÝ�E—I’I˜g rÑ*Ô*Ð0¨bÑ1Ô1×7Ò7Ñ9Ô9×?Ò?ÑAÔAˆØ�h Ð&ˆàð 	˜LÐ,>Ð>Ð>ØˆFØð 	�Hð 	 Ð)<Ð!<Ð!<ØˆFà×Ò˜%Ñ Ô Ð Øð 	1Ø×"Ò" <Ñ0Ô0Ð0Øð 	*�Hð 	*Ø×#Ò# DÑ)Ô)Ð)Ð)Ð)ð	*ð 	*ð 	*ð 	*rl   r¸  rÛ   )rx  r¡  r   r   r½   r   rd   rk  r¨  rµ  r¹  )rf  rÃ  r¸  r†  rÀ  rÁ  rÂ  s       @@@rj   Úget_compatible_custom_providersrÄ  ›  s  øøø€ ð €~Ý‘”ˆà')€JÝ!™eœeÐÝ"™uœuÐð*�h¥t­Cµ¨H¤~Ô6ð *¸4ð *ð *ð *ð *ð *ð *ð *ð *ð( —z’zÐ"4Ñ5Ô5ÐØÐ#ÝÐ*­DÑ1Ô1ð 	ØˆIØ%ð 	Dð 	DˆEØˆNÕ;¸EÑBÔBÑCÔCÐCÐCå3°F·J²J¸{Ñ4KÔ4KÑLÔLð ð ˆØˆ�uÑÔÐÐàÐrl   r5  r¸  c                 óþ  — | r|sdS |€T	 t          |¦  «        }nC# t          $ r6 |€Y dS |                     d¦  «        }t          |t          ¦  «        r|ng }Y nw xY wt          |t          ¦  «        sdS |pd                     d¦  «        }|sdS |D ]ë}t          |t          ¦  «        sŒ|                     d¦  «        pd                     d¦  «        }|r||k    rŒK|                     d¦  «        }t          |t          ¦  «        sŒv|                     | ¦  «        }	t          |	t          ¦  «        sŒ¡|	                     d¦  «        }
|
€Œ¹	 t          |
¦  «        }n# t          t          f$ r Y ŒÝw xY w|dk    r|c S ŒìdS )	aÖ  Look up a per-model ``context_length`` override from ``custom_providers``.

    Matches any entry whose ``base_url`` equals ``base_url`` (trailing-slash
    insensitive) and returns ``custom_providers[i].models.<model>.context_length``
    if present and valid.  Returns ``None`` when no override applies.

    This is the single source of truth for custom-provider context overrides,
    used by:
      * ``AIAgent.__init__`` (startup resolution)
      * ``AIAgent.switch_model`` (mid-session ``/model`` switch)
      * ``hermes_cli.model_switch.resolve_display_context_length`` (``/model`` confirmation display)
      * ``gateway.run._format_session_info`` (``/info`` display)
      * ``agent.model_metadata.get_model_context_length`` (when custom_providers is threaded through)

    Before this helper existed, the lookup was duplicated in ``run_agent.py``'s
    startup path only; every other path (notably ``/model`` switch) fell back
    to the 128K default.  See #15779.
    Nr¸  r]   r¼  r5  r•  r‹  r   )
rÄ  r  rd   rk  r¨  r½  rl  rª   Ú	TypeErrorr«   )rÚ   r5  r¸  rf  rg   Ú
target_urlr†  Ú	entry_urlr•  Ú	model_cfgÚraw_ctxÚctxs               rj   Ú"get_custom_provider_context_lengthrÌ  Í  så  € ð0 ð ˜ð ØˆtØÐð	DÝ>¸vÑFÔFÐÐøÝð 	Dð 	Dð 	DØˆ~Ø�t�tØ—*’*Ð/Ñ0Ô0ˆCÝ&0°µdÑ&;Ô&;ÐC˜s˜sÀÐÐÐð		Døøøõ
 Ð&­Ñ-Ô-ð Øˆtà�.˜b×(Ò(¨Ñ-Ô-€JØð Øˆtà!ð ð ˆÝ˜%¥Ñ&Ô&ð 	ØØ—Y’Y˜zÑ*Ô*Ð0¨b×8Ò8¸Ñ=Ô=ˆ	Øð 	˜I¨Ò3Ð3ØØ—’˜8Ñ$Ô$ˆÝ˜&¥$Ñ'Ô'ð 	ØØ—J’J˜uÑ%Ô%ˆ	Ý˜)¥TÑ*Ô*ð 	ØØ—-’-Ð 0Ñ1Ô1ˆØˆ?Øð	Ý�g‘,”,ˆCˆCøÝ�:Ð&ð 	ð 	ð 	ØˆHð	øøøà�Š7ˆ7ØˆJˆJˆJð àˆ4s&   Š šA©.AÁAÅEÅE/Å.E/c                  óˆ   — t          ¦   «         } |                      dd¦  «        }t                               dd¦  «        }||fS )zS
    Check config version.
    
    Returns (current_version, latest_version).
    rÒ  r   rÿ   )rx  rd   ry  )rf  rn  Úlatests      rj   Úcheck_config_versionrÏ  	  sA   € õ ‰]Œ]€FØ�jŠjÐ*¨AÑ.Ô.€GÝ×ÒÐ 1°1Ñ5Ô5€FØ�Fˆ?Ðrl   >   rß   rÚ   r„  r�  rA  ÚgatewayrÍ   rí   rÞ   r3  rÛ   r‰  r  Úfallback_modelrÒ  r¸  rÜ   rÝ   >   r\  rÚ   r•  r6  rˆ  r5  r‹  rŒ  >   r6  rˆ  r5  rŒ  c                   ó2   — e Zd ZU dZeed<   eed<   eed<   dS )ÚConfigIssuez$A detected config structure problem.ÚseverityÚmessageÚhintN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r½   Ú__annotations__ro   rl   rj   rÓ  rÓ  1	  s1   € € € € € € à.Ð.à€M€M�MØ€L€L�LØ
€I€I�I€I€Irl   rÓ  c                 ót  — | €2	 t          ¦   «         } n"# t          $ r t          ddd¦  «        gcY S w xY wg }|                      d¦  «        }|��¶t	          |t
          ¦  «        rª|                     t          ddd¦  «        ¦  «         t	          |t
          ¦  «        r!t          |                     ¦   «         ¦  «        nt          ¦   «         }|t          z  }|r5|                     t          dd	t          |¦  «        › d
�d¦  «        ¦  «         n÷t	          |t          ¦  «        rât          |¦  «        D ]Ò\  }}t	          |t
          ¦  «        s>|                     t          dd|› dt          |¦  «        j        › d�d¦  «        ¦  «         ŒX|                     d¦  «        s(|                     t          dd|› d�d¦  «        ¦  «         |                     d¦  «        s(|                     t          dd|› d�d¦  «        ¦  «         ŒÓ|                      d¦  «        }|�Ãt	          |t
          ¦  «        s:|                     t          ddt          |¦  «        j        › �d¦  «        ¦  «         nt|rr|                     d¦  «        s$|                     t          ddd¦  «        ¦  «         |                     d¦  «        s$|                     t          ddd¦  «        ¦  «         t	          |t
          ¦  «        r.d| vr*d|pi v r$|                     t          ddd ¦  «        ¦  «         |                      d¦  «        }|r&|s$|                     t          dd!d"¦  «        ¦  «         | D ]V}	|	                     d#¦  «        rŒ|	t           vr5|	t          v r,|                     t          dd$|	› d%�d&|	› d'�¦  «        ¦  «         ŒW|S )(a"  Validate config.yaml structure and return a list of detected issues.

    Catches common YAML formatting mistakes that produce confusing runtime
    errors (like "Unknown provider") instead of clear diagnostics.

    Can be called with a pre-loaded config dict, or will load from disk.
    NÚerrorzCould not load config.yamlz+Run 'hermes setup' to create a valid configr¸  uO   custom_providers is a dict â€” it must be a YAML list (items prefixed with '-')zeChange to:
  custom_providers:
    - name: my-provider
      base_url: https://...
      api_key: ...r   zRoot-level keys z( look like custom_providers entry fieldszLThese should be indented under a '- name: ...' list entry, not at root levelzcustom_providers[z] is not a dict (got ú)z1Each entry should have at minimum: name, base_urlr\  z] is missing 'name' fieldz#Add a name, e.g.: name: my-providerr5  z] is missing 'base_url' fieldzDAdd the API endpoint URL, e.g.: base_url: https://api.example.com/v1rÑ  zAfallback_model should be a dict with 'provider' and 'model', got zZChange to:
  fallback_model:
    provider: openrouter
    model: anthropic/claude-sonnet-4r4  uH   fallback_model is missing 'provider' field â€” fallback will be disabledz/Add: provider: openrouter (or another provider)rÚ   uE   fallback_model is missing 'model' field â€” fallback will be disabledz8Add: model: anthropic/claude-sonnet-4 (or another model)zGfallback_model appears inside custom_providers instead of at root levelzDMove fallback_model to the top level of config.yaml (no indentation)u[   custom_providers defined but no 'model' section â€” Hermes won't know which provider to useziAdd a model section:
  model:
    provider: custom
    default: your-model-name
    base_url: https://...rš   zRoot-level key 'uW   ' looks misplaced â€” should it be under 'model:' or inside a 'custom_providers' entry?zMove 'z' under the appropriate section)rx  r  rÓ  rd   rk  rl  ra  r¡  r¢  Ú_CUSTOM_PROVIDER_LIKE_FIELDSr¤  r¨  Ú	enumerateÚtyper×  r’   Ú_KNOWN_ROOT_KEYS)
rf  ÚissuesÚcpÚcp_keysÚ
suspiciousÚir†  ÚfbrÉ  r™   s
             rj   Úvalidate_config_structureré  :	  s‚  € ð €~ð	wÝ ‘]”]ˆFˆFøÝð 	wð 	wð 	wÝ Ð)EÐGtÑuÔuÐvÐvÐvÐvð	wøøøð !#€Fð 
�ŠÐ&Ñ	'Ô	'€BØ	�~Ý�b�$ÑÔð (	Ø�MŠM�+ØØað%ñô ñ ô ð õ )3°2µtÑ(<Ô(<ÐG•c˜"Ÿ'š'™)œ)‘n”n�nÅ#Á%Ä%ˆGØ Õ#?Ñ?ˆJØð Ø—’�kØØc¥v¨jÑ'9Ô'9ÐcÐcÐcØbñô ñ ô ð øõ
 ˜�DÑ!Ô!ð 	å% b™MœMð ð ‘��5Ý! %­Ñ.Ô.ð Ø—M’M¥+Ø!Ø[¨AÐ[Ð[ÅDÈÁKÄKÔDXÐ[Ð[Ð[ØKñ#ô #ñ ô ð ð
 Ø—y’y Ñ(Ô(ð Ø—M’M¥+Ø!ØH¨AÐHÐHÐHØ=ñ#ô #ñ ô ð ð
 —y’y Ñ,Ô,ð Ø—M’M¥+Ø!ØL¨AÐLÐLÐLØ^ñ#ô #ñ ô ð øð 
�ŠÐ$Ñ	%Ô	%€BØ	€~Ý˜"�dÑ#Ô#ð 	Ø�MŠM�+ØØgÕTXÐY[ÑT\ÔT\ÔTeÐgÐgð7ñô ñ ô ð ð ð ð 	Ø—6’6˜*Ñ%Ô%ð Ø—’�kØØ^ØEñô ñ ô ð ð
 —6’6˜'‘?”?ð Ø—’�kØØ[ØNñô ñ ô ð õ �"•dÑÔð Ð 0¸Ð >Ð >ÐCSÐXZÐX`Ð^`ÐCaÐCaØ�Š•kØØUØRñ
ô 
ñ 	ô 	ð 	ð —
’
˜7Ñ#Ô#€IØ	ð 	�)ð 	Ø�Š•kØØið(ñ
ô 
ñ 	ô 	ð 	ð ð ð ˆØ�>Š>˜#ÑÔð 	ØØÕ&Ð&Ð&¨3Õ2NÐ+NÐ+NØ�MŠM�+ØØ 3ÐÐÐØ=˜Ð=Ð=Ð=ñô ñ ô ð øð €Ms   „ “2±2c                 óT  — 	 t          | ¦  «        }n# t          $ r Y dS w xY w|sdS dg}|D ]1}|j        dk    rdnd}|                     d|› d|j        › �¦  «         Œ2|                     d¦  «         t
          j                             d	                     |¦  «        d
z   ¦  «         dS )zÛPrint config structure warnings to stderr at startup.

    Called early in CLI and gateway init so users see problems before
    they hit cryptic "Unknown provider" errors.  Prints nothing if
    config is healthy.
    Nu3   [33mâš  Config issues detected in config.yaml:[0mrÝ  u   [31mâœ—[0mu   [33mâš [0mú  ú z2  [2mRun 'hermes doctor' for fix suggestions.[0mú
ú

)	ré  r  rÔ  ra  rÕ  r€   r�   Úwriter£  )rf  rã  ÚlinesÚciÚmarkers        rj   Úprint_config_warningsró  ´	  sÜ   € ðÝ*¨6Ñ2Ô2ˆˆøÝð ð ð Øˆˆðøøøàð ØˆàHÐI€EØð 1ð 1ˆØ)+¬¸Ò)?Ð)?Ð%Ð%ÐEYˆØ�ŠÐ/˜&Ð/Ð/ 2¤:Ð/Ð/Ñ0Ô0Ð0Ð0Ø	‡L‚LÐKÑLÔLÐLÝ„J×Ò�T—Y’Y˜uÑ%Ô%¨Ñ.Ñ/Ô/Ð/Ð/Ð/s   ‚ ’
 Ÿ c                 ó  — t           j                             d¦  «        }t           j                             d¦  «        }| €!	 t          ¦   «         } n# t          $ r Y dS w xY w|                      di ¦  «        }t          |t          ¦  «        r|                     dd¦  «        nd}|dv}g }|r|                     d|› d	�¦  «         |r|s|                     d
|› d	�¦  «         |r›t           j                             dd¦  «        }|                     dd¦  «         |                     d¦  «         |                     d|› d�¦  «         t          j
                             d                     |¦  «        dz   ¦  «         dS dS )uÖ   Warn if MESSAGING_CWD or TERMINAL_CWD is set in .env instead of config.yaml.

    These env vars are deprecated â€” the canonical setting is terminal.cwd
    in config.yaml.  Prints a migration hint to stderr.
    ÚMESSAGING_CWDÚTERMINAL_CWDNrí   rð   rñ   )rñ   rã   rð   r]   u     [33mâš [0m MESSAGING_CWD=u&    found in .env â€” this is deprecated.u     [33mâš [0m TERMINAL_CWD=ÚHERMES_HOMEz	~/.hermesr   u/   [33mâš  Deprecated .env settings detected:[0mzN  [2mMove to config.yaml instead:  terminal:\n    cwd: /your/project/path[0mz'  [2mThen remove the old entries from z	/.env[0mrí  rî  )r^   r�   rd   rx  r  rk  rl  ra  Úinsertr€   r�   rï  r£  )rf  Úmessaging_cwdÚterminal_cwd_envÚterminal_cfgÚ
config_cwdÚconfig_has_explicit_cwdrð  Ú	hint_paths           rj   Úwarn_deprecated_cwd_env_varsrÿ  Ê	  sÓ  € õ ”J—N’N ?Ñ3Ô3€MÝ”z—~’~ nÑ5Ô5Ðà€~ð	Ý ‘]”]ˆFˆFøÝð 	ð 	ð 	ØˆFˆFð	øøøð —:’:˜j¨"Ñ-Ô-€LÝ1;¸LÍ$Ñ1OÔ1OÐX�×!Ò! %¨Ñ-Ô-Ð-ÐUX€Jà(Ð0HÐHÐà€EØð 
Ø�Šð#°-ð #ð #ð #ñ	
ô 	
ð 	
ð ð 
Ð 7ð 
à�Šð#Ð1Að #ð #ð #ñ	
ô 	
ð 	
ð ð 
4Ý”J—N’N =°+Ñ>Ô>ˆ	Ø�Š�QÐOÑPÔPÐPØ�Šð>ñ	
ô 	
ð 	
ð 	�ŠØP¸ÐPÐPÐPñ	
ô 	
ð 	
õ 	Œ
×Ò˜Ÿš 5Ñ)Ô)¨FÑ2Ñ3Ô3Ð3Ð3Ð3ð
4ð 
4s   ÁA Á
AÁAÚinteractiveÚquietc           
      óþ*  ‡M— g g g dœ}	 t          ¦   «         }|r|st          d|› d�¦  «         n# t          $ r Y nw xY wt          ¦   «         \  }}|dk     �rFt	          ¦   «         }|                     di ¦  «        }t          |t          ¦  «        si }d|v�rt          d¦  «        }t          d¦  «        }	|r7| 	                    ¦   «         d	v r!d
|d<   |d          
                    d¦  «         n�|	r_|	 	                    ¦   «         dv rI|	 	                    ¦   «         |d<   |d          
                    d|	 	                    ¦   «         › d�¦  «         n d|d<   |d          
                    d¦  «         ||d<   t          |¦  «         |st          d|d         › �¦  «         |dk     rÓt	          ¦   «         }d|vrÁt          j        dd¦  «        }
|
r]|
                     ¦   «         rI|
                     ¦   «         |d<   |d          
                    d|
                     ¦   «         › d�¦  «         n d|d<   |d          
                    d¦  «         t          |¦  «         |s|d         pd}t          d|› �¦  «         |dk     rD	 t          d¦  «        }|r!t          dd¦  «         |st          d¦  «         n# t          $ r Y nw xY w|dk     �rÏt	          ¦   «         }|                     d ¦  «        }t          |t           ¦  «        �r–|�r“|                     d!i ¦  «        }t          |t          ¦  «        si }d"}|D �]½}t          |t          ¦  «        sŒ|                     d#d¦  «        }|                     d$d¦  «        p|                     d%d¦  «        pd}|                     d&d¦  «        }|sŒv|                     ¦   «          	                    ¦   «                              d'd(¦  «                             d)d¦  «                             d*d¦  «        }d+|v r|                     d+d(¦  «        }d+|v °|                     d(¦  «        }|sE	 d"d,lm}  ||¦  «        }|j        pd-                     d.d(¦  «        }n# t          $ r d/|› �}Y nw xY w||v r|› d(|› �}d0|i}|r||d#<   |r	|d1vr||d&<   |                     d2¦  «        r|d2         |d3<   |                     d4¦  «        r|d4         |d5<   |||<   |d6z  }�Œ¿|d"k    r�||d!<   |                     d d7¦  «         t          |¦  «         |sqt          d8|› d9�¦  «         t!          |                     ¦   «         ¦  «        | d7…         D ]3}||         }t          d:|› d;|                     d0d¦  «        › �¦  «         Œ4|d<k     rLd=D ]I}	 t          |¦  «        }|r%t          |d¦  «         |st          d>|› d?�¦  «         Œ:# t          $ r Y ŒFw xY w|d@k     �r]t/          ¦   «         }|                     dAi ¦  «        }t          |t          ¦  «        �r#d2|v �r|d2         }|                     dBdC¦  «        }t	          ¦   «         }|                     dAi ¦  «        }|                     d2d7¦  «         |dDv rSh dE£} || v rJ|                     dCi ¦  «        }!t          |!t          ¦  «        rd2|!vr|                     dCi ¦  «        }"||"d2<   nJ|                     |i ¦  «        }#t          |#t          ¦  «        rd2|#vr|                     |i ¦  «        }$||$d2<   ||dA<   t          |¦  «         |st          dF¦  «         |dGk     r„t/          ¦   «         }|                     di ¦  «        }t          |t          ¦  «        si }dH|vrEdI|dH<   ||d<   |d          
                    dJ¦  «         t          |¦  «         |st          dK¦  «         |dLk     �rEt/          ¦   «         }|                     di ¦  «        }t          |t          ¦  «        si }|                     dM¦  «        }%t          |%t          ¦  «        rà|%rÞ|                     dNi ¦  «        }&t          |&t          ¦  «        si }&|%                     ¦   «         D ]#\  }'}(|'|&vri |&|'<   d|&|'         vr|(|&|'         d<   Œ$|&|dN<   ||d<   t          |¦  «         |sCdO                     dP„ |%                     ¦   «         D ¦   «         ¦  «        })t          dQ|)› �¦  «         |d          
                    dR¦  «         |dSk     �rÎt/          ¦   «         }|                     dTi ¦  «        }*t          |*t          ¦  «        �r”|*                     dUd7¦  «        }+|*                     dVd7¦  «        },|*                     dWd7¦  «        }-g }.|+ržt7          |+¦  «                             ¦   «         r}|                     dXi ¦  «        }/|/                     dTi ¦  «        }0|0                     d2¦  «        s<t7          |+¦  «                             ¦   «         |0d2<   |. 
                    dY|+› �¦  «         |,r¹t7          |,¦  «                             ¦   «         dZvr–|                     dXi ¦  «        }/|/                     dTi ¦  «        }0|0                     dB¦  «        r|0                     dB¦  «        d[k    r<t7          |,¦  «                             ¦   «         |0dB<   |. 
                    d\|,› �¦  «         |-ržt7          |-¦  «                             ¦   «         r}|                     dXi ¦  «        }/|/                     dTi ¦  «        }0|0                     d$¦  «        s<t7          |-¦  «                             ¦   «         |0d$<   |. 
                    d]|-› �¦  «         |.s|+€|,€|-�M|*|dT<   t          |¦  «         |s7|.r&t          d^dO                     |.¦  «        › �¦  «         nt          d_¦  «         |d`k     �r$t/          ¦   «         }|                     da¦  «        }1t          |1t          ¦  «        si }1db|1v�rå|1                     dcg ¦  «        pg }2t          |2t           ¦  «        sg }2t9          |2¦  «        }3g }4	 t;          ¦   «         daz  }5|5                     ¦   «         rót?          |5                      ¦   «         ¦  «        D ]Ñ}6|6                     ¦   «         sŒ|6ddz  }7|7 !                    ¦   «         s|6dez  }7|7 !                    ¦   «         sŒJ	 tE          |7¦  «        5 }8tG          j$        |8¦  «        pi }9d7d7d7¦  «         n# 1 swxY w Y   n# t          $ r i }9Y nw xY w|9                     d#¦  «        p|6j%        }:|:|3v rŒ¼|4 
                    |:¦  «         ŒÒn# t          $ r g }4Y nw xY w|4|1db<   |1|da<   t          |¦  «         |d          
                    dftM          |4¦  «        › dg�¦  «         |s2|4r!t          dhtM          |4¦  «        › di�¦  «         nt          dj¦  «         ||k     r|st          dk|› dl|› �¦  «         tO          dI¬m¦  «        };|;r7|s5t          dn¦  «         |;D ]#}<t          do|<d#         › d;|<dp         › �¦  «         Œ$| �r/|;�r,t          dq¦  «         |;D �]}<|<                     d%¦  «        rt          dr|<d%         › �¦  «         |<                     ds¦  «        r$d"d7l(}=|= (                    dt|<du         › d;�¦  «        }>n+tS          dt|<du         › d;�¦  «                             ¦   «         }>|>rPt          |<d#         |>¦  «         |dv          
                    |<d#         ¦  «         t          dw|<d#         › �¦  «         n%|dx          
                    dy|<d#         › dz�¦  «         t          ¦   «          �ŒtO          d{¬m¦  «        }?|;rd|„ |;D ¦   «         nt9          ¦   «         ŠMˆMfd}„|?D ¦   «         }?t9          ¦   «         }@tU          |d6z   |d6z   ¦  «        D ]0}A|@ +                    tX                               |Ag ¦  «        ¦  «         Œ1|@�rC| �r@|�s=d~„ t?          |@¦  «        D ¦   «         }B|B�r!t          dtM          |B¦  «        › d€�¦  «         |BD ].\  }:}Ct          d�|:› d‚|C                     dpd¦  «        › �¦  «         Œ/t          ¦   «          	 tS          dƒ¦  «                             ¦   «          	                    ¦   «         }Dn# tZ          t\          f$ r d„}DY nw xY w|Dd…v �r`t          ¦   «          |BD �]M\  }:}C|C                     d%¦  «        r?t          dt|C                     dp|:¦  «        › �¦  «         t          dr|Cd%         › �¦  «         n&t          dt|C                     dp|:¦  «        › �¦  «         |C                     ds¦  «        r2d"d7l(}=|= (                    dt|C                     du|:¦  «        › d†�¦  «        }>n9tS          dt|C                     du|:¦  «        › d†�¦  «                             ¦   «         }>|>r=t          |:|>¦  «         |dv          
                    |:¦  «         t          dw|:› �¦  «         t          ¦   «          �ŒOnt          d‡¦  «         t_          ¦   «         }E|Er{t	          ¦   «         }|ED ]U}F|Fdˆ         }|Fd‰         }Gta          |||G¦  «         |d          
                    |¦  «         |st          dŠ|› d‹|G› �¦  «         ŒV||dŒ<   t          |¦  «         n(||k     r"t	          ¦   «         }||dŒ<   t          |¦  «         tc          ¦   «         }H|H�r*| �r'|�s$t          dtM          |H¦  «        › d��¦  «         |HD ]=}<|<                     dŽd�¦  «        }It          d�|<dˆ         › d‚|<dp         › d�|I› d*�¦  «         Œ>t          ¦   «          	 tS          d‘¦  «                             ¦   «          	                    ¦   «         }Dn# tZ          t\          f$ r d„}DY nw xY w|Dd…v �rTt          ¦   «          t	          ¦   «         }	 d"d’l2m3}J n# t          $ r d“}JY nw xY w|HD �]
}<|<                     d‰d¦  «        }G|Grd”|G› d*�nd}KtS          dt|<du         › |K› d;�¦  «                             ¦   «         }>|>s|Grt7          |G¦  «        }>|>r[|J› d.|<dˆ         › �}Lta          ||L|>¦  «         |d          
                    |<dˆ         ¦  «         t          dw|<dˆ         › d‹|>› �¦  «         n<|dx          
                    dy|<dˆ         › d•|<                     dŽd–¦  «        › d—�¦  «         t          ¦   «          �Œt          |¦  «         nt          d‡¦  «         |S )˜a<  
    Migrate config to latest version, prompting for new required fields.
    
    Args:
        interactive: If True, prompt user for missing values
        quiet: If True, suppress output
        
    Returns:
        Dict with migration results: {"env_added": [...], "config_added": [...], "warnings": [...]}
    )Ú	env_addedÚconfig_addedÚwarningsu     âœ“ Repaired .env file (z corrupted entries fixed)rß  rA  Útool_progressrV  rW  )ÚfalseÚ0Únor~  r  z;display.tool_progress=off (from HERMES_TOOL_PROGRESS=false))ÚnewÚallzdisplay.tool_progress=z! (from HERMES_TOOL_PROGRESS_MODE)r  z#display.tool_progress=all (default)u-     âœ“ Migrated tool progress to config.yaml: r¬  r›  ÚHERMES_TIMEZONEr]   z	timezone=z (from HERMES_TIMEZONE)z$timezone= (empty, uses server-local)ú(server-local)u%     âœ“ Added timezone to config.yaml: é	   r   u8     âœ“ Cleared ANTHROPIC_TOKEN from .env (no longer used)é   r¸  rÛ   r   r\  r5  r½  r6  rì  ú-ú(rÞ  z--r™  Úendpointrñ   z	endpoint-r”  )zno-keyzno-key-requiredr]   rÚ   rŠ  rˆ  r–  rÿ   Nu     âœ“ Migrated z) custom provider(s) to providers: sectionu       â†’ ú: é   )Ú	LLM_MODELÚOPENAI_MODELu     âœ“ Cleared u>    from .env (no longer used â€” config.yaml is source of truth)é   rt  r4  rî   )rî   Úlocal_command>   úbase.enútiny.enúlarge-v1úlarge-v2úlarge-v3úsmall.enú	medium.enúlarge-v3-turboúdistil-large-v2údistil-large-v3údistil-small.enúdistil-medium.enúdistil-large-v3.5ru  ÚtinyÚlargeÚsmallÚturboÚmediumu;     âœ“ Migrated legacy stt.model to provider-specific configé   rU  Tz1display.interim_assistant_messages=true (default)u3     âœ“ Added display.interim_assistant_messages=trueé   rW  rY  r˜  c              3   ó*   K  — | ]\  }}|› d |› �V — ŒdS )r‡   Nro   )rœ  Úpr�  s      rj   ú	<genexpr>z!migrate_config.<locals>.<genexpr>ä
  s0   è è € Ð$RÐ$R±D°A°q¨ Z Z¨A Z ZÐ$RÐ$RÐ$RÐ$RÐ$RÐ$Rrl   u>     âœ“ Migrated tool_progress_overrides â†’ display.platforms: z9display.platforms (migrated from tool_progress_overrides)é   r  Úsummary_modelÚsummary_providerÚsummary_base_urlr3  úmodel=)r]   rã   rã   ú	provider=z	base_url=u@     âœ“ Migrated compression.summary_* â†’ auxiliary.compression: u/     âœ“ Removed unused compression.summary_* keysé   Úpluginsr  r+  zplugin.yamlz
plugin.ymlz$plugins.enabled (opt-in allow-list, z grandfathered)u(     âœ“ Plugins now opt-in: grandfathered z( existing plugin(s) into plugins.enabledum     âœ“ Plugins now opt-in: no existing plugins to grandfather. Use `hermes plugins enable <name>` to activate.zConfig version: õ    â†’ ©rZ  u0   
âš ï¸�  Missing required environment variables:u      â€¢ rã  z
Let's configure them now:
z  Get your key at: rå  rë  rä  r  u     âœ“ Saved r  zSkipped z - some features may not workFc                 ó   — h | ]
}|d          ’ŒS )r\  ro   ©rœ  Úvs     rj   ú	<setcomp>z!migrate_config.<locals>.<setcomp>p  s   € Ð5Ð5Ð5 A�a˜”iÐ5Ð5Ð5rl   c                 óR   •— g | ]#}|d          ‰v¯|                      d¦  «        °!|‘Œ$S )r\  rç  ©rd   )rœ  r<  Úrequired_namess     €rj   ú
<listcomp>z"migrate_config.<locals>.<listcomp>q  sC   ø€ ð ð ð ØØˆVŒ9˜NÐ*Ð*°1·5²5¸Ñ3DÔ3DÐ*ð 	
Ø*Ð*Ð*rl   c                 ó\   — g | ])}t          |¦  «        s|t          v ¯|t          |         f‘Œ*S ro   )r`  rb  )rœ  r\  s     rj   rA  z"migrate_config.<locals>.<listcomp>|  sK   € ð 
ð 
ð 
àÝ  Ñ&Ô&ð
ð ,0Õ3DÐ+DÐ+Dð Õ$ TÔ*Ð+à+DÐ+DÐ+Drl   ú
  z$ new optional key(s) in this update:u       â€¢ u    â€” z  Configure new keys? [y/N]: Ún)ÚyrS   z (Enter to skip): z1  Set later with: hermes config set <key> <value>r™   rP  u     âœ“ Added ú = rÒ  z! skill setting(s) not configured:Úskillr®  z (from skill: z#  Configure skill settings? [y/N]: )r}  zskills.configz (default: u    â€” skill 'r—  z' may ask for it later)4Úsanitize_env_filer   r  rÏ  rx  rd   rk  rl  r`  ra   ra  Úsave_configr^   r_   r`   Úsave_env_valuer¨  Úreplacer¥  rš  ÚhostnameÚpopr¢  Úread_raw_configÚ
setdefaultr_  r£  r½   r¡  re   rØ   r¤  Úiterdirrf   r‘   ÚyamlÚ	safe_loadr\  Úlenre  ÚgetpassÚinputÚrangeÚupdaterá  ÚEOFErrorÚKeyboardInterruptrz  rp  rƒ  r~  r}  )Nr   r  ÚresultsÚfixesÚcurrent_verÚ
latest_verrf  rA  Úold_enabledÚold_modeÚold_tzÚ
tz_displayÚ	old_tokenÚcustom_listr¶  Úmigrated_countr†  Úold_nameÚold_urlÚold_keyr™   rš  r²  Ú	new_entryÚepÚdead_varÚold_valrg   Úraw_sttÚlegacy_modelr4  rt  Ú_local_modelsÚ	raw_localÚ	local_cfgÚraw_providerÚprovider_cfgÚold_overridesrY  Úplatr±   ÚmigratedÚcompÚs_modelÚ
s_providerÚ
s_base_urlÚmigrated_keysÚauxÚaux_compÚplugins_cfgr+  Údisabled_setÚgrandfatheredÚuser_plugins_dirÚchildÚmanifest_fileÚ_mfÚmanifestr\  Úmissing_envr�  rT  r›   Úmissing_optionalÚnew_var_namesÚverÚnew_and_unsetr–   ÚanswerÚmissing_configÚfieldrP  Úmissing_skill_configÚ
skill_namer}  Údefault_hintr‚  r@  sN                                                                                @rj   Úmigrate_configr�  ÷	  s°  ø€ ð °ÀÐCÐC€GðÝ!Ñ#Ô#ˆØð 	Q˜ð 	QÝÐO¨uÐOÐOÐOÑPÔPÐPøøÝð ð ð Øˆðøøøõ 3Ñ4Ô4Ñ€K�ð �Q‚�Ý‘”ˆØ—*’*˜Y¨Ñ+Ô+ˆÝ˜'¥4Ñ(Ô(ð 	ØˆGØ 'Ð)Ñ)Ý'Ð(>Ñ?Ô?ˆKÝ$Ð%@ÑAÔAˆHØð V˜{×0Ò0Ñ2Ô2Ð6JÐJÐJØ+0�˜Ñ(Ø˜Ô'×.Ò.Ð/lÑmÔmÐmÐmØð V˜hŸnšnÑ.Ô.°.Ð@Ð@Ø+3¯>ª>Ñ+;Ô+;�˜Ñ(Ø˜Ô'×.Ò.Ð/{ÈÏÊÑHXÔHXÐ/{Ð/{Ð/{Ñ|Ô|Ð|Ð|à+0�˜Ñ(Ø˜Ô'×.Ò.Ð/TÑUÔUÐUØ 'ˆF�9ÑÝ˜ÑÔÐØð bÝÐ`ÀgÈoÔF^Ð`Ð`ÑaÔaÐað �Q‚€Ý‘”ˆØ˜VÐ#Ð#Ý”YÐ0°"Ñ5Ô5ˆFØð W˜&Ÿ,š,™.œ.ð WØ%+§\¢\¡^¤^��zÑ"Ø˜Ô'×.Ò.Ð/b¸6¿<º<¹>¼>Ð/bÐ/bÐ/bÑcÔcÐcÐcà%'��zÑ"Ø˜Ô'×.Ò.Ð/UÑVÔVÐVÝ˜ÑÔÐØð LØ# JÔ/ÐCÐ3C�
ÝÐJ¸jÐJÐJÑKÔKÐKð �Q‚€ð	Ý%Ð&7Ñ8Ô8ˆIØð VÝÐ0°"Ñ5Ô5Ð5Øð VÝÐTÑUÔUÐUøøÝð 	ð 	ð 	ØˆDð	øøøð �RÒÑÝ‘”ˆØ—j’jÐ!3Ñ4Ô4ˆÝ�k¥4Ñ(Ô(ñ 9	E¨[ñ 9	EØ#ŸZšZ¨°RÑ8Ô8ˆNÝ˜n­dÑ3Ô3ð $Ø!#�ØˆNØ$ð )$ñ )$�Ý! %­Ñ.Ô.ð ØØ Ÿ9š9 V¨RÑ0Ô0�ØŸ)š) J°Ñ3Ô3ÐQ°u·y²yÀÈÑ7KÔ7KÐQÈr�ØŸ)š) I¨rÑ2Ô2�Øð Øð —n’nÑ&Ô&×,Ò,Ñ.Ô.×6Ò6°s¸CÑ@Ô@×HÒHÈÈbÑQÔQ×YÒYÐZ]Ð_aÑbÔb�à˜c�k�kØŸ+š+ d¨CÑ0Ô0�Cð ˜c�k�kà—i’i ‘n”n�Øð ;ð;Ø9Ð9Ð9Ð9Ð9Ð9Ø!) ¨'Ñ!2Ô!2˜Ø%œÐ<°*×EÒEÀcÈ3ÑOÔO˜˜øÝ$ð ;ð ;ð ;Ø:¨.Ð:Ð:˜˜˜ð;øøøð ˜.Ð(Ð(Ø Ð3Ð3 >Ð3Ð3�Cà" GÐ,�	Øð 1Ø(0�I˜fÑ%Øð 3˜wÐ.OÐOÐOØ+2�I˜iÑ(ð —9’9˜WÑ%Ô%ð @Ø16°w´�I˜oÑ.Ø—9’9˜ZÑ(Ô(ð ?Ø-2°:Ô->�I˜kÑ*à&/�˜sÑ#Ø !Ñ#�‘à Ò!Ð!Ø&4��{Ñ#à—
’
Ð-¨tÑ4Ô4Ð4Ý˜FÑ#Ô#Ð#Øð EÝÐe¨NÐeÐeÐeÑfÔfÐfÝ# N×$7Ò$7Ñ$9Ô$9Ñ:Ô:¸N¸?Ð;KÐ;KÔLð Eð E˜Ø+¨CÔ0˜ÝÐC¨ÐCÐC°·²°u¸bÑ0AÔ0AÐCÐCÑDÔDÐDÐDð �RÒÐØ5ð 	ð 	ˆHðÝ'¨Ñ1Ô1�Øð yÝ" 8¨RÑ0Ô0Ð0Ø ð yÝÐw¨xÐwÐwÐwÑxÔxÐxøøÝð ð ð Ø�ðøøøð �RÒÑõ ÑÔˆØ—'’'˜% Ñ$Ô$ˆÝ�g�tÑ$Ô$ñ %	V¨°GÐ);Ñ);Ø" 7Ô+ˆLØ—{’{ :¨wÑ7Ô7ˆHÝ ‘]”]ˆFØ—*’*˜U BÑ'Ô'ˆCà�GŠG�G˜TÑ"Ô"Ð"ð Ð5Ð5Ð5ð!ð !ð !�ð   =Ð0Ð0ð !(§¢¨G°RÑ 8Ô 8�IÝ% iµÑ6Ô6ð :¸'ÈÐ:RÐ:RØ$'§N¢N°7¸BÑ$?Ô$?˜	Ø-9˜	 'Ñ*øð  'Ÿ{š{¨8°RÑ8Ô8�Ý! ,µÑ5Ô5ð 9¸ÈÐ9TÐ9TØ#&§>¢>°(¸BÑ#?Ô#?�LØ,8�L Ñ)ØˆF�5‰MÝ˜ÑÔÐØð VÝÐTÑUÔUÐUð �RÒÐÝ Ñ"Ô"ˆØ—*’*˜Y¨Ñ+Ô+ˆÝ˜'¥4Ñ(Ô(ð 	ØˆGØ'¨wÐ6Ð6Ø48ˆGÐ0Ñ1Ø 'ˆF�9ÑØ�NÔ#×*Ò*Ð+^Ñ_Ô_Ð_Ý˜ÑÔÐØð MÝÐKÑLÔLÐLð �RÒÑÝ Ñ"Ô"ˆØ—*’*˜Y¨Ñ+Ô+ˆÝ˜'¥4Ñ(Ô(ð 	ØˆGØŸšÐ$=Ñ>Ô>ˆÝ�m¥TÑ*Ô*ð 	h¨}ð 	hØŸš K°Ñ4Ô4ˆIÝ˜i­Ñ.Ô.ð Ø�	Ø+×1Ò1Ñ3Ô3ð <ð <‘
��dØ˜yÐ(Ð(Ø&(�I˜d‘OØ"¨)°D¬/Ð9Ð9Ø7;�I˜d”O OÑ4øØ#,ˆG�KÑ Ø 'ˆF�9ÑÝ˜ÑÔÐØð cØŸ9š9Ð$RÐ$R¸M×<OÒ<OÑ<QÔ<QÐ$RÑ$RÔ$RÑRÔR�ÝÐaÐW_ÐaÐaÑbÔbÐbØ�NÔ#×*Ò*Ð+fÑgÔgÐgð �RÒÑÝ Ñ"Ô"ˆØ�zŠz˜-¨Ñ,Ô,ˆÝ�d�DÑ!Ô!ñ 	QØ—h’h˜°Ñ5Ô5ˆGØŸšÐ"4°dÑ;Ô;ˆJØŸšÐ"4°dÑ;Ô;ˆJØˆMàð =�3˜w™<œ<×-Ò-Ñ/Ô/ð =Ø×'Ò'¨°RÑ8Ô8�ØŸ>š>¨-¸Ñ<Ô<�Ø—|’| GÑ,Ô,ð =Ý(+¨G©¬×(:Ò(:Ñ(<Ô(<�H˜WÑ%Ø!×(Ò(Ð);°'Ð);Ð);Ñ<Ô<Ð<Øð C�c *™oœo×3Ò3Ñ5Ô5¸\ÐIÐIØ×'Ò'¨°RÑ8Ô8�ØŸ>š>¨-¸Ñ<Ô<�Ø—|’| JÑ/Ô/ð C°8·<²<À
Ñ3KÔ3KÈvÒ3UÐ3UÝ+.¨z©?¬?×+@Ò+@Ñ+BÔ+B�H˜ZÑ(Ø!×(Ò(Ð)A°ZÐ)AÐ)AÑBÔBÐBØð C�c *™oœo×3Ò3Ñ5Ô5ð CØ×'Ò'¨°RÑ8Ô8�ØŸ>š>¨-¸Ñ<Ô<�Ø—|’| JÑ/Ô/ð CÝ+.¨z©?¬?×+@Ò+@Ñ+BÔ+B�H˜ZÑ(Ø!×(Ò(Ð)A°ZÐ)AÐ)AÑBÔBÐBØð Q Ð 3°zÐ7MÐQ[ÐQgØ(,��}Ñ%Ý˜FÑ#Ô#Ð#Øð QØ$ð QÝÐ{Ðae×ajÒajÐkxÑayÔayÐ{Ð{Ñ|Ô|Ð|Ð|åÐOÑPÔPÐPð �RÒÑÝ Ñ"Ô"ˆØ—j’j Ñ+Ô+ˆÝ˜+¥tÑ,Ô,ð 	ØˆKà˜KÐ'Ñ'Ø"—’ z°2Ñ6Ô6Ð<¸"ˆHÝ˜h­Ñ-Ô-ð Ø�Ý˜x™=œ=ˆLð (*ˆMð#Ý#2Ñ#4Ô#4°yÑ#@Ð Ø#×*Ò*Ñ,Ô,ð 3Ý!'Ð(8×(@Ò(@Ñ(BÔ(BÑ!CÔ!Cð 3ð 3˜Ø$Ÿ|š|™~œ~ð %Ø$Ø(-°Ñ(=˜Ø,×3Ò3Ñ5Ô5ð AØ,1°LÑ,@˜MØ,×3Ò3Ñ5Ô5ð %Ø$ð*Ý!% mÑ!4Ô!4ð E¸Ý+/¬>¸#Ñ+>Ô+>Ð+DÀ" ðEð Eð Eñ Eô Eð Eð Eð Eð Eð Eð Eøøøð Eð Eð Eð Eøøå(ð *ð *ð *Ø')˜H˜H˜Hð*øøøà'Ÿ|š|¨FÑ3Ô3ÐA°u´z˜Ø <Ð/Ð/Ø$Ø%×,Ò,¨TÑ2Ô2Ð2Ð2øøÝð #ð #ð #Ø "���ð#øøøð &3ˆK˜	Ñ"Ø +ˆF�9ÑÝ˜ÑÔÐØ�NÔ#×*Ò*ØZµs¸=Ñ7IÔ7IÐZÐZÐZñô ð ð ð 
Ø ð 	ÝðXÝ˜}Ñ-Ô-ðXð Xð Xñô ð ð õ
 ðJñô ð ð
 �ZÒÐ¨ÐÝÐ? Ð?Ð?°:Ð?Ð?Ñ@Ô@Ð@õ '°TÐ:Ñ:Ô:€Kàð A˜5ð AÝÐAÑBÔBÐBØð 	Að 	AˆCÝÐ?˜C œKÐ?Ð?¨3¨}Ô+=Ð?Ð?Ñ@Ô@Ð@Ð@àñ �{ñ ÝÐ-Ñ.Ô.Ð.Øð 	ñ 	ˆCØ�wŠw�u‰~Œ~ð :ÝÐ8¨C°¬JÐ8Ð8Ñ9Ô9Ð9à�wŠw�zÑ"Ô"ð >Ø���ØŸšÐ(>¨S°¬]Ð(>Ð(>Ð(>Ñ?Ô?��åÐ4 3 x¤=Ð4Ð4Ð4Ñ5Ô5×;Ò;Ñ=Ô=�àð bÝ˜s 6œ{¨EÑ2Ô2Ð2Ø˜Ô$×+Ò+¨C°¬KÑ8Ô8Ð8ÝÐ2 S¨¤[Ð2Ð2Ñ3Ô3Ð3Ð3à˜
Ô#×*Ò*Ð+`°c¸&´kÐ+`Ð+`Ð+`ÑaÔaÐaÝ‰GŒGˆG‰Gõ ,¸%Ð@Ñ@Ô@ÐØ9DÐOÐ5Ð5¨Ð5Ñ5Ô5Ð5Í#É%Ì%€Nðð ð ð Ø#ðñ ô Ðõ ‘E”E€MÝ�[ 1‘_ j°1¡nÑ5Ô5ð ?ð ?ˆØ×ÒÕ0×4Ò4°S¸"Ñ=Ô=Ñ>Ô>Ð>Ð>àñ #K˜ñ #K¨Uñ #Kð
ð 
å˜}Ñ-Ô-ð
ñ 
ô 
ˆð
 ñ 	KÝÐQ�˜]Ñ+Ô+ÐQÐQÐQÑRÔRÐRØ+ð Kð K‘
��dÝÐI ÐIÐI¨D¯HªH°]ÀBÑ,GÔ,GÐIÐIÑJÔJÐJÐJÝ‰GŒGˆGðÝÐ>Ñ?Ô?×EÒEÑGÔG×MÒMÑOÔO��øÝÕ/Ð0ð ð ð Ø���ðøøøð ˜Ð%Ñ%Ý‘”�Ø"/ð ñ ‘J�D˜$Ø—x’x ‘”ð DÝÐB 4§8¢8¨M¸4Ñ#@Ô#@ÐBÐBÑCÔCÐCÝÐA°D¸´KÐAÐAÑBÔBÐBÐBåÐB 4§8¢8¨M¸4Ñ#@Ô#@ÐBÐBÑCÔCÐCØ—x’x 
Ñ+Ô+ð aØ&˜˜˜Ø '§¢Ð0a°T·X²X¸hÈÑ5MÔ5MÐ0aÐ0aÐ0aÑ bÔ b˜˜å %Ð&W¨4¯8ª8°H¸dÑ+CÔ+CÐ&WÐ&WÐ&WÑ XÔ X× ^Ò ^Ñ `Ô `˜Øð 5Ý& t¨UÑ3Ô3Ð3Ø Ô,×3Ò3°DÑ9Ô9Ð9ÝÐ3¨TÐ3Ð3Ñ4Ô4Ð4Ý‘G”G�G‘Gðõ" ÐIÑJÔJÐJõ /Ñ0Ô0€Nàð Ý‘”ˆà#ð 	8ð 	8ˆEØ˜”,ˆCØ˜IÔ&ˆGå˜  WÑ-Ô-Ð-Ø�NÔ#×*Ò*¨3Ñ/Ô/Ð/Øð 8ÝÐ6 SÐ6Ð6¨WÐ6Ð6Ñ7Ô7Ð7øð %/ˆÐ Ñ!Ý�FÑÔÐÐØ	�zÒ	!Ð	!å‘”ˆØ$.ˆÐ Ñ!Ý�FÑÔÐõ 9Ñ:Ô:ÐØñ $G ñ $G°Eñ $GÝÐQ•SÐ-Ñ.Ô.ÐQÐQÐQÑRÔRÐRØ'ð 	_ð 	_ˆCØŸš ¨)Ñ4Ô4ˆJÝÐ]˜S œZÐ]Ð]¨c°-Ô.@Ð]Ð]ÐPZÐ]Ð]Ð]Ñ^Ô^Ð^Ð^Ý‰Œˆð	ÝÐ@ÑAÔA×GÒGÑIÔI×OÒOÑQÔQˆFˆFøÝÕ+Ð,ð 	ð 	ð 	ØˆFˆFˆFð	øøøð �\Ð!Ñ!Ý‰GŒGˆGÝ ‘]”]ˆFð6ØAÐAÐAÐAÐAÐAÐAøÝð 6ð 6ð 6Ø&5Ð#Ð#Ð#ð6øøøà+ð ñ �ØŸ'š' )¨RÑ0Ô0�Ø;BÐJÐ7¨WÐ7Ð7Ð7Ð7È�ÝÐB 3 x¤=ÐB°,ÐBÐBÐBÑCÔC×IÒIÑKÔK�Øð ) ð )Ý ™LœL�EØð Ø%8Ð"GÐ"G¸3¸u¼:Ð"GÐ"G�KÝ ¨°UÑ;Ô;Ð;Ø˜NÔ+×2Ò2°3°u´:Ñ>Ô>Ð>ÝÐ?¨¨U¬Ð?Ð?¸Ð?Ð?Ñ@Ô@Ð@Ð@à˜JÔ'×.Ò.Øh 3 u¤:ÐhÐh¸3¿7º7À7ÈCÑ;PÔ;PÐhÐhÐhñô ð õ ‘”�‘Ý˜ÑÔÐÐåÐEÑFÔFÐFà€Nså   ‰%/ ¯
<»<É=2J0 Ê0
J=Ê<J=Ñ.Q1Ñ1RÒRÖ!6W×
W%×$W%ñ>Bv ôuôuô5uõu	õuõu	õ	uõv õuõv õuõ:v öv&ö%v&ÁC3AD ÁDADÁDADÁO3AO< ÁO<APÁPAPÁP7AP> ÁP>AQÁQAQÚoverridec                 ó  — |                       ¦   «         }|                     ¦   «         D ]X\  }}||v rJt          ||         t          ¦  «        r/t          |t          ¦  «        rt	          ||         |¦  «        ||<   ŒS|||<   ŒY|S )a  Recursively merge *override* into *base*, preserving nested defaults.

    Keys in *override* take precedence. If both values are dicts the merge
    recurses, so a user who overrides only ``tts.elevenlabs.voice_id`` will
    keep the default ``tts.elevenlabs.model_id`` intact.
    )Úcopyr_  rk  rl  Ú_deep_merge)ru  r‘  Úresultr™   r›   s        rj   r”  r”  æ  sŠ   € ð �YŠY‰[Œ[€FØ—n’nÑ&Ô&ð  ð  ‰
ˆˆUà�6ˆMˆMÝ˜6 #œ;­Ñ-Ô-ð å˜5¥$Ñ'Ô'ð õ & f¨S¤k°5Ñ9Ô9ˆF�3‰KˆKàˆF�3‰KˆKØ€Mrl   c                 ó  — t          | t          ¦  «        rt          j        dd„ | ¦  «        S t          | t          ¦  «        rd„ |                      ¦   «         D ¦   «         S t          | t          ¦  «        rd„ | D ¦   «         S | S )a  Recursively expand ``${VAR}`` references in config values.

    Only string values are processed; dict keys, numbers, booleans, and
    None are left untouched.  Unresolved references (variable not in
    ``os.environ``) are kept verbatim so callers can detect them.
    z\${([^}]+)}c                 óŽ   — t           j                             |                      d¦  «        |                      d¦  «        ¦  «        S )Nrÿ   r   )r^   r�   rd   Úgroup)r�  s    rj   ú<lambda>z"_expand_env_vars.<locals>.<lambda>  s*   € •b”j—n’n Q§W¢W¨Q¡Z¤Z°·²¸±´Ñ<Ô<€ rl   c                 ó4   — i | ]\  }}|t          |¦  «        “ŒS ro   ©Ú_expand_env_vars)rœ  Úkr<  s      rj   rž  z$_expand_env_vars.<locals>.<dictcomp>  s'   € Ð?Ð?Ð?©4¨1¨a�Õ# AÑ&Ô&Ð?Ð?Ð?rl   c                 ó,   — g | ]}t          |¦  «        ‘ŒS ro   r›  )rœ  Úitems     rj   rA  z$_expand_env_vars.<locals>.<listcomp>
  s!   € Ð7Ð7Ð7¨4Õ  Ñ&Ô&Ð7Ð7Ð7rl   )rk  r½   ÚreÚsubrl  r_  r¨  )Úobjs    rj   rœ  rœ  ú  s’   € õ �#•sÑÔð 
ÝŒvØØ<Ð<Øñ
ô 
ð 	
õ
 �#•tÑÔð @Ø?Ð?°3·9²9±;´;Ð?Ñ?Ô?Ð?Ý�#•tÑÔð 8Ø7Ð7°3Ð7Ñ7Ô7Ð7Ø€Jrl   c                 óê   — t          | t          ¦  «        sdS i }| D ]V}t          |t          ¦  «        r(t          |                     d¦  «        t          ¦  «        s dS |d         }||v r dS |||<   ŒW|S )zHReturn a name-indexed dict only when all items have unique string names.Nr\  )rk  r¨  rl  rd   r½   )r_  ÚindexedrŸ  r\  s       rj   Ú_items_by_unique_namer¥    sŒ   € å�e�TÑ"Ô"ð ØˆtØ€GØð ð ˆÝ˜$¥Ñ%Ô%ð 	­Z¸¿ºÀÑ8HÔ8HÍ#Ñ-NÔ-Nð 	Ø�4�4Ø�FŒ|ˆØ�7ˆ?ˆ?Ø�4�4Øˆ�‰ˆØ€Nrl   c                 ó¦  ‡‡‡‡— t          | t          ¦  «        rft          ‰t          ¦  «        rQt          j        d‰¦  «        r<| ‰k    r‰S t          ‰t          ¦  «        r| ‰k    r‰S t	          ‰¦  «        | k    r‰S | S t          | t
          ¦  «        r6t          ‰t
          ¦  «        r!ˆˆfd„|                      ¦   «         D ¦   «         S t          | t          ¦  «        rqt          ‰t          ¦  «        r\t          | ¦  «        }t          ‰¦  «        Št          ‰¦  «        Š|�‰�ˆˆfd„| D ¦   «         S ˆˆfd„t          | ¦  «        D ¦   «         S | S )aÅ  Restore raw ``${VAR}`` templates when a value is otherwise unchanged.

    ``load_config()`` expands env refs for runtime use. When a caller later
    persists that config after modifying some unrelated setting, keep the
    original on-disk template instead of writing the expanded plaintext
    secret back to ``config.yaml``.

    Prefer preserving the raw template when ``current`` still matches either
    the value previously returned by ``load_config()`` for this config path or
    the current environment expansion of ``raw``. This handles env-var
    rotation between load and save while still treating mixed literal/template
    string edits as caller-owned once their rendered value diverges.
    z	\${[^}]+}c                 ó´   •— i | ]T\  }}|t          |‰                     |¦  «        t          ‰t          ¦  «        r‰                     |¦  «        nd ¦  «        “ŒUS ©N)Ú_preserve_env_ref_templatesrd   rk  rl  )rœ  r™   r›   Úloaded_expandedrg   s      €€rj   rž  z/_preserve_env_ref_templates.<locals>.<dictcomp>5  sr   ø€ ð 
ð 
ð 
ñ ��Uð Õ,ØØ—’˜‘”Ý,6°ÍÑ,MÔ,MÐW�×#Ò# CÑ(Ô(Ð(ÐSWñô ð
ð 
ð 
rl   Nc                 óÒ   •— g | ]c}t          |‰                     |                     d ¦  «        ¦  «        ‰�(‰                     |                     d ¦  «        ¦  «        nd¦  «        ‘ŒdS )r\  N)r©  rd   )rœ  rŸ  Úloaded_by_nameÚraw_by_names     €€rj   rA  z/_preserve_env_ref_templates.<locals>.<listcomp>G  s{   ø€ ð ð ð ð õ ,ØØ—O’O D§H¢H¨VÑ$4Ô$4Ñ5Ô5Ø<JÐ<V�N×&Ò& t§x¢x°Ñ'7Ô'7Ñ8Ô8Ð8Ð\`ñô ðð ð rl   c           
      óÎ   •— g | ]a\  }}t          ||t          ‰¦  «        k     r‰|         nd t          ‰t          ¦  «        r|t          ‰¦  «        k     r‰|         nd ¦  «        ‘ŒbS r¨  )r©  rS  rk  r¨  )rœ  ÚindexrŸ  rª  rg   s      €€rj   rA  z/_preserve_env_ref_templates.<locals>.<listcomp>O  sŒ   ø€ ð 	
ð 	
ð 	
ñ ��tõ (ØØ#¥c¨#¡h¤hÒ.Ð.��E”
�
°Då˜o­tÑ4Ô4ðØ9>ÅÀ_ÑAUÔAUÒ9UÐ9Uð   Ô&Ð&àñô ð	
ð 	
ð 	
rl   )
rk  r½   r   Úsearchrœ  rl  r_  r¨  r¥  rà  )rn  rg   rª  Úcurrent_by_namer¬  r­  s    `` @@rj   r©  r©    s´  øøøø€ õ �'�3ÑÔð ¥J¨sµCÑ$8Ô$8ð ½R¼YÀ|ÐUXÑ=YÔ=Yð Ø�cŠ>ˆ>ØˆJÝ�o¥sÑ+Ô+ð 	°¸?Ò0JÐ0JØˆJÝ˜CÑ Ô  GÒ+Ð+ØˆJØˆå�'�4Ñ Ô ð 
¥Z°µTÑ%:Ô%:ð 
ð
ð 
ð 
ð 
ð 
ð &Ÿmšm™oœoð
ñ 
ô 
ð 	
õ �'�4Ñ Ô ð 
¥Z°µTÑ%:Ô%:ð 
õ
 0°Ñ8Ô8ˆÝ+¨CÑ0Ô0ˆÝ.¨Ñ?Ô?ˆØÐ&¨;Ð+Bðð ð ð ð ð $ðñ ô ð ð	
ð 	
ð 	
ð 	
ð 	
õ  )¨Ñ1Ô1ð	
ñ 	
ô 	
ð 		
ð €Nrl   c                 ój  ‡ — t          ˆ fd„dD ¦   «         ¦  «        }|s‰ S t          ‰ ¦  «        Š ‰                      d¦  «        }t          |t          ¦  «        s|rd|ini }|‰ d<   dD ]I}‰                      |¦  «        }|r|                     |¦  «        s|||<   ‰                      |d¦  «         ŒJ‰ S )uà  Move stale root-level provider/base_url into model section.

    Some users (or older code) placed ``provider:`` and ``base_url:`` at the
    config root instead of inside ``model:``.  These root-level keys are only
    used as a fallback when the corresponding ``model.*`` key is empty â€” they
    never override an existing ``model.provider`` or ``model.base_url``.
    After migration the root-level keys are removed so they can't cause
    confusion on subsequent loads.
    c              3   óB   •K  — | ]}‰                      |¦  «        V — Œd S r¨  r?  )rœ  r�  rf  s     €rj   r/  z-_normalize_root_model_keys.<locals>.<genexpr>h  s-   øè è € ÐCÐC Q�6—:’:˜a‘=”=ÐCÐCÐCÐCÐCÐCrl   )r4  r5  rÚ   rP  N)Úanyrl  rd   rk  rM  )rf  Úhas_rootrÚ   r™   Úroot_vals   `    rj   Ú_normalize_root_model_keysr·  ]  sÜ   ø€ õ ÐCÐCÐCÐCÐ*BÐCÑCÔCÑCÔC€HØð Øˆå�&‰\Œ\€FØ�JŠJ�wÑÔ€EÝ�e�TÑ"Ô"ð  Ø&+Ð3�˜EÐ"Ð"°ˆØˆˆw‰à'ð ð ˆØ—:’:˜c‘?”?ˆØð 	"˜EŸIšI c™NœNð 	"Ø!ˆE�#‰JØ�
Š
�3˜ÑÔÐÐà€Mrl   c                 óü   — t          | ¦  «        } t          |                      d¦  «        pi ¦  «        }d| v rd|vr| d         |d<   d|vrt          d         d         |d<   || d<   |                      dd¦  «         | S )z;Normalize legacy root-level max_turns into agent.max_turns.rß   rå   N)rl  rd   ry  rM  )rf  Úagent_configs     rj   Ú_normalize_max_turns_configrº  {  s�   € å�&‰\Œ\€FÝ˜Ÿ
š
 7Ñ+Ô+Ð1¨rÑ2Ô2€Là�fÐÐ °LÐ!@Ð!@Ø$*¨;Ô$7ˆ�[Ñ!à˜,Ð&Ð&Ý$2°7Ô$;¸KÔ$Hˆ�[Ñ!à"€Fˆ7�OØ
‡J‚Jˆ{˜DÑ!Ô!Ð!Ø€Mrl   c                  óì   — 	 t          ¦   «         } |                      ¦   «         r?t          | d¬¦  «        5 }t          j        |¦  «        pi cddd¦  «         S # 1 swxY w Y   n# t
          $ r Y nw xY wi S )aO  Read ~/.hermes/config.yaml as-is, without merging defaults or migrating.

    Returns the raw YAML dict, or ``{}`` if the file doesn't exist or can't
    be parsed.  Use this for lightweight config reads where you just need a
    single value and don't want the overhead of ``load_config()``'s deep-merge
    + migration pipeline.
    rÁ   rÂ   N)rŸ   rf   r‘   rQ  rR  r  )Úconfig_pathr—   s     rj   rN  rN  Œ  sÈ   € ðÝ%Ñ'Ô'ˆØ×ÒÑÔð 	/Ý�k¨GÐ4Ñ4Ô4ð /¸Ý”~ aÑ(Ô(Ð.¨Bð/ð /ð /ð /ñ /ô /ð /ð /ð /ð /ð /ð /øøøð /ð /ð /ð /øøåð ð ð Øˆðøøøà€Is4   ‚3A$ µAÁA$ ÁAÁA$ ÁAÁ A$ Á$
A1Á0A1c                  óú  — t          ¦   «          t          ¦   «         } t          j        t          ¦  «        }|                      ¦   «         rÝ	 t          | d¬¦  «        5 }t          j        |¦  «        pi }ddd¦  «         n# 1 swxY w Y   d|v r_t          | 
                    d¦  «        pi ¦  «        }| 
                    d¦  «        €|d         |d<   ||d<   |                     dd¦  «         t          ||¦  «        }n)# t          $ r}t          d|› �¦  «         Y d}~nd}~ww xY wt          t!          |¦  «        ¦  «        }t#          |¦  «        }t          j        |¦  «        t$          t'          | ¦  «        <   |S )z.Load configuration from ~/.hermes/config.yaml.rÁ   rÂ   Nrå   rß   z Warning: Failed to load config: )rÖ   rŸ   r“  Údeepcopyry  rf   r‘   rQ  rR  rl  rd   rM  r”  r  r   r·  rº  rœ  r   r½   )r¼  rf  r—   Úuser_configÚagent_user_configÚerh   Úexpandeds           rj   rx  rx  ž  sÅ  € åÑÔÐÝ!Ñ#Ô#€KåŒ]�>Ñ*Ô*€Fà×ÒÑÔð :ð	:Ý�k¨GÐ4Ñ4Ô4ð 6¸Ý"œn¨QÑ/Ô/Ð5°2�ð6ð 6ð 6ñ 6ô 6ð 6ð 6ð 6ð 6ð 6ð 6øøøð 6ð 6ð 6ð 6ð ˜kÐ)Ð)Ý$(¨¯ª¸Ñ)AÔ)AÐ)GÀRÑ$HÔ$HÐ!Ø$×(Ò(¨Ñ5Ô5Ð=Ø5@ÀÔ5MÐ% kÑ2Ø'8�˜GÑ$Ø—’ ¨TÑ2Ô2Ð2å  ¨Ñ5Ô5ˆFˆFøÝð 	:ð 	:ð 	:ÝÐ8°QÐ8Ð8Ñ9Ô9Ð9Ð9Ð9Ð9Ð9Ð9øøøøð	:øøøõ ,Õ,GÈÑ,OÔ,OÑPÔP€JÝ 
Ñ+Ô+€HÝ6:´mÀHÑ6MÔ6MÕ!¥# kÑ"2Ô"2Ñ3Ø€Os=   ÁC> ÁA?Á3C> Á?BÂC> ÂBÂA6C> Ã>
D$ÄDÄD$u«  
# â”€â”€ Security â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€
# API keys, tokens, and passwords are redacted from tool output by default.
# Set to false to see full values (useful for debugging auth issues).
# tirith pre-exec scanning is enabled by default when the tirith binary
# is available. Configure via security.tirith_* keys or env vars
# (TIRITH_ENABLED, TIRITH_BIN, TIRITH_TIMEOUT, TIRITH_FAIL_OPEN).
#
# security:
#   redact_secrets: false
#   tirith_enabled: true
#   tirith_path: "tirith"
#   tirith_timeout: 5
#   tirith_fail_open: true
uú  
# â”€â”€ Fallback Model â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€
# Automatic provider failover when primary is unavailable.
# Uncomment and configure to enable. Triggers on rate limits (429),
# overload (529), service errors (503), or connection failures.
#
# Supported providers:
#   openrouter   (OPENROUTER_API_KEY)  â€” routes to any model
#   openai-codex (OAuth â€” hermes auth) â€” OpenAI Codex
#   nous         (OAuth â€” hermes auth) â€” Nous Portal
#   zai          (ZAI_API_KEY)         â€” Z.AI / GLM
#   kimi-coding  (KIMI_API_KEY)        â€” Kimi / Moonshot
#   kimi-coding-cn (KIMI_CN_API_KEY)   â€” Kimi / Moonshot (China)
#   minimax      (MINIMAX_API_KEY)     â€” MiniMax
#   minimax-cn   (MINIMAX_CN_API_KEY)  â€” MiniMax (China)
#
# For custom OpenAI-compatible endpoints, add base_url and key_env.
#
# fallback_model:
#   provider: openrouter
#   model: anthropic/claude-sonnet-4
uv  
# â”€â”€ Security â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€
# API keys, tokens, and passwords are redacted from tool output by default.
# Set to false to see full values (useful for debugging auth issues).
#
# security:
#   redact_secrets: false

# â”€â”€ Fallback Model â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€
# Automatic provider failover when primary is unavailable.
# Uncomment and configure to enable. Triggers on rate limits (429),
# overload (529), service errors (503), or connection failures.
#
# Supported providers:
#   openrouter   (OPENROUTER_API_KEY)  â€” routes to any model
#   openai-codex (OAuth â€” hermes auth) â€” OpenAI Codex
#   nous         (OAuth â€” hermes auth) â€” Nous Portal
#   zai          (ZAI_API_KEY)         â€” Z.AI / GLM
#   kimi-coding  (KIMI_API_KEY)        â€” Kimi / Moonshot
#   kimi-coding-cn (KIMI_CN_API_KEY)   â€” Kimi / Moonshot (China)
#   minimax      (MINIMAX_API_KEY)     â€” MiniMax
#   minimax-cn   (MINIMAX_CN_API_KEY)  â€” MiniMax (China)
#
# For custom OpenAI-compatible endpoints, add base_url and key_env.
#
# fallback_model:
#   provider: openrouter
#   model: anthropic/claude-sonnet-4
c           	      ó²  — t          ¦   «         rt          d¦  «         dS ddlm} t	          ¦   «          t          ¦   «         }t          t          | ¦  «        ¦  «        }|}t          t          t          ¦   «         ¦  «        ¦  «        }|r6t          ||t                               t          |¦  «        ¦  «        ¦  «        }g }|                     di ¦  «        }|r|                     d¦  «        €|                     t          ¦  «         |                     di ¦  «        }|r?t          |t           ¦  «        r*|                     d¦  «        r|                     d	¦  «        s|                     t"          ¦  «          ||||rd
                     |¦  «        nd¬¦  «         t'          |¦  «         t)          j        |¦  «        t          t          |¦  «        <   dS )z,Save configuration to ~/.hermes/config.yaml.zsave configurationNr   ©Úatomic_yaml_writerÌ  r¯  rÑ  r4  rÚ   r]   )Úextra_content)rp   r‚   ÚutilsrÅ  rÖ   rŸ   r·  rº  rN  r©  r   rd   r½   ra  Ú_SECURITY_COMMENTrk  rl  Ú_FALLBACK_COMMENTr£  r¾   r“  r¾  )	rf  rÅ  r¼  Úcurrent_normalizedrh   Úraw_existingrm  Úsecrè  s	            rj   rI  rI    sÐ  € å�|„|ð ÝÐ*Ñ+Ô+Ð+ØˆØ'Ð'Ð'Ð'Ð'Ð'åÑÔÐÝ!Ñ#Ô#€KÝ3Õ4OÐPVÑ4WÔ4WÑXÔXÐØ#€JÝ-Õ.IÍ/ÑJ[ÔJ[Ñ.\Ô.\Ñ]Ô]€LØð 
Ý0ØØÝ)×-Ò-­c°+Ñ.>Ô.>Ñ?Ô?ñ
ô 
ˆ
ð €EØ
�.Š.˜ RÑ
(Ô
(€CØð (�#—'’'Ð*Ñ+Ô+Ð3Ø�ŠÕ&Ñ'Ô'Ð'Ø	�ŠÐ(¨"Ñ	-Ô	-€BØð (•Z ¥DÑ)Ô)ð (°"·&²&¸Ñ2DÔ2Dð (ÈÏÊÐPWÉÌð (Ø�ŠÕ&Ñ'Ô'Ð'àÐØØØ(-Ð7�b—g’g˜e‘n”n�n°4ðñ ô ð õ
 �ÑÔÐÝ6:´mÐDVÑ6WÔ6WÕ!¥# kÑ"2Ô"2Ñ3Ð3Ð3rl   c                  ó  — t          ¦   «         } i }|                      ¦   «         rßt          rdddœni }t          | fi |¤Ž5 }|                     ¦   «         }ddd¦  «         n# 1 swxY w Y   t          |¦  «        }|D ]†}|                     ¦   «         }|rn|                     d¦  «        sYd|v rU|                     d¦  «        \  }}}	|	                     ¦   «                              d¦  «        ||                     ¦   «         <   Œ‡|S )a  Load environment variables from ~/.hermes/.env.

    Sanitizes lines before parsing so that corrupted files (e.g.
    concatenated KEY=VALUE pairs on a single line) are handled
    gracefully instead of producing mangled values such as duplicated
    bot tokens.  See #8908.
    rÁ   rK  ©rÃ   ÚerrorsNrˆ   r‡   z"')	r¡   rf   Ú_IS_WINDOWSr‘   Ú	readlinesÚ_sanitize_env_linesr`   r’   r“   )
Úenv_pathÚenv_varsÚopen_kwr—   Ú	raw_linesrð  r˜   r™   rš   r›   s
             rj   Úload_envr×  (  sM  € õ ‰~Œ~€HØ€Hà‡‚ÑÔð Cõ ALÐS˜w°)Ð<Ð<Ð<ÐQSˆÝ�(Ð&Ð&˜gÐ&Ð&ð 	&¨!ØŸš™œˆIð	&ð 	&ð 	&ñ 	&ô 	&ð 	&ð 	&ð 	&ð 	&ð 	&ð 	&øøøð 	&ð 	&ð 	&ð 	&õ $ IÑ.Ô.ˆØð 	Cð 	CˆDØ—:’:‘<”<ˆDØð C˜DŸOšO¨CÑ0Ô0ð C°S¸D°[°[Ø $§¢¨sÑ 3Ô 3‘��Q˜Ø(-¯ª©¬×(;Ò(;¸EÑ(BÔ(B�˜Ÿš™œÑ%øà€Os   Á A!Á!A%Á(A%rð  c           	      ó¦  — t          t                               ¦   «         ¦  «        t          z  }g }| D �]œ}|                     d¦  «        }|                     ¦   «         }|r|                     d¦  «        r|                     |dz   ¦  «         Œ\g }|D ]c}|dz   }|                     |¦  «        }	|	dk    rA|                     |	¦  «         |                     ||	t          |¦  «        z   ¦  «        }	|	dk    °AŒdt          |¦  «        dk    r­| 
                    ¦   «          t          t          |¦  «        ¦  «        }t          |¦  «        D ]k\  }
}|
dz   t          |¦  «        k     r||
dz            nt          |¦  «        }|||…                              ¦   «         }|r|                     |dz   ¦  «         Œl�Œ„|                     |dz   ¦  «         �Œž|S )a  Fix corrupted .env lines before reading or writing.

    Handles two known corruption patterns:
    1. Concatenated KEY=VALUE pairs on a single line (missing newline between
       entries, e.g. ``ANTHROPIC_API_KEY=sk-...OPENAI_BASE_URL=https://...``).
    2. Stale ``KEY=***`` placeholder entries left by incomplete setup runs.

    Uses a known-keys set (OPTIONAL_ENV_VARS + _EXTRA_ENV_KEYS) so we only
    split on real Hermes env var names, avoiding false positives from values
    that happen to contain uppercase text with ``=``.
    z
rˆ   rí  r‡   r   rÿ   )r¡  rb  r¢  Ú_EXTRA_ENV_KEYSr½  r`   r’   ra  ÚfindrS  Úsortr¤  rà  )rð  Ú
known_keysÚ	sanitizedr˜   rg   ÚstrippedÚsplit_positionsÚkey_nameÚneedleÚidxrç  ÚposÚendro  s                 rj   rÒ  rÒ  E  só  € õ Õ&×+Ò+Ñ-Ô-Ñ.Ô.µÑ@€Jà€IØð .ñ .ˆØ�kŠk˜&Ñ!Ô!ˆØ—9’9‘;”;ˆð ð 	˜8×.Ò.¨sÑ3Ô3ð 	Ø×Ò˜S 4™ZÑ(Ô(Ð(Øð ˆØ"ð 	?ð 	?ˆHØ ‘^ˆFØ—-’- Ñ'Ô'ˆCØ˜’(�(Ø×&Ò& sÑ+Ô+Ð+Ø—m’m F¨Cµ#°f±+´+Ñ,=Ñ>Ô>�ð ˜’(�(øõ ˆÑÔ !Ò#Ð#Ø× Ò Ñ"Ô"Ð"å$¥S¨Ñ%9Ô%9Ñ:Ô:ˆOÝ# OÑ4Ô4ð 2ð 2‘��3Ø01°A±½¸OÑ8LÔ8LÒ0LÐ0L�o a¨!¡eÔ,Ð,ÕRUÐV^ÑR_ÔR_�Ø  C Ô(×.Ò.Ñ0Ô0�Øð 2Ø×$Ò$ T¨D¡[Ñ1Ô1Ð1øñ	2ð ×Ò˜X¨™_Ñ-Ô-Ð-Ñ-àÐrl   c                  ó6  — t          ¦   «         } |                      ¦   «         sdS t          rdddœni }t          rddini }t          | fi |¤Ž5 }|                     ¦   «         }ddd¦  «         n# 1 swxY w Y   t          |¦  «        }||k    rdS t          t          |¦  «        t          |¦  «        z
  ¦  «        }|dk    rVt          d„ t          ||¦  «        D ¦   «         ¦  «        }|t          t          |¦  «        t          |¦  «        z
  ¦  «        z  }t          j        t          | j        ¦  «        dd	¬
¦  «        \  }}	 t          j        |dfi |¤Ž5 }|                     |¦  «         |                     ¦   «          t          j        |                     ¦   «         ¦  «         ddd¦  «         n# 1 swxY w Y   t          j        || ¦  «         n5# t*          $ r( 	 t          j        |¦  «         n# t.          $ r Y nw xY w‚ w xY wt1          | ¦  «         |S )zÄRead, sanitize, and rewrite ~/.hermes/.env in place.

    Returns the number of lines that were fixed (concatenation splits +
    placeholder removals).  Returns 0 when no changes are needed.
    r   rÁ   rK  rÎ  rÃ   Nc              3   ó,   K  — | ]\  }}||k    ¯d V — ŒdS )rÿ   Nro   )rœ  ÚaÚbs      rj   r/  z$sanitize_env_file.<locals>.<genexpr>‘  s*   è è € ÐKÐK™$˜!˜QÀAÈÂFÀF�AÀFÀFÀFÀFÐKÐKrl   ú.tmpú.env_©ÚdirÚsuffixrs  Úw)r¡   rf   rÐ  r‘   rÑ  rÒ  ÚabsrS  ÚsumÚzipÚtempfileÚmkstempr½   r¤   r^   ÚfdopenÚ
writelinesÚflushÚfsyncÚfilenorK  ÚBaseExceptionÚunlinkr­   r¾   )	rÓ  Úread_kwÚwrite_kwr—   Úoriginal_linesrÝ  r[  ÚfdÚtmp_paths	            rj   rH  rH  x  s©  € õ ‰~Œ~€HØ�?Š?ÑÔð Øˆqå<GÐO˜7¨iÐ8Ð8Ð8ÈR€GÝ(3Ð;�
˜GÐ$Ð$¸€Hå	ˆhÐ	"Ð	"˜'Ð	"Ð	"ð ' aØŸš™œˆð'ð 'ð 'ñ 'ô 'ð 'ð 'ð 'ð 'ð 'ð 'øøøð 'ð 'ð 'ð 'õ $ NÑ3Ô3€Ià�NÒ"Ð"Øˆqõ •�I‘”¥ ^Ñ!4Ô!4Ñ4Ñ5Ô5€EØ�‚z€zåÐKÐK¥# n°iÑ"@Ô"@ÐKÑKÔKÑKÔKˆØ••S˜‘^”^¥c¨.Ñ&9Ô&9Ñ9Ñ:Ô:Ñ:ˆåÔ#­¨H¬OÑ(<Ô(<ÀVÐT[Ð\Ñ\Ô\�L€BˆðÝŒY�r˜3Ð+Ð+ (Ð+Ð+ð 	!¨qØ�LŠL˜Ñ#Ô#Ð#Ø�GŠG‰IŒIˆIÝŒH�Q—X’X‘Z”ZÑ Ô Ð ð	!ð 	!ð 	!ñ 	!ô 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!øøøð 	!ð 	!ð 	!ð 	!õ 	Œ
�8˜XÑ&Ô&Ð&Ð&øÝð ð ð ð	ÝŒI�hÑÔÐÐøÝð 	ð 	ð 	ØˆDð	øøøàðøøøõ �ÑÔÐØ€Lsg   ÁA.Á.A2Á5A2ÅG ÅAF4Æ(G Æ4F8Æ8G Æ;F8Æ<G Ç
HÇ G5Ç4HÇ5
HÇ?HÈHÈHr™   r›   c                 ó  — 	 |                      d¦  «         |S # t          $ r Y nw xY wg }t          |¦  «        D ]E\  }}t          |¦  «        dk    r-|                     d|› d|›dt          |¦  «        d›d�¦  «         ŒF|                      dd¬	¦  «                             d¦  «        }t          d
| › d�d                     d„ |dd…         D ¦   «         ¦  «        z   t          |¦  «        dk    rdndz   dz   t          j
        ¬¦  «         |S )u1  Warn and strip non-ASCII characters from credential values.

    API keys and tokens must be pure ASCII â€” they are sent as HTTP header
    values which httpx/httpcore encode as ASCII.  Non-ASCII characters
    (commonly introduced by copy-pasting from rich-text editors or PDFs
    that substitute lookalike Unicode glyphs for ASCII letters) cause
    ``UnicodeEncodeError: 'ascii' codec can't encode character`` at
    request time.

    Returns the sanitized (ASCII-only) value.  Prints a warning if any
    non-ASCII characters were found and removed.
    Úasciié   z  position r  z (U+Ú04XrÞ  Úignore)rÏ  z
  Warning: zÐ contains non-ASCII characters that will break API requests.
  This usually happens when copy-pasting from a PDF, rich-text editor,
  or web page that substitutes lookalike Unicode glyphs for ASCII letters.

rí  c              3   ó    K  — | ]	}d |› �V — Œ
dS )rë  Nro   )rœ  r˜   s     rj   r/  z._check_non_ascii_credential.<locals>.<genexpr>Ä  s(   è è € Ð:Ð: D�K˜�K�KÐ:Ð:Ð:Ð:Ð:Ð:rl   Nr¬  z
  ... and morer]   z‰

  The non-ASCII characters have been stripped automatically.
  If authentication fails, re-copy the key from the provider's dashboard.
r}   )ÚencodeÚUnicodeEncodeErrorrà  Úordra  Údecoder   r£  rS  r€   r�   )r™   r›   Ú	bad_charsrç  ÚchrÝ  s         rj   Ú_check_non_ascii_credentialr  ¥  sc  € ðØ�Š�WÑÔÐØˆøÝð ð ð Øˆðøøøð €IÝ˜5Ñ!Ô!ð Jð J‰ˆˆ2Ýˆr‰7Œ7�SŠ=ˆ=Ø×ÒÐH¨1ÐHÐH°ÐHÐH½#¸b¹'¼'ÐHÐHÐHÐHÑIÔIÐIøØ—’˜W¨X�Ñ6Ô6×=Ò=¸gÑFÔF€Iå	ð	˜ð 	ð 	ð 	ð �)Š)Ð:Ð:¨I°b°q°b¬MÐ:Ñ:Ô:Ñ
:Ô
:ñ		;õ
 "% Y¡¤°!Ò!3Ð!3ÐÐ¸ñ	=ðWñ	Wõ ŒZð
ñ 
ô 
ð 
ð Ðs   ‚ ™
&¥&c                 óŒ  — t          ¦   «         rt          d| › �¦  «         dS t                               | ¦  «        st	          d| ›�¦  «        ‚|                     dd¦  «                             dd¦  «        }t          | |¦  «        }t          ¦   «          t          ¦   «         }t          rddd	œni }t          rd
dini }g }| 
                    ¦   «         rHt          |fi |¤Ž5 }|                     ¦   «         }ddd¦  «         n# 1 swxY w Y   t          |¦  «        }d}t          |¦  «        D ]>\  }}	|	                     ¦   «                              | › d�¦  «        r| › d|› d�||<   d} nŒ?|sH|r+|d                              d¦  «        s|dxx         dz  cc<   |                     | › d|› d�¦  «         t'          j        t+          |j        ¦  «        dd¬¦  «        \  }
}d}| 
                    ¦   «         r=	 t/          j        |                     ¦   «         j        ¦  «        }n# t4          $ r Y nw xY w	 t7          j        |
dfi |¤Ž5 }|                     |¦  «         |                     ¦   «          t7          j        |                      ¦   «         ¦  «         ddd¦  «         n# 1 swxY w Y   t7          j        ||¦  «         |�'	 t7          j!        ||¦  «         n# t4          $ r Y nw xY wn5# tD          $ r( 	 t7          j#        |¦  «         n# t4          $ r Y nw xY w‚ w xY wtI          |¦  «         |t6          j%        | <   dS )z)Save or update a value in ~/.hermes/.env.zset Nú#Invalid environment variable name: rí  r]   úrÁ   rK  rÎ  rÃ   Fr‡   Tri  ré  rê  rë  rî  )&rp   r‚   Ú_ENV_VAR_NAME_REÚmatchr«   rK  r  rÖ   r¡   rÐ  rf   r‘   rÑ  rÒ  rà  r`   r’   Úendswithra  rò  ró  r½   r¤   ÚstatÚS_IMODEÚst_moder­   r^   rô  rõ  rö  r÷  rø  r¬   rù  rú  r¾   r�   )r™   r›   rÓ  rû  rü  rð  r—   Úfoundrç  r˜   rþ  rÿ  Úoriginal_modes                rj   rJ  rJ  Í  s(  € å�|„|ð Ý�l˜S�l�lÑ#Ô#Ð#ØˆÝ×!Ò! #Ñ&Ô&ð HÝÐF¸sÐFÐFÑGÔGÐGØ�MŠM˜$ Ñ#Ô#×+Ò+¨D°"Ñ5Ô5€Eå'¨¨UÑ3Ô3€EÝÑÔÐÝ‰~Œ~€Hõ =HÐO˜7¨iÐ8Ð8Ð8ÈR€GÝ(3Ð;�
˜GÐ$Ð$¸€Hà€EØ‡‚ÑÔð +Ý�(Ð&Ð&˜gÐ&Ð&ð 	"¨!Ø—K’K‘M”MˆEð	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"õ $ EÑ*Ô*ˆð €EÝ˜UÑ#Ô#ð ð ‰ˆˆ4Ø�:Š:‰<Œ<×"Ò" c 9 9 9Ñ-Ô-ð 	ØÐ)Ð) Ð)Ð)Ð)ˆE�!‰HØˆEØˆEð	ð
 ð )àð 	˜˜rœ×+Ò+¨DÑ1Ô1ð 	Ø�"ˆIˆIŒI˜ÑˆIˆI‰IØ�Š˜Ð'Ð'˜eÐ'Ð'Ð'Ñ(Ô(Ð(åÔ#­¨H¬OÑ(<Ô(<ÀVÐT[Ð\Ñ\Ô\�L€Bˆà€MØ‡‚ÑÔð ð	Ý œL¨¯ª©¬Ô)@ÑAÔAˆMˆMøÝð 	ð 	ð 	ØˆDð	øøøðÝŒY�r˜3Ð+Ð+ (Ð+Ð+ð 	!¨qØ�LŠL˜ÑÔÐØ�GŠG‰IŒIˆIÝŒH�Q—X’X‘Z”ZÑ Ô Ð ð	!ð 	!ð 	!ñ 	!ô 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!øøøð 	!ð 	!ð 	!ð 	!õ 	Œ
�8˜XÑ&Ô&Ð&àÐ$ðÝ”˜ =Ñ1Ô1Ð1Ð1øÝð ð ð Ø�ðøøøøøåð ð ð ð	ÝŒI�hÑÔÐÐøÝð 	ð 	ð 	ØˆDð	øøøàðøøøõ �ÑÔÐà…B„Jˆs�O€O€Os�   Ã#DÄDÄDÇ;+H' È'
H4È3H4È8K1 ÉAJ'ÊK1 Ê'J+Ê+K1 Ê.J+Ê/K1 Ë
K  ËK1 Ë 
K-Ë*K1 Ë,K-Ë-K1 Ë1
L#Ë<LÌL#Ì
LÌL#ÌLÌL#c                 óf  ‡ — t          ¦   «         rt          d‰ › �¦  «         dS t                               ‰ ¦  «        st	          d‰ ›�¦  «        ‚t          ¦   «         }|                     ¦   «         s"t          j         	                    ‰ d¦  «         dS t          rdddœni }t          rddini }t          |fi |¤Ž5 }|                     ¦   «         }ddd¦  «         n# 1 swxY w Y   t          |¦  «        }ˆ fd	„|D ¦   «         }t          |¦  «        t          |¦  «        k     }|�rit          j        t#          |j        ¦  «        d
d¬¦  «        \  }}	d}
	 t'          j        |                     ¦   «         j        ¦  «        }
n# t,          $ r Y nw xY w	 t          j        |dfi |¤Ž5 }|                     |¦  «         |                     ¦   «          t          j        |                     ¦   «         ¦  «         ddd¦  «         n# 1 swxY w Y   t          j        |	|¦  «         |
�'	 t          j        ||
¦  «         n# t,          $ r Y nw xY wn5# t<          $ r( 	 t          j        |	¦  «         n# t,          $ r Y nw xY w‚ w xY wtA          |¦  «         t          j         	                    ‰ d¦  «         |S )zzRemove a key from ~/.hermes/.env and os.environ.

    Returns True if the key was found and removed, False otherwise.
    zremove Fr  NrÁ   rK  rÎ  rÃ   c                 óh   •— g | ].}|                      ¦   «                              ‰› d �¦  «        °,|‘Œ/S )r‡   )r`   r’   )rœ  r˜   r™   s     €rj   rA  z$remove_env_value.<locals>.<listcomp>)  s:   ø€ ÐRÐRÐR˜$¨t¯zªz©|¬|×/FÒ/FÈ#ÀyÀyÀyÑ/QÔ/QÐR�ÐRÐRÐRrl   ré  rê  rë  rî  )!rp   r‚   r  r  r«   r¡   rf   r^   r�   rM  rÐ  r‘   rÑ  rÒ  rS  rò  ró  r½   r¤   r  r  r  r­   rô  rõ  rö  r÷  rø  rK  r¬   rù  rú  r¾   )r™   rÓ  rû  rü  r—   rð  Ú	new_linesr  rþ  rÿ  r  s   `          rj   Úremove_env_valuer    s\  ø€ õ
 �|„|ð Ý�o �o�oÑ&Ô&Ð&ØˆuÝ×!Ò! #Ñ&Ô&ð HÝÐF¸sÐFÐFÑGÔGÐGÝ‰~Œ~€HØ�?Š?ÑÔð Ý
Œ
�Š�s˜DÑ!Ô!Ð!Øˆuå<GÐO˜7¨iÐ8Ð8Ð8ÈR€GÝ(3Ð;�
˜GÐ$Ð$¸€Hå	ˆhÐ	"Ð	"˜'Ð	"Ð	"ð  aØ—’‘”ˆðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð å Ñ&Ô&€EàRÐRÐRÐR %ÐRÑRÔR€IÝ�	‰NŒN�S ™ZœZÒ'€Eàñ ÝÔ'­C°´Ñ,@Ô,@ÈÐX_Ð`Ñ`Ô`‰ˆˆHàˆð	Ý œL¨¯ª©¬Ô)@ÑAÔAˆMˆMøÝð 	ð 	ð 	ØˆDð	øøøð	Ý”˜2˜sÐ/Ð/ hÐ/Ð/ð %°1Ø—’˜YÑ'Ô'Ð'Ø—’‘	”	�	Ý”˜Ÿš™œÑ$Ô$Ð$ð%ð %ð %ñ %ô %ð %ð %ð %ð %ð %ð %øøøð %ð %ð %ð %õ ŒJ�x Ñ*Ô*Ð*ØÐ(ðÝ”H˜X }Ñ5Ô5Ð5Ð5øÝð ð ð Ø�Dðøøøøøåð 	ð 	ð 	ðÝ”	˜(Ñ#Ô#Ð#Ð#øÝð ð ð Ø�ðøøøàð	øøøõ 	�XÑÔÐå„J‡N‚N�3˜ÑÔÐØ€Ls�   Â<CÃC!Ã$C!Å+F Æ
FÆFÆI Æ'AHÇ7I ÈHÈI È
HÈI È&H< È;I È<
I	ÉI ÉI	É	I É
I?ÉI-É,I?É-
I:É7I?É9I:É:I?c                 óH   — |pt           } |d| ¦  «          |dd¦  «         dS )zBPersist an Anthropic OAuth/setup token and clear the API-key slot.r   r%   r]   N©rJ  ©r›   Úsave_fnÚwriters      rj   Úsave_anthropic_oauth_tokenr!  K  s8   € àÐ&�€FØ
€FÐ˜eÑ$Ô$Ð$Ø
€FÐ Ñ#Ô#Ð#Ð#Ð#rl   c                 óH   — | pt           } |dd¦  «          |dd¦  «         dS )zHUse Claude Code's own credential files instead of persisting env tokens.r   r]   r%   Nr  )r  r   s     rj   Ú%use_anthropic_claude_code_credentialsr#  R  s8   € àÐ&�€FØ
€FÐ˜bÑ!Ô!Ð!Ø
€FÐ Ñ#Ô#Ð#Ð#Ð#rl   c                 óH   — |pt           } |d| ¦  «          |dd¦  «         dS )zBPersist an Anthropic API key and clear the OAuth/setup-token slot.r%   r   r]   Nr  r  s      rj   Úsave_anthropic_api_keyr%  Y  s8   € àÐ&�€FØ
€FÐ Ñ&Ô&Ð&Ø
€FÐ˜bÑ!Ô!Ð!Ð!Ð!rl   c                 ó.   — t          | |¦  «         d| ddœS )NTF)ÚsuccessÚ	stored_asÚ	validatedr  )r™   r›   s     rj   Úsave_env_value_securer*  `  s*   € Ý�3˜ÑÔÐàØØðð ð rl   c                  óv  — t          ¦   «         } t          t                               ¦   «         ¦  «        t          z  }d}|                      ¦   «         D ]<\  }}t          j                             |¦  «        |k    r|t          j        |<   |dz  }Œ=|D ]&}|| vr |t          j        v rt          j        |= |dz  }Œ'|S )u&  Re-read ~/.hermes/.env into os.environ. Returns count of vars updated.

    Adds/updates vars that changed and removes vars that were deleted from
    the .env file (but only vars known to Hermes â€” OPTIONAL_ENV_VARS and
    _EXTRA_ENV_KEYS â€” to avoid clobbering unrelated environment).
    r   rÿ   )	r×  r¡  rb  r¢  rÙ  r_  r^   r�   rd   )rÔ  rÜ  Úcountr™   r›   s        rj   Ú
reload_envr-  j  sº   € õ ‰zŒz€HÝÕ&×+Ò+Ñ-Ô-Ñ.Ô.µÑ@€JØ€EØ—n’nÑ&Ô&ð ð ‰
ˆˆUÝŒ:�>Š>˜#ÑÔ %Ò'Ð'Ø#�BŒJ�s‰OØ�Q‰JˆEøàð ð ˆØ�hÐÐ 3­"¬*Ð#4Ð#4Ý”
˜3�Ø�Q‰JˆEøØ€Lrl   c                 óˆ   — | t           j        v rt           j        |          S t          ¦   «         }|                     | ¦  «        S )z/Get a value from ~/.hermes/.env or environment.)r^   r�   r×  rd   )r™   rÔ  s     rj   r`  r`  €  s:   € ð �bŒjÐÐÝŒz˜#ŒÐõ ‰zŒz€HØ�<Š<˜ÑÔÐrl   c                 ó”   — | st          dt          j        ¦  «        S t          | ¦  «        dk     rdS | dd…         dz   | dd…         z   S )zRedact an API key for display.ú	(not set)r  z***Nrß  ú...éüÿÿÿ)rO   rN   ÚDIMrS  )r™   s    rj   Ú
redact_keyr4  �  sO   € àð .Ý�[¥&¤*Ñ-Ô-Ð-Ý
ˆ3�x„x�"‚}€}ØˆuØˆr�ˆrŒ7�U‰?˜S   œXÑ%Ð%rl   c                  ój  — t          ¦   «         } t          ¦   «          t          t          dt          j        ¦  «        ¦  «         t          t          dt          j        ¦  «        ¦  «         t          t          dt          j        ¦  «        ¦  «         t          ¦   «          t          t          dt          j        t          j        ¦  «        ¦  «         t          dt          ¦   «         › �¦  «         t          dt          ¦   «         › �¦  «         t          dt          ¦   «         › �¦  «         t          ¦   «          t          t          dt          j        t          j        ¦  «        ¦  «         g d	¢}|D ]7\  }}t          |¦  «        }t          d
|d›dt          |¦  «        › �¦  «         Œ8ddlm}  |¦   «         }t          d
dd›dt          |¦  «        › �¦  «         t          ¦   «          t          t          dt          j        t          j        ¦  «        ¦  «         t          d|                      dd¦  «        › �¦  «         t          d|                      di ¦  «                             dt          d         d         ¦  «        › �¦  «         t          ¦   «          t          t          dt          j        t          j        ¦  «        ¦  «         |                      di ¦  «        }t          d|                     dd¦  «        › �¦  «         t          d|                     dd¦  «        rdnd › �¦  «         t          d!|                     d"d¦  «        rdnd › �¦  «         t          |                     d#i ¦  «        t           ¦  «        r|                     d#i ¦  «        ni }|                     d$d%¦  «        }	|                     d&d%¦  «        }
t          d'|	› d(|
› d)�¦  «         t          ¦   «          t          t          d*t          j        t          j        ¦  «        ¦  «         |                      d+i ¦  «        }t          d,|                     d-d.¦  «        › �¦  «         t          d/|                     d0d1¦  «        › �¦  «         t          d2|                     d3d4¦  «        › d5�¦  «         |                     d-¦  «        d6k    r(t          d7|                     d8d9¦  «        › �¦  «         �nj|                     d-¦  «        d:k    r(t          d;|                     d<d=¦  «        › �¦  «         �n)|                     d-¦  «        d>k    rLt          d?|                     d@d9¦  «        › �¦  «         t          dA¦  «        }t          dB|rdCndD› �¦  «         nÄ|                     d-¦  «        dEk    rLt          dF|                     dGd9¦  «        › �¦  «         t          dH¦  «        }t          dI|rdCndD› �¦  «         n_|                     d-¦  «        dJk    rFt          dK¦  «        }t          dL¦  «        }t          dM|pdD› �¦  «         t          dN|pdD› �¦  «         t          ¦   «          t          t          dOt          j        t          j        ¦  «        ¦  «         |                      dPdQ¦  «        }|rt          dR|› �¦  «         n*t          dRt          dSt          j        ¦  «        › �¦  «         t          ¦   «          t          t          dTt          j        t          j        ¦  «        ¦  «         |                      dUi ¦  «        }|                     dVdW¦  «        }t          dX|rdYndZ› �¦  «         |�rt          d[|                     d\d]¦  «        d^z  d_›d`�¦  «         t          da|                     dbdc¦  «        d^z  d_›dd�¦  «         t          de|                     dfdg¦  «        › dh�¦  «         |                      dii ¦  «                             dUi ¦  «        }|                     ddQ¦  «        pdj}t          d|› �¦  «         |                     dkdl¦  «        }|r|dlk    rt          dm|› �¦  «         |                      dii ¦  «        }|                     dni ¦  «        |                     doi ¦  «        dpœ}t%          dq„ |                     ¦   «         D ¦   «         ¦  «        }|r×t          ¦   «          t          t          drt          j        t          j        ¦  «        ¦  «         |                     ¦   «         D ]‚\  }}|                     dkdl¦  «        }|                     ddQ¦  «        }|dlk    s|rIds|› �g}|r|                     dt|› �¦  «         t          d
|du›d
dv                     |¦  «        › �¦  «         Œƒt          ¦   «          t          t          dwt          j        t          j        ¦  «        ¦  «         t          dx¦  «        }t          dy¦  «        }t          dz|rdCnt          d{t          j        ¦  «        › �¦  «         t          d||rdCnt          d{t          j        ¦  «        › �¦  «         	 dd}lm} m}!  | ¦   «         }"|"rä |!|"¦  «        }#t          ¦   «          t          t          d~t          j        t          j        ¦  «        ¦  «         |"D ]–}$|$d         }%|#                     |%dQ¦  «        }|$                     d€dQ¦  «        }&|rt5          |¦  «        nt          dDt          j        ¦  «        }'t          d
|%d�›d|'› d
t          d‚|&› dƒ�t          j        ¦  «        › �¦  «         Œ—n# t6          $ r Y nw xY wt          ¦   «          t          t          d„t          j        ¦  «        ¦  «         t          t          d…t          j        ¦  «        ¦  «         t          t          d†t          j        ¦  «        ¦  «         t          t          d‡t          j        ¦  «        ¦  «         t          ¦   «          dˆS )‰zDisplay current configuration.u±   â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�u@   â”‚              âš• Hermes Configuration                    â”‚u±   â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜u	   â—† Pathsz  Config:       z  Secrets:      z  Install:      u   â—† API Keys)	)rè  Ú
OpenRouter)r×  zOpenAI (STT/TTS))r  ÚExa)r  ÚParallel)rÓ  Ú	Firecrawl)rÝ  ÚTavily)rÔ  ÚBrowserbase)r$  zBrowser Use)rÖ  ÚFALrë  z<14rì  r   )Úget_anthropic_keyÚ	Anthropicu	   â—† Modelz  Model:        rÚ   znot setz  Max turns:    rß   rå   u   â—† DisplayrA  z  Personality:  rC  rD  z  Reasoning:    rJ  FÚonr~  z  Bell:         rI  rQ  rS  rR  rT  z  User preview: first z line(s), last z line(s)u   â—† Terminalrí   z  Backend:      r‰   rî   z  Working dir:  rð   rñ   z  Timeout:      rò   rá   ÚsrŠ   z  Docker image: rö   r÷   Úsingularityz  Image:        rú   rû   Úmodalz  Modal image:  rü   ÚMODAL_TOKEN_IDz  Modal token:  Ú
configuredr0  Údaytonaz  Daytona image: rý   ÚDAYTONA_API_KEYz  API key:      ÚsshÚTERMINAL_SSH_HOSTÚTERMINAL_SSH_USERz  SSH host:     z  SSH user:     u   â—† Timezoner›  r]   z  Timezone:     r  u   â—† Context Compressionr  r  Tz  Enabled:      rS   r	  z  Threshold:    r!  r  éd   z.0fú%z  Target ratio: r"  r  z% of threshold preservedz  Protect last: r#  r   z	 messagesr3  z(auto)r4  rã   z  Provider:     r:  r;  )ÚVisionzWeb extractc              3   óv   K  — | ]4}|                      d d¦  «        dk    p|                      dd¦  «        V — Œ5dS )r4  rã   rÚ   r]   Nr?  )rœ  Úts     rj   r/  zshow_config.<locals>.<genexpr>  s\   è è € ð ð àð 	
�Šˆj˜&Ñ!Ô! VÒ+ÐA¨q¯uªu°W¸bÑ/AÔ/Aðð ð ð ð ð rl   u    â—† Auxiliary Models (overrides)r5  r4  Ú12sr˜  u   â—† Messaging Platformsr5  r9  z  Telegram:     znot configuredz  Discord:      )r|  Úresolve_skill_config_valuesu   â—† Skill Settingsr™   rG  z<20sú[ú]u´   â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€z+  hermes config edit     # Edit config filez!  hermes config set <key> <value>z+  hermes setup           # Run setup wizardN)rx  r   rO   rN   ÚCYANÚBOLDrŸ   r¡   r¦   r`  r4  Úhermes_cli.authr=  rd   ry  rk  rl  r3  r´  Úvaluesr_  ra  r£  r~  r|  rP  r½   r  )(rf  r¢  Úenv_keyr\  r›   r=  Úanthropic_valuerA  ÚumpÚ	ump_firstÚump_lastrí   Úmodal_tokenÚdaytona_keyÚssh_hostÚssh_userÚtzr  r  Ú	_aux_compÚ_smÚcomp_providerr3  Ú	aux_tasksÚhas_overridesÚlabelÚtask_cfgÚprovÚmdlrm  Útelegram_tokenÚdiscord_tokenr|  rP  Ú
skill_varsÚresolvedr�  r™   rŽ  Údisplay_vals(                                           rj   Úshow_configro  ˜  s   € å‰]Œ]€Få	�G„G€GÝ	�%ð  Dõ  FLô  FQñ  Rô  Rñ  Sô  Sð  SÝ	�%ÐRÕTZÔT_Ñ
`Ô
`ÑaÔaÐaÝ	�%ð  Dõ  FLô  FQñ  Rô  Rñ  Sô  Sð  Sõ 
�G„G€GÝ	�%��Vœ[­&¬+Ñ
6Ô
6Ñ7Ô7Ð7Ý	Ð
0�_Ñ.Ô.Ð
0Ð
0Ñ1Ô1Ð1Ý	Ð
-�\™^œ^Ð
-Ð
-Ñ.Ô.Ð.Ý	Ð
1Õ-Ñ/Ô/Ð
1Ð
1Ñ2Ô2Ð2õ 
�G„G€GÝ	�%�¥¤­V¬[Ñ
9Ô
9Ñ:Ô:Ð:ð
ð 
ð 
€Dð ð 3ð 3‰ˆ�Ý˜gÑ&Ô&ˆÝÐ1�4Ð1Ð1Ð1�j¨Ñ/Ô/Ð1Ð1Ñ2Ô2Ð2Ð2Ø1Ð1Ð1Ð1Ð1Ð1Ø'Ð'Ñ)Ô)€OÝ	Ð
>ˆ{Ð
>Ð
>Ð
>¥¨OÑ!<Ô!<Ð
>Ð
>Ñ?Ô?Ð?õ 
�G„G€GÝ	�%��Vœ[­&¬+Ñ
6Ô
6Ñ7Ô7Ð7Ý	Ð
=˜VŸZšZ¨°Ñ;Ô;Ð
=Ð
=Ñ>Ô>Ð>Ý	Ð
m˜VŸZšZ¨°Ñ4Ô4×8Ò8¸ÅnÐU\ÔF]Ð^iÔFjÑkÔkÐ
mÐ
mÑnÔnÐnõ 
�G„G€GÝ	�%��vœ{­F¬KÑ
8Ô
8Ñ9Ô9Ð9Ø�jŠj˜ BÑ'Ô'€GÝ	Ð
C˜WŸ[š[¨¸ÑAÔAÐ
CÐ
CÑDÔDÐDÝ	Ð
V W§[¢[Ð1AÀ5Ñ%IÔ%IÐT˜T˜TÈuÐ
VÐ
VÑWÔWÐWÝ	Ð
X W§[¢[Ð1CÀUÑ%KÔ%KÐV˜T˜TÐQVÐ
XÐ
XÑYÔYÐYÝ5?ÀÇÂÐLbÐdfÑ@gÔ@gÕimÑ5nÔ5nÐ
vˆ'�+Š+Ð,¨bÑ
1Ô
1Ð
1Ðtv€CØ—’˜ qÑ)Ô)€IØ�wŠw�| QÑ'Ô'€HÝ	Ð
O 9Ð
OÐ
O¸XÐ
OÐ
OÐ
OÑPÔPÐPõ 
�G„G€GÝ	�%�¥¤­V¬[Ñ
9Ô
9Ñ:Ô:Ð:Ø�zŠz˜* bÑ)Ô)€HÝ	Ð
?˜XŸ\š\¨)°WÑ=Ô=Ð
?Ð
?Ñ@Ô@Ð@Ý	Ð
7˜XŸ\š\¨%°Ñ5Ô5Ð
7Ð
7Ñ8Ô8Ð8Ý	Ð
;˜XŸ\š\¨)°RÑ8Ô8Ð
;Ð
;Ð
;Ñ<Ô<Ð<à‡|‚|�IÑÔ (Ò*Ð*ÝÐm §¢¨nÐ>jÑ!kÔ!kÐmÐmÑnÔnÐnÑnØ	�Š�iÑ	 Ô	  MÒ	1Ð	1ÝÐ{ §¢Ð.AÐCxÑ!yÔ!yÐ{Ð{Ñ|Ô|Ð|Ñ|Ø	�Š�iÑ	 Ô	  GÒ	+Ð	+ÝÐl §¢¨mÐ=iÑ!jÔ!jÐlÐlÑmÔmÐmÝ#Ð$4Ñ5Ô5ˆÝÐO°Ð!M  À+ÐOÐOÑPÔPÐPÐPØ	�Š�iÑ	 Ô	  IÒ	-Ð	-ÝÐo (§,¢,¨Ð@lÑ"mÔ"mÐoÐoÑpÔpÐpÝ#Ð$5Ñ6Ô6ˆÝÐO°Ð!M  À+ÐOÐOÑPÔPÐPÐPØ	�Š�iÑ	 Ô	  EÒ	)Ð	)Ý Ð!4Ñ5Ô5ˆÝ Ð!4Ñ5Ô5ˆÝÐ: Ð!8¨[Ð:Ð:Ñ;Ô;Ð;ÝÐ: Ð!8¨[Ð:Ð:Ñ;Ô;Ð;õ 
�G„G€GÝ	�%�¥¤­V¬[Ñ
9Ô
9Ñ:Ô:Ð:Ø	�Š�J Ñ	#Ô	#€BØ	ð HÝÐ% Ð%Ð%Ñ&Ô&Ð&Ð&åÐF¥Ð'7½¼Ñ!DÔ!DÐFÐFÑGÔGÐGõ 
�G„G€GÝ	�%Ð)­6¬;½¼Ñ
DÔ
DÑEÔEÐEØ—*’*˜]¨BÑ/Ô/€KØ�oŠo˜i¨Ñ.Ô.€GÝ	Ð
9 gÐ7˜U˜U°4Ð
9Ð
9Ñ:Ô:Ð:Øñ 	6ÝÐP §¢°¸dÑ!CÔ!CÀcÑ!IÐPÐPÐPÐPÑQÔQÐQÝÐj §¢°ÀÑ!FÔ!FÈÑ!LÐjÐjÐjÐjÑkÔkÐkÝÐQ §¢Ð1AÀ2Ñ!FÔ!FÐQÐQÐQÑRÔRÐRØ—J’J˜{¨BÑ/Ô/×3Ò3°MÀ2ÑFÔFˆ	Ø�mŠm˜G RÑ(Ô(Ð4¨HˆÝÐ& Ð&Ð&Ñ'Ô'Ð'Ø!Ÿš j°&Ñ9Ô9ˆØð 	6˜]¨fÒ4Ð4ÝÐ4 ]Ð4Ð4Ñ5Ô5Ð5ð —
’
˜;¨Ñ+Ô+€Ià —}’} X¨rÑ2Ô2Ø —}’} ]°BÑ7Ô7ðð €Iõ ð ð à×!Ò!Ñ#Ô#ðñ ô ñ ô €Mð ð 
<Ý‰ŒˆÝ�eÐ6½¼ÅVÄ[ÑQÔQÑRÔRÐRØ(ŸšÑ0Ô0ð 	<ð 	<‰OˆE�8Ø—<’< 
¨FÑ3Ô3ˆDØ—,’,˜w¨Ñ+Ô+ˆCØ�vŠ~ˆ~ ˆ~Ø+ TÐ+Ð+Ð,�Øð 1Ø—L’L ¨#  Ñ0Ô0Ð0ÝÐ:˜5Ð:Ð:Ð:¨¯	ª	°%Ñ(8Ô(8Ð:Ð:Ñ;Ô;Ð;øõ 
�G„G€GÝ	�%Ð)­6¬;½¼Ñ
DÔ
DÑEÔEÐEå"Ð#7Ñ8Ô8€NÝ!Ð"5Ñ6Ô6€Må	Ð
f¨^Ðd˜\˜\ÅÐGWÕY_ÔYcÑAdÔAdÐ
fÐ
fÑgÔgÐgÝ	Ð
e¨]Ðc˜\˜\ÅÐFVÕX^ÔXbÑ@cÔ@cÐ
eÐ
eÑfÔfÐfðØaÐaÐaÐaÐaÐaÐaÐaØ3Ð3Ñ5Ô5ˆ
Øð 		]Ø2Ð2°:Ñ>Ô>ˆHÝ‰GŒGˆGÝ•%Ð,­f¬k½6¼;ÑGÔGÑHÔHÐHØ!ð ]ð ]�Ø˜%”j�Ø Ÿš S¨"Ñ-Ô-�Ø ŸWšW W¨bÑ1Ô1�
Ø,1ÐU�c %™jœj˜jµu¸[Í&Ì*Ñ7UÔ7U�ÝÐ[˜3Ð[Ð[Ð[ kÐ[Ð[µUÐ;L¸zÐ;LÐ;LÐ;LÍfÌjÑ5YÔ5YÐ[Ð[Ñ\Ô\Ð\Ð\øøÝð ð ð Øˆðøøøõ 
�G„G€GÝ	�%�
�FœJÑ
'Ô
'Ñ(Ô(Ð(Ý	�%Ð=½v¼zÑ
JÔ
JÑKÔKÐKÝ	�%Ð3µV´ZÑ
@Ô
@ÑAÔAÐAÝ	�%Ð=½v¼zÑ
JÔ
JÑKÔKÐKÝ	�G„G€G€G€Gs   é2C8m+ í+
m8í7m8c                  ó(  — t          ¦   «         rt          d¦  «         dS t          ¦   «         } |                      ¦   «         s&t	          t
          ¦  «         t          d| › �¦  «         t          j        d¦  «        pt          j        d¦  «        }|s"dD ]}ddl	}| 
                    |¦  «        r|} nŒ |s#t          d¦  «         t          d	| › �¦  «         dS t          d
| › d|› d�¦  «         t          j        |t          | ¦  «        g¦  «         dS )z"Open config file in user's editor.zedit configurationNzCreated ÚEDITORÚVISUAL)ÚnanoÚvimÚviÚcodeÚnotepadr   z#No editor found. Config file is at:rë  zOpening ú in r1  )rp   r‚   rŸ   rf   rI  ry  r   r^   r_   ÚshutilÚwhichÚ
subprocessÚrunr½   )r¼  ÚeditorÚcmdry  s       rj   Úedit_configr  >  sE  € å�|„|ð ÝÐ*Ñ+Ô+Ð+ØˆÝ!Ñ#Ô#€Kð ×ÒÑÔð (Ý•NÑ#Ô#Ð#ÝÐ&˜Ð&Ð&Ñ'Ô'Ð'õ ŒY�xÑ Ô Ð7¥B¤I¨hÑ$7Ô$7€Fàð à;ð 	ð 	ˆCØˆMˆMˆMØ�|Š|˜CÑ Ô ð Ø�Ø�ðð ð ÝÐ3Ñ4Ô4Ð4ÝÐ �;Ð Ð Ñ!Ô!Ð!Øˆå	Ð
1�[Ð
1Ð
1 fÐ
1Ð
1Ð
1Ñ2Ô2Ð2Ý„N�F�C Ñ,Ô,Ð-Ñ.Ô.Ð.Ð.Ð.rl   c                 ó^  — t          ¦   «         rt          d¦  «         dS g d¢}|                      ¦   «         |v sN|                      ¦   «                              d¦  «        s'|                      ¦   «                              d¦  «        rEt          |                      ¦   «         |¦  «         t          d| › dt          ¦   «         › �¦  «         dS t          ¦   «         }i }| 	                    ¦   «         rS	 t          |d¬	¦  «        5 }t          j        |¦  «        pi }ddd¦  «         n# 1 swxY w Y   n# t          $ r i }Y nw xY w|                      d
¦  «        }|}|dd…         D ];}||vs(t          |                     |¦  «        t"          ¦  «        si ||<   ||         }Œ<|                     ¦   «         dv rd}nu|                     ¦   «         dv rd}n\|                     ¦   «         rt)          |¦  «        }n8|                     d
dd¦  «                             ¦   «         rt-          |¦  «        }|||d         <   t/          ¦   «          ddlm}	  |	||d¬¦  «         dddddddddddd d!d"d#d$œ}
| |
v r#t          |
|          t5          |¦  «        ¦  «         t          d| › d%|› d|› �¦  «         dS )&zSet a configuration value.zset configuration valuesN)rè  r   r%   r×  r  r  rÓ  r  r  r  r  r   rÝ  rÔ  rÕ  r$  rÖ  r5  r9  rH  rI  r"   rS  rÚ  rÛ  r1  r2  r,  r(  )Ú_API_KEYÚ_TOKENÚTERMINAL_SSHu   âœ“ Set rx  rÁ   rÂ   rñ   ri  )rQ   rS   r?  T)r  r	  r~  Fr]   rÿ   r   rÄ  )Ú	sort_keysr   rÞ  ÚTERMINAL_DOCKER_IMAGEÚTERMINAL_SINGULARITY_IMAGEÚTERMINAL_MODAL_IMAGEÚTERMINAL_DAYTONA_IMAGEÚ&TERMINAL_DOCKER_MOUNT_CWD_TO_WORKSPACErö  ÚTERMINAL_TIMEOUTÚTERMINAL_SANDBOX_DIRÚTERMINAL_PERSISTENT_SHELLÚTERMINAL_CONTAINER_CPUÚTERMINAL_CONTAINER_MEMORYÚTERMINAL_CONTAINER_DISKÚTERMINAL_CONTAINER_PERSISTENT)zterminal.backendzterminal.modal_modezterminal.docker_imagezterminal.singularity_imagezterminal.modal_imagezterminal.daytona_imagez&terminal.docker_mount_cwd_to_workspacezterminal.cwdzterminal.timeoutzterminal.sandbox_dirzterminal.persistent_shellzterminal.container_cpuzterminal.container_memoryzterminal.container_diskzterminal.container_persistentrF  )rp   r‚   Úupperr  r’   rJ  r   r¡   rŸ   rf   r‘   rQ  rR  r  rj  rk  rd   rl  ra   Úisdigitrª   rK  r©  rÖ   rÇ  rÅ  r½   )r™   r›   Úapi_keysr¼  r¿  r—   rm  rn  ro  rÅ  Ú_config_to_env_syncs              rj   Úset_config_valuer•  ^  sR  € å�|„|ð ÝÐ0Ñ1Ô1Ð1Øˆðð ð €Hð ‡y‚y�{„{�hÐÐ #§)¢)¡+¤+×"6Ò"6Ð7MÑ"NÔ"NÐÐRU×R[ÒR[ÑR]ÔR]×RhÒRhÐiwÑRxÔRxÐÝ�s—y’y‘{”{ EÑ*Ô*Ð*ÝÐ2˜Ð2Ð2¥,¡.¤.Ð2Ð2Ñ3Ô3Ð3Øˆõ
 "Ñ#Ô#€KØ€KØ×ÒÑÔð ð	Ý�k¨GÐ4Ñ4Ô4ð 6¸Ý"œn¨QÑ/Ô/Ð5°2�ð6ð 6ð 6ñ 6ô 6ð 6ð 6ð 6ð 6ð 6ð 6øøøð 6ð 6ð 6ð 6øøåð 	ð 	ð 	ØˆKˆKˆKð	øøøð �IŠI�c‰NŒN€EØ€Gà�c�r�c”
ð  ð  ˆØ�wÐÐ¥j°·²¸TÑ1BÔ1BÅDÑ&IÔ&IÐØˆG�D‰MØ˜$”-ˆˆð ‡{‚{�}„}Ð-Ð-Ð-ØˆˆØ	�Š‰ŒÐ0Ð	0Ð	0ØˆˆØ	�Š‰Œð Ý�E‘
”
ˆˆØ	�Š�s˜B Ñ	"Ô	"×	*Ò	*Ñ	,Ô	,ð Ý�e‘”ˆà€GˆE�"ŒIÑõ ÑÔÐØ'Ð'Ð'Ð'Ð'Ð'ØÐ�k ;¸%Ð@Ñ@Ô@Ð@ð
 +Ø4Ø!8Ø&BØ 6Ø":Ø2ZØ&Ø.Ø 6Ø%@Ø":Ø%@Ø#<Ø)Hðð Ðð" Ð!Ð!Ð!ÝÐ*¨3Ô/µ°U±´Ñ<Ô<Ð<å	Ð
5�SÐ
5Ð
5˜UÐ
5Ð
5¨Ð
5Ð
5Ñ6Ô6Ð6Ð6Ð6s6   Ã2D2 ÄD&ÄD2 Ä&D*Ä*D2 Ä-D*Ä.D2 Ä2EÅ Ec           	      óü  — t          | dd¦  «        }|�|dk    rt          ¦   «          dS |dk    rt          ¦   «          dS |dk    r¥t          | dd¦  «        }t          | dd¦  «        }|r|€mt          d¦  «         t          ¦   «          t          d	¦  «         t          d
¦  «         t          d¦  «         t          d¦  «         t	          j        d¦  «         t          ||¦  «         dS |dk    rt          t          ¦   «         ¦  «         dS |dk    rt          t          ¦   «         ¦  «         dS |dk    �r�t          ¦   «          t          t          dt          j        t          j        ¦  «        ¦  «         t          ¦   «          t          d¬¦  «        }t          ¦   «         }t          ¦   «         \  }}|s?|s=||k    r7t          t          dt          j        ¦  «        ¦  «         t          ¦   «          dS ||k     rt          d|› d|› �¦  «         |r t          dt#          |¦  «        › d�¦  «         d„ |D ¦   «         }d„ |D ¦   «         }	|r=t          dt#          |¦  «        › d�¦  «         |D ]}
t          d|
d         › �¦  «         Œ|	rzt          dt#          |	¦  «        › d �¦  «         |	D ]W}
|
                     d!g ¦  «        }|r!d"d#                     |dd$…         ¦  «        › d%�nd&}t          d|
d         › |› �¦  «         ŒXt          ¦   «          t)          d'd¬(¦  «        }t          ¦   «          |d)         s|d*         r't          t          d+t          j        ¦  «        ¦  «         |d,         rCt          ¦   «          |d,         D ],}t          t          d-|› �t          j        ¦  «        ¦  «         Œ-t          ¦   «          dS |d.k    �r„t          ¦   «          t          t          d/t          j        t          j        ¦  «        ¦  «         t          ¦   «          t          ¦   «         \  }}||k    rt          d|› d0�¦  «         n.t          t          d|› d|› d1�t          j        ¦  «        ¦  «         t          ¦   «          t          t          d2t          j        ¦  «        ¦  «         t,          D ]O}t/          |¦  «        rt          d3|› �¦  «         Œ$t          t          d4|› d5�t          j        ¦  «        ¦  «         ŒPt          ¦   «          t          t          d6t          j        ¦  «        ¦  «         t2                               ¦   «         D ]�\  }}t/          |¦  «        rt          d3|› �¦  «         Œ'|                     d!g ¦  «        }|r dd#                     |dd$…         ¦  «        › �nd&}t          t          d7|› |› �t          j        ¦  «        ¦  «         ŒŽt          ¦   «         }|rUt          ¦   «          t          t          d8t#          |¦  «        › d9�t          j        ¦  «        ¦  «         t          d:¦  «         t          ¦   «          dS t          d;|› �¦  «         t          ¦   «          t          d<¦  «         t          d=¦  «         t          d>¦  «         t          d?¦  «         t          d@¦  «         t          dA¦  «         t          dB¦  «         t          dC¦  «         t	          j        d¦  «         dS )DzHandle config subcommands.Úconfig_commandNÚshowÚeditr¡  r™   r›   z&Usage: hermes config set <key> <value>z	Examples:z3  hermes config set model anthropic/claude-sonnet-4z+  hermes config set terminal.backend dockerz0  hermes config set OPENROUTER_API_KEY sk-or-...rÿ   r¯   zenv-pathÚmigrateu*   ðŸ”„ Checking configuration for updates...Fr9  u    âœ“ Configuration is up to date!z  Config version: r8  rC  z1 new config option(s) will be added with defaultsc                 ó<   — g | ]}|                      d ¦  «        ¯|‘ŒS )r]  r?  r;  s     rj   rA  z"config_command.<locals>.<listcomp>ì  s)   € ÐKÐKÐK !°a·e²e¸MÑ6JÔ6JÐK˜AÐKÐKÐKrl   c                 óf   — g | ].}|                      d ¦  «        °|                      d¦  «        °,|‘Œ/S )r]  rç  r?  r;  s     rj   rA  z"config_command.<locals>.<listcomp>í  sN   € ð 
ð 
ð 
ØØ—5’5˜Ñ'Ô'ð
à01·²°jÑ0AÔ0Að
Øð
ð 
ð 
rl   u   
  âš ï¸�  z required API key(s) missing:u	        â€¢ r\  u   
  â„¹ï¸�  z$ optional API key(s) not configured:rë  z (enables: r˜  rR  rÞ  r]   T)r   r  r  r  u   âœ“ Configuration updated!r  u
     âš ï¸�  Úchecku   ðŸ“‹ Configuration Statusu    âœ“z (update available)z  Required:u       âœ“ u       âœ— z
 (missing)z  Optional:u       â—‹ rë  z new config option(s) availablez+    Run 'hermes config migrate' to add themzUnknown config command: zAvailable commands:z4  hermes config           Show current configurationz/  hermes config edit      Open config in editorz6  hermes config set <key> <value>   Set a config valuez;  hermes config check     Check for missing/outdated configz8  hermes config migrate   Update config with new optionsz/  hermes config path      Show config file pathz-  hermes config env-path  Show .env file path)Úgetattrro  r  r   r€   Úexitr•  rŸ   r¡   rO   rN   rS  rT  re  rz  rÏ  ÚGREENrS  rd   r£  r�  ÚYELLOWr^  r`  ÚREDrb  r_  r3  )ÚargsÚsubcmdr™   r›   r…  r‹  r\  r]  Úrequired_missingÚoptional_missingr�  rë  Ú	tools_strrZ  r   rd  r–   s                    rj   r—  r—  ¹  sA  € å�TÐ+¨TÑ2Ô2€Fà€~˜ 6Ò)Ð)Ý‰Œˆˆˆà	�6Ò	Ð	Ý‰Œˆˆˆà	�5ŠˆÝ�d˜E 4Ñ(Ô(ˆÝ˜˜g tÑ,Ô,ˆØð 	�e�mÝÐ:Ñ;Ô;Ð;Ý‰GŒGˆGÝ�+ÑÔÐÝÐGÑHÔHÐHÝÐ?Ñ@Ô@Ð@ÝÐDÑEÔEÐEÝŒH�Q‰KŒKˆKÝ˜˜eÑ$Ô$Ð$Ð$Ð$à	�6Ò	Ð	Ý�oÑÔÑ Ô Ð Ð Ð à	�:Ò	Ð	Ý�l‰nŒnÑÔÐÐÐà	�9Ò	Ñ	Ý‰ŒˆÝ�eÐ@Å&Ä+ÍvÌ{Ñ[Ô[Ñ\Ô\Ð\Ý‰Œˆõ +¸Ð?Ñ?Ô?ˆÝ2Ñ4Ô4ˆÝ"6Ñ"8Ô"8Ñˆ�Zàð 	 >ð 	°kÀZÒ6OÐ6OÝ•%Ð:½F¼LÑIÔIÑJÔJÐJÝ‰GŒGˆGØˆFð ˜Ò#Ð#ÝÐE {ÐEÐE¸ÐEÐEÑFÔFÐFàð 	aÝÐ_�˜^Ñ,Ô,Ð_Ð_Ð_Ñ`Ô`Ð`àKÐK {ÐKÑKÔKÐð
ð 
Ø"ð
ñ 
ô 
Ðð
 ð 	1ÝÐU¥Ð%5Ñ!6Ô!6ÐUÐUÐUÑVÔVÐVØ'ð 1ð 1�ÝÐ/ # f¤+Ð/Ð/Ñ0Ô0Ð0Ð0àð 	<ÝÐ\¥Ð%5Ñ!6Ô!6Ð\Ð\Ð\Ñ]Ô]Ð]Ø'ð <ð <�ØŸš ¨Ñ,Ô,�ØEJÐRÐA¨$¯)ª)°E¸"¸1¸"´IÑ*>Ô*>ÐAÐAÐAÐAÐPR�	ÝÐ: # f¤+Ð:¨yÐ:Ð:Ñ;Ô;Ð;Ð;å‰Œˆõ !¨T¸Ð?Ñ?Ô?ˆå‰ŒˆØ�;Ôð 	E 7¨>Ô#:ð 	EÝ•%Ð4µf´lÑCÔCÑDÔDÐDà�:Ôð 	DÝ‰GŒGˆGØ" :Ô.ð Dð D�Ý•eÐ2¨Ð2Ð2µF´MÑBÔBÑCÔCÐCÐCå‰Œˆˆˆà	�7Ò	Ñ	å‰ŒˆÝ�eÐ/µ´½f¼kÑJÔJÑKÔKÐKÝ‰Œˆå"6Ñ"8Ô"8Ñˆ�ZØ˜*Ò$Ð$ÝÐ8 {Ð8Ð8Ð8Ñ9Ô9Ð9Ð9å•%Ð^¨[Ð^Ð^¸zÐ^Ð^Ð^Õ`fÔ`mÑnÔnÑoÔoÐoå‰ŒˆÝ�e�M¥6¤;Ñ/Ô/Ñ0Ô0Ð0Ý)ð 	Jð 	JˆHÝ˜XÑ&Ô&ð JÝÐ+ Ð+Ð+Ñ,Ô,Ð,Ð,å•eÐ; xÐ;Ð;Ð;½V¼ZÑHÔHÑIÔIÐIÐIå‰ŒˆÝ�e�M¥6¤;Ñ/Ô/Ñ0Ô0Ð0Ý/×5Ò5Ñ7Ô7ð 	Kð 	K‰NˆH�dÝ˜XÑ&Ô&ð KÝÐ+ Ð+Ð+Ñ,Ô,Ð,Ð,àŸš ¨"Ñ-Ô-�Ø>CÐKÐ: D§I¢I¨e°B°Q°B¬iÑ$8Ô$8Ð:Ð:Ð:È�	Ý•eÐ< xÐ<°Ð<Ð<½f¼jÑIÔIÑJÔJÐJÐJå2Ñ4Ô4ˆØð 	AÝ‰GŒGˆGÝ•%ÐQ�S Ñ0Ô0ÐQÐQÐQÕSYÔS`ÑaÔaÑbÔbÐbÝÐ?Ñ@Ô@Ð@å‰Œˆˆˆõ 	Ð1¨Ð1Ð1Ñ2Ô2Ð2Ý‰ŒˆÝÐ#Ñ$Ô$Ð$ÝÐDÑEÔEÐEÝÐ?Ñ@Ô@Ð@ÝÐFÑGÔGÐGÝÐKÑLÔLÐLÝÐHÑIÔIÐIÝÐ?Ñ@Ô@Ð@ÝÐ=Ñ>Ô>Ð>ÝŒ�‰Œˆˆˆrl   )rv   )r{   )Fr¨  )NN)TF)prÚ  r“  rÎ  r^   Úplatformr   r  r{  r€   rò  Údataclassesr   Úpathlibr   Útypingr   r   r   r   r	   Ú	getLoggerr×  rŸ  ÚsystemrÐ  Úcompiler  r   r½   rÛ  Ú	frozensetrÙ  rQ  Úhermes_cli.colorsrN   rO   Úhermes_cli.default_soulrP   rb   rc   rk   Úboolrp   rs   ru   rz   r‚   rl  rœ   r�   re   rŸ   r¡   r¦   r²   r»   r¾   rÆ   rÖ   rÑ   ry  rá  rª   r^  rb  re  rp  rz  rƒ  rµ  r¹  rÄ  rÌ  rÏ  râ  Ú_VALID_CUSTOM_PROVIDER_FIELDSrß  rÓ  ré  ró  rÿ  r�  r”  rœ  r¥  r©  r·  rº  rN  rx  rÈ  rÉ  Ú_COMMENTED_SECTIONSrI  r×  r¨  rÒ  rH  r  rJ  r  r!  r#  r%  r*  r-  r`  r4  ro  r  r•  r—  ro   rl   rj   ú<module>rµ     s&  ððð ð ð €€€Ø €€€Ø 	€	€	€	Ø €€€Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ø 
€
€
€
Ø €€€Ø !Ð !Ð !Ð !Ð !Ð !Ø Ð Ð Ð Ð Ð Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3à	ˆÔ	˜8Ñ	$Ô	$€àˆhŒoÑÔ 9Ò,€Ø�2”:Ð9Ñ:Ô:Ð Ø02Ð ˜t C¨ Hœ~Ð 2Ð 2Ñ 2ð �)ð ð ð ñ ô €ð6 €€€à +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3ð ,Ð àØØØð	ð Ð ð˜H SœMð ð ð ð ð,�Dð ,ð ,ð ,ð ,ð H¨S¤Mð ð ð ð ð; Cð ;ð ;ð ;ð ;ñ
ð  3ð Èsð ð ð ð ñ8;ð ;˜#ð ;ð ;ð ;ð ;ð* ¨$¤ð *ð *ð *ð *ðd -Ð ,Ð ,Ð ,Ð ,Ð ,ð-˜ð -ð -ð -ð -ð&�dð &ð &ð &ð &ð2˜$ð 2ð 2ð 2ð 2ðð ð ð4�tð ð ð ð ð2ð ð ð$ $ð ¨4ð ð ð ð ð&ð &ð &ð0" dð "ð "ð "ð "ð,k
ØˆRðk
à�ðk
ð ˜"ðk
ð ! "ð	k
ð
 ��ðk
ð Øð
  ð
 "$ð Øð !'ð $'ð $'ðO(ð (ðk
ð` ð CØ�7ðCà�fðCð 	ˆsðCð 	�3ð	Cð 	˜2ðCð* 	˜Bð+CðD 	˜dðECðF 	ÐDðGCðH 	˜bðICðT 	�bðUCðV 	ÐRðWCðX 	ÐCðYCðZ 	ÐEð[Cð^ 	˜ð_Cð` 	˜DðaCðb 	˜%ðcCðd 	 ðeCðt ð */ð
 !ðECð Cð Cðak
ðj Ø!ØØ Ø#Ø'+Øð
 (Øð
 " 5ð	
ðð ðkk
ðZ ØØðð ð[k
ðj ˜7ðkk
ðJ ØØØðð ðKk
ðV ØØØØð	ð ðWk
ðj Ø�Tððkk
ðv ØàØ!Ø $ð
ð 
ð %'Ø!#Ø&-Øð
ð 
ðð ðwk
ðf àØØØØØØ "ð
ð 
ð ØØØØØð
ð 
ð ØØØØØð
ð 
ð ØØØØØØ ð
ð 
ð ØØØØØð
ð 
ð ØØØØØð
ð 
ð ØØØØØð
ð 
ð ØØØØØð
ð 
ðwCð Cðgk
ðp ð Ø�5ðà�xðð 	˜&ðð 	˜;ð	ð
 	˜Eðð 	˜%ðð 	�Uðð 	" 7ðð 	˜ðð 	�Uðð 	�	ðð 	ØØð!
ð !
ðð  	% dð!ð" 	  ð#ð$ 	" 2ð%ð& 	˜qð'ð( 	�Rð)ðqk
ð`	 Ø�ðða	k
ð k
ðj	 Ø�eððk	k
ð|	 
ØàÐ'ð
ð
 /Ø0ð
ð 
ð
 'Øð
ð 
ð ØØ Øð	
ð 
ð -Ø>ð
ð 
ð
 ØØ3Øð	
ð 
ð3ð ð}	k
ð~
 
ØØàØð
ð 
ð
 �[ð
ð Ð*ð
ðð ð
k
ð\ ØØ!$ØØØ Øðð ð]k
ðn ØØØðð ðok
ðF Ø�,ððGk
ðP ØØ $Ø!Øð
 ð
ð 
ðQk
ðp ØØØØð !%Øà!$ð à#$ð Ø $ð "'ðC"ð "ðqk
ð~ ˜Rðk
ðH Øð
 ð à "ð  %ð5ð ðIk
ðH ˆbðIk
ðP �ðQk
ðV ØØ"$ØØØØð ðð ðWk
ðz ð ð{k
ðJ Ø˜2ððKk
ðT Ø˜2ððUk
ð^ Ø˜2ðð_k
ð k
ðx ØØðð ð àð ð ð ð $ØØØØØ àØØð
ð 
ðð ð" ð
 "ð	ð 	ð, 	�	ðð  ØØðð ð ØRð ð ðð ð* 	�eð	ð$ ð ð #ð !ð)ð ð6 	�ðð
 ðUk
ð k
ð k
€ðh YÐXÐXØ Ð"6Ð7ðEð Eð Eà	ÐØ	Ðð-ð -Ð �T˜#˜t Cœy˜.Ô)ð ð ñ ð Ð ðPàØ6ØBØØØØðð ðPð ØWØ&Ø+ØØ"Ð$7Ð8ØØðð ðPð& ØUØ,Ø7ØØØðð ð'Pð6 ØLØ"Ø7ØØØðð ð7PðF Ù;Ù=ØØØØðð ðGPñV Ù$ÙÙ&ØØØðð ðWPñf Ù.Ù:ØØØØðð ðgPñv ÙTÙ&Ù*ØØØðð ðwPñF ÙcÙAØØØØðð ðGPñV Ù[Ù&ÙØØØðð ðWPñf Ù=Ù ÙØØØðð ðgPñv Ù=Ù ÙØØØðð ðwPñF Ù5ÙAØØØØðð ðGPñV Ù0Ù Ù.ØØØðð ðWPñf Ù:Ù;ØØØØðð ðgPñv Ù6Ù(Ù.ØØØðð ðwPñF Ù2Ù-Ù.ØØØðð ðGPð PñV Ù<ÙHØØØØðð ðWPñf Ù)Ù$Ù'ØØØðð ðgPñv Ù3Ù<ØØØØðð ðwPñF Ù8Ù#Ù(ØØØðð ðGPñV Ù2Ù>ØØØØðð ðWPñf Ù9Ù+Ù*ØØØðð ðgPñv Ù:ÙFØØØØðð ðwPñF ÙDÙ$Ù7ØØñð ðGPñT Ù@Ù%ØØØñð ðUPñb ÙWÙ%Ù>ØØñð ðcPñp Ù`Ù&ØØØØðð ðqPñ@ Ù[ÙBØØØØðð ðAPñP ÙÙ_ÙBØØØð ð  ðQPñ` "ÙTÙ9ÙBØØØð$ð $ðaPñp ÙYÙOØØØØð!ð !ðqPñ@ ÙVÙ(Ù)ØØØðð ðAPñP Ù7ÙCØØØØðð ðQPð Pð Pñ` ÙUÙ'Ù)ØØØðð ðaPñp Ù6ÙBØØØØðð ðqPñ@	 ÙoÙ&Ù7ØØñð ðA	PñN	 ÙKÙ9ØØØØðð ðO	Pñ^	 ÙWÙ(Ù,ØØØðð ð_	Pñn	 ÙXÙ=ØØØØðð ðo	Pñ~	 ñ BÙ'Ù0ØØñð ð	PñL
 Ù_Ù=ØØØØðð ðM
Pñ\
 ÙXÙÙZØØØðð ð]
Pñl
 Ù_ÙØØØØðð ðm
Pñ|
 ÙIÙ)Ù&ØØñð ð}
PñJ ÙeÙ*ØØØØðð ðKPñ^ ÙJÙÙ Ù¡Ð.ØÙñð ð_Pñn ÙNÙ$Ù%Ù¡Ð.ØÙñð ðoPñ~ ÙFÙ%Ù'Ù¡Ð.ØÙñð ðPñN ÙOÙ=ØØÙØðð ðOPñ^ ÙjÙMØØÙØðð ð_Pð Pð Pñn ñ oÙ.ØØÙØðð ðoPñ~ ñ jÙ+ØØÙØðð ðPñN ñ OÙ+ØØÙØð ð  ðOPð^ ÙTÙ"Ù,Ø;Ñ;Ð;ØÙñð ð_Pñn ÙnÙ'Ù)Ù$¡oÐ6ØÙñð ðoPñ~ Ù\Ù*Ù)Ù$¡oÐ6ØÙñð ðPñN ÙnÙ'Ù)Ù$¡oÐ6ØÙñð ðOPñ^ ÙYÙ1Ù$¡oÐ6ØÙñð ð_Pñl ÙrÙ&Ù:Ù$¡oÐ6ØÙñð ðmPñ| Ù9ÙÙ Ù"Ð#ØÙñð ð}PñL Ù7Ù"Ù@ØMÑMÐMØÙñð ðMPñ\ ÙIÙ!Ù+Ù"Ñ$5Ð6ØÙñð ð]Pðl ÙXÙ:Ù5Ù'©Ð6ØÙñð ðmPð| ÙMÙ&Ù'ØÙñð ð}PñJ ÙPÙ#Ù,ØÙñð ðKPñX Ù\Ù Ù3ØÙñð ðYPñj ÙGÙ"Ù'Ù"Ð#ØÙñð ðkPð Pð Pñz ÙVÙ@Ùñð ð{PñH Ù;Ù&Ù'ØÙñð ðIPñV ÙlÙ?Ù)ØÙñð ðWPñd ÙzÙ1ØÙñ	ð ðePñp Ù@Ù%Ù<ØÙñð ðqPñ~ ÙPÙ>ØØÙñð ðPñL ñ aÙ6ØØÙñð ðMPñZ ñ\ñ /Ù+ØÙñð ð[Pñl ñGñ /Ù+ØÙñð ðmPñ~ ÙLÙ)Ù/ØÙñð ðPñL ÙFÙ(ØØÙñð ðMPñZ ÙSÙAØØÙñ!ð !ð[Pñh !ÙzÙ0ØØÙñ#ð #ðiPñv (ÙcÙ?ØØÙñ*ð *ðwPñD ÙPÙ)Ù6ØÙñð ðEPñR ÙLÙ'ØØÙñð ðSPñ` ÙBÙ1ØØÙñð ðaPð Pð Pñn ÙeÙ=ØØÙñð ðoPñ| ÙsÙ:ØØÙØðð ð}PñL !Ù\Ù<ØØÙØð#ð #ðMPñ\ ÙYÙ=ØØÙØðð ð]Pñl ÙgÙ=ØØÙØðð ðmPñ| ñ ]Ù'ØØÙØðð ð}PñL ÙhÙ*Ù)ØÙñð ðMPñZ ÙcÙ/ØØÙñð ð[Pñh  ÙcÙ@ØØÙñ"ð "ðiPñv "ÙFÙ/Ùñ$ð $ðwPñ@ ÙGÙÙ!Ùñ	ð ðAPñL ÙCÙ$ØÙñ	ð ðMPñX ÙKÙ$Ùñð ðYPñb ÙVÙ*Ùñð ðcPñl ÙMÙ&Ùñð ðmPñv ÙUÙ#Ùñð ðwPñ@ Ù=Ù(Ùñ ð  ðAPð Pð PñJ ÙTÙ#Ùñð ðKPñT ÙfÙ0ØØÙØð ð  ðUPñd ñ LÙ2ØØÙØðð ðePñt ñ HÙEØØÙØðð ðuPñD ÙAÙ#ØØÙØðð ðEPñT ñ gÙ#ØØÙØðð ðUPñd ñ uÙ)ØØÙØðð ðePñt ñ yÙQØØÙØðð ðuPñD ñ [Ù.ØØÙØðð ðEPñT ÙkÙ0ØØÙñð ðUPñb ÙJÙ ØØÙñð ðcPñp ÙtÙ"ØØÙñð ðqPñF ñ SÙ!ØØÙñð ðGPñT ÙWÙ"ØØÙñð ðUPñh ÙVÙBØØÙñð ðiPñv  ÙVÙBØØÙñ"ð "ðwPñD #Ù_Ù.ØØÙñ%ð %ðEPð PñR %ÙhÙ+ØØÙñ'ð 'ðSPð PÐ ñlñ ¨ð ¸¸dÀ3ÈÀ8¼nÔ9Mð ñ ð ð ñ,˜ñ ¨#ð ñ ð ð ð 4¨¨S°#¨X¬Ô#7ð ñ ð ð ð8" t¨D°°c°¬NÔ';ð "ñ "ð "ð "ðP ñqð qñ qØñqð ðqð ˆd�3˜�8ŒnÔð	qñ qð qð qñh°sð ¸tÀDÈÈcÈÄNÔ?Sð ñ ð ð ð (,ñ/ñ /Ø�T˜#˜s˜(”^Ô$ð/à	ˆ$ˆs�CˆxŒ.Ôð/ñ /ð /ð /ðj 8<Ø'+ñ	>ð >Øñ>àñ>ð ˜t D¨¨c¨¤NÔ3Ô4ñ>ð �T˜#˜s˜(”^Ô$ð	>ð
 ˆc„]ð>ñ >ð >ð >ðB	˜e C¨ Hœoð 	ñ 	ð 	ð 	ð"ñ ð Ð ð!ñ !ð !Ð ð  WÑVÐVÐ ð ðð ñ ð ñ ñ ô ñ „ðñwñ w h¨t°C¸°H¬~Ô&>ð wÈ$É}ÔJ]ð wñ wð wð wñt0ñ 0 (¨4°°S°¬>Ô":ð 0Àdð 0ñ 0ð 0ð 0ñ,*4ñ *4¨°$°s¸C°x´.Ô)Að *4ÈTð *4ñ *4ð *4ð *4ñZlñ l ñ l°Dð lÀTÈ#ÈsÈ(Ä^ð lñ lð lð lð^�dñ  dð ¨tð ñ ð ð ñ(ð ð ñ(ð ð ñ=ñ =ð =ð =ñ@ t¨C°¨H¤~ð ¸$¸sÀC¸x¼.ð ñ ð ð ñ<¨¨S°#¨X¬ð ¸4ÀÀSÀ¼>ð ñ ð ð ð"˜˜c 3˜hœð ñ ð ð ð$�T˜#˜s˜(”^ð ñ ð ð ñ:Ð ñ Ð ñ0Ð ñ>#X˜˜S #˜Xœð #Xñ #Xð #Xð #XðL�$�s˜C�x”.ð ñ ð ð ñ:0˜tð 0¨ð 0ñ 0ð 0ð 0ðf*˜3ð *ñ *ð *ð *ñZ% Sñ %°ð %¸ð %ñ %ð %ð %ñPC˜ñ C Cð Cñ Cð Cð CñL5˜#ð 5 $ð 5ñ 5ð 5ð 5ñp$ñ $ cð $ñ $ð $ð $ñ$ñ $ð $ð $ñ"ñ " #ð "ñ "ð "ð "ñ˜sñ ¨3ð °4¸¸S¸´>ð ñ ð ð ð�Cð ñ ð ð ñ,�sð ˜x¨œ}ð ñ ð ð ñ&�Cð &˜Cð &ñ &ð &ð &ñcð cð cñL/ð /ð /ñ@T7˜#ñ T7 cð T7ñ T7ð T7ð T7ñvFð Fð Fð Fð Frl   