
    )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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edee(         fdZ)de	dee(         fdZ*dede+e(df         fdZ,d>d edee         fd!Z-dee(         fd"Z.dee(         fd#Z/dee	         fd$Z0de	d%edee         fd&Z1d?dee	         dee2         fd'Z3d(Z4da5ee+         e6d)<   d?dee	         dee+         fd*Z7defd+Z8da9ee(         e6d,<    ej:                    Z;d- Z<d@d/e=dee(         fd0Z>d1e(defd2Z?d3edefd4Z@	 	 	 	 	 dAd5d6d7ed8ed9ee2         d:ee         d;ed<e(fd=ZAdS )BzWelcome banner, ASCII art, skills summary, and update check for the CLI.

Pure display functions with no HermesCLI state dependency.
    N)Path)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      8/home/wildlama/.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   2   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.git	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.
    gitz	ls-remotezrefs/heads/mainT
   )capture_outputr
   timeoutNr   )
subprocessrun_UPSTREAM_REPO_URLr   
returncodestdoutsplitUPDATE_AVAILABLE_NO_COUNT)r/   resultupstream_revs      r   _check_via_revr>   ~   s    K!35FGdB
 
 
    ttAV]t=&&((+L t	))11/HHs   !$ 
22repo_dirc           	      N   	 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.)r1   fetchoriginz--quietTr2   )r3   r4   cwd)r1   rev-list--countzHEAD..origin/main   r3   r
   r4   rC   r   N)r5   r6   strr   r8   intr9   strip)r?   r<   s     r   _check_via_local_gitrK      s    111H	
 	
 	
 	
 	

    	???dAH
 
 

 !!v}**,,--- "   4s   '* 
77AB 
B"!B"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)rL   partssegments      r   _version_tuplerS      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)headersrF   r4   infoversion)	urllib.requestrequestRequesturlopenjsonloadsreadr'   r   )rU   urlliburlreqrespdatas         r   _fetch_pypi_latestrh      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      )rh   VERSIONrS   r   )latests    r   check_via_pypirm      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behind.gitrT   )rs   rv   rt   ru   )r   osenvironr'   hermes_cli.configrq   r   timeexistsr`   ra   	read_text_UPDATE_CHECK_CACHE_SECONDSrk   r>   r   __file__parentresolverm   rK   
write_textdumps)hermes_home
cache_fileembedded_revrq   nowcachedrv   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``.
    rw   rT   N)r   r   r   r   r|   r   )r?   r   s     r   _resolve_repo_dirr   !  so     H~~$+3355Hv%%'' 0%''/ 6)1133=88=r   rt   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.r1   z	rev-parsez	--short=8TrF   rG   Nr    )r5   r6   rH   r   r8   r9   rJ   )r?   rt   r<   values       r   _git_short_hashr   /  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/mainHEAD)r1   rD   rE   zorigin/main..HEADTrF   rG   0)r   hermes_cli.build_infor   r   r   r5   r6   rH   r8   rI   r9   rJ   max)r?   r   bakedr   r   r   r<   s          r   get_git_banner_stater   A  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 )r1   describez--tagsz
--abbrev=0T   rG   r   r   /)
r   r   r5   r6   rH   r   r8   r9   rJ   _RELEASE_URL_BASE)r?   r<   tagrd   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 rj   commitcommitsu
    · local z (+z	 carried )rk   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 N)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         ?r4   c                 F    t                               |            t          S )z:Get result of prefetched check. Returns None if not ready.rY   )r   waitr   rY   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absrH   )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)endswith)r   s    r   _display_toolset_namer     s=     y   **	SbSr   consoler	   modelrC   toolsenabled_toolsets
session_idcontext_lengthc                 8   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|1r|                     d
           |                     d1| dC           |1D ]}2|2dD         r>|                     d.| d&|2d	          dE| dF|2dG          dH| dI| d&|2d          dJ           H|2	                    dK          r/|                     d.| d&|2d	          dL|2dG          dH| dM	           |                     d8|2d	          dL|2dG          dN           |                     d
           |                     d1| dO           tE                      }3tG          dP |3$                                D                       }4|3rt=          |3                                          D ]}5t=          |3|5                   }6t-          |6          d7k    r7|6dd7         }7d:                    |7          dQt-          |6          d7z
   dRz   }8nd:                    |6          }8t-          |8          dSk    r|8ddT         d#z   }8|                     d.| d&|5 dU| d&|8 d)	           n|                     d.| dV           |                     d
           |1rtG          dW |1D                       nd}9t-          |           dX|4 dYg}:|9r|:                    |9 dZ           |:                    d[           	 dd\l%m&}; dd]l'm(}<  |; |<                      d^k    r|                     d1| d_| d`| da           n# t&          $ r Y nw xY w	 ddbl)m*}=  |=            }>|>r%|>dck    r|                     d1| dd| d&|> d)           n# t&          $ r Y nw xY w|                     d.| d&de                    |:           d)           	 tW          dfg          }?|?r|?dk    rlddhl'm,}@m-}A |?dk    r2|?dik    rdjndk}B|                     dl|? dm|B dn |A             do           n, |@            }Cdp}D|Cr	|Ddq|C drz  }D|                     |D           n# t&          $ r Y nw xY w	 ddsl'm.}E  |E            dtk    r|                     du           n# t&          $ r Y nw xY wd0                    |           }F|/                    ||F           t          dvdw          }Gt          dxdy          }Hta                      }Itc                      }J|Jr|J\  }K}Ld1|G dz|L d&|I d{}Mn	d1|G d&|I d)}M |
