+
    jHàjÒ|  ã                  ó^  a € 0 t $ R t^ RIHt ^ RIt^ RIHtHtHtH	t	H
t
HtHtHtHtHt R R ltRAtR]R&   RBtR]R	&   R
 R ltR R ltR R ltRCR R llt]! R4      R R l4       tR R ltR R lt]! R4      R R l4       t]! 4       R R l4       tR R lt0 RDmtR  R! ltR" R# lt R$ R% lt!]! 4       R& R' l4       t"R( R) lt#R* R+ lt$R, R- lt%R. R/ lt&R0 R1 lt'R2 R3 lt(R4 R5 lt)]#]$]%]&]'])3t*R6 R7 lt+]! 4       R8 R9 l4       t,]! R:R;4      R< R= l4       t-]! R>R;4      R? R@ l4       t.R# )Ez†Configuration-file checks for hermes doctor: .env, config.yaml validation, drift, deprecations.
Split out of ``hermes_cli/doctor.py``.)ÚannotationsN)
ÚFindingÚ_fail_and_issueÚ_sectionÚ
check_boolÚ
check_failÚ
check_infoÚcheck_okÚ
check_warnÚdoctor_checkÚwarn_on_errorc               ó    € V ^8„  d   QhRRRR/# )é   ÚcontentÚstrÚreturnÚbool© )Úformats   "Ú=/home/ubuntu/.hermes/hermes-agent/hermes_cli/doctor_config.pyÚ__annotate__r      s   € ÷ >ñ > cð >¨dñ >ó    c                ó„   a € ^ RI Hp \        ;QJ d    V 3R lV 4       F  '       g   K   R# 	  R# ! V 3R lV 4       4      # )zIReturn True when ~/.hermes/.env contains provider auth/base URL settings.)Ú_PROVIDER_ENV_HINTSc              3  ó,   <"  € T F	  qS9   x € K  	  R # 5i©Nr   )Ú.0Úkeyr   s   & €r   Ú	<genexpr>Ú+_has_provider_env_config.<locals>.<genexpr>   s   øé € Ð=Ñ)< #�gŽ~Ó)<ùs   ƒTF)Úhermes_cli.doctorr   Úany)r   r   s   f r   Ú_has_provider_env_configr"      s1   ø€ å5ß‹3Ô=Ñ)<Ó=�3Œ3Ð=Š3Ð=ˆ3Ô=Ñ)<Ó=Ó=Ð=r   z tuple[tuple[str, str, str], ...]Ú_DEPRECATED_CONFIG_KEYSztuple[tuple[str, str], ...]Ú_DEPRECATED_ENV_VARSc               ó    € V ^8„  d   QhRRRR/# )r   Ú
raw_configúdict | Noner   úlist[tuple[str, str]]r   )r   s   "r   r   r   (   s   € ÷ Yñ Y¨{ð YÐ?Tñ Yr   c           
     óô   € \        V \        4      '       g   . # \         UUUu. uFE  w  rp\        V P                  V4      \        4      '       g   K-  W V,          9   g   K<  V RV 2V3NKG  	  uppp# u upppi )zf``(legacy_path, replacement)`` for deprecated keys in the on-disk YAML (empty containers still count).Ú.)Ú
isinstanceÚdictr#   Úget)r&   Úsectionr   Úreplacements   &   r   Úcollect_deprecated_config_keysr0   (   sw   € ä�j¤$×'Ò'Øˆ	ÝOfõ YÑOfÑ2K°'ÀÜ˜*Ÿ.™.¨Ó1´4×8ô .Ø=@ÈwÕDWÑ=Wô .�ˆy˜˜#˜Ð Ó-ÑOfó Yð Yùô Ys   £*A3Á
A3Á!A3c               ó    € V ^8„  d   QhRRRR/# )r   Úenv_mapr'   r   r(   r   )r   s   "r   r   r   0   s   € ÷ Sñ S¨ð SÐ9Nñ Sr   c                óê   € \        V \        4      '       g   . # \         UUu. uFC  w  rV P                  V4      f   K  \	        W,          4      P                  4       R8w  g   K@  W3NKE  	  upp# u uppi )z™``(legacy_env, replacement)`` for deprecated vars in *env_map* (the on-disk ``.env``, not ``os.environ``,
so bridged runtime vars do not false-positive).Ú )r+   r,   r$   r-   r   Ústrip)r2   Únamer/   s   &  r   Úcollect_deprecated_env_varsr7   0   sp   € ô �gœt×$Ò$Øˆ	Ý9Mô SÑ9MÑ$5 DØ�{‰{˜4Ó ô  Ü14°Wµ]Ó1C×1IÑ1IÓ1KÈrÑ1Qô  ˆTÓÑ9Mò Sð Sùó Ss   ¢A/¾!A/Á$A/c               ó$   € V ^8„  d   QhRRRRRR/# ©r   r&   r'   r2   r   r(   r   )r   s   "r   r   r   9   s"   € ÷ ñ °kð ÈKð Ð\qñ r   c                óž  € ^ RI HpHpHpHp . p\        V \        4      '       d   V P                  R4      MRp\        V\        4      '       d8   TV! VP                  R4      4       Uu. uF  pRV 2RV R23NK  	  up,          p\        T;'       g    / 4      p	VfR   . VOVN FG  p
W©9  g   K  \        P                  P                  V
4      f   K.  \        P                  V
,          Wš&   KI  	  \        V	P                  VR4      4      P                  4       '       g&   TV! V	4       U
u. uF  p
V
R	V R
23NK  	  up
,          pV# u upi u up
i )z?Return actionable findings for the removed Hermes Relay plugin.)ÚLEGACY_RELAY_EXPORT_ENV_VARSÚRELAY_PLUGINS_CONFIG_ENVÚ configured_legacy_relay_env_varsÚlegacy_relay_plugin_keysÚpluginsNÚenabledzplugins.enabled: zJremove it and configure a standard user or system Relay plugins.toml; use z# for an explicit user-file overrider4   zBrun `hermes migrate relay` to generate relay-plugins.toml and set zH; this legacy variable is now ignored and does not configure an exporter)Úhermes_cli.relay_plugin_cutoverr;   r<   r=   r>   r+   r,   r-   ÚosÚenvironr   r5   )r&   r2   r;   r<   r=   r>   Úfindingsr?   r   Úeffective_envr6   s   &&         r   Ú%collect_relay_plugin_cutover_findingsrF   9   sl  € ÷mó mà&(€HÜ+5°jÄ$×+GÒ+Gˆj�n‰n˜YÔ'ÈT€GÜ�'œ4× Ò Øá 8¸¿¹ÀYÓ9OÔ PóRá P˜ð *¨#¨Ð/ð 2Ø4Ð5Ð5Xð2Zó [á PñRõ 	Rˆô ˜Ÿ˜ BÓ'€Mð ‚ØMÐ2ÐMÐ4LÓMˆDØÖ(¬R¯Z©Z¯^©^¸DÓ-AÔ-MÜ&(§j¡j°Õ&6�Ó#ñ Nô ˆ}× Ñ Ð!9¸2Ó>Ó?×EÑE×GÒGØá!AÀ-Ô!PóRá!P˜ð Ð`ÐayÐ`zð {eð eó fá!PñRõ 	Rˆð €OùòRùòRs   Á(EÄ)E
c               ó$   € V ^8„  d   QhRRRRRR/# r9   r   )r   s   "r   r   r   Q   s"   € ÷ ñ °ð Èkð Ðezñ r   c                óJ  € \        V 4      \        V4      ,           p\        W4      pW#,           pV'       g   \        R4       V# V F*  w  rV\	        RV 2RV R24       \        RV RV R24       K,  	  V F)  w  rV\	        RV 2R	V R
24       \        RV RV 24       K+  	  V# )z¸Emit non-failing doctor warnings for deprecated config keys and env vars; returns the findings reported.
Does not mutate config/env and does not append to the blocking ``issues`` list.z%No deprecated config keys or env varszDeprecated: z(use z	 instead)zReplace u    â†’ z$ (warn-only; not auto-migrated here)zBreaking Relay migration: Ú(Ú)zMigrate z: )r0   r7   rF   r	   r
   r   )r&   r2   Ú
