
    `gjy             
          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 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/dGd%e d&e fd'Z0dGd%e d&e fd(Z1dGd%e d&e fd)Z2d%e fd*Z3d+e ddfd,Z4d%e d&e d-e d.e%e    ddf
d/Z5d0Z6e-e-e e e f   d1f   e7d2<   d3Z8e-e d1f   e7d4<   d5Z9e-e-e e f   d1f   e7d6<   d7e*dz  de%e-e e f      fd8Z:d9e*dz  de%e-e e f      fd:Z;	 	 dHd7e*dz  d9e*dz  de%e-e e f      fd;Z<de=e    dz  fd<Z>d!e%e*   de%e*   fd=Z?de dz  fd>Z@d.e%e    ddfd?ZAd.e%e    ddfd@ZBdIdAZCd.e%e    ddfdBZDdaEe%dz  e7dC<   de%fdDZFdIdEZGdF ZHy)JzK
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)agent_browser_runnable.env)hermes_homeproject_env)Colorscolor)_HERMES_USER_AGENT)OPENROUTER_MODELS_URL)base_url_host_matches)DEEPINFRA_API_KEYOPENROUTER_API_KEYOPENAI_API_KEYANTHROPIC_API_KEYANTHROPIC_TOKENOPENAI_BASE_URLNOUS_API_KEYGLM_API_KEYZAI_API_KEYZ_AI_API_KEYKIMI_API_KEYKIMI_CN_API_KEYGMI_API_KEYFIREWORKS_API_KEY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S dS )Nzpython -m pip installzuv pip install)
_is_termux     D/root/.hermes/venv/lib/python3.12/site-packages/hermes_cli/doctor.py_python_install_cmdr1   ?   s    &0l"H8HHr/   pkgc                 Z    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)r2   s    r0   _system_package_install_cmdr7   C   s:    |cU##
||xse$$se$$r/   cmdc                 L    	 t        j                  |       S # t        $ r Y yw xY w)zCshutil.which wrapper resilient to platform monkeypatching in tests.N)shutilwhich	Exception)r8   s    r0   _safe_whichr=   K   s(    ||C   s    	##node_installedc                     g }d}| s|j                  | d       |dz  }|j                  | d       |j                  |dz    d       |S )N   z) pkg install nodejsz) npm install -g agent-browserz) agent-browser install)append)r>   stepssteps      r0   _termux_browser_setup_stepsrD   S   s]    EDv123		LLD6789	LLD1H:45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/   r0   "_termux_install_all_fallback_notesrF   ^   s     r/   contentc                 4     t         fdt        D              S )zIReturn True when ~/.hermes/.env contains provider auth/base URL settings.c              3   &   K   | ]  }|v  
 y wNr.   ).0keyrG   s     r0   	<genexpr>z+_has_provider_env_config.<locals>.<genexpr>i   s     =#sg~=s   )any_PROVIDER_ENV_HINTS)rG   s   `r0   _has_provider_env_configrP   g   s    =)<===r/   c                      	 ddl m}  | j                         }t        |j                  xr |j
                  xs |j                        S # t        $ r Y yw xY w)zRReturn True when Honcho is configured, even if this process has no active session.r   )HonchoClientConfigF)plugins.memory.honcho.clientrR   from_global_configboolenabledapi_keybase_urlr<   )rR   cfgs     r0    _honcho_is_configured_for_doctorrZ   l   sK    C 335CKKAS[[%@CLLBB s   AA	 		AAitemc                     | j                  d      dk7  ryt        j                  j                  d      ry| j                  d      xs g }t        |      xr 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   P   K   | ]  }t        |      j                  d          yw)kanban_N)str
startswith)rK   tools     r0   rM   z-_is_kanban_worker_env_gate.<locals>.<genexpr>   s     Q4s4y33I>Qs   $&)getosenvironrU   all)r[   r`   s     r0   _is_kanban_worker_env_gaterj   w   sW    xx8#	zz~~*+HHW#E;Q3Q5QQQr/   toolsetc                 N    | dk(  r t         j                  j                  d      syy)zKOptional explanatory suffix for toolsets whose doctor status needs context.r^   r_   z;(runtime-gated; loaded only for dispatcher-spawned workers) )rg   rh   rf   )rk   s    r0    _doctor_tool_availability_detailrn      s     (2::>>2F#GLr/   	availableunavailablec                    t        |       }g }|D ]j  }|j                  d      }t        |      rd|vr|j                  d       5|dk(  r t	               rd|vr|j                  d       Z|j                  |       l ||fS )z>Adjust runtime-gated tool availability for doctor diagnostics.r]   r^   honcho)listrf   rj   rA   rZ   )ro   rp   updated_availableupdated_unavailabler[   r]   s         r0   )_apply_doctor_tool_availability_overridesrv      s    Y 
)xx%d+00!((28 @ B00!((2""4(
) 111r/   provider_labelc                 @   | xs dj                         j                         }|dk(  r*	 ddlm} t	         |       xs i j                  d            S |dk(  r*	 ddlm} t	         |       xs i j                  d            S y# t        $ r Y yw xY w# t        $ r Y yw xY w)	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.
    rm   minimaxr   )get_minimax_oauth_auth_status	logged_inFxaiget_xai_oauth_auth_status)striplowerhermes_cli.authrz   rU   rf   r<   r~   )rw   
normalizedrz   r~   s       r0   /_has_healthy_oauth_fallback_for_apikey_providerr      s     !&B--/557JY	E68>BCCKPQQ U	A24:??LMM   		  		s#   (B (B 	BB	BBtextdetailc                     t        dt        dt        j                         d|  |r$dt        |t        j                         z          y dz          y )N     ✓ rm   )printr   r   GREENDIMr   r   s     r0   check_okr      sG    	BuUFLL)*!D6
2Y_%

:S9T6U
hieg
hir/   c                     t        dt        dt        j                         d|  |r$dt        |t        j                         z          y dz          y )Nr      ⚠r   rm   )r   r   r   YELLOWr   r   s     r0   
check_warnr      sG    	BuUFMM*+1TF
3Z`5;T:U7V
ijfh
ijr/   c                     t        dt        dt        j                         d|  |r$dt        |t        j                         z          y dz          y )Nr      ✗r   rm   )r   r   r   REDr   r   s     r0   
check_failr      sG    	BuUFJJ'($
0W]affjj8Q7R4S
fgce
fgr/   c                 V    t        dt        dt        j                         d|         y )N    u   →r   )r   r   r   CYAN)r   s    r0   
check_infor      s#    	Dufkk*+1TF
34r/   titlec                     t                t        t        d|  t        j                  t        j                               y)u@   Print a doctor section banner: blank line + bold cyan ◆ title.u   ◆ N)r   r   r   r   BOLD)r   s    r0   _sectionr      s&    	G	%$ugV[[
9:r/   fixissuesc                 >    t        | |       |j                  |       y)z?Emit a check_fail and append the corresponding fix instruction.N)r   rA   )r   r   r   r   s       r0   _fail_and_issuer      s    tV
MM#r/   ))displaytool_progress_overrideszdisplay.platforms)
delegationmax_async_childrenz"delegation.max_concurrent_children._DEPRECATED_CONFIG_KEYS)summary_modelsummary_providersummary_base_url$_DEPRECATED_COMPRESSION_SUMMARY_KEYS))HERMES_TOOL_PROGRESS$display.tool_progress in config.yaml)HERMES_TOOL_PROGRESS_MODEr   )TERMINAL_CWDterminal.cwd in config.yaml)MESSAGING_CWDr   )QQ_HOME_CHANNELQQBOT_HOME_CHANNEL)QQ_HOME_CHANNEL_NAMEQQBOT_HOME_CHANNEL_NAME_DEPRECATED_ENV_VARS
raw_configc                 X   g }t        | t              s|S t        D ]E  \  }}}| j                  |      }t        |t              s)||v s.|j	                  | d| |f       G | j                  d      }t        |t              r&t
        D ]  }||v s|j	                  d| df        |S )u)  Return ``(legacy_path, replacement)`` for deprecated keys present in *raw_config*.

    Only keys that appear in the on-disk YAML are reported (raw file load, not
    merged defaults). Empty containers still count — presence of the legacy
    key is the signal that the user should migrate.
    .compressionzcompression.zauxiliary.compression)
