
    sj             
       2   U d Z ddlZddlZddlZddlZddlZddlmZ ddl	m
Z
mZmZ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dl"m#Z# dZ$ddlm%Z& de'fdZ(de'de'fdZ)d]de'dz  de'fdZ*dede+e,e'ef                  fdZ-dZ.dede'fdZ/dede,e'dz  e'dz  f         fdZ0dede'fdZ1	 	 d^dedz  de,e2df         dz  ddfd Z3d!e'de'dz  fd"Z4d#e5de+e'         fd$Z6de+e'         fd%Z7d&e'de5fd'Z8de5fd(Z9d)e:de5fd*Z;d+e'de'fd,Z<de+e,e'e'e'f                  fd-Z=d.e+e'         d/e+e:         de,e+e'         e+e:         f         fd0Z>d1e'de5fd2Z?d_d4e'd5e'fd6Z@d_d4e'd5e'fd7ZAd_d4e'd5e'fd8ZBd4e'fd9ZCd:ZDdd;lEmFZG d]d<e:de+fd=ZHd>e'ddfd?ZId4e'd5e'd@e'dAe+e'         ddf
dBZJdCZKe,e,e'e'e'f         df         eLdD<   dEZMe,e'df         eLdF<   dGZNe,e,e'e'f         df         eLdH<   dIe:dz  de+e,e'e'f                  fdJZOdKe:dz  de+e,e'e'f                  fdLZPdIe:dz  dKe:dz  de+e,e'e'f                  fdMZQ	 	 d^dIe:dz  dKe:dz  de+e,e'e'f                  fdNZRdeSe'         dz  fdOZTd/e+e:         de+e:         fdPZUde'dz  fdQZVdAe+e'         ddfdRZWdAe+e'         ddfdSZXd`dUe5dAdVddfdWZYdAe+e'         ddfdXZZda[e+dz  eLdY<   de+fdZZ\dad[Z]d\ Z^dS )bzK
Doctor command for hermes CLI.

Diagnoses issues with Hermes Agent setup.
    N)Path)detect_install_methodget_env_pathget_hermes_homeget_project_rootis_nix_install_method%recommended_update_command_for_method)load_hermes_dotenv)display_hermes_home)agent_browser_runnable.env)hermes_homeproject_env)Colorscolor)_HERMES_USER_AGENT)describe_vercel_auth)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ACTUAL_API_KEYACTUAL_BASE_URLMINIMAX_API_KEYMINIMAX_CN_API_KEYKILOCODE_API_KEYDEEPSEEK_API_KEYDASHSCOPE_API_KEYHF_TOKENAI_GATEWAY_API_KEYOPENCODE_ZEN_API_KEYOPENCODE_GO_API_KEYCOMMANDCODE_API_KEYXIAOMI_API_KEYTOKENHUB_API_KEY)	is_termuxreturnc                  &    t                      rdndS )Nzpython -m pip installzuv pip install)
_is_termux     5/home/agent/.hermes/hermes-agent/hermes_cli/doctor.py_python_install_cmdr9   L   s    &0llH""8HHr7   pkgc                 \    t                      rd|  S t          j        dk    rd|  S d|  S )Nzpkg install darwinzbrew install zsudo apt install )r5   sysplatform)r:   s    r8   _system_package_install_cmdr?   P   sE    || $#c###
|x$s$$$$s$$$r7   install_methodc                     | pt          t                    }|dk    rt          |          }d| d}n;t          |          rt          |          }n|dk    rdt          |           d}nd}d| dS )	zAReturn an actionable SQLite upgrade hint for this install layout.dockerzrun `z&`, then recreate all Hermes containersapt`zrun `hermes update`(u\   ; fixed versions: 3.51.3+ / 3.50.7 / 3.44.6 — see https://sqlite.org/wal.html#walresetbug))r   PROJECT_ROOTr	   r   )r@   methodcommandactions       r8   _sqlite_upgrade_hintrJ   X   s    B4\BBF7??HHHH	v	&	& '6v>>	5I>vFFIII&	7F 	7 	7 	7r7   r   c                      ddl m}  fd|D             }t           dz  dz                      d                    D ]9}|                    t          |                                         |f           :|S )zFReturn (display name, path) pairs for Hermes-managed SQLite databases.r   )_QUICK_STATE_FILESc                 H    g | ]}|                     d           ||z  fS )z.dbendswith).0namer   s     r8   
<listcomp>z*_hermes_database_paths.<locals>.<listcomp>p   sE       ==	{T!"  r7   kanbanboardsz*/kanban.db)hermes_cli.backuprL   sortedglobappendstrrelative_to)r   rL   entriesboard_dbs   `   r8   _hermes_database_pathsr]   k   s     544444   &  G K(2X=CCMRRSS K KH00==>>IJJJJNr7   s   SQLite format 3 db_pathc                     	 |                                   n&# t          $ r}t          |          cY d}~S d}~ww xY wt          j        | t          j                  sd|  S dS )uv  Explain why a database file could not be read, without opening it.

    ``read_header_bytes_preopen`` collapses every ``OSError`` into ``None``,
    but doctor's job is to say *which* problem it hit. ``stat()`` and
    ``access()`` answer that from directory metadata alone — neither takes a
    file descriptor, so neither can cancel the file's POSIX advisory locks.
    Nzpermission denied: zfile could not be read)statOSErrorrY   osaccessR_OK)r^   excs     r8   _unreadable_reasonrf   ~   st       3xx9Wbg&& /.W...##s    
:5::c                 F   ddl m}m}  || d          }| ||           rdS dt          |           fS t	          |          dk    rdS t	          |          dk     s|                    t                    sdS |d	         d
k    rdS |d	         dk    rdS dd|d	          fS )u"  Return (journal mode, error) from the file header without opening the database.

    Header byte 18 is 2 for WAL and 1 for a rollback journal. Opening the
    database through the SQLite engine — even read-only — creates -wal/-shm
    sidecar files, which a diagnostic must not do.

    The byte read is routed through ``read_header_bytes_preopen`` rather than
    a bare ``open()``: closing *any* descriptor for a database file cancels
    this process's POSIX advisory locks on it, so a raw read would drop the
    locks a live connection is holding (see ``hermes_cli.sqlite_safe_read``).
    ``run_doctor`` is also called in-process by the dashboard console, which
    holds live ``SessionDB`` connections. The helper refuses in that case and
    the mode is reported as unreadable instead.
    r   )has_live_connectionread_header_bytes_preopen   )lengthN)Nz database is open in this process)Nzfile is empty)Nzfile is not a database      )walN   )rollbackNz!unrecognized file-format version )hermes_cli.sqlite_safe_readrh   ri   rf   len
startswith_SQLITE_HEADER_MAGIC)r^   rh   ri   headers       r8   _read_journal_moderv      s           
 '&wr:::F~w'' 	<;;'0000
6{{a$$
6{{Rv001EFF--bzQ{bzQAVBZAAAAr7   c                 |    ddl m} 	 |                                 j        }n# t          $ r Y dS w xY w ||          S )Nr   )_format_sizezsize unknown)rU   rx   r`   st_sizera   )r^   rx   nbytess      r8   _format_db_sizer{      s_     /.....'   ~~<s   " 
00version_info.c                    ddl m}m}  ||          }| | nt          }	 t	          |          }n*# t
          $ r}t          d|            Y d}~dS d}~ww xY wg }|D ]\  }	}
|
                                st          |
          \  }}t          |
          }|0|rt          |	 dd| d           Wt          |	 d| d	           m|d
k    rD|r,|                    |	           t          |	 d| d	d           t          |	 d| d	           |rt          |	 d| d           t          |	 d| d	           |rt          d |                        dS dS )zIList each database's journal mode; warn on WAL under a vulnerable SQLite.r   )_wal_reset_repair_hintis_sqlite_wal_reset_vulnerableNz!Could not list Hermes databases: z : journal mode could not be readrE   z; cannot rule out WAL exposure)z": journal mode could not be read ()rn   z is in WAL mode (z7(exposed to the WAL-reset bug until SQLite is upgraded)z: WAL journal mode (z: rollback journal mode (z, not exposed)zTo clear the exposure: )hermes_stater~   r   HERMES_HOMEr]   	Exception
check_warnis_filerv   r{   
check_inforX   )r   r|   r~   r   
vulnerablehome	databasesre   exposedrQ   pathmodeerrorsizes                 r8   _report_database_journal_modesr      sB   
 TSSSSSSS//==J%1;;{D*400		   <s<<=== G B B
d||~~ 	(..et$$ P===>>>>   
 dNNeNNNOOOOU]] At$$$55d555M   
 d?????@@@@ 	B$MMMMMNNNN$@@@@@AAAA IG-C-C-E-EGGHHHHHI Is   0 
AAAcmdc                 N    	 t          j        |           S # t          $ r Y dS w xY w)zCshutil.which wrapper resilient to platform monkeypatching in tests.N)shutilwhichr   )r   s    r8   _safe_whichr      s9    |C      tts    
$$node_installedc                     g }d}| s|                     | d           |dz  }|                     | d           |                     |dz    d           |S )Nro   z) pkg install nodejsz) npm install -g agent-browserz) agent-browser install)rX   )r   stepssteps      r8   _termux_browser_setup_stepsr      sw    ED 222333		LLD888999	LLD1H555666Lr7   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).r6   r6   r7   r8   "_termux_install_all_fallback_notesr      s       r7   contentc                 D     t           fdt          D                       S )zIReturn True when ~/.hermes/.env contains provider auth/base URL settings.c              3       K   | ]}|v V  	d S Nr6   )rP   keyr   s     r8   	<genexpr>z+_has_provider_env_config.<locals>.<genexpr>
  s'      ==#sg~======r7   )any_PROVIDER_ENV_HINTS)r   s   `r8   _has_provider_env_configr     s'    ====)<======r7   c                      	 ddl m}  |                                 }t          |j        o|j        p|j                  S # t          $ r Y dS w xY w)zRReturn True when Honcho is configured, even if this process has no active session.r   )HonchoClientConfigF)plugins.memory.honcho.clientr   from_global_configboolenabledapi_keybase_urlr   )r   cfgs     r8    _honcho_is_configured_for_doctorr     sj    CCCCCC 3355CKAS[%@CLBBB   uus   ;> 
AAitemc                     |                      d          dk    rdS t          j                             d          rdS |                      d          pg }t          |          ot	          d |D                       S )zQReturn True when Kanban is unavailable only because this is not a worker process.rQ   rS   FHERMES_KANBAN_TASKtoolsc              3   Z   K   | ]&}t          |                              d           V  'dS )kanban_N)rY   rs   )rP   tools     r8   r   z-_is_kanban_worker_env_gate.<locals>.<genexpr>   s6      QQ4s4yy33I>>QQQQQQr7   )getrb   environr   all)r   r   s     r8   _is_kanban_worker_env_gater     sx    xx8##u	z~~*++ uHHW#E;;Q3QQ5QQQQQQr7   toolsetc                 T    | dk    r!t           j                            d          sdS dS )zKOptional explanatory suffix for toolsets whose doctor status needs context.rS   r   z;(runtime-gated; loaded only for dispatcher-spawned workers) )rb   r   r   )r   s    r8    _doctor_tool_availability_detailr   #  s,    (2:>>2F#G#GLL2r7   c                     g } 	 ddl m}m} ddlm}m}  |             n# t          $ r | cY S w xY wd|fd|ffD ]\  }}	  |            }n# t          $ r d}Y nw xY w||                     d|df           >t          |d	d          pt          |          j
        } ||          r|                     d