deprecatedÚrelay_cutoverrD   Úlegacyr/   s   &&     r   Ú report_deprecated_config_and_envrN   Q   sÂ   € ô 0°
Ó;Ô>YÐZaÓ>bÕb€JÜ9¸*ÓN€MØÕ)€HßÜÐ8Ô9ØˆÛ)ÑˆÜ�\ & Ð*¨e°K°=À	Ð,JÔKÜ�X˜f˜X U¨;¨-Ð7[Ð\Ö]ñ  *ó  -ÑˆÜÐ/°¨xÐ8¸A¸k¸]È!Ð:LÔMÜ�X˜f˜X R¨ }Ð5Ö6ñ  -ð €Or   zRelay plugin check failed: {e}c               ó$   € V ^8„  d   QhRRRRRR/# ©r   Ú
should_fixr   Úfr   r   ÚNoner   )r   s   "r   r   r   d   s&   € ÷ Sñ S Tð S¨gð S¸$ñ Sr   c                óÔ  € ^ RI Hp  V! 4       pTP                  '       g   \	        R	4       R# TP                  '       d)   \        R
R4       TP                  P                  R4       MBTP                  '       d   \        M\        pTP                  '       d   T! RR4       MT! R4       \        . TP                  OTP                  OTP                  O54       R#   \         d)   pTP                  R8w  d   h \	        R4        Rp?R# Rp?i\
         dP   p\        RR4       \        R YDP                  3 4       4       TP                  P                  R4        Rp?R# Rp?ii ; i)z\Name the plugins.toml files Relay applies to Hermes, including ones outside the Hermes home.)Úresolve_plugin_sourcesÚ