isinstancedictr   rf   rA   r   )r   findingssectionrL   replacementsection_valr   s          r0   collect_deprecated_config_keysr      s     ')Hj$'%< ?!k nnW-k4(SK-?OOy#/=>?
 ../K+t$7 	QCk!<u!57N OP	Q Or/   env_mapc                     g }t        | t              s|S t        D ]I  \  }}| j                  |      }|t	        |      j                         dk7  s7|j                  ||f       K |S )zReturn ``(legacy_env, replacement)`` for deprecated vars present in *env_map*.

    *env_map* should come from the on-disk ``.env`` (e.g. ``load_env()``), not
    ``os.environ``, so bridged runtime vars do not trigger false positives.
    rm   )r   r   r   rf   rc   r   rA   )r   r   r]   r   vals        r0   collect_deprecated_env_varsr     si     ')Hgt$1 1kkk$?s3x~~/25OOT;/01 Or/   c                     t        |       }|j                  t        |             |st        d       |S |D ]*  \  }}t	        d| d| d       t        d| d| d       , |S )a!  Emit non-failing doctor warnings for deprecated config keys and env vars.

    Returns the list of ``(legacy, replacement)`` findings that were reported
    (empty when nothing deprecated is present). Does not mutate config/env and
    does not append to the blocking ``issues`` list.
    z%No deprecated config keys or env varszDeprecated: z(use z	 instead)zReplace u    → z$ (warn-only; not auto-migrated here))r   extendr   r   r   r   )r   r   r   legacyr   s        r0    report_deprecated_config_and_envr     s     .j9HOO/8989' ^6(#K=	*	
 	XfXU;-7[\]^ Or/   c                      	 ddl m}  ddlm}  | |        xs i d      D ch c]  }t	        |       c}S c c}w # t
        $ r Y yw xY w)zHReturn toolsets enabled for the CLI, or None if config resolution fails.r   load_config)_get_platform_toolscliN)hermes_cli.configr   hermes_cli.tools_configr   rc   r<   )r   r   rk   s      r0    _enabled_cli_toolsets_for_doctorr   *  sG    1?,?@SQSUZ,[\G\\\ s    < 7< < 	AAc                     | D cg c]&  }|j                  d      s|j                  d      r|( }}t               }||S |D cg c]$  }t        |j                  d      xs d      |v r|& c}S c c}w c c}w )zAFilter unavailable API-key toolsets to those enabled for the CLI.missing_varsenv_varsr]   rm   )rf   r   rc   )rp   r[   api_key_unavailableenabled_toolsetss       r0   %_missing_api_key_toolsets_for_summaryr   5  s     %88N#txx
'; 	  89"",txx%2&*:: 	 s   +A0)A5c                     t         dz  } 	 | j                  d      }d}|j                         D ]  }|j	                         }|j                  d      r|j                  d      r|dk(  };|s>|j                  d	      sPd
|v sU|j                  d
d      d   }|j                  dd      d   j	                         j	                  d      }|xs dc S  y# t        $ r Y yw xY w)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   rd   endswithsplit)	pyprojectr   
in_projectrawlinevalues         r0   _read_pyproject_versionr   D  s     //I""G"4 J  !yy{??3DMM#$6,J$//)4JJsA&q)EKKQ'*00288?E=D !   s   C 	C! C!c                     	 ddl m} t               }|y||k(  rt	        dd| d       yt        dd| d	| dd
|        y# t        $ r Y yw xY w)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   r<   r   r   r   )r   init_versionpyproject_versions      r0   _check_version_consistencyr   ^  sx    : 01 L(+qa-@A3011L\NZ[\J	
  s   A 	AAc           	         	 ddl m}m}  |       dk7  ryt	        d        |       dD ]0  }j                  |      rt        | d       #t        | d       2 j                         }|st        d	       yt        fd
|D              }t        d| dt        |       dt        |      dk  r%ddj                  t        |             dz          ydz          y# t        $ r Y yw xY w)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   | ]  }j                  d |       sd  yw)zgateway-r@   N)
is_running)rK   pmgrs     r0   rM   z(_check_s6_supervision.<locals>.<genexpr>  s"     I#..8A3*H1Is   $$zPer-profile gateways: /z supervised up   z (, r   rm   )hermes_cli.service_managerr   r   r<   r   r   r   r   list_profile_gatewayssumlenjoinsorted)r   r   r   staticprofilesup_countr   s         @r0   _check_s6_supervisionr
  z  s   	
 4'

C / L>>&!xt_%&!IJK	L ((*HnoIhIIH
 
!CM?.I25h-12DR		&*+,A.	NJL	N1  s   C! !	C-,C-c                      	 ddl m}  ddlm}  |         t	        d       y# $ r}t        dt        |             Y d}~yd}~wt        $ r}t        dt        |             Y d}~yd}~ww xY w)zVerify the certifi CA bundle is loadable.

    Surfaces the SSLConfigurationError user-friendly path before they hit
    a wall of tracebacks on the first outbound HTTPS call.
    r   )verify_ca_bundle_with_fallback)SSLConfigurationErrorz"SSL CA certificate bundle is validz#SSL CA certificate bundle is brokenNzSSL certificate check skipped)	agent.ssl_guardr  agent.errorsr  r   r   rc   r<   r   )r  r  es      r0   check_certificatesr    sZ    <B6&(56  B8#a&AA <2CF;;<s    ! A+A  A+A&&A+c                    	 ddl m}m}m} ddlm}  |       sy |       dk(  ry |       }|j                         syt        d	        |       \  }}|d
u rt        dd       y|du r)t        dd       t        d       | j                  d       yt        dd| d       y# t        $ r}t        dd| d       Y d}~yd}~ww xY w)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   r<   r   existsr   r   r   rA   )	r   r  r  r  r   r  	unit_pathlinger_enabledlinger_details	            r0   _check_gateway_service_lingerr    s    		
 	

 	F
 :
 4'%'I$=$?!NM)+NO	5	 ,.OP;<ef4-6JK5  +/RSTRUUV-WXs   B! !	C*B??C_APIKEY_PROVIDERS_CACHEc                     g d} | D ch c]  }|d   	 }}t               }ddddddd	d
dddddddd}|j                         D ]  \  }}|j                  |        h d}|j                  |       	 ddlm} ddlm}	 	 ddlm	}
  |       D ]6  }t        ||	      r|j                  dk7  s|j                  s,|j                  xs |j                   }||v s|j                   |v rY |
|j                         h}|j"                  xs dD ]  }|j                   |
|              ||z  rt%        d |j                  D              }t'        d |j                  D        d      }|s|j(                  r,|j*                  xs  |j(                  j-                  d      d z   nd}t/        |d!d"      }| j1                  |||||f       9 	 | S c c}w # t        $ r dt        dt        fd}
Y ew xY w# t        $ r Y | S w xY w)#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_URLFr   zaizkimi-codingstepfunzkimi-coding-cnarceegmideepseekhuggingfacenvidiaalibabary   z
minimax-cnkilocodeopencode-zenzopencode-go)r  r   r"  r%  r&  r)  r+  r-  r/  r2  r4  r6  r8  r:  r<  >   bedrock	anthropic
openrouter)list_providers)ProviderProfile)normalize_provider_namer+   c                 F    | xs dj                         j                         S )Nrm   )r   r   )rN  s    r0   _normalize_providerz9_build_apikey_providers_list.<locals>._normalize_provider!  s    **,2244r/   rW   r.   c              3   d   K   | ](  }|j                  d       s|j                  d      s| * yw	_BASE_URL_URLNr   rK   vs     r0   rM   z/_build_apikey_providers_list.<locals>.<genexpr>1  s/      zz+.qzz&7I s   .0c              3   f   K   | ])  }|j                  d       s|j                  d      s&| + ywrR  rU  rV  s     r0   rM   z/_build_apikey_providers_list.<locals>.<genexpr>6  s'     ZqAJJ{,CqzzRXGYZs   '11Nr   /modelssupports_health_checkT)setitemsaddupdate	providersrK  providers.baserL  hermes_cli.providersrM  r<   rc   r   	auth_typer   display_namer]   aliasestuplenextrX   
models_urlrstripgetattrrA   )_statict_known_names_known_canonical_name_to_canonical_label
_canonical_dedicated_canonicalrK  _PPrP  _pp_candidates_alias	_key_vars	_base_var_models_url_hcs                     r0   _build_apikey_providers_listrz    s?   G( #**QAaD*L* "%&CS%Z%X&9'$	 1668 )
Z() B01',9	5V "# 	MCc3'3==I+ES\\%%1F%5E)E.sxx89K;;," = 3F ;<=11  << I ZCLLZI  << ICLL$7$7$<y$H%)  #6=CNNFI{IsKL;	M@ N} +6  	553 53 5	5B  Ns<   G	2G. ?G EG. G+'G. *G++G. .	G;:G;c                  \   	 ddl m}  | j                         }|yt	        | j                               }t	        | j                               }t        d| d| d|        t        j                  j                  dd      j                         rt        d	|        yy# t        $ r Y yw xY w)
u~  Report the active managed scope (resolved dir + pinned key counts).

    Silent when no managed scope is present. When the managed directory was
    resolved from the HERMES_MANAGED_DIR override (rather than the system
    default), that is surfaced too — a redirected scope is the documented
    foot-gun (see docs/design/managed-scope.md §7) and an operator should see it.
    r   managed_scopeNzManaged scope active: z config key(s), z env key(s) pinned by HERMES_MANAGED_DIRrm   z'managed dir set via HERMES_MANAGED_DIR=)r   r}  get_managed_dirr<   r  managed_config_keysload_managed_envr   rg   rh   rf   r   r   )r}  managed_dirn_cfgn_envs       r0   managed_scope_checkr  F  s    ,#335 1134E..01E
 '7w ? M	# 