|d| df           |                     d|d| df           | S )aX  Return doctor rows for web search/extract provider readiness (#78412).

    Each row is ``(status, label, detail)`` where *status* is ``ok`` or ``warn``.
    Uses the same active-provider resolvers as the tools, but reports readiness
    from ``is_available()`` so an explicitly selected but unconfigured backend
    does not look healthy.
    r   )get_active_extract_providerget_active_search_provider)_ensure_web_plugins_loaded_provider_is_readyz
web searchzweb extractNwarnz$(no provider selected or registered)rQ   okrE   r   z# selected; provider not configured))agent.web_search_registryr   r   tools.web_toolsr   r   r   rX   getattrtype__name__)	rowsr   r   r   r   
capabilitygetterproviderrQ   s	            r8   _doctor_web_capability_rowsr   *  s    (*D	
 	
 	
 	
 	
 	
 	
 	
 	SRRRRRRR 	#"$$$$    
12	34  
F	vxxHH 	 	 	HHH	KK:   x..I$x..2Ih'' 		KKz;t;;;78888KKAAAA    Ks    ..
A

AA	availableunavailablec                 8   t          |           }g }|D ]}|                    d          }t          |          rd|vr|                    d           @|dk    r(t	                      rd|vr|                    d           n|                    |           ||fS )z>Adjust runtime-gated tool availability for doctor diagnostics.rQ   rS   honcho)listr   r   rX   r   )r   r   updated_availableupdated_unavailabler   rQ   s         r8   )_apply_doctor_tool_availability_overridesr   `  s    Y 
) 
)xx%d++ 	000!((2228 @ B B000!((222""4((((111r7   provider_labelc                 ~   | pd                                                                 }|dk    rD	 ddlm} t	           |            pi                     d                    S # t          $ r Y dS w xY w|dk    rD	 ddlm} t	           |            pi                     d                    S # t          $ r Y dS w xY wdS )	aj  Return True when a direct API-key probe failure is non-blocking.

    Some provider families support both a direct API-key path and a separate
    OAuth runtime path. When the OAuth path is already healthy, doctor should
    still show a failed API-key connectivity row, but it should not promote
    that direct-key problem into the final blocking summary.
    r   minimaxr   )get_minimax_oauth_auth_status	logged_inFxaiget_xai_oauth_auth_status)striplowerhermes_cli.authr   r   r   r   r   )r   
normalizedr   r   s       r8   /_has_healthy_oauth_fallback_for_apikey_providerr   r  s	    !&B--//5577JY	EEEEEE6688>BCCKPPQQQ 	 	 	55	U	AAAAAA2244:??LLMMM 	 	 	55	5s#   1A" "
A0/A0:1B, ,
B:9B:r   textdetailc                     t          dt          dt          j                   d|  |rdt          |t          j                   ndz              d S )N     ✓ r   )printr   r   GREENDIMr   r   s     r8   check_okr     sY    	
2uUFL))
2
2D
2
2Y_6g6U%
:S:S6U6U6Ueg
hiiiiir7   c                     t          dt          dt          j                   d|  |rdt          |t          j                   ndz              d S )Nr      ⚠r   r   )r   r   r   YELLOWr   r   s     r8   r   r     sY    	
3uUFM**
3
3T
3
3Z`7h7V5;T;T7V7V7Vfh
ijjjjjr7   c                     t          dt          dt          j                   d|  |rdt          |t          j                   ndz              d S )Nr      ✗r   r   )r   r   r   REDr   r   s     r8   
check_failr     sY    	
0uUFJ''
0
0$
0
0W]4e4Sffj8Q8Q4S4S4Sce
fgggggr7   c                 `    t          dt          dt          j                   d|             d S )N    u   →r   )r   r   r   CYAN)r   s    r8   r   r     s3    	
3ufk**
3
3T
3
344444r7   i   @)format_bytesstatsc                    g }| pi } |                      d          }|                      d          }|                      d          }g }|%|                    dt          |                      |                      d          |                    | d         dd           ||                    |dd	           |%|                    d
t          |                      |r.|                    ddd                    |          z   df           g }|                      d          |                    | d         dd           |                      d          |                    | d         dd           |                      d          r|                    d| d                     ||                    | d           |r+|                    dd                    |          df           |                      d          }|rPd |                                D             }	|                    dd|	rd                    |	          ndz   df           ||t
          k    r{d}
|duo+|                     d          o|                      d          du }|                      d          s|r|
dz  }
|                    dd t          |           d!d"|
 d!f           |S )#u  Turn a collect_state_db_stats() dict into doctor output lines.

    Returns a list of ``(kind, text, detail)`` tuples where kind is one of
    'info' / 'warn'. Pure formatting — no I/O — so it is unit-testable
    without spawning the doctor CLI. Tolerates None in every field.
    logical_size_byteswal_size_bytesfreelist_countNzlogical size 
page_count,z pagesz freezWAL infoz	state.db , r   messagesz	 messagessessionsz	 sessionsjournal_modezjournal_mode=z  process(es) holding the DB open
fts_tablesc                     g | ]	\  }}||
S r6   r6   )rP   tr   s      r8   rR   z*_render_state_db_stats.<locals>.<listcomp>  s!    444B41444r7   zFTS tables: nonezDconsider enabling sessions.auto_prune in config.yaml to bound growthmessages_fts_trigramfts_storage_versionfts_rebuild_pendingzb; run 'hermes sessions optimize-storage' offline (with the gateway stopped) to compact FTS storager   zstate.db is large (r   rE   )r   rX   _human_bytesjoinitemsSTATE_DB_SIZE_WARN_BYTES)r   holderslineslogicalrn   freelist	size_bitsrow_bitsftspresentr   legacy_trigrams               r8   _render_state_db_statsr    sg    EKREii,--G
))$
%
%Cyy)**HI@g)>)>@@AAAyy*E,/9999:::H----...
3S 1 133444 GfkDIIi,@,@@"EFFFHyy(5,9999:::yy(5,9999:::yy   A?n(=??@@@7DDDEEE 8fdii1126777
))L
!
!C
 44#))++444GGdii000H
 	 	 	 w)AAA 	
 tO 9.//9		/00D8 	
 99*++ 	~ 	DF 	:,w"7"7:::MMM
 	 	 	 Lr7   titlec                     t                       t          t          d|  t          j        t          j                             dS )u@   Print a doctor section banner: blank line + bold cyan ◆ title.u   ◆ N)r   r   r   r   BOLD)r  s    r8   _sectionr    s5    	GGG	%uV[
9
9:::::r7   fixissuesc                 P    t          | |           |                    |           dS )z?Emit a check_fail and append the corresponding fix instruction.N)r   rX   )r   r   r  r   s       r8   _fail_and_issuer"    s*    tV
MM#r7   ))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_PROGRESSuS   display.tool_progress in config.yaml — ignored/unsupported since config floor v12)HERMES_TOOL_PROGRESS_MODEz$display.tool_progress in config.yaml)TERMINAL_CWDterminal.cwd in config.yaml)MESSAGING_CWDr/  )QQ_HOME_CHANNELQQBOT_HOME_CHANNEL)QQ_HOME_CHANNEL_NAMEQQBOT_HOME_CHANNEL_NAME_DEPRECATED_ENV_VARS
raw_configc                    g }t          | t                    s|S t          D ]P\  }}}|                     |          }t          |t                    r ||v r|                    | d| |f           Q|                     d          }t          |t                    r(t
          D ] }||v r|                    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'  r   rX   r+  )r6  findingssectionr   replacementsection_valr9  s          r8   collect_deprecated_config_keysr@    s     ')Hj$'' %< ? ?!k nnW--k4(( 	?SK-?-?OO//#//=>>>..//K+t$$ Q7 	Q 	QCk!!!5!5!57N OPPPOr7   env_mapc                     g }t          | t                    s|S t          D ]X\  }}|                     |          }|<t	          |                                          dk    r|                    ||f           Y|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.
    Nr   )r:  r;  r5  r   rY   r   rX   )rA  r<  rQ   r>  vals        r8   collect_deprecated_env_varsrD  6  s     ')Hgt$$ 1 1 1kkk$?s3xx~~//255OOT;/000Or7   c                 ~   ddl m}m}m}m} g }t          | t                    rh|                     d          }t          |t                    r> ||                    d                    D ]}|                    d| d| f            t          |pi           }	g ||R D ]:}
|
|	vr4t          j
                            |
          t          j
        |
         |	|
<   ;t          |	                    |d                                                    s) ||	          D ]}
|                    |
d	| d
f           |S )z?Return actionable findings for the removed Hermes Relay plugin.r   )LEGACY_RELAY_EXPORT_ENV_VARSRELAY_PLUGINS_CONFIG_ENV configured_legacy_relay_env_varslegacy_relay_plugin_keyspluginsr   zplugins.enabled: zremove it and configure Nr   zmove exporter settings to z; this variable is now ignored)hermes_cli.relay_plugin_cutoverrF  rG  rH  rI  r:  r;  r   rX   rb   r   rY   r   )r6  rA  rF  rG  rH  rI  r<  rJ  r   effective_envrQ   s              r8   %collect_relay_plugin_cutover_findingsrM  F  s   
            ')H*d## 	..++gt$$ 	//I0F0FGG  1C11M3KMM    B''MI.I0HII 3 3}$$)=)=)I"$*T"2M$}  !92>>??EEGG 44]CC 	 	DOO31I 3 3 3    Or7   c                    t          |           }|                    t          |                     t          | |          }||z   }|st	          d           |S |D ]2\  }}t          d| d| d           t          d| d| d           3|D ]1\  }}t          d| d	| d
           t          d| d|            2|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)zBreaking Relay migration: rE   r   zMigrate : )r@  extendrD  rM  r   r   r   )r6  rA  
deprecatedrelay_cutoverr<  legacyr>  s          r8    report_deprecated_config_and_envrT  n  s3    0
;;J1'::;;;9*gNNMM)H 8999) ^ ^#6##*K***	
 	
 	
 	\f\\;\\\]]]], 7 7111	
 	
 	
 	5f55556666Or7   c                  ~    	 ddl m}  ddlm} d  | |             pi d          D             S # t          $ r Y dS w xY w)zHReturn toolsets enabled for the CLI, or None if config resolution fails.r   load_config)_get_platform_toolsc                 ,    h | ]}t          |          S r6   )rY   )rP   r   s     r8   	<setcomp>z3_enabled_cli_toolsets_for_doctor.<locals>.<setcomp>  s    \\\G\\\r7   cliN)hermes_cli.configrW  hermes_cli.tools_configrX  r   )rW  rX  s     r8    _enabled_cli_toolsets_for_doctorr^    s|    111111??????\\,?,?@SQSUZ,[,[\\\\   tts   +. 
<<c                 \    d | D             }t                      |S fd|D             S )zAFilter unavailable API-key toolsets to those enabled for the CLI.c                 f    g | ].}|                     d           s|                     d          ,|/S )missing_varsenv_varsr   rP   r   s     r8   rR   z9_missing_api_key_toolsets_for_summary.<locals>.<listcomp>  sN       88N##'+xx
';';  r7   Nc                 `    g | ]*}t          |                    d           pd          v (|+S )rQ   r   )rY   r   )rP   r   enabled_toolsetss     r8   rR   z9_missing_api_key_toolsets_for_summary.<locals>.<listcomp>  sH       txx%2&&*::: 	:::r7   )r^  )r   api_key_unavailablerf  s     @r8   %_missing_api_key_toolsets_for_summaryrh    sg     $   899""   ,   r7   c                  $   t           dz  } 	 |                     d          }n# t          $ r Y dS w xY wd}|                                D ]}|                                }|                    d          r|                    d          r|dk    }G|r||                    d	          rgd
|v rc|                    d
d          d         }|                    dd          d                                                             d          }|pdc S dS )a>  Read the ``version = "..."`` from ``pyproject.toml`` at the project root.

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

    A git conflict resolution (reset/merge) can revert one file without the
    other, leaving ``hermes --version`` reporting a stale version while
    ``pyproject.toml`` is current. Detect that drift so users can re-sync.
    Silent no-op for installed wheels where pyproject.toml isn't present.
    r   )__version__NzVersion files consistentrE   r   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   rz  r   r"  )r   init_versionpyproject_versions      r8   _check_version_consistencyr    s    :::::::   /11 L((+-@-@-@-@AAAAA3\0\\\\\\J	
 	
 	
 	
 	