nemo_relayz,NeMo Relay is not available on this platformNz,Relay plugin configuration could not be readz#(Hermes runs without Relay plugins)c              3  ó0   "  € T F  qf   K  Vx € K  	  R # 5ir   r   )r   Úcauses   & r   r   Ú'_check_relay_plugins.<locals>.<genexpr>p   s   é € ÐWÑ-A EŸ%š%Ó-Aùs   ‚Œ
zBFix the Relay plugin configuration shown under NeMo Relay Plugins.zNo Relay plugin files foundz+Relay will reject this plugin configurationzRelay plugins enabledz1(applies to every profile a Hermes process hosts)z)Relay plugin files found, nothing enabled)Úagent.relay_runtimerU   ÚModuleNotFoundErrorr6   r	   Ú	Exceptionr
   Ú_relay_info_linesÚ	__cause__Úmanual_issuesÚappendÚconfig_pathsÚerrorsÚwarningsr@   )rQ   rR   rU   ÚsourcesÚexcÚreports   &&    r   Ú_check_relay_pluginsrg   c   s  € õ ;ðÙ(Ó*ˆð ××ÐÜÐ.Ô/ÙØ‡~‡~€~ÜÐ@ÐBgÔhØ	�‰×ÑÐcÕdð  '×/×/Ð/•´XˆØ�?�?ˆ?ÙÐ*Ð,_Õ`áÐ>Ô?ÜÐQ˜×,Ñ,ÐQ¨w¯~©~ÐQÀ×@PÑ@PÑQÖRøô/ ô Ø�8‰8�|Ô#ØÜÐ?Ô@ÝûÜô ÜÐAÐChÔiÜÑW¨c·=±=Ñ-AÓWÔWØ	�‰×ÑÐcÔdÝûð	ús*   ˆC ÃE'Ã'D
Ä
E'ÄE'ÄAE"Å"E'c               ó   € V ^8„  d   QhRR/# ©r   r   rS   r   )r   s   "r   r   r   ƒ   s   € ÷ eñ e ñ er   c           	     ó¤   € V  FI  p\        RP                  R \        V4      P                  4       P	                  4        4       4      4       KK  	  R# )z`Print Relay paths and messages as doctor detail rows, keeping multi-line parser errors indented.z
      c              3  óT   "  € T F  qP                  4       '       g   K  Vx € K   	  R # 5ir   )r5   )r   Úparts   & r   r   Ú$_relay_info_lines.<locals>.<genexpr>†   s   é € Ð"cÑ4R¨D×V`ÑV`×Vb§4¢4Ó4Rùs   ‚(ž
(N)r   Újoinr   r5   Ú
splitlines)ÚlinesÚlines   & r   r]   r]   ƒ   s7   € ãˆÜ�:—?‘?Ñ"c´C¸³I·O±OÓ4E×4PÑ4PÔ4RÓ"cÓcÖdó r   c               ó   € V ^8„  d   QhRR/# ri   r   )r   s   "r   r   r   ‰   s   € ÷ Lñ L˜Tñ Lr   c                 ó²  € Rp \        R4      ;_uu_ 4        ^ RIHp VP                  4       p RRR4       V f   R# \	        XP                  4       4      \	        VP                  4       4      r2\        RV RV RV  24       \        P                  P                  RR4      P                  4       '       d   \        RV  24       R# R#   + '       g   i     L¡; i)	uÙ   Report the active managed scope (resolved dir + pinned key counts); silent when none. A HERMES_MANAGED_DIR
override is surfaced too â€” a redirected scope is the documented foot-gun (docs/design/managed-scope.md Â§7).Nr4   )Úmanaged_scopezManaged scope active: z config key(s), z env key(s) pinned by ÚHERMES_MANAGED_DIRz'managed dir set via HERMES_MANAGED_DIR=)r   Ú
hermes_clirt   Úget_managed_dirÚlenÚmanaged_config_keysÚload_managed_envr	   rB   rC   r-   r5   r   )Úmanaged_dirrt   Ún_cfgÚn_envs       r   Úmanaged_scope_checkr~   ‰   sµ   € ð €KÜ	�r×	Õ	Ý,Ø#×3Ñ3Ó5ˆ÷ 
ð ÒÙÜ�}×8Ñ8Ó:Ó;¼SÀ×A_ÑA_ÓAaÓ=bˆ5ÜÐ% e WÐ,<¸U¸GÐCYÐZeÐYfÐgÔhÜ	‡z�z‡~�~Ð*¨BÓ/×5Ñ5×7Ò7ÜÐ<¸[¸MÐJÖKñ 8÷ 
×	ús   –CÃC	zMCP security check failed: {e}c               ó$   € V ^8„  d   QhRRRRRR/# rP   r   )r   s   "r   r   r   ™   s!   € ÷ 5ñ 5 Dð 5¨Wð 5¸ñ 5r   c                óà  € ^ RI Hp ^ RIHp V! 4       P	                  R4      ;'       g    / p^ p\        V\        4      '       d   \        VP                  4       4      MR Fv  w  rg\        V\        4      '       d	   V! Wg4      MRpV'       g   K/  V^,          p\        RV R2RP                  V4      4       VP                  P                  RV R	24       Kx  	  V^ 8X  d   \        R
4       R# R# )z8Flag mcp_servers entries with suspicious stdio commands.©Úload_config)Úvalidate_mcp_server_entryÚmcp_serversNzMCP server 'z' has suspicious stdio commandz; zReview/remove mcp_servers.zC in config.yaml; rotate any credentials that may have been exposed.z No suspicious MCP stdio commandsr   )Úhermes_cli.configr‚   Úhermes_cli.mcp_securityrƒ   r-   r+   r,   ÚsortedÚitemsr
   rn   r_   r`   r	   )	rQ   rR   r‚   rƒ   ÚserversÚ
suspiciousr6   ÚentryÚissues_founds	   &&       r   Ú_check_mcp_securityr�   ˜   sÙ   € õ .ÝAÙ‹m×Ñ Ó.×4Ð4°"€GØ€JÜ2<¸WÄd×2KÒ2K”v˜gŸm™m›oÔ.ÐQSÒS‰ˆÜAKÈEÔSW×AXÒAXÑ0°Ô=Ð^bˆßÙØ�a�ˆ
Ü�\ $ Ð'EÐFÈÏ	É	ÐR^ÓH_Ô`Ø	�‰×ÑÐ!;¸D¸6ð  BEð   Fö  	Gñ Tð �Q„ÜÐ3Ö4ñ r   c               ó$   € V ^8„  d   QhRRRRRR/# rP   r   )r   s   "r   r   r   «   s&   € ÷ Añ A ð A¨ð A°Tñ Ar   c                ó¢  € ^ RI HpHpHp \	        4        VR,          pVP                  4       '       da   \        V R24        VP                  RR7      p\        \        V4      RRV R	24      '       g   VP                  P                  R
4       R# R# VR,          P                  4       '       d   \        R4       R# \        V R24       V '       dŸ   VP                  P                  RRR7       VP!                  4        \#        R4      ;_uu_ 4        \$        P&                  ! \)        V4      R4       RRR4       \        RV R	24       \+        R
4       V;P,                  ^,          un        R# \+        R4       VP                  P                  R4       R#   \         d    TP                  RR7      p ELei ; i  + '       g   i     L‘; i)zDManaged scope plus ~/.hermes/.env presence and provider credentials.©ÚHERMES_HOMEÚPROJECT_ROOTÚ_DHHz.envz/.env file existsz	utf-8-sig)Úencodingzlatin-1z%API key or custom endpoint configuredzNo API key found in z/.envz(Run 'hermes setup' to configure API keysz'.env file exists (in project directory)z/.env file missingT)ÚparentsÚexist_okr4   i€  NzCreated empty z Run 'hermes setup' to create onez!Run 'hermes setup' to create .env)r    r‘   r’   r“   r~   Úexistsr	   Ú	read_textÚUnicodeDecodeErrorr   r"   Úissuesr`   r   ÚparentÚmkdirÚtouchr   rB   Úchmodr   r   Úfixed)rQ   rR   r‘   r’   r“   Úenv_pathr   s   &&     r   Ú_check_env_filer¡   ª   sƒ  € ÷ BÑAÜÔØ˜VÕ#€HØ‡�×ÒÜ�D�6Ð*Ð+Ô,ð	=Ø×(Ñ(°+Ð(Ó>ˆGô Ô2°7Ó;Ð=dÐh|ð  ~Bð  }Cð  CHð  gI÷  Jò  JØ�H‰H�O‰OÐFÖGñ Jà
˜Õ
×	'Ñ	'×	)Ò	)ÜÐ:Ö;ä�d�VÐ-Ð.Ô/ßØ�O‰O×!Ñ!¨$¸Ð!Ô>Ø�N‰NÔä˜r×"Õ"Ü—’œ˜X›¨Ô.÷ #ä�~ d V¨5Ð1Ô2ÜÐAÔBØ�GŠG�q�L�GäÐ9Ô:Ø�H‰H�O‰OÐ?Ö@øô' "ô 	=Ø×(Ñ(°)Ð(Ó<‹Gð	=ú÷ #×"ús   ÁF Ä!F>ÆF;Æ:F;Æ>G	c               ó    € V ^8„  d   QhRRRR/# )r   Úcfgr,   r   z(tuple[set, list, object, object, object]r   )r   s   "r   r   r   Ë   s   € ÷ Jñ J˜Tð JÐ&Nñ Jr   c                óÚ  a€ \        4       pR;p;p;rE. p\        R4      ;_uu_ 4        ^ RIHpHp \        VP                  4       4      0 Rm,          pRRR4       \        R4      ;_uu_ 4        ^ RIHp ^ RIH	pH
pHp \        R4      ;_uu_ 4        V! V 4      pRRR4       RRR4       V P                  R4      p	\        V	\        4      '       d0   ^ RIHo VP!                  V3R lV	P#                  4        4       4       Ve   TMR FŸ  p
\        V
\        4      '       d3   \%        V
P                  R	4      ;'       g    R4      P'                  4       MRpV'       g   KW  TP!                  T! T\%        V
P                  R
4      ;'       g    R4      P'                  4       4      4       K¡  	  WW#V3#   + '       g   i     ELg; i  + '       g   i     EL3; i  + '       g   i     EL?; i)zÉReturn (known ids, custom providers, resolve_auth, normalize, resolve_full); any import failure leaves
the matching resolver as None so validation degrades to "unavailable" rather than crashing doctor.Nr4   )ÚPROVIDER_REGISTRYÚresolve_provider)Úget_compatible_custom_providers)Úcustom_provider_aliasesÚnormalize_providerÚresolve_provider_fullÚ	providers)Úis_provider_enabledc              3  óØ   <"  € T F_  w  r\        V4      P                  4       '       g   K&  S! V4      '       g   K6  \        V4      P                  4       P                  4       x € Ka  	  R # 5ir   )r   r5   Úlower)r   r6   Úprov_cfgr¬   s   &  €r   r   Ú&_known_provider_ids.<locals>.<genexpr>Ü   sO   øé € ð MÑE[±>°4Ü˜D›	Ÿ™×)ô /Ù.AÀ(×.Kô /”S˜“Y—_‘_Ó&×,Ñ,×.Ð.ÓE[ùs   ƒ#A*«A*»/A*r6   Úprovider_key>   ÚmoaÚautoÚcustomÚ
openrouterr   )Úsetr   Úhermes_cli.authr¥   r¦   Úkeysr…   r§   Úhermes_cli.providersr¨   r©   rª   r-   r+   r,   r¬   Úupdaterˆ   r   r5   )r£   ÚknownÚresolve_authÚ	normalizeÚresolve_fullÚaliasesÚcustom_providersr¥   r§   Úuser_providersr‹   r6   r¬   s   &           @r   Ú_known_provider_idsrÂ   Ë   s„  ø€ ô “€EØ8<Ð<€LÐ<�9Ð<˜|ØÐÜ	�r×	Õ	ßWÜÐ%×*Ñ*Ó,Ó-Ò0WÕWˆ÷ 
ô 
�r×	Õ	ÝE÷ 	Tñ  	TÜ˜2×ÕÙ>¸sÓCÐ÷ ÷ 
ð
 —W‘W˜[Ó)€NÜ�.¤$×'Ò'Ý9Ø�‰ô MÀ^×EYÑEYÔE[ó Mô 	Mà%,Ò%8Ñ!¸bÒ@ˆÜ7AÀ%Ì×7NÒ7NŒs�5—9‘9˜VÓ$×*Ð*¨Ó+×1Ñ1Ô3ÐTVˆß‰4Ø�L‰L™ ¤s¨5¯9©9°^Ó+D×+JÐ+JÈÓ'K×'QÑ'QÓ'SÓTÖUñ Að  L¸\ÐIÐI÷# 
×	Ð	ú÷ ×Ðú÷ 
×	Ð	ús/   ¨+F1Á.$GÂ	G	ÂGÆ1G	ÇGÇ	GÇG*	c               ó    € V ^8„  d   QhRRRR/# )r   Úruntime_providerr   r   r   r   )r   s   "r   r   r   í   s   € ÷ ñ °ð ¸ñ r   c                ó¸  a€ V R8X  dA   ^ RI Ho \        ;QJ d    V3R lR 4       F  '       g   K   R# 	  R# ! V3R lR 4       4      # ^ RIHpHp VP                  V 4      pV'       dq   \        VRR4      R	8X  d_   V! V 4      ;'       g    / p\        VP                  R
4      ;'       g+    VP                  R4      ;'       g    VP                  R	4      4      # R# )uÑ   Only API-key providers in PROVIDER_REGISTRY are checked â€” OAuth/SDK/custom providers have their own
checks elsewhere, and get_auth_status() returns a bare {logged_in: False} for anything it doesn't dispatch.rµ   )Úget_env_valuec              3  óv   <"  € T F.  p\        S! V4      ;'       g    R 4      P                  4       x € K0  	  R# 5i©r4   N)r   r5   )r   ÚkrÆ   s   & €r   r   Ú,_provider_has_credentials.<locals>.<genexpr>ò   s1   øé € ÐiÑ@h¸1”3‘} QÓ'×-Ð-¨2Ó.×4Ñ4×6Ð6Ó@hùs   ƒ9œ9TF)r¥   Úget_auth_statusÚ	auth_typer4   Úapi_keyÚ
configuredÚ	logged_in)ÚOPENROUTER_API_KEYÚOPENAI_API_KEY)	r…   rÆ   r!   r·   r¥   rË   r-   Úgetattrr   )rÄ   r¥   rË   ÚpconfigÚstatusrÆ   s   &    @r   Ú_provider_has_credentialsrÕ   í   s¯   ø€ ð ˜<Ô'Ý3ß‹sÔiÑ@hÓi�sŒsÐiŠsÐiˆsÔiÑ@hÓiÓiÐißBØ×#Ñ#Ð$4Ó5€Gß”7˜7 K°Ó4¸	ÔAÙ Ð!1Ó2×8Ð8°bˆÜ�F—J‘J˜|Ó,×`Ð`°·
±
¸;Ó0G×`Ð`È6Ï:É:ÐV_ÓK`ÓaÐaÙr   c               ó    € V ^8„  d   QhRRRR/# ©r   rš   Úlistr   rS   r   )r   s   "r   r   r   û   s   € ÷ 6Gñ 6G°ð 6G¸ñ 6Gr   c                ó"  € ^ RI Hp V! V 4      pVP                  R4      ;'       g    / pVP                  R4      ;'       g    RP                  4       pVP	                  4       pVP                  R4      ;'       g    VP                  R4      ;'       g    RP                  4       p\        V4      w  r‰r«p\        V4      pV'       d   V0M	\        4       pVe   TMR% F  p VP                  V! V4      4       K  	  T;ppV'       dn   VR&9  dg   V
e    V
! V4      pVP                  V4       VeE   V! WcP                  R	4      V	4      pVe   VP                  MRpVP                  V0R0,
          4       V'       dc   VR8w  d\   Ve   V'       dP   Wí,          '       gB   V'       d   R
P                  \        V4      4      MRp\        RV R2RV R2RV RV R2V4       \        T;'       g    T;'       g    R4      P                  4       P	                  4       pV\        9   ;'       g    VR8H  ;'       g    VP!                  R4      p\        VP                  R4      ;'       g    R4      P                  4       pVR8X  d'   V'       d   ^ RIHp T;'       g    V! VR4      '       * pV'       dC   RV9   d<   V'       d4   V'       g,   \'        RV RV R2R4       VP)                  RV RV R24       V'       d\   VR'9  dS   ^ RIHp \/        R4      ;_uu_ 4        \1        V4      '       g   \        RV R2R V R!2R"V R#V R$2V4       RRR4       R# R# R#   \         d     EK‰  i ; i  \         d    Tp ELMi ; i  + '       g   i     R# ; i)(zQValidate model.provider / model.default against the provider registry (raw file).©Úread_user_config_rawÚmodelÚproviderr4   ÚdefaultNr³   r´   r«   ú, z(unavailable)zmodel.provider 'z' is not a recognised providerz(known: rJ   z' is unknown. Valid providers: z>. Fix: run 'hermes config set model.provider <valid_provider>'zcustom:Úbase_urlz
openai-api)Úbase_url_host_matcheszapi.openai.comÚ/zmodel.default 'z,' uses a vendor/model slug but provider is 'Ú'z=(vendor-prefixed slugs belong to aggregators like openrouter)z,' is vendor-prefixed but model.provider is 'zH'. Either set model.provider to 'openrouter', or drop the vendor prefix.©r“   z%' is set but no API key is configuredz(add it to z/.env or run 'hermes setup')z#No credentials found for provider 'z7'. Run 'hermes setup' or set the provider's API key in zI/.env, or switch providers with 'hermes config set model.provider <name>'r   >   r³   r´   )r³   r´   )r…   rÛ   r-   r5   r®   rÂ   r¶   Úaddr\   Úidrº   rn   r‡   r   r   Ú_VENDOR_SLUG_PROVIDERSÚ
startswithÚutilsrá   r
   r`   r    r“   r   rÕ   )Úconfig_pathrš   rÛ   r£   Úmodel_sectionÚprovider_rawrÝ   Údefault_modelÚknown_providersrÀ   r¼   r½   r¾   Úvalid_provider_idsÚacceptÚknown_providerrÄ   Úcatalog_providerÚprovider_defÚ
