
    ,j                        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ZddlZddlm	Z	 ddl
mZ ddlmZ ddlmZmZmZmZ erddlmZ  ej        e          ZdZd	Zd
ZdZdefdZdededefdZddlm Z!m"Z# dZ$dZ%deeee         f         fdZ&dZ'dZ(dZ)dZ*dedz  defdZ+dedz  de,fdZ-dedz  de,fdZ.ddd e/e         d!e	d"e0dee         fd#Z1d$edee0         fd%Z2d&e	dee0         fd'Z3d(ede4e0d)f         fd*Z5dHd,edee         fd-Z6dee0         fd.Z7dee0         fd/Z8dee	         fd0Z9d&e	d1edee         fd2Z:dId&ee	         dee;         fd3Z<d4Z=da>ee4         e?d5<   dId&ee	         dee4         fd6Z@defd7ZAdaBee0         e?d8<    ejC                    ZDd9 ZEdJd"eFdee0         fd;ZGd<e0defd=ZHd>edefd?ZI	 	 	 	 	 dKd@dAdBed!edCee;         dDee         dEedFe0fdGZJdS )LzWelcome banner, ASCII art, skills summary, and update check for the CLI.

Pure display functions with no HermesCLI state dependency.
    N)Path)urlparse)get_hermes_home)TYPE_CHECKINGDictListOptional)Consolez[1;38;2;255;215;0mz[1mz[2mz[0mtextc                 F    ddl m} ddlm}  | ||                      dS )z:Print ANSI-colored text through prompt_toolkit's renderer.r   )print_formatted_text)ANSIN)prompt_toolkitr   prompt_toolkit.formatted_textr   )r   	_pt_print_PT_ANSIs      6/home/ubuntu/.hermes/hermes-agent/hermes_cli/banner.pycprintr   (   sD    @@@@@@>>>>>>Ihhtnn    keyfallbackreturnc                 p    	 ddl m}  |                                | |          S # t          $ r |cY S w xY w)z5Get a color from the active skin, or return fallback.r   get_active_skin)hermes_cli.skin_enginer   	get_color	Exception)r   r   r   s      r   _skin_colorr   3   s[    ::::::  **3999   s   #& 55)__version____release_date__u  [bold #FFD700]██╗  ██╗███████╗██████╗ ███╗   ███╗███████╗███████╗       █████╗  ██████╗ ███████╗███╗   ██╗████████╗[/]
[bold #FFD700]██║  ██║██╔════╝██╔══██╗████╗ ████║██╔════╝██╔════╝      ██╔══██╗██╔════╝ ██╔════╝████╗  ██║╚══██╔══╝[/]
[#FFBF00]███████║█████╗  ██████╔╝██╔████╔██║█████╗  ███████╗█████╗███████║██║  ███╗█████╗  ██╔██╗ ██║   ██║[/]
[#FFBF00]██╔══██║██╔══╝  ██╔══██╗██║╚██╔╝██║██╔══╝  ╚════██║╚════╝██╔══██║██║   ██║██╔══╝  ██║╚██╗██║   ██║[/]
[#CD7F32]██║  ██║███████╗██║  ██║██║ ╚═╝ ██║███████╗███████║      ██║  ██║╚██████╔╝███████╗██║ ╚████║   ██║[/]
[#CD7F32]╚═╝  ╚═╝╚══════╝╚═╝  ╚═╝╚═╝     ╚═╝╚══════╝╚══════╝      ╚═╝  ╚═╝ ╚═════╝ ╚══════╝╚═╝  ╚═══╝   ╚═╝[/]u  [#CD7F32]⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⡀⠀⣀⣀⠀⢀⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀[/]
[#CD7F32]⠀⠀⠀⠀⠀⠀⢀⣠⣴⣾⣿⣿⣇⠸⣿⣿⠇⣸⣿⣿⣷⣦⣄⡀⠀⠀⠀⠀⠀⠀[/]
[#FFBF00]⠀⢀⣠⣴⣶⠿⠋⣩⡿⣿⡿⠻⣿⡇⢠⡄⢸⣿⠟⢿⣿⢿⣍⠙⠿⣶⣦⣄⡀⠀[/]
[#FFBF00]⠀⠀⠉⠉⠁⠶⠟⠋⠀⠉⠀⢀⣈⣁⡈⢁⣈⣁⡀⠀⠉⠀⠙⠻⠶⠈⠉⠉⠀⠀[/]
[#FFD700]⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣴⣿⡿⠛⢁⡈⠛⢿⣿⣦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀[/]
[#FFD700]⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠿⣿⣦⣤⣈⠁⢠⣴⣿⠿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀[/]
[#FFBF00]⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠻⢿⣿⣦⡉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀[/]
[#FFBF00]⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⢷⣦⣈⠛⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀[/]
[#CD7F32]⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣴⠦⠈⠙⠿⣦⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀[/]
[#CD7F32]⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⣿⣤⡈⠁⢤⣿⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀[/]
[#B8860B]⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠛⠷⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀[/]
[#B8860B]⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⠑⢶⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀[/]
[#B8860B]⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⠁⢰⡆⠈⡿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀[/]
[#B8860B]⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠳⠈⣡⠞⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀[/]
[#B8860B]⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀[/]c                      	 ddl m}   |             }n# t          $ r i cY S w xY wi }|D ]H}|                    d          pd}|                    |g                               |d                    I|S )a  Return skills grouped by category, filtered by platform and disabled state.

    Delegates to ``_find_all_skills()`` from ``tools/skills_tool`` which already
    handles platform gating (``platforms:`` frontmatter) and respects the
    user's ``skills.disabled`` config list.
    r   )_find_all_skillscategorygeneralname)tools.skills_toolr#   r   get
setdefaultappend)r#   
all_skillsskills_by_categoryskillr$   s        r   get_available_skillsr.   ]   s    666666%%''

   			 02 J J99Z((5I%%h33::5=IIIIs    ""i`T  z0https://github.com/NousResearch/hermes-agent.gitz$github.com/nousresearch/hermes-agenturlc                     | sdS |                                  }|                    d          rd|t          d          d         z   }n]|                    d          rd|t          d          d         z   }n-t          |          }|j        r|j        r|j         |j         }|                                                     d          }|                    d          r
|dd         }|                                S )	z>Return ``host/owner/repo`` for common GitHub remote URL forms. zgit@github.com:zgithub.com/Nzssh://git@github.com//.git)	strip
startswithlenr   netlocpathrstripendswithlower)r0   valueparseds      r   _canonical_github_remoter@      s    rIIKKE)** 4c*;&<&<&=&= >>			1	2	2 4c*A&B&B&C&C DD%= 	4V[ 	4}3fk33EKKMM  %%E~~f crc
;;==r   c                     | sdS |                                                                  }|                    d          p|                    d          S )NFzgit@zssh://)r6   r=   r7   )r0   r>   s     r   _is_ssh_remoterB      sO     uIIKKEF##Au'7'7'A'AAr   c                 P    t          |           ot          |           t          k    S N)rB   r@   _OFFICIAL_REPO_CANONICAL)r0   s    r   _is_official_ssh_remoterF      s$    #\#;C#@#@D\#\\r      timeoutargscwdrI   c          	          	 t          j        dg| dd|t          |                    }n# t          $ r Y d S w xY w|j        dk    rd S |j        pd                                S )NgitTcapture_outputr   rI   rK   r   r2   
subprocessrunstrr   
returncodestdoutr6   )rJ   rK   rI   results       r   _git_stdoutrW      s    	NTNC
 
 
    ttAtMR&&(((s   ), 
::	local_revc                     	 t          j        ddt          dgddd          }n# t          $ r Y dS w xY w|j        dk    s|j        sdS |j                                        d         }|sdS || k    rdnt          S )	zCompare an embedded git revision to upstream main via ls-remote.

    Returns 0 if up-to-date, ``UPDATE_AVAILABLE_NO_COUNT`` if behind,
    or ``None`` on failure.
    rM   z	ls-remotezrefs/heads/mainT
   )rO   r   rI   Nr   )rQ   rR   _UPSTREAM_REPO_URLr   rT   rU   splitUPDATE_AVAILABLE_NO_COUNT)rX   rV   upstream_revs      r   _check_via_revr_      s    K!35FGdB
 
 
    ttAV]t=&&((+L t	))11/HHs   !$ 
22repo_dirc           	         t          g d|           }t          |          r&t          ddg|           }|rt          |          ndS 	 t          j        g dddt          |           	           n# t          $ r Y nw xY w	 t          j        g d
dddt          |                     }|j        dk    r&t          |j	        
                                          S n# t          $ r Y nw xY wdS )z5Count commits behind origin/main in a local checkout.)remotezget-urlorigin)rK   	rev-parseHEADN)rM   fetchrc   z--quietTrZ   )rO   rI   rK   )rM   rev-list--countzHEAD..origin/mainrG   rN   r   )rW   rF   r_   rQ   rR   rS   r   rT   intrU   r6   )r`   
origin_urlhead_revrV   s       r   _check_via_local_gitrl      s@   <<<(KKKJz** >V4(CCC+3=~h'''=111H	
 	
 	
 	
 	

    	???dAH
 
 

 !!v}**,,--- "   4s%   
'A2 2
A?>A?AC 
C*)C*v.c                     g }|                      d          D ]J}	 |                    t          |                     &# t          $ r |                    d           Y Gw xY wt	          |          S )zMParse '0.13.0' into (0, 13, 0) for comparison. Non-numeric segments become 0..r   )r\   r*   ri   
ValueErrortuple)rm   partssegments      r   _version_tuplert      sz    E773<<  	LLW&&&& 	 	 	LLOOOOO	<<s   ">A A hermes-agentpackagec                    	 ddl }d|  d}|j                            |ddi          }|j                            |d	          5 }t	          j        |                                          }|                    d
i                               d          cddd           S # 1 swxY w Y   dS # t          $ r Y dS w xY w)zIFetch the latest version of a package from PyPI. Returns None on failure.r   Nzhttps://pypi.org/pypi/z/jsonAcceptzapplication/json)headersrG   rH   infoversion)	urllib.requestrequestRequesturlopenjsonloadsreadr(   r   )rv   urllibr0   reqrespdatas         r   _fetch_pypi_latestr      s   5w555n$$S8=O2P$QQ^##C#33 	7t:diikk**D88FB''++I66	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7    tts7   AB/ AB"B/ "B&&B/ )B&*B/ /
B=<B=c                      t                      } | dS | t          k    rdS 	 t          |           t          t                    k    rdS dS # t          $ r | t          k    rdndcY S w xY w)zoCompare installed version against PyPI latest.

    Returns 0 if up-to-date, 1 if behind, None on failure.
    Nr      )r   VERSIONrt   r   )latests    r   check_via_pypir      s    
  !!F~tq-&!!N7$;$;;;1q - - -g%%qq1,,,-s   %A
 
A&%A&c            	         t                      } | dz  }t          j                            d          pd}	 ddlm}  |            dk    rdS n# t          $ r Y nw xY wt          j                    }	 |                                rt          j
        |                                          }||                    dd          z
  t          k     rL|                    d          |k    r3|                    d	          t          k    r|                    d
          S n# t          $ r Y nw xY w|rt          |          }nt          t                     j        j                                        }|dz                                  s| dz  }|dz                                  st'                      }nt)          |          }	 |                    t          j        |||t          d                     n# t          $ r Y nw xY w|S )a  Check whether a Hermes update is available.

    Two paths: if ``HERMES_REVISION`` is set (nix builds embed it), compare
    it to upstream main via ``git ls-remote``. Otherwise look for a local
    git checkout and count commits behind ``origin/main``.

    Returns the number of commits behind, ``UPDATE_AVAILABLE_NO_COUNT`` (-1)
    if behind but the count is unknown, ``0`` if up-to-date, or ``None`` if
    the check failed or doesn't apply. Cached for 6 hours.
    z.update_checkHERMES_REVISIONNr   detect_install_methoddockertsrevverbehindr4   ru   )r   r   r   r   )r   osenvironr(   hermes_cli.configr   r   timeexistsr   r   	read_text_UPDATE_CHECK_CACHE_SECONDSr   r_   r   __file__parentresolver   rl   
write_textdumps)hermes_home
cache_fileembedded_revr   nowcachedr   r`   s           r   check_for_updatesr   
  s;    "##K.J:>>"344<L;;;;;;  ""h..4 /    )++C
 	,Z
 4 4 6 677Ffjjq))),GGGJJu%%55JJu%%00zz(+++     4--
 >>(/77996!))++ 	4"^3H6!))++ 	4#%%FF)(33FJcVLQXYYZZ	
 	
 	
 	
     Ms6   A 
AA1B'D 
D'&D'>1G0 0
G=<G=c                      t          t                    j        j                                        } | dz                                  st                      }|dz  } | dz                                  r| ndS )zReturn the active Hermes git checkout, or None if this isn't a git install.

    Prefers the running code's location over the profile-scoped path
    because ``$HERMES_HOME/hermes-agent/`` may be a stale copy carried
    over by ``--clone-all``.
    r4   ru   N)r   r   r   r   r   r   )r`   r   s     r   _resolve_repo_dirr   V  so     H~~$+3355Hv%%'' 0%''/ 6)1133=88=r   r   c           	          	 t          j        ddd|gdddt          |                     }n# t          $ r Y dS w xY w|j        dk    rdS |j        pd	                                }|pdS )
z4Resolve a git revision to an 8-character short hash.rM   rd   z	--short=8TrG   rN   Nr   r2   rP   )r`   r   rV   r>   s       r   _git_short_hashr   d  s    	Kc2H
 
 
    ttAt] b''))E=Ds   *- 
;;c           	      4   | pt                      } | .	 ddlm}  |d          }|r||ddS n# t          $ r Y nw xY wdS t	          | d          }t	          | d          }|r|s.	 ddlm}  |d          }|r||ddS n# t          $ r Y nw xY wdS d}	 t          j        g d	d
d
dt          |                     }|j        dk    r*t          |j
        pd                                pd          }n# t          $ r d}Y nw xY w||t          |d          dS )u  Return upstream/local git hashes for the startup banner.

    For source installs and dev images this runs ``git rev-parse`` against
    the active checkout.  When no checkout is available — the canonical case
    is the published Docker image, which excludes ``.git`` from the build
    context — we fall back to the baked-in build SHA (see
    ``hermes_cli/build_info.py``) and return it as a frozen
    ``upstream == local`` state with ``ahead=0``.  A built image is by
    definition pinned to one commit, so "ahead" is always zero and the
    banner correctly shows ``· upstream <sha>`` with no carried-commits
    annotation.
    Nr   )get_build_sha   )short)upstreamlocalaheadzorigin/mainre   )rM   rg   rh   zorigin/main..HEADTrG   rN   0)r   hermes_cli.build_infor   r   r   rQ   rR   rS   rT   ri   rU   r6   max)r`   r   bakedr   r   r   rV   s          r   get_git_banner_stater   v  s    .,..H	;;;;;;!M***E G$)EAFFFG 	 	 	D	tx77HHf--E 
5 
	;;;;;;!M***E G$)EAFFFG 	 	 	D	tE???H
 
 
 !!-#4466=#>>E    !53ua==IIIs1   / 
<<&B 
BBAC4 4DDz9https://github.com/NousResearch/hermes-agent/releases/tag_latest_release_cachec           	      V   t           	t           pdS | pt                      } | da dS 	 t          j        g ddddt	          |                     }n# t
          $ r da Y dS w xY w|j        dk    rda dS |j        pd                                }|sda dS t           d	| }||fa t           S )
u  Return ``(tag, release_url)`` for the latest git tag, or None.

    Local-only — runs ``git describe --tags --abbrev=0`` against the
    Hermes checkout. Cached per-process. Release URL always points at the
    canonical NousResearch/hermes-agent repo (forks don't get a link).
    N )rM   describez--tagsz
--abbrev=0T   rN   r   r2   r3   )
r   r   rQ   rR   rS   r   rT   rU   r6   _RELEASE_URL_BASE)r`   rV   tagr0   s       r   get_latest_release_tagr     s    ($,,.,..H "t
777H
 
 
     "tt A "t=B
%
%
'
'C  "t
&
&
&
&C #J  s   (A A! A!c            
         dt            dt           d} t                      }|s| S |d         }|d         }t          |                    d          pd          }|dk    s||k    r|  d| S |d	k    rd
nd}|  d| d| d| d| d
S )z;Return the version label shown in the startup banner title.zHermes Agent vz ()r   r   r   r   u    · upstream r   commitcommitsu
    · local z (+z	 carried )r   RELEASE_DATEr   ri   r(   )basestater   r   r   carried_words         r   format_banner_version_labelr     s    6G66|666D ""E Z H'NE		'""'a((EzzX&&//X///$zz88yL^^^^U^^u^^|^^^^r   _update_resultc                  `    d } t          j        | d          }|                                 dS )z4Kick off update check in a background daemon thread.c                  T    t                      at                                           d S rD   )r   r   _update_check_donesetr   r   r   _runz#prefetch_update_check.<locals>._run  s%    *,,     r   T)targetdaemonN)	threadingThreadstart)r   ts     r   prefetch_update_checkr     s9    ! ! ! 	T222AGGIIIIIr         ?c                 F    t                               |            t          S )z:Get result of prefetched check. Returns None if not ready.rH   )r   waitr   rH   s    r   get_update_resultr      s    G,,,r   tokensc                    | dk    r5| dz  }t          |          }t          ||z
            dk     r| dS |ddS | dk    r5| dz  }t          |          }t          ||z
            dk     r| dS |ddS t          |           S )uL   Format a token count for display (e.g. 128000 → '128K', 1048576 → '1M').i@B g?Mz.1fi  K)roundabsrS   )r   valroundeds      r   _format_context_lengthr   
  s    y **sW}$$=== }}}}	5un**sW}$$=== }}}}v;;r   toolset_namec                 L    | sdS |                      d          r
| dd         n| S )zANormalize internal/legacy toolset identifiers for banner display.unknown_toolsNi)r<   )r   s    r   _display_toolset_namer     s=     y   **	SbSr   consoler
   modeltoolsenabled_toolsets
session_idcontext_lengthc                 D   ddl m}m}	 ddlm}
 ddlm} |ddl m} |pg }|pg } |d          \  }}t                      }t                      }|D ]}|	                    d	d
          }|		                    |i           }|	                    dg           }|	                    d          r|
                    |           o|
                    |           |                    d          }|                    dd           |                    dd           t          dd          }t          dd          }t          dd          }t          dd          }	 ddlm}  |            }t!          |d          r|j        r|j        nt$          }n# t&          $ r d}t$          }Y nw xY wd
|d
g}d|v r|                    d          d         n|}|                    d          r
|dd          }t-          |          d!k    r|dd"         d#z   }|rd$| d%| d&t/          |           d'nd
}|                    d(| d&| d)| d$| d%| d*           t3          j        d+          r|                    d,| d-           |                    d.| d&| d)           |r|                    d.| d/| d)           d0                    |          }d1| d2g} i }!|D ]S}"|"d3         d	         }#t9           ||#          pd4          }$|!                    |$g                               |#           T|D ]}|	                    d5|	                    d	d6                    }%t9          |%          }&|&|!vrg |!|&<   |	                    dg           D ]'}#|#|!|&         vr|!|&                             |#           (t=          |!                                          }'|'dd7         }(t-          |'          d7z
  })|(D ]}$|!|$         }*g }+t=          |*          D ]Z},|,|v r|+                    d8|, d)            |,|v r|+                    d9|, d)           >|+                    d(| d&|, d)           [d:                    |+          }-t-          d:                    t=          |*                              d;k    r g }.d}/t=          |*          D ]\},|/t-          |,          z   d<z   d=k    r|.                    d#            n+|.                    |,           |/t-          |,          d<z   z  }/]g }+|.D ]v},|,d#k    r|+                    d>           |,|v r|+                    d8|, d)           <|,|v r|+                    d9|, d)           Z|+                    d(| d&|, d)           wd:                    |+          }-|                     d.| d&|$ d?|-            |)dk    r|                     d.| d@|) dA           	 ddBl m!}0  |0            }1n# t&          $ r g }1Y nw xY w|1rj|                     d
           |                     d1| dC           |1D ]8}2|2	                    dD          }3|2dE         r>|                     d.| d&|2d	          dF| dG|2dH          dI| dJ| d&|2d          dK           ^|2	                    dL          s|3dLk    r/|                     d.| d&|2d	          dM|2dH          dI| dN	           |3dOk    r,|                     d.| d&|2d	          dM|2dH          dP           |3dQk    r0|                     d.| d&|2d	          dM|2dH          dI| dR	           |                     d8|2d	          dM|2dH          dS           :|                     d
           |                     d1| dT           tE                      }4tG          dU |4$                                D                       }5|4rt=          |4                                          D ]}6t=          |4|6                   }7t-          |7          d7k    r7|7dd7         }8d:                    |8          dVt-          |7          d7z
   dWz   }9nd:                    |7          }9t-          |9          dXk    r|9ddY         d#z   }9|                     d.| d&|6 dZ| d&|9 d)	           n|                     d.| d[           |                     d
           |1rtG          d\ |1D                       nd}:t-          |           d]|5 d^g};|:r|;                    |: d_           |;                    d`           	 ddal%m&}< ddbl'm(}=  |< |=                      dck    r|                     d1| dd| de| df           n# t&          $ r Y nw xY w	 ddgl)m*}>  |>            }?|?r%|?dhk    r|                     d1| di| d&|? d)           n# t&          $ r Y nw xY w|                     d.| d&dj                    |;           d)           	 tW          dkl          }@|@r|@dk    rlddml'm,}Am-}B |@dk    r2|@dnk    rdondp}C|                     dq|@ dr|C ds |B             dt           n, |A            }Ddu}E|Dr	|Edv|D dwz  }E|                     |E           n# t&          $ r Y nw xY w	 ddxl'm.}F  |F            dyk    r|                     dz           n# t&          $ r Y nw xY wd0                    |           }G|/                    ||G           t          d{d|          }Ht          d}d~          }Ita                      }Jtc                      }K|Kr|K\  }L}Md1|H d|M d&|J d}Nn	d1|H d&|J d)}N |
||N|Id          }O| 2                                 tg          j4                    j5        }P|Pdk    rP|rt!          |d          r|j6        r|j6        ntn          }Q| 2                    |Q           | 2                                 | 2                    |O           dS )a  Build and print a welcome banner with caduceus on left and info on right.

    Args:
        console: Rich Console instance.
        model: Current model name.
        cwd: Current working directory.
        tools: List of tool definitions.
        enabled_toolsets: List of enabled toolset names.
        session_id: Session identifier.
        get_toolset_for_tool: Callable to map tool name -> toolset name.
        context_length: Model's context window size in tokens.
    r   )check_tool_availabilityTOOLSET_REQUIREMENTS)Panel)TableN)get_toolset_for_toolT)quietr&   r2   r   check_fn)r      )paddingleftcenter)justifyrightbanner_accentz#FFBF00
banner_dimz#B8860Bbanner_textz#FFF8DCsession_borderz#8B8682r   banner_heror3   r/   z.gguf      z...z [dim u   ]·[/] [dim ]z context[/][z[/]z]Nous Research[/]HERMES_YOLO_MODEu    [bold red]⚠ YOLO mode[/] [dim u%   ]— all approval prompts bypassed[/]z[dim z
]Session: 
z[bold z]Available Tools[/]functionotheridr   r   z[red]z[yellow]z, -   r   *   z[dim]...[/]z:[/] z](and z more toolsets...)[/])get_mcp_statusz]MCP Servers[/]status	connectedz[/] [z](	transportz
)[/] [dim u	   ]—[/] [z tool(s)[/]disabledz
[/] [dim](u   ]— disabled[/]
connectingu   )[/] [yellow]— connecting[/]
configuredu   ]— configured[/]u   )[/] [red]— failed[/]z]Available Skills[/]c              3   4   K   | ]}t          |          V  d S rD   )r8   .0ss     r   	<genexpr>z'build_welcome_banner.<locals>.<genexpr>  s(      CC!s1vvCCCCCCr   z +z more2   /   z:[/] [z]No skills installed[/]c              3   *   K   | ]}|d          
dV  dS )r  r   Nr   r  s     r   r  z'build_welcome_banner.<locals>.<genexpr>  s+      @@a;@@@@@@@r   z toolsz skillsz MCP serversz/help for commands)get_current_runtime)load_configcodex_app_serverz]Runtime:[/] [z]codex app-server[/] [dim z,](terminal/file ops/MCP run inside codex)[/])get_active_profile_namedefaultz]Profile:[/] [u    · r   rH   )get_managed_update_commandrecommended_update_commandr   r   r   u   [bold yellow]⚠  u%    behind[/][dim yellow] — run [bold]z[/bold] to update[/]u$   [bold yellow]⚠ update available[/]u   [dim yellow] — run [bold]z
[/bold][/]r   pipu   [bold yellow]⚠ pip install not officially supported[/][dim yellow] — exists for reasons other than user install; expect instability and an inability to support issues[/]banner_titlez#FFD700banner_borderz#CD7F32z][link=z
[/link][/])titleborder_styler   _   banner_logo)8model_toolsr   r   
rich.panelr   
rich.tabler   r   r   r(   updategrid
add_columnr   r   r   hasattrr   HERMES_CADUCEUSr   r\   r<   r8   r   r*   r   getenvjoinr   r)   sortedkeystools.mcp_toolr  r.   sumvalueshermes_cli.codex_runtime_switchr  r   r  hermes_cli.profilesr  r   r!  r"  r   add_rowr   r   printshutilget_terminal_sizecolumnsr*  HERMES_AGENT_LOGO)Rr   r   rK   r   r   r   r   r   r   r   r   r   _unavailable_toolsetsdisabled_tools
lazy_toolsitemr   ts_reqtools_in_tslayout_tableaccentdimr   session_colorr   _bskin_hero
left_linesmodel_shortctx_strleft_contentright_linestoolsets_dicttool	tool_nametoolset
toolset_iddisplay_namesorted_toolsetsdisplay_toolsetsremaining_toolsets
tool_namescolored_namesr&   	tools_strshort_nameslengthr  
mcp_statussrvr  r,   total_skillsr$   skill_namesdisplay_names
skills_strmcp_connectedsummary_partsr  	_load_cfgr  _profile_namer   r!  r"  commits_wordmanaged_cmdliner   right_contenttitle_colorborder_colorversion_labelrelease_info_tag_urltitle_markupouter_panel
term_width_logosR                                                                                     r   build_welcome_bannerrz  &  s   $ JIIIIIII            #444444KRE'-255DAAAAUUN J$ / /xx++%)),;;hhw++::j!! 	/k****!!+....::f:--LFH555GV444 )44F
lI
.
.C}i00D 0)<<M :::::: ""&-fm&D&DpI[p""ap        eRJ*-,,%++c""2&&EKG$$ '!#2#&
;"!#2#&.es{asaaaa.D^.T.Taaaay{Gi&ii;ii7ii#iiSViiijjj	y#$$ igSggghhh,c,,C,,,--- LJ-JJ:JJJKKK99Z((L7F7778K%'M @ @$V,	'(<(<Y(G(G(R7SS  "--44Y????$ > >XXdDHHVY$?$?@@
,Z88},,*,M,''2.. 	> 	>Il ;;;l+229===	> ]//1122O&rr*_--1# !D !D"7+
:&& 	; 	;D~%%$$%6T%6%6%67777##$$%9%9%9%9::::$$%9%9%9%9%9%9::::IIm,,	tyy
++,,--22KFz** ( (CII%)B..&&u---E""4(((#d))a-'M# ? ?5==!((7777^++!(():):):):;;;;Z''!(()=D)=)=)=>>>>!(()=T)=)=D)=)=)=>>>>		-00IB3BBBByBBCCCCAW3WW.@WWWXXX111111#^%%

   


  2;F;;;<<< 	 	CWWX&&F; ""KC K K#f+ K KD K KC<L K KK K*.K K14WK K K    $$ *(<(<""2C 2 2#f+ 2 2[9I 2 22 2 2    <''""1C 1 1#f+ 1 1[9I 1 1 1    <''""4C 4 4#f+ 4 4[9I 4 44 4 4   
 ""*CK * *3{3C * * *   
 r<<<<===-//CC'9'@'@'B'BCCCCCL A1668899 		U 		UH !3H!=>>K;!## +BQB!YY}558XS=M=MPQ=Q8X8X8XX

!YY{33
:##'_u4
SsSSXSSTSSJSSSTTTT		U 	?3???@@@rDNUC@@:@@@@@@TUME

***|,D,D,DEM =;;;<<<-...	GGGGGG>>>>>>yy{{++/AAAJ J Jt J JJ J J      ??????//11 	Y]i77WWWdWW]WWWXXX    DsDDV[[%?%?DDDEEE"3///&A++````````zz+1Q;;xxI""e e e e e2L2L2N2Ne e e    98::= RQ+QQQQD""4(((   	;;;;;;  ""e++K  
     IIk**M}555ni88K	::L/11M)++L A!
dTTTDTT=TTT@@@m@@@%!	  K MMOOO)++3JR&,}1O1O}TZTf}""l}eMM+sn   5F F('F(4X XXAf 
f*)f*.7g& &
g32g3&Bj+ +
j87j8<)k& &
k32k3)ru   rD   )r   )NNNNN)K__doc__r   loggingr   r>  rQ   r   r   pathlibr   urllib.parser   hermes_constantsr   typingr   r   r   r	   rich.consoler
   	getLogger__name__logger_GOLD_BOLD_DIM_RSTrS   r   r   
hermes_clir    r   r!   r   rA  r2  r.   r   r]   r[   rE   r@   boolrB   rF   listri   rW   r_   rl   rq   rt   r   r   r   r   r   dictr   r   r   __annotations__r   r   r   Eventr   r   floatr   r   r   rz  r   r   r   <module>r     sv    
   				                 ! ! ! ! ! ! , , , , , , 6 6 6 6 6 6 6 6 6 6 6 6  %$$$$$$		8	$	$ 	!    S C C     P O O O O O O OF j,d3S	>2    2 '   G A #*     &Bd
 Bt B B B B]t ] ] ] ] ] ?@ ) ) )d3i ) ) )HSM ) ) ) ) Ic Ihsm I I I I*4 HSM    :c eCHo    
 
 
# 
 
 
 
- - - - -$I8C= I I I IX>8D> > > > >d  #    $5J 5J8D> 5JXd^ 5J 5J 5J 5Jp P )- x - - -'! '!Xd^ '!x '! '! '! '!T_S _ _ _ _, !% $ $ $$Y_&&    u x}    3 3    "      .27;+/.2/3] ]) ]C ]c ] $T
]+/9] &)]
 *-] ] ] ] ] ]r   