+
    „WÝjN“  ã                   ó–  a € Re t\0 t R t^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	H
t
 ^ RIHt ^ RIHt ^ RIHt ^ RIHtHtHtHtHt ]'       d   ^ RIHt ]P2                  ! ]4      tRtR	tR
 R ltR R ltRfR lt R R lt!R t"R R lt#^ RIH$t% ^ RI&H't' Rt(Rt)Rt*] ^ k Rt+] ^k Rt,] ^k ]-! 4       t.R R lt/R R lt0R R lt1RfR R llt2R  R! lt3RfR" R# llt4R$t5RfR% R& llt6R' R( lt7Rs8] ^k ]Pr                  ! 4       t:R) R* lt;R+ R, lt<R- t=R.s>R/ t?RgR0 R1 llt@R2 R3 ltAR.sBR4 R5 ltCRhR6 R7 lltDR8 R9 ltER: R; ltFR< R= ltGR> R? ltH^tIR@ RA ltJRB RC ltKRfRD RE lltLRF RG ltMRfRH RI lltNRJ RK ltORL RM ltPRN RO ltQRP RQ ltRRR RS ltSRT RU ltTRV RW ltURX RY ltVRZ R[ ltWR\R./R] R^ lltXR_ R` ltYRa Rb ltZRiRc Rd llt[R# )jzHWelcome banner, ASCII art, skills summary, and update check for the CLI.N©ÚPath)Úsource_check)Ú_github_compare_behind©Úget_hermes_home)ÚTYPE_CHECKINGÚAnyÚDictÚListÚOptional©ÚConsolez[2mz[0mc                ó:   € V ^8„  d   QhR\         \        ,          /# ©é   Úreturn©r   Úint)Úformats   "ÚEC:\Users\johnn\AppData\Local\hermes\hermes-agent\hermes_cli\banner.pyÚ__annotate__r      s   € ÷ ñ œ¤#�ñ ó    c                  ó   € R # ©N© r   r   r   Ú_check_via_pypir      ó   € ár   c                ó:   € V ^8„  d   QhR\         \        ,          /# r   r   )r   s   "r   r   r   "   s   € ÷ ñ œ¤�ñ r   c                  ó   € R # r   r   r   r   r   Úcheck_via_pypir    "   r   r   c                ó8   €  V ! 4       #   \          d    Tu # i ; i)uM   ``fn()``, or ``default`` on any exception â€” for best-effort display inputs.)Ú	Exception)ÚfnÚdefaults   &&r   Ú_quietr%   '   s"   € ðÙ‹tˆøÜô ØŠðús   ‚	 ‰˜c                ó$   € V ^8„  d   QhR\         /# )r   Útext©Ústr)r   s   "r   r   r   /   s   € ÷ ñ ”ñ r   c                ód   a aa€ ^ RI Ho ^ RIHo \	        VVV 3R l4      f   \        S 4       R# R# )z:Print ANSI-colored text through prompt_toolkit's renderer.)Úprint_formatted_text)ÚANSIc                  ó4   <€ S! S ! S4      4      ;'       g    R # )Tr   )Ú_PT_ANSIÚ	_pt_printr'   s   €€€r   Ú<lambda>Úcprint.<locals>.<lambda>5   s   ø€ ‘i¡¨£Ó/×7Ð7°4Ð7r   N)Úprompt_toolkitr+   Úprompt_toolkit.formatted_textr,   r%   Úprint)r'   r.   r/   s   f@@r   Úcprintr5   /   s$   ú€ å@Ý>ô Ö7Ó8Ò@ÜˆdŽñ Ar   c                 ó   € ^ RI Hp  V ! 4       # )zDThe active skin object (raises when the skin engine is unavailable).©Úget_active_skin)Úhermes_cli.skin_enginer8   r7   s    r   Ú_active_skinr:   9   s   € å6ÙÓÐr   c                ó<   € V ^8„  d   QhR\         R\         R\         /# )r   ÚkeyÚfallbackr   r(   )r   s   "r   r   r   ?   s&   € ÷ Mñ M”Sð M¤Cð M¬Cñ Mr   c                ó(   a a€ \        VV 3R lS4      # )z5Get a color from the active skin, or return fallback.c                  ó8   <€ \        4       P                  SS 4      # r   )r:   Ú	get_color)r=   r<   s   €€r   r0   Ú_skin_color.<locals>.<lambda>A   s   ø€ œ,›.×2Ñ2°3¸ÔAr   ©r%   )r<   r=   s   ffr   Ú_skin_colorrC   ?   s   ù€ äÕAÀ8ÓLÐLr   )Ú__release_date__)Úget_version_infou‹  [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                ó$   € V ^8„  d   QhR\         /# )r   Ú
cache_namer(   )r   s   "r   r   r   k   s   € ÷ ñ ”cñ r   c                ó¬   € ^ RI Hp V! 4       e   V! 4       # \        4       V ,          pVe
   V^ ,          # V! 4       pV\        Jd   V3\        4       V &   V# )a  Return the cached value under module global ``cache_name``, computing (and storing) it once.

Not consulted under a routed profile (HERMES_HOME override): every memo here is derived from the
launch home (its skills tree, its checkout), and the TUI gateway calls these per profile.)Úget_hermes_home_override)Úhermes_constantsrI   ÚglobalsÚ	_UNCACHED)rG   ÚcomputerI   ÚcachedÚvalues   &&   r   Ú_memorP   k   sV   € õ
 :ÙÓ!Ò-Ù‹yÐÜ‹Y�zÕ"€FØÒØ�a�yÐÙ‹I€EØ”IÓØ!& Œ‹	�*ÑØ€Lr   c                ó\   € V ^8„  d   QhR\         \        \        \        ,          3,          /# r   )Údictr)   Úlist)r   s   "r   r   r   |   s    € ÷ 1ñ 1œd¤3¬¬S­	 >Õ2ñ 1r   c                 óJ   a€ R oV3R lp \        RV 4      pV\        J d   / # T# )a  Return skills grouped by category, filtered by platform and disabled state.

Cached per-process (the skills-tree walk costs ~100ms and feeds only the startup banner);
``prefetch_banner_data()`` pays it off-thread. A failed scan yields ``{}`` and is not cached.
c                  ó   € ^ RI Hp  V ! 4       # )é    ©Úfind_all_skills)Útools.skills_toolrX   rW   s    r   Ú_scanÚ#get_available_skills.<locals>._scan‚   s   € Ý5ÙÓ Ð r   c                  óÊ   <€ \        S4      p V f   \        # / pV  FD  pTP                  VP                  R4      ;'       g    R. 4      P	                  VR,          4       KF  	  V# )NÚcategoryÚgeneralÚname)r%   rL   Ú
setdefaultÚgetÚappend)Ú
all_skillsÚskills_by_categoryÚskillrZ   s      €r   Ú_computeÚ&get_available_skills.<locals>._compute†   sa   ø€ Ü˜E“]ˆ
ØÒÜÐØ35ÐÛˆEØ×)Ñ)¨%¯)©)°JÓ*?×*LÐ*LÀ9ÈbÓQ×XÑXÐY^Ð_eÕYfÖgñ  à!Ð!r   Ú_available_skills_cache)rP   rL   )rf   ÚresultrZ   s     @r   Úget_available_skillsrj   |   s.   ø€ ò!õ"ô Ð,¨hÓ7€FØœ9Ó$ˆ2Ð0¨&Ð0r   c                ó:   € V ^8„  d   QhR\         \        ,          /# r   )r   r   )r   s   "r   r   r   ’   s   € ÷ 	>ñ 	>œ8¤D�>ñ 	>r   c                 ó  € \        \        4      P                  P                  P                  4       p V R,          P	                  4       '       g   \        4       R,          p V R,          P	                  4       '       d   V # R# )z¿The active Hermes git checkout, or None if this isn't a git install.

Prefers the running code's location: ``$HERMES_HOME/hermes-agent/`` may be a stale copy
carried over by ``--clone-all``.
z.gitzhermes-agentN)r   Ú__file__ÚparentÚresolveÚexistsr   ©Úrepo_dirs    r   Ú_resolve_repo_dirrs   ’   sa   € ô ”H‹~×$Ñ$×+Ñ+×3Ñ3Ó5€HØ�vÕ×%Ñ%×'Ò'Ü"Ó$ ~Õ5ˆØ  6Õ)×1Ñ1×3Ò3ˆ8Ð=¸Ð=r   c                ó\   € V ^8„  d   QhR\         \        ,          R\         \        ,          /# ©r   rr   r   ©r   r   rR   )r   s   "r   r   r   ž   s&   € ÷ Gñ G¤8¬D¥>ð G¼XÄd½^ñ Gr   c                ó@   € V e   \        V 4      # \        R\         4      # )zõReturn upstream/local git hashes for the startup banner.