s   	 
c           	      P   	 ddl m}m} n# t          $ r Y dS w xY w |            dk    rdS t	          d            |            dD ]<}                    |          rt          | d           *t          | d           =                                }|st          d	           dS t          fd
|D                       }t          d| dt          |           dt          |          dk    r&dd                    t          |                     dndz              dS )a  Inside a container under our s6 /init, surface what s6 sees.

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

    Reports:
      - Whether the main-hermes and dashboard static services are up
      - How many per-profile gateway slots are registered (via
        ``S6ServiceManager.list_profile_gateways()``) and how many are
        currently supervised as ``up``
    r   )S6ServiceManagerdetect_service_managerNs6zs6 Supervision)zmain-hermes	dashboardz: upz(: down (expected if not enabled via env)uY   No per-profile gateways registered yet — create one with `hermes profile create <name>`c              3   L   K   | ]}                     d |           dV  dS )zgateway-ro   N)
is_running)rP   pmgrs     r8   r   z(_check_s6_supervision.<locals>.<genexpr>  s:      II#..A*H*HI1IIIIIIr7   zPer-profile gateways: /z supervised up   z (r  r   r   )hermes_cli.service_managerr  r  r   r  r  r   r   list_profile_gatewayssumrr   r  rV   )r   r  r  staticprofilesup_countr  s         @r8   _check_s6_supervisionr    s   	
 	
 	
 	
 	
 	
 	
 	
 	
     4''



C / L L>>&!! 	L___%%%%&JJJKKKK((**H noooIIIIhIIIIIHIIICMMIII25h--12D2D.		&**++...."	N    s    
F
should_fixzlist | Nonec                 8   	 ddl m} ddlm} n5# t          $ r(}t          dt          |                     Y d}~dS d}~ww xY w	  |             t          d           dS # |$ r}t          |          }Y d}~n8d}~wt          $ r(}t          dt          |                     Y d}~dS d}~ww xY w| s7t          d|           |#|	                    dt          j         d	           dS t          d|           t          d
           	 t          j        t          j        dddddgddd          }nZ# t          $ rM}t          dt          |                     |#|	                    dt          j         d           Y d}~dS d}~ww xY w|j        dk    rO|j        p|j        pddd         }t          d|           |#|	                    dt          j         d           dS ddl}	d t          j        D             D ]"}
t          j                            |
d           # |	j                     	  |             t          d           dS # |$ rE}t          dt          |                     ||	                    d           Y d}~dS Y d}~dS d}~ww xY w)u  Verify 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.

    With ``--fix``, a broken bundle (missing/corrupt ``cacert.pem`` — e.g.
    after a brew Python upgrade rebuilt the venv, #29866) is repaired by
    force-reinstalling certifi into THIS interpreter's environment and
    re-verifying.
    r   )verify_ca_bundle_with_fallback)SSLConfigurationErrorzSSL certificate check skippedNz"SSL CA certificate bundle is validz#SSL CA certificate bundle is brokenz5Repair the CA bundle: run `hermes doctor --fix`, or `z* -m pip install --force-reinstall certifi`u0       → Repairing: force-reinstalling certifi...z-mpipinstallz--force-reinstallcertifiTi,  )capture_outputr   timeoutz certifi repair could not run pipzReinstall certifi manually: z) -m pip install --force-reinstall certifir   izcertifi reinstall failedc                 H    g | ]}|d k    s|                     d          | S )r  zcertifi.)rs   )rP   ms     r8   rR   z&check_certificates.<locals>.<listcomp>T  s-    ZZZ1qI~~jAYAY~Q~~~r7   z8SSL CA certificate bundle repaired (certifi reinstalled)z6SSL CA certificate bundle still broken after reinstallu   certifi reinstall did not restore the CA bundle — check for a custom CA env var (SSL_CERT_FILE/REQUESTS_CA_BUNDLE) pointing at a missing file, or recreate the venv.)agent.ssl_guardr  agent.errorsr  r   r   rY   r   r   rX   r=   
executabler   
subprocessrun
returncodestderrstdout	importlibmodulespopinvalidate_caches)r  r   r  r  efirst_errorresultre   tailr  mod_names              r8   check_certificatesr    s   BBBBBB6666666   2CFF;;;&&(((5666    !ff   2CFF;;;  8+FFFMMONO O O   	
 4kBBB	
<===^T5)5H)T	
 
 
    5s3xx@@@MM,s~ , , ,   	 A44"dee<-t444MM,s~ , , ,   	 ZZZZZ ( ($''''I!!!
&&(((KLLLLL    KSQRVVTTTMM;         sg    
A<AA   B.%A99B.B))B.
(D3 3
F
=AFF
4I J4JJc                    	 ddl m}m}m} ddlm} n,# t          $ r}t          dd| d           Y d}~dS d}~ww xY w |            sdS  |            dk    rdS  |            }|                                sdS t          d	            |            \  }}|d
u rt          dd           dS |du r6t          dd           t          d           |                     d           dS t          dd| d           dS )u$  Warn when a systemd user gateway service will stop after logout.

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

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

    Tuple format: (name, env_vars, default_url, base_env, supports_models_endpoint)
    Base list augmented with any ProviderProfile with auth_type="api_key" not
    already present — adding plugins/model-providers/<name>/ is sufficient to get into doctor.
    ))
Z.AI / GLM)r   r   r   z#https://api.z.ai/api/paas/v4/modelsGLM_BASE_URLT)Kimi / Moonshot)r    z!https://api.moonshot.ai/v1/modelsKIMI_BASE_URLT)StepFun Step Plan)STEPFUN_API_KEYz*https://api.stepfun.ai/step_plan/v1/modelsSTEPFUN_BASE_URLT)Kimi / Moonshot (China))r!   z!https://api.moonshot.cn/v1/modelsNT)Arcee AI)ARCEEAI_API_KEYz"https://api.arcee.ai/api/v1/modelsARCEE_BASE_URLT)	GMI Cloud)r"   z%https://api.gmi-serving.com/v1/modelsGMI_BASE_URLT)DeepSeek)r)   z"https://api.deepseek.com/v1/modelsDEEPSEEK_BASE_URLT)Hugging Face)r+   z'https://router.huggingface.co/v1/modelsHF_BASE_URLT)
NVIDIA NIM)NVIDIA_API_KEYz*https://integrate.api.nvidia.com/v1/modelsNVIDIA_BASE_URLT)Alibaba/DashScope)r*   z=https://dashscope-intl.aliyuncs.com/compatible-mode/v1/modelsDASHSCOPE_BASE_URLT)MiniMax)r&   z https://api.minimax.io/v1/modelsMINIMAX_BASE_URLT)MiniMax (China))r'   z"https://api.minimaxi.com/v1/modelsMINIMAX_CN_BASE_URLF)Vercel AI Gateway)r,   z&https://ai-gateway.vercel.sh/v1/modelsAI_GATEWAY_BASE_URLT)	Kilo Code)r(   z&https://api.kilo.ai/api/gateway/modelsKILOCODE_BASE_URLT)OpenCode Zen)r-   z!https://opencode.ai/zen/v1/modelsOPENCODE_ZEN_BASE_URLT)OpenCode Go)r.   NOPENCODE_GO_BASE_URLFc                     h | ]
}|d          S )r   r6   )rP   r  s     r8   rZ  z/_build_apikey_providers_list.<locals>.<setcomp>  s    ***QAaD***r7   r  zair  zkimi-codingr  stepfunr  zkimi-coding-cnr  arceer  gmir  deepseekr  huggingfacer  nvidiar  alibabar  r   r  z
minimax-cnr  
ai-gatewayr  kilocoder  opencode-zenr  zopencode-go>   bedrock	anthropic
openrouterr   )list_providers)ProviderProfile)normalize_provider_namer3   c                 R    | pd                                                                 S )Nr   )r   r   )r  s    r8   _normalize_providerz9_build_apikey_providers_list.<locals>._normalize_provider  s$    **,,22444r7   r   r6   c              3   n   K   | ]0}|                     d           |                     d          ,|V  1dS 	_BASE_URL_URLNrN   rP   vs     r8   r   z/_build_apikey_providers_list.<locals>.<genexpr>  s\        zz+..78zz&7I7I     r7   c              3   n   K   | ]0}|                     d           s|                     d          ,|V  1dS r  rN   r  s     r8   r   z/_build_apikey_providers_list.<locals>.<genexpr>  sE      ZZqAJJ{,C,CZqzzRXGYGYZZZZZZZr7   Nr  /modelssupports_health_checkT)setr  addupdate	providersr  providers.baser  hermes_cli.providersr  r   rY   r:  	auth_typerb  display_namerQ   aliasestuplenextr   
models_urlrstripr   rX   )_static_known_names_known_canonical_name_to_canonical_label
_canonical_dedicated_canonicalr  _PPr  _pp_candidates_alias	_key_vars	_base_var_models_url_hcs                    r8   _build_apikey_providers_listr    s     G* +*'***L "%	e	.	Y	(ACS	 	G	 )%	 2<Z	 			 (4X		
 	Y	
 )29	 	<	 *=l	 	Z	 "0	 	}	 16688 ) )
