
    p#jt             
       .   U d Z ddlZddlZddlZddlZddlmZ ddlmZm	Z	m
Z
 ddlmZ ddlmZ  e            Z e	            Z e            Z e
            Z eej        edz             dd	lmZmZ dd
lmZ ddlmZ ddlmZ dZddlmZ defdZ dedefdZ!dededz  fdZ"de#de$e         fdZ%de$e         fdZ&dede#fdZ'de#fdZ(de)de#fdZ*dedefdZ+de$e         d e$e)         de,e$e         e$e)         f         fd!Z-d"ede#fd#Z.d7d%ed&efd'Z/d7d%ed&efd(Z0d7d%ed&efd)Z1d%efd*Z2d+eddfd,Z3d%ed&ed-ed.e$e         ddf
d/Z4dedz  fd0Z5d.e$e         ddfd1Z6d.e$e         ddfd2Z7d.e$e         ddfd3Z8da9e$dz  e:d4<   de$fd5Z;d6 Z<dS )8zK
Doctor command for hermes CLI.

Diagnoses issues with Hermes Agent setup.
    N)Path)get_project_rootget_hermes_homeget_env_path)load_hermes_dotenv)display_hermes_home.env)hermes_homeproject_env)Colorscolor)_HERMES_USER_AGENT)OPENROUTER_MODELS_URL)base_url_host_matches)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MINIMAX_API_KEYMINIMAX_CN_API_KEYKILOCODE_API_KEYDEEPSEEK_API_KEYDASHSCOPE_API_KEYHF_TOKENOPENCODE_ZEN_API_KEYOPENCODE_GO_API_KEYXIAOMI_API_KEYTOKENHUB_API_KEY)	is_termuxreturnc                  &    t                      rdndS )Nzpython -m pip installzuv pip install)
_is_termux     6/home/ubuntu/.hermes/hermes-agent/hermes_cli/doctor.py_python_install_cmdr.   <   s    &0llH""8HHr,   pkgc                 \    t                      rd|  S t          j        dk    rd|  S d|  S )Nzpkg install darwinzbrew install zsudo apt install )r*   sysplatform)r/   s    r-   _system_package_install_cmdr4   @   sE    || $#c###
|x$s$$$$s$$$r,   cmdc                 N    	 t          j        |           S # t          $ r Y dS w xY w)zCshutil.which wrapper resilient to platform monkeypatching in tests.N)shutilwhich	Exception)r5   s    r-   _safe_whichr:   H   s9    |C      tts    
$$node_installedc                     g }d}| s|                     | d           |dz  }|                     | d           |                     |dz    d           |S )N   z) pkg install nodejsz) npm install -g agent-browserz) agent-browser install)append)r;   stepssteps      r-   _termux_browser_setup_stepsrA   P   sw    ED 222333		LLD888999	LLD1H555666Lr,   c                  
    g dS )N)z`Termux install profile: use .[termux-all] for broad compatibility (installer default on Termux).zNMatrix E2EE extra is excluded on Termux (python-olm currently fails to build).zYLocal faster-whisper extra is excluded on Termux (ctranslate2/av build path unavailable).zaSTT fallback: use Groq Whisper (set GROQ_API_KEY) or OpenAI Whisper (set VOICE_TOOLS_OPENAI_KEY).r+   r+   r,   r-   "_termux_install_all_fallback_notesrC   [   s       r,   contentc                 D     t           fdt          D                       S )zIReturn True when ~/.hermes/.env contains provider auth/base URL settings.c              3       K   | ]}|v V  	d S Nr+   ).0keyrD   s     r-   	<genexpr>z+_has_provider_env_config.<locals>.<genexpr>f   s'      ==#sg~======r,   )any_PROVIDER_ENV_HINTS)rD   s   `r-   _has_provider_env_configrM   d   s'    ====)<======r,   c                      	 ddl m}  |                                 }t          |j        o|j        p|j                  S # t          $ r Y dS w xY w)zRReturn True when Honcho is configured, even if this process has no active session.r   )HonchoClientConfigF)plugins.memory.honcho.clientrO   from_global_configboolenabledapi_keybase_urlr9   )rO   cfgs     r-    _honcho_is_configured_for_doctorrW   i   sj    CCCCCC 3355CKAS[%@CLBBB   uus   ;> 
AAitemc                     |                      d          dk    rdS t          j                             d          rdS |                      d          pg }t          |          ot	          d |D                       S )zQReturn True when Kanban is unavailable only because this is not a worker process.namekanbanFHERMES_KANBAN_TASKtoolsc              3   Z   K   | ]&}t          |                              d           V  'dS )kanban_N)str
startswith)rH   tools     r-   rJ   z-_is_kanban_worker_env_gate.<locals>.<genexpr>|   s6      QQ4s4yy33I>>QQQQQQr,   )getosenvironrR   all)rX   r]   s     r-   _is_kanban_worker_env_gaterg   t   sx    xx8##u	z~~*++ uHHW#E;;Q3QQ5QQQQQQr,   toolsetc                 T    | dk    r!t           j                            d          sdS dS )zKOptional explanatory suffix for toolsets whose doctor status needs context.r[   r\   z;(runtime-gated; loaded only for dispatcher-spawned workers) )rd   re   rc   )rh   s    r-    _doctor_tool_availability_detailrk      s,    (2:>>2F#G#GLL2r,   	availableunavailablec                 8   t          |           }g }|D ]}|                    d          }t          |          rd|vr|                    d           @|dk    r(t	                      rd|vr|                    d           n|                    |           ||fS )z>Adjust runtime-gated tool availability for doctor diagnostics.rZ   r[   honcho)listrc   rg   r>   rW   )rl   rm   updated_availableupdated_unavailablerX   rZ   s         r-   )_apply_doctor_tool_availability_overridesrs      s    Y 
) 
)xx%d++ 	000!((2228 @ B B000!((222""4((((111r,   provider_labelc                    | pd                                                                 }|dv rD	 ddlm} t	           |            pi                     d                    S # t          $ r Y dS w xY w|dk    rD	 ddlm} t	           |            pi                     d                    S # t          $ r Y dS w xY w|d	k    rD	 dd
lm} t	           |            pi                     d                    S # t          $ r Y dS w xY wdS )aj  Return True when a direct API-key probe failure is non-blocking.

    Some provider families support both a direct API-key path and a separate
    OAuth runtime path. When the OAuth path is already healthy, doctor should
    still show a failed API-key connectivity row, but it should not promote
    that direct-key problem into the final blocking summary.
    rj   >   google / geminigeminir   )get_gemini_oauth_auth_status	logged_inFminimax)get_minimax_oauth_auth_statusxaiget_xai_oauth_auth_status)	striplowerhermes_cli.authrx   rR   rc   r9   r{   r~   )rt   
normalizedrx   r{   r~   s        r-   /_has_healthy_oauth_fallback_for_apikey_providerr      sy    !&B--//5577J222	DDDDDD5577=2BB;OOPPP 	 	 	55	Y	EEEEEE6688>BCCKPPQQQ 	 	 	55	U	AAAAAA2244:??LLMMM 	 	 	55	5s5   1A   
A.-A.81B* *
B87B81C4 4
DDrj   textdetailc                     t          dt          dt          j                   d|  |rdt          |t          j                   ndz              d S )N     ✓ rj   )printr   r   GREENDIMr   r   s     r-   check_okr      sY    	
2uUFL))
2
2D
2
2Y_6g6U%
:S:S6U6U6Ueg
hiiiiir,   c                     t          dt          dt          j                   d|  |rdt          |t          j                   ndz              d S )Nr      ⚠r   rj   )r   r   r   YELLOWr   r   s     r-   
check_warnr      sY    	
3uUFM**
3
3T
3
3Z`7h7V5;T;T7V7V7Vfh
ijjjjjr,   c                     t          dt          dt          j                   d|  |rdt          |t          j                   ndz              d S )Nr      ✗r   rj   )r   r   r   REDr   r   s     r-   
check_failr      sY    	
0uUFJ''
0
0$
0
0W]4e4Sffj8Q8Q4S4S4Sce
fgggggr,   c                 `    t          dt          dt          j                   d|             d S )N    u   →r   )r   r   r   CYAN)r   s    r-   
check_infor      s3    	
3ufk**
3
3T
3
344444r,   titlec                     t                       t          t          d|  t          j        t          j                             dS )u@   Print a doctor section banner: blank line + bold cyan ◆ title.u   ◆ N)r   r   r   r   BOLD)r   s    r-   _sectionr      s5    	GGG	%uV[
9
9:::::r,   fixissuesc                 P    t          | |           |                    |           dS )z?Emit a check_fail and append the corresponding fix instruction.N)r   r>   )r   r   r   r   s       r-   _fail_and_issuer      s*    tV
MM#r,   c                  $   t           dz  } 	 |                     d          }n# t          $ r Y dS w xY wd}|                                D ]}|                                }|                    d          r|                    d          r|dk    }G|r||                    d	          rgd
|v rc|                    d
d          d         }|                    dd          d                                                             d          }|pdc S dS )a>  Read the ``version = "..."`` from ``pyproject.toml`` at the project root.

    Returns None when running from an installed wheel (no pyproject.toml ships
    with the package) or when the file can't be parsed. Reads only the
    ``[project]`` version, ignoring any version strings that appear in other
    tables.
    zpyproject.tomlutf-8encodingNF[]z	[project]version=r=   #r   z"')PROJECT_ROOT	read_textOSError
splitlinesr   ra   endswithsplit)	pyprojectr   
in_projectrawlinevalues         r-   _read_pyproject_versionr      s0    //I""G"44   ttJ   ! !yy{{??3 	DMM#$6$6 	,J 	!$//)44 	!JJsA&&q)EKKQ''*002288??E=D   4s   # 
11c                     	 ddl m} n# t          $ r Y dS w xY wt                      }|dS ||k    rt	          dd| d           dS t          dd| d	| dd
|            dS )al  Verify pyproject.toml version matches hermes_cli.__version__.

    A git conflict resolution (reset/merge) can revert one file without the
    other, leaving ``hermes --version`` reporting a stale version while
    ``pyproject.toml`` is current. Detect that drift so users can re-sync.
    Silent no-op for installed wheels where pyproject.toml isn't present.
    r   )__version__NzVersion files consistent()z%Version mismatch between source filesz(pyproject.toml z != hermes_cli/__init__.py zsRe-sync version files (e.g. run 'hermes update', or set hermes_cli/__init__.py __version__ to match pyproject.toml))