Cached per-process (default ``repo_dir`` only): 2-3 git subprocesses (~100ms) whose result
cannot change under a running CLI. The cache lets ``prefetch_banner_data()`` pay it off-thread.
Ú_git_banner_state_cache)Ú_compute_git_banner_staterP   rq   s   &r   Úget_git_banner_staterz   ž   s$   € ð ÒÜ(¨Ó2Ð2ÜÐ*Ô,EÓFÐFr   c                ó:   € V ^8„  d   QhR\         \        ,          /# r   )r   rR   )r   s   "r   r   r   ©   s   € ÷ Nñ NœX¤d�^ñ Nr   c                 óB   € R p \        V 4      pV'       d	   RVRVR^ /# R# )zCBanner state from the baked build SHA (Docker image path), or None.c                  ó:   € ^ RI Hp  V ! 4       P                  R4      # )rV   ©Úget_code_identityÚ	short_sha)Úhermes_cli.version_infor   ra   r~   s    r   Ú_bakedÚ#_baked_banner_state.<locals>._baked«   s   € Ý=Ù Ó"×&Ñ& {Ó3Ð3r   ÚupstreamÚlocalÚaheadNrB   )r‚   Úbakeds     r   Ú_baked_banner_staterˆ   ©   s,   € ò4ô �6‹N€Eß>CˆJ˜˜w¨¨w¸Ð:ÐMÈÐMr   c                ó\   € V ^8„  d   QhR\         \        ,          R\         \        ,          /# ru   rv   )r   s   "r   r   r   ²   s&   € ÷ 	Jñ 	J¬´­ð 	JÄ(Ì4Å.ñ 	Jr   c           	      ó  a € S ;'       g    \        4       o S f   \        4       # V 3R lR 4       w  rV'       d	   V'       g   \        4       # \        P                  ! . ROS R7      ;'       g    ^ pRVRVR\	        V^ 4      /# )Nc              3   óZ   <"  € T F   p\         P                  ! R RV.SR7      x € K"  	  R# 5i)ú	rev-parsez	--short=8©ÚcwdN)r   Ú_git_stdout)Ú.0Úrevrr   s   & €r   Ú	<genexpr>Ú,_compute_git_banner_state.<locals>.<genexpr>¶   s7   øé € ð  Cñ  kBÐcf”|×/Ò/°¸kÈ3Ð0OÐU]×^Ñ^ó  kBùs   ƒ(+r�   r„   r…   r†   )zorigin/mainÚHEAD)zrev-listz--countzorigin/main..HEAD)rs   rˆ   r   Ú
_git_countÚmax)rr   r„   r…   r†   s   f   r   ry   ry   ²   s~   ø€ Ø×.Ð.Ô,Ó.€HØÒÜ"Ó$Ð$ô Cñ  kBó  C�O€HßŸ5ä"Ó$Ð$Ü×#Ò#Ò$PÐV^Ô_×dÐdÐcd€EØ˜ '¨5°'¼3¸uÀa»=ÐIÐIr   z9https://github.com/NousResearch/hermes-agent/releases/tagc                ó\   € V ^8„  d   QhR\         \        ,          R\         \        ,          /# ru   )r   r   Útuple)r   s   "r   r   r   Á   s"   € ÷ 	4ñ 	4¤X¬d¥^ð 	4¼xÌ½ñ 	4r   c                ó(   a € V 3R lp\        RV4      # )z¼Return ``(tag, release_url)`` for the latest local git tag, or None (a miss is cached too).