Z((((
 BAA0111',,,,,,999999	5VVVVVVV 	5 	5 	553 53 5 5 5 5 5 5	5 ">## 	M 	MCc3'' 3=I+E+ES\+E%1F%%5E)E)E..sx889K;," = = 3 3F ; ;<<<<11    <    I ZZCLZZZ I   <*ICL$7$7$<$<y$H%)  #6==CNNFI{IsKLLLL;	M<    Ns7   G8 'B. -G8 .C
G8 CD*G8 8
HHc                     	 ddl m}  |                                 }n# t          $ r Y dS w xY w|dS t	          |                                           }t	          |                                           }t          d| d| d|            t          j	        
                    dd                                          rt          d	|            dS dS )
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_DIRr   z'managed dir set via HERMES_MANAGED_DIR=)r}  r  get_managed_dirr   rr   managed_config_keysload_managed_envr   rb   r   r   r   r   )r  managed_dirn_cfgn_envs       r8   managed_scope_checkr#    s   ,,,,,,#3355   113344E..0011E	# 	# 	# 	# 	# 	# 	#   
z~~*B//5577 LJ[JJKKKKKL Ls    
++c                 N   t          | dd          }t          | dd          }t          j                            dd           |rddlm}m} d	 |D             }||vrct          t          d
|dd	                    t          |                    pd t          j                             t          j        d            ||          r,t          t          d| dt          j                             n?t          t          d| dt          j                             t          j        d           dS g }g }d}t                       t          t          dt          j                             t          t          dt          j                             t          t          dt          j                             t#          d           	 ddlm}	m}
m}m}  |	            } |
|          }|r|D ]}t-          |j        j         d|j         d|j         d            ||          D ]=}|r+t          dt          |t          j                              /t                       >|                    d|j        j         d|j         d|j         d|j        j         d 	            |            }|D ]<}|j        j        |v r,t=          |j         d|j         d!|j        j         d"           =nt?          d#           n)# t@          $ r}t=          d$|            Y d}~nd}~ww xY wt#          d%           	 dd&l!m"} dd'l#m$}  |            %                    d(          pi }d}tM          |tN                    rt          |(                                          D ]o\  }}tM          |tN                    s |||          }|s*|dz  }t=          d)| d*d+	                    |                     |                    d,| d-           p|dk    rt?          d.           n)# t@          $ r}t=          d/|            Y d}~nd}~ww xY wt#          d0           t          j)        }|d1k    r(t?          d2|j*         d3|j+         d3|j,                    n|d4k    r7t?          d2|j*         d3|j+         d3|j,                    t=          d5           nY|d6k    r)t=          d2|j*         d3|j+         d3|j,         d7           n*t[          d2|j*         d3|j+         d3|j,         d8d9|           	 ddl.}dd:l/m0}m1} |j2        } |            } tg          |           d;k    r| dd;         d<z   n| }! |            r!t=          d=| d>ti                                 nt?          d=|            |!rtk          d?|!            tm                       n)# t@          $ r}t=          d@|            Y d}~nd}~ww xY wt          j7        t          j8        k    }"|"rt?          dA           nt=          dBdC           ts          |           t#          dD           tu          ||E           t#          dF           g dG}#g dH}$|#D ][\  }%}	 tw          |%           t?          |           %# tx          $ r* t[          |dIdJ| dKt{                       dL|% |           Y Xw xY w|$D ]E\  }%}	 tw          |%           t?          |dM           &# tx          $ r t=          |dN           Y Bw xY wt#          dO           t}                       t~          dPz  }&|&@                                rt?          t           dQ           	 |&B                    dRS          }'n&# t          $ r |&B                    dTS          }'Y nw xY wt          |'          rt?          dU           n*t=          dVt           dW           |                    dX           nt          dPz  }(|(@                                rt?          dY           nt-          t           dZ           |r|&jF        G                    d[d[\           |&H                                 	 t          jI        t          |&          d]           n# t          $ r Y nw xY wt?          d^t           dW           tk          dX           |dz  }n$tk          d_           |                    d`           t~          daz  })|)@                                rt?          t           db           	 ddcl!mL}*  |*|)          }+|+%                    dd          pi },|,%                    de          pdfM                                }-|-N                                }.|,%                    dg          p|,%                    dd          pdfM                                }/t                      }0	 ddhlPmQ}1mR}2 t          |1S                                          h diz  }0n# t@          $ r d}2Y nw xY w	 ddjl!mT}3 ddklUmV}4mW}5mX}6 n# t@          $ r d}3d}4d}5d}6Y nw xY wg }7|3	  |3|+          }7n# t@          $ r g }7Y nw xY w|+%                    dl          }8tM          |8tN                    r;ddml!mY |0Z                    fdn|8(                                D                        |7D ]}tM          |tN                    st          |%                    do          pdf          M                                }t          |%                    dp          pdf          M                                }9|r!|4|0Z                     |4||9                     t          |0          }:|.r|.hnt                      };|54|0D ]1}<	 |:[                     |5|<                     "# t@          $ r Y .w xY w|.}=|.r:|28|.dqvr4	  |2|.          }=|;[                    |=           n# t@          $ r |.}=Y nw xY w|.}>|.r5|63|.dqvr/ |6|.|8|7          }?|?|?j        nd}>|>|;[                    |>           |.rV|.drk    rP|>|0rL|;|:z  sG|0r"d	                    t          |0                    nds}@t[          dt|- dudv|@ ddt|- dw|@ dx|           |=p|>}At          |Apdf          M                                N                                }Bh dy}C|B|Cv p|Bdzk    p|B\                    d{          }D|/r;d||/v r7|Br5|Ds3t=          d}|/ d~|- dd           |                    d}|/ d|- d           |=r<|=dvr7	 |=dk    rlddl!m]}E t          t           |Ed          pdf          M                                p+t           |Ed          pdf          M                                          }FnddlPmQ}1m_}G |1%                    |=          }Hd[}F|Hrnt          |Hddf          dk    rY |G|=          pi }It          |I%                    d          p)|I%                    d          p|I%                    d                    }F|Fs"t[          dt|= ddd|= dt           d|           n# t@          $ r Y nw xY wn# t@          $ r}t=          dd| d           Y d}~nd}~ww xY wt          dz  }J|J@                                rt?          d           n|r|)jF        G                    d[d[\           t          dz  }K|K@                                rHt          ja        t          |K          t          |)                     t?          dt           d           n+ddl!mb}Lmc}M  |M|L           t?          dt           d           |dz  }nt=          dd           t~          daz  })|)@                                r	 ddl!md}Nme}O  |N            \  }P}Q|P|Qk     rt=          d|P d|Q dd           |ra	  |Odd           t?          d           |dz  }ng# t@          $ r1}Rt=          d|R            |                    d           Y d}R~Rn1d}R~Rww xY w|                    d           nt?          d|P d           n# t@          $ r Y nw xY w	 ddcl!mL}*  |*|)          fddD             }S|Sr+t=          dd	                    |S           d           |r%                    dd          }TtM          |TtN                    r|T},nNtM          |Tt                    r1|TM                                rdg|TM                                i},|,dd<   ni },|,dd<   |SD ]G}U|,%                    |U          sf                    |U          |,|U<   1f                    |U           Hddl!mg}V  |V|)           t?          d           |dz  }n|                    d           n# t@          $ r Y nw xY w	 ddl!mh}WmL}*mi}X  |*|)          %                    d          }YtM          |YtN                    r|Y%                    d          nd}Z|Z%                    d          }Z |W            %                    d          }[|ZduoG|[duoCt          |Z          M                                t          |[          M                                k    }\|\rt=          d|[ d|Z dd           |rR |Xd          rt?          d|Z d           |dz  }nCt=          d           |                    dt           d           n|                    d           n# t@          $ r Y nw xY w	 ddl!mh}] ddcl!mL}^  |^|)          }_	  |]            }`n# t@          $ r i }`Y nw xY wt          |_|`           n# t@          $ r Y nw xY w	 ddl!mk}a  |a            }b|brt#          d           |bD ]{}c|cjl        dk    rt-          |cjm                   nt=          |cjm                   |cjn        o                                D ]}dtk          |d           |                    |cjm                   |n# t@          $ r Y nw xY w|)@                                sF	 ddl!mh}] 	  |]            }`n# t@          $ r i }`Y nw xY wt          i |`           n# t@          $ r Y nw xY wt#          d           	 dd&l!m"} ddlpmq}emr}fms}g  |            }h |f|h          }i|ist?          d           nW|iD ]}jt=           |g|j                     tk          d|e            |                    dtg          |i           d|e            n+# t@          $ r}kt=          dd|k d           Y d}k~knd}k~kww xY wt#          dƦ           	 ddlPmt}lmu}mmv}n  |l            }o|o%                    d          rt?          ddɦ           nt=          ddʦ            |m            }p|p%                    d          rt?          ddɦ           nXt=          ddʦ           |p%                    d          rtk          |pd                    t          d̦          stk          dͦ            |n            }q|q%                    d          r+|q%                    ddϦ          }rt?          dd|r d           nt=          ddʦ           n+# t@          $ r}t=          dd| d           Y d}~nd}~ww xY w	 ddlPmx}s  |s            pi }t|t%                    d          rt?          ddɦ           n:t=          ddʦ           |t%                    d          rtk          |td                    n# t@          $ r Y nw xY wt#          d֦           t~          }u|u@                                rt?          t           dם           nO|r5|uG                    d[d[\           t?          dt           d؝           |dz  }nt=          t           dٝdڦ           g dۢ}v|vD ]}w|u|wz  }x|x@                                rt?          t           d||w dܝ           6|r8|xG                    d[d[\           t?          dt           d||w d|           |dz  }pt=          t           d||w dݝdڦ           |udz  }y|y@                                rx|yB                    dRS          M                                }'d߄ |'o                                D             }z|zrt?          t           d           ntk          t           d           njt=          t           dd           |rP|yjF        G                    d[d[\           |yy                    ddRS           t?          dt           d           |dz  }|udz  }{|{@                                rt?          t           d           |{dz  }||{dz  }}||@                                rItg          ||B                    dRS          M                                          }~t?          d|~ d           ntk          d           |}@                                rItg          |}B                    dRS          M                                          }~t?          d|~ d           n^tk          d           nNt=          t           ddڦ           |r4|{G                    d[d[\           t?          dt           d           |dz  }|udz  }|@                                r5	 ddl.}|z                    t          |                    }|{                    d          }||                                d         }|}                                 t?          t           d| d           ddl/m~}m}  ||          }|	t=          t           dd| d           |r ||          }|%                    d          rb|%                    d          rt          |d                   j        nd}t?          dd|%                    d           d| d           |dz  }nit=          dd|%                    d           d|%                    d           d           |                    d           n|                    d            n# t@          $ r}ddl/m}m}  ||          rt=          t           dd| d           |rU ||          }|%                    d          r	 |z                    t          |                    }|{                    d          |                                d         }|}                                 n# t@          $ r d}Y nw xY w|%                    d          rt          |d                   j        nd}t?          d| dd|%                    d           d| d           |dz  }nt=          dd|%                    d           d|%                    d           d           |                    d           n1|                    d           nt=          t           d	|            Y d}~nd}~ww xY w	 dd
l/m}m}  ||          } ||          }t          ||          D ]]\  }}}|dk    r7t=          ||           d|v r!|                    dd|v rdndfz              Dtk          ||rdL| ndfz              ^nC# t@          $ r}tk          d| d           Y d}~n d}~ww xY wtk          t           d           |udz  }|@                                r,	 |                                j        }|dk    rt=          d|dz   dd           |rddl.}|z                    t          |                    }|{                    d           |}                                 |@                                r|                                j        nd}t?          d|dz   d|dz   d           |dz  }n7|                    d           n |dk    rtk          d |dz   d!           n# t@          $ r Y nw xY wt          |           t          |           t          j        d"k    r4t#          d#           d}d$D ],}t          |z  d%z  d&z  }|@                                r|} n-t          j        %                    d'df          }t          t          j        %                    d(                    pd)|v }|r|rt          |          d%z  }d*}nt          j                    d+z  d%z  }d,}|d&z  }|4t=          d-d.           |                    d/t           d0           n(t?          d1|                    t                     d           |                                r|                                }|                                }||k    rt?          | d2           nt=          | d3d4| d5| d           |rG|                                 |                    |           t?          d6| d7|            |dz  }n?|                    d8| d9           n"|@                                rt?          | d:           nt-          | d;d<           |r|G                    d[d[\           |                    |           t?          d=| d7|            |dz  }t          j        %                    d>df                              t          j                  }t          |          |vr0t=          | d?d@           |                    dA| dB           n|                    dC| dD           t#          dE           t          dF          rt?          dF           nt=          dGdM           t          dH          rt?          dIdJ           n4t=          dKdL           tk          dMt'          dN                      t          j        dOdP          }	 ddQlm}  |            }n# t@          $ r d}Y nw xY w|r|dRk    rtk          dS           dP}|dRk    rt          dR          rm	 t/          j        dRdTgd[dUV          }n# t.          j        $ r d}Y nw xY w||j        dk    rt?          dRdW           nt[          dXdfdY|           nlt[          dZd[d\|           nVt          dR          rt?          dRdM           n4t7                      rtk          d]           n|rnt=          dZdM           |d^k    r)t          j        d_          }|rt          j        d`          }t          j        da          }t          j        db          }|r| dc| n|}g dd}|r|de|gz  }|r%|dft          j                            |          gz  }||dggz  }	 t/          j        |d[d[dRdhdij          }n# t.          j        $ r d}Y nw xY w||j        dk    rt?          dk|            n0t[          dk| dfdl| |           nt[          dmdndo|           |dpk    rt          j        dq          }|rt?          drds           nt[          dtdudv|           	 ddwlm} t?          dxdy           n%# tx          $ r t[          dzd{d||           Y nw xY w|d}k    rt          j        d~d          M                                pd}ddlm} ||v rt?          dd| d           n4d	                    |          }t[          dd| d| dd| |           t          j        dd          M                                }|dv rt?          dd           nt[          ddd|           tD          j                            d          t?          ddy           nt[          ddd|           tK                      }|j        rt?          dd|j         d           nV|j        \                    d          rt[          dd|j         dd|           nt[          dd|j         dd|           |j        D ]}tk          d|            t          j        dd          N                                dv }|rtk          d           ntk          d           t          d          r*t?          d           d}	 ddlm}m}  |d          }n# t@          $ r d}Y nw xY w|rT ||          rIt?          dd           d[}|r2ddlm}  |            rtk          d           ntk          d           n|r%t[          |          rt?          dd           d[}n|rt=          dd| d           nvt7                      rUtk          d           tk          d           tk          d           t]          d[          D ]}tk          |           nt=          dd           |rސt7                      s	 ddlm}m}m}m}m}  |            p,t           |                      p |            dup	 |            }|su |            rt?          dd           nt=          dd           t          j        d"k    rtk          dt           d           ntk          dt           d           n# t@          $ r Y n{w xY wnvt7                      rUtk          d           tk          d           tk          d           t]          d          D ]}tk          |           nt=          dd           t          d          }|r	 ddlm}  |            }n# t@          $ r t          dz  dz  }Y nw xY wt          ddgft          dÐdĐdgft          dƐdĐdgf|dg fg}|D ]\  }}}|rt          n|}|Đdz  @                                s+	 t/          j        |dʐdg|ât          |          d[d[dRdhd̐ͦ          }ddl}|j        M                                r|Ơ                    |j                  ni }|Ǡ%                    di           %                    di           }|Ƞ%                    dd          }|Ƞ%                    dd          }|Ƞ%                    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k    s|dk    r|r|ɛ d|ʛ d|˛ d|͛ }n|ɛ d|ʛ d|˛ d۝}t=          | d֝d|Λ d           |r|d         dk    rtk          dܦ           |                    | d|̛ d|dk    rdndϛ            n&t?          | d֝d|˛ d|dk    rdndϛ d           # t@          $ r Y w xY wt7                      r1tk          d           ts                      D ]}tk          |Ϧ           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}|Ҡ                    d|f           |Ҡ                    d|f           t|          t                      at|          D ],}|\  }}}}}|Ҡ                    ||||||ffd	f           -|Ҡ                    d|f           |Ҡ                    d|f           t          dt          dtg          |Ҧ           dt          j                   dfd[           t          j        %                    d          }ݐdt          j        d<   	 |Р                    dd          5 fd|D             }ސd |D             }ddd           n# 1 swxY w Y   |݀"t          j        f                    dd           nJ|t          j        d<   n9# |݀"t          j        f                    dd           n|t          j        d<   w xY wt          ddf           |D ]}|j        D ]8\  }}}|rt          d| dL| dL|            "t          d| dL|            9t          |j                  }|rt          |j                  rg }|D ]}|                    |           t#          d           	 t          j                            dt          t                               ddlm}m}  |            \  }}t          ||          \  }}g }d|v st          d |D                       r+t                      }|rd  |D             }d |D             }|D ]J}|%                    |i           }t?          |%                    do|          t          |                     K|D ].\  }I}}|Idk    rt?          ||           t=          ||           /|D ]z}|%                    d          p|%                    d          pg }|r1d	                    |          }t=          |do         d| d           ct=          |do         d           {t          |          }t          d |D                       }|s|r|                    d           n,# t@          $ r}t=          d	d| d           Y d}~nd}~ww xY wt#          d
           t~          dz  dz  }|@                                rt?          d           |dz  }|@                                r	 ddl}|                    |B                    dRS                    }tg          |%                    di                     }t?          d| d           n"# t@          $ r t=          dd           Y nw xY w|dz  }|@                                r-t          d |                                D                       nd}|dk    rt=          | dd           nt=          dd           ddl!m]}E dt          fd} |Ed          p |Ed          }|rt?          d           n9 |            rt?          dd           nt=          d d!t           d"           t#          d#           df}	 ddcl!mL} t~          daz  }|@                                re ||          }	 dd$lm} |                    |          }n# t@          $ r Y nw xY w|%                    d%          pi %                    dedf          }n# t@          $ r Y nw xY w|st?          d&d'           nm|d(k    r	 dd)lm}m֐}  |                                } |             }|@                                s<|j        s|j        rt?          d*d+| d,           nt=          d-d.           nې|j        stk          d/| d0           n|j        s|j        st[          d1d.d2|           ndd3lmې}mܐ}  |             	  ||           t?          d4d5|j         d6|j         d7|j                    nB# t@          $ r5}t[          d8t          |          d9| |           Y d}~n