hermes_clir   r9   r   r   r   )r   init_versionpyproject_versions      r-   _check_version_consistencyr      s    :::::::   /11 L((+-@-@-@-@AAAAA3\0\\\\\\J	
 	
 	
 	
 	
s   	 
c           	      P   	 ddl m}m} n# t          $ r Y dS w xY w |            dk    rdS t	          d            |            dD ]<}                    |          rt          | d           *t          | d           =                                }|st          d	           dS t          fd
|D                       }t          d| dt          |           dt          |          dk    r&dd                    t          |                     dndz              dS )a  Inside a container under our s6 /init, surface what s6 sees.

    Runs as a counterpart to :func:`_check_gateway_service_linger` for
    the systemd-on-host case. No-op everywhere except in the s6
    container so host runs aren't cluttered with irrelevant output.

    Reports:
      - Whether the main-hermes and dashboard static services are up
      - How many per-profile gateway slots are registered (via
        ``S6ServiceManager.list_profile_gateways()``) and how many are
        currently supervised as ``up``
    r   )S6ServiceManagerdetect_service_managerNs6zs6 Supervision)zmain-hermes	dashboardz: upz(: down (expected if not enabled via env)uY   No per-profile gateways registered yet — create one with `hermes profile create <name>`c              3   L   K   | ]}                     d |           dV  dS )zgateway-r=   N)
is_running)rH   pmgrs     r-   rJ   z(_check_s6_supervision.<locals>.<genexpr>.  s:      II#..A*H*HI1IIIIIIr,   zPer-profile gateways: /z supervised up    (, r   rj   )hermes_cli.service_managerr   r   r9   r   r   r   r   list_profile_gatewayssumlenjoinsorted)r   r   r   staticprofilesup_countr   s         @r-   _check_s6_supervisionr     s   	
 	
 	
 	
 	
 	
 	
 	
 	
     4''



C / L L>>&!! 	L___%%%%&JJJKKKK((**H noooIIIIhIIIIIHIIICMMIII25h--12D2D.		&**++...."	N    s    
c                    	 ddl m}m}m} ddlm} n,# t          $ r}t          dd| d           Y d}~dS d}~ww xY w |            sdS  |            dk    rdS  |            }|                                sdS t          d	            |            \  }}|d
u rt          dd           dS |du r6t          dd           t          d           |                     d           dS t          dd| d           dS )u$  Warn when a systemd user gateway service will stop after logout.

    Skipped inside a container running under s6 — the linger concept
    (user-systemd surviving SSH logout) doesn't apply there, and the
    s6 supervision state is surfaced separately by
    ``_check_s6_supervision``.
    r   )get_systemd_linger_statusget_systemd_unit_pathis_linux)r   zGateway service lingerz#(could not import gateway helpers: r   Nr   zGateway ServiceTzSystemd linger enabledz!(gateway service survives logout)FzSystemd linger disabledz(gateway may stop after logout)z&Run: sudo loginctl enable-linger $USERzMEnable linger for the gateway user service: sudo loginctl enable-linger $USERzCould not verify systemd lingerr   )hermes_cli.gatewayr   r   r   r   r   r9   r   existsr   r   r   r>   )	r   r   r   r   r   e	unit_pathlinger_enabledlinger_details	            r-   _check_gateway_service_lingerr   5  s   		
 	
 	
 	
 	
 	
 	
 	
 	
 	

 	FEEEEEE   +-WST-W-W-WXXX 8:: 
 4''%%''I $=$=$?$?!NM)+NOOOOO	5	 	 ,.OPPP;<<<efffff46J-6J6J6JKKKKKs    
<7<_APIKEY_PROVIDERS_CACHEc                     g d} d | D             }t                      }ddddddd	d
dddddddd}|                                D ]\  }}|                    |           h d}|                    |           	 ddlm} ddlm} 	 ddlm	}	 n"# t          $ r dt          dt          fd}	Y nw xY w |            D ]}
t          |
|          r|
j        dk    s|
j        s&|
j        p|
j        }||v s	|
j        |v rB |	|
j                  h}|
j        pdD ] }|                     |	|                     !||z  rt%          d |
j        D                       }t'          d |
j        D             d          }|s|
j        r$|
j        p|
j                            d           d!z   nd}t/          |
d"d#          }|                     |||||f           n# t          $ r Y nw xY w| S )$uH  Build the API-key provider health-check list once and cache it.

    Tuple format: (name, env_vars, default_url, base_env, supports_models_endpoint)
    Base list augmented with any ProviderProfile with auth_type="api_key" not
    already present — adding plugins/model-providers/<name>/ is sufficient to get into doctor.
    ))