Release URL always points at the canonical NousResearch/hermes-agent repo (forks get no link).
c                  ó¤   <€ S;'       g    \        4       p V '       d   \        P                  ! . ROV ^R7      MRpV'       d   V\         RV 23# R# )Údescribe)rŽ   ÚtimeoutNÚ/)r›   z--tagsz
--abbrev=0)rs   r   r�   Ú_RELEASE_URL_BASE)ÚrdÚtagrr   s     €r   rf   Ú(get_latest_release_tag.<locals>._computeÆ   sO   ø€ Ø×,Ð,Ô*Ó,ˆßceŒl×&Ò&Ò'KÐQSÐ]^Õ_Ðkoˆß69�Ô)Ð*¨!¨C¨5Ð1Ð2ÐC¸tÐCr   Ú_latest_release_cache)rP   )rr   rf   s   f r   Úget_latest_release_tagr£   Á   s   ø€ õ
Dô Ð(¨(Ó3Ð3r   c                ó$   € V ^8„  d   QhR\         /# r   r(   )r   s   "r   r   r   Í   s   € ÷ $kñ $k¤Sñ $kr   c                 óÞ  € ^ RI Hp  ^ RIHp ^ RIHp V! V ! 4       4      pVP                  R4      R8X  d²   R\        4       P                   2pVP                  R4      R8X  d1   T R	\        VP                  R
4      ;'       g    R4      R,           2# VP                  R4      '       d!   V! VR,          4      '       d   RMRpV RV 2# VP                  R4      R8X  d   V R2# V# R\        4       P                   R\         R2p^ RI Hp ^ RIHp V! \        V4      V ! 4       4      pVR8w  dH   \        P                  ! RR.V ! 4       R7      p	V RV 2V	'       d   RV	R,           2,           # R,           # \!        4       p
V
'       g   V# V
R,          V
R,          rË\#        V
P                  R4      ;'       g    ^ 4      pV^ 8:  g   W¼8X  d   V R V 2# V R V RV R!V R"\%        VR
4       R2
# )#z;Return the version label shown in the startup banner title.)Úget_project_root)Úread_install_stamp)Úis_canary_tagÚdistributionzdesktop-appzHermes Agent vÚsourcezcommit-buildu    Â· commit-build Â· ÚcommitÚ :Né   Nr    ÚcanaryÚstableõ    Â· ÚpayloadÚ	bootstrapu    Â· installerz (Ú)©Úload_config)Úresolve_update_channelÚmainrŒ   r”   r�   u
    Â· local r„   r…   r†   u    Â· upstream z (+z	 carried )Úhermes_cli.configr¦   Úhermes_cli.stewardr§   Úhermes_cli.update_channelr¨   ra   rE   Úderived_versionr)   ÚRELEASE_DATErµ   r¶   r%   r   r�   rz   r   Ú_plural)r¦   r§   r¨   ÚstampÚlabelÚchannelÚbaserµ   r¶   ÚheadÚstater„   r…   r†   s                 r   Úformat_banner_version_labelrÄ   Í   së  € å2Ý5Ý7áÑ/Ó1Ó2€EØ‡y�y�Ó  MÔ1Ø Ô!1Ó!3×!CÑ!CÐ DÐEˆØ�9‰9�XÓ .Ô0Ø�WÐ0´°U·Y±Y¸xÓ5H×5NÐ5NÈBÓ1OÐPSÕ1TÐ0UÐVÐVØ�9‰9�U×ÒÙ"/°°eµ×"=Ò"=‘hÀ8ˆGØ�W˜D  	Ð*Ð*Ø�9‰9�YÓ ;Ô.ð �W˜MÐ*Ð*ØˆàÔ,Ó.×>Ñ>Ð?¸rÄ,ÀÈqÐQ€DÝ-Ý@á$¤V¨KÓ%8Ñ:JÓ:LÓM€GØ�&ÔÜ×'Ò'¨°fÐ(=ÑCSÓCUÔVˆØ��t˜G˜9Ð%ÇT¨:°d¸3µi°[Ð)AÕRÐRÈrÕRÐRÜ Ó"€EßØˆØ˜JÕ'¨¨w­ˆeÜ�—	‘	˜'Ó"×'Ð' aÓ(€EØ�„z�XÔ&Ø��} X JÐ/Ð/ØˆV�=  
¨*°U°G¸3¸u¸gÀYÌwÐW\Ð^fÓOgÐNhÐhiÐjÐjr   c                ó>   € V ^8„  d   QhR\         \        ,          RR/# )r   r_   r   N©r   r)   )r   s   "r   r   r   ú   s"   € ÷ Tñ T”(œ3•-ð T¨Dñ Tr   c                ó^   a€ \         P                  ! V3R lV RR7      P                  4        R# )zFStart a daemon thread running ``target`` with any exception swallowed.c                  ó   <€ \        S 4      # r   rB   )Útargets   €r   r0   Ú_daemon.<locals>.<lambda>ü   s	   ø€ ¤F¨6¤Nr   T)rÉ   r_   ÚdaemonN)Ú	threadingÚThreadÚstart)r_   rÉ   s   &fr   Ú_daemonrÏ   ú   s   ø€ ä×ÒÔ2¸ÀdÔK×QÑQÖSr   c                ó$   € V ^8„  d   QhR\         /# r   ©Úbool)r   s   "r   r   r   ÿ   s   € ÷ Jñ J¤4ñ Jr   c                 ó^   € R\         P                  9   ;'       g    R\        P                  9   # )a  True when the banner's background prefetch threads must not start.

Under pytest the prefetch daemon threads shell out to git (``rev-parse``,
``remote get-url``, the banner's git state) at an arbitrary point after
import, and any test that patches the process-wide ``subprocess`` singleton
(``patch("subprocess.run")`` / ``patch("subprocess.Popen")``) can record
that stray spawn in place of the call it meant to pin.  Importing
``tui_gateway.server`` starts this prefetch, which is what flaked
tests/tui_gateway/test_bot_relay_methods.py.
Nothing under pytest needs a live update check; tests that exercise the
prefetch itself monkeypatch this predicate to False.

``PYTEST_CURRENT_TEST`` is only set while a test runs, not during
collection-time imports, hence the ``sys.modules`` check as well.
ÚPYTEST_CURRENT_TESTÚpytest)ÚosÚenvironÚsysÚmodulesr   r   r   Ú_skip_background_prefetchrÚ   ÿ   s$   € ð  !¤B§J¡JÑ.×IÐI°(¼c¿k¹kÑ2IÐIr   c                 óp   € \        4       '       d   \        P                  4        R# R p \        RV 4       R# )up   Kick off update check in a background daemon thread.

No-op under pytest â€” see ``_skip_background_prefetch``.
Nc                  óz   € \         P                  ! R R7      P                  R4      s\        P                  4        R# )T)ÚpassiveÚbehindN)r   Úcheck_for_updatesra   Ú_update_resultÚ_update_check_doneÚsetr   r   r   Ú_runÚ#prefetch_update_check.<locals>._run  s)   € ä%×7Ò7ÀÔE×IÑIÈ(ÓSˆÜ×ÑÖ r   )rÚ   rá   râ   rÏ   )rã   s    r   Úprefetch_update_checkrå     s-   € ô
 !×"Ò"Ü×ÑÔ Ùò!ô ˆD�$Ör   Fc                 óh   € \         '       d   R# \        4       '       d   Rs R# Rs \        RR 4       R# )aa  Warm the banner's subprocess/I/O-heavy inputs in a daemon thread.

Git state (~130ms) and the skills index (~110ms) are cached per-process by their own modules,
so warming them while the main thread pays the CPU-bound imports overlaps GIL-releasing I/O
with import work. Idempotent; failures don't matter because the banner recomputes anything missing.
NTzbanner-data-prefetchc                  ó`   € \         \        \        3 U u. uF  p \        V 4      NK  	  up # u up i r   )rz   r£   rj   r%   )Úwarms    r   r0   Ú&prefetch_banner_data.<locals>.<lambda>7  s;   € ÜÔ4Ô6JñGLó -Mñ GL¸d¬V°D®\ñ GLò -Mùò -Ms   ”+)Ú_banner_data_prefetch_startedrÚ   rÏ   r   r   r   Úprefetch_banner_datarë   %  s9   € ÷ %Ó$ÙÜ ×"Ò"ð
 )-Ð%ÙØ$(Ð!ÜÐ"ñ %Mö Nr   c                óF   € V ^8„  d   QhR\         R\        \        ,          /# )r   rœ   r   )Úfloatr   r   )r   s   "r   r   r   ;  s   € ÷ ñ œuð ¬x¼­}ñ r   c                ó:   € \         P                  V R7       \        # )z:Get result of prefetched check. Returns None if not ready.©rœ   )rá   Úwaitrà   rï   s   &r   Úget_update_resultrñ   ;  s   € ä×Ñ GÐÔ,ÜÐr   c                ó0   € V ^8„  d   QhR\         R\        /# )r   rÞ   r   ©r   r)   )r   s   "r   r   r   A  s   € ÷ ;ñ ;¤#ð ;¬#ñ ;r   c                óŽ   € ^ RI HpHp V ^ 8”  d   RV  R\        V R4       RV! 4        R2# V! 4       pV'       d   RV R2MR	pR
V 2# )z@Render the update warning line for a non-zero ``behind`` result.)Úget_managed_update_commandÚrecommended_update_commandu   [bold yellow]âš  Ú r«   u%    behind[/][dim yellow] â€” run [bold]z[/bold] to update[/]u   [dim yellow] â€” run [bold]z
[/bold][/]r¬   u$   [bold yellow]âš  update available[/])r¸   rõ   rö   r½   )rÞ   rõ   rö   Úmanaged_cmdÚsuffixs   &    r   Ú_format_update_noticerú   A  sj   € çXØ�„zà ˜x q¬°¸Ó)BÐ(Cð D*Ù*DÓ*FÐ)GÐG[ð]ð	^ñ
 -Ó.€KßFQÐ*¨;¨-°zÑBÐWY€FØ1°&°Ð:Ð:r   c                ó0   € V ^8„  d   QhR\         R\         /# )r   Úmarkupr   r(   )r   s   "r   r   r   R  s   € ÷ 
'ñ 
'¤3ð 
'¬3ñ 
'r   c                óœ   € ^ RI Hp ^ RIHp V! 4       pV! VRRRR7      P	                  V 4       VP                  4       P                  R4      # )u  Rich markup â†’ ANSI string, for output that must go through prompt_toolkit's renderer.

Under ``patch_stdout`` (the interactive CLI), a plain ``Console.print`` writes ESC bytes into
the StdoutProxy, which sanitizes them into visible ``?[1;33mâ€¦`` artifacts (#83969).
)ÚStringIOr   TÚ	truecolorF)ÚfileÚforce_terminalÚcolor_systemÚ	highlightÚ
)Úiorþ   Úrich.consoler   r4   ÚgetvalueÚrstrip)rü   rþ   Ú_ConsoleÚbufs   &   r   Ú_render_markup_to_ansir  R  sC   € õ Ý0Ù
‹*€CÙ�# d¸ÐPUÔV×\Ñ\Ð]cÔdØ�<‰<‹>× Ñ  Ó&Ð&r   c                ó(   € V ^8„  d   QhR\         RR/# )r   Úmax_waitr   N)rí   )r   s   "r   r   r   _  s   € ÷ .ñ .¤5ð .°Dñ .r   c                óR   a € \         '       d   R# Rs R V 3R llp\        RV4       R# )ap  Print the update warning once the prefetched check completes (at most once per process).

Used when the banner rendered before the update prefetch finished so startup never blocks on
git/network. The notice lands after prompt_toolkit owns the terminal, so it is routed through
``cprint`` (prompt_toolkit's renderer prints above a running application from any thread).
NTc                ó   € V ^8„  d   QhRR/# )r   r   Nr   )r   s   "r   r   Ú*_defer_update_notice.<locals>.__annotate__k  s   € ÷ Rñ R˜Tñ Rr   c                  ó¢   <€ \         P                  S R 7      '       d2   \        '       d$   \        \	        \        \        4      4      4       R# R# R# )rï   N)rá   rð   rà   r5   r  rú   )r  s   €r   Ú_wait_and_printÚ-_defer_update_notice.<locals>._wait_and_printk  s8   ø€ Ü×"Ñ"¨8Ð"×4Ò4¿»ÜÔ)Ô*?ÄÓ*OÓPÖQñ :HÑ4r   zupdate-notice)Ú_deferred_update_notice_startedrÏ   )r  r  s   f r   Ú_defer_update_noticer  _  s,   ø€ ÷ 'Ó&ÙØ&*Ð#÷Rð Rô ˆO˜_Ö-r   c                ó<   € V ^8„  d   QhR\         R\        R\        /# )r   ÚnÚwordr   ró   )r   s   "r   r   r   s  s!   € ÷ *ñ *Œsð *œ#ð *¤#ñ *r   c                 ó   € V ^8X  d   V# V R2# )é   Úsr   )r  r  s   &&r   r½   r½   s  s   € Ø˜”6ˆ4Ð) $  q˜zÐ)r   c                ó0   € V ^8„  d   QhR\         R\        /# )r   Útokensr   ró   )r   s   "r   r   r   w  s   € ÷ ñ ¤3ð ¬3ñ r   c                ó®   € R FE  w  rW8¼  g   K  W,          p\        V4      p\        W4,
          4      R8  d	   V V 2u # VR V 2u # 	  \        V 4      # )uL   Format a token count for display (e.g. 128000 â†’ '128K', 1048576 â†’ '1M').çš™™™™™©?z.1f))ÚMi@B )ÚKiè  )ÚroundÚabsr)   )r  ÚunitÚdivÚvalÚroundeds   &    r   Ú_format_context_lengthr(  w  s^   € ã5‰	ˆØŽ=Ø•,ˆCÜ˜C“jˆGÜ),¨S­]Ó);¸dÔ)B�g�Y˜t˜fÐ%ÒZÈ3ÈsÈ)ÐTXÐSYÐHZÒZñ	 6ô
 ˆv‹;Ðr   c                ó0   € V ^8„  d   QhR\         R\         /# )r   Útoolset_namer   r(   )r   s   "r   r   r   �  s   € ÷ Nñ N¬ð N´ñ Nr   c                ó8   € V '       d   V P                  R4      # R# )zANormalize internal/legacy toolset identifiers for banner display.Ú_toolsÚunknown)Úremovesuffix)r*  s   &r   Ú_display_toolset_namer/  �  s   € ç2>ˆ<×$Ñ$ XÓ.ÐMÀIÐMr   c                ó0   € V ^8„  d   QhR\         R\         /# ©r   r_   r   r(   )r   s   "r   r   r   †  s   € ÷ 9ñ 9”sð 9œsñ 9r   c                óF   € \        V 4      ^8”  d   V R,          R,           # T # )z=Truncate a model/preset slug to fit the banner's left column.:Né   Nz...©Úlen)r_   s   &r   Ú_short_labelr6  †  s    € ä # D£	¨B¤ˆ4��9�uÕÐ8°DÐ8r   c                ó$   € V ^8„  d   QhR\         /# r   r   )r   s   "r   r   r   •  s   € ÷ @ñ @œtñ @r   c                  ó2   € \        4       R ,          R,          # )Úcachezbanner_snapshot.jsonr   r   r   r   Ú_banner_snapshot_pathr:  •  s   € ÜÓ˜wÕ&Ð)?Õ?Ð?r   c                ó:   € V ^8„  d   QhR\         \        ,          /# r   rÆ   )r   s   "r   r   r   ™  s   € ÷ Gñ G¤X¬c¥]ñ Gr   c                 ó‚  € ^ RI p R p\        V4      pVf   R# R\         2.pV Ff  p\        VP                  4      pTP	                  V'       d)   VP
                   RVP                   RVP                   2MVP
                   R24       Kh  	  \        4       pTP	                  VP                  ;'       g    VP                  4       \        4       pV'       d+   VP	                  \        VP                  RR4      4      4       V P                  RP                  V4      P!                  R	4      4      P#                  4       # )
z8Fingerprint the inputs the banner tool panel depends on.Nc                  ó>   € ^ RI Hp  V ! 4       \        4       R,          3# )rV   ©Úget_config_pathz.env)r¸   r?  r   r>  s    r   Ú_inputsÚ,banner_snapshot_fingerprint.<locals>._inputsœ  s   € Ý5ÙÓ!¤?Ó#4°vÕ#=Ð>Ð>r   ÚvÚ:z:absentr…   r¬   Ú|zutf-8)Úhashlibr%   Ú_BANNER_SNAPSHOT_VERSIONÚstatrb   r_   Úst_mtime_nsÚst_sizerE   r«   r»   rz   r)   ra   Úsha256ÚjoinÚencodeÚ	hexdigest)rE  r@  ÚpathsÚpartsÚpÚstÚversion_inforÃ   s           r   Úbanner_snapshot_fingerprintrS  ™  sû   € ãò?ô �7‹O€EØ‚}ÙØÔ)Ð*Ð+Ð,€EÛˆÜ�A—F‘F‹^ˆØ�‰Ç"˜Ÿ™�x˜q §¡Ð 0°°"·*±*°Ñ>ÈQÏVÉVÈHÐT[ÐJ\Ö]ñ ô $Ó%€LØ	‡L�L�×$Ñ$×DÐD¨×(DÑ(DÔEÜ Ó"€EßØ�‰”S˜Ÿ™ 7¨BÓ/Ó0Ô1Ø�>‰>˜#Ÿ(™( 5›/×0Ñ0°Ó9Ó:×DÑDÓFÐFr   c                óŒ   € V ^8„  d   QhR\         \        ,          R,          R\        \        \        \        3,          ,          /# ©r   Úenabled_toolsetsNr   )rS   r)   r   rR   r	   )r   s   "r   r   r   ¯  s5   € ÷ ñ ¬4´­9°tÕ+;ð ÄxÔPTÔUXÔZ]ÐU]ÕP^ÕG_ñ r   c                óÀ  a€ \        R 4      o\        S\        4      '       g   R# \        4       pV'       d¥   SP	                  R4      V8w  g�   SP	                  R4      \        T ;'       g    . 4      8w  gf   \        SP	                  R4      \        4      '       dA   \        ;QJ d    V3R lR	 4       F  '       d   K   RM	  RM! V3R lR	 4       4      '       g   R# S# )
zBReturn the stored banner snapshot when its fingerprint is current.c                  ó^   € \         P                  ! \        4       P                  R R7      4      # )z	utf-8-sig)Úencoding)ÚjsonÚloadsr:  Ú	read_textr   r   r   r0   Ú&load_banner_snapshot.<locals>.<lambda>±  s    € œ$Ÿ*š*Ô%:Ó%<×%FÑ%FÐP[Ð%FÓ%\Ô]r   NÚfingerprintrV  Útoolsc              3   ób   <"  € T F$  p\        SP                  V4      \        4      x € K&  	  R # 5ir   )Ú
isinstancera   rR   )r�   ÚkÚblobs   & €r   r’   Ú'load_banner_snapshot.<locals>.<genexpr>¸  s+   øé € ð WÙ U˜1ô " $§(¡(¨1£+¬t×4Ð4Û Uùs   ƒ,/FT)Útoolset_mapÚavailabilityrd   )r%   ra  rR   rS  ra   ÚsortedrS   Úall)rV  Úfprc  s   & @r   Úload_banner_snapshotrj  ¯  s¬   ø€ äÑ]Ó^€DÜ�dœD×!Ò!ÙÜ	$Ó	&€Bß�$—(‘(˜=Ó)¨RÔ/Ø�x‰xÐ*Ó+¬vÐ6F×6LÐ6LÈ"Ó/MÔMÜ˜dŸh™h wÓ/´×6Ò6ß“3ô WÙ UóW—3—3’3ô WÙ UóW÷ Wò WáØ€Kr   c          
      ó¼   € V ^8„  d   QhR\         \        ,          R\         \        ,          R\        \        \        3,          R\        \        \        3,          RR/# )r   r_  rV  rf  re  r   N)rS   rR   r)   r	   )r   s   "r   r   r   ¾  sN   € ÷ ñ ¤¤T¥
ð ¼dÄ3½ið ÔW[Ô\_ÔadÐ\dÕWeð Ü&*¬3´¨8¥nðØ9=ñr   c                óø  a€ \        4       pV'       g   R# RTR\        T;'       g    . 4      RV  Uu. uFX  p\        V\        4      '       g   K  VP	                  R/ 4      P	                  R4      '       g   KD  RRVR,          R,          //NKZ  	  upRTRR	VP	                  R	. 4      /R Uu/ uF  qf\        VP	                  V. 4      4      bK   	  upCR
\        4       /oV3R lp\        V4       R# u upi u upi )zCPersist the banner tool panel inputs for next launch (best-effort).Nr^  rV  r_  Úfunctionr_   re  rf  Úunavailable_toolsetsrd   c                  ó<   <€ ^ RI Hp  V ! \        4       SRRR7       R# )rV   )Úatomic_json_writeNi€  )ÚindentÚmode)Úutilsrp  r:  )rp  r±   s    €r   Ú_writeÚ$save_banner_snapshot.<locals>._writeÐ  s   ø€ Ý+ÙÔ/Ó1°7À4Èe×Tr   )Ú
lazy_toolsÚdisabled_tools)rS  rg  ra  rR   ra   rS   rj   r%   )	r_  rV  rf  re  ri  Útrb  rt  r±   s	   &&&&    @r   Úsave_banner_snapshotry  ¾  s  ø€ ô 
%Ó	&€BßÙà�rØœFÐ#3×#9Ð#9°rÓ:ØÙ ó_Ù �a¤J¨q´$×$7ô @Ø<=¿E¹EÀ*ÈbÓ<Q×<UÑ<UÐV\×<]ô @�: ¨¨*­°fÕ(=Ð>Ó?Ù ñ_à�{ØØ" L×$4Ñ$4Ð5KÈRÓ$Pð\á9YÓZÑ9Y°A”$�|×'Ñ'¨¨2Ó.Ó/Ò/Ñ9YÑZð\ð 	Ô2Ó4ð
€GõUô ˆ6†Nùò_ùò
 [s   ²C2Á$C2Á8C2Â,$C7c                óv   € V ^8„  d   QhR\         \        ,          R,          R\        \        \        3,          /# rU  )rS   r)   rR   r	   )r   s   "r   r   r   Ö  s.   € ÷ 6ñ 6´4¼µ9¸tÕ3Cð 6ÌtÔTWÔY\ÐT\Í~ñ 6r   c                óB  € ^ RI HpHp T ;'       g    . p V! RR7      w  r4V  Uu0 uF  p\        V4      kK  	  ppV'       dD   V Uu. uF7  p\        VP	                  RVP	                  RR4      4      4      V9   g   K5  VNK9  	  pp\        4       \        4       r˜V F_  pVP	                  VP	                  RR4      / 4      P	                  R4      p
V
'       d   TMT	P                  VP	                  R. 4      4       Ka  	  R	VR
\        V4      R\        V	4      /# u upi u upi )z±Compute ``{"unavailable_toolsets", "lazy_tools", "disabled_tools"}`` for the banner.

Split out so the result can be snapshotted and replayed without importing ``model_tools``.
)Úcheck_tool_availabilityÚTOOLSET_REQUIREMENTST)ÚquietÚidr_   r¬   Úcheck_fnr_  rn  rv  rw  )Úmodel_toolsr|  r}  r)   ra   râ   Úupdaterg  )rV  r|  r}  Ú_rn  rx  Ú_enabled_tsÚitemrv  rw  Úis_lazys   &          r   Úcompute_toolset_availabilityr‡  Ö  s  € ÷
 JØ'×-Ð-¨2ÐÙ5¸DÔAÑ€Añ
 $4Ó4Ñ#3˜a”3�q–6Ñ#3€KÐ4ßá1ó oÙ1�T´S¸¿¹À$ÈÏÉÐQWÐY[ÓH\Ó9]Ó5^ÐbmÑ5m�DˆDÑ1ð 	ð  oô "%£¬«�Û$ˆØ&×*Ñ*¨4¯8©8°F¸BÓ+?ÀÓD×HÑHÈÓTˆß‰ N×:Ñ:¸4¿8¹8ÀGÈRÓ;PÖQñ %ð #Ð$8¸,ÌÈzÓHZØœf ^Ó4ð6ð 6ùò 5ùò os   ¤DÁ2DÁ=Dc                óH   € V ^8„  d   QhR\         R\        R\        R\        /# )r   ÚsrvÚdimr'   r   )rR   r)   )r   s   "r   r   r   ð  s(   € ÷ ?ñ ?œ$ð ?¬ð ?´3ð ?¼3ñ ?r   c               óÜ  € V R,          V R,          rCV R,          '       d    RV RV RV RV RV R	V RV R
,           R2# V P                  R4      R8X  d#   RV RV RV RV RV R	V RV R
,           RV R2# V P                  R4      '       d   RMV P                  R4      pRRV R2RRRRV R2/P                  V4      pVe   RV RV RV RV 2# \        W4V P                  R4      4      # )z/One banner line for an MCP server status entry.r_   Ú	transportÚ	connectedú[dim Ú]z[/] [z](z
)[/] [dim u	   ]â€”[/] [r_  z tool(s)[/]ÚstatusÚlazyz tool(s)[/] [dim z](lazy, starts on first use)[/]Údisabledu   ]â€” disabled[/]Ú
connectingu   [yellow]â€” connecting[/]Ú
configuredu   ]â€” configured[/]ú
[/] [dim](z)[/] Úerror)ra   Ú_mcp_failed_line)r‰  rŠ  r'   r_   rŒ  r�  rù   s   &$$    r   Ú_mcp_server_liner˜  ð  sH  € à˜&•k 3 {Õ#3ˆ)Ø
ˆ;×ÔØ�s�e˜1˜T˜F %¨ v¨R°	¨{¸*ÀSÀEÈÐSWÐRXÐXYÐZ]Ð^eÕZfÐYgÐgrÐsÐsð ‡w�wˆxÓ˜FÔ"Ø˜�u˜A˜d˜V 5¨¨¨b°°¸:ÀcÀUð KØ�6˜˜3˜w�<˜.Ð(9¸#¸Ð>]ð_ð 	`àŸ7™7 :×.Ò.‰Z°C·G±G¸HÓ4E€FØ˜E # Ð&6Ð7¸ÐGbØ˜e C 5Ð(:Ð;ð=ß=@¹SÀ»[ð àÒØ�s�e˜1˜T˜F *¨Y¨K°u¸V¸HÐEÐEÜ˜D¨S¯W©W°WÓ-=Ó>Ð>r   c                ó^   € V ^8„  d   QhR\         R\         R\        \         ,          R\         /# )r   r_   rŒ  r–  r   )r)   r   )r   s   "r   r   r     s,   € ÷ -ñ -œ3ð -¬3ð -´xÄµ}ð -Ìñ -r   c           	     ó*  € ^ RI Hp T! RP                  \        T;'       g    R4      P	                  4       4      R,          4      ;'       g    Rp\
        P                  ! RV\
        P                  4      '       d   RV  2MRV  2pR	V  R
V RV RV R2	# )z—Failed MCP connect: the short reason (already humanised by ``_format_connect_error``) and the
exact next command, so 'failed' is never the whole story.)Úescaper÷   r¬   :Néx   Nzno details recordedz\b401\b|unauthori[sz]edzhermes mcp login zhermes mcp test z[red]r•  u$   )[/] [red]â€” could not connect:[/] u    [dim]â€” run `z`[/])Úrich.markupr›  rK  r)   ÚsplitÚreÚsearchÚ
IGNORECASE)r_   rŒ  r–  r›  ÚreasonÚnext_cmds   &&&   r   r—  r—    sž   € õ #Ù�C—H‘HœS § ¨"Ó-×3Ñ3Ó5Ó6°tÕ<Ó=×VÐVÐAV€FÜ.0¯iªiÐ8RÐTZÔ\^×\iÑ\i×.jÒ.jÐ# D 6Ñ*Ø'¨ vÐ.ð à�D�6˜ I ;Ð.RÐSYÐRZð [Ø%˜J dð,ð -r   c                ór   € V ^8„  d   QhR\         \        ,          R\         \        \        ,          ,          /# )r   Ú
tool_namesr   )rS   r)   r   )r   s   "r   r   r     s'   € ÷ ñ ¤T¬#¥Yð ´4¼Ä½Õ3Fñ r   c                ó,  € \        RP                  V 4      4      ^-8:  d   \        V 4      # . p^ pV  F_  pV\        V4      ,           ^,           ^*8”  d   VP                  R4        V# VP                  V4       V\        V4      ^,           ,          pKa  	  V# )zICut a toolset's tool list to ~42 columns; ``None`` marks the elided tail.ú, N)r5  rK  rS   rb   )r¥  Úshort_namesÚlengthr_   s   &   r   Ú_truncate_tool_namesrª    s�   € ä
ˆ4�9‰9�ZÓ Ó! RÔ'Ü�JÓÐØ')€KØ€FÛˆØ”C˜“IÕ Õ! BÔ&Ø×Ñ˜tÔ$Øð Ðð 	×Ñ˜4Ô Ø”#�d“)˜a•-ÕŠñ ð Ðr   c                óR   € V ^8„  d   QhR\         \        ,          R\        R\        /# )r   Úskill_namesÚavailr   )rS   r)   r   )r   s   "r   r   r     s%   € ÷ ñ ¤4¬¥9ð ´Sð ¼Sñ r   c                ó¸  € . p^ p\        V 4       F·  w  rEV'       d   ^M^ \        V4      ,           p\        V 4      V^,           ,
          pV^ 8”  d   \        RV R24      M^ pV'       dE   W6,           V,           V8”  d1   VP                  R\        V 4      \        V4      ,
           R24        MVP                  V4       W6,          pK¹  	  RP                  V4      # )zYJoin skill names into ``avail`` columns, ending with ``+N more`` when they don't all fit.z, +z moreÚ+r§  )Ú	enumerater5  rb   rK  )	r¬  r­  rO  r©  Úir_   ÚneededÚafterÚind_lens	   &&       r   Ú_pack_skill_namesrµ    sº   € à€EØ€FÜ˜[Ö)‰ˆß‘! !¤s¨4£yÕ0ˆÜ�KÓ  A¨¥EÕ*ˆØ-2°Q¬Y”#˜˜E˜7 %Ð(Ô)¸Aˆß�V•_ wÕ.°Ô6Ø�L‰L˜1œS Ó-´°E³