zz~~*B/557<[MJK 8  s   B 	B+*B+c                 i  	
 t        | dd      }t        | dd      }t        j                  j                  dd       |rddlm}m} |D ch c]  }|j                   }}||vrZt        t        d	|d
dj                  t        |            xs d t        j                               t        j                  d        ||      r(t        t        d| dt        j                                yt        t        d| dt        j                               t        j                  d       y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}  |
       } ||      }|rA|D ]  }t/        |j0                  j2                   d|j4                   d|j6                   d        ||      D ]5  }|r't        dt        |t        j8                                ,t                7 |j;                  d|j0                  j                   d|j4                   d|j6                   d|j0                  j                   d	         |       }|D ]W  }|j0                  j                  |v st=        |j4                   d|j6                   d |j0                  j                   d!       Y nt?        d"       t%        d$       	 dd%l!m"} dd&l#m$}  |       jK                  d'      xs i }d}tM        |tN              rwt        |jQ                               D ][  \  }}tM        |tN              s |||      }|s#|dz  }t=        d(| d)d*j                  |             |j;                  d+| d,       ] |dk(  rt?        d-       t%        d/       t        jR                  }|d0k\  r3t?        d1|jT                   d2|jV                   d2|jX                          n|d3k\  r>t?        d1|jT                   d2|jV                   d2|jX                          t=        d4       nn|d5k\  r4t=        d1|jT                   d2|jV                   d2|jX                   d6       n5t[        d1|jT                   d2|jV                   d2|jX                   d7d8|       t        j\                  t        j^                  k7  }|rt?        d9       nt=        d:d;       ta        |       t%        d<       tc                t%        d=       g d>}g d?}|D ]  \  } }	 te        |        t?        |        |D ]  \  } }	 te        |        t?        |dD        t%        dF       tk                tl        dGz  }!|!jo                         r`t?        tp         dH       |!js                  dIJ      }"tu        |"      rt?        dK       nt=        dLtp         dM       |j;                  dN       ntv        dGz  }#|#jo                         rt?        dO       nt/        tp         dP       |rq|!jx                  j{                  dQdQR       |!j}                          	 t        j~                  t        |!      dS       t?        dTtp         dM       t        dN       |	dz  }	nt        dU       |j;                  dV       tl        dWz  }$|$jo                         r7t?        tp         dX       	 ddlC}%|%j                  |$js                  dIJ            xs i }&|&jK                  dY      xs i }'|'jK                  dZ      xs d[j                         }(|(j                         })|'jK                  d\      xs |'jK                  dY      xs d[j                         }*t               }+	 dd]lHmI},mJ}- t        |,j                               h d^z  }+	 dd_l!mL}. dd`lMmN}/mO}0 g }1|.		  |.|&      }1|&jK                  da      }2tM        |2tN              r0ddbl!mP
 |+j                  