||M|Hd|          }N| 2                                 tg          j4                    j5        }O|Od}k    rP|rt!          |d~          r|j6        r|j6        ntn          }P| 2                    |P           | 2                                 | 2                    |N           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%   r   r   check_fn)r      )paddingleftcenter)justifyrightbanner_accentz#FFBF00
banner_dimz#B8860Bbanner_textz#FFF8DCsession_borderz#8B8682r   banner_heror   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[/]	connectedz[/] [z](	transportz
)[/] [dim u	   ]—[/] [z tool(s)[/]disabledz
[/] [dim](u   ]— disabled[/]u   )[/] [red]— failed[/]z]Available Skills[/]c              3   4   K   | ]}t          |          V  d S r   )len.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   rj   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   rY   )get_managed_update_commandrecommended_update_commandrj   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][/]rp   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   r   r   r)   rx   getenvjoinr   r(   sortedkeystools.mcp_toolr   r-   sumvalueshermes_cli.codex_runtime_switchr  rz   r  hermes_cli.profilesr  r   r  r  rq   add_rowr   r   printshutilget_terminal_sizecolumnsr  HERMES_AGENT_LOGO)Qr   r   rC   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+   total_skillsr#   skill_namesdisplay_names
skills_strmcp_connectedsummary_partsr  	_load_cfgr  _profile_namerv   r  r  commits_wordmanaged_cmdlinerq   right_contenttitle_colorborder_colorversion_labelrelease_info_tag_urltitle_markupouter_panel
term_width_logosQ                                                                                    r   build_welcome_bannerr`    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; ""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   
 ""*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d 
d$#d$(7e   
e-,e- Bh% %
h21h26)i   
i-,i-)rT   r   )r   )NNNNN)B__doc__r`   loggingrx   r$  r5   r   r{   pathlibr   hermes_constantsr   typingr   r   r   r   rich.consoler	   	getLogger__name__logger_GOLD_BOLD_DIM_RSTrH   r   r   
hermes_clir   rk   r    r   r'  r  r-   r~   r;   r7   rI   r>   rK   rP   rS   rh   rm   r   r   r   dictr   r   r   __annotations__r   r   r   Eventr   r   floatr   r   r   r`  r   r   r   <module>rs     s    
   				                 , , , , , , 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 Ic Ihsm I I I I*4 HSM    0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R R) RC Rc R $T
R+/9R &)R
 *-R R R R R Rr   