Õ:Ð;¸5ÐAÔBÙØ�‰�TÔØÕŠñ *ð �9‰9�UÓÐr   c                ó0   € V ^8„  d   QhR\         R\         /# )r   Úpreset_namer   r(   )r   s   "r   r   r   ,  s   € ÷  ñ  ¤sð  ¬sñ  r   c                ób  € ^ RI Hp ^ RIHp T! V! 4       P	                  R4      ;'       g    / 4      P	                  R/ 4      P	                  V 4      p\        T;'       g    / P	                  R4      ;'       g    / P	                  R4      ;'       g    R4      pVP                  R4      R	,          # )
zLShort aggregator-model label for a MoA preset ("" when the preset has none).r´   )Únormalize_moa_configÚmoaÚpresetsÚ
aggregatorÚmodelr¬   r�   éÿÿÿÿ)r¸   rµ   Úhermes_cli.moa_configr¹  ra   r)   rž  )r·  rµ   r¹  Úpresetr½  s   &    r   Ú_moa_aggregator_labelrÁ  ,  s‹   € å-Ý:Ù!¡+£-×"3Ñ"3°EÓ":×"@Ð"@¸bÓA×EÑEÀiÐQSÓT×XÑXÐYdÓe€FÜ�&—,�,˜B×#Ñ# LÓ1×7Ð7°R×<Ñ<¸WÓE×KÐKÈÓL€EØ�;‰;�sÓ˜BÕÐr   c                ó$   € V ^8„  d   QhR\         /# r   rÑ   )r   s   "r   r   r   5  s   € ÷ <ñ <œñ <r   c                 óN   € R p R p\        V R4      ;'       g    \        VR4      # )aL  Cheap probe: does config.yaml or the persisted plugin key cache name any MCP server?