fdc|2jQ                         D               |1D ]t  }tM        |tN              st        |jK                  dd      xs d[      j                         }|sC|+j                  de|j                         j                  dCdf      z          v t        |+      }3|)r|)hn	t               }4|/|+D ]  }5	 |3j                   |/|5              |)}6|)r |-|)dgvr	  |-|)      }6|4j                  |6       |)}7|)r3|01|)dgvr- |0|)|2|1      }8|8|8j                  nd}7|7|4j                  |7       |)rI|)dhk7  rD|7|+r@|4|3z  s;|+rdj                  t        |+            ndi}9t[        dj|( dkdl|9 ddj|( dm|9 dn|       |6xs |7}:t        |:xs d[      j                         j                         };h do}<|;|<v xs |;dpk(  xs |;j                  de      }=|*r3dq|*v r/|;r-|=s+t=        dr|* ds|( dtdu       |j;                  dr|* dv|( dw       |6r|6dxvr	 |6dyk(  rXddzl!mU}> t        t         |>d{      xs d[      j                         xs# t         |>d|      xs d[      j                               }?nydd}lHmI},mW}@ |,jK                  |6      }AdQ}?|Ar\t        Ad~d[      dk(  rL @|6      xs i }Bt        |BjK                  d      xs$ BjK                  d      xs BjK                  d            }?|?st[        dj|6 ddd|6 dtp         d|       ntv        dz  }C|Cjo                         rt?        d       n|r|$jx                  j{                  dQdQR       tv        dz  }D|Djo                         r<t        j                  t        D      t        |$             t?        dtp         d       n#ddl!mZ}Em[}F  |F|E       t?        dtp         d       |	dz  }	nt=        dd       tl        dWz  }$|$jo                         r	 ddl!m\}Gm]}H  |G       \  }I}J|I|Jk  rCt=        dI dJ dd       |r	  Hdd       t?        d       |	dz  }	n!|j;                  d       nt?        dI d       	 ddlC}Lt        |$dIJ      5 }MLj                  |M      xs i }Nddd       dD Ocg c]  }O|ONv stM        NO   t              sO }P}O|Prt=        ddj                  P       d       |rNjK                  dY      }QtM        |QtN              rQ}'n?tM        Qt              r(Qj                         rd\Qj                         i}'|'NdY<   ni }'|'NdY<   PD ]9  }O|'jK                  |O      sNj                  O      |'|O<   )Nj                  O       ; ddl!m`}R  |R|$N       t?        d       |	dz  }	n|j;                  d       	 ddlC}Lddl!ma}Smb}T t        |$dIJ      5 }MLj                  |M      xs i }Nddd       NjK                  d      }UtM        |UtN              rUjK                  d      nd}V|VNjK                  d      }V S       jK                  d      }WVduxr9 Wduxr3 t        V      j                         t        W      j                         k7  }X|Xrht=        dW dV dd       |rB Td      rt?        dV d       |	dz  }	n6t=        d       |j;                  dtp         d       n|j;                  d       	 ddlC}Yddl!ma}Z t        |$dIJ      5 }[Yj                  |[      xs i }\ddd       	  Z       }]t        \]       	 ddl!md}^  |^       }_|_rt%        d       _D ]  }`|`j                  dk(  rt/        `j                         nt=        `j                         `j                  j                         D ]  }at        |a        |j;                  `j                          |$jo                         s	 ddl!ma}Z 	  Z       }]t        i ]       t%        d       	 dd%l!m"} ddlimj}bmk}cml}d  |       }e |c|e      }f|fst?        d       nFfD ]  }gt=         d|g              t        db        |j;                  dt        f       d|b        t%        d       	 ddlHmn}imo}jmp}k  |i       }l|ljK                  d      rt?        dd       nt=        dd        j       }m|mjK                  d      rt?        dd       nAt=        dd       mjK                  d      rt        md          t        d      st        d        k       }n|njK                  d      r#njK                  ddë      }ot?        dd|o d       nt=        dd       	 ddlHmr}p  |p       xs i }q|qjK                  d      rt?        dd       n+t=        dd       qjK                  d      rt        qd          t%        dʫ       tl        }r|rjo                         rt?        tp         d˝       nA|r,rj{                  dQdQR       t?        dtp         d̝       |	dz  }	nt=        tp         d͝dΫ       g dϢ}s|sD ]t  }tr|tz  }u|ujo                         rt?        tp         dqt dН       .|r/uj{                  dQdQR       t?        dtp         dqt dq       |	dz  }	_t=        tp         dqt dѝdΫ       v rdz  }v|vjo                         rvjs                  dIJ      j                         }"|"j                         D wcg c]5  }w|wj                         swj                         j                  dӫ      r4w7 }x}w|xrt?        tp         dԝ       npt        tp         d՝       n]t=        tp         d֝d׫       |rHvjx                  j{                  dQdQR       |vj                  ddIJ       t?        dtp         dٝ       |	dz  }	rdz  }y|yjo                         rt?        tp         d۝       ydz  }z|ydz  }{|zjo                         r9t        zjs                  dIJ      j                               }|t?        d|| dߝ       nt        d       {jo                         r9t        {js                  dIJ      j                               }|t?        d|| dߝ       nLt        d       n@t=        tp         ddΫ       |r+yj{                  dQdQR       t?        dtp         d       |	dz  }	rdz  }}|}jo                         rT	 ddlt}~|~j                  t        }            }|j                  d      }|j                         d   }|j                          t?        tp         d| d       ddlymz}m{}  ||}      }|t=        tp         dd d       |r }      }|jK                  d      rSjK                  d      rt        d         j                  nd}t?        ddjK                  d       d| d       |	dz  }	nTt=        ddjK                  d       d|jK                  d       d       |j;                  d       n|j;                  d       nt        tp         d       rdz  }|jo                         r	 j                         j                   }|d kD  rt=        ddz   dd       |rddlt}~|~j                  t        }            }|j                  d       |j                          jo                         rj                         j                   nd}t?        ddz   d|dz   d	       |	dz  }	n.|j;                  d
       ndkD  rt        ddz   d       t        |       t        |       t        j                  dk7  rt%        d       d}dD ]'  }tv        |z  dz  dz  }|jo                         s%} n t        j                  jK                  dd[      }t        t        j                  jK                  d            xs dv }|rrt              dz  }d}n t        j                         dz  dz  }d}dz  }+t=        dd       |j;                  dtv         d       nt?        dj                  tv               d       j                         rj                         }j                         }||k(  rt?         d       nmt=         dd  d! d       |r=j                          |j                         t?        d" d#|        |	dz  }	n|j;                  d$ d%       njo                         rt?         d&       nt/         d'd(       |rj{                  dQdQR       j                         t?        d) d#|        |	dz  }	t        j                  jK                  d*d[      j                  t        j                        }t        |      |vr@t=         d+d,       |j;                  d-| d.       n|j;                  d/ d0       t%        d1       t        d2      rt?        d2       nt=        d3dD       t        d4      rt?        d5d6       n(t=        d7d8       t        d9t        d:              t        j                  d;d<      }	 dd=lm}  |       }rd>k7  rt        d?       d<}d>k(  rqt        d>      rS	 t!        j"                  d>d@gdQdAB      }j&                  dk(  rt?        d>dC       net[        dDd[dE|       nTt[        dFdGdH|       nBt        d>      rt?        d>dD       n(t)               rt        dI       nrnt=        dFdD       dJk(  rt        j                  dK      }|rt        j                  dL      }t        j                  dM      }t        j                  dN      }|r dO n}g dP}rdQgz  }r'dRt        j*                  j-                        gz  }dSgz  }	 t!        j"                  dQdQdTU      } j&                  dk(  rt?        dV        n(t[        dV d[dW| |       nt[        dXdYdZ|       d[k(  rOt        j                  d\      }|rt?        d]d^       nt[        d_d`da|       	 ddblm} t?        dcdd       t        dh      rt?        di       tv        djz  dkz  }d}t        j2                  dk      }|jo                         rt?        dldm       dQ}nrt5              rt?        dkdm       dQ}nrrt=        dndo dp       n\t)               rCt        dq       t        dr       t        ds       t7        dQt      D ]  }t        |        nt=        dudv       rt)               s 	 ddwlm}m}m}m}m}  |       xs$ t                      xs         duxs         }|s        rt?        dxdy       nt=        dzd{       t        j                  dk(  rt        d|tv         d}       nrt        d|tv         d~       n\t)               rCt        d       t        d       t        ds       t7        dt      D ]  }t        |        nt=        dd       t        d      }|r	 ddlm}  |       }tv        ddgftv        dddgftv        dddgfdg fg}|D ]  \  }}}|rtv        n}|djz  jo                         s'	 t!        j"                  ddgt              dQdQd      }ddl}|jJ                  j                         rjM                  jJ                        ni }|jK                  di       jK                  di       }|jK                  dd      }|jK                  dd      }|jK                  dd      }||z   |z   }rd   dk(  rd}ndgk(  r	d d}nd d}dk(  rt?         dd       ndkD  sdkD  rqr d d d }n d d d}t=         dd d       rd   dk(  rt        d       |j;                   d d|dk(  rdnd        n!t?         dd d|dk(  rdnd d        t)               r't        d       tO               D ]  }t        |        t%        d       ddlm} ddlm}  |dg d      g }dffd}dffd}Ðdffd	dffd}Đdffd}|j;                  d|f       |j;                  d|f       tX        t[               atX        D ](  }|\  }}}}}j;                  ||||||f	fd	f       * j;                  df       |j;                  df       t        dt        dt        |       dt        j\                         d[dQ       t        j                  jK                  d      }̐dt        j                  d<   	 j_                  dd      5 }D Ώcg c]  \  }}͐ja                  |ϫ       }}}|D cg c]  }|ѐjc                          }}ddd       ̀"t        j                  j                  dd       nt        j                  d<   	 t        dd[       D ]  }|Ӑjd                  D ]0  \  }}}|rt        dԛ dC՛ dC֛        t        dԛ dC՛        2 tg        Ӑjh                        }|rtk        Ӑjl                        rg }D ]  }|j;                  |ث         t%        d       	 t        j*                  jo                  dt        tv                     ddlm}m}  |٫       \  }}ܐtw        ||ܫ      \  }}|D ]:  }jK                  |i       }t?        |jK                  dd|ݫ      ty        |ݫ             < D ]d  }|jK                  dë      xs jK                  dī      xs g }|r&dj                        }t=        dd   d| d       Ut=        dd   dƫ       f t{        ܫ      }|r|j;                  dǫ       t%        dɫ       tl        dz  dz  }|jo                         rt?        d̫       dz  }|jo                         rR	 ddl}|jM                  js                               }t        |jK                  di             }t?        d| dН       dz  }|jo                         r#t}        dԄ j                         D              nd}|dkD  r t=         d՝d֫       nt=        dאdث       ddzl!mU}> dt        fdل} |>dګ      xs	  |>d۫      }|rt?        dܫ       n-        rt?        dݐdޫ       nt=        dߐdtp         d       t%        d       d[}	 ddlC}%tl        dWz  }|jo                         rkt        dIJ      5 }|%j                  |ѫ      xs i }ddd       	 ddlm} |j                        }jK                  d      xs i jK                  dZd[      }st?        dd       ndk(  r	 ddlm}m} |j                         } |       }|jo                         s=j                  sj                  rt?        dd d       nt=        dd       nj                  st        d d       nj                  sj                  st[        ddd|       nSddlm}m}  |        	         t?        dd|j                   d|j                   d|j                          ndk(  rw	 ddlm}  |       }|jK                  dd[      }|rBt?        d       t        d jK                  dd       d|jK                  dd              nt[        ddd|       nX	 ddlm}  |      }|r!j                         rt?         d       n%rt=         dd       nt=         dd       	 ddlm}m}m} ddl} |       D cg c]  }|j                  r } }| rt%        d       t?        t                d               }| D ]  }g }|j                  rj;                  d       j                  r!j;                  j                  dd        j*                  dWz  jo                         sj;                  d       j*                  dGz  jo                         sj;                  d       j                  z  }|jo                         sj;                  d       rdj                        nd}Bt?        dj                   dB|B        ! j                         rj                         D ]  }|j                         s	 js                         }"d|"v rbj                  d|"      }|rJ j                  d            s1t=        dj                   dj                  d       d        t                ||z   }|r|	dkD  r t        t        dt        j                                t        t        d|	 dt        j                   t        j                        d[       rCt        t        dCt               d t        j8                  t        j                               n
t                t                rwt        d      D ]  \  }}t        d| d!|         t                t                yrt        t        dt        j8                               t        t        d"t               d#t        j8                  t        j                               t                t        |d      D ]  \  }}t        d| d!|         t                |st        t        d$t        j\                               t                yt        t        dt        j                                t        t        d%t        j                   t        j                               t                yc c}w # t@        $ r}t=        d#|        Y d}~+*d}~ww xY w# t@        $ r}t=        d.|        Y d}~*d}~ww xY w# tf        $ r# t[        |d@dA| dBti                dC|  |       Y )Cw xY w# tf        $ r t=        |dE       Y )>w xY w# t        $ r Y (w xY w# t@        $ r d}-Y &w xY w# t@        $ r
 d}.d}/d}0Y &w xY w# t@        $ r g }1Y &w xY w# t@        $ r Y &w xY w# t@        $ r |)}6Y %w xY w# t@        $ r Y #w xY w# t@        $ r}t=        dd| d       Y d}~#Jd}~ww xY w# t@        $ r*}Kt=        dK        |j;                  d       Y d}K~K"d}K~Kww xY w# t@        $ r Y #w xY w# 1 sw Y   "xY wc c}Ow # t@        $ r Y !w xY w# 1 sw Y   !xY w# t@        $ r Y  w xY w# 1 sw Y    xY w# t@        $ r i }]Y  w xY w# t@        $ r Y  w xY w# t@        $ r Y  w xY w# t@        $ r i }]Y  w xY w# t@        $ r Y  w xY w# t@        $ r}ht=        ddh d       Y d}h~hd}h~hww xY w# t@        $ r}t=        dd| d       Y d}~d}~ww xY w# t@        $ r Y w xY wc c}ww # t@        $ rn}ddlym~}m{}  ||      r>t=        tp         dd| d       |r }      }|jK                  d      r	 ~j                  t        }            }|j                  d      j                         d   }|j                          n# t@        $ r d}Y nw xY wjK                  d      rt        d         j                  nd}t?        d ddjK                  d       d| d       |	dz  }	nit=        ddjK                  d       d|jK                  d       d       |j;                  d       n&|j;                  d       nt=        tp         d|        Y d}~d}~ww xY w# t@        $ r Y w xY w# t@        $ r d}Y 	w xY w# t         j$                  $ r d}Y w xY w# t         j$                  $ r d}Y w xY w# tf        $ r t[        dedfdg|       Y (w xY w# t@        $ r Y 7w xY w# t@        $ r tv        dz  dz  }Y 7w xY w# t@        $ r Y w xY wc c}}w c c}w # 1 sw Y   ^xY w# ̀"t        j                  j                  dd       w t        j                  d<   w xY w# t@        $ r}t=        dd| d       Y d}~d}~ww xY w# t@        $ r t=        dѐdҫ       Y Bw xY w# 1 sw Y   7xY w# t@        $ r Y ,w xY w# t@        $ r Y w xY w# t@        $ r'}t[        dt              d| |       Y d}~d}~ww xY w# tf        $ r t[        ddd|       Y 
