+
    jHàjf&  ã                   óª  € R t ^ RIt^ RIt^ RIHtHtHt ^ RIHt ^ RI	H
t
 ]! 4       t]! 4       t]
! 4       t]! 4       t]! ]P                  ]R,          R7       ^ RIHtHt ^ RIHtHtHtHtHtHt ^ R	IHtHtHt ^ R
IHt ^ RI H!t!H"t"H#t#H$t$H%t%H&t&H't' ^ RI(H)t)H*t*H+t+H,t,H-t-H.t.H/t/ ^ RIH0t0H1t1H2t2H3t3H4t4 ^ RI5H6t6H7t7H8t8H9t9H:t:H;t;H<t< R*t=]! 4       R R l4       t>R+R R llt?]! 4       R R l4       t@R].3R]$3R],3R])3R]-3R]/3R]#3R]"3R]!3R]&3R]'3R]>3R]83R]<3R]73R]63R]+3R]*3R]03R]33R]13R]23R ]@3R!]43R"];3R#]93R$]%3R]:33tAR% R& ltBR' R( ltCR) tDR# ),uæ   ``hermes doctor`` â€” diagnose (and with --fix, repair) a Hermes install.

``run_doctor`` walks ``DOCTOR_CHECKS`` in order; each check prints its own rows and returns a ``Finding``.
Check bodies live in the ``doctor_*`` siblings.
N)Úget_env_pathÚget_hermes_homeÚget_project_root)Úload_hermes_dotenv)Údisplay_hermes_homez.env)Úhermes_homeÚproject_env)ÚColorsÚcolor)ÚFindingÚ_sectionÚ
check_boolÚ
check_infoÚdoctor_checkÚwarn_on_error)Ú/_has_healthy_oauth_fallback_for_apikey_providerÚbuild_probesÚ
run_probes)Ú_safe_which)Ú_check_config_driftÚ_check_config_fileÚ_check_env_fileÚ_check_mcp_securityÚ_check_relay_pluginsÚ_check_xai_retirementÚ_check_retired_session_reset)Ú_check_certificatesÚ_check_command_installationÚ_check_gateway_supervisionÚ_check_python_environmentÚ_check_required_packagesÚ_check_security_advisoriesÚ_check_web_dashboard_import)Ú_check_git_and_rgÚ_check_node_and_browserÚ_check_npm_auditÚ_check_terminal_backendÚ_check_tool_availability)Ú_check_checkpoint_storeÚ_check_cron_storeÚ_check_directory_structureÚ_check_memory_providerÚ_check_profilesÚ_check_skills_hubÚ_check_state_dbc                ó4   € V ^8„  d   QhR\         R\        RR/# ©é   Ú
should_fixÚfÚreturnN©Úboolr   )Úformats   "Ú6/home/ubuntu/.hermes/hermes-agent/hermes_cli/doctor.pyÚ__annotate__r9   H   s&   € ÷ Tñ T¤dð T¬wð T¸4ñ Tó    c                óü  € \        RR4      ;_uu_ 4        ^ RIHpHpHp \        RV! 4       4       \        RV! 4       RR7      '       g   \        R4      '       g   \        R	4       V! 4       p\        R
VRVP                  RR4       R24       RRR4       \        R4      ;_uu_ 4        ^ RIH	p \        RV! 4       ;'       g    / RR7       RRR4       R#   + '       g   i     LQ; i  + '       g   i     R# ; i)zORefresh-free OAuth status snapshot (doctor must never trigger a token refresh).zAuth provider statusz(could not check: {e}))Úget_nous_auth_status_localÚget_codex_auth_statusÚget_minimax_oauth_auth_statuszNous Portal authzOpenAI Codex authT)Ú
show_errorÚcodexuf   codex CLI not installed (optional â€” only required to import tokens from an existing Codex CLI login)zMiniMax OAuthz(logged in, region=ÚregionÚglobalÚ)NÚ )Úget_xai_oauth_auth_statusz	xAI OAuth)
r   Úhermes_cli.authr<   r=   r>   Ú
_login_rowr   r   ÚgetrE   )r2   r3   r<   r=   r>   Úminimax_statusrE   s   &&     r8   Ú_check_auth_providersrJ   G   sÒ   € ô 
Ð-Ð/G×	HÕ	HßtÑtÜÐ%Ñ'AÓ'CÔDô Ð-Ñ/DÓ/FÐSW×XÓXÔalÐmt×auÒauÜÐô  AÙ6Ó8ˆÜ�? NÐ6IÈ.×J\ÑJ\Ð]eÐgoÓJpÐIqÐqrÐ4sÔt÷ 
Iô 
�r×	Õ	Ý=Ü�;Ñ 9Ó ;× AÐ A¸rÈdÕS÷ 
Ñ	÷ 
I×	Hú÷ 
×	Ð	ús   •A9CÂ)$C*ÃC'	Ã*C;	c          
      óT   € V ^8„  d   QhR\         R\        R\         R\        R\        /# )r1   ÚlabelÚstatusÚ	ok_detailr?   r4   )ÚstrÚdictr6   )r7   s   "r8   r9   r9   X   s1   € ÷ ñ ”cð ¤4ð ´Cð ÔUYð Ôfjñ r:   c                ó¶   € \        VP                  R4      W3V R34      pV'       g2   V'       d*   VP                  R4      '       d   \        VR,          4       V# )zkok/warn row for an OAuth status dict; with show_error, its ``error`` hint prints under a not-logged-in row.Ú	logged_inz(not logged in)Úerror)r   rH   r   )rL   rM   rN   r?   rR   s   &&&& r8   rG   rG   X   sG   € ä˜6Ÿ:™: kÓ2°UÐ4FÈÐPaÐHbÓc€IßŸ¨¯