The full ``get_mcp_status()`` path resolves portable plugin MCP servers, which JOINS the in-flight
background plugin discovery (~100ms on the startup path), so skip it when nothing is configured.
When either probe can't tell, take the full path.
c                  ó`   € ^ RI Hp  \        V ! 4       ;'       g    / P                  R4      4      # )rV   r´   Úmcp_servers)r¸   rµ   rÒ   ra   r´   s    r   Ú_nativeÚ _mcp_configured.<locals>._native<  s%   € Ý1Ü‘[“]×(Ð( b×-Ñ-¨mÓ<Ó=Ð=r   c                  ó.   € ^ RI Hp  \        V ! 4       4      # )rV   ©Ú$get_portable_mcp_server_names_nowait)Úhermes_cli.pluginsrÊ  rÒ   rÉ  s    r   Ú	_portableÚ"_mcp_configured.<locals>._portable@  s   € ÝKÜÑ8Ó:Ó;Ð;r   TrB   )rÆ  rÌ  s     r   Ú_mcp_configuredrÎ  5  s*   € ò>ò<ô �'˜4Ó ×;Ð;¤F¨9°dÓ$;Ð;r   c                ó$   € V ^8„  d   QhR\         /# r   )rS   )r   s   "r   r   r   F  s   € ÷ ñ œ4ñ r   c                  ó   € ^ RI Hp  V ! 4       # )rV   ©Úget_mcp_status)Útools.mcp_tool_discoveryrÒ  rÑ  s    r   Ú_probe_mcp_statusrÔ  F  s   € Ý7ÙÓÐr   c                ó$   € V ^8„  d   QhR\         /# r   rÑ   )r   s   "r   r   r   K  s   € ÷ Dñ Dœtñ Dr   c                 ó:   € ^ RI Hp  ^ RIHp V ! V! 4       4      R8H  # )zVTrue when the codex_app_server runtime is active (tool counts then live inside codex).)Úget_current_runtimer´   Úcodex_app_server)Úhermes_cli.codex_runtime_switchr×  r¸   rµ   )r×  rµ   s     r   Ú_codex_runtime_activerÚ  K  s   € åCÝ-Ù™{›}Ó-Ð1CÑCÐCr   c                ó:   € V ^8„  d   QhR\         \        ,          /# r   rÆ   )r   s   "r   r   r   R  s   € ÷ %ñ %œh¤s�mñ %r   c                  ó   € ^ RI Hp  V ! 4       # )rV   ©Úget_active_profile_name)Úhermes_cli.profilesrÞ  rÝ  s    r   Ú_active_profile_namerà  R  s   € Ý;Ù"Ó$Ð$r   Úcontext_pinnedc                ó`   € V ^8„  d   QhR\         R\         R\         R\         R\        R\        /# )r   r½  rŽ   ÚaccentrŠ  rá  r   )r)   rÒ   rS   )r   s   "r   r   r   W  s:   € ÷ ñ œcð ¬ð Ô^að Ôhkð Ü'+ðÜ8<ñr   c          
     óÀ  a a€ R V3R llp. p	V'       d   RMRp