Z.AI / GLM)r   r   r   z#https://api.z.ai/api/paas/v4/modelsGLM_BASE_URLT)Kimi / Moonshot)r   z!https://api.moonshot.ai/v1/modelsKIMI_BASE_URLT)StepFun Step Plan)STEPFUN_API_KEYz*https://api.stepfun.ai/step_plan/v1/modelsSTEPFUN_BASE_URLT)Kimi / Moonshot (China))r   z!https://api.moonshot.cn/v1/modelsNT)Arcee AI)ARCEEAI_API_KEYz"https://api.arcee.ai/api/v1/modelsARCEE_BASE_URLT)	GMI Cloud)r   z%https://api.gmi-serving.com/v1/modelsGMI_BASE_URLT)DeepSeek)r    z"https://api.deepseek.com/v1/modelsDEEPSEEK_BASE_URLT)Hugging Face)r"   z'https://router.huggingface.co/v1/modelsHF_BASE_URLT)
NVIDIA NIM)NVIDIA_API_KEYz*https://integrate.api.nvidia.com/v1/modelsNVIDIA_BASE_URLT)Alibaba/DashScope)r!   z=https://dashscope-intl.aliyuncs.com/compatible-mode/v1/modelsDASHSCOPE_BASE_URLT)MiniMax)r   z https://api.minimax.io/v1/modelsMINIMAX_BASE_URLT)MiniMax (China))r   z"https://api.minimaxi.com/v1/modelsMINIMAX_CN_BASE_URLF)	Kilo Code)r   z&https://api.kilo.ai/api/gateway/modelsKILOCODE_BASE_URLT)OpenCode Zen)r#   z!https://opencode.ai/zen/v1/modelsOPENCODE_ZEN_BASE_URLT)OpenCode Go)r$   NOPENCODE_GO_BASE_URLFc                     h | ]
}|d          S )r   r+   )rH   ts     r-   	<setcomp>z/_build_apikey_providers_list.<locals>.<setcomp>  s    ***QAaD***r,   zaizkimi-codingstepfunzkimi-coding-cnarceegmideepseekhuggingfacenvidiaalibabarz   z
minimax-cnkilocodeopencode-zenzopencode-go)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  >   bedrock	anthropic
openrouterr   )list_providers)ProviderProfile)normalize_provider_namer(   c                 R    | pd                                                                 S )Nrj   )r   r   )r  s    r-   _normalize_providerz9_build_apikey_providers_list.<locals>._normalize_provider  s$    **,,22444r,   rT   r+   c              3   n   K   | ]0}|                     d           |                     d          ,|V  1dS 	_BASE_URL_URLNr   rH   vs     r-   rJ   z/_build_apikey_providers_list.<locals>.<genexpr>  s\        zz+..78zz&7I7I     r,   c              3   n   K   | ]0}|                     d           s|                     d          ,|V  1dS r  r  r  s     r-   rJ   z/_build_apikey_providers_list.<locals>.<genexpr>  sE      ZZqAJJ{,C,CZqzzRXGYGYZZZZZZZr,   Nr   /modelssupports_health_checkT)setitemsaddupdate	providersr  providers.baser  hermes_cli.providersr  r9   r`   
isinstance	auth_typeenv_varsdisplay_namerZ   aliasestuplenextrU   
models_urlrstripgetattrr>   )_static_known_names_known_canonical_name_to_canonical_label
_canonical_dedicated_canonicalr  _PPr  _pp_candidates_alias	_key_vars	_base_var_models_url_hcs                    r-   _build_apikey_providers_listrD  d  s     G( +*'***L "%&CS%Z%X&9'$	 	 16688 ) )
Z((((
 BAA0111',,,,,,999999	5VVVVVVV 	5 	5 	553 53 5 5 5 5 5 5	5 ">## 	M 	MCc3'' 3=I+E+ES\+E%1F%%5E)E)E..sx889K;," = = 3 3F ; ;<<<<11    <    I ZZCLZZZ I   <*ICL$7$7$<$<y$H%)  #6==CNNFI{IsKLLLL;	M<    Ns7   :G B G B-*G ,B--D*G 
G%$G%c                 <j   t          | dd          }t          | dd          }t          j                            dd           |rddlm}m} d	 |D             }||vrct          t          d
|dd	                    t          |                    pd t          j                             t          j        d            ||          r,t          t          d| dt          j                             n?t          t          d| dt          j                             t          j        d           dS g }g }d}t                       t          t          dt          j                             t          t          dt          j                             t          t          dt          j                             t#          d           	 ddlm}	m}
m}m}  |	            } |
|          }|r|D ]}t-          |j        j         d|j         d|j         d            ||          D ]=}|r+t          dt          |t          j                              /t                       >|                    d|j        j         d|j         d|j         d|j        j         d 	            |            }|D ]<}|j        j        |v r,t=          |j         d|j         d!|j        j         d"           =nt?          d#           n)# t@          $ r}t=          d$|            Y d}~nd}~ww xY wt#          d%           t          j!        }|d&k    r(t?          d'|j"         d(|j#         d(|j$                    n|d)k    r7t?          d'|j"         d(|j#         d(|j$                    t=          d*           nY|d+k    r)t=          d'|j"         d(|j#         d(|j$         d,           n*tK          d'|j"         d(|j#         d(|j$         d-d.|           t          j&        t          j'        k    }|rt?          d/           nt=          d0d1           tQ          |           t#          d2           g d3}g d4}|D ][\  }}	 tS          |           t?          |           %# tT          $ r* tK          |d5d6| d7tW                       d8| |           Y Xw xY w|D ]E\  }}	 tS          |           t?          |d9           &# tT          $ r t=          |d:           Y Bw xY wt#          d;           tX          d<z  }|-                                r{t?          t\           d=           |/                    d>?          }ta          |          rt?          d@           n*t=          dAt\           dB           |                    dC           ntb          d<z  }|-                                rt?          dD           nt-          t\           dE           |r|j2        3                    dFdFG           |4                                 	 t          j5        tm          |          dH           n# tn          $ r Y nw xY wt?          dIt\           dB           tq          dC           |dz  }n$tq          dJ           |                    dK           tX          dLz  }|-                                r&t?          t\           dM           	 ddl9}|:                    |/                    d>?                    pi }|;                    dN          pi } | ;                    dO          pdP<                                }!|!=                                }"| ;                    dQ          p| ;                    dN          pdP<                                }#t}                      }$	 ddRl?m@}%mA}& t}          |%B                                          h dSz  }$n# t@          $ r d}&Y nw xY w	 ddTlCmD}' ddUlEmF}(mG}) n# t@          $ r	 d}'d}(d})Y nw xY wg }*|'	  |'|          }*n# t@          $ r g }*Y nw xY w|;                    dV          }+t          |+t                    r|$J                    dW |+D                        |*D ]},t          |,t                    stm          |,;                    dX          pdP          <                                }|r>|$K                    dY|=                                L                    d8dZ          z              t}          |$          }-|"r|"hnt}                      }.|(4|$D ]1}/	 |-K                     |(|/                     "# t@          $ r Y .w xY w|"}0|"r:|&8|"d[vr4	  |&|"          }0|.K                    |0           n# t@          $ r |"}0Y nw xY w|"}1|"r5|)3|"d[vr/ |)|"|+|*          }2|2|2j        nd}1|1|.K                    |1           |"rV|"d\k    rP|1|$rL|.|-z  sG|$r"d	                    t          |$                    nd]}3tK          d^|! d_d`|3 dd^|! da|3 db|           |0p|1}4h dc}5|#r=dd|#v r9|4r7|4|5vr3t=          de|# df|! dgdh           |                    de|# di|! dj           |0r<|0dkvr7	 |0dlk    rlddmlCmM}6 t          tm           |6dn          pdP          <                                p+tm           |6do          pdP          <                                          }7nddpl?m@}%mO}8 |%;                    |0          }9dF}7|9rnt          |9dqdP          drk    rY |8|0          pi }:t          |:;                    ds          p)|:;                    dt          p|:;                    dr                    }7|7s"tK          d^|0 dudvdw|0 dxt\           dy|           n# t@          $ r Y nw xY wn# t@          $ r}t=          dzd| d           Y d}~nd}~ww xY wtb          d{z  };|;-                                rt?          d|           n|r|j2        3                    dFdFG           tb          d}z  }<|<-                                rHt          jQ        tm          |<          tm          |                     t?          d~t\           d           n+ddlCmR}=mS}>  |>|=           t?          d~t\           d           |dz  }nt=          dd           tX          dLz  }|-                                r	 ddlCmT}?mU}@  |?            \  }A}B|A|Bk     rt=          d|A d|B dd           |ra	  |@dd           t?          d           |dz  }ng# t@          $ r1}Ct=          d|C            |                    d           Y d}C~Cn1d}C~Cww xY w|                    d           nt?          d|A d           n# t@          $ r Y nw xY w	 ddl9}Dt          |d>?          5 }E|D:                    |E          pi ddd           n# 1 swxY w Y   fddD             }F|Fr%t=          dd	                    |F           d           |r;                    dN          }Gt          |Gt                    r|G} nLt          |Gtl                    r0|G<                                rdQ|G<                                i} | dN<   ni } | dN<   |FD ]E}H| ;                    |H          sW                    |H          | |H<   0W                    |H           FddlXmY}I  |I|           t?          d           |dz  }n|                    d           n# t@          $ r Y nw xY w	 ddl9}DddlCmZ}Jm[}K t          |d>?          5 }E|D:                    |E          pi ddd           n# 1 swxY w Y   ;                    d          }Lt          |Lt                    r|L;                    d          nd}M|M;                    d          }M |J            ;                    d          }N|MduoG|NduoCtm          |M          <                                tm          |N          <                                k    }O|Ort=          d|N d|M dd           |rR |Kd          rt?          d|M d           |dz  }nCt=          d           |                    dt\           d           n|                    d           n# t@          $ r Y nw xY w	 ddlCm\}P  |P            }Q|Qrt#          d           |QD ]{}R|Rj]        dk    rt-          |Rj^                   nt=          |Rj^                   |Rj_        `                                D ]}Stq          |S           |                    |Rj^                   |n# t@          $ r Y nw xY wt#          d           	 ddlCma}T ddlbmc}Umd}Vme}W  |T            }X |V|X          }Y|Yst?          d           nW|YD ]}Zt=           |W|Z                     tq          d|U            |                    dt          |Y           d|U            n+# t@          $ r}[t=          dd|[ d           Y d}[~[nd}[~[ww xY wt#          d           	 ddl?mg}\mh}]mi}^mj}_  |\            }`|`;                    dt          rt?          dd           nt=          dd            |]            }a|a;                    dt          rt?          dd           nXt=          dd           |a;                    d          rtq          |ad                    t          d          stq          d            |^            }b|b;                    dt          r|b;                    d          pdP}c|b;                    d          pdP}dg }e|cr|e                    |c           |dr|e                    d|d            |erdd	                    |e           dndP}ft?          dd|f d           nt=          dd            |_            }g|g;                    dt          r+|g;                    dd          }ht?          dd|h d           nt=          dd           n+# t@          $ r}t=          dd| d           Y d}~nd}~ww xY w	 ddl?ml}i  |i            pi }j|j;                    dt          rt?          dd           n:t=          dd           |j;                    d          rtq          |jd                    n# t@          $ r Y nw xY wt#          dĦ           tX          }k|k-                                rt?          t\           dŝ           nO|r5|k3                    dFdFG           t?          d~t\           dƝ           |dz  }nt=          t\           dǝdȦ           g dɢ}l|lD ]}m|k|mz  }n|n-                                rt?          t\           dd|m dʝ           6|r8|n3                    dFdFG           t?          d~t\           dd|m dd           |dz  }pt=          t\           dd|m d˝dȦ           |kdz  }o|o-                                rx|o/                    d>?          <                                }d̈́ |`                                D             }p|prt?          t\           dΝ           ntq          t\           dϝ           njt=          t\           dНdѦ           |rP|oj2        3                    dFdFG           |om                    dd>?           t?          d~t\           dӝ           |dz  }|kdz  }q|q-                                rt?          t\           d՝           |qdz  }r|qdz  }s|r-                                rIt          |r/                    d>?          <                                          }tt?          d|t dٝ           ntq          dڦ           |s-                                rIt          |s/                    d>?          <                                          }tt?          d|t dٝ           n^tq          dܦ           nNt=          t\           dݝdȦ           |r4|q3                    dFdFG           t?          d~t\           dޝ           |dz  }|kdz  }u|u-                                r	 ddln}v|vo                    tm          |u                    }w|wp                    d          }x|xq                                d         }y|wr                                 t?          t\           d|y d           nG# t@          $ r#}t=          t\           d|            Y d}~nd}~ww xY wtq          t\           d           |kdz  }z|z-                                r	 |zs                                jt        }{|{dk    rt=          d|{dz   dd           |rddln}v|vo                    tm          |u                    }w|wp                    d           |wr                                 |z-                                r|zs                                jt        nd}|t?          d|{dz   d||dz   d           |dz  }n2|                    d           n|{dk    rtq          d|{dz   d           n# t@          $ r Y nw xY wt          |           t          |           t          jw        dk    r$t#          d           d}}dD ]*}~tb          |~z  dz  dz  }|-                                r|}} n+t          j        ;                    ddP          }t          t          j        ;                    d                    pd|v }|r|rt          |          dz  }d}nt          jy                    dz  dz  }d}|dz  }|}3t=          dd            |                    dtb           d           n(t?          d|}z                    tb                     d           |{                                r||                                }|}|                                }||k    rt?          | d           nt=          | dd| d| d           |rG|}                                 |~                    |}           t?          d| d	|}            |dz  }n?|                    d
| d           n"|-                                rt?          | d           nt-          | dd           |r|3                    dFdFG           |~                    |}           t?          d| d	|}            |dz  }t          j        ;                    ddP                              t          j                  }tm          |          |vr0t=          | dd           |                    d| d           n|                    d| d           t#          d           t          d          rt?          d           nt=          dd9           t          d          rt?          dd           n4t=          dd           tq          dt          d                       t          j        d!d"          }	 dd#lm}  |            }n# t@          $ r d}Y nw xY w|r|d$k    rtq          d%           d"}|d$k    rt          d$          rm	 t          j        d$d&gdFd'(          }n# t
          j        $ r d}Y nw xY w||j        dk    rt?          d$d)           ntK          d*dPd+|           nltK          d,d-d.|           nVt          d$          rt?          d$d9           n4t                      rtq          d/           n|rnt=          d,d9           |d0k    r&t          j        d1          }|rt          j        d2          }t          j        d3          }t          j        d4          }|r| d5| n|}g d6}|r|d7|gz  }|r%|d8t          j                            |          gz  }||d9gz  }	 t          j        |dFdFd:;          }n# t
          j        $ r d}Y nw xY w||j        dk    rt?          d<|            n0tK          d<| dPd=| |           ntK          d>d?d@|           |dAk    rt          j        dB          }|rt?          dCdD           ntK          dEdFdG|           	 ddHlm} t?          dIdJ           n%# tT          $ r tK          dKdLdM|           Y nw xY wt          dN          rt?          dO           tb          dPz  dQz  }d}|-                                rt?          dRdS           dF}nt          j        dQ          rt?          dQdS           dF}nvt                      rUtq          dT           tq          dU           tq          dV           t          dFW          D ]}tq          |           nt=          dXdY           |rݐt                      s	 ddZlm}m}m}m}m}  |            p,t           |                      p |            dup	 |            }|st |            rt?          d[d\           nt=          d]d^           t          jw        dk    rtq          d_tb           d`           ntq          d_tb           da           n# t@          $ r Y n{w xY wnvt                      rUtq          db           tq          dc           tq          dV           t          dW          D ]}tq          |           nt=          ddde           t          df          }|rtb          dgftb          dhz  diz  djfg}|D ]\  }}|dPz  -                                s	 t          j        |dkdlgtm          |          dFdFdmn          }ddl}|j        <                                r|                    |j                  ni }|;                    doi           ;                    dpi           }|;                    dqd          }|;                    drd          }|;                    dsd          }||z   |z   }|dk    rt?          | dtdu           n|dk    s|dk    rOt=          | dtd| dv| dw| dx| dy	           |                    | dz| d{|dk    rd|ndp            n&t?          | dtd| d}|dk    rd|ndp d           # t@          $ r Y w xY wt                      r1tq          d~           t3                      D ]}tq          |           t#          d           ddlm} ddlm}  |dg d          g }dffd}dffd}dffddffd}dffd}|                    d|f           |                    d|f           t<          t?                      at<          D ]+}|\  }}}}}|                    ||||||ffd	f           ,|                    d|f           |                    d|f           t          dt          dt          |           dt          j                   dPdF           t          j        ;                    d          }dt          j        d<   	 |                    dd          5 fd|D             }d |D             }ddd           n# 1 swxY w Y   |"t          j        W                    dd           nJ|t          j        d<   n9# |"t          j        W                    dd           n|t          j        d<   w xY wt          ddP           |D ]}|j        D ]8\  }}}|rt          d| d8| d8|            "t          d| d8|            9tG          |j                  }|rtK          |j                  rg }|D ]}|                    |           t#          d           	 t          j                            dtm          tb                               ddlm}m}  |            \  }}ÐtW          ||æ          \  }}|D ]J}|;                    |i           }t?          |Š;                    dX|Ħ          tY          |Ħ                     K|D ]z}|Ơ;                    d          p|Ơ;                    d          pg }|r1d	                    |Ǧ          }t=          |dX         d|ț d           ct=          |dX         d           {d |D             }|r|                    d           n,# t@          $ r}t=          dd| d           Y d}~nd}~ww xY wt#          d           tX          dz  dz  }|ʠ-                                rt?          d           |ʐdz  }|ˠ-                                r	 ddl}|̠                    |ˠ/                                          }t          |͠;                    di                     }yt?          d|y d           n"# t@          $ r t=          dd           Y nw xY w|ʐdz  }|Π-                                r-t[          d |Π                                D                       nd}|dk    rt=          |ϛ dd           nt=          dd           ddmlCmM}6 dt          fd} |6d          p |6d          }|rt?          d           n9 |Ц            rt?          dd           nt=          ddt\           d           t#          d           dP}	 ddl9}tX          dLz  }|Ӡ-                                rlt          |d>?          5 }|:                    |Ԧ          pi }ddd           n# 1 swxY w Y   |ՠ;                    d          pi ;                    dOdP          }n# t@          $ r Y nw xY w|st?          dd           n|Ґdk    rp	 ddlm}m} |֠                                } |צ            }|٠-                                st=          dÐdĦ           n|j        stq          d|ٛ dƝ           n|j        s|j        stK          dǐdĐd|           nddlm}m}  |ۦ             	  ||ئ           t?          dʐd|j         d|j         d|j                    n;# t@          $ r.}tK          dtm          |ܦ          d|ܛ |           Y d}~nd}~ww xY wn# tT          $ r tK          dАdѐd|           Y nt@          $ r)}t=          dtm          |ܦ                     Y d}~ܐnd}~ww xY w|Ґdk    r	 ddlm}  |ݦ            }|ޠ;                    drdP          }|rTt?          d֦           tq          d|ޠ;                    dؐd٦           d|ޠ;                    dېd٦                      ntK          dܐdݐd|           n# tT          $ r tK          dߐdd|           Y nt@          $ r(}t=          dtm          |ܦ                     Y d}~nd}~ww xY w	 ddlm}  ||Ҧ          }|r(|ᠿ                                rt?          |қ d           n-|rt=          |қ dd           nt=          |қ ddĦ           n8# t@          $ r+}t=          |қ dtm          |ܦ                     Y d}~nd}~ww xY w	 ddlm}m}m} ddl}d  |            D             }|r(t#          d           t?          t          |           d            |            }|D ]}g }|j        r|                    d           |j        r#|                    |j        ddm                    |j        dLz  -                                s|                    d           |j        d<z  -                                s|                    d           ||j        z  }|-                                s|                    d           |rd	                    |          nds}:t?          d|j         d7|:            |                                r|砮                                D ]}|                                s	 |/                                }d|v rh|                    d|          }|rO ||                    d                    s1t=          d|j         d|                    d           d           # t@          $ r Y w xY wn# tT          $ r Y nt@          $ r Y nw xY wt                       ||z   }|r|dk    rt          t          dt          j                             t          t          d| dt          j        t          j                  dP           |rEt          t          d8t          |           dt          j        t          j                             nt                       t                       |r<t          |d          D ]\  }}t          d| d|            t                       n?|rt          t          dt          j                             t          t          dt          |           dt          j        t          j                             t                       t          |d          D ]\  }}t          d| d|            t                       |s(t          t          dt          j                             n[t          t          dt          j                             t          t          dt          j        t          j                             t                       dS (  zRun diagnostic checks.r   FackNHERMES_INTERACTIVE1r   )