d}~ww xY wn# tx          $ r t[          d:d;d<|           Y nt@          $ r/}t=          d=t          |                     Y d}~nd}~ww xY w|d>k    r	 dd?lm}  |            }|%                    ddf          }|rVt?          d@           tk          dA|%                    dBd           dC|%                    dDd                      nt[          dEdFdG|           n
# tx          $ r t[          dHdIdJ|           Y nt@          $ r.}t=          dKt          |                     Y d}~nd}~ww xY w	 ddLlm}	  |	|          }
|
r)|
                                rt?          | dM           n.|
rt=          | dNdO           nt=          | dPd.           n># t@          $ r1}t=          | dQt          |                     Y d}~n
d}~ww xY w	 ddRlm}m}m} ddl}dS  |            D             }|rMt#          dT           t?          tg          |           dU            |            }|D ]+}g }|j        r|                    dV           |j        r%|                    |j        dd̅                    |j        daz  @                                s|                    dW           |j        dPz  @                                s|                    dX           ||j        z  }|@                                s|                    dY           |rd	                    |          nd}It?          d|j         dK|I            -|                                rː|                                D ]}|                                s	 |B                    dRS          }'dZ|'v ro|                    d[|'          }|rS ||                    d                    s3t=          d\|j         d]|                    d           d^           # t@          $ r Y w xY wn# tx          $ r Y nt@          $ r Y nw xY w	 dd_lm}  || |           n# t@          $ r Y nw xY wt                       ||z   }|r|dk    rt          t          d`t          j                             t          t          da| dbt          j        t          j                  df           |rFt          t          dLtg          |           dct          j        t          j                             nt                       t                       |rAt          |d          D ] \  }}t          d| dd|            !t                       nF|rt          t          d`t          j                             t          t          detg          |           dft          j        t          j                             t                       t          |d          D ] \  }}t          d| dd|            !t                       |s(t          t          dgt          j                             n[t          t          d`t          j                             t          t          dht          j        t          j                             t                       dS (i  zRun diagnostic checks.r  FackNHERMES_INTERACTIVE1r   )
ADVISORIESack_advisoryc                     h | ]	}|j         
S r6   )id)rP   as     r8   rZ  zrun_doctor.<locals>.<setcomp>  s    ...aQT...r7   zUnknown advisory ID: z. Known IDs: r  z(none)rm   u     ✓ Acknowledged advisory z,. It will no longer trigger startup banners.u      ✗ Failed to persist ack for z*. Check ~/.hermes/config.yaml is writable.ro   u   ┌─────────────────────────────────────────────────────────┐uA   │                 🩺 Hermes Doctor                        │u   └─────────────────────────────────────────────────────────┘zSecurity Advisories)detect_compromisedfilter_unackedfull_remediation_textget_acked_idsrE   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 SecurityrV  )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 r8  )r3  
   zHPython 3.11+ recommended for RL Training tools (tinker requires >= 3.11))r3  r  z(3.10+ recommended)z(3.10+ required)zUpgrade Python to 3.10+)r   sqlite_source_id0   u   …zSQLite z (WAL-reset bug)zSQLite source id: zSQLite version probe failed: zVirtual environment activezNot in virtual environmentz(recommended)zSSL / CA Certificates)r  r   zRequired Packages))openaiz