V'       d   V! \        V4       RV
 24      MRpV! R4      pT;'       g    RP                  4       P                  4       R8X  dN   \        V 3R lR4      pV'       d   V! R	V 24      MRpV	P	                  R
V R\        S 4       RV V V 24       M¯S ;'       g    RP                  4       '       d.   S ;'       g    RP                  4       P                  4       R8X  d   V	P	                  RS R24       MLS P                  R4      R,          P                  R4      pV	P	                  R
V R\        V4       RV V 24       \        P                  ! R4      '       d   V	P	                  RS R24       V	P	                  RS RV R24       V'       d#   V	P	                  R\        RR4       RV R24       V	# )z¦Model / cwd / session lines under the hero art. ``context_pinned`` marks a
``model.context_length`` pin so the user can tell it apart from provider metadata (#66168).c                ó0   € V ^8„  d   QhR\         R\         /# )r   r¿   r   r(   )r   s   "r   r   Ú(_banner_left_lines.<locals>.__annotate__[  s   € ÷ :ñ :œð :¤ñ :r   c                 ó   <€ R S RS RV  R2# )z [dim u   ]Â·[/] [dim r�  ú[/]r   )r¿   rŠ  s   &€r   Ú_dim_sepÚ$_banner_left_lines.<locals>._dim_sep[  s   ø€ Ø˜�u˜L¨¨¨Q¨u¨g°SÐ9Ð9r   z	 (pinned)r¬   z contextzNous Researchrº  c                  ó   <€ \        S 4      # r   )rÁ  )r½  s   €r   r0   Ú$_banner_left_lines.<locals>.<lambda>c  s   ø€ Ô#8¸Ô#?r   zagg Ú[z]MoA: rè  r-  z&[bold red]no model configured[/] [dim u"   ]â€” run /model or hermes setup[/]r�   z.ggufr�  ÚHERMES_YOLO_MODEu    [bold red]âš  YOLO mode[/] [dim u%   ]â€” all approval prompts bypassed[/]rŽ  Úsession_borderz#8B8682z
]Session: r¾  )r(  ÚstripÚlowerr%   rb   r6  rž  r.  rÖ   ÚgetenvrC   )r½  rŽ   Ú
session_idÚcontext_lengthÚproviderrã  rŠ  rá  ré  ÚlinesÚpinÚctx_strÚnous_strÚ	agg_labelÚagg_strÚmodel_shorts   f&&&&$d$        r   Ú_banner_left_linesrý  W  sº  ù€ ÷:ð :à€Eß'‰+¨R€CßTb‰hÔ0°Ó@ÐAÀÈ#ÈÐOÔPÐhj€GÙ˜Ó(€HØ�ˆ�B×ÑÓ×%Ñ%Ó'¨5Ô0äÔ?ÀÓDˆ	ß2;‘(˜T ) Ð-Ô.ÀˆØ�‰�q˜˜ ¤|°EÓ':Ð&;¸3¸w¸iÈÀyÐQYÐPZÐ[Õ\Ø�kˆk�r× Ñ ×"Ò" u§{ {°×&9Ñ&9Ó&;×&AÑ&AÓ&CÀyÔ&Pà�‰Ð=¸c¸UÐBdÐeÕfà—k‘k #Ó& rÕ*×7Ñ7¸Ó@ˆØ�‰�q˜˜ ¤,¨{Ó";Ð!<¸CÀ¸yÈÈ
ÐSÔTÜ	‡y‚yÐ#×$Ò$Ø�‰Ð7¸°uÐ<aÐbÔcØ	‡L�L�5˜˜˜Q˜s˜e 3Ð'Ô(ßØ�‰�uœ[Ð)9¸9ÓEÐFÀjÐQ[ÐP\Ð\_Ð`ÔaØ€Lr   c                óx   € V ^8„  d   QhR\         R\         R\        R\        R\        R\        R\        R\         /# )	r   r_  rn  rv  rw  rã  rŠ  r'   r   )rS   râ   r)   )r   s   "r   r   r   t  sL   € ÷ ñ ÜðÜ'+ðäðä%(ðä25ðä<?ðäGJðäOSñr   c               ó(  aaaa€ RV R2.p/ p	V  FO  p
V
R,          R,          p\        V! V4      ;'       g    R4      pV	P                  V. 4      P                  V4       KQ  	  V Fp  pV	P                  \        VP                  RVP                  RR4      4      4      . 4      pVP                  R. 4       F  pW¾9  g   K  VP                  V4       K  	  Kr  	  R	 VVV3R
 llo\	        V	P                  4       4      pVR,           FP  p\        \	        Wœ,          4      4      pVP                  RV RV RRP                  V3R lV 4       4       24       KR  	  \        V4      ^8”  d)   VP                  RV R\        V4      ^,
           R24       V# )zK"Available Tools" section: up to 8 toolsets, each truncated to ~42 columns.ú[bold z]Available Tools[/]rm  r_   Úotherr  r-  r_  c                óF   € V ^8„  d   QhR\         \        ,          R\        /# r1  rÆ   )r   s   "r   r   Ú(_banner_tool_lines.<locals>.__annotate__„  s   € ÷ %ñ %œ(¤3�-ð %¬Cñ %r   c                 óJ   <€ V f   R# V S9   d   RM