ADVISORIESack_advisoryc                     h | ]	}|j         
S r+   )id)rH   as     r-   r  zrun_doctor.<locals>.<setcomp>  s    ...aQT...r,   zUnknown advisory ID: z. Known IDs: r   z(none)   u     ✓ Acknowledged advisory z,. It will no longer trigger startup banners.u      ✗ Failed to persist ack for z*. Check ~/.hermes/config.yaml is writable.r=   u   ┌─────────────────────────────────────────────────────────┐uA   │                 🩺 Hermes Doctor                        │u   └─────────────────────────────────────────────────────────┘zSecurity Advisories)detect_compromisedfilter_unackedfull_remediation_textget_acked_idsr   z==r   r   zResolve security advisory z: uninstall z7 and rotate credentials, then run `hermes doctor --ack z`.z still installed (advisory z acknowledged)zNo active security advisoriesz Security advisory check failed: zPython Environment)      zPython .)rS  
   zHPython 3.11+ recommended for RL Training tools (tinker requires >= 3.11))rS  r   z(3.10+ recommended)z(3.10+ required)zUpgrade Python to 3.10+zVirtual environment activezNot in virtual environmentz(recommended)zRequired Packages))openaiz
OpenAI SDK)richzRich (terminal UI))dotenvzpython-dotenv)yamlPyYAML)httpxHTTPX))croniterzCroniter (cron expressions))telegramzpython-telegram-bot)discordz
discord.pyz	(missing)zInstall : r   z
(optional)z(optional, not installed)zConfiguration Filesr	   z/.env file existsr   r   z%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_oki  zCreated empty z Run 'hermes setup' to create onez!Run 'hermes setup' to create .envzconfig.yamlz/config.yaml existsmodelproviderrj   default)PROVIDER_REGISTRYresolve_provider>   autocustomr  )get_compatible_custom_providers)r  resolve_provider_fullr(  c              3      K   | ]X}t          |                                          #t          |                                                                          V  Yd S rG   )r`   r   r   )rH   rZ   s     r-   rJ   zrun_doctor.<locals>.<genexpr>  sY      &q&qT_bcg_h_h_n_n_p_p&qs4yy'8'8'>'>'@'@&q&q&q&q&q&qr,   rZ   zcustom:->   ri  rj  ri  z(unavailable)zmodel.provider 'z' is not a recognised providerz(known: z' is unknown. Valid providers: z>. Fix: run 'hermes config set model.provider <valid_provider>'>   ri  nousrj  r  lmstudior  r  r  r   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.)ri  rj  r  )get_env_valuer   r   )rg  get_auth_statusr,  rT   
configuredry   z%' is set but no API key is configuredz,(check ~/.hermes/.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>'z(Could not validate model/provider configzcli-config.yamlz-cli-config.yaml exists (in project directory)zcli-config.yaml.examplezCreated z)/config.yaml from cli-config.yaml.example)DEFAULT_CONFIGsave_configz/config.yaml from defaultszconfig.yaml not foundz(using defaults))check_config_versionmigrate_configzConfig version outdated (vu    → vz(new settings available))interactivequietz!Config migrated to latest versionzAuto-migration failed: z$Run 'hermes setup' to migrate configz=Run 'hermes doctor --fix' or 'hermes setup' to migrate configzConfig version up to date (vc                 R    g | ]#}|v t          |         t                    !|$S r+   )r+  r`   )rH   k
raw_configs     r-   
<listcomp>zrun_doctor.<locals>.<listcomp>]  s5    yyyQa:ooZdeopqertwZxZxoqooor,   )re  rU   zStale root-level config keys: z"(should be under 'model:' section))atomic_yaml_writez1Migrated stale root-level keys into model sectionuO   Stale root-level provider/base_url in config.yaml — run 'hermes doctor --fix')load_envremove_env_valueagent	max_turns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)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.uU   Stale HERMES_MAX_ITERATIONS in .env shadows config.yaml — run 'hermes doctor --fix')validate_config_structurezConfig Structureerrorz#xAI Model Retirement (May 15, 2026)load_config)MIGRATION_GUIDE_URLfind_retired_xai_refsformat_issuezNo retired xAI models in configzMigration guide: zUpdate u7    retired xAI model reference(s) in config.yaml — see zxAI retirement check skippedzAuth Providers)get_nous_auth_statusget_codex_auth_statusrx   r{   zNous Portal authz(logged in)z(not logged in)zOpenAI Codex authcodexuf   codex CLI not installed (optional — only required to import tokens from an existing Codex CLI login)email
project_idzproject=r   zGoogle Gemini OAuthz
(logged inregionglobalzMiniMax OAuthz(logged in, region=zAuth provider statusz(could not check: r}   z	xAI OAuthzDirectory Structurez directory existsz
 directoryz
 not foundz(will be created on first use))cronsessionslogsskillsmemoriesz/ existsz/ not foundzSOUL.mdc                     g | ]?}|                                 |                                                     d           =|@S ))z<!--z-->r   )r   ra   )rH   ls     r-   r~  zrun_doctor.<locals>.<listcomp>F  sA    qqqqAGGIIqaggiiFZFZ[oFpFpqqqqr,   z$/SOUL.md exists (persona configured)uA   /SOUL.md exists but is empty — edit it to customize personalityz/SOUL.md not foundz/(create it to give Hermes a custom personality)z# Hermes Agent Persona

<!-- Edit this file to customize how Hermes communicates. -->

You are Hermes, a helpful AI assistant.
z/SOUL.md with basic templater  z/memories/ directory existsz	MEMORY.mdzUSER.mdzMEMORY.md exists (z chars)zPMEMORY.md not created yet (will be created when the agent first writes a memory)zUSER.md exists (zNUSER.md not created yet (will be created when the agent first writes a memory)z/memories/ not foundz
/memories/zstate.dbzSELECT COUNT(*) FROM sessionsz/state.db exists (z
 sessions)z!/state.db exists but has issues: z</state.db not created yet (will be created on first session)zstate.db-wali   zWAL file is large (i   z MB)z!(may indicate missed checkpoints)zPRAGMA wal_checkpoint(PASSIVE)zWAL checkpoint performed (i   u   K → zK)u:   Large WAL file — run 'hermes doctor --fix' to checkpointi   zWAL file is z  MB (normal for active sessions)win32zCommand Installation)venvz.venvbinhermesPREFIXTERMUX_VERSIONzcom.termux/files/usrz$PREFIX/binz.localz~/.local/binzVenv entry point not founduR   (hermes not in venv/bin/ or .venv/bin/ — reinstall with pip install -e '.[all]')zReinstall entry point: cd z7 && source venv/bin/activate && pip install -e '.[all]'zVenv entry point exists (u   /hermes → correct targetz/hermes points to wrong targetu   (→ u   , expected → zFixed symlink: u   /hermes → zBroken symlink at u%   /hermes — run 'hermes doctor --fix'z/hermes exists (non-symlink)z/hermes not foundz.(hermes command may not work outside the venv)zCreated symlink: PATHz is not on your PATHzC(add it to your shell config: export PATH="$HOME/.local/bin:$PATH")zAdd z to your PATHzMissing u-   /hermes symlink — run 'hermes doctor --fix'zExternal Toolsgitzgit not foundrgzripgrep (rg)z(faster file search)zripgrep (rg) not foundz (file search uses grep fallback)zInstall for faster search: ripgrepTERMINAL_ENVlocal)is_containerdockeruk   Running inside a container — using local terminal backend (docker-in-docker is not configured by default)inforV  capture_outputtimeoutz(daemon running)zdocker daemon not runningzStart Docker daemonzdocker not foundz"(required for TERMINAL_ENV=docker)z%Install Docker or change TERMINAL_ENVzCDocker backend is not available inside Termux (expected on Android)sshTERMINAL_SSH_HOSTTERMINAL_SSH_USERTERMINAL_SSH_PORTTERMINAL_SSH_KEY@)r  -ozConnectTimeout=5r  zBatchMode=yesz-pz-izecho ok   )r  r   r  zSSH connection to zCheck SSH configuration for zTERMINAL_SSH_HOST not setz(required for TERMINAL_ENV=ssh)zSet TERMINAL_SSH_HOST in .envdaytonaDAYTONA_API_KEYzDaytona API keyz(configured)zDAYTONA_API_KEY not setz#(required for TERMINAL_ENV=daytona)z(Set DAYTONA_API_KEY environment variable)Daytonazdaytona SDKz(installed)zdaytona SDK not installedz(pip install daytona)z(Install daytona SDK: pip install daytonanodezNode.jsnode_moduleszagent-browserzagent-browser (Node.js)z(browser automation)zCagent-browser is not installed (expected in the tested Termux path)zUInstall it manually later with: npm install -g agent-browser && agent-browser installzTermux browser setup:)r;   zagent-browser not installedz(run: npm install))_chromium_installed_is_camofox_mode_get_cloud_provider_get_cdp_override_using_lightpanda_enginezPlaywright Chromiumz(browser engine)z!Playwright Chromium not installedz/(browser_* tools will be hidden from the agent)zInstall with: cd z# && npx playwright install chromiumz/ && npx playwright install --with-deps chromiumzHNode.js not found (browser tools are optional in the tested Termux path)z2Install Node.js on Termux with: pkg install nodejszNode.js not foundz$(optional, needed for browser tools)npmzBrowser tools (agent-browser)scriptszwhatsapp-bridgezWhatsApp bridgeaudit--json   )cwdr  r   r  metadatavulnerabilitiescriticalhighmoderatez depsz(no known vulnerabilities)z critical, z high, u    moderate — run: cd z && npm audit fix)z has z npm vulnerabilityz
 moderate zTermux compatibility fallbacks:zAPI Connectivity)
namedtuple_ConnectivityResult)labellinesr   r(   c                     t          j        d          } | sA dt          dt          j                  dt          dt          j                  fgg           S 	 dd l}|                    t          dd|  id	          }|j	        d
k    r) dt          dt          j
                  ddfgg           S |j	        dk    rB dt          dt          j                  dt          dt          j                  fgdg          S |j	        dk    rB dt          dt          j                  dt          dt          j                  fgdg          S |j	        dk    rB dt          dt          j                  dt          dt          j                  fgdg          S  dt          dt          j                  dt          d|j	         dt          j                  fgg           S # t          $ rP} dt          dt          j                  dt          d| dt          j                  fgdg          cY d }~S d }~ww xY w)Nr   OpenRouter APIr   z(not configured)r   AuthorizationBearer rV  headersr     r   rj     r   (invalid API key)z Check OPENROUTER_API_KEY in .envi  u%   (out of credits — payment required)zOpenRouter account has insufficient credits. Fix: run 'hermes config set model.provider <provider>' to switch providers, or fund your OpenRouter account at https://openrouter.ai/settings/creditsi  z(rate limited)uS   OpenRouter rate limit hit — consider switching to a different provider or waiting(HTTP r   r   zCheck network connectivity)rd   getenvr   r   r   r   r\  rc   r   status_coder   r   r9   )rI   r\  rr   r  s       r-   _probe_openrouterz%run_doctor.<locals>._probe_openrouter  s   i,-- 	&& v}--/?*FJ779 :	  2	LLL		%(/C//:   A
 }##**$E6<002BBGH  
 }##**$E6:..0@/<<> ?78	   }##**$E6:..0@CVZPPR SA B	   }##**$E6:..0@,fj99; <7 8	   '& vz**,<11116:>>@ A	    	 	 	&& vz**,<A&*--/ 0-.	       	s<   AG% 4AG% AG% AG% A	G% %
