
    PL
jQ             	          U d Z ddlZddlZddlZddlZddlZddl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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e0e(e#         e(e-         f         fd"Z1d#e#de'fd$Z2d1d&e#d'e#fd(Z3d1d&e#d'e#fd)Z4d1d&e#d'e#fd*Z5d&e#fd+Z6d,e(e#         ddfd-Z7da8e(dz  e9d.<   de(fd/Z:d0 Z;dS )2zK
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)describe_vercel_auth)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AI_GATEWAY_API_KEY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     5/home/kuhnn/.hermes/hermes-agent/hermes_cli/doctor.py_python_install_cmdr0   ?   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)r1   s    r/   _system_package_install_cmdr6   C   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)r7   s    r/   _safe_whichr<   K   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_stepsrC   S   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_notesrE   ^   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keyrF   s     r/   	<genexpr>z+_has_provider_env_config.<locals>.<genexpr>i   s'      ==#sg~======r.   )any_PROVIDER_ENV_HINTS)rF   s   `r/   _has_provider_env_configrO   g   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.clientrQ   from_global_configboolenabledapi_keybase_urlr;   )rQ   cfgs     r/    _honcho_is_configured_for_doctorrY   l   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)rJ   tools     r/   rL   z-_is_kanban_worker_env_gate.<locals>.<genexpr>   s6      QQ4s4yy33I>>QQQQQQr.   )getosenvironrT   all)rZ   r_   s     r/   _is_kanban_worker_env_gateri   w   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) )rf   rg   re   )rj   s    r/    _doctor_tool_availability_detailrm      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.r\   r]   honcho)listre   ri   r@   rY   )rn   ro   updated_availableupdated_unavailablerZ   r\   s         r/   )_apply_doctor_tool_availability_overridesru      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.
    rl   >   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.authrz   rT   re   r;   r}   r   )rv   
normalizedrz   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rl   textdetailc                     t          dt          dt          j                   d|  |rdt          |t          j                   ndz              d S )N     ✓ rl   )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   rl   )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   rl   )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.   issuesc                 0   	 ddl m}m}m} n,# t          $ r}t          dd| d           Y d}~dS d}~ww xY w |            sdS  |            }|                                sdS t                       t          t          dt          j
        t          j                              |            \  }}|du rt          d	d
           dS |du r6t          dd           t          d           |                     d           dS t          dd| d           dS )z@Warn when a systemd user gateway service will stop after logout.r   )get_systemd_linger_statusget_systemd_unit_pathis_linuxzGateway service lingerz#(could not import gateway helpers: )Nu   ◆ 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 linger()hermes_cli.gatewayr   r   r   r;   r   existsr   r   r   r   BOLDr   r   r@   )r   r   r   r   e	unit_pathlinger_enabledlinger_details           r/   _check_gateway_service_lingerr      s   	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	

    +-WST-W-W-WXXX 8:: %%''I 	GGG	%%v{FK
@
@AAA$=$=$?$?!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   
 
616_APIKEY_PROVIDERS_CACHEc                     g d} d | D             }t                      }i ddddddd	d
dddddddddddddddddddddd 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                            d0          d1z   nd/}t/          |
d2d3          }|                     |||||f           n# t          $ r Y nw xY w| S )4uH  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)Vercel AI Gateway)r$   z&https://ai-gateway.vercel.sh/v1/modelsAI_GATEWAY_BASE_URLT)	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-   )rJ   ts     r/   	<setcomp>z/_build_apikey_providers_list.<locals>.<setcomp>  s    ***QAaD***r.   r   zair   zkimi-codingr   stepfunr   zkimi-coding-cnr   arceer   gmir   deepseekr   huggingfacer   nvidiar   alibabar   r|   r   z
minimax-cnr   
ai-gatewayr   kilocoder   opencode-zenr   zopencode-go>   bedrock	anthropic
openrouterr   )list_providers)ProviderProfile)normalize_provider_namer*   c                 R    | pd                                                                 S )Nrl   )r   r   )r   s    r/   _normalize_providerz9_build_apikey_providers_list.<locals>._normalize_provider"  s$    **,,22444r.   rV   r-   c              3   n   K   | ]0}|                     d           |                     d          ,|V  1dS 	_BASE_URL_URLNendswithrJ   vs     r/   rL   z/_build_apikey_providers_list.<locals>.<genexpr>2  s\        zz+..78zz&7I7I     r.   c              3   n   K   | ]0}|                     d           s|                     d          ,|V  1dS r   r   r   s     r/   rL   z/_build_apikey_providers_list.<locals>.<genexpr>7  sE      ZZqAJJ{,C,CZqzzRXGYGYZZZZZZZr.   N//modelssupports_health_checkT)setitemsaddupdate	providersr   providers.baser   hermes_cli.providersr   r;   rb   
isinstance	auth_typeenv_varsdisplay_namer\   aliasestuplenextrW   
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_listr     s     G* +*'***L "%	e	.	Y	(ACS	 	G	 )%	 2<Z	 			 (4X		
 	Y	
 )29	 	<	 *=l	 	Z	 "0	 	}	 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   G8 'B. -G8 .C