V S9   d   RMSpRV RV  R2# )Nz[dim]...[/]ÚredÚyellowrí  r�  rè  r   )r_   Úcolorrw  rv  r'   s   & €€€r   Ú_color_toolÚ'_banner_tool_lines.<locals>._color_tool„  s8   ø€ ØŠ<Ù Ø Ô/‘ÀÈÔAS±XÐY]ˆØ�5�'˜˜4˜& Ð$Ð$r   :Né   NrŽ  r�  z:[/] r§  c              3   ó4   <"  € T F  pS! V4      x € K  	  R # 5ir   r   )r�   r  r  s   & €r   r’   Ú%_banner_tool_lines.<locals>.<genexpr>Œ  s   øé € Ð:^ÑS]Èa¹;Àq¿>¸>ÓS]ùs   ƒz](and z more toolsets...)[/])	r/  r`   rb   ra   rg  Úkeysrª  rK  r5  )r_  rn  Úget_toolset_for_toolrv  rw  rã  rŠ  r'   rö  Útoolsets_dictÚtoolÚ	tool_nameÚtoolsetr…  ÚnamesÚsorted_toolsetsr¥  r  s   &&&dd$$d         @r   Ú_banner_tool_linesr  t  sz  û€ ð �f�XÐ0Ð1Ð2€EØ%'€MÛˆØ˜Õ$ VÕ,ˆ	Ü'Ñ(<¸YÓ(G×(RÐ(RÈ7ÓSˆØ× Ñ  ¨"Ó-×4Ñ4°YÖ?ñ ó %ˆØ×(Ñ(Ô)>¸t¿x¹xÈÈdÏhÉhÐW]Ð_hÓNiÓ?jÓ)kÐmoÓpˆØŸ™ '¨2Ö.ˆIØÖ%Ø—‘˜YÖ'ó /ñ %÷%ò %ô
 ˜]×/Ñ/Ó1Ó2€OØ" 2×&Ð&ˆÜ)¬&°Õ1GÓ*HÓIˆ
Ø�‰�u˜S˜E  7 )¨5°·±Ô:^ÑS]Ó:^Ó1^Ð0_Ð`Öañ 'ô ˆ?Ó˜aÔØ�‰�u˜S˜E ¬¨OÓ(<¸qÕ(@Ð'AÐAVÐWÔXØ€Lr   c          
      óŒ   € V ^8„  d   QhR\         \        \        \        ,          3,          R\        R\        R\        R\        /# )r   rd   Úskills_enabledrŠ  r'   r   )rR   r)   rS   rÒ   )r   s   "r   r   r   ’  s@   € ÷ ñ ¬D´´d¼3µi°Õ,@ð ÔRVð Ô`cð Ôknð Ôswñ r   c               óº  € V'       g   RV R2.# V '       g   RV R2.# \        \        \        P                  ! 4       P                  R,          4      ^
,
          ^4      p. p\        V P                  4       4       F]  p\        \        W,          4      \        V\        V4      ,
          ^,
          ^4      4      pVP                  RV RV RV RV R2	4       K_  	  V# )zU"Available Skills" body, sized to ~60% of the terminal width (the right grid column).rŽ  z]Skills toolset disabled[/]z]No skills installed[/]g333333ã?r�  z:[/] [rè  )
r–   r   ÚshutilÚget_terminal_sizeÚcolumnsrg  r  rµ  r5  rb   )rd   r  rŠ  r'   Úright_col_widthrö  r]   Ú
skills_strs   &&$$    r   Ú_banner_skill_linesr  ’  sÔ   € çØ˜�uÐ7Ð8Ð9Ð9ßØ˜�uÐ3Ð4Ð5Ð5Üœ#œf×6Ò6Ó8×@Ñ@À3ÕFÓGÈ"ÕLÈbÓQ€OØ€EÜÐ-×2Ñ2Ó4Ö5ˆä&¤vÐ.@Õ.JÓ'KÌSÐQ`ÔcfÐgoÓcpÕQpÐstÕQtÐvxÓMyÓzˆ
Ø�‰�u˜S˜E  8 *¨F°4°&¸¸*¸ÀSÐIÖJñ 6ð €Lr   c                ó|  € V ^8„  d   QhRRR\         R\         R\        \        ,          R,          R\        \         ,          R,          R\         R,          R	\        R,          R
\         R,          R\        \         \        3,          R,          R\        \         \        \         ,          3,          R,          R\
        /# )r   Úconsoler   r½  rŽ   r_  NrV  ró  rô  rõ  rf  rd   rá  )r)   rS   rR   r   r	   rÒ   )r   s   "r   r   r   ¡  s¾   € ÷ [ñ [Øð[Ü"ð[Ü),ð[Ü59¼$µZÀ$Õ5Fð[ÜaeÔfiÕajÐmqÕaqð[ä�d•