H?/AH:4H?:H?c                  b  
 ddl m}   |             }|s dg g           S 	 dd l}ddlm}m}m}m
 ddi} ||          }|r$d| |d<   d	                    ||z             |d
<   n||d<   |	                    d|d          }|r|j
        dk    rd|j                                        v rgd|j                                        v rLd	                    
fd|D             t          |          z             |d
<   |	                    d|d          }|j
        dk    r) dt          dt          j                  ddfgg           S |j
        dk    rA dt          dt          j                  dt          dt          j                  fgg           S  dt          dt          j                  dt          dt          j                  fgg           S # t(          $ rO}	 dt          dt          j                  dt          d|	 dt          j                  fgg           cY d }	~	S d }	~	ww xY w)Nr   )get_anthropic_keyAnthropic API)_is_oauth_token_COMMON_BETAS_OAUTH_ONLY_BETAS_CONTEXT_1M_BETAzanthropic-versionz
2023-06-01r  r  ,zanthropic-betaz	x-api-keyz#https://api.anthropic.com/v1/modelsrV  r  i  zlong context betaznot yet availablec                      g | ]
}|k    |S r+   r+   )rH   br  s     r-   r~  z8run_doctor.<locals>._probe_anthropic.<locals>.<listcomp>T  s$    GGG16F1F1FQ1F1F1Fr,   r  r   rj   r  r   r  r   z(couldn't verify)r   r   )r   r  r\  agent.anthropic_adapterr  r  r  r  r   rc   r  r   r   rp   r   r   r   r   r   r   r9   )r  rI   r\  r  r  r  r  is_oauthr  r   r  r  s             @r-   _probe_anthropicz$run_doctor.<locals>._probe_anthropic1  s   555555!! 	@&&B???>	LLL            +L9G&s++H ++:S??(,/HH]EV5V,W,W())'*$		5   A MS(('16<<>>99'16<<>>99,/HHGGGGGGG,--.- -() II9#R    }##**#E6<00/2FG  
 }##**#E6:../<<> ?	   '&v}--+VZ88: ;	    	 	 	&&v}--A&*--/ 0	       	s-   D$G AG A G 
H.AH)#H.)H.c                 T   d}|D ]}t          j        |d          }|r n|s | g g           S |                     d          }|sA | t          dt          j                  |t          dt          j                  fgg           S 	 dd l}|rt          j        |d          nd}	|	s|                    d          rd}	|	r9|		                    d          
                    d	          rdd
lm}
  |