G8 CD*G8 8
HHc                 o   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                       t          t          dt          j        t          j                             	 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                       t          t          d%t          j        t          j                             t          j!        }|d&k    r(t?          d'|j"         d(|j#         d(|j$                    n|d)k    r7t?          d'|j"         d(|j#         d(|j$                    t=          d*           nl|d+k    r)t=          d'|j"         d(|j#         d(|j$         d,           n=t-          d'|j"         d(|j#         d(|j$         d-           |                    d.           t          j%        t          j&        k    }|rt?          d/           nt=          d0d1           t                       t          t          d2t          j        t          j                             g d3}g d4}|D ]n\  }}	 tO          |           t?          |           %# tP          $ r= t-          |d5           |                    d6| d7tS                       d8|            Y kw xY w|D ]E\  }}	 tO          |           t?          |d9           &# tP          $ r t=          |d:           Y Bw xY wt                       t          t          d;t          j        t          j                             tT          d<z  }|+                                rzt?          tX           d=           |-                    d>?          }t]          |          rt?          d@           nt=          dAtX           dB           |                    dC           nt^          d<z  }|+                                rt?          dD           nt-          tX           dE           |r]|j0        1                    dFdFG           |2                                 t?          dHtX           dB           tg          dC           |dz  }n$tg          dI           |                    dJ           tT          dKz  }|+                                rLt?          tX           dL           	 ddl4}|5                    |-                    d>?                    pi }|6                    dM          pi } | 6                    dN          pdO7                                }!|!8                                }"| 6                    dP          p| 6                    dM          pdO7                                }#ts                      }$	 ddQl:m;}%m<}& ts          |%=                                          h dRz  }$n# t@          $ r d}&Y nw xY w	 ddSl>m?}' ddTl@mA}(mB}) n# t@          $ r	 d}'d}(d})Y nw xY wg }*|'	  |'|          }*n# t@          $ r g }*Y nw xY w|6                    dU          }+t          |+t                    r|$E                    dV |+D                        |*D ]},t          |,t                    st          |,6                    dW          pdO          7                                }|r>|$G                    dX|8                                H                    d8dY          z              ts          |$          }-|"r|"hnts                      }.|(4|$D ]1}/	 |-G                     |(|/                     "# t@          $ r Y .w xY w|"}0|"r:|&8|"dZvr4	  |&|"          }0|.G                    |0           n# t@          $ r |"}0Y nw xY w|"}1|"r5|)3|"dZvr/ |)|"|+|*          }2|2|2j        nd}1|1|.G                    |1           |"ri|"d[k    rc|1|$r_|.|-z  sZ|$r"d	                    t          |$                    nd\}3t-          d]|! d^d_|3 d           |                    d]|! d`|3 da           |0p|1}4h db}5|#r=dc|#v r9|4r7|4|5vr3t=          dd|# de|! dfdg           |                    dd|# dh|! di           |0rO|0djvrJ	 |0dkk    rlddll>mI}6 t          t           |6dm          pdO          7                                p+t           |6dn          pdO          7                                          }7nddol:m;}%mK}8 |%6                    |0          }9dF}7|9rnt          |9dpdO          dqk    rY |8|0          pi }:t          |:6                    dr          p)|:6                    ds          p|:6                    dq                    }7|7s5t-          d]|0 dtdu           |                    dv|0 dwtX           dx           n# t@          $ r Y nw xY wn# t@          $ r}t=          dyd| d           Y d}~nd}~ww xY wt^          dzz  };|;+                                rt?          d{           n|r|j0        1                    dFdFG           t^          d|z  }<|<+                                rHt          jM        t          |<          t          |                     t?          d}tX           d~           n+ddl>mN}=mO}>  |>|=           t?          d}tX           d           |dz  }nt=          dd           tT          dKz  }|+                                r	 ddl>mP}?mQ}@  |?            \  }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l4}Dt          |d>?          5 }E|D5                    |E          pi ddd           n# 1 swxY w Y   fddD             }F|Frt=          dd	                    |F           d           |r                    dMi           } |FD ]E}G| 6                    |G          sS                    |G          | |G<   0S                    |G           FddlTmU}H  |H|           t?          d           |dz  }n|                    d           n# t@          $ r Y nw xY w	 ddl>mV}I  |I            }J|Jrt                       t          t          dt          j        t          j                             |JD ]{}K|KjW        dk    rt-          |KjX                   nt=          |KjX                   |KjY        Z                                D ]}Ltg          |L           |                    |KjX                   |n# t@          $ r Y nw xY wt                       t          t          dt          j        t          j                             	 ddl:m[}Mm\}Nm]}Om^}P  |M            }Q|Q6                    ds          rt?          dd           nt=          dd            |N            }R|R6                    ds          rt?          dd           n:t=          dd           |R6                    d          rtg          |Rd                     |O            }S|S6                    ds          r|S6                    d          pdO}T|S6                    d          pdO}Ug }V|Tr|V                    |T           |Ur|V                    d|U            |Vrdd	                    |V           dndO}Wt?          dd|W d           nt=          dd            |P            }X|X6                    ds          r+|X6                    dd          }Yt?          dd|Y d           nt=          dd           n+# t@          $ r}t=          dd| d           Y d}~nd}~ww xY w	 ddl:m_}Z  |Z            pi }[|[6                    ds          rt?          dd           n:t=          dd           |[6                    d          rtg          |[d                    n# t@          $ r Y nw xY wt          d          rt?          d           ntg          d           t                       t          t          dt          j        t          j                             tT          }\|\+                                rt?          tX           d           nO|r5|\1                    dFdFG           t?          d}tX           d           |dz  }nt=          tX           dd           g d}]|]D ]}^|\|^z  }_|_+                                rt?          tX           dc|^ d           6|r8|_1                    dFdFG           t?          d}tX           dc|^ dc           |dz  }pt=          tX           dc|^ dd           |\dz  }`|`+                                rx|`-                    d>?          7                                }d |Z                                D             }a|art?          tX           d           ntg          tX           d           njt=          tX           dd           |rP|`j0        1                    dFdFG           |`a                    dd>?           t?          d}tX           d           |dz  }|\dz  }b|b+                                rt?          tX           d           |bdz  }c|bdz  }d|c+                                rIt          |c-                    d>?          7                                          }et?          d|e dÝ           ntg          dĦ           |d+                                rIt          |d-                    d>?          7                                          }et?          d|e dÝ           n^tg          dƦ           nNt=          tX           dǝd           |r4|b1                    dFdFG           t?          d}tX           dȝ           |dz  }|\dz  }f|f+                                r	 ddlc}g|gd                    t          |f                    }h|he                    dʦ          }i|if                                d         }j|hg                                 t?          tX           d|j d̝           nG# t@          $ r#}t=          tX           d|            Y d}~nd}~ww xY wtg          tX           dΝ           |\dz  }k|k+                                r	 |kh                                ji        }l|ldk    rt=          d|ldz   dӝdԦ           |rddlc}g|gd                    t          |f                    }h|he                    dզ           |hg                                 |k+                                r|kh                                ji        nd}mt?          d|ldz   d|mdz   dٝ           |dz  }n2|                    dڦ           n|ldk    rtg          d|ldz   dݝ           n# t@          $ r Y nw xY wt          |           t          jk        dk    r>t                       t          t          dt          j        t          j                             d}ndD ]*}ot^          |oz  dz  dz  }p|p+                                r|p}n n+t          j        6                    ddO          }qt          t          j        6                    d                    pd|qv }r|rr|qrt          |q          dz  }sd}tnt          jm                    dz  dz  }sd}t|sdz  }u|n0t=          dd           |                    dt^           d           nt?          d|nn                    t^                     d           |uo                                r|up                                }v|np                                }w|v|wk    rt?          |t d           nt=          |t dd|v d|w d           |rE|uq                                 |ur                    |n           t?          d|t d|n            |dz  }n2|                    d|t d           n|u+                                rt?          |t d           nt-          |t dd           |r|s1                    dFdFG           |ur                    |n           t?          d|t d|n            |dz  }t          j        6                    ddO          s                    t          jt                  }xt          |s          |xvr,t=          |t dd           |                    d|t d           n|                    d|t d            t                       t          t          dt          j        t          j                             t          d          rt?          d           nt=          dd9           t          d          rt?          dd           n3t=          dd           tg          d	t          d
                      t          jv        dd          }y|ydk    rt          d          r}	 t          jx        ddgdFd          }zn# t          jy        $ r d}zY nw xY w|z|zjz        dk    rt?          dd           nt-          d           |                    d           n{t-          dd           |                    d           nRt          d          rt?          dd9           n0t                      rtg          d           nt=          dd9           |ydk    rJt          jv        d          }{|{r