OpenAI SDK)richzRich (terminal UI))dotenvzpython-dotenv)yamlPyYAML)httpxHTTPX))croniterzCroniter (cron expressions))telegramzpython-telegram-bot)discordz
discord.pyz	(missing)zInstall rO  r   z
(optional)z(optional, not installed)zConfiguration Filesr   z/.env file existsrj  rk  zlatin-1z%API key or custom endpoint configuredzNo API key found in z/.envz(Run 'hermes setup' to configure API keysz'.env file exists (in project directory)z/.env file missingT)parentsexist_oki  zCreated empty z Run 'hermes setup' to create onez!Run 'hermes setup' to create .envzconfig.yamlz/config.yaml exists)read_user_config_rawmodelr   r   default)PROVIDER_REGISTRYresolve_provider>   moaautocustomr  )get_compatible_custom_providers)custom_provider_aliasesr  resolve_provider_fullr  )is_provider_enabledc              3      K   | ]f\  }}t          |                                          & |          1t          |                                                                          V  gd S r   )rY   r   r   )rP   rQ   prov_cfgrO  s      r8   r   zrun_doctor.<locals>.<genexpr>4  s       ' '&h4yy((' .A-@-J-J'IIOO%%++--' ' ' ' ' 'r7   rQ   provider_key>   rJ  rK  rJ  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>'>   rJ  nousr  r  lmstudio	deepinfra	fireworksr  r  r  r  rK  zcustom: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.)rJ  rK  r  )get_env_valuer   r   )rG  get_auth_statusr  r   
configuredr   z%' is set but no API key is configuredz,(check ~/.hermes/.env or run 'hermes setup')z#No credentials found for provider 'z7'. Run 'hermes setup' or set the provider's API key in zI/.env, or switch providers with 'hermes config set model.provider <name>'z(Could not validate model/provider configzcli-config.yamlz-cli-config.yaml exists (in project directory)zcli-config.yaml.examplezCreated z)/config.yaml from cli-config.yaml.example)DEFAULT_CONFIGsave_configz/config.yaml from defaultszconfig.yaml not foundz(using defaults))check_config_versionmigrate_configzConfig version outdated (vu    → vz(new settings available))interactivequietz!Config migrated to latest versionzAuto-migration failed: z$Run 'hermes setup' to migrate configz=Run 'hermes doctor --fix' or 'hermes setup' to migrate configzConfig version up to date (vc                 R    g | ]#}|v t          |         t                    !|$S r6   )r:  rY   )rP   kr6  s     r8   rR   zrun_doctor.<locals>.<listcomp>  s5    yyyQa:ooZdeopqertwZxZxoqooor7   )r   r   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_envrD  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')rd  )validate_config_structurezConfig Structurer   z#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_localget_codex_auth_statusr   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))cronr  logsskillsmemoriesz/ existsz/ not foundzSOUL.mdc                     g | ]?}|                                 |                                                     d           =|@S ))z<!--z-->rq  )r   rs   )rP   ls     r8   rR   zrun_doctor.<locals>.<listcomp>  sA    qqqqAGGIIqaggiiFZFZ[oFpFpqqqqr7   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 templateru  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_errorry  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: )collect_state_db_statscount_db_holders)r  r   
auto_pruneu?   state.db is large — enable sessions.auto_prune in config.yamlzoptimize-storagezE and run 'hermes sessions optimize-storage' offline (gateway stopped)zstate.db stats unavailable (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_containerrB   uk   Running inside a container — using local terminal backend (docker-in-docker is not configured by default)r  r5  r  r  z(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replace   )r  r   rl  errorsr  zSSH connection to zCheck SSH configuration for zTERMINAL_SSH_HOST not setz(required for TERMINAL_ENV=ssh)zSet TERMINAL_SSH_HOST in .envdaytonaDAYTONA_API_KEYzDaytona API keyz(configured)zDAYTONA_API_KEY not setz#(required for TERMINAL_ENV=daytona)z(Set DAYTONA_API_KEY environment variable)Daytonazdaytona SDKz(installed)zdaytona SDK not installedz(pip install daytona)z(Install daytona SDK: pip install daytonavercel_sandboxTERMINAL_VERCEL_RUNTIMEnode24)_SUPPORTED_VERCEL_RUNTIMESzVercel runtimezVercel runtime unsupportedz; use z'Set TERMINAL_VERCEL_RUNTIME to one of: TERMINAL_CONTAINER_DISK51200>   r   0r  zVercel disk settingz(uses platform default)zVercel custom disk unsupportedz((reset terminal.container_disk to 51200)zSVercel Sandbox does not support custom container_disk; use the shared default 51200vercelz
vercel SDKzvercel SDK not installedz$(pip install 'hermes-agent[vercel]')zJInstall the Vercel optional dependency: pip install 'hermes-agent[vercel]'zVercel authpartialzVercel auth incompletez@Set VERCEL_TOKEN, VERCEL_PROJECT_ID, and VERCEL_TEAM_ID togetherzVercel auth not configuredzVConfigure Vercel Sandbox auth with VERCEL_TOKEN, VERCEL_PROJECT_ID, and VERCEL_TEAM_IDzVercel auth TERMINAL_CONTAINER_PERSISTENTtrue>   r'  onyesr  z^Vercel persistence: snapshot filesystem only; live processes do not survive sandbox recreationz(Vercel persistence: ephemeral filesystemnodezNode.js)_find_agent_browser_is_npx_agent_browser_sentinel)validatezagent-browserz(resolves via npx on first use))warm_agent_browser_npx_cachez$  Warmed npx cache for agent-browserz7  Could not warm npx cache (offline or npx unavailable)z(browser automation)z$agent-browser found but not runnablez(broken symlink at z#? run: npx agent-browser --version)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(requires npm/npx on PATH))_chromium_installed_is_camofox_mode_get_cloud_provider_get_cdp_override_raw_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node_modulesaudit--json   )cwdr  r   rl  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)labelr  r   r3   c                     t          j        d          } | sA dt          dt          j                  dt          dt          j                  fgg           S 	 dd l}|                    t          dd|  id	          }|j	        d
k    r) dt          dt          j
                  ddfgg           S |j	        dk    rB dt          dt          j                  dt          dt          j                  fgdg          S |j	        dk    rB dt          dt          j                  dt          dt          j                  fgdg          S |j	        dk    rB dt          dt          j                  dt          dt          j                  fgdg          S  dt          dt          j                  dt          d|j	         dt          j                  fgg           S # t          $ rP} dt          dt          j                  dt          d| dt          j                  fgdg          cY d }~S d }~ww xY w)Nr   OpenRouter APIr   z(not configured)r   AuthorizationBearer r5  headersr     r   r     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   rE   zCheck network connectivity)rb   getenvr   r   r   r   r=  r   r   status_coder   r   r   )r   r=  rr  r  s       r8   _probe_openrouterz%run_doctor.<locals>._probe_openrouter	  s   i,-- 	&& v}--/?*FJ779 :	  2	LLL		%(/C//:   A
 }##**$E6<002BBGH  
 }##**$E6:..0@/<<> ?78	   }##**$E6:..0@CVZPPR SA B	   }##**$E6:..0@,fj99; <7 8	   '& vz**,<11116:>>@ A	    	 	 	&& vz**,<A&*--/ 0-.	       	s<   AG% 4AG% AG% AG% A	G% %
H?/AH:4H?:H?c                  b  
 ddl m}   |             }|s dg g           S 	 dd l}ddlm}m}m}m
 ddi} ||          }|r$d| |d<   d	                    ||z             |d
<   n||d<   |	                    d|d          }|r|j
        dk    rd|j                                        v rgd|j                                        v rLd	                    
fd|D             t          |          z             |d
<   |	                    d|d          }|j
        dk    r) dt          dt          j                  ddfgg           S |j
        dk    rA dt          dt          j                  dt          dt          j                  fgg           S  dt          dt          j                  dt          dt          j                  fgg           S # t(          $ rO}	 dt          dt          j                  dt          d|	 dt          j                  fgg           cY d }	~	S d }	~	ww xY w)Nr   )get_anthropic_keyAnthropic API)_is_oauth_token_COMMON_BETAS_OAUTH_ONLY_BETAS_CONTEXT_1M_BETAzanthropic-versionz
2023-06-01r  r  r   zanthropic-betaz	x-api-keyz#https://api.anthropic.com/v1/modelsr5  r  i  zlong context betaznot yet availablec                      g | ]
}|k    |S r6   r6   )rP   br  s     r8   rR   z8run_doctor.<locals>._probe_anthropic.<locals>.<listcomp>
  s$    GGG16F1F1FQ1F1F1Fr7   r  r   r   r  r   r  r   z(couldn't verify)rE   r   )r   r  r=  agent.anthropic_adapterr  r  r  r  r  r   r  r   r   r   r   r   r   r   r   r   r   )r  r   r=  r  r  r  r  is_oauthr  r  r  r  s             @r8   _probe_anthropicz$run_doctor.<locals>._probe_anthropic	  s   555555!! 	@&&B???>	LLL            +L9G&s++H ++:S??(,/HH]EV5V,W,W())'*$		5   A MS(('16<<>>99'16<<>>99,/HHGGGGGGG,--.- -() II9#R    }##**#E6<00/2FG  
 }##**#E6:../<<> ?	   '&v}--+VZ88: ;	    	 	 	&&v}--A&*--/ 0	       	s-   D$G AG A G 
H.AH)#H.)H.c                 T   d}|D ]}t          j        |d          }|r n|s | g g           S |                     d          }|sA | t          dt          j                  |t          dt          j                  fgg           S 	 dd l}|rt          j        |d          nd}	|	s|                    d          rd}	|	r9|		                    d          
                    d	          rdd
lm}
  |
|	          }	t          |	d          r@|		                    d          
                    d          r|		                    d          dz   }	|	r|		                    d          dz   n|}d| t          d}t          |	d          rd|d<   |r+t          |d          r|                    dd            ||d<   |                    ||d          }| dk    r%|	s#|j        dk    r|                    d|d          }|j        dk    r) | t          dt          j                  |dfgg           S |j        dk    rL | t          dt          j                  |t          dt          j                  fgd|d          dg          S  | t          d t          j                  |t          d!|j         d"t          j                  fgg           S # t(          $ rO} | t          d t          j                  |t          d#| d"t          j                  fgg           cY d }~S d }~ww xY w)$Nr   rj   r   z(key configured)r   zsk-kimi-zhttps://api.kimi.com/coding/v1r  z
/anthropic)_to_openai_base_urlzapi.kimi.comz/codingz/v1r  r  )r  
User-Agentzclaude-code/0.1.0r  z!generativelanguage.googleapis.comr  zx-goog-api-keyr5  r  r  r  z8https://dashscope.aliyuncs.com/compatible-mode/v1/modelsr  r   r  zCheck z in .envr   r  r   rE   )rb   r  ljustr   r   r   r   r=  rs   r  rO   agent.auxiliary_clientr  r   r   r  r   r  r   r   r   )pnamerb  default_urlbase_envr  r   evr  r=  baser  urlr  r  r  r  s                  r8   _probe_apikey_providerz*run_doctor.<locals>._probe_apikey_provider-
  s	    	 	B)B##C  	6&&ub"555B$ 	&&v|,,e*FJ779 :	  B	LLL.6>29Xr***BD  8CNN:66 87  1C((11,?? 1FFFFFF**400$T>:: 0t{{3?O?O?X?XYb?c?c 0{{3''%/48I4;;s##i//kC!030 G %T>:: <(;%  0,S2UVV 0OT222,/()		#w	;;A,,, -MS((IIN#R    }##**E6<00%<=  
 }##**E6:../<<> ?3hqk3334	   '&v}--u11116:>>@ A	    	 	 	&&v}--uA&*--/ 0	       	s.   
F"K -AK A	K 
L'AL"L'"L'c                     	 ddl m} m}m} n# t          $ r  dg g           cY S w xY w |             s dg g           S  |            } |            }d                    d          }	 dd l}ddlm}  |dddd	i
          }|	                    d||          }	|	
                                }
t          |
                    dg                     } dt          dt          j                  |t          d| d| d| dt          j                  fgg           S # t          $ ra  dt          dt          j                  |t          dt$          j         dt          j                  fgdt$          j         dg          cY S t(          $ rk}t+          |          j        } dt          dt          j                  |t          d| d| dt          j                  fgd| dg          cY d }~S d }~ww xY w)Nr   )has_aws_credentialsresolve_aws_auth_env_varresolve_bedrock_regionAWS Bedrockrj   )Config   r5  max_attemptsro   )connect_timeoutread_timeoutretriesr  )region_nameconfigmodelSummariesr   rE   r  z models)r   u   (boto3 not installed — z -m pip install boto3)zInstall boto3 for Bedrock: z -m pip install boto3rO  r   zAWS Bedrock: u;    — check IAM permissions for bedrock:ListFoundationModels)agent.bedrock_adapterr  r  r  ImportErrorr  boto3botocore.configr  clientlist_foundation_modelsrr   r   r   r   r   r   r   r=   r  r   r   r   )r  r  r  auth_varrp  r  r  _BotoConfigr   r  respnr  err_namer  s                 r8   _probe_bedrockz"run_doctor.<locals>._probe_bedrock
  s   	>          
  	> 	> 	>&&}b"=====	>""$$ 	>&&}b"===++--''))##B''#	LLL====== + !'+  C
 \\)\LLF0022DDHH-r2233A&&v|,,e=H====!===vzJJL M	    	 	 	&&v}--uZCNZZZ