|	          }	t          |	d          r@|		                    d          
                    d          r|		                    d          dz   }	|	r|		                    d          dz   n|}d| t          d}t          |	d          rd|d<   |r+t          |d          r|                    dd            ||d<   |                    ||d          }| dk    r%|	s#|j        dk    r|                    d|d          }|j        dk    r) | t          dt          j                  |dfgg           S |j        dk    rL | t          dt          j                  |t          dt          j                  fgd|d          dg          S  | t          d t          j                  |t          d!|j         d"t          j                  fgg           S # t(          $ rO} | t          d t          j                  |t          d#| d"t          j                  fgg           cY d }~S d }~ww xY w)$Nrj      r   z(key configured)r   zsk-kimi-zhttps://api.kimi.com/coding/v1r   z
/anthropic)_to_openai_base_urlzapi.kimi.comz/codingz/v1r"  r  )r  
User-Agentzclaude-code/0.1.0r  z!generativelanguage.googleapis.comr  zx-goog-api-keyrV  r  r   r  z8https://dashscope.aliyuncs.com/compatible-mode/v1/modelsr  r   r  zCheck z in .envr   r  r   r   )rd   r  ljustr   r   r   r   r\  ra   r3  r   agent.auxiliary_clientr  r   r   poprc   r  r   r   r9   )pnamer-  default_urlbase_envr#  rI   evr  r\  baser  urlr  r  r   r  s                  r-   _probe_apikey_providerz*run_doctor.<locals>._probe_apikey_providerv  s	    	 	B)B##C  	6&&ub"555B$ 	&&v|,,e*FJ779 :	  B	LLL.6>29Xr***BD  8CNN:66 87  1C((11,?? 1FFFFFF**400$T>:: 0t{{3?O?O?X?XYb?c?c 0{{3''%/48I4;;s##i//kC!030 G %T>:: <(;%  0,S2UVV 0OT222,/()		#w	;;A,,, -MS((IIN#R    }##**E6<00%<=  
 }##**E6:../<<> ?3hqk3334	   '&v}--u11116:>>@ A	    	 	 	&&v}--uA&*--/ 0	       	s.   
F"K -AK A	K 
L'AL"L'"L'c                     	 ddl m} m}m} n# t          $ r  dg g           cY S w xY w |             s dg g           S  |            } |            }d                    d          }	 dd l}ddlm}  |dddd	i
          }|	                    d||          }	|	
                                }
t          |
                    dg                     } dt          dt          j                  |t          d| d| d| dt          j                  fgg           S # t          $ ra  dt          dt          j                  |t          dt$          j         dt          j                  fgdt$          j         dg          cY S t(          $ rk}t+          |          j        } dt          dt          j                  |t          d| d| dt          j                  fgd| dg          cY d }~S d }~ww xY w)Nr   )has_aws_credentialsresolve_aws_auth_env_varresolve_bedrock_regionAWS Bedrockr  )Config   rV  max_attemptsr=   )connect_timeoutread_timeoutretriesr  )region_nameconfigmodelSummariesr   r   r   z models)r   u   (boto3 not installed — z -m pip install boto3)zInstall boto3 for Bedrock: z -m pip install boto3ra  r   zAWS Bedrock: u;    — check IAM permissions for bedrock:ListFoundationModels)agent.bedrock_adapterr  r  r  ImportErrorr  boto3botocore.configr  clientlist_foundation_modelsr   rc   r   r   r   r   r   r2   
executabler9   type__name__)r  r  r  auth_varr  r  r  _BotoConfigrV   r	  respnr   err_namer  s                 r-   _probe_bedrockz"run_doctor.<locals>._probe_bedrock  s   	>          
  	> 	> 	>&&}b"=====	>""$$ 	>&&}b"===++--''))##B''#	LLL====== + !'+  C
 \\)\LLF0022DDHH-r2233A&&v|,,e=H====!===vzJJL M	    	 	 	&&v}--uZCNZZZ
$ $% & Us~TTTU      	 	 	Aww'H&&v}--u,H,,,,,fj99; <1 1 1 1 2	       	s3   
 ((,B3D   A(G>
	G>A G93G>9G>c                     d                     d          } 	 ddlm}  |            }t          |t                    r|                    d          ni }t          |t                    s dg g           S t          |                    d          pd                                                                          }t          |                    d          pd                                                                          }|d	k    s|d
k    r dg g           S n# t          $ r  dg g           cY S w xY w	 ddl
m}m}m}m}	 n`# t          $ rS}
 dt          dt           j                  | t          d|
 dt           j                  fgd|
 g          cY d}
~
S d}
~
ww xY w |	            sP dt          dt           j                  | t          dt           j                  fgdt&          j         dg          S t          |                    d          pd                                          }|                    d          pi }t          |t                    si }t          |                    d          pd                                          p|} ||          } ||d          }|                    d          rx|                    d          pg }|rd                    |          nd} dt          dt           j                  | t          d| d | dt           j                  fgg           S |                    d!          pd"}|                    d#          pd$} dt          dt           j                  | t          d| dt           j                  fgd%| d&| g          S )'u  Probe Azure Foundry Entra ID auth, parallel to ``_probe_bedrock``.

        Skipped unless the active config has ``model.provider:
        azure-foundry`` AND ``model.auth_mode: entra_id`` — we don't probe
        the token-service / CLI chain for users on plain API-key Azure.

        Bounded by a 10s timeout (via
        :func:`agent.azure_identity_adapter.describe_active_credential`)
        so a slow token service can't pad the doctor run.
        Azure Foundry (Entra ID)   r   r  rd  re  rj   	auth_modezazure-foundryentra_id)EntraIdentityConfigSCOPE_AI_AZURE_DEFAULTdescribe_active_credentialhas_azure_identity_installedr   z(adapter import failed: r   z%Azure Foundry adapter import failed: Nz(azure-identity not installed)zInstall azure-identity: z -m pip install azure-identityrU   entrascope)r  g      $@)r  timeout_secondsokenv_sourcesr   zdefault credential chainr   r   z, scope=r  zcredential chain exhaustedhintzqRun `az login`, set AZURE_TENANT_ID/AZURE_CLIENT_ID/AZURE_CLIENT_SECRET, or attach a managed identity to this VM.zAzure Foundry Entra: . )r  hermes_cli.configr  r+  dictrc   r`   r   r   r9   agent.azure_identity_adapterr  r  r  r  r   r   r   r   r2   r  r   r   )r  r  rV   	model_cfgcfg_providerr  r  r  r  r  excrU   	entra_cfgr  r  r  r!  tagerrr"  r  s                       r-   _probe_azure_entraz&run_doctor.<locals>._probe_azure_entra  s    +0044	K555555+--C,6sD,A,AI(((rIi.. O**+Er2NNNy}}Z88>B??EEGGMMOOLIMM+66<"==CCEEKKMMI..)z2I2I**+Er2NNN 3J 	K 	K 	K&&'A2rJJJJJ	K	              	 	 	&&*v}--u939996:FFH I>>>?	       	 ,+-- 	&&*v}--u8&*EEG HZCNZZZ[	   y}}Z006B77==??MM'**0b	)T** 	I	g&&,"--3355 &% 	 %$
 
 
 *)NNN88D>> 	((=117RK,7W$))K(((=WC&&*v|,,e1C111116:>>@ A	   hhw?#?xx 
L 	 #"&E6=))5JJJJ
++- .2S22D223	
 
 	
s8   AD  6B(D   D:9D:>E 
F(AF#F(#F(r  r  c                 "     | ||||          S rG   r+   )r   r   ur  sr  s        r-   <lambda>zrun_doctor.<locals>.<lambda>[  s     6 6q!Q1 E E r,   r  r  r   zRunning u#    connectivity checks in parallel…)endflushAWS_EC2_METADATA_DISABLEDtruer   zdoctor-probe)max_workersthread_name_prefixc                 @    g | ]\  }}                     |          S r+   )submit)rH   __fn_exs      r-   r~  zrun_doctor.<locals>.<listcomp>x  s'     G G GVQC G G Gr,   c                 6    g | ]}|                                 S r+   result)rH   _fs     r-   r~  zrun_doctor.<locals>.<listcomp>y  s     @@@		@@@r,   zH                                                                      )r2  zTool Availability)check_tool_availabilityTOOLSET_REQUIREMENTSmissing_varsr-  z	(missing z(system dependency not met)c                 f    g | ].}|                     d           s|                     d          ,|/S )rC  r-  )rc   )rH   r/  s     r-   r~  zrun_doctor.<locals>.<listcomp>  s;    ___a1553H3H_AEER\L]L]____r,   zERun 'hermes setup' to configure missing API keys for full tool accessz!Could not check tool availabilityz
Skills Hubr  z.hubzSkills Hub directory existsz	lock.json	installedzLock file OK (z hub-installed skill(s))z	Lock filez(corrupted or unreadable)
quarantinec              3   B   K   | ]}|                                 d V  dS )r=   N)is_dir)rH   ds     r-   rJ   zrun_doctor.<locals>.<genexpr>  s/      DDADaDDDDDDr,   z skill(s) in quarantinez(pending review)z$Skills Hub directory not initializedz(run: hermes skills list)c                      	 t          j        g ddd          } | j        dk    S # t          t           j        f$ r Y dS w xY w)z?Check if gh CLI is authenticated via token file or device flow.)ghauthstatusr  authenticatedTrV  r  r   F)
subprocessrun
returncodeFileNotFoundErrorTimeoutExpiredr>  s    r-   _gh_authenticatedz%run_doctor.<locals>._gh_authenticated  se    	^CCC#R  F $))!:#<= 	 	 	55	s   #& A A GITHUB_TOKENGH_TOKENz2GitHub token configured (authenticated API access)zGitHub authenticated via gh CLIu,   (full API access — no GITHUB_TOKEN needed)zNo GITHUB_TOKENu!   (60 req/hr rate limit — set in z/.env for better rates)zMemory ProvidermemoryzBuilt-in memory activeu2   (no external provider configured — this is fine)ro   )rO   resolve_config_pathzHoncho config not foundzrun: hermes memory setupz&Honcho disabled (set enabled: true in z to activate)z"Honcho API key or base URL not setu/   No Honcho API key — run 'hermes memory setup')get_honcho_clientreset_honcho_clientzHoncho connectedz
workspace=z mode=z freq=zHoncho connection failedzHoncho unreachable: zhoncho-ai not installedzpip install honcho-aiz?Honcho is set as memory provider but honcho-ai is not installedzHoncho check failedmem0)_load_configzMem0 API key configuredzuser_id=user_id?z  agent_id=agent_idzMem0 API key not setz5(set MEM0_API_KEY in .env or run hermes memory setup)z5Mem0 is set as memory provider but API key is missingzMem0 plugin not loadablezpip install mem0aiz:Mem0 is set as memory provider but mem0ai is not installedzMem0 check failed)load_memory_providerz provider activez configured but not availablezrun: hermes memory statusz plugin not foundz check failed)list_profiles_get_wrapper_dirprofile_existsc                      g | ]}|j         	|S r+   )
is_default)rH   r   s     r-   r~  zrun_doctor.<locals>.<listcomp>0  s    IIIALI!IIIr,   Profilesz profile(s) foundzgateway runningu   ⚠ missing configzno .envzno aliasz	hermes -pzhermes -p (\S+)zOrphan alias: u    → profile 'z' no longer existsu   ────────────────────────────────────────────────────────────z  Fixed z
 issue(s).z& issue(s) require manual intervention.r#  z  Found z issue(s) to address:z=  Tip: run 'hermes doctor --fix' to auto-fix what's possible.u     All checks passed! 🎉)r4  rd   re   