nt@        $ r!}t=        dt                     Y d}~
d}~ww xY w# tf        $ r t[        ddd	|       Y 
t@        $ r!}t=        d
t                     Y d}~
d}~ww xY w# t@        $ r$}t=         dt                     Y d}~d}~ww xY wc c}w # t@        $ r Y 	ww xY w# tf        $ r Y t@        $ r Y 	 w xY w(&  zRun diagnostic checks.r   FackNHERMES_INTERACTIVE1r   )
ADVISORIESack_advisoryz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MCP Server Securityr   )validate_mcp_server_entrymcp_serverszMCP server 'z' has suspicious stdio commandz; zReview/remove mcp_servers.zC in config.yaml; rotate any credentials that may have been exposed.z No suspicious MCP stdio commandszMCP security check failed: zPython Environment)      zPython r   )r  
   zHPython 3.11+ recommended for RL Training tools (tinker requires >= 3.11))r  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SSL / CA Certificatesz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providerrm   default)PROVIDER_REGISTRYresolve_provider>   autocustomrJ  )get_compatible_custom_providers)rM  resolve_provider_fullr_  )is_provider_enabledc              3      K   | ]O  \  }}t        |      j                         r1 |      r)t        |      j                         j                          Q y wrJ   )rc   r   r   )rK   r]   prov_cfgr  s      r0   rM   zrun_doctor.<locals>.<genexpr>i  sG      '&h4y(-@-J IOO%++-'s   AA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  nousrD  rF  lmstudio	deepinfra	fireworksrJ  rC  rG  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  rJ  )get_env_valuer   r   )r  get_auth_statusrb  rW   
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 (v)r  rX   zStale root-level config keys: z"(should be under 'model:' section))atomic_config_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')r  )validate_config_structurezConfig Structureerrorz#xAI Model Retirement (May 15, 2026))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_statusrz   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)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.md)z<!--z-->r   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))_db_opens_cleanlyrepair_state_db_schemaz?/state.db fails a write-health probe (FTS index may be corrupt)repairedbackup_pathzn/az"Repaired state.db FTS write healthz(strategy: strategyz
; backup: z>state.db FTS write-health repair did not recover automaticallyue   state.db FTS write corruption and auto-repair failed — restore from the backup copy beside state.dbur   state.db FTS write corruption — run 'hermes doctor --fix' (or 'hermes sessions repair') to rebuild the FTS index)is_malformed_db_errorr  z>/state.db schema is malformed (sessions hidden until repaired)?zRepaired state.db schema (z sessions recovered)z4state.db schema repair did not recover automaticallyua   state.db schema malformed and auto-repair failed — restore from the backup copy beside state.dbup   state.db schema malformed — run 'hermes doctor --fix' (or 'hermes sessions repair') to recover hidden sessionsz!/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)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@)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)z$agent-browser found but not runnablez(broken symlink at z? run: npm install)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)npm)resolve_whatsapp_bridge_dirscriptszwhatsapp-bridgezBrowser tools (agent-browser)z--workspaces=falsezweb workspacez--workspacewebzui-tui workspacezui-tuizWhatsApp bridgeaudit--json   )cwdr  r   r  metadatavulnerabilitiescriticalhighmoderatezcd z$ && npm audit fix --workspaces=falsez && npm audit fixz depsz(no known vulnerabilities)z critical, z high, u    moderate — run: u;    moderate — build-tool advisory; clears via lockfile bumpu     ^ build-time tooling (not runtime); if manual npm remediation errors with an arborist crash it's a known npm bug — clears via a lockfile bumpz has z npm vulnerabilityz
 moderate zTermux compatibility fallbacks:zAPI Connectivity)
namedtuple_ConnectivityResult)labellinesr   r+   c                  z   t        j                  d      } | s> dt        dt        j                        dt        dt        j
                        fgg       S 	 dd l}|j                  t        dd|  id	      }|j                  d
k(  r& dt        dt        j                        ddfgg       S |j                  dk(  r? dt        dt        j                        dt        dt        j
                        fgdg      S |j                  dk(  r? dt        dt        j                        dt        dt        j
                        fgdg      S |j                  dk(  r? 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        $ rM} 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  headersr     r   rm     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)rg   getenvr   r   r   r   r  rf   r   status_coder   r   r<   )rL   r  rr  r  s       r0   _probe_openrouterz%run_doctor.<locals>._probe_openrouterl  sW   ii,-& v}}-/?*FJJ79 :	 2			%(GC5/:  A
 }}#*$E6<<02BBGH 
 }}#*$E6::.0@/<> ?78	  }}#*$E6::.0@CVZZPR SA B	  }}#*$E6::.0@,fjj9; <7 8	  ' vzz*,<&q16::>@ A	   	& vzz*,<!A3a&**-/ 0-.	 	s<   AG$ .AG$ <AG$ 
AG$ AG$ $	H:-AH5/H:5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	j                  ||z         |d
<   n||d<   |j                  d|d      }	|r|	j                  dk(  rd|	j                  j                         v rdd|	j                  j                         v rHd	j                  |D 
cg c]
  }
|
|k7  s	|
 c}
t        |      z         |d
<   |j                  d|d      }	|	j                  dk(  r& dt        dt        j                         ddfgg       S |	j                  dk(  r> 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 c c}
w # t(        $ rL} 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 availabler  r   rm   r  r   r  r   z(couldn't verify)r   r   )r   r  r  agent.anthropic_adapterr!  r"  r#  r$  r  rf   r  r   r   rs   r   r   r   r   r   r   r<   )r  rL   r  r!  r"  r#  r$  r  is_oauthr  br  r  s               r0   _probe_anthropicz$run_doctor.<locals>._probe_anthropic  s@   5!&B??>	  +L9G&s+H-4SE?(,/HH]EV5V,W()'*$		5  A MMS('166<<>9'166<<>9,/HH -G16F1FQG,-.-() II9#R   }}#*#E6<<0/2FG 
 }}#*#E6::./<> ?	  'v}}-+VZZ8: ;	 ) H4  	&v}}-!A3a&**-/ 0	 	sE   B/G	 