known_listÚ	policy_idÚaccepts_vendor_slugÚmodel_base_urlrá   r“   s   &&                       r   Ú_validate_model_configrø   û   sš  € õ 7Ù
˜{Ó
+€CØ—G‘G˜GÓ$×*Ð*¨€MØ!×%Ñ% jÓ1×7Ð7°R×>Ñ>Ó@€LØ×!Ñ!Ó#€HØ"×&Ñ& yÓ1×UÐU°]×5FÑ5FÀwÓ5O×UÐUÐSU×\Ñ\Ó^€MÜObÐcfÓOgÑL€O |ÀÜ˜_Ó-Ðß#ˆh‰Z¬«€FØ-6Ò-B™/ÈÒJˆð	Ø×"Ñ"¡9¨^Ó#<Ö=ñ Kð
 +3Ð2ÐÐ'ß�HÐ$6Ô6ØÒ#ð,Ù#/°Ó#9Ð Ø—
‘
Ð+Ô,ð Ò#Ù'¨·'±'¸+Ó2FÐHXÓYˆLØ2>Ò2J˜|ŸšÐPTÐØ�M‰MÐ+Ð,°¨vÕ5Ô6ß�H Ô&Ð,<Ò,DÏÐbh×b}Ôb}ß;J�T—Y‘Yœv oÓ6Ô7ÐP_ˆ
ÜÐ*¨<¨.Ð8VÐWÐ[cÐdnÐcoÐopÐYqØ*¨<¨.Ð8WÐXbÐWcð dWð XØY_ô	aô Ð$×>Ð>Ð(8×>Ð>¸BÓ?×EÑEÓG×MÑMÓO€IØ#Ô'=Ñ=×yÐyÀÈhÑAV×yÐyÐZc×ZnÑZnÐoxÓZyÐô ˜×*Ñ*¨:Ó6×<Ð<¸"Ó=×CÑCÓE€NØ�LÔ §^Ý/Ø1×pÐpÑ9NÈ~Ð_oÓ9pÔ5pÐß˜ Ô-·)×DWÜ�_ ] OÐ3_Ð`lÐ_mÐmnÐoØRô	Tà�‰˜¨ Ð6bÐcoÐbpð q^ð ^ô 	_çÐ,Ð4FÔFÝ*Ü˜2×ÕÜ,Ð-=×>Ò>ÜÐ"2Ð3CÐ2DÐDiÐ jØ"-¨d¨VÐ3OÐ PØ"EÐFVÐEWð X.Ø.2¨VÐ3|ð!~ð @FôG÷ Ññ GÑøôA ô 	Ûð	ûô ô ,Ø#+Ó ð,ú÷4 ×Ðús0   Ã MÄM) Ì/M=ÍM&Í%M&Í)M:Í9M:Í=N	c               ó    € V ^8„  d   QhRRRR/# r×   r   )r   s   "r   r   r   4  s   € ÷ Fñ F°Dð F¸Tñ Fr   c                óê  a€ ^ RI Hp ^ RIHp ^ RIHp V! V 4      P                  R4      p\        V\        4      '       d   VP                  4       MR UUu/ uFf  w  rg\        V\        4      '       g   K  \        VP                  R4      ;'       g    R4      P                  4       P                  4       R9  g   Kd  WgbKh  	  ppp. p	\        VP                  4       4       Fâ  w  p
oV3R lR 4       w  r¼rÞ V! W¼WíR
7      pTP                  R	4      '       gR   TP                  R4      '       g;   \#        RT
 RT R2RTP                  R4       RTP                  R4       R24       Kˆ  T	P%                  T
 RTP                  R4       RT! \        TP                  R4      ;'       g    R4      4      ;'       g    R 24       Kä  	  V	'       d$   \'        RRP)                  V	4      ,           4       R# R# u uppi   \         do   p\        RT
 RT R2R\        T4      P!                  4       ^ ,           R2RT
 RT R\        T4      P!                  4       ^ ,           RT
 R2	T4        Rp?EK�  Rp?ii ; i)uÐ   Resolve every routed ``auxiliary.<task>`` block through the real entry point the tasks use and report
the ones that fail â€” an unresolvable block otherwise silently runs the task on the main model (#116055).rÚ   )Úresolve_runtime_provider)Úbase_url_hostnameÚ	auxiliaryrÝ   r4   c              3  óœ   <"  € T FA  p\        SP                  V4      ;'       g    R 4      P                  4       ;'       g    Rx € KC  	  R# 5irÈ   )r   r-   r5   )r   rÉ   Úblocks   & €r   r   Ú-_validate_auxiliary_config.<locals>.<genexpr>?  sI   øé € ð  .Mñ  `LÐZ[¬c°%·)±)¸A³,×2DÐ2DÀ"Ó.E×.KÑ.KÓ.M×.UÐ.UÐQUÔ.Uó  `Lùs   ƒ!A¥AÁArà   rÍ   )Ú	requestedÚtarget_modelÚexplicit_api_keyÚexplicit_base_urlz
auxiliary.z.provider 'z' does not resolverI   rJ   z' cannot be resolved (z\); the task silently runs on the main model. Fix the provider name/credentials in auxiliary.r*   NÚcommandz' resolved without credentialsz @ u   â†’Ú@Ú?z!auxiliary task routing resolves: rß   r   )r4   r³   )rÝ   rÜ   rà   rÍ   )r…   rÛ   Úhermes_cli.runtime_providerrû   ré   rü   r-   r+   r,   rˆ   r   r5   r®   r‡   r\   r   ro   r
   r`   r	   rn   )rê   rš   rÛ   rû   rü   Úauxr6   rÿ   ÚroutedÚokÚtaskrÝ   rÜ   rà   rÍ   Úruntimere   s   &&     `         r   Ú_validate_auxiliary_configr  4  s‰  ø€ õ 7ÝDÝ'Ù