$ $% & Us~TTTU      	 	 	Aww'H&&v}--u,H,,,,,fj99; <1 1 1 1 2	       	s3   
 ((,B3D   A(G>
	G>A G93G>9G>c                     d                     d          } 	 ddlm}  |            }t          |t                    r|                    d          ni }t          |t                    s dg g           S t          |                    d          pd                                                                          }t          |                    d          pd                                                                          }|d	k    s|d
k    r dg g           S n# t          $ r  dg g           cY S w xY w	 ddl
m}m}m}m}	 n`# t          $ rS}
 dt          dt           j                  | t          d|
 dt           j                  fgd|
 g          cY d}
~
S d}
~
ww xY w |	            sP dt          dt           j                  | t          dt           j                  fgdt&          j         dg          S |                    d          pi }t          |t                    si }t          |                    d          pd                                          p|} ||          } ||d          }|                    d          rx|                    d          pg }|rd                    |          nd} dt          dt           j                  | t          d| d| dt           j                  fgg           S |                    d           pd!}|                    d"          pd#} dt          dt           j                  | t          d| dt           j                  fgd$| d%| g          S )&u  Probe Azure Foundry Entra ID auth, parallel to ``_probe_bedrock``.

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

        Bounded by a 10s timeout (via
        :func:`agent.azure_identity_adapter.describe_active_credential`)
        so a slow token service can't pad the doctor run.
        Azure Foundry (Entra ID)   r   rV  rE  r   r   	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-identityentrascope)r  g      $@)r  timeout_secondsr   env_sourcesr  zdefault credential chainr   rE   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\  rW  r:  r;  r   rY   r   r   r   agent.azure_identity_adapterr  r  r  r  r   r   r   r   r=   r  r  r   )r  rW  r   	model_cfgcfg_providerr	  r  r  r  r  re   	entra_cfgr  r  r  r  tagerrr  r  s                      r8   _probe_azure_entraz&run_doctor.<locals>._probe_azure_entra
  sz    +0044	K555555+--C,6sD,A,AI(((rIi.. O**+Er2NNNy}}Z88>B??EEGGMMOOLIMM+66<"==CCEEKKMMI..)z2I2I**+Er2NNN 3J 	K 	K 	K&&'A2rJJJJJ	K	              	 	 	&&*v}--u939996:FFH I>>>?	       	 ,+-- 	&&*v}--u8&*EEG HZCNZZZ[	   MM'**0b	)T** 	I	g&&,"--3355 &% 	 %$
 
 
 *)NNN88D>> 	((=117RK,7W$))K(((=WC&&*v|,,e1C111116:>>@ A	   hhw?#?xx 
L 	 #"&E6=))5JJJJ
++- .2S22D223	
 
 	
s8   AD  6B(D   D:9D:>E 
F(AF#F(#F(r  r  c                 "     | ||||          S r   r6   )r  r  ur  sr  s        r8   <lambda>zrun_doctor.<locals>.<lambda>  s     6 6q!Q1 E E r7   r  r  r   zRunning u#    connectivity checks in parallel…)endflushAWS_EC2_METADATA_DISABLEDr  zdoctor-probe)max_workersthread_name_prefixc                 @    g | ]\  }}                     |          S r6   )submit)rP   __fn_exs      r8   rR   zrun_doctor.<locals>.<listcomp>.  s'     G G GVQC G G Gr7   c                 6    g | ]}|                                 S r6   r  )rP   _fs     r8   rR   zrun_doctor.<locals>.<listcomp>/  s     @@@		@@@r7   zH                                                                      )r   zTool Availability)check_tool_availabilityTOOLSET_REQUIREMENTSc              3   H   K   | ]}|                     d           dk    V  dS )rQ   r  Nrc  rd  s     r8   r   zrun_doctor.<locals>.<genexpr>P  s3      $W$W4TXXf%5%5%>$W$W$W$W$W$Wr7   c                     g | ]
}|d k    |S )r  r6   )rP   tids     r8   rR   zrun_doctor.<locals>.<listcomp>S  s    FFFSSr7   c                 D    g | ]}|                     d           dk    |S )rQ   r  rc  rd  s     r8   rR   zrun_doctor.<locals>.<listcomp>T  s/    YYYtxx?O?OSX?X?Xt?X?X?Xr7   r   ra  rb  z	(missing z(system dependency not met)c              3   *   K   | ]\  }}}|d k    V  dS )r   Nr6   )rP   statusr'  s      r8   r   zrun_doctor.<locals>.<genexpr>l  s,      HH|vq!FdNHHHHHHr7   zERun 'hermes setup' to configure missing API keys for full tool accessz!Could not check tool availabilityz
Skills Hubrt  z.hubzSkills Hub directory existsz	lock.json	installedzLock file OK (z hub-installed skill(s))z	Lock filez(corrupted or unreadable)
quarantinec              3   B   K   | ]}|                                 d V  dS )ro   N)is_dir)rP   ds     r8   r   zrun_doctor.<locals>.<genexpr>  s/      DDADaDDDDDDr7   z skill(s) in quarantinez(pending review)z$Skills Hub directory not initializedz(run: hermes skills list)c                      	 t          j        g ddd          } | j        dk    S # t          t           j        f$ r Y dS w xY w)z?Check if gh CLI is authenticated via token file or device flow.)ghauthr4  r  authenticatedTr5  r  r   F)r  r  r  FileNotFoundErrorTimeoutExpiredr+  s    r8   _gh_authenticatedz%run_doctor.<locals>._gh_authenticated  se    	^CCC#R  F $))!:#<= 	 	 	55	s   #& A A GITHUB_TOKENGH_TOKENz2GitHub token configured (authenticated API access)zGitHub authenticated via gh CLIu,   (full API access — no GITHUB_TOKEN needed)zNo GITHUB_TOKENu!   (60 req/hr rate limit — set in z/.env for better rates)zMemory Providerr  memoryzBuilt-in memory activeu2   (no external provider configured — this is fine)r   )r   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_existsc                      g | ]}|j         	|S r6   )
is_default)rP   r  s     r8   rR   zrun_doctor.<locals>.<listcomp>  s    IIIALI!IIIr7   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 exists)maybe_run_live_checksu   ────────────────────────────────────────────────────────────z  Fixed z
 issue(s).z& issue(s) require manual intervention.r  z  Found z issue(s) to address:z=  Tip: run 'hermes doctor --fix' to auto-fix what's possible.u     All checks passed! 🎉)r   rb   r   
setdefaulthermes_cli.security_advisoriesr(  r)  r   r   r  rV   r   r   r=   exitr   r   r  r-  r.  r/  r0  r   advisoryr  packageinstalled_versionr   rX   r+  r   r   r   r\  rW  hermes_cli.mcp_securityr1  r   r:  r;  r  r|   majorminormicror"  sqlite3r   r   r6  sqlite_versionrr   rJ   r   r   prefixbase_prefixr  r  
__import__r  r9   r#  r   r  _DHHrr  UnicodeDecodeErrorr   rF   parentmkdirtouchchmodrY   ra   rD  r   r   r  r   rG  rH  keysrL  r  rM  r  rN  rO  r  r  rs   rX  r   rY  r   copy2r[  r\  r]  r^  r  rc  rd  re  rT  ri  severitymessager  rs  hermes_cli.xai_retirementrj  rk  rl  rm  rn  r   r   r   
write_textconnectexecutefetchonecloserx  ry  r   rQ   r}  r  r  r  r`   ry   r  r  r>   r   rZ   
is_symlinkresolveunlink
symlink_tort  pathsepr?   r  hermes_constantsr  r  r  r?  r  r5   r   
expanduserr  r  tools.terminal_toolr  r  util	find_specr   r   r  detail_linestools.browser_toolr  r  r  r   r   r  r  r  r  r  !gateway.platforms.whatsapp_commonr  jsonr  loadsr   concurrent.futuresfuturescollectionsr  r  r  r   ThreadPoolExecutorr  r   r   r   insertmodel_toolsr-  r.  r   r   r   r   rh  r  iterdirr}  r  apply_managed_overlayr   r   rD  r   r   r   r   rE  rF  workspace_idrecall_modewrite_frequencyplugins.memory.mem0rH  plugins.memoryrK  is_availablehermes_cli.profilesrL  rM  rN  regateway_runningrE  r8  r   searchgrouphermes_cli.doctor_liverR  r  	enumerate(  argsr  
ack_targetr(  r)  	valid_idsr   manual_issuesfixed_countr-  r.  r/  r0  all_hits
fresh_hitshitrx  	acked_idshr  rW  r1  servers
suspiciousrQ   entryissues_found
py_versionr]  r   r6  _sqlite_ver_sqlite_src_sqlite_src_shortin_venvrequired_packagesoptional_packagesmoduleenv_pathr   fallback_envconfig_pathrD  r   model_sectionprovider_rawr   default_modelknown_providersrG  _resolve_auth_provider_compatible_custom_providers_custom_provider_aliases_normalize_catalog_provider_resolve_provider_fullcustom_providersuser_providersrR  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_slugrX  rZ  rY  pconfigr4  fallback_configexample_configr[  r\  r]  r^  current_ver
latest_vermig_errstale_root_keys	raw_modelrb  rc  rd  re  	agent_cfgcfg_max_turns	env_ghostdrift_load_env_depr_read_raw_depr_raw_for_depr_env_for_deprri  config_issuesci	hint_linerj  rk  rl  _xai_cfgretired_refsref_xai_check_errrm  rn  r   nous_statuscodex_statusminimax_statusrp  r   xai_oauth_statusr   expected_subdirssubdir_namesubdir_path	soul_pathr  memories_dirmemory_file	user_filer   state_db_pathconncursorcountrx  ry  _write_reasonreportbackup_namer}  r  r  	_db_stats_db_holders_kind_text_detail
_stats_exc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targetr   daytona_keyr  runtimer  	supporteddiskauth_status
persistentagent_browser_okr  r  _resolved_abr  r   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  r  r  _entry_pname	_env_vars_default_url	_base_env	_supports
_imds_prev_futures_in_order_results_r_glyphr  _issues_to_add_issuer-  r.  r   r   web_rowsr1  r  r   r   rb  vars_strapi_disabledweb_not_readyhub_dir	lock_filer  	lock_datar6  q_countr@  github_token_active_memory_provider_read_raw_mem_mem_cfg_path_raw_cfgr  r   rD  hcfg_honcho_cfg_pathrE  rF  _e_load_mem0_configmem0_cfgmem0_keyrK  	_providerrL  rM  rN  _renamed_profileswrapper_dirr  partswrapper_mrR  remaining_issuesiissuer  r)  r  rO  r6  s                                                                                                                                                                                                                                                                                           @@@@@r8   
run_doctorrN  
  sT   ue,,Jud++J J.444
  	
 	
 	
 	
 	
 	
 	
 	
 /.:...	Y&&%>
 > >99VI..//;8> >
    
 HQKKK<