t          jv        d          }|t          jv        d          }}t          jv        d          }~||r|| d|{ n|{}g d}|}r|d|}gz  }|~r%|d t          j|        }                    |~          gz  }||d!gz  }	 t          jx        |dFdFd"#          }zn# t          jy        $ r d}zY nw xY w|z|zjz        dk    rt?          d$|{            nUt-          d$|{            |                    d%|{            n(t-          d&d'           |                    d(           |yd)k    rt          jv        d*          }|rt?          d+d,           n(t-          d-d.           |                    d/           	 dd0l~m} t?          d1d2           n8# tP          $ r+ t-          d3d4           |                    d5           Y nw xY w|yd6k    rrt          jv        d7d8          7                                pd8}dd9lm} ||v rt?          d:d| d           nGd	                    |          }t-          d;d| d<| d           |                    d=|            t          jv        d>d?          7                                }|d@v rt?          dAdB           n(t-          dCdD           |                    dE           t          j                            dF          t?          dGd2           n(t-          dHdI           |                    dJ           t                      }|j        rt?          dKd|j         d           n||j                            dL          r1t-          dMd|j         d           |                    dN           n0t-          dOd|j         d           |                    dP           |j        D ]}tg          dQ|            t          jv        dRdS          8                                dTv }|rtg          dU           ntg          dV           t          dW          rt?          dX           t^          dYz  dZz  }d}|+                                rt?          d[d\           dF}nt          j        dZ          rt?          dZd\           dF}nut                      rUtg          d]           tg          d^           tg          d_           t          dF`          D ]}tg          |           nt=          dadb           |rt                      s	 ddclm}m}m}m}m}  |            p,t           |                      p |            dup	 |            }|st |            rt?          ddde           nt=          dfdg           t          jk        dk    rtg          dht^           di           ntg          dht^           dj           n# t@          $ r Y nzw xY wnut                      rUtg          dk           tg          dl           tg          d_           t          d`          D ]}tg          |           nt=          dmdn           t          do          }|rt^          dpft^          dqz  drz  dsfg}|D ]\  }}|dYz  +                                s	 t          jx        |dtdugt          |          dFdFdvw          }ddl}|j        7                                r|                    |j                  ni }|6                    dxi           6                    dyi           }|6                    dzd          }|6                    d{d          }|6                    d|d          }||z   |z   }|dk    rt?          | d}d~           n|dk    s|dk    rOt=          | d}d| d| d| d| d	           |                    | d| d|dk    rdndy            n&t?          | d}d| d|dk    rdndy d           # t@          $ r Y w xY wt                      r1tg          d           t+                      D ]}tg          |           t                       t          t          dt          j        t          j                             ddlm} ddlm}  |dg d          g }dffd}dffd}dffddffd}|                    d|f           |                    d|f           t4          t7                      at4          D ]+}|\  }}}}}|                    ||||||ffd	f           ,|                    d|f           t          dt          dt          |           dt          j                   dOdF           t          j        6                    d          }dSt          j        d<   	 |                    dd          5 fd|D             }d |D             }ddd           n# 1 swxY w Y   |"t          j        S                    dd           nJ|t          j        d<   n9# |"t          j        S                    dd           n|t          j        d<   w xY wt          ddO           |D ]}|j        D ]8\  }}}|rt          d| d8| d8|            "t          d| d8|            9t?          |j                  }|rtC          |j                  rg }|D ]}|                    |           t                       t          t          dt          j        t          j                             	 t          j|                            dt          t^                               ddlm}m}  |            \  }}tM          ||          \  }}|D ]J}|6                    |i           }t?          |6                    dW|          tO          |                     K|D ]z}|6                    d          p|6                    d          pg }|r1d	                    |          }t=          |dW         d| d           ct=          |dW         d           {d |D             }|r|                    d           n,# t@          $ r}t=          dd| d           Y d}~nd}~ww xY wt                       t          t          dt          j        t          j                             tT          dz  dz  }|+                                rt?          d           |dz  }|+                                r	 ddl}|                    |-                                          }t          |6                    di                     }jt?          d|j d           n"# t@          $ r t=          dd           Y nw xY w|dz  }| +                                r-tQ          d |                                 D                       nd}|dk    rt=          |Û dd           nt=          dd           ddll>mI}6 dt          fd} |6d          p |6d          }|rt?          d           n9 |Ħ            rt?          dd           nt=          ddtX           d           t                       t          t          dt          j        t          j                             dO}	 ddl4}tT          dKz  }|Ǡ+                                rlt          |d>?          5 }|5                    |Ȧ          pi }ddd           n# 1 swxY w Y   |ɠ6                    dĦ          pi 6                    dNdO          }n# t@          $ r Y nw xY w|st?          dŐdƦ           nl|Ɛdk    r	 ddlm}m} |ʠ                                } |˦            }|͠+                                st=          dɐdʦ           n|j        stg          d|͛ d̝           n|j        s0|j        s)t-          d͐dʦ           |                    dΦ           nddlm}m}  |Ϧ             	  ||̦           t?          dАd|j         d|j         d|j                    nN# t@          $ rA}t-          dt          |Ц                     |                    d|Л            Y d}~nd}~ww xY wn%# tP          $ r, t-          d֐dצ           |                    dئ           Y nt@          $ r)}t=          dt          |Ц                     Y d}~Аnd}~ww xY w|Ɛdk    r	 ddlm}  |Ѧ            }|Ҡ6                    dqdO          }|rTt?          dܦ           tg          d|Ҡ6                    dސdߦ           d|Ҡ6                    ddߦ                      n(t-          dd           |                    d           n# tP          $ r+ t-          dd           |                    d           Y nt@          $ r(}t=          dt          |Ц                     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t          |Ц                     Y d}~nd}~ww xY w	 ddlm}m}m} ddl}ِd  |֦            D             }|ڐrYt                       t          t          dt          j        t          j                             t?          t          |ڦ           d            |צ            }|D ]}g }|j        r|ݠ                    d           |j        r#|ݠ                    |j        ddv                    |j|        dKz  +                                s|ݠ                    d           |j|        d<z  +                                s|ݠ                    d           ||j        z  }|ޠ+                                s|ݠ                    d           |rd	                    |ݦ          ndr}: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# tP          $ 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                  dO           |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          dt          |           dt          j        t          j                             t                       t          |d          D ]\  }}t          d| d |            t                       |s(t          t          dt          j                             n[t          t          dt          j                             t          t          dt          j        t          j                             t                       dS (  zRun diagnostic checks.fixFackNHERMES_INTERACTIVE1r   )
ADVISORIESack_advisoryc                     h | ]	}|j         
S r-   )id)rJ   as     r/   r   zrun_doctor.<locals>.<setcomp>X  s    ...aQT...r.   zUnknown advisory ID: z. Known IDs: , 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   └─────────────────────────────────────────────────────────┘u   ◆ 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: u   ◆ Python Environment)      zPython .)r$  
   zHPython 3.11+ recommended for RL Training tools (tinker requires >= 3.11))r$     z(3.10+ recommended)z(3.10+ required)zUpgrade Python to 3.10+zVirtual environment activezNot in virtual environmentz(recommended)u   ◆ 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)u   ◆ Configuration Filesr	   z/.env file existszutf-8)encodingz%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_okzCreated empty z Run 'hermes setup' to create onez!Run 'hermes setup' to create .envzconfig.yamlz/config.yaml existsmodelproviderrl   default)PROVIDER_REGISTRYresolve_provider>   autocustomr   )get_compatible_custom_providers)r   resolve_provider_fullr   c              3      K   | ]X}t          |                                          #t          |                                                                          V  Yd S rI   )rb   r   r   )rJ   r\   s     r/   rL   zrun_doctor.<locals>.<genexpr>8  sY      &q&qT_bcg_h_h_n_n_p_p&qs4yy'8'8'>'>'@'@&q&q&q&q&q&qr.   r\   zcustom:->   r<  r=  r<  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>'>	   r<  nousr=  r   lmstudior   r   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.)r<  r=  r   )get_env_valuer   r   )r:  get_auth_statusr   rV   