˜{Ó
+×
/Ñ
/°Ó
<€CÜ=GÈÌT×=RÒ=R¨c¯i©i¬kÐXZÐ.Zô sÑ.Z™k˜dÜ˜E¤4×(ô Ü-0°·±¸:Ó1F×1LÐ1LÈ"Ó-M×-SÑ-SÓ-U×-[Ñ-[Ó-]ÐeqÑ-qô ˆdŠkÑ.Z€Fñ sà	€BÜ˜fŸl™l›nÖ-‰ˆˆeô .Mñ  `Ló  .MÑ*ˆ˜ð	Ù.¸Ðhoô  MˆGð �{‰{˜9×%Ò%¨g¯k©k¸)×.DÒ.DÜ˜ D 6¨°X°JÐ>\Ð]ÐabÐcj×cnÑcnÐoyÓczÐb{Ð{~ð  @G÷  @Kñ  @Kð  LVó  @Wð  Xð  XYð  `Zô  [ÙØ
�	‰	�T�F˜#˜gŸk™k¨*Ó5Ð6°aÑ8IÌ#ÈgÏkÉkÐZdÓNe×NkÐNkÐikÓJlÓ8m×8tÐ8tÐqtÐ7uÐvÖwñ .÷ 
ÜÐ4°t·y±yÀ³}ÕDÖEñ 
ùó!søô ô 	Ü˜j¨¨¨k¸(¸ÐCUÐVÐZ[Ô\_Ð`cÓ\d×\oÑ\oÓ\qÐrsÕ\tÐ[uÐuvÐXwØ(¨¨¨k¸(¸ÐCYÔZ]Ð^aÓZb×ZmÑZmÓZoÐpqÕZrÐYsð toØosÐntÐtuðwØx~ô@ö ûð		ús1   ÁG3Á5G3Â%G3Â<G3Ã6
G9Ç9I2ÈA"I-É-I2c               ó$   € V ^8„  d   QhRRRRRR/# rP   r   )r   s   "r   r   r   P  s&   € ÷ @ñ @ 4ð @¨Gð @¸ñ @r   c                óœ  € ^ RI HpHpHp VR,          pVP	                  4       '       ds   \        V R24       \        R4      ;_uu_ 4        \        WQP                  4       RRR4       \        R4      ;_uu_ 4        \        WQP                  4       RRR4       R# VR,          P	                  4       '       d   \        R4       R# V '       dL   ^ R	I
Hp V! WSR
,          4      p\        RT RV'       d   R
MR 24       V;P                  ^,          un        R# \        RR4       R#   + '       g   i     LÎ; i  + '       g   i     R# ; i)zVconfig.yaml presence (project cli-config.yaml as fallback); model/provider validation.r�   úconfig.yamlz/config.yaml existsz(Could not validate model/provider configNz)Could not validate auxiliary task routingzcli-config.yamlz-cli-config.yaml exists (in project directory))Úseed_config_filezcli-config.yaml.examplezCreated z/config.yaml from Údefaultszconfig.yaml not foundz(using defaults))r    r‘   r’   r“   r—   r	   r   rø   rš   r  r…   r  rŸ   r
   )rQ   rR   r‘   r’   r“   rê   r  Úfrom_templates   &&      r   Ú_check_config_filer  O  sò   € ÷ BÑAØ Õ-€KØ×Ñ×ÒÜ�D�6Ð,Ð-Ô.ÜÐE×FÕFÜ" ;·±Ô9÷ GäÐF×GÕGÜ& {·H±HÔ=÷ HÑGà
Ð*Õ
*×	2Ñ	2×	4Ò	4ÜÐ@ÖAß	Ý6Ù(¨ÐE^Õ6^Ó_ˆÜ�8˜D˜6Ð!3×Q^Ñ4MÐdnÐ3oÐpÔqØ	�Š�1��äÐ*Ð,>Ö?÷ G×FúçG×GÐGús   ÁD'Á<D:Ä'D7	Ä:E	c               ó$   € V ^8„  d   QhRRRRRR/# ©r   rR   r   rQ   r   r   rS   r   )r   s   "r   r   r   e  s&   € ÷ @ñ @˜Wð @°$ð @Èñ @r   c                ó   € ^ RI HpHp V! 4       w  rVRV RV R2R3p\        WV8¬  RV R2V4      '       d   R# V'       g   V P                  P                  R4       R#  V! R	R	R
7       \        R4       V ;P                  ^,          un        R#   \         d5   p\        RT 24       T P                  P                  R4        Rp?R# Rp?ii ; i)é    )Úcheck_config_versionÚmigrate_configzConfig version outdated (vu    â†’ vrJ   z(new settings available)zConfig version up to date (vNz=Run 'hermes doctor --fix' or 'hermes setup' to migrate configF)ÚinteractiveÚquietz!Config migrated to latest versionzAuto-migration failed: z$Run 'hermes setup' to migrate config)
r…   r  r  r   rš   r`   r	   rŸ   r\   r
   )	rR   rQ   rê   r  r  Úcurrent_verÚ
latest_verÚoutdatedÚmig_errs	   &&&      r   Ú_drift_config_versionr"  e  s¾   € ßFÙ2Ó4Ñ€KØ,¨[¨M¸À
¸|È1ÐMÐOiÐj€HÜ�+Ñ+Ð/KÈKÈ=ÐXYÐ-ZÐ\d×eÒeÙßØ	�‰�‰ÐWÔXÙð@Ù 5°Õ6ÜÐ4Ô5Ø	�Š�1��øÜô @ÜÐ,¨W¨IÐ6Ô7Ø	�‰�‰Ð>×?Ò?ûð@ús   Á.B ÂCÂ)CÃCc               ó$   € V ^8„  d   QhRRRRRR/# r  r   )r   s   "r   r   r   w  s!   € ÷ ñ ˜gð °4ð Èñ r   c                óÔ  € ^ RI HpHp V! V4      pR
 Uu. uF+  qfV9   g   K  \        WV,          \        4      '       g   K)  VNK-  	  ppV'       g   R# \        RRP                  V4       2R4       V'       g   V P                  P                  R4       R# VP                  R4      p\        V\        4      '       gE   \        V\        4      '       d)   VP                  4       '       d   RVP                  4       /M/ ;q…R&   V F1  pVP                  V4      p	VP                  V4      '       d   K-  W˜V&   K3  	  V! W%4       \        R	4       V ;P                  ^,          un        R# u upi )zSRoot-level ``provider``/``base_url`` belong under ``model:`` (raw-file diagnostic).)Úatomic_config_replacerÛ   NzStale root-level config keys: rß   z"(should be under 'model:' section)uO   Stale root-level provider/base_url in config.yaml â€” run 'hermes doctor --fix'rÜ   rÞ   z1Migrated stale root-level keys into model section)rÝ   rà   )r…   r%  rÛ   r+   r   r
   rn   rš   r`   r-   r,   r5   Úpopr	   rŸ   )
rR   rQ   rê   r%  rÛ   r&   rÉ   Ústale_root_keysÚ	raw_modelÚvalues
   &&&       r   Ú_drift_stale_root_keysr*  w  s%  € çMÙ% kÓ2€JÙ":ÓqÑ":˜QÀ:¹o”qÔR\Ð]gÕ]jÔlo×Rp—q�qÑ":€OÐqßÙÜÐ/°·	±	¸/Ó0JÐ/KÐLÐNrÔsßØ	�‰�‰ÐiÔjÙà—‘˜wÓ'€IÜ�i¤×&Ò&ÜLVÐW`Ôbe×LfÒLfÐkt×kzÑkz×k|Òk|¨9°i·o±oÓ6GÑ*Hð  CEð  	Eˆ	˜wÑ'ÛˆØ—‘˜qÓ!ˆØ�}‰}˜Q×ÔØ �a‹Lñ ñ ˜+Ô2ÜÐ@ÔAØ‡G‚Gˆq…L‡Gùò# rs   •E%¢E%Á E%c               ó$   € V ^8„  d   QhRRRRRR/# r  r   )r   s   "r   r   r   �  s&   € ÷  Uñ  U 7ð  U¸ð  UÈdñ  Ur   c                ó²  € ^ RI Hp ^ RIHpHpHp V! V4      pVP                  R4      p\        V\        4      '       d   VP                  R4      MRp	V	f   VP                  R4      p	V! 4       P                  R4      p
V	e:   V
e6   \        V	4      P                  4       \        V
4      P                  4       8X  d   R# \        RV
 RV	 R	2R
4       V'       g   V P                  P                  R4       R# V! R4      '       d+   \        RV	 R24       V ;P                  ^,          un        R# \        R4       V P                   P                  RV R24       R# )a€  A stale HERMES_MAX_ITERATIONS in .env shadows agent.max_turns in config.yaml.

The setup wizard used to dual-write the budget. The gateway bridge derives HERMES_MAX_ITERATIONS from
agent.max_turns, but if it bails on an earlier config-parse error the .env value silently wins. Read the
.env FILE (load_env), not get_env_value/os.environ, which the bridge may have overridden already.
rä   )Úload_envrÛ   Úremove_env_valueÚagentÚ	max_turnsNÚHERMES_MAX_ITERATIONSzHERMES_MAX_ITERATIONS=z! in .env shadows agent.max_turns=z in config.yamlz0(stale ghost from an earlier `hermes setup` run)uU   Stale HERMES_MAX_ITERATIONS in .env shadows config.yaml â€” run 'hermes doctor --fix'zKRemoved stale HERMES_MAX_ITERATIONS from .env (config.yaml agent.max_turns=z is now authoritative)z0Could not remove HERMES_MAX_ITERATIONS from .envz4Manually delete the HERMES_MAX_ITERATIONS line from u7   /.env â€” config.yaml agent.max_turns is authoritative.)r    r“   r…   r-  rÛ   r.  r-   r+   r,   r   r5   r
   rš   r`   r	   rŸ   r_   )rR   rQ   rê   r“   r-  rÛ   r.  r&   Ú	agent_cfgÚcfg_max_turnsÚ	env_ghosts   &&&        r   Ú_drift_max_iterations_ghostr5  �  s=  € õ '÷ SÑRÙ% kÓ2€JØ—‘˜wÓ'€IÜ2<¸YÌ×2MÒ2M�I—M‘M +Ô.ÐSW€MØÒØ"Ÿ™ {Ó3ˆÙ“
—‘Ð6Ó7€IØÒ 	Ò 1´S¸Ó5G×5MÑ5MÓ5OÔSVÐW`ÓSa×SgÑSgÓSiÔ5iÙÜÐ'¨	 {Ð2SÐTaÐSbÐbqÐrØAôCçØ	�‰�‰ÐoÖpÙ	Ð1×	2Ò	2ÜÐ^Ð_lÐ^mð  nDð  Eô  	FØ	�Š�1��äÐEÔFØ	�‰×ÑÐ!UÐVZÐU[ð  \Sð   Tö  	Ur   c               ó$   € V ^8„  d   QhRRRRRR/# r  r   )r   s   "r   r   r   ²  s!   € ÷ /ñ /˜7ð /°ð /Àdñ /r   c                ó¸   € ^ RI HpHp Ve	   V! V4      M/ p/ p\        R4      ;_uu_ 4        V! 4       pRRR4       \	        WV4       R#   + '       g   i     L; i)z`Warn-only deprecation sweep over the raw file + on-disk .env (process env would false-positive).)r-  rÛ   Nr4   )r…   r-  rÛ   r   rN   )rR   rQ   rê   r-  rÛ   ÚrawÚenvs   &&&    r   Ú_drift_deprecationsr:  ²  sD   € ç@Ø/:Ò/FÑ
˜{Ô
+ÈB€CØ
€CÜ	�r×	Õ	Ù‹jˆ÷ 
ä$ SÖ.÷ 
×	ús   ¬A	Á	A	c               ó$   € V ^8„  d   QhRRRRRR/# r  r   )r   s   "r   r   r   ¼  s!   € ÷ $ñ $˜ð $¨Tð $À4ñ $r   c                óX  € ^ RI Hp V! 4       pV'       g   R# \        R4       V F�  pVP                  R8X  d   \        M\
        ! VP                  4       VP                  P                  4        F  p\        V4       K  	  V P                  P                  VP                  4       Kƒ  	  R# )z9Structural validation (malformed custom_providers, etc.).)Úvalidate_config_structureNzConfig StructureÚerror)r…   r=  r   Úseverityr   r
   ÚmessageÚhintro   r   rš   r`   )rR   rQ   rê   r=  Úconfig_issuesÚciÚ	hint_lines   &&&    r   Ú_drift_structurerE  ¼  su   € å;Ù-Ó/€MßÙÜÐÔ ÛˆØ—{‘{ gÔ-�´:Ð	=¸r¿z¹zÔJØŸ™×+Ñ+Ö-ˆIÜ�yÖ!ñ .à	�‰�‰˜Ÿ
™
Ö#ó	 r   c               ó    € V ^8„  d   QhRRRR/# )r   r‹   r,   r   r   r   )r   s   "r   r   r   Ê  s   € ÷ 0ñ 0˜ð 0 #ñ 0r   c                ó  € V P                  R4      ;'       g5    V P                  R4      ;'       g    V P                  R4      ;'       g    Rp\        V4      P                  4       P                  R4      P	                  4       # )zjComparable endpoint URL of a legacy list entry (``base_url``/``url``) or a ``providers:`` entry (``api``).Úapirà   Úurlr4   râ   )r-   r   r5   Úrstripr®   )r‹   rI  s   & r   Ú_endpoint_urlrK  Ê  s_   € à
�)‰)�EÓ
×
MÐ
M˜eŸi™i¨
Ó3×
MÐ
M°u·y±yÀÓ7G×
MÐ
MÈ2€CÜˆs‹8�>‰>Ó×"Ñ" 3Ó'×-Ñ-Ó/Ð/r   c               ó$   € V ^8„  d   QhRRRRRR/# r  r   )r   s   "r   r   r   Ð  s'   € ÷ }ñ } gð }¸4ð }ÐQUñ }r   c           	     óÔ  € ^ RI Hp V! V4      pVP                  R4      p\        V\        4      '       g   R# VP                  R4      p\        V\
        4      '       d   VP                  4       MR Uu0 uF&  p\        V\
        4      '       g   K  \        V4      kK(  	  ppV F¼  p	\        V	\
        4      '       d"   \        V	4      '       d   \        V	4      V9   d   K<  \        V	P                  R4      ;'       g    R4      P                  4       ;'       g    \        V	4      p