## 	%>z > > >      %<: < < <
    
 HQKKKFMK	GGG	%  D  FL  FQ  R  R  S  S  S	%SU[U`
a
abbb	%  D  FL  FQ  R  R  S  S  S"###+;	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 &%''#^H--
 	6!  |)+???s'<???   21#66    D  AU4%?%?AABBBB $$@ @ @!$@ @030E@ @ -0LO@ @ @    &I  :=I--9 C C(; C C%&Z]C C C   4555 ; ; ;9a99::::::::; "###6111111EEEEEE+--##M228b
gt$$ 	%gmmoo66 
 
e!%.. 88uEE# a
N$NNNPTPYPYZfPgPghhh$$zzzz    ??7888 6 6 6444555555556 !"""!JWS:+SSj.>SSAQSSTTTT	w		S:+SSj.>SSAQSSTTT]^^^^	v		UZ-UU
0@UU:CSUUWlmmmmNj&NN)9NNJ<LNN%		
 	
 	
8QQQQQQQQ,&&((*-k*:*:R*?*?["%%[ 	 *)++ 		. 7+777$&&   
 ,{,,--- 	A?,=??@@@&(((( 8 8 86166777777778 jCO+G B-..../AAA v&&&$%%%*]CCCC !!!     * l l	lvTNNNN 	l 	l 	lD+/b$/b/bBUBWBW/b/bZ`/b/bdjkkkkk	l * : :	:vT<(((( 	: 	: 	:t899999	: "###V#H %CD+++,,,
	=(('(::GG! 	= 	= 	=(()(<<GGG	=#G,, 	F<====9d999:::MMDEEEE $f,   	C>????$222333 C%%dT%BBB   HS]]E2222   D5$555666EFFFq =>>>ABBB -K WHD---...A	M>>>>>>&&{33CGGG,,2M)--j99?RFFHHL#))++H*..y99]]=N=Nw=W=W][]ddffM#&55O        #&&7&<&<&>&>"?"?BiBiBi"i   )-&.mmmmmm          
  . . ./3,+/(.2+)-&&&	.  "+7*'C'CC'H'H$$  * * *')$$$* !WW[11N.$// AAAAAA&& ' ' ' '*8*>*>*@*@' ' '   
 *  !%.. 599V,,23399;;"599^#<#<#BCCIIKK 4@#**00|DD   "%_!5!53;%FhZZ"*6&5 ! !N!*../J/J>/Z/Z[[[[$ ! ! ! !  (	0*6$6660'='=h'G'G$*../?@@@@  0 0 0'/$$$0  (A*6$66655hP`aa6B6N<??TX #/*../?@@@ H..#+# ,36HH , HW!k6/+B+B!C!C!C\kJ#W<WWW0:000\| \ \0:\ \ \ 	 	 	 #3"F6F!$%8%>B!?!?!E!E!G!G!M!M!O!O0 0 0,( #&FF <%1<%00;; ) =((& )4 ) pmppampppS   \m \ \am \ \ \     !$4<N$N$N '<77CCCCCC%).B C C IrJJPPRR R"==1A#B#B#HbIIOOQQ& &


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

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

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

======4466<",, 	6[-0000{$5666##G,, 6+G4555    "###K JD+++,,,,	 J$666,D,,,---qd&&&(HIII JII' 	] 	]!K/ 	]44{4445555 	]dT:::555{5556661KK$99999;[\\\\ i'I %%w%77==??qqG..00qqq 	cBBBCCCC$aaabbbbd...0abbb 		""4$"???  < !	 !    BBBBCCC1K +L D555666"[0 9,	 	k{,,g,>>DDFFGGD7$7778888ijjj 	iy**G*<<BBDDEED55556666ghhhhd0002RSSS 	td;;;00001111K  *,M Z^	JNNN??3}#5#566D\\"ABBFOO%%a(EJJLLLAAAAABBB ONNNNNNN--m<<M(\\\((((    33MBBFzz*--   &zz-88DD!677<<>C $ !@Z&**Z*@*@ZZKZZZ   $q("\[

7 3 3[[vzz-?X?X[[[   K   
 MMQ    /	J /	J /	JRRRRRRRR$$Q'' ,J
 [[[HHH    !33MBBFzz*-- (#*??3}3E3E#F#FD$(LL ?% %&hjj%,E !JJLLLL( ( ( ($'EEE(  &zz-88DD!677<<>C $ !TTTTZ&**Z*@*@ZZKZZZ   $q("R[

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

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

 b)))) 
" 
"')x 	. 	.#FFG .6666F66W667777,6,,F,,----bi 	 MbhWW 	 N$ 	" 	"FMM&!!!!	"  !!!+B3|,,---MMMMMMMM!8!8!:!:	;!J9Va!b!b	; I$W$W;$W$W$W!W!W244H ZFFIFFF	YYYYY 	S 	SC'++C44DTXXfc**,LS,Q,QRRRR%- 	* 	*!FE6~~''''5&)))) 	H 	HDxx//M488J3G3GM2H H99X..4<)@X)@)@)@AAAA4<)FGGGG
 =[IIHHxHHHHH 	c= 	cMMabbb B B B6AAAAAAAAAB \H$v-G~~ X.///k)	 	EE JJy':':G':'L'LMM	IMM+r::;;I%IIIJJJJ E E E;(CDDDDDE|+
HRHYHYH[H[b#DD!3!3!5!5DDDDDDabQ;;':::<NOOO9;VWWW//////	t 	 	 	 	 !=00MMM*4M4ML iEFFFF				 i24bcccc$&g$&g&g&ghhh KKKKKK#m3!! 	Y$}]33H444444(>>xHH   '/||H'='='C&H&HUW&X&X#    # SK)+_````	 H	,	,+	7\\\\\\\\%88::D2244#**,, n < V4= VEa'7aaa   
 8:TUUUU\ ncDTcccddddl ndm n8.E	    `_______##%%%n%%d+++*lT%6lld>NllVZVjll    ! n n n#$>BId`bIdIdflmmmmmmmmn 	 	 	)'Q	      	7 	7 	7,c"gg66666666	7	 F	*	*	5MMMMMM((**H||Ir22H 	2333nhll9c&B&Bnnx||\fhkOlOlnnoooo*KK	    	 	 	*$L	      	5 	5 	5*CGG44444444	5
	K;;;;;;,,-DEEI fY3355 f3EEEFFFF f5TTTVqrrrr5HHHJdeee 	K 	K 	K1@@@#b''JJJJJJJJ	K)WWWWWWWWWWII]]__III  	Z   N++>>>???**,,K# 2 2$ 4LL!23337 /LL"....6688 7LL!5666//11 ,LL+++%.~~'' -LL,,,-2D5)))0af00001111 !!## *2244 
 
G"??,, ! ")"3"3W"3"E"E&'11!$,>!H!HB! y..!*E*E y *+wGL+w+wXZX`X`abXcXc+w+w+w x x x$         
@@@@@@dM2222    
GGG- MkAooeJ--...e6{666fkRRXZ[[[[ 	%YC 011YYY[a[hjpjuvvwwwwGGG 	%&6:: ) )5'1''''((((GGG	 MeJ..///eKs#344KKKV]\b\ghhiii!"2A66 	% 	%HAu#q##E##$$$$ 	f%WY_YcddeeeeJ--...e/v{KKLLL	GGGGGs2  D7L 
L9L44L9C(P5 5
Q?QQ>BW 
X'W>>XZ//1[#"[#.\\+*\+^  ^;:^;"b' '
b43b4?B1z 1.h  z  h/,z .h//z 3i z iz iz !i- ,z -i<9z ;i<<D:z 7oz 
o# z "o##z 1 p z p!z  p!!D5z D%y= <z =
z
z 	z

z 
z7z22z74AB @!A@$ @#AB @$
AA@.'AAAAB AAAA,AB B
ABBABBEAG- G-
AG:G9AG:G>EAM M
AM'M&AM'M+AN1 N
AN NAN1 NANNAN1 NANNAN1 N1
AN>N=AN>OBAQ" Q"
AQ/Q.AQ/RAR< R
AR RAR< RAR(R%AR< R'AR(R(AR< R<
AS	SAS	SBAU+ U+
AVU5AVVAVV&D,A[ [
A[;[A[6[6A[;[?A2A]2 ]2
A]?]>A]?lF"As  s AzsAAzt!A#AvvAzvAvvAzvAvvC1AzzAzzBA|% |%
A}|/A}}A}~DBB B
BB,B+BB,SBS SBS'S&BS'TBT= T=BUUBUZBZ> Z>B[[B[].B^ ^B^*^)B^*g,Bh hBhhBhl4Bo2 o2
Bo?o>Bo?rBr rBr;r:Br;tG B{={=
B||
B|CCE  C5CD DCE  D CD$D$CE  D'CD$D(CE  E 6CFI
G)CP4 P4
CQP>CQQCQR?A&CT& T&CUUCUY	/C[ Y9CZ ZC[ Z
CZ#Z C[ Z"CZ#Z#/C[ [
C[ [C[ \CCa _<C` `Ca `Ca`"&CaaCa aCaaCa aCb5a=
Cb5bCb.b.Cb5c BCe eCf4e=
Cf4fCf-f-Cf4f8A/Ch( h(Ci#h3"CiiCi#i'GCs# qBCssCs# s
CssCs# sCssCs# s#
Cs;s/	Cs;s:Cs;s?Ct t
Ct"t!Ct"r   )NN)r   )FN)r3   N)___doc__rb   r=   r  r   importlib.utilr  pathlibr   r\  r   r   r   r   r   r	   hermes_cli.env_loaderr
   rw  r   r   rF   r   rb  	_env_pathrd  hermes_cli.colorsr   r   hermes_cli.modelsr   hermes_cli.vercel_authr   r   utilsr   r   r2   r5   rY   r9   r?   rJ   r   r  r]   rt   rf   rv   r{   intr   r   r   r   r   r   r   r;  r   r   r   r   r   r   r   r   r   r  hermes_cli.sizefmtr   r  r  r  r"  r'  __annotations__r+  r5  r@  rD  rM  rT  r  r^  rh  rz  r  r  r  r  r  r  r#  rN  r6   r7   r8   <module>r[     s	     
			 



                               5 4 4 4 4 4 0 0 0 0 0 0 3 3 3 3 3 3!!o LNN	  y/\F=R S S S S + + + + + + + + 0 0 0 0 0 0 7 7 7 7 7 7 2 2 2 2 2 2 ' ' ' ' ' ' @ 5 4 4 4 4 4IS I I I I%S %S % % % % t s    & eCI6F1G      . $ $ $ $ $ $"!B !BsTz3:/E)F !B !B !B !BH	 T 	 c 	  	  	  	   $+/*I *I*IS/D(*I 
*I *I *I *IZS S4Z     c    DI    >c >d > > > >
$    RT Rd R R R Rc c    4T%S#*>%? 4 4 4 4l2c 2QUVZQ[ 2`efjknfoquvzq{f{`| 2 2 2 2$C D    0j j3 j j j j jk kS k# k k k kh hS h# h h h h5S 5 5 5 5 2 
 < ; ; ; ; ;M M$ M M M M M`;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/% % % %R # tD[ 
%S/   B#c(T/    tDz d4j    t    4
tCy 
T 
 
 
 
8-$s) - - - - -`S S4 S SRV S S S Sl)L$s) )L )L )L )L )LX (,  + + +Zd Z Z Z ZzL L L L2E! E! E! E! E!r7   