GGAG	 9AG	 =G	 G	 		HAHHHc                    d}|D ]  }t        j                  |d      }|s n |s
 | g g       S | j                  d      }|s> | t        dt        j
                        |t        dt        j                        fgg       S 	 dd l}|rt        j                  |d      nd}	|	s|j                  d      rd}	|	r.|	j                  d      j                  d	      rdd
lm}
  |
|	      }	t        |	d      r4|	j                  d      j                  d      r|	j                  d      dz   }	|	r|	j                  d      dz   n|}d| t        d}t        |	d      rd|d<   |r#t        |d      r|j                  dd        ||d<   |j!                  ||d      }| dk(  r%|	s#|j"                  dk(  r|j!                  d|d      }|j"                  dk(  r& | t        dt        j
                        |dfgg       S |j"                  dk(  rF | 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(        $ rL} | t        d t        j&                        |t        d#| d"t        j                        fgg       cY d }~S d }~ww xY w)$Nrm      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/v1rY  r  )r  
User-Agentzclaude-code/0.1.0r-  z!generativelanguage.googleapis.comr  zx-goog-api-keyr  r  r2  r  z8https://dashscope.aliyuncs.com/compatible-mode/v1/modelsr  r   r  zCheck z in .envr   r  r   r   )rg   r  ljustr   r   r   r   r  rd   rh  r   agent.auxiliary_clientr,  r   r   poprf   r  r   r   r<   )pnamer   default_urlbase_envrZ  rL   evr  r  baser,  urlr  r  r  r  s                  r0   _probe_apikey_providerz*run_doctor.<locals>._probe_apikey_provider  s    	B))B#C	 &ub"55B$&v||,e*FJJ79 :	 B	.6299Xr*BD CNN:67 C(11,?F*40$T>:t{{3?O?X?XYb?c{{3'%/484;;s#i/kC#*3%0G %T>:(;% ,S2UVOT2,/()		#w	;A,,MMS(IIN#R   }}#*E6<<0%<= 
 }}#*E6::./<> ?hqk](34	  'v}}-u&q16::>@ A	   	&v}}-u!A3a&**-/ 0	 	s.   E/J 3AJ AJ 	K)AK$K)$K)c                     	 ddl m} m}m}  |        s
 dg g       S  |       } |       }dj                  d      }	 dd l}ddlm}  |dddd	i
      }|j                  d||      }	|	j                         }
t        |
j                  dg             } dt        dt        j                        |t        d| d| d| dt        j                         fgg       S # t        $ r  dg g       cY S w xY w# t        $ rf  dt        dt        j"                        |t        dt$        j&                   dt        j                         fgdt$        j&                   dg      cY S t(        $ ri}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retriesrH  )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 boto3r  r   zAWS Bedrock: u;    — check IAM permissions for bedrock:ListFoundationModels)agent.bedrock_adapterr9  r:  r;  ImportErrorr.  boto3botocore.configr=  clientlist_foundation_modelsr  rf   r   r   r   r   r   r5   
executabler<   type__name__)r9  r:  r;  auth_varr  r  rH  _BotoConfigrY   rJ  respnr  err_namer  s                 r0   _probe_bedrockz"run_doctor.<locals>._probe_bedrockC  s   	>  #$&}b"==+-')##B'#	=  !'+C
 \\)\LF002DDHH-r23A&v||,e!H:Rxr!H=vzzJL M	 )  	>&}b"==	>4  	&v}}-u3CNN3CCYZ

$% & /s~~.>>STU   	Aw''H&v}}-u!H:Rs!,fjj9; < 
 +0 1 2	 	s7   
C BC5 C21C25A,G#G+AG	GGc                     dj                  d      } 	 ddlm}  |       }t        |t              r|j                  d      ni }t        |t              s
 dg g       S t        |j                  d      xs d      j                         j                         }t        |j                  d      xs d      j                         j                         }|d	k7  s|d
k7  r
 dg g       S 	 	 ddl
m}m}m}m}	  |	       sQ dt        dt         j"                        | t        dt         j$                        fgdt&        j(                   dg      S t        |j                  d      xs d      j                         }|j                  d      xs i }t        |t              si }t        |j                  d      xs d      j                         xs |} ||      } ||d      }|j                  d      ro|j                  d      xs g }|rdj+                  |      nd} dt        dt         j,                        | t        d| d | dt         j$                        fgg       S |j                  d!      xs d"}|j                  d#      xs d$} dt        dt         j"                        | t        d| dt         j$                        fgd%| d&| g      S # t        $ r  dg g       cY S w xY w# t        $ rP}
 dt        dt         j"                        | t        d|
 dt         j$                        fgd|
 g      cY d}
~
S d}
~
ww xY w)'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   r  r  rm   	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-identityrX   entrascope)r_  g      $@)rD  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.  r   r   r   r   rf   rc   r   r   r<   agent.azure_identity_adapterrZ  r[  r\  r]  r   r   r   r   r5   rL  r  r   )r  r   rY   	model_cfgcfg_providerrX  rZ  r[  r\  r]  excrX   	entra_cfgr_  rD  r  rb  tagerrrc  r  s                       r0   _probe_azure_entraz&run_doctor.<locals>._probe_azure_entrav  sP    +004	K5-C,6sD,A(rIi.*+Er2NNy}}Z8>B?EEGMMOLIMM+6<"=CCEKKMI.)z2I*+Er2NN 3J
	  ,-&*v}}-u8&**EG H+CNN+;;YZ[	  y}}Z06B7==?MM'*0b	)T*I	g&,"-335 &% 	 %
 *N88D>((=17RK,7$))K(=WC&*v||,e!C5q16::>@ A	  hhw?#?xx 
L 	 #&E6==)5auAJ

+- .$SED623	
 	
i  	K&'A2rJJ	K  	&*v}}-u23%q96::FH I8>?	 	s8   A	K BK (K. K+*K+.	M7AM<MMr  r   c                      | ||||      S rJ   r.   )r   r  ur(  sr7  s        r0   <lambda>zrun_doctor.<locals>.<lambda>  s     6q!Q1 E r/   r<  rV  r   zRunning u#    connectivity checks in parallel…)endflushAWS_EC2_METADATA_DISABLEDtruer   zdoctor-probe)max_workersthread_name_prefixzH                                                                      )rq  zTool Availability)check_tool_availabilityTOOLSET_REQUIREMENTSr   r   z	(missing z(system dependency not met)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   | ]  }|j                         sd   yw)r@   N)is_dir)rK   ds     r0   rM   zrun_doctor.<locals>.<genexpr>2	  s     DAaDs   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 yw xY w)z?Check if gh CLI is authenticated via token file or device flow.)ghauthstatusr  authenticatedTr  r  r   F)
subprocessrun
returncodeFileNotFoundErrorTimeoutExpired)results    r0   _gh_authenticatedz%run_doctor.<locals>._gh_authenticated:	  sM    	^^C#RF $$))!:#<#<= 		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 Providerr|  memoryzBuilt-in memory activeu2   (no external provider configured — this is fine)rr   )rR   resolve_config_pathz+Honcho configured via environment variableszconfig file z( not found, using HONCHO_API_KEY env varz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_idz  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_exists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.rd  z  Found z issue(s) to address:z=  Tip: run 'hermes doctor --fix' to auto-fix what's possible.u     All checks passed! 🎉)ri  rg   rh   
setdefaulthermes_cli.security_advisoriesr  r  idr   r   r  r  r   r   r5   exitr   r   r   r  r  r  r  r   advisoryr   packageinstalled_versionr   rA   r   r   r<   r   r   hermes_cli.mcp_securityr  rf   r   r   r\  version_infomajorminormicror   prefixbase_prefixr   r  
__import__rG  r1   r  HERMES_HOMEr  _DHHr   rP   r   parentmkdirtouchchmodrc   r   r   r  	safe_loadr   r   r[  r   r  r  keysr  ra  rM  r  r  r^  r]  replacerd   r  rU   r  r:   copy2r  r  r  r  openr0  r  r  r  r   r  severitymessagerc  r   hermes_cli.xai_retirementr  r  r  r  r  r  rz   r=   r~   
write_textsqlite3connectexecutefetchoneclosehermes_stater  r  r   r]   r  statst_sizer  r
  r6   homerelative_to