\        RV
 R2R	4       V P                  P                  R
V
 R\        V	4       R24       K¾  	  R# u upi )u�  Legacy ``custom_providers`` list entries with no ``providers:`` twin (raw-file diagnostic).

The v11â†’v12 migration (config_migrations._migrate_to_12) moves the list into ``providers:`` ONCE, at
the version bump; an entry hand-written afterwards lives on in the retired list store (dual-read by the
picker and the Custom Endpoints page) instead of the ``providers:`` map every other surface edits.
rÚ   rÀ   Nr«   r6   r4   zLegacy custom_providers entry 'z' has no providers: twinzN(still read from the retired list store; every other surface edits providers:)zMove custom_providers entry 'z7' into config.yaml providers: as `providers.<key>.api: uV   ` and delete it from the list â€” the v12 list migration ran once and does not re-firer   )r…   rÛ   r-   r+   rØ   r,   ÚvaluesrK  r   r5   r
   r_   r`   )rR   rQ   rê   rÛ   r&   rM   r«   ÚeÚtwinsr‹   Úlabels   &&&        r   Ú_drift_legacy_custom_providersrR  Ð  s7  € õ 7Ù% kÓ2€JØ�^‰^Ð.Ó/€FÜ�fœd×#Ò#ÙØ—‘˜{Ó+€IÜ>HÈÔTX×>YÒ>Y¨	×(8Ñ(8Ô(:Ð_aÐ(aÓzÑ(a !ÔfpÐqrÔtx×fyÔŒ]˜1ÖÑ(a€EÐzÛˆÜ˜%¤×&Ò&¬m¸E×.BÒ.BÄmÐTYÓFZÐ^cÔFcÙÜ�E—I‘I˜fÓ%×+Ð+¨Ó,×2Ñ2Ó4×LÐL¼ÀeÓ8LˆÜÐ4°U°GÐ;SÐTØcô	eà	�‰×ÑØ+¨E¨7Ð2iÜ˜UÓ#Ð$Ð$zð|ö	}ó ùò {s   Á3E%ÂE%c               ó   € V ^8„  d   QhRR/# ri   r   )r   s   "r   r   r   ï  s   € ÷ =ñ = tñ =r   c                 óp  €  ^ RI Hp  ^ RIHp T! V ! 4       ;'       g    / 4      pT'       g   R# T FX  w  rEpTP                  R4      ;'       g    RpTR	8X  d   R
T R2pMTR8X  d   RT RT R2pM	RT RT R2p\        RT 2T4       KZ  	  R#   \         d   p\        RRT R24        Rp?R# Rp?ii ; i)a§  Stale per-install channel records (``update.installs.<sha16>``).

Same report-don't-delete posture as the state sweep. Three shapes
(hermes_cli.update_channel.stale_channel_records): a record whose path
holds a DIFFERENT install now (``replaced``), a record whose path is
gone (``missing``), and a record no live install-state folder claims
(``unclaimed``). Keep-on-doubt: doctor names the config key, the user
removes it.
r�   )Ústale_channel_recordsz!Channel-record hygiene unreadablerI   rJ   NÚpathz	<no path>Úreplacedz(the install at u4    is a different install now â€” stale channel entry)Úmissingz(nothing at u$    â€” safe to remove update.installs.z(no live install claims zStale channel record: )r…   r‚   Úhermes_cli.update_channelrU  r\   r
   r-   )	r‚   rU  Ústalere   Úsha16ÚrecordÚreasonÚrecordedÚdetails	            r   Ú_check_channel_record_hygiener`  ï  s×   € ðÝ1ÝCá%¡k£m×&9Ð&9°rÓ:ˆ÷ ÙÛ!&Ñˆ�vØ—:‘:˜fÓ%×4Ð4¨ˆØ�ZÔØ'¨ zÐ1eÐf‰FØ�yÔ Ø# H :Ð-QÐRWÐQXÐXYÐZ‰Fà/°¨wÐ6ZÐ[`ÐZaÐabÐcˆFÜÐ+¨E¨7Ð3°VÖ<ó "'øô ô ÜÐ6¸!¸C¸5À¸