©
°7×(;Ò(;Ü�6˜'•?Ô#ØÐr:   c                ó4   € V ^8„  d   QhR\         R\        RR/# r0   r5   )r7   s   "r8   r9   r9   a   s!   € ÷ &ñ &¬ð &´ð &¸Tñ &r:   c           	     óê  € \        4       p\        R\        R\        V4       R2\        P
                  4       2RRR7       \        V4      p\        R
RR7       V F”  pVP                   F+  w  rVp\        RV RV 2V'       d   RV 2MR,           4       K-  	  VP                  '       g   KR  \        VP                  4      '       d   Ko  VP                  P                  VP                  4       K–  	  R	# )z\Parallel HTTP/SDK probes for every configured provider; results printed in submission order.ú  zRunning u#    connectivity checks in parallelâ€¦rD   T)ÚendÚflushÚ ©rW   NzH                                                                      )r   Úprintr
   Úlenr	   ÚDIMr   ÚlinesÚissuesr   rL   Úextend)r2   r3   ÚprobesÚresultsÚrÚglyphrL   Údetails   &&      r8   Ú_check_api_connectivityrf   `   s¿   € ô ‹^€Fä	ˆBŒu�x¤ F£˜}Ð,OÐPÔRX×R\ÑR\Ó]Ð^Ð
_ÐegÐosÕtÜ˜Ó €GÜ	Ð
  bÕ)ÛˆØ$%§G¤GÑ ˆE˜&Ü�B�u�g˜Q˜u˜gÐ&¿&¨A¨f¨X©,ÀbÕIÖJñ %,à�8�8Š8ÔKÈAÏGÉG×TÔTØ�H‰H�O‰O˜AŸH™HÖ%ó	 r:   zSecurity AdvisorieszMCP Server SecurityzPython EnvironmentzSSL / CA CertificateszRequired PackageszConfiguration Filesz#xAI Model Retirement (May 15, 2026)z*Session Reset (timers removed Sep 7, 2026)zAuth ProviderszDirectory StructurezExternal ToolszAPI ConnectivityzTool Availabilityz
Skills HubzMemory ProviderzNeMo Relay Pluginsc                ó(   € V ^8„  d   QhR\         RR/# )r1   Ú
ack_targetr4   N)rO   )r7   s   "r8   r9   r9   „   s   € ÷ ñ œcð  dñ r:   c                ó   € ^ RI HpHp V Uu0 uF  q3P                  kK  	  ppW9  dc   \	        \        RV : RRP                  \        V4      4      ;'       g    R 2\        P                  4      4       \        P                  ! ^4       V! V 4      '       d*   \	        \        RV  R2\        P                  4      4       R# \	        \        RV  R	\         R
V  R2\        P                  4      4       \        P                  ! ^4       R# u upi )zS`hermes doctor --ack <id>`: persist the ack and return without running diagnostics.)Ú
ADVISORIESÚack_advisoryzUnknown advisory ID: z. Known IDs: z, z(none)u     âœ“ Acknowledged advisory z,. It will no longer trigger startup banners.u-     âœ— Could not save the acknowledgement for z. Make sure zh/config.yaml is writable (`hermes config path` prints the exact file), then re-run `hermes doctor --ack z`.N)Úhermes_cli.security_advisoriesrj   rk   Úidr[   r
   ÚjoinÚsortedr	   ÚREDÚsysÚexitÚGREENÚ_DHH)rh   rj   rk   ÚaÚ	valid_idss   &    r8   Ú_ack_advisoryrw   „   sá   € çGÙ)Ó*™z˜!—”™z€IÐ*ØÔ"ÜŒeÐ+¨J©>¸ÀtÇyÁyÔQWÐXaÓQbÓGc×GoÐGoÐgoÐFpÐqÔsy×s}Ñs}Ó~ÔÜ�Š�ŒÙ�J×ÒÜŒeÐ2°:°,Ð>jÐkÔms×myÑmyÓzÖ{äŒeÐCÀJÀ<È|Ô\`Ð[að b,à,6¨<°rð;ä<B¿J¹JóHô 	Iô 	�Š�Žùò +s   �Dc                ó4   € V ^8„  d   QhR\         R\        RR/# )r1   r2   Útotalr4   Nr5   )r7   s   "r8   r9   r9   ”   s!   € ÷ ñ œtð ¬Gð ¸ñ r:   c                 óœ  € \        4        VP                  VP                  ,           pR P                  R \	        V^4       4       4      pV '       dß   VP
                  ^ 8”  dÎ   \        \        R\        P                  4      4       \        \        RVP
                   R2\        P                  \        P                  4      R R7       \        V'       d7   \        R\        V4       R2\        P                  \        P                  4      MR 4       \        4        V'       d   \        V4       EMV'       d¶   \        \        R\        P                  4      4       \        \        R\        V4       R2\        P                  \        P                  4      4       \        4        \        V4       V '       g6   VP                  '       d$   \        \        R	\        P                  4      4       MU\        \        R\        P                  4      4       \        \        R
\        P                  \        P                  4      4       \        4        R# )rD   c              3   ó8   "  € T F  w  rR V RV R2x € K  	  R# 5i)rV   z. Ú
N© )Ú.0ÚiÚissues   &  r8   Ú	<genexpr>Ú!_print_summary.<locals>.<genexpr>—   s#   é € ÐSÑ;R©x¨q˜˜A˜3˜b   rÕ*Ó;Rùs   ‚z  Fixed z
 issue(s).rZ   rY   z& issue(s) require manual intervention.z  Found z issue(s) to address:z=  Tip: run 'hermes doctor --fix' to auto-fix what's possible.u     All checks passed! ðŸŽ‰Nu´   â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€)r[   r_   Úmanual_issuesrn   Ú	enumerateÚfixedr
   r	   rs   ÚBOLDr\   ÚYELLOWr]   )r2   ry   Ú	remainingÚnumbereds   &&  r8   Ú_print_summaryrŠ   ”   sm  € Ü	„GØ—‘˜u×2Ñ2Õ2€IØ�w‰wÑS¼9ÀYÐPQÔ;RÓSÓS€Hß�e—k‘k A”oÜŒe�J¤§¡Ó-Ô.ÜŒe�h˜uŸ{™{˜m¨:Ð6¼¿¹ÄfÇkÁkÓRÐXZÕ[Ü×oxŒe�aœ˜I›Ð'Ð'MÐNÔPV×P]ÑP]Ô_e×_jÑ_jÔkð  Aô  	BÜŒßÜ�(ŒOùß	ÜŒe�J¤§¡Ó.Ô/ÜŒe�hœs 9›~Ð.Ð.CÐDÄfÇmÁmÔU[×U`ÑU`ÓaÔbÜŒÜˆhŒß˜eŸlŸl˜lÜ”%ÐWÔY_×YcÑYcÓdÔeøäŒe�J¤§¡Ó-Ô.ÜŒeÐ/´·±¼v¿{¹{ÓKÔLÜ	†Gr:   c                ó¦  € \        V RR4      p\        P                  P                  RR4       \        V RR4      '       d   \	        V P
                  4      # \        4        R	 F&  p\        \        V\        P                  4      4       K(  	  \        4       p\         F/  w  rEV'       d   \        V4       VP                  V! V4      4       K1  	  \        R4      ;_uu_ 4        ^ RIHp V! WP"                  4       RRR4       \%        W4       \'        \)        VP*                  ;'       g    VP"                  4      4      #   + '       g   i     LM; i)
zRun diagnostic checks.ÚfixFÚHERMES_INTERACTIVEÚ1ÚackNrD   )Úmaybe_run_live_checks)u±   â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�uA   â”‚                 ðŸ©º Hermes Doctor                        â”‚u±   â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜)ÚgetattrÚosÚenvironÚ
setdefaultrw   r�   r[   r
   r	   ÚCYANr   ÚDOCTOR_CHECKSr   Úmerger   Úhermes_cli.doctor_liver�   rƒ   rŠ   Úintr6   r_   )Úargsr2   Úlinery   ÚtitleÚcheckr�   s   &      r8   Ú
run_doctorrž   ¬   só   € ä˜˜u eÓ,€Jä‡J�J×ÑÐ.°Ô4Üˆt�U˜D×!Ò!Ü˜TŸX™XÓ&Ð&Ü	„GóFˆô 	Œe�Dœ&Ÿ+™+Ó&Ö'ñFô ‹I€Eß%‰ˆßÜ�UŒOØ�‰‘E˜*Ó%Ö&ñ &ô
 
�r×	Õ	Ý@Ù˜d×$7Ñ$7Ô8÷ 
ô �:Ô%ÜŒt�E—L‘L×7Ð7 E×$7Ñ$7Ó8Ó9Ð9÷	 
×	ús   Ã"E Å E	)ÚDEEPINFRA_API_KEYÚOPENROUTER_API_KEYÚOPENAI_API_KEYÚANTHROPIC_API_KEYÚANTHROPIC_TOKENÚOPENAI_BASE_URLÚNOUS_API_KEYÚGLM_API_KEYÚZAI_API_KEYÚZ_AI_API_KEYÚKIMI_API_KEYÚKIMI_CN_API_KEYÚGMI_API_KEYÚFIREWORKS_API_KEYÚACTUAL_API_KEYÚACTUAL_BASE_URLÚMINIMAX_API_KEYÚMINIMAX_CN_API_KEYÚKILOCODE_API_KEYÚDEEPSEEK_API_KEYÚDASHSCOPE_API_KEYÚHF_TOKENÚAI_GATEWAY_API_KEYÚOPENCODE_ZEN_API_KEYÚOPENCODE_GO_API_KEYÚCOMMANDCODE_API_KEYÚXIAOMI_API_KEYÚTOKENHUB_API_KEYÚTOKENPLAN_API_KEY)z(logged in)F)EÚ__doc__r’   rq   Úhermes_cli.configr   r   r   Úhermes_cli.env_loaderr   Úhermes_constantsr   ÚPROJECT_ROOTÚHERMES_HOMErt   Ú	_env_pathÚparentÚhermes_cli.colorsr	   r
   Úhermes_cli.doctor_reportr   r   r   r   r   r   Úhermes_cli.doctor_connectivityr   r   r   Úhermes_cli.doctor_toolsr   Úhermes_cli.doctor_configr   r   r   r   r   r   r   Úhermes_cli.doctor_platformr   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   Úhermes_cli.doctor_stater(   r)   r*   r+   r,   r-   r.   Ú_PROVIDER_ENV_HINTSrJ   rG   rf   r–   rw   rŠ   rž   r}   r:   r8   Ú<module>rÌ      sâ  ðñó 
Û 
ç MÑ MÝ 4Ý 0áÓ!€ÙÓ€ÙÓ€ñ ‹N€	Ù ˜y×/Ñ/¸\ÈFÕ=RÕ Sç +ß k× kß tÑ tÝ /÷÷ ñ ÷÷ ñ ÷õ ÷÷ ñ ðÐ ñ ƒôTó ðT÷ ñ ƒô&ó ð&ð  Ð6Ð7Ð:OÐQdÐ9eØÐ4Ð5Ð8OÐQdÐ7eØÐ2Ð3°dÐ<WÐ5XØ˜OÐ,Ø	ÐÐ Ð':Ð ;Ø*Ð,AÐBØ1Ð3OÐPØÐ,Ð-ØÐ6Ð7¸$ÀÐ9PÐSWÐYjÐRkØ	Ð"Ð#Ø	Ð%Ð&¨Ð/JÐ(KØÐ(Ð)¨DÐ2IÐ+JÈTÐSjÐLkØ	ÐÐÐ1Ð3JÐKØÐ2Ð3°lÐDUÐ5VØÐ.Ð/Ð2FÐH\Ð1]Ø	ˆ?Ðð!€õ(õ ô0:r:   