is_symlinkresolveunlink
symlink_tor   pathsepr7   r  hermes_constantsr  r  r  r  r  r-   path
expanduserr  r  r;   r	   rD   tools.browser_toolr  r  r  r  r  !gateway.platforms.whatsapp_commonr  jsonstdoutloadsrF   concurrent.futuresfuturescollectionsr  r  rz  r   ThreadPoolExecutorsubmitr  r  rs   r   r   r  insertmodel_toolsrw  rx  rv   rn   r   r  iterdirr   r}  apply_managed_overlayrS   rR   r  rT   rW   rX   rV   r  r  workspace_idrecall_modewrite_frequencyplugins.memory.mem0r  plugins.memoryr  is_availablehermes_cli.profilesr  r  r  re
is_defaultgateway_runningr  r|  is_filesearchgroupr   	enumerate(  args
should_fix
ack_targetr  r  a	valid_idsr   manual_issuesfixed_countr  r  r  r  all_hits
fresh_hitshitr   	acked_idshr  r   r  servers
suspiciousr]   entryissues_found
py_versionin_venvrequired_packagesoptional_packagesmoduleenv_pathrG   fallback_envconfig_path_yamlrY   model_sectionprovider_rawr  default_modelknown_providersr  _resolve_auth_provider_compatible_custom_providers_normalize_catalog_provider_resolve_provider_fullcustom_providersuser_providersvalid_provider_idsprovider_ids_to_acceptknown_providerruntime_providercatalog_providerprovider_def
known_listprovider_for_policyprovider_policy_id providers_accepting_vendor_slugsprovider_accepts_vendor_slugr  r  r  pconfigr  fallback_configexample_configr  r  r  r  current_ver
latest_vermig_errr  fr   kstale_root_keys	raw_modelr  r  r  	agent_cfgcfg_max_turns	env_ghostdrift
_yaml_depr_load_env_depr_f_depr_raw_for_depr_env_for_deprr  config_issuesci	hint_liner  r  r  _xai_cfgretired_refsref_xai_check_errr  r  rz   nous_statuscodex_statusminimax_statusr  r~   xai_oauth_statusr   expected_subdirssubdir_namesubdir_path	soul_pathlr  memories_dirmemory_file	user_filesizestate_db_pathr  conncursorcountr  r  _write_reasonreportbackup_namer  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targetr8   daytona_keyr  agent_browser_pathagent_browser_ok	_which_abrC   r  r  r  r  r  skip_chromium_check_npm_binr  _whatsapp_bridge_dirnpm_audit_targetsnpm_dirr  audit_extra	check_diraudit_result_json
audit_data
vuln_countr  r	  r
  totalfix_cmdvuln_detailnote_futures_namedtuple_probesr  r)  rT  rl  _entry_pname	_env_vars_default_url	_base_env	_supports
_imds_prev_ex__fn_futures_in_order_f_results_r_glyphro  _detail_issues_to_add_issuerw  rx  ro   rp   tidr  r[   r   vars_strapi_disabledhub_dir	lock_filer  	lock_datarz  q_countr  github_token_active_memory_provider_mem_cfg_path_raw_cfgr}  rR   r  hcfg_honcho_cfg_pathr  r  _e_load_mem0_configmem0_cfgmem0_keyr  	_providerr  r  r  _rer   named_profileswrapper_dirpartswrapper_mremaining_issuesiissuer  r7  r  s                                                                                                                                                                                                                                                                          @@@r0   
run_doctorr  _  s}4   ue,Jud+J JJ.4
 	
 $..aQTT.	.Y&%'
~]99VI./;8<>

 
 HHQK
#%.zl ;= >  	 %2:, ?; <

 
 HHQKFMK	G	%  D  FL  FQ  FQ  R  S	%SU[U`U`
ab	%  D  FL  FQ  FQ  R  S"#+;	
 	
 &'#H-
! ||))*}Bs'<'<&=Q? 2#6  DU4%?$@AB	  $$00A B!!$R0E0E/F G,,/LLOO+<B@, &I ::==I-99+R(;(;'< =%%&ZZ]]O>C 45
 "#61E-##M28b
gt$%gmmo6 
e!%.8uE#a
\$/MNPTPYPYZfPgh$$06yz
 ?78 !"!!JW7:++,Aj.>.>-?qAQAQ@RST	w	7:++,Aj.>.>-?qAQAQ@RST]^	v	WZ--.a
0@0@/A:CSCSBTUWlmj&&'q)9)9(:!J<L<L;MN%		
 jjCOO+G-./A v&$% ! * l	lvTNl * :	:vT<(: "#V#HD6*+, $$g$6#G,<=-dV59:MMDE $f, >?$123%%dT%B HHS]E2 >$u56EFq =>AB -KD6,-.z	M //+"7"7"7"IJPbCGGG,2M)--j9?RFFHL#))+H*..y9]]=N=Nw=W][]ddfM#&5O #&&7&<&<&>"?Bb"b	.m  "+7*'CC'H$ !WW[1N.$/A&& '*8*>*>*@' 
 * T!%.599V,2399;#''	DJJL4H4Hc4R(RST "%_!53;hZ"*6&5 !N!*../J>/Z[!  (*6$660'=h'G$*../?@  (*6$665hP`a6B6N<??TX #/*../?@H.#+#36HHGV6/+B!C\kJ#*<.8VW":,a0.|n =00:| <[\ 	 #3"F6F!$%8%>B!?!E!E!G!M!M!O0,& #&FF <%1<%00; ) =(&4%m_4`am`nnopS %m_4`am`n o\ \  $4<N$N '<7C%).B C IrJPPR R"=1A#B#HbIOOQ&

 W"3"7"78H"I%)
"wwR'HI'U%45E%F%L"F)- &

< 8 !9#)::k#:!9#)::i#8*J
 &'./?.@@efJ"EFVEW XWW[V\ ]e!f #	  ')::!!#DE""(((E!-0I!I!((*LL^!4c+6FGxv-VWXM/xv-GHIq 24FG -K	N&:&<#KZ'0VJ<qQ. N&5F !DE#q(
 MM"ab7}AFG