setdefaulthermes_cli.security_advisoriesrI  rJ  r   r   r   r   r   r   r2   exitr   r   r   rO  rP  rQ  rR  r   advisoryr   packageinstalled_versionr   r>   rL  r   r   r9   version_infomajorminormicror   prefixbase_prefixr   
__import__r  r.   HERMES_HOMEr   _DHHr   rM   r   parentmkdirtouchchmodr`   r   r   rZ  	safe_loadrc   r   r   r$  r   rg  rh  keysr$  rk  r*  r  rl  r+  r%  r'  r&  replacerr  rR   rs  r7   copy2ru  rv  rw  rx  openr  utilsr  r  r  r  severitymessager"  r   r  hermes_cli.xai_retirementr  r  r  r   r  r  rx   r{   r:   r~   
write_textsqlite3connectexecutefetchoneclosestatst_sizer   r   r3   r   homerelative_to
is_symlinkresolveunlink
symlink_tor   pathsepr4   r  hermes_constantsr  rO  rP  rS  rQ  r*   path
expanduserr  r  r8   rA   tools.browser_toolr  r  r  r  r  jsonstdoutloadsrC   concurrent.futuresfuturescollectionsr  r   rD  r   ThreadPoolExecutorr  rp   r   r   r  insertmodel_toolsrA  rB  rs   rk   r   iterdirrP   rO   rX  rQ   rS   rT   rU   rY  rZ  workspace_idrecall_modewrite_frequencyplugins.memory.mem0r\  plugins.memoryr`  is_availablehermes_cli.profilesra  rb  rc  regateway_runningrd  rZ   rH  is_filesearchgroupr   	enumerate)args
should_fix
ack_targetrI  rJ  	valid_idsr   manual_issuesfixed_countrO  rP  rQ  rR  all_hits
fresh_hitshitr   	acked_idshr   
py_versionin_venvrequired_packagesoptional_packagesmodulerZ   env_pathrD   fallback_envconfig_path_yamlrV   model_sectionprovider_rawre  default_modelknown_providersrg  _resolve_auth_provider_compatible_custom_providers_normalize_catalog_provider_resolve_provider_fullcustom_providersuser_providersentryvalid_provider_idsprovider_ids_to_acceptknown_providerruntime_providercatalog_providerprovider_def
known_listprovider_for_policy providers_accepting_vendor_slugsrr  rt  rs  pconfigrM  fallback_configexample_configru  rv  rw  rx  current_ver
latest_vermig_errrZ  fstale_root_keys	raw_modelr|  r  r  r  	agent_cfgcfg_max_turns	env_ghostdriftr  config_issuesci	hint_liner  r  r  r  _xai_cfgretired_refsref_xai_check_errr  r  rx   r{   nous_statuscodex_statusgemini_statusr  projectpiecessuffixminimax_statusr  r~   xai_oauth_statusr
   expected_subdirssubdir_namesubdir_path	soul_pathr  memories_dirmemory_file	user_filesizestate_db_pathr  conncursorcountwal_pathwal_sizenew_size	_venv_bin
_venv_name
_candidate_prefix_is_termux_env_cmd_link_dir_cmd_link_display	_cmd_link_target	_expected
_path_dirsterminal_env_is_containerrunning_in_containerr?  ssh_hostssh_userssh_portssh_keytargetr5   daytona_keyr  agent_browser_pathagent_browser_okr@   r  r  r  r  r  skip_chromium_check_npm_binnpm_dirsnpm_dirr  audit_result_json
audit_data
vuln_countr  r  r  totalnote_futures_namedtuple_probesr  r  r  r-  _entry_pname	_env_vars_default_url	_base_env	_supports
_imds_prev_futures_in_order_results_r_glyphr9  _detail_issues_to_add_issuerA  rB  rl   rm   tidr  rX   r-  vars_strapi_disabledhub_dir	lock_filer  	lock_datarF  q_countrT  github_token_active_memory_provider_mem_cfg_pathr@  _raw_cfgrO   rX  hcfg_honcho_cfg_pathrY  rZ  _e_load_mem0_configmem0_cfgmem0_keyr`  	_providerra  rb  rc  _renamed_profileswrapper_dirr   partswrapper_mremaining_issuesiissuer  r<  r  r}  s                                                                                                                                                                                                                                                  @@@@r-   
run_doctorrL    sbF   ue,,Jud++J J.444
  	
 	
 	
 	
 	
 	
 	
 	
 /.:...	Y&&%>
 > >99VI..//;8> >
    
 HQKKK<
## 	%>z > > >      %<: < < <
    
 HQKKKFMK	GGG	%  D  FL  FQ  R  R  S  S  S	%SU[U`
a
abbb	%  D  FL  FQ  R  R  S  S  S"###+;	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 &%''#^H--
 	6!  |)+???s'<???   21#66    D  AU4%?%?AABBBB $$@ @ @!$@ @030E@ @ -0LO@ @ @    &I  :=I--9 C C(; C C%&Z]C C C   4555 ; ; ;9a99::::::::; !"""!JWS:+SSj.>SSAQSSTTTT	w		S:+SSj.>SSAQSSTTT]^^^^	v		UZ-UU
0@UU:CSUUWlmmmmNj&NN)9NNJ<LNN%		
 	
 	
 jCO+G B-..../AAA v&&& !!!     * l l	lvTNNNN 	l 	l 	lD+/b$/b/bBUBWBW/b/bZ`/b/bdjkkkkk	l * : :	:vT<(((( 	: 	: 	:t899999	: "###V#H #CD+++,,, $$g$66#G,, 	F<====9d999:::MMDEEEE $f,   	C>????$222333 C%%dT%BBB   HS]]E2222   D5$555666EFFFq =>>>ABBB -K zHD---...d	M    //+"7"7"7"I"IJJPbCGGG,,2M)--j99?RFFHHL#))++H*..y99]]=N=Nw=W=W][]ddffM#&55O        #&&7&<&<&>&>"?"?BbBbBb"b   )-&	.mmmmmm          . . ./3,.2+)-&&&.
  "+7*'C'CC'H'H$$  * * *')$$$* !WW[11N.$// r&&&q&q^&q&q&qqqq) T T!%.. 599V,,23399;; T#''	DJJLL4H4Hc4R4R(RSSS!$_!5!53;%FhZZ"*6&5 ! !N!*../J/J>/Z/Z[[[[$ ! ! ! !  (	0*6$6660'='=h'G'G$*../?@@@@  0 0 0'/$$$0  (A*6$66655hP`aa6B6N<??TX #/*../?@@@ H..#+# ,36HH , HW!k6/+B+B!C!C!C\kJ#W<WWW0:000\| \ \0:\ \ \ 	 	 	 #3"F6F	0 	0 	0, =((' )'/OOOpmppampppS   \m \ \am \ \ \     !$4<N$N$N '<77CCCCCC%).B C C IrJJPPRR R"==1A#B#B#HbIIOOQQ& &


 WVVVVVVV"3"7"78H"I"I%)
" wwR'H'HI'U'U%4_5E%F%F%L"F)- &

< 8 8 !9#)::k#:#:!9#)::i#8#8* *J
 & 