ÔCÝûðús   ‚B žB ÂB5ÂB0Â0B5c               ó$   € V ^8„  d   QhRRRRRR/# rP   r   )r   s   "r   r   r     s!   € ÷ $ñ $ Dð $¨Wð $¸ñ $r   c                ó  € ^ RI Hp VR,          pVP                  4       '       g   RpV'       d   \        M\        3 F(  p\        R4      ;_uu_ 4        V! WV4       RRR4       K*  	  \        4        R#   + '       g   i     KI  ; i)z©Config version, stale root keys, HERMES_MAX_ITERATIONS ghost, deprecations, structure.

Each step is independent and best-effort: a failure in one never hides the next.
)r‘   r  Nr4   )r    r‘   r—   Ú_CONFIG_DRIFT_STEPSr:  r   r`  )rQ   rR   r‘   rê   Ústeps   &&   r   Ú_check_config_driftre    sm   € õ .Ø Õ-€KØ×Ñ×ÒØˆß'2Õ#Ô9LÐ8NÒNˆÜ˜2×ÕÙ� Ô,÷ Ññ Oô
 "Ö#÷	 ×Ðús   Á
A5Á5BzxAI retirement check skippedz({e})c               ó$   € V ^8„  d   QhRRRRRR/# rP   r   )r   s   "r   r   r   !  s&   € ÷ 
Fñ 
F dð 
F¨wð 
F¸4ñ 
Fr   c                ó  € ^ RI Hp ^ RIHpHpHp V! V! 4       4      pV'       g   \        R4       R# V F  p\        V! V4      4       K  	  \        RV 24       VP                  P                  R\        V4       RV 24       R# )r  r�   )ÚMIGRATION_GUIDE_URLÚfind_retired_xai_refsÚformat_issuezNo retired xAI models in configNzMigration guide: zUpdate u7    retired xAI model reference(s) in config.yaml â€” see )r…   r‚   Úhermes_cli.xai_retirementrh  ri  rj  r	   r
   r   r_   r`   rx   )rQ   rR   r‚   rh  ri  rj  Úretired_refsÚrefs   &&      r   Ú_check_xai_retirementrn     s…   € å-ßbÑbÙ(©«Ó7€LßÜÐ2Ô3ÙÛˆÜ‘< Ó$Ö%ñ äÐ"Ð#6Ð"7Ð8Ô9Ø‡O�O×Ñ˜W¤S¨Ó%6Ð$7Ð7nð  pCð  oDð  Eö  Fr   zSession reset check skippedc               ó$   € V ^8„  d   QhRRRRRR/# rP   r   )r   s   "r   r   r   /  s!   € ÷ 
6ñ 
6¨Tð 
6°gð 
6À$ñ 
6r   c                ó  € ^ RI Hp ^ RIHpHpHp V! V! 4       4      pVf   \        R4       R# V! 4       '       d"   \        V^ ,           RV^,           R24       R# \        V! V!  4       VP                  P                  V! V!  4       R# )r  )Úload_user_config_effective)Úformat_noticeÚreset_plugin_enabledÚretired_reset_policyNz-No idle/daily session_reset policy configuredz.mode: z' is applied by the session reset plugin)
Úhermes_cli.config_effectiverq  Ú#hermes_cli.session_reset_retirementrr  rs  rt  r	   r
   r_   r`   )rQ   rR   rq  rr  rs  rt  Úfounds   &&     r   Ú_check_retired_session_resetrx  .  sr   € åFßmÑmÙ Ñ!;Ó!=Ó>€EØ‚}ÜÐ@ÖAÙ	×	Ò	Ü�E˜!•H�:˜W U¨1¥X JÐ.UÐVÖWä‘= %Ñ(Ô)Ø	�‰×Ñ™}¨eÑ4Ö5r   ))ÚdisplayÚtool_progress_overrideszdisplay.platforms)Ú
delegationÚmax_async_childrenz"delegation.max_concurrent_children)ÚcompressionÚsummary_modelúauxiliary.compression)r}  Úsummary_providerr  )r}  Úsummary_base_urlr  ))ÚHERMES_TOOL_PROGRESSuS   display.tool_progress in config.yaml â€” ignored/unsupported since config floor v12)ÚHERMES_TOOL_PROGRESS_MODEz$display.tool_progress in config.yaml)ÚTERMINAL_CWDúterminal.cwd in config.yaml)ÚMESSAGING_CWDr…  )ÚQQ_HOME_CHANNELÚQQBOT_HOME_CHANNEL)ÚQQ_HOME_CHANNEL_NAMEÚQQBOT_HOME_CHANNEL_NAME)NN>   r³   ÚnousÚnvidiaÚkilocodeÚlmstudioÚ	deepinfraÚ	fireworksrµ   Úhuggingfaceú
ai-gatewayúopencode-zen)/Ú__conditional_annotations__Ú__doc__Ú
__future__r   rB   Úhermes_cli.doctor_reportr   r   r   r   r   r   r	   r
   r   r   r"   r#   Ú__annotations__r$   r0   r7   rF   rN   rg   r]   r~   r�   r¡   rÂ   rç   rÕ   rø   r  r  r"  r*  r5  r:  rE  rK  rR  rc  r`  re  rn  rx  )r”  s   @r   Ú<module>r™     sˆ  øðô*õ #ã 	÷÷ ÷ õ>ð=Ð Ð9ó ð5Ð Ð1ó õYõSõ÷0ñ$ Ð.Ó/ôSó 0ðSõ>eõLñ Ð.Ó/ô5ó 0ð5ñ" ƒôAó ðAõ@Jò8Ð õõ6GõrFñ6 ƒô@ó ð@õ*@õ$õ0 UõF/õ$õ0õ}ð4 Ð1Ð3NÐPcÐeuØ"ðÐ õ=ñ> ƒô$ó ð$ñ" Ð,¨gÓ6ô
Fó 7ð
Fñ Ð+¨WÓ5ô
6ó 6ò
6r   