#	kG4 5!^^A.4"
5*ByQa:oZdeopqertwZxqyOy4TYY5O4PQ8  !+w 7I!)T2(1#Is3	8I)2IOO4E(F.;
7+(*.;
7+, .,003/9~~a/@M!,&NN1-	.
 F'Z@PQ1$KMM"st-	DkG4 5!^^A.4"
5"w/I i. k*  $ *{ ; 
'>?IT) IT)I&,,.#i.2F2F2HH 
 ,YK 8''4o_FF
 '(?@ <<I?J`b $q("#UV%,,R#f$[]
 MM4	%DkG4 D * 4 4W = CD# . 0 -]MJ
	C57M+,' .B{{g-"2::."2::.%'WW%7%7%9 .	"9-.MM"**-. 		D# . 0 -R? 23J1	
 	
 =,X667# .<,-.*+>*?@A  #l+, -**=)>@ &F	
 	
 +,??;''7)+<=,.K((-8*,=>(<01
 w'8 78k*#''(;F_(;F81&EF(9:
=46<",[-0{$56##G,+G45 "#KD6*+,	$68D6,-qdV:&(HI J' 	]!K/vQ{m845dT:xvQ{m1561K$q[9;[\	] i'I%%w%7==?#..0qqAGGIaggiFZFZ[oFpqqvABC$`abdV-.0ab""4$"?  < !	 !  xv%ABC1K +LD6456"[0 9,	{,,g,>DDFGD)$w78ijy**G*<BBDED'vW56ghdV/02RStd;xvZ011K  *,M^	J??3}#56D\\"ABFOO%a(EJJLv/wjAB O-m<M(f[\a( 3MBFzz*-  &zz-8 !!67<<>C $ !@)&**Z*@)AK=XYZ $q("\

7 34Jvzz-?X>YYZ[ K
 MMQj 	dVWXY ^+H	}}..H**)(y*A)B$G7 ""??3}+=>DLL!ABJJL:B//:Kx}}66QRH9(d:J9K6RZ^bRbQccefg1$KMM"^_,,\(y*A)BBbcd "&)&!
||w'(	+ 	J%
2U:XEJ  "&			 **..2.bjjnn-=>?dCY]dCdg ME1M - IIK(2U:M .!H,	,d   ,\N:qr 01F1F|1T0UUVWX ##%#++-%--/	i' 122LMN,--KLy	{!D "!((*!,,Y7 ?3D2E\R[Q\!]^#q((:;L:MMr&st!!#-..JKL()):;D !''t'D((301B0C<PY{[\1$K "$!;!A!A"**!MJ=);"011EFc &,,t4E3Fm-TUMMH->,??l"mn5?L1 4!78+-OP01LY1W0XYZ 99^W5L%B,  8#B
 #Lxx #6(:4Y[\ !f&7&71&<#56 ;RAVX^_"47	 
X	<(	XY	%|4 u9901yy!45Hyy!45Hii 23G19z8*-xFJCh''bgg009::FI&&C##'	 !f&7&71&<-hZ89"4XJ ?GcdlcmEnpvw+1/	 y ii 12&7)5:			']M2 6)N:_L LL1	$$&.0FG#1)<_&<=# 6%i[0CD \\]no./34H !4 ! 46JK JL)   %& 2-/02*,D82 01	 $ +*, !68JK"?M <<72&"3L> BB !B
 '"3L> BN !N 
]^GH*+/uE 	Dt	 	&(NO 5!H	PU#>#@  :=Q<RS?]E,BC-x/HI!#4b9	
 ,= J	'GUK )4I.668C  *~~w?;?G#'dB 
 %AMATATAZAZA\U[[)<)<=bd
'^^J;??@QSUV
%>>*a8!~~fa0%>>*a8 4(2;q>]#B #G %9$:: #G9,PQG #G9,=>GA:we_.JK\TAX'jD6
J]^e]fg $
  (jD6
 KL L $  'K=* #{1~'F #2
 MM 'ugU.3qj?>OPR
  'H:Z.6!m?ARSSTVIJ	X |4568 	Dt	   *5%; G;2 ;zC1 CJS9LS Sj1/ 1fO
 3 O
d NN$&789NNO%567 &">"@) H@F=	<I 	9)2i!F G 	HH NNM>23NN.0BCD 
BuxG~-PQSYS]S]^_
`  ;<J.4BJJ*+A ((Q<J ) L 	AOR?F GVQC G G.?@		@H@	A
 JJNN6=6@BJJ23 

 b) 
"')xx 	.#FFG6(!F81WI676(!F8,-		.
 biiMbhhWN$ 	"FMM&!	"
"  !B3|,-MM!8!:	;!J9Va!b	; 	SC'++C4DTXXfc*,LS,QR	S   	HDxx/M488J3GM2H99X.4<9XJa)@A4<)FG	H =[IMMab \H$v-G~~./k)	E JJy':':'<=	IMM+r:;>%0HIJ |+
HRHYHYH[#D!3!3!5DDabQ;'"9:<NO9;VW/	t 	 !0MM*4MLEF		24bc$(I$Of&gh #m3!mg6 5" ??2.4"54(>>xH (0||H'='C&H&HUW&X# #)+_`	 H	,+	7\\%88:D24#**, <<4==E&'7&88`a
 8:TU\\CDTCUUbcdlldmm8.E	 `_#%n%d+*$T%6%6$7vd>N>N=OvVZVjVjUkl 
!F	*	5M(*H||Ir2H23Xhll9c&B%C;x||\fhkOlNmno*KK	"
	K;,-DEIY335344DEF566STVqr566GHJde)WW%2_IALL!IIZ N+,,=>?*,K# 2$$LL!2377LL"..668LL!56//1LL+%.~~'LL,-25)2affXRx012" !!#*224 
G"??, ")"3"3"5&'1!$,>!HB!.!*E *^GLL>XZX`X`abXcWddv+w x
  
G-kAoeJ-.eh{m:6fkkRXZ[%!C 0122XY[a[h[hjpjujuvwG%&6: )51#Rw'()G 
G 
eJ./ehs#3455JKV]]\b\g\ghi!"2A6 	%HAuBqcE7#$	%%WY_YcYcde
 
G 	eJ-.e/v{{KL	GS< /T  ;5aS9::;2  604556j  	lD+$rBUBWAXXYZ`Ya/bdjk	l  	:t89	:H  <  )-&  ./3,.2+)-&. ! *')$*0 % ! ! ! 0'/$0b !   	MAQqc8LL	MJ % N"%<WI#FG&LMMN  		5 5y<  		 5 5R  		D D  # "#  		$  		  # "#  		2  J1Q~6Fa3HIIJT  F)-?s!+DEEF  @ rv  /	JR$Q'
 fZ[s!H 3MBFzz*-(#*??3}3E#FD$(LL ?%&hj%,E !JJL( ($'E(  &zz-8 !!67<<>C $ !8?ST)&**Z*@)AK=XYZ $q("R

7 34Jvzz-?X>YYZ[ K
 MMS
 dV#DQCHI_/	JR  		H  %$%, ,, X ,, :  	+':		n   p  	P#/)#;>O#O 	Pb  @ !H@	A 	A
 JJNN6=6@BJJ23V  B6!A3aAAB  E;(CDEH5 5
    N ! n#$>BK_`b_cIdflmmn 	)'Q	  	7,c"g66	7"  	*$L	  	5*CG44	5  	K12-@#b'JJ	K J@ %   s  Bx&4DBx+ A
Bx+ *B?By $By5Bz$B{  B1B|< &B{ 8B{" B|< B{8 BB|< )AB|< ?B|
B|< #B| <DB|< C5B|, ,,B~ B}# 3"B~ B~; 'B~)=B~; 		B~6B~6'B~6+C6B~; "B ;BDB  C@ 7B(C@ B5 C@ *B C@ @C@9 @"C@' @)C@9 AA3CA	 C C(CA0 F)ACB L<CB'MCB'M2CB'T.ECB, Z)C8CH' l.CH7 m& CI	 r>CI' u%CJ y<CJ& ~CJ6 /F*CKL9CK< MCK/MCK$M2CK/M9CK*NCK/NCK< RDCL9 W(ACM! \
*CN \4CM?]
CN ]CN ],&CN ^,C	CO a6ACN, c A5CP( d7ACQ1 fCR6 f'CR!f:CR!f>FCR6 mA8CR&oCR6 x+	Byx4ByyByy	By2yBy-y-By2y5(Bz!z Bz!z$Bz=z<Bz={ 	B{{B{{B{{B|< {B{{B|< {"B{5{1B|< {4B{5{5B|< {8B||B|< |B||B|< |
	B||B|< |B||B|< |B|)|%B|< |(B|)|)B|< |,	B|9|5B|< |8B|9|9B|< |<	B} }B}}B} }#	B~},B~~B~ ~B~~B~ ~	B~&~%B~&~)B~3~.B~; ~;	BBBB 	B%$B%(B2-C@ 5C@@ C@ @C@@C@ @	C@@C@@	C@$@#C@$@'C@6@2C@9 @5C@6@6C@9 @9	CAACAA		CA-ACA(A(CA-A0	CBA9CBBCBB	CB$B#CB$B,
CH$B6ACHC;ACEECHECEECHECEECCHHCH$H'	CH4H3CH4H7CIICII	CI$I#CI$I'CJJCJJCJ#J"CJ#J&	CJ3J2CJ3J6CKKCKK	CK!K CK!K$CK/K/CK9K4CK< K<:CL6L9	CMMCMMCMM!CM<M;CM<M?CN	NCN N	CNNCN NCNNCN N	CN)N(CN)N,	CON5COOCO OCOOCO OCP%O<CP%PCP P CP%P(CQ.QCQ.QCQ)Q)CQ.Q1	CRQ:CRRCRR!CR6 R&	CR3R/CR6 R2CR3R3CR6 R6	CSSCSSCS)rm   )NN)r+   N)I__doc__rg   r5   r  r:   pathlibr   r   r   r   r   hermes_cli.env_loaderr   r  r   r	   r   r  r  	_env_pathr  hermes_cli.colorsr   r   hermes_cli.modelsr   r   utilsr   rO   r*   r-   rc   r1   r7   r=   rU   rs   rD   rF   rP   rZ   r   rj   rn   re  rv   r   r   r   r   r   r   r   r   __annotations__r   r   r   r   r   r[  r   r   r   r   r
  r  r  r  rz  r  r  r.   r/   r0   <module>r     s   
 
    M M 4 0 3! N	 y//\F=R S + 0 2 ' 8 5IS I%S %S %S S4Z  c DI >c >d >
$ RT Rd Rc c 2c 2QUVZQ[ 2`efjknfoquvzq{f{`| 2$C D 0j3 j jkS k# khS h# h5S 5;C ;D ;# s  d3i D = uS#s]3S89 9 $eCHo 5 eE#s(OS01 td{ tE#s(O?T 2 eCHo9N " #tD[ 
%S/2#c(T/ tDz d4j t 4
tCy 
T 
8-$s) - -`<")L$s) )L )LX (,  +Yd YxL2Zr/   