ð[äNQÐTXÍjð[äknÐquÕkuð[ô ”sœC�x•. 4Õ'ð[ô EIÌÌdÔSVÍiÈÕDXÐ[_ÕD_ð[ô ñ	[r   c                óJ  aaa € ^ RI Hp ^ RIHp Vf   ^ RIHp T;'       g    . pT;'       g    . pV	f   \        V4      p	V Uu0 uF  p\        V4      kK  	  pp\        RR4      p\        RR4      o\        R	R
4      o \        \        4      pR\        VRR4      ;'       g    \        R.pV\        WWWVVSVR7      ,          p\        W9P                  R. 4      V\!        V	P                  R. 4      4      \!        V	P                  R. 4      4      VSS R7      o\#        4       '       d   \        \$        . 4      M. pV'       d,   SRRV R2.,          oSP'                  VV 3R lV 4       4       SRRV R2.,          oV'       * ;'       g    RV9   pV'       g   / p
MV
f   \)        4       p
\+        R V
P-                  4        4       4      pS\/        V
VSS R7      ,          oSP1                  R4       \+        R V 4       4      p\3        V4       R2V R2.pV'       d   VP1                  V R24       VP1                  R4       \        \4        R4      '       d   SP1                  RV RS  R S R!24       \        \6        4      pV'       d#   VR"8w  d   SP1                  RV R#S  R$V R%24       SP1                  R&S R$R'P9                  V4       R%24       V3R( lp\        V4       VP;                  R6R)7      pVP=                  R*R*R+7       VP=                  R,R*R+7       VP?                  R-P9                  V4      R-P9                  S4      4       \A        4       p\C        4       pV'       d   R.V^,           R$V R/2pV! VR\        R0R14       R$V R%2\        R2R34      R6R47      pV PE                  4        \F        PH                  ! 4       PJ                  ^_8¼  d;   T PE                  \        VR5R4      ;'       g    \L        4       V PE                  4        V PE                  V4       R# u upi )7a0  Build and print a welcome banner with caduceus on left and info on right.

When ``provider == "moa"``, ``model`` is a MoA preset name and the aggregator is rendered.
Passing a precomputed ``availability`` together with ``get_toolset_for_tool`` avoids any
``model_tools`` import (banner snapshot replay).
)ÚPanel)ÚTableN)r  Úbanner_accentz#FFBF00Ú
banner_dimz#B8860BÚbanner_textz#FFF8DCr¬   Úbanner_hero)rã  rŠ  rá  rn  rv  rw  )rv  rw  rã  rŠ  r'   r   z]MCP Servers[/]c              3   ó@   <"  € T F  p\        VSSR 7      x € K  	  R# 5i)©rŠ  r'   N)r˜  )r�   r‰  rŠ  r'   s   & €€r   r’   Ú'build_welcome_banner.<locals>.<genexpr>Ç  s    øé € Ð[ÑPZÈÔ+¨C°S¸t×DÑDÓPZùs   ƒz]Available Skills[/]Úskillsc              3   ó8   "  € T F  p\        V4      x € K  	  R # 5ir   r4  ©r�   r  s   & r   r’   r*  Ñ  s   é € ÐCÑ'B !”s˜1—v�vÓ'Bùs   ‚r)  c              3   óF   "  € T F  qR ,          '       g   K  ^x € K  	  R# 5i)r�  Nr   r-  s   & r   r’   r*  Ô  s   é € Ð@¡:˜a°;·±Ÿš£:ùs   ‚!—
!z toolsz skillsz MCP serversz/help for commandsFz]Runtime:[/] [z]codex app-server[/] [dim z,](terminal/file ops/MCP run inside codex)[/]r$   z]Profile:[/] [r�  rè  rŽ  r°   c                  óÆ   <€ \        R R7      p V f'   \        P                  4       '       g   \        4        R# V e&   V ^ 8w  d   SP	                  \        V 4      4       R# R# R# )r  rï   N)rñ   rá   Úis_setr  rb   rú   )rÞ   Úright_liness    €r   Ú_update_lineÚ*build_welcome_banner.<locals>._update_lineæ  sO   ø€ Ü"¨4Ô0ˆØŠ>Ô"4×";Ñ";×"=Ò"=Ü Ö"ØÒ F¨a¤KØ×ÑÔ4°VÓ<Ö=ñ %0Ñr   )ÚpaddingÚleft)ÚjustifyÚrightr  z[link=z[/link]Úbanner_titlez#FFD700Úbanner_borderz#CD7F32)ÚtitleÚborder_styler4  Úbanner_logo)rV   r   )'Ú
rich.panelr"  Ú
rich.tabler#  r�  r  r‡  r)   rC   r%   r:   ÚgetattrÚHERMES_CADUCEUSrý  r  ra   râ   rÎ  rÔ  Úextendrj   ÚsumÚvaluesr  rb   r5  rÚ  rà  rK  ÚgridÚ
add_columnÚadd_rowrÄ   r£   r4   r  r  r  ÚHERMES_AGENT_LOGO)!r   r½  rŽ   r_  rV  ró  r  rô  rõ  rf  rd   rá  r"  r#  rx  r„  rã  Ú_bskinÚ
left_linesÚ
mcp_statusÚ_skills_enabledÚtotal_skillsÚmcp_connectedÚsummary_partsÚ_profile_namer2  Úlayout_tableÚversion_labelÚrelease_infoÚouter_panelrŠ  r1  r'   s!   &&&&&&&&&&&&                  @@@r   Úbuild_welcome_bannerrT  ¡  sý  ú€ õ !Ý ØÒ#Ý4Ø�KˆK�R€EØ'×-Ð-¨2ÐØÒÜ3Ð4DÓEˆÙ#3Ó4Ñ#3˜a”3�q–6Ñ#3€KÐ4ä˜¨)Ó4€FÜ
�l IÓ
.€CÜ�} iÓ0€Dä”LÓ!€FØ”g˜f m°TÓ:×MÐM¼oÈrÐR€JØÔ$ U°ÈXÐ^dÐjmØ4BôDõ D€Jä$Ø×ÑÐ 6¸Ó;Ð=QÜ�|×'Ñ'¨°bÓ9Ó:Ì3È|×O_ÑO_Ð`pÐrtÓOuÓKvØ˜3 Tô+€Kô
 3B×2CÒ2C”Ô)¨2Ô.È€JßØ˜˜f V H¨OÐ<Ð=Õ=ˆØ×ÑÕ[ÑPZÓ[Ô[Ø�B˜&  Ð(<Ð=Ð>Õ>€Kð '”×DÐD¨H¸Ñ,C€OßØÑØ	Ò	#Ü1Ó3ÐÜÑCÐ'9×'@Ñ'@Ô'BÓCÓC€LØÔ&Ð'9¸?ÐPSÐZ^Ô_Õ_€KØ×Ñ�rÔÜÑ@¡:Ó@Ó@€MÜ˜E›
�| 6Ð*¨|¨n¸GÐ,DÐE€MßØ×Ñ ˜¨lÐ;Ô<Ø×ÑÐ-Ô.ô Ô# U×+Ò+Ø×Ñ˜V F 8¨>¸$¸ð @#Ø#& %Ð'SðUô 	Vô Ô/Ó0€Mß˜¨)Ô3Ø×Ñ˜V F 8¨>¸$¸¸qÀÀÈsÐSÔTØ×Ñ˜˜s˜e 1 V§[¡[°Ó%?Ð$@ÀÐDÔEõ>ô ˆ<ÔØ—:‘: f�:Ó-€LØ×Ñ˜F¨FÐÔ3Ø×Ñ˜G¨VÐÔ4Ø×Ñ˜Ÿ™ :Ó.°·	±	¸+Ó0FÔGÜ/Ó1€MÜ)Ó+€LßØ  ¨a¥Ð 1°°=°/ÀÐIˆÙØ˜f¤[°ÀÓ%KÐ$LÈAÈmÈ_Ð\_Ð`Ü  °)Ó<ÀfôN€Kð ‡M�M„OÜ×ÒÓ!×)Ñ)¨RÔ/Ø�‰”g˜f m°TÓ:×OÐOÔ>OÔPØ�‰ŒØ‡M�M�+ÖùòO 5s   ÁP c                ó  € V ^8„  d   Qh/ ^ \         9   d   \        \        ,          ;R&   ^\         9   d   \        \        ,          ;R&   ^\         9   d   \        \        ,          ;R&   ^\         9   d   \        \        ,          ;R&   # )r   rh   rx   r¢   rà   )Ú__conditional_annotations__r   r˜   r   )r   s   "r   r   r      sl   € × NÑ N÷F 0Ò /œ¤%�Ñ /ñG O÷H 0Ò /œ¤%�Ñ /ñI O÷J .Ò -”x¤•Ñ -ñK O÷j %Ò $”œ•Ñ $òk Or   r   )g      à?)g      >@)	NNNNNNNNF)]rV  Ú__doc__rZ  ÚloggingrÖ   rŸ  r  rØ   rÌ   Úpathlibr   Ú
hermes_clir   Úhermes_cli.source_checkr   rJ   r   Útypingr   r	   r
   r   r   r  r   Ú	getLoggerÚ__name__ÚloggerÚ_DIMÚ_RSTr   r    r%   r5   r:   rC   rD   r¼   r�   rE   rG  r@  rh   rx   r¢   ÚobjectrL   rP   rj   rs   rz   rˆ   ry   rž   r£   rÄ   rà   ÚEventrá   rÏ   rÚ   rå   rê   rë   rñ   rú   r  r  r  r½   r(  r/  r6  rF  r:  rS  rj  ry  r‡  r˜  r—  rª  rµ  rÁ  rÎ  rÔ  rÚ  rà  rý  r  r  rT  r   )rV  s   @r   Ú<module>rd     sÁ  øðÞ NÛ Û Û 	Û 	Û Û 
Û Ý Ý #å :Ý ,ß ;Õ ;÷
 Ý$à	×	Ò	˜8Ó	$€ð €Ø€õõ
ô
õòõMõ 8Ý 4ðFÐ ðj€ð( ,0Ð Ó /Ø+/Ð Ó /Ø)-Ð Ó -á‹H€	õõ"1õ,	>÷GõN÷	Jð PÐ ÷	4õ$kðR !%€Ó $Ø—_’_Ó&Ð õTõ
Jò&ð  !&Ð òN÷,õ;ð #(Ð õ
'÷.õ(*õõNõ
9ð Ð õ@õG÷,õ÷06õ4?õ$-õõõ  õ<õ"õ
Dõ%ð
Ø.3÷õ:õ<÷[ñ [r   