configuredr{   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   rb   )rJ   k
raw_configs     r/   
<listcomp>zrun_doctor.<locals>.<listcomp>  s5    yyyQa:ooZdeopqertwZxZxoqooor.   )r8  rW   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')validate_config_structureu   ◆ Config Structureerroru   ◆ Auth Providers)get_nous_auth_statusget_codex_auth_statusrz   r}   zNous Portal authz(logged in)z(not logged in)zOpenAI Codex authemail
project_idzproject=z (zGoogle Gemini OAuthz
(logged inregionglobalzMiniMax OAuthz(logged in, region=zAuth provider statusz(could not check: r   z	xAI OAuthcodexz	codex CLIuf   codex CLI not installed (optional — only required to import tokens from an existing Codex CLI login)u   ◆ 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   rc   )rJ   ls     r/   rQ  zrun_doctor.<locals>.<listcomp>  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)win32u   ◆ 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'u   ◆ 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dockerinfor'  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@)ru  -ozConnectTimeout=5r{  zBatchMode=yesz-pz-izecho ok   )rs  r   rt  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vercel_sandboxTERMINAL_VERCEL_RUNTIMEnode24)_SUPPORTED_VERCEL_RUNTIMESzVercel runtimezVercel runtime unsupportedz; use z'Set TERMINAL_VERCEL_RUNTIME to one of: TERMINAL_CONTAINER_DISK51200>   rl   0r  zVercel disk settingz(uses platform default)zVercel custom disk unsupportedz((reset terminal.container_disk to 51200)zSVercel Sandbox does not support custom container_disk; use the shared default 51200vercelz
vercel SDKzvercel SDK not installedz$(pip install 'hermes-agent[vercel]')zJInstall the Vercel optional dependency: pip install 'hermes-agent[vercel]'zVercel authpartialzVercel auth incompletez@Set VERCEL_TOKEN, VERCEL_PROJECT_ID, and VERCEL_TEAM_ID togetherzVercel auth not configuredzVConfigure Vercel Sandbox auth with VERCEL_TOKEN, VERCEL_PROJECT_ID, and VERCEL_TEAM_IDzVercel auth TERMINAL_CONTAINER_PERSISTENTtrue>   r  onyesr  z^Vercel persistence: snapshot filesystem only; live processes do not survive sandbox recreationz(Vercel persistence: ephemeral filesystem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   )cwdrs  r   rt  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:u   ◆ 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 r'  headersrt     r   rl     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)rf   getenvr   r   r   r   r.  re   r   status_coder   r   r;   )rK   r.  rr   r  s       r/   _probe_openrouterz%run_doctor.<locals>._probe_openrouterD  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/modelsr'  r  i  zlong context betaznot yet availablec                      g | ]
}|k    |S r-   r-   )rJ   br  s     r/   rQ  z8run_doctor.<locals>._probe_anthropic.<locals>.<listcomp>  s$    GGG16F1F1FQ1F1F1Fr.   r  r   rl   r  r   r  r   z(couldn't verify)r   r   )r   r  r.  agent.anthropic_adapterr  r  r  r  joinre   r  r   r   rr   r   r   r   r   r   r   r;   )r  rK   r.  r  r  r  r  is_oauthr  r   r  r  s             @r/   _probe_anthropicz$run_doctor.<locals>._probe_anthropic  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)$Nrl      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-keyr'  r  r   r  z8https://dashscope.aliyuncs.com/compatible-mode/v1/modelsr  r   r  zCheck z in .envr   r  r   r   )rf   r  ljustr   r   r   r   r.  rc   r  r   agent.auxiliary_clientr  r   r   popre   r  r   r   r;   )pnamer   default_urlbase_envr   rK   evr  r.  baser  urlr  r  r   r  s                  r/   _probe_apikey_providerz*run_doctor.<locals>._probe_apikey_provider  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   r'  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 boto3r3  r   zAWS Bedrock: u;    — check IAM permissions for bedrock:ListFoundationModels)agent.bedrock_adapterr  r  r  ImportErrorr  boto3botocore.configr  clientlist_foundation_modelslenre   r   r   r   r   r   r4   
executabler;   type__name__)r  r  r  auth_varrY  r  r  _BotoConfigrX   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>r  r  c                 "     | ||||          S rI   r-   )pr   ur  sr  s        r/   <lambda>zrun_doctor.<locals>.<lambda>Z  s     6 6q!Q1 E E r.   r  r   zRunning u#    connectivity checks in parallel…)endflushAWS_EC2_METADATA_DISABLEDr(  zdoctor-probe)max_workersthread_name_prefixc                 @    g | ]\  }}                     |          S r-   )submit)rJ   __fn_exs      r/   rQ  zrun_doctor.<locals>.<listcomp>v  s'     G G GVQC G G Gr.   c                 6    g | ]}|                                 S r-   result)rJ   _fs     r/   rQ  zrun_doctor.<locals>.<listcomp>w  s     @@@		@@@r.   zH                                                                      )r  u   ◆ Tool Availability)check_tool_availabilityTOOLSET_REQUIREMENTSmissing_varsr   z	(missing z(system dependency not met)c                 f    g | ].}|                     d           s|                     d          ,|/S )r  r   )re   )rJ   r  s     r/   rQ  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 availabilityu   ◆ 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)rJ   ds     r/   rL   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  authenticatedTr'  rr  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)u   ◆ Memory ProvidermemoryzBuilt-in memory activeu2   (no external provider configured — this is fine)rq   )rQ   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)rJ   r  s     r/   rQ  zrun_doctor.<locals>.<listcomp>1  s    IIIALI!IIIr.   u   ◆ 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.z. z  Found z issue(s) to address:z=  Tip: run 'hermes doctor --fix' to auto-fix what's possible.u     All checks passed! 🎉)r  rf   rg   
setdefaulthermes_cli.security_advisoriesr  r  r   r   r  sortedr   r   r4   exitr   r   r   r   r!  r"  r#  r   advisorytitlepackageinstalled_versionr   r@   r  r   r   r;   version_infomajorminormicroprefixbase_prefix
__import__r  r0   HERMES_HOMEr   _DHH	read_textrO   PROJECT_ROOTparentmkdirtouchr   r,  	safe_loadre   r   r   r   r   r:  r;  keyshermes_cli.configr>  r   r   r?  r   dictr   rb   r   replacerE  rT   rF  r9   copy2rH  rI  rJ  rK  openr  utilsrR  rS  severitymessagehint
splitlinesrU  rV  rz   r}   r   r<   
write_textr  sqlite3connectexecutefetchoneclosestatst_sizer   r5   r   homerelative_to
is_symlinkresolveunlink
symlink_tosplitpathsepr6   r  r  r  r  r  r,   path
expanduserr}  r  tools.terminal_toolr  	importlibutil	find_specr   okr  rc   detail_linesr:   rC   tools.browser_toolr  r  r  r  r  jsonstdoutloadsrE   concurrent.futuresfuturescollectionsr  r   r  r   ThreadPoolExecutorr  rr   r   r   insertmodel_toolsr  r   ru   rm   sumiterdirrR   rQ   r  rS   rU   rV   rW   r  r  workspace_idrecall_modewrite_frequencyplugins.memory.mem0r  plugins.memoryr  is_availablehermes_cli.profilesr  r   r!  regateway_runningr7  r\   r  is_filesearchgroup	enumerate)args
should_fix
ack_targetr  r  	valid_idsr   manual_issuesfixed_countr   r!  r"  r#  all_hits
fresh_hitshitline	acked_idshr   
py_versionin_venvrequired_packagesoptional_packagesmoduler\   env_pathrF   fallback_envconfig_path_yamlrX   model_sectionprovider_rawr8  default_modelknown_providersr:  _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_slugsrE  rG  rF  pconfigr  fallback_configexample_configrH  rI  rJ  rK  current_ver
latest_vermig_errr,  fstale_root_keysrO  rR  rS  config_issuesci	hint_linerU  rV  rz   r}   nous_statuscodex_statusgemini_statusrW  projectpiecessuffixminimax_statusrY  r   xai_oauth_statusr
   expected_subdirssubdir_namesubdir_path	soul_pathr  memories_dirmemory_file	user_filesizestate_db_pathrG  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_envr  ssh_hostssh_userssh_portssh_keytargetr7   daytona_keyr  runtimer  	supporteddiskauth_status