'f/?fffJ!fFV !f !fW[!f !f !f #	 	 	 !   D  	M 	M 	MA8q888LLLLLLLL	M ')::!!## 	HDEEEE H"(((EEE!-0I!I!((** JL^!4!4c+6F6FGGGWWWWXXXXMMMMMMMMK///HHHHIIIq 24FGGG -K G	NNNNNNNN&:&:&<&<#KZ''QQQJQQQ.    	cN&5FFFF !DEEE#q($ N N N"#FW#F#FGGG&LMMMMMMMMN MM"abbbbFFFFGGG 	 	 	D	#	KKKkG444 5!^^A..4"
5 5 5 5 5 5 5 5 5 5 5 5 5 5 5yyyy*ByyyO uQTYY5O5OQQ8    u !+w 7 7I!)T22 <(1#Is33 <	8I8I <)2IOO4E4E(F.;
7++(*.;
7+, . .,0033 ./9~~a/@/@M!,,&NN1----777777%%k:>>>PQQQ1$KKMM"sttt 	 	 	D	-	KKKDDDDDDDDkG444 5!^^A..4"
5 5 5 5 5 5 5 5 5 5 5 5 5 5 5"w//I i..	k***  $ *{ ; ; 

'>??IT) IT)I&&,,..#i..2F2F2H2HH 
  FY F F'4F F FF  
  ''(?@@  b<Ib b b   $q("#UVVV%,,]#] ] ]   
 MM4    	 	 	D		CCCCCC5577M 
.+,,,' . .B{g--"2:...."2:...%'W%7%7%9%9 . .	"9----MM"*---- 	 	 	D	 2333J111111	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 ;==,,X66 		67777# . .<<,,----@+>@@AAA  @#l++ @ @*=@ @    J J J13H~3H3H3HIIIIIIIIJ 5F	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 +*,,??;'' 	>'7777)+<===,,..K(( 	(-8888*,=>>>(( 2<0111
 w'' 8   5466[)) 	A!%%g..4"E#''55;GF %e$$$ 422233328@.$))F++....bF*,B,B,B,BCCCC,.?@@@6688k** 	;#''(;;F_&EF&E&E&EFFFF(9::: F F F)+D+D+D+DEEEEEEEEF

======4466<",, 	6[-0000{$5666##G,, 6+G4555    "###K JD+++,,,,	 J$666,D,,,---qd&&&(HIII JII' 	] 	]!K/ 	]44{4445555 	]dT:::555{5556661KK$99999;[\\\\ i'I %%w%77==??qqG..00qqq 	cBBBCCCC$aaabbbbd...0abbb 		""4$"???  < !	 !    BBBBCCC1K +L D555666"[0 9,	 	k{,,g,>>DDFFGGD7$7778888ijjj 	iy**G*<<BBDDEED55556666ghhhhd0002RSSS 	td;;;00001111K  *,M Z	FNNN??3}#5#566D\\"ABBFOO%%a(EJJLLLAAAAABBBB 	F 	F 	F$DDDDEEEEEEEE	F 	dXXXYYY ^+H 	}}.H***G(y*AGGG7    	`"NNN"??3}+=+=>>DLL!ABBBJJLLL:B//:K:KRx}}66QRHf(d:JffRZ^bRbfffggg1$KKMM"^____,,,c(y*Acccddd 	 	 	D	 "&)))&!!!
|w'(((	+ 	 	J%
2U:XEJ  "" &	
 *..2..bjnn-=>>??dCY]dCd 	/g 	/ MME1M - IKK(2U:M .!H,	,d     r\rrr    W1F1F|1T1TWWWXXX ##%% (o#++--%--//	i'' 1MMMNNNN,LLLDDD	DDD   " u!((***!,,Y777 !]3D!]!]R[!]!]^^^#q(&s;L&s&s&stttt!!## o-KKKLLLL(;;;D    o!''t'DDD((333[1B[[PY[[\\\1$K "$!;!;!A!A"*!M!MJ=));;"0FFFc   &,,-T4E-T-T-TUUUMM"m->"m"m"mnnn5 2?L111 4 [!78888+-OPPPY1LY1W1WYYZZZ 9^W55L%BBBBBB,} % % %$%  # 8##B  
 #Lxx   	#6(:4Y[\\\,   !f&71&<&<#56666 ;RAVX^____"47	    
X		 5<((((	 5XYYYY	 5%|444 u9011 	y!455Hy!455Hi 233G19G--8---xFJJJC (h'' ;bg0099::FI&&C##'	   ,   !f&71&<&<8h889999 ?X ? ?EndlEnEnpvwwww+1/	   y  i 122 	&7777)5:	  		'''''']M2222 	 	 	+':	    	 6 LP)N:_L $$&& 	L.0FGGG#\/** 
	L_&<===#\\ 	L\]]]nooo.///34HHH ! !4    ! 46JKKK  *	JLL *	)               %$&& 2--//002**,,D82 0/11	 $ + **,,  !68JKKKK"?M   <722&!BL !B !B !B   
 '!NL !N !N !N  9     @ 
 P]^^^GHHH*+++/uEEE 	 	Dt	 	&(NOOO 5!!H ):;I%(99;LM
 ' $	 $	NGUn,4466 !  *~w1G#'dB     
 %$$$AMATAZAZA\A\dU[[)<===bd
'^^J;;??@QSUVV
%>>*a88!~~fa00%>>*a88 4(2A::___.JKKKK\\TAXX yHyyyyhyy^eyyy   MM  R Ru R R.3qjj??>OR R   
  VH V V.6!mm??ARV V V  
     || 4555688 	 	Dt    *)))))555555%+;;;  G;2 ; ; ; ; ; ;zC1 C C C C C CJS9LS S S S S Sj1/ 1 1 1 1 1 1fO
 3 O
 O
 O
 O
 O
 O
d NN$&78999NNO%56777 &">"@"@) H H@F=	<I 	9)2i!F !F !F !F !F G 	H 	H 	H 	H NNM>2333NN.0BCDDD 

`uQGQQQSYS]^^
`
`     ;<<J.4BJ*+A ((Q<J ) L L 	AOR G G G Gw G G G@@.?@@@H	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A
 JNN6====6@BJ233 JNN6====6@BJ23@@@@ 

 b)))) 
" 
"')x 	. 	.#FFG .6666F66W667777,6,,F,,----bi 	 MbhWW 	 N$ 	" 	"FMM&!!!!	"  !!!B3|,,---MMMMMMMM!8!8!:!:	;!J9Va!b!b	; 	S 	SC'++C44DTXXfc**,LS,Q,QRRRR 	H 	HDxx//M488J3G3GM2H H99X..4<)@X)@)@)@AAAA4<)FGGGG `_;___ 	cMMabbb B B B6AAAAAAAAAB \H$v-G~~ X.///k)	 	EE JJy':':'<'<==	IMM+r::;;I%IIIJJJJ E E E;(CDDDDDE|+
HRHYHYH[H[b#DD!3!3!5!5DDDDDDabQ;;':::<NOOO9;VWWW//////	t 	 	 	 	 !=00MMM*4M4ML iEFFFF				 i24bcccc$&g$&g&g&ghhh #m3!! 	Ymg666 5" ??2..4"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5'/||H'='='C&H&HUW&X&X#    # KK)+_````	 H	,	,#	7\\\\\\\\%88::D2244#**,, n46PQQQQ\ ncDTcccddddl ndm n8.E	    `_______##%%%n%%d+++*lT%6lld>NllVZVjll    ! n n n#$>BId`bIdIdflmmmmmmmmn 	 	 	)'Q	      	7 	7 	7,c"gg66666666	7	 F	*	*	5MMMMMM((**H||Ir22H 	2333nhll9c&B&Bnnx||\fhkOlOlnnoooo*KK	    	 	 	*$L	      	5 	5 	5*CGG44444444	5
	K;;;;;;,,-DEEI fY3355 f3EEEFFFF f5TTTVqrrrr5HHHJdeee 	K 	K 	K1@@@#b''JJJJJJJJ	K)WWWWWWWWWWII]]__III  	Z   N++>>>???**,,K# 2 2$ 4LL!23337 /LL"....6688 7LL!5666//11 ,LL+++%.~~'' -LL,,,-2D5)))0af00001111 !!## *2244 
 
G"??,, ! ")"3"3"5"5&'11!$,>!H!HB! y..!*E*E y *+wGL+w+wXZX`X`abXcXc+w+w+w x x x$          
GGG- MkAooeJ--...e6{666fkRRXZ[[[[ 	%YC 011YYY[a[hjpjuvvwwwwGGG 	%&6:: ) )5'1''''((((GGG	 MeJ..///eKs#344KKKV]\b\ghhiii!"2A66 	% 	%HAu#q##E##$$$$ 	f%WY_YcddeeeeJ--...e/v{KKLLL	GGGGGs  D7L 
L3L..L3?R1SSS==TT="Y   
Y-,Y-8Co ._7 6o 7`o `o 
` o `,)o +`,,o 4a  ?o  ao aDo e43o 4
f>o  fo  f0 /o 0f?<o >f??C#o #D%o	 o 	
oo oo 
p%o>>p4w !u0 /w 0
v+:'v&!w &v++,w 
w%$w%)}$ >x"}$ "x&&}$ )x&*D9}$ $
}10}15AD ~6*AD 6~::AD =~:>EAD D
ADDADDBAF6 F6
AGGAGGBAI% I%
AJI/AJJAJJ G0AR R
AR9RAR4R4AR9R=A2AT0 T0
AT=T<AT=cBAe e
Af
e'AffAf
f?D
Ak
 k

AkkAk{A{0 {0A{?{>A{?|6A} }A}*})A}*B7BC CBC(C'BC(FBF FBF?F>BF?KBN N
BNNBNQ$E=BW#W#
BW1W0BW1^4B`7 _B_7_+B`7 _7B_;_;B`7 _>B_;_?B`7 `76Ba-d!EBi- i-
Bji7BjjBjk8A$Bm mBm<m;Bm<r 3Bt r3BssBt sBssBt sBss/Bt t
BttBtt>B"By w!7Bx xBy x
Byx#$ByyBy yByyBy yBz*y8	Bz*zBz%z%Bz*z5BB} }B~})	B~}2B~~B~~A)C@ @
C@=@!C@8@8C@=AF<CJ G>BCJ I?CJ J 
CJJ
CJ JCJJCJ J
CJ)J	CJ)J(CJ))rj   )=__doc__rd   r2   rO  r7   pathlibr   r$  r   r   r   hermes_cli.env_loaderr   r  r   r   rt  ru  	_env_pathrv  hermes_cli.colorsr   r   hermes_cli.modelsr   r   r  r   rL   r'   r*   r`   r.   r4   r:   rR   rp   rA   rC   rM   rW   r%  rg   rk   r0  rs   r   r   r   r   r   r   r   r   r   r   r   r   __annotations__rD  rL  r+   r,   r-   <module>rT     s     
			 



            M M M M M M M M M M 4 4 4 4 4 4 0 0 0 0 0 0!!o LNN	  y/\F=R S S S S + + + + + + + + 0 0 0 0 0 0 2 2 2 2 2 2 ' ' ' ' ' ' 4 5 4 4 4 4 4IS I I I I%S %S % % % %S S4Z     c    DI    >c >d > > > >
$    RT Rd R R R Rc c    2c 2QUVZQ[ 2`efjknfoquvzq{f{`| 2 2 2 2$C D    <j j3 j j j j jk kS k# k k k kh hS h# h h h h5S 5 5 5 5;C ;D ; ; ; ;# s  d3i D    t    4
tCy 
T 
 
 
 
8-$s) - - - - -`)L$s) )L )L )L )L )LX (,  + + +Yd Y Y Y Yxr r r r rr,   