persistentagent_browser_pathagent_browser_okrB   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  _entry_pname	_env_vars_default_url	_base_env	_supports
_imds_prev_futures_in_order_results_r_glyphr  _detail_issues_to_add_issuer  r   rn   ro   tidrq  rZ   r   vars_strapi_disabledhub_dir	lock_filer_  	lock_datar  q_countr  github_token_active_memory_provider_mem_cfg_pathr  _raw_cfgrQ   r  hcfg_honcho_cfg_pathr  r  _e_load_mem0_configmem0_cfgmem0_keyr  	_providerr  r   r!  _renamed_profileswrapper_dirr  partswrapper_mremaining_issuesiissuer  r  r  rP  s                                                                                                                                                                                                                                      @@@@r/   
run_doctorr  G  sE   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
 
GGG	%)6;
D
DEEE+;	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 &%''#^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::::::::; 
GGG	%(&+v{
C
CDDD!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UZ-UU
0@UU:CSUUWijjj/000 jCO+G B-..../AAA
 
GGG	%'fk
B
BCCC     * O O	OvTNNNN 	O 	O 	Ot[)))MMMTMM-@-B-BMMVMMNNNNN	O * : :	:vT<(((( 	: 	: 	:t899999	: 
GGG	%)6;
D
DEEE 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   5$555666EFFFq =>>>ABBB -K yHD---...c	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   MMX< X X,6X X X   #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   bBR b bSWb b b  
 !   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 D	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$.$9$9'2$F$FM, . .,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		CCCCCC5577M .e2FKMMNNN' . .B{g--"2:...."2:...%'W%7%7%9%9 . .	"9----MM"*---- 	 	 	D	 
GGG	%$fk6;
?
?@@@+F	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 +*,,??;'' 	>'7777)+<===,,..K(( 	2(-8888*,=>>>(( 2<01114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    7 

 	]	
 	
 	
 
GGG	%)6;
D
DEEE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e.V[IIJJJ 	+ 	 	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
 
GGG	%$fk6;
?
?@@@ 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xx   	C#6(:4Y[\\\,   !f&71&<&<#56666677734444)+OPPPMMABBBB	X		 5<((((	 5XYYYY%|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:::;;;GXGGHHHH24UVVVMM9::: y  i 122 	F&777702WXXXMMDEEE	F'''''']M2222 	F 	F 	F24KLLLMMDEEEEE	F
 ''')5x@@FFHHTHBBBBBB000%~7~~~6666		"<==I35T5T5T	5T5T5TUUUMMOIOOPPPy2G<<BBDD%%%*,EFFFF79cdddMMoppp>##H--9\=111113YZZZMMfggg*,,> 		]$<(9$<$<$<====)))44 	/1I[5F1I1I1IJJJMM\]]]]35M9J5M5M5MNNNMMh    , 	. 	.D,d,,----Y>GGMMOOSmm
 	CwxxxxABBB 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
 
GGG	%&V[
A
ABBB *)))))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h 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 

`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&!!!!	" 
GGG	%'fk
B
BCCC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 
GGG	% &+v{
;
;<<<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
 
GGG	%%v{FK
@
@AAA #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)+_````	 H	,	,	7\\\\\\\\%88::D2244#**,, ?46PQQQQ\ ?cDTcccddddl ?dm ??A[\\\OPPPP________##%%%?%%d+++*lT%6lld>NllVZVjll    ! ? ? ?93r77CCCMM"="="=>>>>>>>>?  	] 	] 	]02IJJJMM[\\\\\ 	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 W2333nhll9c&B&Bnnx||\fhkOlOlnnoooo13jkkkUVVV 	X 	X 	X13GHHHMMVWWWWW 	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 !	GGG%V[AABBB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	GGGGGsi  D7L> >
M$MM$T55AU<;U<V''WWCr' ..b r' b,)r' +b,,r' 0b? >r' ?cr' cr' c& %r' &c52r' 4c55Dr' ;hr' 
h'$r' &h''r' 5 i r' i%"r' $i%%C6r' D8r r' 
r"r' !r""r' '
s1s

s%4z$ !x< ;z$ <
y7'y2-z$ 2y77,z$ $
z10z15 
{." .{22 5{26C 
CAB. B.
AB;B:AB;C?GAK K
AK:KAK5K5AK:K>A2AM1 M1
AM>M=AM>]9BA_= _=
A`*`A`%`%A`*aD
Ae* e*
Ae7e6Ae7wAw. w.AxxAx}1A~ ~A~ ~A~ A3BB B2BCCBCQ
BT T
BTTBTWE<B]]
B]*])B]*d;Bf> eBe>e2Bf> e>BffBf> fBffBf> f>6Bg4kEBp% p%
Bqp/Bq	q	Bqs!A$Bu uBu%u$Bu%z3B|) {B{1{%B|) {1B{5{5B|) {8B{5{9/B|) |)
B|6|5B|6}B5CB @7CA ACB A
CBA7CBBCB BCBBCB B2CC=C	CC=CCC8C8CC=D	B%CF0 F02CHG$	CHG-CHHCHHA)CJ J
CJ8J!CJ3J3CJ8J<G-CT= R*BCT,T+CT= T,
CT9T6CT= T8CT9T9CT= T=
CUU		CUUCU)rl   )<__doc__rf   r4   r  r9   importlib.utilrY  pathlibr   r<  r   r   r   hermes_cli.env_loaderr   hermes_constantsr   r6  r3  r4  	_env_pathr7  hermes_cli.colorsr   r   hermes_cli.modelsr   hermes_cli.vercel_authr   r   rA  r   rN   r)   r,   rb   r0   r6   r<   rT   rr   rC   rE   rO   rY   r=  ri   rm   r   ru   r   r   r   r   r   r   r   __annotations__r  r  r-   r.   r/   <module>r     s8     
			 



                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 7 7 7 7 7 7 2 2 2 2 2 2 ' ' ' ' ' ' 6 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L$s) L L L L LB (,  + + +Zd Z Z Z Zzp p p p pr.   