§
    ¦¨îi  ã            /       óŽ
  — 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	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m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j        e¦  «        Zdej         d	<   ddl!Z!dd
l"m#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/m0Z0 ddl1m2Z2m3Z3m4Z4m5Z5 ddl6m7Z7 ddl8m9Z9 ddl:m;Z; ddl<m=Z= ddl>m?Z? ddl@mAZB ddlCmDZE 	 ddlFmGZG eGjH        ZIn# eJeKf$ r dZIY nw xY wddlLZLddlMZMddlNmOZOmPZPmQZQmRZR ddlSmTZTmUZU ddlVmWZWmXZX dZYddlZm[Z[m\Z\ ddl]m^Z^ ddl_m`Z`  e[¦   «         Za eeb¦  «        jc        dz  Zd e^eaed¬ ¦  «         d!Zed"efd#effd$„Zgd%ed#effd&„Zhd%ed#effd'„Zid(efd#eeefef                  fd)„Zjd*efd#ekdz  fd+„Zld,efd#efdz  fd-„Zmd.efd#enef         fd/„Zod#eefef         fd0„Zp ep¦   «         Zq	 dd1lrmsZs  esd2¬3¦  «         n# et$ r Y nw xY w	 dd4lumvZv  ev¦   «          n# et$ r Y nw xY w	 dd5lwmxZx  exeq¦  «         n# et$ r Y nw xY w	 dd6lymzZz eq {                    d7i ¦  «         {                    d8d¦  «        Z| eze|r e}e|¦  «        nd¦  «         n# et$ r Y nw xY w	 dd9l~mZ  e¦   «          n# et$ r Y nw xY wdd:l€m�Z‚ dd;lƒm„Z„ dd<l…m†Z‡ dd=lˆm‰Z‰ dd>lŠm‹ZŒ ddl�Z�dd?lŽm�Z� dd@l�m‘Z‘m’Z’ ddAlVm“Z“ ddBl”m•Z•m–Z– ddCl—m˜Z˜m™Z™mšZš ddDl›mœZœ ddEl�mžZŸ ddFl�m Z m¡Z¡ ddGl¢m£Z£ ddHl¤m¥Z¥ ddIl¦m§Z¨ dJa©daªdK„ Z«da¬eeefeff                  e­dL<   d#eef         fdM„Z®dNedOed#e¯fdP„Z°d®dQefd#eeefeff                  fdR„Z±d®dSeefeff         d#dfdT„Z²d¯dU„Z³d°dQefdWe}d#dfdX„Z´dQefd#dfdY„ZµdZZ¶d[Z·d\Z¸d]Z¹dJd^œd_efd`e¯d#effda„Zº G db„ dc¦  «        Z» e»dddedf¬^¦  «        Z¼ e»dgdh¦  «        Z½d#effdi„Z¾d"efd#eŒfdj„Z¿d"efd#effdk„ZÀd±d"efdmeffdn„ZÁd"effdo„ZÂ eÃh dp£¦  «        ZÄddqlZmÅZÆ d²dsefd#effdt„ZÇd,efd#eÈefeff         fdu„ZÉdvefd#edz  fdw„ZÊdxekd#dyfdz„ZËd{efd#d|fd}„ZÌd®d~ene         de}d€e}dz  d#effd�„ZÍd‚efd#e¯fdƒ„ZÎd®d„efdz  d…efdz  d#eÈefene         f         fd†„ZÏ G d‡„ dˆ¦  «        ZÐd‰ZÑdŠZÒd#effd‹„ZÓd"efd#e¯fdŒ„ZÔdd�lÕmÖZÖm×Z×mØZØ  eÖ¦   «         ZÙd#eÚfdŽ„ZÛd�efenef         z  eÈefd�f         z  dz  d#enef         fd‘„ZÜd’efd“eÝd#e¯fd”„ZÞ G d•„ d–¦  «        Zß	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d³d„efd—efd˜efd™efd�efenef         z  eÈefd�f         z  dšefd›efdœefd�efdže}dŸe¯d e¯d¡e¯d¢e¯d£e¯d¤e¯d¥efd¦e¯d§e¯d¨e¯d©e¯dªe¯d«e¯f.d¬„Zàed­k    r e�já        eà¦  «         dS dS )´aD  
Hermes Agent CLI - Interactive Terminal Interface

A beautiful command-line interface for the Hermes Agent, inspired by Claude Code.
Features ASCII art branding, interactive REPL, toolset selection, and rich formatting.

Usage:
    python cli.py                          # Start interactive mode with all tools
    python cli.py --toolsets web,terminal  # Start with specific toolsets
    python cli.py --skills hermes-agent-dev,github-auth
    python cli.py -q "your question"       # Single query mode
    python cli.py --list-tools             # List available tools and exit
é    N)ÚunquoteÚurlparse)Úcontextmanager)ÚPath)Údatetime)ÚListÚDictÚAnyÚOptionalÚ1ÚHERMES_QUIET)ÚFileHistory)ÚStyle)Úpatch_stdout)ÚApplication)ÚLayoutÚHSplitÚWindowÚFormattedTextControlÚConditionalContainer)Ú	ProcessorÚTransformationÚPasswordProcessorÚConditionalProcessor)Ú	Condition)Ú	Dimension)ÚCompletionsMenu)ÚTextArea)ÚKeyBindings)Úprint_formatted_text)ÚANSI)ÚCursorShape)ÚCanonicalUsageÚestimate_usage_costÚformat_duration_compactÚformat_token_count_compact)Úfetch_account_usageÚrender_account_usage_lines)Ú_format_context_lengthÚformat_banner_version_label)
u   â ‹u   â ™u   â ¹u   â ¸u   â ¼u   â ´u   â ¦u   â §u   â ‡u   â �)Úget_hermes_homeÚdisplay_hermes_home)Úload_hermes_dotenv)Úbase_url_host_matchesz.env)Úhermes_homeÚproject_env)ÚREASONING_SCRATCHPADÚthinkÚthinkingÚ	reasoningÚthoughtÚtextÚreturnc                 óx  — | }t           D ]‘}t          j        d|› d|› d�d|t          j        t          j        z  ¬¦  «        }t          j        d|› d�d|t          j        t          j        z  ¬¦  «        }t          j        d|› d�d|t          j        ¬¦  «        }Œ’dD ]8}t          j        d|› d	|› d�d|t          j        t          j        z  ¬¦  «        }Œ9t          j        d
d|t          j        t          j        z  ¬¦  «        }t          j        dd|t          j        ¬¦  «        }|                     ¦   «         S )u®  Remove reasoning/thinking blocks from displayed text.

    Handles every case:
      * Closed pairs ``<tag>â€¦</tag>`` (case-insensitive, multi-line).
      * Unterminated open tags that run to end-of-text (e.g. truncated
        generations on NIM/MiniMax where the close tag is dropped).
      * Stray orphan close tags (``stuff</think>answer``) left behind by
        partial-content dumps.

    Covers the variants emitted by reasoning models today: ``<think>``,
    ``<thinking>``, ``<reasoning>``, ``<REASONING_SCRATCHPAD>``, and
    ``<thought>`` (Gemma 4).  Must stay in sync with
    ``run_agent.py::_strip_think_blocks`` and the stream consumer's
    ``_OPEN_THINK_TAGS`` / ``_CLOSE_THINK_TAGS`` tuples.

    Also strips tool-call XML blocks some open models leak into visible
    content (``<tool_call>``, ``<function_calls>``, Gemma-style
    ``<function name="â€¦">â€¦</function>``). Ported from
    openclaw/openclaw#67318.
    Ú<z>.*?</z>\s*Ú ©Úflagsz>.*$z</)Ú	tool_callÚ
tool_callsÚtool_resultÚfunction_callÚfunction_callsz\b[^>]*>.*?</zg(?:(?<=^)|(?<=[\n\r.!?:]))[ \t]*<function\b[^>]*\bname\s*=[^>]*>(?:(?:(?!</function>).)*)</function>\s*zP</(?:tool_call|tool_calls|tool_result|function_call|function_calls|function)>\s*)Ú_REASONING_TAGSÚreÚsubÚDOTALLÚ
IGNORECASEÚstrip)r6   ÚcleanedÚtagÚtc_tags       ú%/home/div/.hermes/hermes-agent/cli.pyÚ_strip_reasoning_tagsrL   a   ss  € ð* €GÝð 
ð 
ˆå”&Ø%�Ð%Ð%˜CÐ%Ð%Ð%ØØÝ”)�bœmÑ+ð	
ñ 
ô 
ˆõ ”&Ø�ˆNˆNˆNØØÝ”)�bœmÑ+ð	
ñ 
ô 
ˆõ ”&Ø�#ˆOˆOˆOØØÝ”-ð	
ñ 
ô 
ˆˆð6ð 
ð 
ˆå”&Ø2�Ð2Ð2 fÐ2Ð2Ð2ØØÝ”)�bœmÑ+ð	
ñ 
ô 
ˆˆõ Œfð	3ð 	ØÝŒi�"œ-Ñ'ðñ ô €Gõ ŒfØ[Ø
ØÝŒmð	ñ ô €Gð �=Š=‰?Œ?Ðó    Úcontentc                 óÖ   — | €dS t          | t          ¦  «        r| S t          | t          ¦  «        r+d„ | D ¦   «         }d                     d„ |D ¦   «         ¦  «        S t          | ¦  «        S )Nr:   c                 ó°   — g | ]S}t          |t          ¦  «        r<|                     d ¦  «        dk    ¯0t          |                     dd¦  «        ¦  «        ‘ŒTS )Útyper6   r:   )Ú
isinstanceÚdictÚgetÚstr©Ú.0Úparts     rK   ú
<listcomp>z._assistant_content_as_text.<locals>.<listcomp>¯   sc   € ð 
ð 
ð 
àÝ˜$¥Ñ%Ô%ð
ð +/¯(ª(°6Ñ*:Ô*:¸fÒ*DÐ*Dõ �—’˜ Ñ$Ô$Ñ%Ô%à*DÐ*DÐ*DrM   Ú
c              3   ó   K  — | ]}|¯|V — Œ	d S ©N© ©rW   Úps     rK   ú	<genexpr>z-_assistant_content_as_text.<locals>.<genexpr>´   s'   è è € Ð/Ð/˜q¨QÐ/˜Ð/Ð/Ð/Ð/Ð/Ð/rM   )rR   rU   ÚlistÚjoin)rN   Úpartss     rK   Ú_assistant_content_as_textrd   ©   s‚   € Ø€ØˆrÝ�'�3ÑÔð ØˆÝ�'�4Ñ Ô ð 0ð
ð 
àð
ñ 
ô 
ˆð
 �yŠyÐ/Ð/ EÐ/Ñ/Ô/Ñ/Ô/Ð/Ýˆw‰<Œ<ÐrM   c                 ó:   — t          t          | ¦  «        ¦  «        S r\   )rL   rd   )rN   s    rK   Ú_assistant_copy_textrf   ¸   s   € Ý Õ!;¸GÑ!DÔ!DÑEÔEÐErM   Ú	file_pathc                 ó:  — | sg S t          | ¦  «                             ¦   «         }|                     ¦   «         s
t          |z  }|                     ¦   «         st
                               d|¦  «         g S 	 t          |dd¬¦  «        5 }t          j	        |¦  «        }ddd¦  «         n# 1 swxY w Y   t          |t          ¦  «        st
                               d|¦  «         g S |S # t          $ r(}t
                               d||¦  «         g cY d}~S d}~ww xY w)a\  Load ephemeral prefill messages from a JSON file.
    
    The file should contain a JSON array of {role, content} dicts, e.g.:
        [{"role": "user", "content": "Hi"}, {"role": "assistant", "content": "Hello!"}]
    
    Relative paths are resolved from ~/.hermes/.
    Returns an empty list if the path is empty or the file doesn't exist.
    z#Prefill messages file not found: %sÚrúutf-8©ÚencodingNz3Prefill messages file must contain a JSON array: %sz+Failed to load prefill messages from %s: %s)r   Ú
expanduserÚis_absoluteÚ_hermes_homeÚexistsÚloggerÚwarningÚopenÚjsonÚloadrR   ra   Ú	Exception)rg   ÚpathÚfÚdataÚes        rK   Ú_load_prefill_messagesr{   À   s`  € ð ð Øˆ	Ý�	‰?Œ?×%Ò%Ñ'Ô'€DØ×ÒÑÔð #Ý˜dÑ"ˆØ�;Š;‰=Œ=ð Ý�ŠÐ<¸dÑCÔCÐCØˆ	ð	Ý�$˜ gÐ.Ñ.Ô.ð 	 °!Ý”9˜Q‘<”<ˆDð	 ð 	 ð 	 ñ 	 ô 	 ð 	 ð 	 ð 	 ð 	 ð 	 ð 	 øøøð 	 ð 	 ð 	 ð 	 å˜$¥Ñ%Ô%ð 	Ý�NŠNÐPÐRVÑWÔWÐWØˆIØˆøÝð ð ð Ý�ŠÐDÀdÈAÑNÔNÐNØˆ	ˆ	ˆ	ˆ	ˆ	ˆ	øøøøðøøøsH   Á6C( ÂB)ÂC( Â)B-Â-C( Â0B-Â14C( Ã&C( Ã(
DÃ2DÄDÄDÚeffortc                 óŽ   — ddl m}  || ¦  «        }| r1|                      ¦   «         r|€t                               d| ¦  «         |S )zHParse a reasoning effort level into an OpenRouter reasoning config dict.r   )Úparse_reasoning_effortNz5Unknown reasoning_effort '%s', using default (medium))Úhermes_constantsr~   rG   rq   rr   )r|   r~   Úresults      rK   Ú_parse_reasoning_configr�   Ý   s\   € à7Ð7Ð7Ð7Ð7Ð7Ø#Ð# FÑ+Ô+€FØð X�&—,’,‘.”.ð X V ^Ý�ŠÐNÐPVÑWÔWÐWØ€MrM   Úrawc                 óÂ   — t          | pd¦  «                             ¦   «                              ¦   «         }|r|dv rdS |dv rdS t                               d| ¦  «         dS )zEParse a persisted service-tier preference into a Responses API value.r:   >   ÚoffÚnoneÚnormalÚdefaultÚstandardN>   ÚonÚfastÚpriorityr‹   z#Unknown service_tier '%s', ignoring)rU   rG   Úlowerrq   rr   )r‚   Úvalues     rK   Ú_parse_service_tier_configrŽ   æ   sl   € å��	�r‰NŒN× Ò Ñ"Ô"×(Ò(Ñ*Ô*€EØð �EÐMÐMÐMØˆtØÐ*Ð*Ð*ØˆzÝ
‡N‚NÐ8¸#Ñ>Ô>Ð>Øˆ4rM   Úsystemc           
      óþ  ‡‡‡— g Št          ¦   «         Šdt          dz  ddfˆˆfd„Šdt          ddfˆfd„}| dk    rdD ]} ‰|¦  «         Œn°| d	k    rš |d
ddddddd¦  «         t          j                             d¦  «        t          j                             d¦  «        t          j                             d¦  «        fD ]*}|sŒdD ]"} ‰t          j        j        |g|¢R Ž ¦  «         Œ#Œ+n |dddddd¦  «         ‰S )z<Return likely browser executables for local CDP auto-launch.rw   Nr7   c                 ó*  •— | sd S t           j                             t           j                             | ¦  «        ¦  «        }|‰v rd S t           j                             | ¦  «        r,‰                     | ¦  «         ‰                     |¦  «         d S d S r\   )Úosrw   ÚnormcaseÚnormpathÚisfileÚappendÚadd)rw   Ú
normalizedÚ
candidatesÚseens     €€rK   Ú_add_candidatez4_get_chrome_debug_candidates.<locals>._add_candidate÷   s‘   ø€ Øð 	ØˆFÝ”W×%Ò%¥b¤g×&6Ò&6°tÑ&<Ô&<Ñ=Ô=ˆ
Ø˜ÐÐØˆFÝŒ7�>Š>˜$ÑÔð 	!Ø×Ò˜dÑ#Ô#Ð#Ø�HŠH�ZÑ Ô Ð Ð Ð ð	!ð 	!rM   Únamesc                  óL   •— | D ]} ‰t          j        |¦  «        ¦  «         Œ d S r\   )ÚshutilÚwhich)rœ   Únamer›   s     €rK   Ú_add_from_pathz4_get_chrome_debug_candidates.<locals>._add_from_path  s9   ø€ Øð 	/ð 	/ˆDØˆN�6œ<¨Ñ-Ô-Ñ.Ô.Ð.Ð.ð	/ð 	/rM   ÚDarwin)z</Applications/Google Chrome.app/Contents/MacOS/Google Chromez2/Applications/Chromium.app/Contents/MacOS/Chromiumz</Applications/Brave Browser.app/Contents/MacOS/Brave Browserz>/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft EdgeÚWindowsú
chrome.exeú
msedge.exeú	brave.exeúchromium.exeÚchromeÚmsedgeÚbraveÚchromiumÚProgramFileszProgramFiles(x86)ÚLOCALAPPDATA))ÚGoogleÚChromer   r¤   )ÚChromiumr   r¤   )r°   r   r§   )ÚBraveSoftwarezBrave-Browserr   r¦   )Ú	MicrosoftÚEdger   r¥   zgoogle-chromezgoogle-chrome-stablezchromium-browserzbrave-browserzmicrosoft-edge)ÚsetrU   r’   ÚenvironrT   rw   rb   )r�   r¡   ÚappÚbaserc   r›   r™   rš   s        @@@rK   Ú_get_chrome_debug_candidatesr¸   ò   s¦  øøø€ à€JÝ‘U”U€Dð!�S 4™Zð !¨Dð !ð !ð !ð !ð !ð !ð !ð/�sð / tð /ð /ð /ð /ð /ð /ð �ÒÐð
ð 	 ð 	 ˆCð ˆN˜3ÑÔÐÐð	 ð 
�9Ò	Ð	ØˆØ˜,¨°^Ø�h ¨ñ	
ô 	
ð 	
õ ŒJ�NŠN˜>Ñ*Ô*ÝŒJ�NŠNÐ.Ñ/Ô/ÝŒJ�NŠN˜>Ñ*Ô*ð
ð 	;ð 	;ˆDð
 ð Øðð ;ð ;�ð ��rœwœ|¨DÐ9°5Ð9Ð9Ð9Ñ:Ô:Ð:Ð:ð;ð	;ð  	ˆØÐ3Ð5GØ˜Ð)9ñ	
ô 	
ð 	
ð
 ÐrM   c                  óú  — t           dz  } t          t          ¦  «        j        dz  }t          j                             d¦  «        dk    }|                      ¦   «         r|s| }n|}ddddœdd	d
ddg dddg ddœdddœdddœddddddddddddddddd d!d"d#d$œd%œdd&ddd'd(d)œd*didd+d,œddddd-œddddd-œd.œd/ddddd0œd1i id2œ}d}|                     ¦   «         �rk	 t          |d3d4¬5¦  «        5 }t          j
        |¦  «        pi }d6d6d6¦  «         n# 1 swxY w Y   d7|v }d8|v r”t          |d8         t          ¦  «        r|d8         |d8         d(<   ngt          |d8         t          ¦  «        rL|d8                              |d8         ¦  «         d8|d8         v r!d(|d8         vr|d8         d8         |d8         d(<   |d8                              d9¦  «        s"|                     d9¦  «        }|r||d8         d9<   |d8                              d:¦  «        s"|                     d:¦  «        }	|	r|	|d8         d:<   |D ]p}
|
d8k    rŒ	|
|v rct          ||
         t          ¦  «        r=t          ||
         t          ¦  «        r"||
                              ||
         ¦  «         Œe||
         ||
<   Œq|D ]}
|
|vr|
d8k    r||
         ||
<   Œ|                     d;¦  «        }d<|v r;t          |t          ¦  «        r|                     d<¦  «        €|d<         |d;         d<<   n2# t          $ r%}t                                d=|¦  «         Y d6}~nd6}~ww xY wd>d?lm}  ||¦  «        }|                     d7i ¦  «        }d@|v r|d@         |dA<   dB}|                     dC¦  «        |v r°t          j                             dDd¦  «        }|r4||vr0t          j                             |¦  «        r||dC<   ||d7         dC<   nZ|                     dAd¦  «        }|dk    r(t	          j        ¦   «         |dC<   |dC         |d7         dC<   n|                     dCd6¦  «         i dAdE“dCdD“d*dF“dGdH“dIdJ“dKdL“dMdN“dOdP“dQdR“dSdT“dUdV“dWdX“dYdZ“d[d\“d]d^“d_d`“dadb“dcdddedfdgdhœ¥}|                     ¦   «         D ]t\  }}||v rk|s|t          j        vr[||         }t          |t2          ¦  «        r"t5          j        |¦  «        t          j        |<   ŒXt          |¦  «        t          j        |<   Œu|                     dii ¦  «        }djdki}|                     ¦   «         D ]+\  }}||v r"t          ||         ¦  «        t          j        |<   Œ,|                     dli ¦  «        }dmdndodpd-œdqdrdsdtd-œdudvdwdxd-œdyœ}|                     ¦   «         D �]h\  }}|                     |i ¦  «        }t          |t          ¦  «        sŒ2t          |                     d9d¦  «        ¦  «                             ¦   «         }t          |                     d8d¦  «        ¦  «                             ¦   «         }t          |                     d:d¦  «        ¦  «                             ¦   «         }t          |                     dzd¦  «        ¦  «                             ¦   «         } |r|dk    r|t          j        |d9         <   |r|t          j        |d8         <   |r|t          j        |d:         <   | r| t          j        |dz         <   �Œj|                     d{i ¦  «        }!t          |!t          ¦  «        rE|!                     d|¦  «        }"|"�.t          |"¦  «                             ¦   «         t          j        d}<   |S )~u¢  
    Load CLI configuration from config files.
    
    Config lookup order:
    1. ~/.hermes/config.yaml (user config - preferred)
    2. ./cli-config.yaml (project config - fallback)
    
    Environment variables take precedence over config file values.
    Returns default values if no config file exists.

    If HERMES_IGNORE_USER_CONFIG=1 is set (via ``hermes chat --ignore-user-config``),
    the user config at ``~/.hermes/config.yaml`` is skipped entirely and only the
    built-in defaults plus the project-level ``cli-config.yaml`` (if any) are used.
    Credentials in ``.env`` are still loaded â€” this flag only suppresses
    behavioral/config settings.
    úconfig.yamlúcli-config.yamlÚHERMES_IGNORE_USER_CONFIGr   r:   Úauto)r‡   Úbase_urlÚproviderÚlocalú.é<   é,  z*nikolaik/python-nodejs:python3.11-nodejs20z3docker://nikolaik/python-nodejs:python3.11-nodejs20F)Úenv_typeÚcwdÚtimeoutÚlifetime_secondsÚdocker_imageÚdocker_forward_envÚsingularity_imageÚmodal_imageÚdaytona_imageÚdocker_volumesÚdocker_mount_cwd_to_workspaceéx   )Úinactivity_timeoutÚrecord_sessionsTç      à?)ÚenabledÚ	thresholdéZ   z)You are a helpful, friendly AI assistant.zCYou are a concise assistant. Keep responses brief and to the point.zMYou are a technical expert. Provide detailed, accurate technical information.zSYou are a creative assistant. Think outside the box and offer innovative solutions.zBYou are a patient teacher. Explain concepts clearly with examples.uÑ   You are a kawaii assistant! Use cute expressions like (â—•â€¿â—•), â˜…, â™ª, and ~! Add sparkles and be super enthusiastic about everything! Every response should feel warm and adorable desu~! ãƒ½(>âˆ€<â˜†)ãƒŽuÊ   You are Neko-chan, an anime catgirl AI assistant, nya~! Add 'nya' and cat-like expressions to your speech. Use kaomoji like (=^ï½¥Ï‰ï½¥^=) and à¸…^â€¢ï»Œâ€¢^à¸…. Be playful and curious like a cat, nya~!zÞArrr! Ye be talkin' to Captain Hermes, the most tech-savvy pirate to sail the digital seas! Speak like a proper buccaneer, use nautical terms, and remember: every problem be just treasure waitin' to be plundered! Yo ho ho!zóHark! Thou speakest with an assistant most versed in the bardic arts. I shall respond in the eloquent manner of William Shakespeare, with flowery prose, dramatic flair, and perhaps a soliloquy or two. What light through yonder terminal breaks?z¿Duuude! You're chatting with the chillest AI on the web, bro! Everything's gonna be totally rad. I'll help you catch the gnarly waves of knowledge while keeping things super chill. Cowabunga!a  The rain hammered against the terminal like regrets on a guilty conscience. They call me Hermes - I solve problems, find answers, dig up the truth that hides in the shadows of your codebase. In this city of silicon and secrets, everyone's got something to hide. What's your story, pal?z¡hewwo! i'm your fwiendwy assistant uwu~ i wiww twy my best to hewp you! *nuzzles your code* OwO what's this? wet me take a wook! i pwomise to be vewy hewpful >w<a  Greetings, seeker of wisdom. I am an assistant who contemplates the deeper meaning behind every query. Let us examine not just the 'how' but the 'why' of your questions. Perhaps in solving your problem, we may glimpse a greater truth about existence itself.z­YOOO LET'S GOOOO!!! I am SO PUMPED to help you today! Every question is AMAZING and we're gonna CRUSH IT together! This is gonna be LEGENDARY! ARE YOU READY?! LET'S DO THIS!)ÚhelpfulÚconciseÚ	technicalÚcreativeÚteacherÚkawaiiÚcatgirlÚpirateÚshakespeareÚsurferÚnoirÚuwuÚphilosopherÚhype)Ú	max_turnsÚverboseÚsystem_promptÚprefill_messages_fileÚreasoning_effortÚservice_tierÚpersonalitiesÚfullÚ	interruptr‡   )ÚcompactÚresume_displayÚshow_reasoningÚ	streamingÚbusy_input_modeÚskinrÆ   é2   )rÆ   Úmax_tool_calls)r¿   Úmodelr¾   Úapi_key)ÚvisionÚweb_extracté-   )Úmax_iterationsrõ   r¿   r¾   rö   rš   )rõ   ÚterminalÚbrowserÚcompressionÚagentÚdisplayÚclarifyÚcode_executionÚ	auxiliaryÚ
delegationÚ
onboardingri   rj   rk   Nrû   rõ   r¿   r¾   rþ   rä   z"Failed to load cli-config.yaml: %sr   )Ú_expand_env_varsÚbackendrÄ   )rÁ   r½   rÅ   rÅ   ÚTERMINAL_CWDÚTERMINAL_ENVÚTERMINAL_TIMEOUTrÇ   ÚTERMINAL_LIFETIME_SECONDSrÈ   ÚTERMINAL_DOCKER_IMAGErÉ   ÚTERMINAL_DOCKER_FORWARD_ENVrÊ   ÚTERMINAL_SINGULARITY_IMAGErË   ÚTERMINAL_MODAL_IMAGErÌ   ÚTERMINAL_DAYTONA_IMAGEÚssh_hostÚTERMINAL_SSH_HOSTÚssh_userÚTERMINAL_SSH_USERÚssh_portÚTERMINAL_SSH_PORTÚssh_keyÚTERMINAL_SSH_KEYÚcontainer_cpuÚTERMINAL_CONTAINER_CPUÚcontainer_memoryÚTERMINAL_CONTAINER_MEMORYÚcontainer_diskÚTERMINAL_CONTAINER_DISKÚcontainer_persistentÚTERMINAL_CONTAINER_PERSISTENTÚTERMINAL_DOCKER_VOLUMESÚ&TERMINAL_DOCKER_MOUNT_CWD_TO_WORKSPACEÚTERMINAL_SANDBOX_DIRÚTERMINAL_PERSISTENT_SHELLÚSUDO_PASSWORD)rÍ   rÎ   Úsandbox_dirÚpersistent_shellÚsudo_passwordrü   rÐ   ÚBROWSER_INACTIVITY_TIMEOUTr  ÚAUXILIARY_VISION_PROVIDERÚAUXILIARY_VISION_MODELÚAUXILIARY_VISION_BASE_URLÚAUXILIARY_VISION_API_KEYÚAUXILIARY_WEB_EXTRACT_PROVIDERÚAUXILIARY_WEB_EXTRACT_MODELÚAUXILIARY_WEB_EXTRACT_BASE_URLÚAUXILIARY_WEB_EXTRACT_API_KEYÚAUXILIARY_APPROVAL_PROVIDERÚAUXILIARY_APPROVAL_MODELÚAUXILIARY_APPROVAL_BASE_URLÚAUXILIARY_APPROVAL_API_KEY)r÷   rø   Úapprovalrö   ÚsecurityÚredact_secretsÚHERMES_REDACT_SECRETS)ro   r   Ú__file__Úparentr’   rµ   rT   rp   rs   ÚyamlÚ	safe_loadrR   rU   rS   Úupdaterv   rq   rr   Úhermes_cli.configr  rw   ÚisabsÚgetcwdÚpopÚitemsra   rt   ÚdumpsrG   rŒ   )#Úuser_config_pathÚproject_config_pathÚignore_user_configÚconfig_pathÚdefaultsÚ_file_has_terminal_configrx   Úfile_configÚroot_providerÚroot_base_urlÚkeyÚagent_file_configrz   r  Úterminal_configÚ_CWD_PLACEHOLDERSÚ_existing_cwdÚeffective_backendÚenv_mappingsÚ
config_keyÚenv_varÚvalÚbrowser_configÚbrowser_env_mappingsÚauxiliary_configÚauxiliary_task_envÚtask_keyÚenv_mapÚtask_cfgÚprovrõ   r¾   rö   Úsecurity_configÚredacts#                                      rK   Úload_cli_configra  +  ss
  € õ$ $ mÑ3ÐÝ�x™.œ.Ô/Ð2CÑCÐõ œŸšÐ(CÑDÔDÈÒKÐð ×ÒÑ Ô ð *Ð);ð *Ø&ˆˆà)ˆð
 ØØð
ð 
ð  ØØØ #ØHØ"$Ø!VØGØIØ Ø-2ð
ð 
ð #&Ø$ð
ð 
ð
 Øð
ð 
ð
 ØØØ%'Ø "ØàFØ`ØlØqØ_ð nð hð {ð  Uð \ð xð {ð  cð Hðð ð
ð 
ð4 Ø$Ø#ØØ*àð
ð 
ð �sð
ð Ø ð
ð 
ð #ØØØð	ð ð #ØØØð	ð ð
ð 
ð !ØØØØð
ð 
ð �Bð
ðs^ð ^€HðH !&Ðð ×ÒÑÔñ ADð@	DÝ�k 3°Ð9Ñ9Ô9ð 6¸QÝ"œn¨QÑ/Ô/Ð5°2�ð6ð 6ð 6ñ 6ô 6ð 6ð 6ð 6ð 6ð 6ð 6øøøð 6ð 6ð 6ð 6ð )3°kÐ(AÐ%ð ˜+Ð%Ð%Ý˜k¨'Ô2µCÑ8Ô8ð Uà3>¸wÔ3G�H˜WÔ% iÑ0Ð0Ý ¨GÔ 4µdÑ;Ô;ð 
Uà˜WÔ%×,Ò,¨[¸Ô-AÑBÔBÐBð  +¨gÔ"6Ð6Ð6¸9ÈKÐX_ÔL`Ð;`Ð;`Ø7BÀ7Ô7KÈGÔ7T˜ Ô)¨)Ñ4ð ˜GÔ$×(Ò(¨Ñ4Ô4ð BØ +§¢°
Ñ ;Ô ;�Ø ð BØ4A�H˜WÔ% jÑ1Ø˜GÔ$×(Ò(¨Ñ4Ô4ð BØ +§¢°
Ñ ;Ô ;�Ø ð BØ4A�H˜WÔ% jÑ1ð  ð 9ð 9�Ø˜'’>�>ØØ˜+Ð%Ð%Ý! (¨3¤-µÑ6Ô6ð 9½:ÀkÐRUÔFVÕX\Ñ;]Ô;]ð 9Ø  œ×,Ò,¨[¸Ô-=Ñ>Ô>Ð>Ð>à(3°CÔ(8˜ ™øð #ð 5ð 5�Ø˜hÐ&Ð&¨3°'ª>¨>Ø$/°Ô$4�H˜S‘Møð !,§¢°Ñ 8Ô 8ÐØ˜kÐ)Ð)ÝÐ,­dÑ3Ô3ð *à%×)Ò)¨+Ñ6Ô6ÐBà1<¸[Ô1I�˜Ô! +Ñ.øøÝð 	Dð 	Dð 	DÝ�NŠNÐ?ÀÑCÔCÐCÐCÐCÐCÐCÐCøøøøð	Døøøð 3Ð2Ð2Ð2Ð2Ð2ØÐ Ñ)Ô)€Hð —l’l :¨rÑ2Ô2€Oð
 �OÐ#Ð#Ø&5°iÔ&@ˆ˜
Ñ#ð -ÐØ×Ò˜5Ñ!Ô!Ð%6Ð6Ð6Ýœ
Ÿš ~°rÑ:Ô:ˆØð 	1˜]Ð2CÐCÐCÍÌÏÊÐVcÑHdÔHdÐCà%2ˆO˜EÑ"Ø*7ˆH�ZÔ  Ñ'Ð'à /× 3Ò 3°JÀÑ HÔ HÐØ  GÒ+Ð+Ý)+¬©¬� Ñ&Ø.=¸eÔ.D�˜Ô$ UÑ+Ð+ð  ×#Ò# E¨4Ñ0Ô0Ð0ðØ�Nðàˆ~ðð 	Ð%ðð 	Ð7ð	ð
 	Ð/ðð 	Ð;ðð 	Ð9ðð 	Ð-ðð 	Ð1ðð 	Ð'ðð 	Ð'ðð 	Ð'ðð 	Ð%ðð  	Ð1ð!ð" 	Ð7ð#ð$ 	Ð3ð%ð& 	Ð ?ð'ð( 4Ø)QØ-à7à(ð5ð ð €LðD  ,×1Ò1Ñ3Ô3ð 3ð 3Ñˆ
�GØ˜Ð(Ð(Ø(ð 3¨G½2¼:Ð,EÐ,EØ% jÔ1�Ý˜c¥4Ñ(Ô(ð 3Ý*.¬*°S©/¬/•B”J˜wÑ'Ð'å*-¨c©(¬(•B”J˜wÑ'øð —\’\ )¨RÑ0Ô0€NàÐ:ðÐð  4×9Ò9Ñ;Ô;ð Bð BÑˆ
�GØ˜Ð'Ð'Ý"% n°ZÔ&@Ñ"AÔ"A�BŒJ�wÑøð  —|’| K°Ñ4Ô4Ðð 4Ø-Ø3Ø1ð	
ð 
ð 9Ø2Ø8Ø6ð	
ð 
ð 6Ø/Ø5Ø3ð	
ð 
ðð Ðð, 0×5Ò5Ñ7Ô7ð 5ñ 5Ñˆ�'Ø#×'Ò'¨°"Ñ5Ô5ˆÝ˜(¥DÑ)Ô)ð 	ØÝ�8—<’< 
¨BÑ/Ô/Ñ0Ô0×6Ò6Ñ8Ô8ˆÝ�H—L’L ¨"Ñ-Ô-Ñ.Ô.×4Ò4Ñ6Ô6ˆÝ�x—|’| J°Ñ3Ô3Ñ4Ô4×:Ò:Ñ<Ô<ˆÝ�h—l’l 9¨bÑ1Ô1Ñ2Ô2×8Ò8Ñ:Ô:ˆØð 	3�D˜F’N�NØ.2�BŒJ�w˜zÔ*Ñ+Øð 	1Ø+0�BŒJ�w˜wÔ'Ñ(Øð 	7Ø.6�BŒJ�w˜zÔ*Ñ+Øð 	5Ø-4�BŒJ�w˜yÔ)Ñ*ùð —l’l :¨rÑ2Ô2€OÝ�/¥4Ñ(Ô(ð FØ ×$Ò$Ð%5Ñ6Ô6ˆØÐÝ25°f±+´+×2CÒ2CÑ2EÔ2E�BŒJÐ.Ñ/à€Os=   ÃL Ã+DÄL ÄDÄL ÄDÄG:L Ì
M ÌL;Ì;M )Úsetup_loggingÚcli©Úmode)Úprint_config_warnings)Úinit_skin_from_config)Úset_tool_preview_max_lenrÿ   Útool_preview_length)Úneuter_async_httpx_del)Úbox)ÚConsole)Úescape©ÚPanel©ÚText)ÚAIAgent)Úget_tool_definitionsÚget_toolset_for_tool)Úbuild_welcome_banner)ÚSlashCommandCompleterÚSlashCommandAutoSuggest)Úget_all_toolsetsÚget_toolset_infoÚvalidate_toolset)Úget_job)Úcleanup_all_environments)Úset_sudo_password_callbackÚset_approval_callback)Úset_secret_capture_callback©Úprompt_for_secret)Ú_emergency_cleanup_all_sessionsFc                  óZ  — t           rdS da 	 t          ¦   «          n# t          $ r Y nw xY w	 t          ¦   «          n# t          $ r Y nw xY w	 ddlm}   | ¦   «          n# t          $ r Y nw xY w	 ddlm}  |¦   «          n# t          $ r Y nw xY w	 ddlm	}  |dt          rt          j        ndd¬	¦  «         n# t          $ r Y nw xY w	 t          rGt          t          d
¦  «        r4t                               t          t          dd¦  «        pg ¦  «         dS dS dS # t          $ r Y dS w xY w)z"Run resource cleanup exactly once.NTr   )Úshutdown_mcp_servers)Úshutdown_cached_clients©Úinvoke_hookÚon_session_finalizerc  ©Ú
session_idÚplatformÚshutdown_memory_providerÚconversation_history)Ú_cleanup_doneÚ_cleanup_all_terminalsrv   Ú_cleanup_all_browsersÚtools.mcp_toolr„  Úagent.auxiliary_clientr…  Úhermes_cli.pluginsr‡  Ú_active_agent_refrŠ  ÚhasattrrŒ  Úgetattr)r„  r…  Ú_invoke_hooks      rK   Ú_run_cleanupr˜  Õ  s  € õ ð ØˆØ€MðÝÑ Ô Ð Ð øÝð ð ð ØˆðøøøðÝÑÔÐÐøÝð ð ð ØˆðøøøðØ7Ð7Ð7Ð7Ð7Ð7ØÐÑÔÐÐøÝð ð ð Øˆðøøøð
ØBÐBÐBÐBÐBÐBØÐÑ!Ô!Ð!Ð!øÝð ð ð ØˆðøøøðØBÐBÐBÐBÐBÐBØˆÐ*ÕWhÐ7rÕ7HÔ7SÐ7SÐnrð  ~Cð  	Dñ  	Dô  	Dð  	Dð  	DøÝð ð ð ØˆðøøøðÝð 	¥Õ):Ð<VÑ!WÔ!Wð 	Ý×6Ò6ÝÕ)Ð+AÀ4ÑHÔHÐNÈBñô ð ð ð ð	ð 	ð 	ð 	øõ ð ð ð Øˆˆðøøøsd   � œ
)¨)­< ¼
A	ÁA	ÁA Á
A+Á*A+Á/B  Â 
BÂBÂ'B9 Â9
CÃCÃ
AD Ä
D*Ä)D*Ú_active_worktreec                  ó°   — ddl } 	 |                      g d¢ddd¬¦  «        }|j        dk    r|j                             ¦   «         S n# t
          $ r Y nw xY wdS )z;Return the git repo root for CWD, or None if not in a repo.r   N)Úgitz	rev-parsez--show-toplevelTé   )Úcapture_outputr6   rÆ   )Ú
subprocessÚrunÚ
returncodeÚstdoutrG   rv   )rž  r€   s     rK   Ú_git_repo_rootr¢    s‰   € àÐÐÐðØ—’Ø3Ð3Ð3Ø d°Að  ñ 
ô 
ˆð Ô Ò!Ð!Ø”=×&Ò&Ñ(Ô(Ð(ð "øåð ð ð Øˆðøøøàˆ4s   †>A Á
AÁArw   Úrootc                 óT   — 	 |                       |¦  «         dS # t          $ r Y dS w xY w)z@Return True when a resolved path stays within the expected root.TF)Úrelative_toÚ
ValueError)rw   r£  s     rK   Ú_path_is_within_rootr§    sB   € ðØ×Ò˜ÑÔÐØˆtøÝð ð ð Øˆuˆuðøøøs   ‚ ™
'¦'Ú	repo_rootc           	      ó°	  — ddl }| pt          ¦   «         } | s t          d¦  «         t          d¦  «         dS t          j        ¦   «         j        dd…         }d|› �}d|› �}t          | ¦  «        dz  }|                     d	d	¬
¦  «         ||z  }t          | ¦  «        dz  }d}	 |                     ¦   «         r| 	                    ¦   «         nd}	||	 
                    ¦   «         vrlt          |d¦  «        5 }
|	r*|	                     d¦  «        s|
                     d¦  «         |
                     |› d�¦  «         ddd¦  «         n# 1 swxY w Y   n2# t          $ r%}t                               d|¦  «         Y d}~nd}~ww xY w	 |                     dddt%          |¦  «        d|dgd	d	d| ¬¦  «        }|j        dk    r,t          d|j                             ¦   «         › d�¦  «         dS n+# t          $ r}t          d|› d�¦  «         Y d}~dS d}~ww xY wt          | ¦  «        dz  }|                     ¦   «         �rc	 t          | ¦  «                             ¦   «         }|                     ¦   «         }| 	                    ¦   «          
                    ¦   «         D �]Ò}|                     ¦   «         }|r|                     d¦  «        rŒ/t          | ¦  «        |z  }||z  }	 |                     d¬¦  «        }|                     d¬¦  «        }n2# t0          t2          f$ r t                               d|¦  «         Y Œ¢w xY wt5          ||¦  «        st                               d|¦  «         ŒÒt5          ||¦  «        st                               d |¦  «         Œþ|                     ¦   «         rM|j                             d	d	¬
¦  «         t=          j        t%          |¦  «        t%          |¦  «        ¦  «         �Œ_|                      ¦   «         r_|                     ¦   «         sK|j                             d	d	¬
¦  «         tC          j"        t%          |¦  «        t%          |¦  «        ¦  «         �ŒÔn2# t          $ r%}t                               d!|¦  «         Y d}~nd}~ww xY wt%          |¦  «        || d"œ}t          d#|› �¦  «         t          d$|› �¦  «         |S )%z²Create an isolated git worktree for this CLI session.

    Returns a dict with worktree metadata on success, None on failure.
    The dict contains: path, branch, repo_root.
    r   Nu?   [31mâœ— --worktree requires being inside a git repository.[0mz5  cd into your project repo first, then run hermes -wé   úhermes-zhermes/ú
.worktreesT©ÚparentsÚexist_okz
.gitignorez.worktrees/r:   ÚarZ   zCould not update .gitignore: %sr›  Úworktreer—   z-bÚHEADé   ©r�  r6   rÆ   rÅ   u$   [31mâœ— Failed to create worktree: ú[0mz.worktreeincludeú#F)Ústrictz+Skipping invalid .worktreeinclude entry: %sz5Skipping .worktreeinclude entry outside repo root: %sz9Skipping .worktreeinclude entry that escapes worktree: %sz*Error copying .worktreeinclude entries: %s)rw   Úbranchr¨  u   [32mâœ“ Worktree created:[0m z
  Branch: )#rž  r¢  ÚprintÚuuidÚuuid4Úhexr   Úmkdirrp   Ú	read_textÚ
splitlinesrs   ÚendswithÚwriterv   rq   ÚdebugrŸ  rU   r   ÚstderrrG   ÚresolveÚ
startswithÚOSErrorr¦  r§  rr   Úis_filer:  rž   Úcopy2Úis_dirr’   Úsymlink)r¨  rž  Úshort_idÚwt_nameÚbranch_nameÚworktrees_dirÚwt_pathÚ	gitignoreÚ_ignore_entryÚexistingrx   rz   r€   Úinclude_fileÚrepo_root_resolvedÚwt_path_resolvedÚlineÚentryÚsrcÚdstÚsrc_resolvedÚdst_resolvedÚinfos                          rK   Ú_setup_worktreerÝ     s“  € ð ÐÐÐàÐ-�^Ñ-Ô-€IØð ÝÐUÑVÔVÐVÝÐEÑFÔFÐFØˆtåŒz‰|Œ|Ô   Ô#€HØ"˜Ð"Ð"€GØ%˜GÐ%Ð%€Kå˜‘O”O lÑ2€MØ×Ò ¨tÐÑ4Ô4Ð4à˜gÑ%€Gõ �Y‘” ,Ñ.€IØ!€Mð;Ø,5×,<Ò,<Ñ,>Ô,>ÐF�9×&Ò&Ñ(Ô(Ð(ÀBˆØ × 3Ò 3Ñ 5Ô 5Ð5Ð5Ý�i Ñ%Ô%ð .¨Øð " H×$5Ò$5°dÑ$;Ô$;ð "Ø—G’G˜D‘M”M�MØ—’˜=Ð,Ð,Ð,Ñ-Ô-Ð-ð.ð .ð .ñ .ô .ð .ð .ð .ð .ð .ð .øøøð .ð .ð .ð .øøõ ð ;ð ;ð ;Ý�ŠÐ6¸Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:øøøøð;øøøð
Ø—’Ø�J ¥s¨7¡|¤|°T¸;ÈÐOØ d°B¸Ið  ñ 
ô 
ˆð Ô Ò!Ð!ÝÐZ¸F¼M×<OÒ<OÑ<QÔ<QÐZÐZÐZÑ[Ô[Ð[Ø�4ð "øõ ð ð ð ÝÐB¸ÐBÐBÐBÑCÔCÐCØˆtˆtˆtˆtˆtøøøøðøøøõ
 ˜	‘?”?Ð%7Ñ7€LØ×ÒÑÔñ "Jð!	JÝ!% i¡¤×!8Ò!8Ñ!:Ô!:ÐØ&ŸšÑ0Ô0ÐØ$×.Ò.Ñ0Ô0×;Ò;Ñ=Ô=ð @ñ @�ØŸ
š
™œ�Øð  × 0Ò 0°Ñ 5Ô 5ð ØÝ˜9‘o”o¨Ñ-�Ø ‘o�ðØ#&§;¢;°e ;Ñ#<Ô#<�LØ#&§;¢;°e ;Ñ#<Ô#<�L�LøÝ¥Ð,ð ð ð Ý—L’LÐ!NÐPUÑVÔVÐVØ�Hðøøøõ ,¨LÐ:LÑMÔMð Ý—N’NÐ#ZÐ\aÑbÔbÐbØÝ+¨LÐ:JÑKÔKð Ý—N’NÐ#^Ð`eÑfÔfÐfØØ—;’;‘=”=ð @Ø”J×$Ò$¨T¸DÐ$ÑAÔAÐAÝ”L¥ S¡¤­3¨s©8¬8Ñ4Ô4Ð4Ñ4Ø—Z’Z‘\”\ð @àŸ:š:™<œ<ð @Øœ
×(Ò(°ÀÐ(ÑEÔEÐEÝœ
¥3 |Ñ#4Ô#4µc¸#±h´hÑ?Ô?Ð?ùð9@øõ: ð 	Jð 	Jð 	JÝ�LŠLÐEÀqÑIÔIÐIÐIÐIÐIÐIÐIøøøøð	Jøøøõ �G‘”ØØðð €Dõ 
Ð
;°'Ð
;Ð
;Ñ<Ô<Ð<Ý	Ð
$�{Ð
$Ð
$Ñ%Ô%Ð%à€Ks•   Â$AE Ã4AEÄ9E ÅE	Å	E ÅE	ÅE Å
F ÅE;Å;F ÆA#G* Ç*
HÇ4HÈHÈ=B!Q- Ë,LÌQ- Ì,L;Ì8Q- Ì:L;Ì;D1Q- Ñ-
RÑ7RÒRrÜ  c                 ó  — | pt           } | sdS ddl}| d         }| d         }| d         }t          |¦  «                             ¦   «         sdS d}	 |                     g d¢ddd	|¬
¦  «        }t          |j                             ¦   «         ¦  «        }n# t          $ r d}Y nw xY w|r)t          d|› d�¦  «         t          d|› �¦  «         da dS 	 |                     ddd|dgddd|¬
¦  «         n2# t          $ r%}t                               d|¦  «         Y d}~nd}~ww xY w	 |                     ddd|gddd	|¬
¦  «         n3# t          $ r&}t                               d||¦  «         Y d}~nd}~ww xY wda t          d|› d�¦  «         dS )u;  Remove a worktree and its branch on exit.

    Preserves the worktree only if it has unpushed commits (real work
    that hasn't been pushed to any remote).  Uncommitted changes alone
    (untracked files, test artifacts) are not enough to keep it â€” agent
    work lives in commits/PRs, not the working tree.
    Nr   rw   r¸  r¨  F©r›  Úlogz	--oneliner²  z--notz	--remotesTé
   r´  u2   
[33mâš  Worktree has unpushed commits, keeping: rµ  z4  To clean up manually: git worktree remove --force r›  r±  Úremoveú--forceé   zFailed to remove worktree: %sú-DzFailed to delete branch %s: %su   [32mâœ“ Worktree cleaned up: )r™  rž  r   rp   rŸ  Úboolr¡  rG   rv   r¹  rq   rÂ  )rÜ  rž  rÏ  r¸  r¨  Úhas_unpushedr€   rz   s           rK   Ú_cleanup_worktreerè  ƒ  sQ  € ð Ð#Õ#€DØð ØˆàÐÐÐà�6Œl€GØ�(Œ^€FØ�[Ô!€Iå�‰=Œ=×ÒÑ!Ô!ð Øˆð
 €LðØ—’ØEÐEÐEØ d°B¸Gð  ñ 
ô 
ˆõ ˜FœM×/Ò/Ñ1Ô1Ñ2Ô2ˆˆøÝð ð ð Øˆˆˆðøøøð ð ÝÐWÀwÐWÐWÐWÑXÔXÐXÝÐNÀWÐNÐNÑOÔOÐOØÐØˆð9Ø�ŠØ�J ¨'°9Ð=Ø d°B¸Ið 	ñ 	
ô 	
ð 	
ð 	
øõ ð 9ð 9ð 9Ý�ŠÐ4°aÑ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8øøøøð9øøøðBØ�ŠØ�H˜d FÐ+Ø d°B¸Ið 	ñ 	
ô 	
ð 	
ð 	
øõ ð Bð Bð BÝ�ŠÐ5°v¸qÑAÔAÐAÐAÐAÐAÐAÐAøøøøðBøøøð ÐÝ	Ð
>¨gÐ
>Ð
>Ð
>Ñ?Ô?Ð?Ð?Ð?sC   ÁAB ÂB"Â!B"ÃC1 Ã1
D Ã;DÄD Ä$E Å
E3ÅE.Å.E3c           
      óæ  — | €dS 	 ddl m}  |¦   «                              d¦  «        pi }|                     dd¦  «        sdS |                      t	          |                     dd¦  «        ¦  «        t	          |                     d	d
¦  «        ¦  «        t          |                     dd¦  «        ¦  «        ¬¦  «         dS # t          $ r&}t                               d|¦  «         Y d}~dS d}~ww xY w)uä  Call ``SessionDB.maybe_auto_prune_and_vacuum`` using current config.

    Reads the ``sessions:`` section from config.yaml via
    :func:`hermes_cli.config.load_config` (the authoritative loader that
    deep-merges DEFAULT_CONFIG, so unmigrated configs still get default
    values). Honours ``auto_prune`` / ``retention_days`` /
    ``vacuum_after_prune`` / ``min_interval_hours``, and delegates to the
    DB. Never raises â€” maintenance must never block interactive startup.
    Nr   ©Úload_configÚsessionsÚ
auto_pruneFÚretention_daysrÕ   Úmin_interval_hoursé   Úvacuum_after_pruneT)rî  rï  Úvacuumz%state.db auto-maintenance skipped: %s)	r>  rë  rT   Úmaybe_auto_prune_and_vacuumÚintræ  rv   rq   rÂ  )Ú
session_dbÚ_load_full_configÚcfgÚexcs       rK   Ú_run_state_db_auto_maintenancerù  Ã  s$  € ð ÐØˆðCØFÐFÐFÐFÐFÐFØ Ð Ñ"Ô"×&Ò& zÑ2Ô2Ð8°bˆØ�wŠw�| UÑ+Ô+ð 	ØˆFØ×.Ò.Ý˜sŸwšwÐ'7¸Ñ<Ô<Ñ=Ô=Ý" 3§7¢7Ð+?ÀÑ#DÔ#DÑEÔEÝ˜ŸšÐ 4°dÑ;Ô;Ñ<Ô<ð 	/ñ 	
ô 	
ð 	
ð 	
ð 	
øõ
 ð Cð Cð CÝ�ŠÐ<¸cÑBÔBÐBÐBÐBÐBÐBÐBÐBøøøøðCøøøs   †;C  ÁA;C  Ã 
C0Ã
C+Ã+C0rð  Úmax_age_hoursc           
      óf  — ddl }ddl}t          | ¦  «        dz  }|                     ¦   «         st	          | ¦  «         dS  |j        ¦   «         }||dz  z
  }||dz  dz  z
  }|                     ¦   «         D �]ª}|                     ¦   «         r|j                             d¦  «        sŒ2	 | 	                    ¦   «         j
        }	|	|k    rŒSn# t          $ r Y Œ`w xY w|	|k    }
|
sU	 |                     g d¢ddd	t          |¦  «        ¬
¦  «        }|j                             ¦   «         rŒ°n# t          $ r Y Œ½w xY w	 |                     g d¢ddd	t          |¦  «        ¬
¦  «        }|j                             ¦   «         }|                     dddt          |¦  «        dgddd| ¬
¦  «         |r|                     ddd|gddd| ¬
¦  «         t                                d|j        |
¦  «         �Œs# t          $ r,}t                                d|j        |¦  «         Y d}~�Œ¤d}~ww xY wt	          | ¦  «         dS )u~  Remove stale worktrees and orphaned branches on startup.

    Age-based tiers:
    - Under max_age_hours (24h): skip â€” session may still be active.
    - 24hâ€“72h: remove if no unpushed commits.
    - Over 72h: force remove regardless (nothing should sit this long).

    Also prunes orphaned ``hermes/*`` and ``pr-*`` local branches that
    have no corresponding worktree.
    r   Nr¬  é  é   r«  rß  Trœ  r´  ©r›  r¸  z--show-currentr›  r±  râ  rã  rä  r¸  rå  rá  z$Pruned stale worktree: %s (force=%s)zFailed to prune worktree %s: %s)rž  Útimer   rp   Ú_prune_orphaned_branchesÚiterdirrÉ  r    rÅ  ÚstatÚst_mtimerv   rŸ  rU   r¡  rG   rq   rÂ  )r¨  rú  rž  rÿ  rÎ  ÚnowÚsoft_cutoffÚhard_cutoffr×  ÚmtimeÚforcer€   Úbranch_resultr¸  rz   s                  rK   Ú_prune_stale_worktreesr
  Ý  sÕ  € ð ÐÐÐØ€K€K€Kå˜‘O”O lÑ2€MØ×ÒÑ!Ô!ð Ý  Ñ+Ô+Ð+Øˆà
ˆ$Œ)‰+Œ+€CØ˜¨Ñ-Ñ.€KØ˜¨Ñ*¨TÑ1Ñ2€Kà×&Ò&Ñ(Ô(ð -Kñ -KˆØ�|Š|‰~Œ~ð 	 U¤Z×%:Ò%:¸9Ñ%EÔ%Eð 	Øð	Ø—J’J‘L”LÔ)ˆEØ�{Ò"Ð"Øð #øåð 	ð 	ð 	ØˆHð	øøøð ˜Ò$ˆàð 
	ðØ#ŸšØMÐMÐMØ#'¨d¸AÅ3ÀuÁ:Ä:ð (ñ ô �ð ”=×&Ò&Ñ(Ô(ð Øðøåð ð ð Ø�ðøøøð	KØ&ŸNšNØ3Ð3Ð3Ø#¨$¸½sÀ5¹z¼zð +ñ ô ˆMð #Ô)×/Ò/Ñ1Ô1ˆFà�NŠNØ˜
 H­c°%©j¬j¸)ÐDØ#¨$¸À	ð ñ ô ð ð ð Ø—’Ø˜H d¨FÐ3Ø#'¨d¸BÀIð ñ ô ð õ �LŠLÐ?ÀÄÈUÑSÔSÐSÑSøÝð 	Kð 	Kð 	KÝ�LŠLÐ:¸E¼JÈÑJÔJÐJÐJÐJÐJÐJÑJøøøøð	Køøøõ ˜YÑ'Ô'Ð'Ð'Ð's>   Â)C
Ã

CÃCÃ#AD'Ä'
D4Ä3D4Ä8B/G)Ç)
HÇ3!HÈHc                 ó®  ‡— ddl }	 |                     g d¢ddd| ¬¦  «        }|j        dk    rdS d„ |j                             ¦   «                              d¦  «        D ¦   «         }n# t          $ r Y dS w xY wt          ¦   «         Š	 |                     g d	¢ddd| ¬¦  «        }|j                             d¦  «        D ]X}|                     d
¦  «        rA‰ 	                    |                     d
d¦  «        d                              ¦   «         ¦  «         ŒYn# t          $ r Y dS w xY w	 |                     g d¢ddd| ¬¦  «        }|j                             ¦   «         }|r‰ 	                    |¦  «         n# t          $ r Y nw xY w‰ 	                    d¦  «         ˆfd„|D ¦   «         }|sdS t          dt          |¦  «        d¦  «        D ]a}	||	|	dz   …         }
	 |                     g d¢|
z   ddd| ¬¦  «         Œ0# t          $ r%}t                               d|¦  «         Y d}~ŒZd}~ww xY wt                               dt          |¦  «        ¦  «         dS )zûDelete local ``hermes/hermes-*`` and ``pr-*`` branches with no worktree.

    These are auto-generated by ``hermes -w`` sessions and PR review
    workflows respectively.  Once their worktree is gone they serve no
    purpose and just accumulate.
    r   N)r›  r¸  z--format=%(refname:short)Trá  r´  c                 ó^   — g | ]*}|                      ¦   «         ¯|                      ¦   «         ‘Œ+S r]   ©rG   )rW   Úbs     rK   rY   z,_prune_orphaned_branches.<locals>.<listcomp>6  s2   € ÐZÐZÐZ aÐPQ×PWÒPWÑPYÔPYÐZ˜Ÿš™	œ	ÐZÐZÐZrM   rZ   )r›  r±  ra   z--porcelainzbranch refs/heads/é   éÿÿÿÿrþ  rœ  Úmainc                 óp   •— g | ]2}|‰v¯|                      d ¦  «        s|                      d¦  «        ¯0|‘Œ3S )zhermes/hermes-zpr-©rÅ  )rW   r  Úactive_branchess     €rK   rY   z,_prune_orphaned_branches.<locals>.<listcomp>T  sW   ø€ ð ð ð ØØ�OÐ#Ð#Ø�\Š\Ð*Ñ+Ô+ð $Ø/0¯|ª|¸EÑ/BÔ/Bð $ð 	
Ø#Ð#Ð#rM   ró   )r›  r¸  rå  r³  z%Failed to prune orphaned branches: %szPruned %d orphaned branches)rž  rŸ  r   r¡  rG   Úsplitrv   r´   rÅ  r—   ÚrangeÚlenrq   rÂ  )r¨  rž  r€   Úall_branchesÚ	wt_resultrÖ  Úhead_resultÚcurrentÚorphanedÚiÚbatchrz   r  s               @rK   r   r   &  s(  ø€ ð ÐÐÐð	Ø—’Ø:Ð:Ð:Ø d°B¸Ið  ñ 
ô 
ˆð Ô Ò!Ð!ØˆFØZÐZ¨6¬=×+>Ò+>Ñ+@Ô+@×+FÒ+FÀtÑ+LÔ+LÐZÑZÔZˆˆøÝð ð ð Øˆˆðøøøõ ™5œ5€Oð	Ø—N’NØ6Ð6Ð6Ø d°B¸Ið #ñ 
ô 
ˆ	ð Ô$×*Ò*¨4Ñ0Ô0ð 	Uð 	UˆDØ�ŠÐ3Ñ4Ô4ð UØ×#Ò# D§J¢JÐ/CÀQÑ$GÔ$GÈÔ$K×$QÒ$QÑ$SÔ$SÑTÔTÐTøð	Uøõ ð ð ð Øˆˆðøøøð	Ø —n’nØ/Ð/Ð/Ø d°A¸9ð %ñ 
ô 
ˆð Ô$×*Ò*Ñ,Ô,ˆØð 	)Ø×Ò Ñ(Ô(Ð(øøÝð ð ð Øˆðøøøà×Ò˜ÑÔÐðð ð ð Øðñ ô €Hð ð Øˆõ �1•c˜(‘m”m RÑ(Ô(ð Eð EˆØ˜˜1˜r™6˜Ô"ˆð	EØ�NŠNØ'Ð'Ð'¨%Ñ/Ø#¨$¸À	ð ñ ô ð ð øõ ð 	Eð 	Eð 	EÝ�LŠLÐ@À!ÑDÔDÐDÐDÐDÐDÐDÐDøøøøð	Eøøøõ ‡L‚LÐ.µ°H±´Ñ>Ô>Ð>Ð>Ð>sT   ‡'A' °6A' Á'
A5Á4A5ÂBD Ä
D%Ä$D%Ä)AE6 Å6
FÆFÇG;Ç;
H*ÈH%È%H*z[1;38;2;255;215;0mz[1mrµ  ú    ©ÚboldÚ	hex_colorr!  c          	      ó  — 	 t          | dd…         d¦  «        }t          | dd…         d¦  «        }t          | dd…         d¦  «        }|rdnd}d|› d	|› d
|› d
|› d�	S # t          t          f$ r |rt          ndcY S w xY w)z?Convert a hex color like '#268bd2' to a true-color ANSI escape.r  rý  é   rœ  é   z1;r:   z[z38;2;ú;Úmz[38;2;184;134;11m)rô  r¦  Ú
IndexErrorÚ_ACCENT_ANSI_DEFAULT)r"  r!  ri   Úgr  Úprefixs         rK   Ú_hex_to_ansir,  |  sÀ   € ðIÝ�	˜!˜A˜#” Ñ#Ô#ˆÝ�	˜!˜A˜#” Ñ#Ô#ˆÝ�	˜!˜A˜#” Ñ#Ô#ˆØÐ%�� 2ˆØ0�vÐ0Ð0 AÐ0Ð0¨Ð0Ð0¨AÐ0Ð0Ð0Ð0øÝ�
Ð#ð Ið Ið IØ'+ÐHÕ#Ð#Ð1HÐHÐHÐHðIøøøs   ‚AA ÁA>Á=A>c                   ób   — e Zd ZdZdddœdededefd„Zd	efd
„Zded	efd„Zded	efd„Z	dd„Z
dS )Ú_SkinAwareAnsizÄLazy ANSI escape that resolves from the skin engine on first use.

    Acts as a string in f-strings and concatenation.  Call ``.reset()`` to
    force re-resolution after a ``/skin`` switch.
    ú#FFD700Fr   Úskin_keyÚfallback_hexr!  c                ó>   — || _         || _        || _        d | _        d S r\   )Ú	_skin_keyÚ_fallback_hexÚ_boldÚ_cached)Úselfr0  r1  r!  s       rK   Ú__init__z_SkinAwareAnsi.__init__�  s#   € Ø!ˆŒØ)ˆÔØˆŒ
Ø#'ˆŒˆˆrM   r7   c                 ó  — | j         €y	 ddlm} t           |¦   «                              | j        | j        ¦  «        | j        ¬¦  «        | _         n0# t          $ r# t          | j        | j        ¬¦  «        | _         Y nw xY w| j         S )Nr   ©Úget_active_skinr   )	r6  Úhermes_cli.skin_enginer;  r,  Ú	get_colorr3  r4  r5  rv   )r7  r;  s     rK   Ú__str__z_SkinAwareAnsi.__str__•  s¥   € ØŒ<ÐðQØBÐBÐBÐBÐBÐBÝ+Ø#�OÑ%Ô%×/Ò/°´ÀÔ@RÑSÔSØœð ñ  ô  �”�øõ ð Qð Qð QÝ+¨DÔ,>ÀTÄZÐPÑPÔP�”��ðQøøøàŒ|Ðs   ‰AA Á*A>Á=A>Úotherc                 ó&   — t          | ¦  «        |z   S r\   ©rU   ©r7  r?  s     rK   Ú__add__z_SkinAwareAnsi.__add__¡  s   € Ý�4‰yŒy˜5Ñ Ð rM   c                 ó&   — |t          | ¦  «        z   S r\   rA  rB  s     rK   Ú__radd__z_SkinAwareAnsi.__radd__¤  s   € Ø•s˜4‘y”yÑ Ð rM   Nc                 ó   — d| _         dS )z1Clear cache so the next access re-reads the skin.N)r6  ©r7  s    rK   Úresetz_SkinAwareAnsi.reset§  s   € àˆŒˆˆrM   )r/  ©r7   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rU   ræ  r8  r>  rC  rE  rH  r]   rM   rK   r.  r.  ˆ  sÌ   € € € € € ðð ð(ÐUZð (ð (ð ( ð (°Cð (Èdð (ð (ð (ð (ð
˜ð 
ð 
ð 
ð 
ð!˜Sð ! Sð !ð !ð !ð !ð!˜cð ! cð !ð !ð !ð !ðð ð ð ð ð rM   r.  Úresponse_borderr/  TÚ
banner_dimú#B8860Bc                  ón   — 	 ddl m}   | ¦   «                              dd¦  «        S # t          $ r Y dS w xY w)z@Return the active skin accent color for legacy CLI output lines.r   r:  Ú	ui_accentú#FFBF00)r<  r;  r=  rv   r:  s    rK   Ú_accent_hexrT  °  sY   € ðØ:Ð:Ð:Ð:Ð:Ð:ØˆÑ Ô ×*Ò*¨;¸	ÑBÔBÐBøÝð ð ð Øˆyˆyðøøøs   ‚#& ¦
4³4c                 ó.   — t          j        | pd¦  «        S )zÑSafely render assistant/tool output that may contain ANSI escapes.

    Using Rich Text.from_ansi preserves literal bracketed text like
    ``[not markup]`` while still interpreting real ANSI color codes.
    r:   )Ú	_RichTextÚ	from_ansi©r6   s    rK   Ú_rich_text_from_ansirY  ¹  s   € õ Ô˜t˜z rÑ*Ô*Ð*rM   c                 óð  — t          | pd¦  «        j        }t          j        dd|t          j        ¬¦  «        }t          j        dd|t          j        ¬¦  «        }t          j        dd|¦  «        }t          j        dd|¦  «        }t          j        dd|¦  «        }t          j        d	d|¦  «        }t          j        d
d|¦  «        }t          j        dd|¦  «        }t          j        dd|¦  «        }t          j        dd|¦  «        }t          j        dd|¦  «        }t          j        dd|¦  «        }t          j        dd|¦  «        }t          j        dd|¦  «        }|                     d¦  «        S )z;Best-effort markdown marker removal for plain-text display.r:   z^\s{0,3}(?:[-*_]\s*){3,}$r;   z^\s{0,3}#{1,6}\s+z(```+|~~~+)z	`([^`]*)`ú\1z!\[([^\]]*)\]\([^\)]*\)z\[([^\]]+)\]\([^\)]*\)z\*\*\*([^*]+)\*\*\*z(?<!\w)___([^_]+)___(?!\w)z\*\*([^*]+)\*\*z(?<!\w)__([^_]+)__(?!\w)z\*([^*]+)\*z(?<!\w)_([^_]+)_(?!\w)z~~([^~]+)~~ú\n{3,}ú

rZ   )rY  ÚplainrC   rD   Ú	MULTILINErG   )r6   r^  s     rK   Ú_strip_markdown_syntaxr`  Â  sI  € å   ¨Ñ,Ô,Ô2€EÝŒFÐ/°°UÅ"Ä,ÐOÑOÔO€EÝŒFÐ'¨¨U½"¼,ÐGÑGÔG€EåŒF�> 2 uÑ-Ô-€EÝŒF�< ¨Ñ.Ô.€EÝŒFÐ-¨u°eÑ<Ô<€EÝŒFÐ,¨e°UÑ;Ô;€EÝŒFÐ)¨5°%Ñ8Ô8€EÝŒFÐ0°%¸Ñ?Ô?€EÝŒFÐ% u¨eÑ4Ô4€EÝŒFÐ.°°uÑ=Ô=€EÝŒF�> 5¨%Ñ0Ô0€EÝŒFÐ,¨e°UÑ;Ô;€EÝŒF�> 5¨%Ñ0Ô0€EÝŒF�9˜f eÑ,Ô,€EØ�;Š;�tÑÔÐrM   Úrenderre  c                 ó,  — ddl m} t          |pd¦  «                             ¦   «                              ¦   «         }|dk    rt          t          | ¦  «        ¦  «        S |dk    rt          | pd¦  «        S t          | pd¦  «        j        } ||¦  «        S )zGRender final assistant content as markdown, stripped text, or raw text.r   )ÚMarkdownra  rG   r‚   r:   )	Úrich.markdownrc  rU   rG   rŒ   rV  r`  rY  r^  )r6   re  rc  Únormalized_moder^  s        rK   Ú_render_final_assistant_contentrf  ×  sŸ   € à&Ð&Ð&Ð&Ð&Ð&å˜$Ð* (Ñ+Ô+×1Ò1Ñ3Ô3×9Ò9Ñ;Ô;€OØ˜'Ò!Ð!ÝÕ/°Ñ5Ô5Ñ6Ô6Ð6Ø˜%ÒÐÝ# D J¨BÑ/Ô/Ð/å   ¨Ñ,Ô,Ô2€EØˆ8�E‰?Œ?ÐrM   c                 ó>   — t          t          | ¦  «        ¦  «         dS )a  Print ANSI-colored text through prompt_toolkit's native renderer.

    Raw ANSI escapes written via print() are swallowed by patch_stdout's
    StdoutProxy.  Routing through print_formatted_text(ANSI(...)) lets
    prompt_toolkit parse the escapes and render real colors.
    N)Ú	_pt_printÚ_PT_ANSIrX  s    rK   Ú_cprintrj  å  s   € õ �h�t‰nŒnÑÔÐÐÐrM   >
   ú.bmpú.gifú.icoú.jpgú.svgú.tifú.jpegú.tiffú.webpú.png)Ú	is_termuxúcat.pngÚfilenamec                 ó  — t           j                             d¦  «        dddg}|D ]D}t           j                             |¦  «        r#t           j                             |d| ¦  «        c S ŒEt           j                             dd| ¦  «        S )zCReturn a realistic example media path for the current Termux setup.z~/storage/sharedz/sdcardz/storage/emulated/0z/storage/self/primaryÚPictures)r’   rw   rm   Úisdirrb   )rw  r™   r£  s      rK   Ú_termux_example_image_pathr{  ü  s‹   € õ 	Œ×ÒÐ-Ñ.Ô.ØØØð	€Jð ð <ð <ˆÝŒ7�=Š=˜ÑÔð 	<Ý”7—<’<  j°(Ñ;Ô;Ð;Ð;Ð;ð	<åŒ7�<Š<Ð*¨J¸ÑAÔAÐArM   c                 óö  — t          | pd¦  «                             ¦   «         } | sdS | d         dv rž| d         }d}|t          | ¦  «        k     ru| |         }|dk    r|dz   t          | ¦  «        k     r|dz  }Œ=||k    r-| d|…         }| |dz   d…                              ¦   «         }||fS |dz  }|t          | ¦  «        k     °u| dd…         dfS d}|t          | ¦  «        k     rX| |         }|dk    r+|dz   t          | ¦  «        k     r| |dz            d	k    r|dz  }n|d	k    rn|dz  }|t          | ¦  «        k     °X| d|…                              d
d	¦  «        }| |d…                              ¦   «         }||fS )a6  Split a leading file path token from trailing free-form text.

    Supports quoted paths and backslash-escaped spaces so callers can accept
    inputs like:
      /tmp/pic.png describe this
      ~/storage/shared/My\ Photos/cat.png what is this?
      "/storage/emulated/0/DCIM/Camera/cat 1.png" summarize
    r:   )r:   r:   r   ¾   ú"ú'r  ú\é   NÚ ú\ )rU   rG   r  Úreplace)r‚   ÚquoteÚposÚchÚtokenÚ	remainders         rK   Ú_split_path_inputrŠ  
  s´  € õ ˆcˆi�R‰.Œ.×
Ò
Ñ
 Ô
 €CØð Øˆvà
ˆ1„v�ÐÐØ�A”ˆØˆØ•C˜‘H”HŠnˆnØ�S”ˆBØ�TŠzˆz˜c A™g­¨C©¬Ò0Ð0Ø�q‘�ØØ�UŠ{ˆ{Ø˜A˜c˜Eœ
�Ø  a¡ 	 	œN×0Ò0Ñ2Ô2�	Ø˜iÐ'Ð'Ø�1‰HˆCð •C˜‘H”HŠnˆnð �1�2�2Œw˜ˆ{Ðà
€CØ
•�C‘”Š.ˆ.Ø�ŒXˆØ�Š:ˆ:˜# ™'¥C¨¡H¤HÒ,Ð,°°S¸1±W´ÀÒ1DÐ1DØ�1‰HˆCˆCØ�3ŠYˆYØà�1‰HˆCð •�C‘”Š.ˆ.ð ���ŒI×Ò˜e SÑ)Ô)€EØ�C�D�D”	—’Ñ!Ô!€IØ�)ÐÐrM   Úraw_pathc                 ó\  — t          | pd¦  «                             ¦   «         }|sdS |                     d¦  «        r|                     d¦  «        s*|                     d¦  «        r1|                     d¦  «        r|dd…                              ¦   «         }|                     dd¦  «        }|sdS |}|                     d	¦  «        rg	 t          |¦  «        }|j        d
k    r9t          |j        pd¦  «        }|j	        rt          j        dk    rd|j	        › |› �}n# t          $ r |}Y nw xY wt          j                             t          j                             |¦  «        ¦  «        }t          j        dk    rƒ|                     dd¦  «        }t          |¦  «        dk    rZ|d         dk    rN|d         dk    rB|d                              ¦   «         r(d|d                              ¦   «         › d|dd…         › �}t%          |¦  «        }|                     ¦   «         s8t%          t          j        dt          j        ¦   «         ¦  «        ¦  «        }||z  }	 |                     ¦   «         }n# t          $ r |}Y nw xY w|                     ¦   «         r|                     ¦   «         sdS |S )a  Resolve a user-supplied local attachment path.

    Accepts quoted or unquoted paths, expands ``~`` and env vars, and resolves
    relative paths from ``TERMINAL_CWD`` when set (matching terminal tool cwd).
    Returns ``None`` when the path does not resolve to an existing file.
    r:   Nr~  r  r  r  rƒ  r‚  úfile://ÚfileÚntz//r€  ú/rý  ú:r�  r   z/mnt/r  )rU   rG   rÅ  rÀ  r„  r   Úschemer   rw   Únetlocr’   r    rv   Ú
expandvarsrm   r  ÚisalpharŒ   r   rn   Úgetenvr@  rÄ  rp   rÇ  )r‹  rˆ  ÚexpandedÚparsedr˜   rw   Úbase_dirÚresolveds           rK   Ú_resolve_attachment_pathr›  5  s¼  € õ ��˜BÑÔ×%Ò%Ñ'Ô'€EØð Øˆtà×Ò˜ÑÔð $ %§.¢.°Ñ"5Ô"5ð $¸5×;KÒ;KÈCÑ;PÔ;Pð $ÐUZ×UcÒUcÐdgÑUhÔUhð $Ø�a˜�d”×!Ò!Ñ#Ô#ˆØ�MŠM˜% Ñ%Ô%€EØð Øˆtà€HØ×Ò˜	Ñ"Ô"ð ð	Ý˜e‘_”_ˆFØŒ} Ò&Ð&Ý" 6¤;Ð#4°"Ñ5Ô5�Ø”=ð >¥R¤W°¢_ _Ø= F¤MÐ=°8Ð=Ð=�HøøÝð 	ð 	ð 	ØˆHˆHˆHð	øøøåŒw×!Ò!¥"¤'×"4Ò"4°XÑ">Ô">Ñ?Ô?€HÝ	„w�$‚€Ø×%Ò% d¨CÑ0Ô0ˆ
Ýˆz‰?Œ?˜aÒÐ J¨q¤M°SÒ$8Ð$8¸ZÈ¼]ÈcÒ=QÐ=QÐV`ÐabÔVc×VkÒVkÑVmÔVmÐ=QØG˜z¨!œ}×2Ò2Ñ4Ô4ÐGÐG°zÀ!À"À"´~ÐGÐGˆHÝ�‰>Œ>€DØ×ÒÑÔð Ý�œ	 .µ"´)±+´+Ñ>Ô>Ñ?Ô?ˆØ˜$‰ˆðØ—<’<‘>”>ˆˆøÝð ð ð Øˆˆˆðøøøð �?Š?ÑÔð  H×$4Ò$4Ñ$6Ô$6ð ØˆtØ€Os%   Ã
AD ÄD-Ä,D-ÉI0 É0I?É>I?Úevtz
str | Nonec           	      ó  — |                       dd¦  «        }|                       dd¦  «        }|                       dd¦  «        }|dk    rd|                       dd	¦  «        › d
�S |dk    rb|                       dd¦  «        }|                       dd	¦  «        }|                       dd¦  «        }d|› d|› d|› d|› �}|r	|d|› d�z  }|d
z  }|S |                       dd¦  «        }|                       dd	¦  «        }d|› d|› d|› d|› d
�	S )zÈFormat a process notification event into a [IMPORTANT: ...] message.

    Handles both completion events (notify_on_complete) and watch pattern
    match events from the unified completion_queue.
    rQ   Ú
completionrŠ  ÚunknownÚcommandÚwatch_disabledz[IMPORTANT: Úmessager:   ú]Úwatch_matchÚpatternú?ÚoutputÚ
suppressedr   z[IMPORTANT: Background process z matched watch pattern "z".
Command: z
Matched output:
z
(z/ earlier matches were suppressed by rate limit)Ú	exit_codez completed (exit code z).
Command: z	
Output:
©rT   )	rœ  Úevt_typeÚ_sidÚ_cmdÚ_patÚ_outÚ_supr6   Ú_exits	            rK   Ú_format_process_notificationr²  d  s†  € ð �wŠw�v˜|Ñ,Ô,€HØ�7Š7�< Ñ+Ô+€DØ�7Š7�9˜iÑ(Ô(€DàÐ#Ò#Ð#Ø7˜cŸgšg i°Ñ4Ô4Ð7Ð7Ð7Ð7à�=Ò Ð Ø�wŠw�y #Ñ&Ô&ˆØ�wŠw�x Ñ$Ô$ˆØ�wŠw�| QÑ'Ô'ˆð'¨dð 'ð 'Ø#ð'ð 'àð'ð 'ð !%ð'ð 'ð 	ð ð 	PØÐO˜$ÐOÐOÐOÑOˆDØ�‰ˆØˆð �GŠG�K Ñ%Ô%€EØ�7Š7�8˜RÑ Ô €Dð	¨$ð 	ð 	Øð	ð 	àð	ð 	ð ð	ð 	ð 	ðrM   Ú
user_inputzdict | Nonec                 ó  — t          | t          ¦  «        sdS |                      ¦   «         }|sdS |                     d¦  «        �p9|                     d¦  «        �p#|                     d¦  «        �p|                     d¦  «        pø|                     d¦  «        pãt	          |¦  «        dk    o/|d         d	k    o#|d
         dv o|d                              ¦   «         p |                     d¦  «        p‹|                     d¦  «        pv|                     d¦  «        pa|                     d¦  «        pLt	          |¦  «        dk    o9|d         dv o/|d
         d	k    o#|d         dv o|d                              ¦   «         }|sdS t          |¦  «        }|�$||j                             ¦   «         t          v ddœS t          |¦  «        \  }}t          |¦  «        }|€‰d|v r…|d         dvr{d„ t          |¦  «        D ¦   «         }t          |¦  «        D ]R}|d|…                              ¦   «         }	t          |	¦  «        }
|
�#|
}||dz   d…                              ¦   «         } nŒS|€dS ||j                             ¦   «         t          v |dœS )a
  Detect if *user_input* starts with a real local file path.

    This catches dragged/pasted paths before they are mistaken for slash
    commands, and also supports Termux-friendly paths like ``~/storage/...``.

    Returns a dict on match::

        {
            "path": Path,          # resolved file path
            "is_image": bool,      # True when suffix is a known image type
            "remainder": str,      # any text after the path
        }

    Returns ``None`` when the input is not a real file path.
    Nr�  Ú~z./z../r�  rý  r  r‘  r�  )r€  r�  r   z"/z"~z'/z'~é   )r  r~  r:   )rw   Úis_imager‰  r‚  r}  c                 ó$   — g | ]\  }}|d k    ¯|‘ŒS )r‚  r]   )rW   Úidxr‡  s      rK   rY   z%_detect_file_drop.<locals>.<listcomp>½  s!   € ÐOÐOÐO¡7 3¨ÀRÈ3ÂYÀY˜3ÀYÀYÀYrM   )rR   rU   rG   rÅ  r  r•  r›  ÚsuffixrŒ   Ú_IMAGE_EXTENSIONSrŠ  Ú	enumerateÚreversedÚrstrip)r³  ÚstrippedÚstarts_like_pathÚdirect_pathÚfirst_tokenr‰  Ú	drop_pathÚspace_positionsr†  Ú	candidaterš  s              rK   Ú_detect_file_droprÆ  ‹  s3  € õ  �j¥#Ñ&Ô&ð Øˆtà×ÒÑ!Ô!€HØð Øˆtð 	×Ò˜CÑ Ô ñ 
	NØ×Ò˜sÑ#Ô#ñ
	Nà×Ò˜tÑ$Ô$ñ
	Nð ×Ò˜uÑ%Ô%ð
	Nð ×Ò˜yÑ)Ô)ð	
	Nõ
 �‰MŒM˜QÒÐn 8¨A¤;°#Ò#5Ðn¸(À1¼+ÈÐ:TÐnÐYaÐbcÔYd×YlÒYlÑYnÔYnð
	Nð ×Ò˜tÑ$Ô$ð
	Nð ×Ò˜tÑ$Ô$ð
	Nð ×Ò˜tÑ$Ô$ð
	Nð ×Ò˜tÑ$Ô$ð
	Nõ �‰MŒM˜QÒð  M 8¨A¤;°*Ð#<ð  MÀÈ!ÄÐPSÒASð  MÐX`ÐabÔXcÐgrÐXrð  MÐwð  ABô  xC÷  xKò  xKñ  xMô  xMð ð ð Øˆtå*¨8Ñ4Ô4€KØÐàØ#Ô*×0Ò0Ñ2Ô2Õ6GÐGØð
ð 
ð 	
õ /¨xÑ8Ô8Ñ€K�Ý(¨Ñ5Ô5€IØÐ˜S H˜_˜_°¸!´ÀJÐ1NÐ1NØOÐO­i¸Ñ.AÔ.AÐOÑOÔOˆÝ˜OÑ,Ô,ð 	ð 	ˆCØ   # œ×-Ò-Ñ/Ô/ˆIÝ/°	Ñ:Ô:ˆHØÐ#Ø$�	Ø$ S¨1¡W Y YÔ/×5Ò5Ñ7Ô7�	Ø�ð $ð ÐØˆtð ØÔ$×*Ò*Ñ,Ô,Õ0AÐAØðð ð rM   Úattached_imagesÚimage_counterÚwidthc                 ón  ‡— | sdS |pt          j        d¦  «        j        }dt          dt          dt          fd„}|dk     rAt          | ¦  «        dk    rd	 || d
         j        d¦  «        › d�S d	t          | ¦  «        › d�S |dk     r`t          | ¦  «        dk    rd	 || d
         j        d¦  «        › d�S  || d
         j        d¦  «        }t          | ¦  «        dz
  }d	|› d|› d�S |t          | ¦  «        z
  dz   Šd                     ˆfd„t          t          | ¦  «        ¦  «        D ¦   «         ¦  «        S )zßFormat the attached-image badge row for the interactive CLI.

    Narrow terminals such as Termux should get a compact summary that fits on a
    single row, while wider terminals can show the classic per-image badges.
    r:   ©éP   rð  r    Úlimitr7   c                 óh   — t          | ¦  «        |k    r| n| d t          d|dz
  ¦  «        …         dz   S )Nr  rý  ú...)r  Úmax)r    rÍ  s     rK   Ú_truncz/_format_image_attachment_badges.<locals>._truncÚ  s:   € Ý˜4‘y”y EÒ)Ð)ˆtˆt¨tÐ4Gµc¸!¸UÀQ¹YÑ6GÔ6GÐ4GÔ/HÈ5Ñ/PÐPrM   é4   r  u   [ðŸ“Ž r   é   r£  z images attached]rÌ  é    z] [+r‚  c              3   ó*   •K  — | ]}d ‰|z   › d�V — ŒdS )u   [ðŸ“Ž Image #r£  Nr]   )rW   r  r·   s     €rK   r`   z2_format_image_attachment_badges.<locals>.<genexpr>ê  sF   øè è € ð ð àð 	$˜˜q™Ð#Ð#Ð#ðð ð ð ð ð rM   )	rž   Úget_terminal_sizeÚcolumnsrU   rô  r  r    rb   r  )rÇ  rÈ  rÉ  rÑ  ÚfirstÚextrar·   s         @rK   Ú_format_image_attachment_badgesrÚ  Ï  sž  ø€ ð ð ØˆràÐ?•VÔ-¨hÑ7Ô7Ô?€EðQ•Sð Q¥ð Q­ð Qð Qð Qð Qð ˆr‚z€zÝˆÑÔ 1Ò$Ð$ØB˜F˜F ?°1Ô#5Ô#:¸BÑ?Ô?ÐBÐBÐBÐBØ?�˜OÑ,Ô,Ð?Ð?Ð?Ð?àˆr‚z€zÝˆÑÔ 1Ò$Ð$ØB˜F˜F ?°1Ô#5Ô#:¸BÑ?Ô?ÐBÐBÐBÐBØ�� qÔ)Ô.°Ñ3Ô3ˆÝ�OÑ$Ô$ qÑ(ˆØ+˜Ð+Ð+ 5Ð+Ð+Ð+Ð+à�3˜Ñ/Ô/Ñ/°!Ñ3€DØ�8Š8ð ð ð ð å•s˜?Ñ+Ô+Ñ,Ô,ðñ ô ñ ô ð rM   Úpasted_textc                 ó,   — |                       ¦   «          S )z@Auto-attach clipboard images only for image-only paste gestures.r  )rÛ  s    rK   Ú,_should_auto_attach_clipboard_image_on_pasterÝ  ð  s   € à× Ò Ñ"Ô"Ð"Ð"rM   ÚqueryÚ	image_argc                 ór  — | pd}g }t          |t          ¦  «        rZt          |¦  «        }|rI|                     d¦  «        r4|                     |d         ¦  «         |d         pd|d         j        › d�}|rjt          |¦  «        }|€t          d|› �¦  «        ‚|j         	                    ¦   «         t          vrt          d	|› �¦  «        ‚|                     |¦  «         g }t          ¦   «         }|D ]@}t          |¦  «        }	|	|v rŒ|                     |	¦  «         |                     |¦  «         ŒA||fS )
z;Collect local image attachments for single-query CLI flows.r:   r·  rw   r‰  ú[User attached image: r£  NzImage file not found: zNot a supported image file: )rR   rU   rÆ  rT   r–   r    r›  r¦  rº  rŒ   r»  r´   r—   )
rÞ  rß  r¢  ÚimagesÚdroppedÚexplicit_pathÚdedupedrš   ÚimgrM  s
             rK   Ú_collect_query_imagesrç  õ  s^  € àˆk�r€GØ€Få�'�3ÑÔð _Ý# GÑ,Ô,ˆØð 	_�w—{’{ :Ñ.Ô.ð 	_Ø�MŠM˜' &œ/Ñ*Ô*Ð*Ø˜kÔ*Ð^Ð.^ÀwÈvÄÔG[Ð.^Ð.^Ð.^ˆGàð %Ý0°Ñ;Ô;ˆØÐ ÝÐA°iÐAÐAÑBÔBÐBØÔ×%Ò%Ñ'Ô'Õ/@Ð@Ð@ÝÐK¸MÐKÐKÑLÔLÐLØ�Š�mÑ$Ô$Ð$à€GÝ‘U”U€DØð ð ˆÝ�#‰hŒhˆØ�$ˆ;ˆ;ØØ�Š�‰ŒˆØ�Š�sÑÔÐÐØ�GÐÐrM   c                   ó4   — e Zd ZdZd„ Zd„ Zed„ ¦   «         ZdS )ÚChatConsoleuR  Rich Console adapter for prompt_toolkit's patch_stdout context.

    Captures Rich's rendered ANSI output and routes it through _cprint
    so colors and markup render correctly inside the interactive chat loop.
    Drop-in replacement for Rich Console â€” just pass this to any function
    that expects a console.print() interface.
    c                 ój   — ddl m}  |¦   «         | _        t          | j        ddd¬¦  «        | _        d S )Nr   ©ÚStringIOTÚ	truecolorF)rŽ  Úforce_terminalÚcolor_systemÚ	highlight)Úiorì  Ú_bufferrl  Ú_inner)r7  rì  s     rK   r8  zChatConsole.__init__  sI   € ØÐÐÐÐÐØ�x‘z”zˆŒÝØ”ØØ$Øð	
ñ 
ô 
ˆŒˆˆrM   c                 ó|  — | j                              d¦  «         | j                              ¦   «          t          j        d¦  «        j        | j        _         | j        j        |i |¤Ž | j          	                    ¦   «         }| 
                    d¦  «                             d¦  «        D ]}t          |¦  «         Œd S )Nr   rË  rZ   )rò  ÚseekÚtruncaterž   rÖ  r×  ró  rÉ  r¹  Úgetvaluer¾  r  rj  )r7  ÚargsÚkwargsr§  rÖ  s        rK   r¹  zChatConsole.print&  s±   € ØŒ×Ò˜!ÑÔÐØŒ×ÒÑÔÐå"Ô4°XÑ>Ô>ÔFˆŒÔØˆŒÔ˜4Ð* 6Ð*Ð*Ð*Ø”×&Ò&Ñ(Ô(ˆØ—M’M $Ñ'Ô'×-Ò-¨dÑ3Ô3ð 	ð 	ˆDÝ�D‰MŒMˆMˆMð	ð 	rM   c              /   ó   K  — | V — dS )aÝ  Provide a no-op Rich-compatible status context.

        Some slash command helpers use ``console.status(...)`` when running in
        the standalone CLI. Interactive chat routes those helpers through
        ``ChatConsole()``, which historically only implemented ``print()``.
        Returning a silent context manager keeps slash commands compatible
        without duplicating the higher-level busy indicator already shown by
        ``HermesCLI._busy_command()``.
        Nr]   )r7  Ú_argsÚ_kwargss      rK   ÚstatuszChatConsole.status0  s   è è € ð ˆ
ˆ
ˆ
ˆ
ˆ
rM   N)rJ  rK  rL  rM  r8  r¹  r   rý  r]   rM   rK   ré  ré    sW   € € € € € ðð ð
ð 
ð 
ðð ð ð ð
ð 
ñ „^ð
ð 
ð 
rM   ré  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 d}Y nw xY w|rt          |dd¦  «        nd}|r|                     dd¦  «        nd}|r|                     dd	¦  «        nd	}|r|                     d
d¦  «        nd}|dk    rd}d}n!|r|                     dd¦  «        nd}|› d�}|}t          ¦   «         }	t          t          j	        ¦   «         j
        dz
  d¦  «        }
|
dk     rd|› d|› d|› d�S |
dz
  }d|
z  }|dz
  }|d|…                              |¦  «        }|	d|…                              |¦  «        }d|› d|› d|› d|› d|› d|› d|› d|› d|› d|› d|› d |› d!�S )"z<Build a compact banner that fits the current terminal width.r   r:  Nr    r‡   Úbanner_borderr/  Úbanner_titlerS  rO  rP  u$   âš• NOUS HERMES - AI Agent Frameworku   âš• NOUS HERMESÚ
agent_nameúHermes Agentz - AI Agent Frameworkr�  éX   r³  z
[r£  ú	[/] [dim z]- Nous Research[/]
u   â•�z
[bold u   ]â•”u   â•—[/]
[bold u	   ]â•‘[/] [z
[/] [bold u   ]â•‘[/]
[bold u   ]â•‘[/] [dim u   ]â•šu   â•�[/]
)r<  r;  rv   r–  r=  Úget_brandingr*   Úminrž   rÖ  r×  Úljust)r;  Ú_skinÚ	skin_nameÚborder_colorÚtitle_colorÚ	dim_colorÚline1Ú	tiny_liner  Úversion_lineÚwÚinnerÚbarÚcontent_widthÚline2s                  rK   Ú_build_compact_bannerr  X  sa  € ðØ:Ð:Ð:Ð:Ð:Ð:Ø�Ñ!Ô!ˆˆøÝð ð ð Øˆˆˆðøøøð 6;ÐI•˜˜v yÑ1Ô1Ð1À	€IØBGÐV�5—?’? ?°IÑ>Ô>Ð>ÈY€LØ@EÐT�%—/’/ .°)Ñ<Ô<Ð<È9€KØ<AÐP�—’ ¨iÑ8Ô8Ð8Ày€Ià�IÒÐØ6ˆØ%ˆ	ˆ	àINÐb�U×'Ò'¨°nÑEÔEÐEÐTbˆ
ØÐ4Ð4Ð4ˆØˆ	å.Ñ0Ô0€Lå�FÔ$Ñ&Ô&Ô.°Ñ2°BÑ7Ô7€AØˆ2‚v€vØW�[ÐWÐW 9ÐWÐW°yÐWÐWÐWÐWà�‰E€EØ
�!‰)€CØ˜A‘I€Mð �.�=�.Ô!×'Ò'¨Ñ6Ô6€EØ˜˜-˜Ô(×.Ò.¨}Ñ=Ô=€Eð	1�<ð 	1ð 	1 Sð 	1ð 	1Øð	1ð 	1Ø(3ð	1ð 	1Ø6;ð	1ð 	1ØGSð	1ð 	1àð	1ð 	1à,5ð	1ð 	1à8=ð	1ð 	1àIUð	1ð 	1ð ð	1ð 	1ð $'ð	1ð 	1ð 	1ðs   ‚ “"¡"c                 ó€   — | r|                       d¦  «        sdS |                      ¦   «         d         }d|dd…         vS )a¼  Return True if *text* looks like a slash command, not a file path.

    Slash commands are ``/help``, ``/model gpt-4``, ``/q``, etc.
    File paths like ``/Users/ironin/file.md:45-46 can you fix this?``
    also start with ``/`` but contain additional ``/`` characters in
    the first whitespace-delimited word.  This helper distinguishes
    the two so that pasted paths are sent to the agent instead of
    triggering "Unknown command".
    r�  Fr   r  N)rÅ  r  )r6   Ú
first_words     rK   Ú_looks_like_slash_commandr  ˆ  sJ   € ð ð �t—’ sÑ+Ô+ð ØˆuØ—’‘”˜a”€Jð �j   ”nÐ$Ð$rM   )Úscan_skill_commandsÚbuild_skill_invocation_messageÚbuild_preloaded_skills_promptc                  ó¨   — 	 ddl m}  t           | ¦   «         j                             ¦   «         ¦  «        S # t
          $ r t          ¦   «         cY S w xY w)zIReturn plugin command names (without slash prefix) for dispatch matching.r   ©Úget_plugin_manager)r“  r  r´   Ú_plugin_commandsÚkeysrv   r  s    rK   Ú_get_plugin_cmd_handler_namesr!  §  sh   € ðØ9Ð9Ð9Ð9Ð9Ð9ÝÐ%Ð%Ñ'Ô'Ô8×=Ò=Ñ?Ô?Ñ@Ô@Ð@øÝð ð ð Ý‰uŒuˆˆˆðøøøs   ‚36 ¶AÁAÚskills.c                 ó–  — | sg S t          | t          ¦  «        r| g}n9t          | t          t          f¦  «        rd„ | D ¦   «         }nt          | ¦  «        g}g }t	          ¦   «         }|D ]_}|                     d¦  «        D ]G}|                     ¦   «         }|r||v rŒ|                     |¦  «         |                     |¦  «         ŒHŒ`|S )zJNormalize a CLI skills flag into a deduplicated list of skill identifiers.c                 ó0   — g | ]}|®t          |¦  «        ‘ŒS r\   rA  ©rW   Úitems     rK   rY   z*_parse_skills_argument.<locals>.<listcomp>¸  s#   € ÐGÐGÐG D°dÐ6F•c˜$‘i”iÐ6FÐ6FÐ6FrM   Ú,)	rR   rU   ra   Útupler´   r  rG   r—   r–   )r"  Ú
raw_valuesr˜  rš   r‚   rX   r˜   s          rK   Ú_parse_skills_argumentr*  °  sí   € àð Øˆ	å�&�#ÑÔð #Ø�Xˆ
ˆ
Ý	�F�T¥5˜MÑ	*Ô	*ð #ØGÐG¨FÐGÑGÔGˆ
ˆ
å˜&‘k”k�]ˆ
à€FÝ‘U”U€DØð &ð &ˆØ—I’I˜c‘N”Nð 	&ð 	&ˆDØŸš™œˆJØð  ¨tÐ!3Ð!3ØØ�HŠH�ZÑ Ô Ð Ø�MŠM˜*Ñ%Ô%Ð%Ð%ð	&ð €MrM   Úkey_pathr�   c                 ó  — t           dz  }t          t          ¦  «        j        dz  }|                     ¦   «         r|n|}	 |j                             dd¬¦  «         |                     ¦   «         r?t          |d¦  «        5 }t          j        |¦  «        pi }ddd¦  «         n# 1 swxY w Y   ni }|  	                    d¦  «        }|}|dd…         D ].}	|	|vst          ||	         t          ¦  «        si ||	<   ||	         }Œ/|||d         <   d	d
lm}
  |
||¦  «         	 t          j        |d¦  «         n# t           t"          f$ r Y nw xY wdS # t$          $ r&}t&                               d|¦  «         Y d}~dS d}~ww xY w)a²  
    Save a value to the active config file at the specified key path.
    
    Respects the same lookup order as load_cli_config():
    1. ~/.hermes/config.yaml (user config - preferred, used if it exists)
    2. ./cli-config.yaml (project config - fallback)
    
    Args:
        key_path: Dot-separated path like "agent.system_prompt"
        value: Value to save
    
    Returns:
        True if successful, False otherwise
    rº   r»   Tr­  ri   NrÁ   r  r   )Úatomic_yaml_writei€  zFailed to save config: %sF)ro   r   r9  r:  rp   r½  rs   r;  r<  r  rR   rS   Úutilsr-  r’   ÚchmodrÆ  ÚNotImplementedErrorrv   rq   Úerror)r+  r�   rD  rE  rG  rx   Úconfigr   r  rM  r-  rz   s               rK   Úsave_config_valuer3  È  s  € õ  $ mÑ3ÐÝ�x™.œ.Ô/Ð2CÑCÐØ&6×&=Ò&=Ñ&?Ô&?ÐXÐ"Ð"ÐEX€Kð"àÔ× Ò ¨¸Ð Ñ=Ô=Ð=ð ×ÒÑÔð 	Ý�k 3Ñ'Ô'ð 1¨1Ýœ¨Ñ*Ô*Ð0¨b�ð1ð 1ð 1ñ 1ô 1ð 1ð 1ð 1ð 1ð 1ð 1øøøð 1ð 1ð 1ð 1øð ˆFð �~Š~˜cÑ"Ô"ˆØˆØ˜˜˜”9ð 	#ð 	#ˆCØ˜'Ð!Ð!­°G¸C´LÅ$Ñ)GÔ)GÐ!Ø!�˜‘Ø˜c”lˆGˆGØ!ˆ��R”Ñð 	,Ð+Ð+Ð+Ð+Ð+ØÐ˜+ vÑ.Ô.Ð.ð	ÝŒH�[ %Ñ(Ô(Ð(Ð(øÝÕ,Ð-ð 	ð 	ð 	ØˆDð	øøøð ˆtøÝð ð ð Ý�ŠÐ0°!Ñ4Ô4Ð4Øˆuˆuˆuˆuˆuøøøøðøøøsb   Á A E Â B#ÂE Â#B'Â'E Â*B'Â+A3E ÄD5 Ä4E Ä5E	ÅE ÅE	Å	E Å
E>ÅE9Å9E>c                   ót	  — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 dìdedee         dededed	ed
edededededefd„Zdíde	ddfd„Z
dee         defd„Zdîdee         dedefd„Zedïdee	         de	dedefd„¦   «         Zdeeef         fd„Zededefd „¦   «         Zeded!edefd"„¦   «         Zedðd$eeef         defd%„¦   «         Zdñdee         defd&„Zdñd'edee         defd(„Zdñdee         defd)„Zdñdee         defd*„Zdefd+„Zdñdee         fd,„Zdñdee         defd-„Zd.„ Zd/edefd0„Z deddfd1„Z!d2„ Z"d3eddfd4„Z#dd5œd6eddfd7„Z$d8edefd9„Z%dedz  defd:„Z&d8eddfd;„Z'deddfd<„Z(dòd=„Z)dòd>„Z*deddfd?„Z+dòd@„Z,dòdA„Z-dBedefdC„Z.defdD„Z/e0dEefdF„¦   «         Z1dñdefdG„Z2defdH„Z3dIede4fdJ„Z5ddddKœdLedMe4dNe4dz  defdO„Z6dP„ Z7defdQ„Z8dR„ Z9defdS„Z:dBefdT„Z;dUede<dedz  fdV„Z=dBefdW„Z>dX„ Z?dY„ Z@dZ„ ZAdeddfd[„ZBd\eddfd]„ZCd\efd^„ZDd_d`œdedae<dbedefdc„ZEdd„ ZFde„ ZGdf„ ZHdefdg„ZIdhedefdi„ZJdj„ ZKdk„ ZLdlefdm„ZMdn„ ZNdo„ ZOdp„ ZPdîdqede<e4eef                  fdr„ZQdsddtœduedqedefdv„ZRdw„ ZSdxeddfdy„ZTdïdz„ZUd\eddfd{„ZVd\eddfd|„ZWd}„ ZXd~„ ZYd„ ZZdód�ed‚e<e         dƒededz  fd„„Z[d…ededz  fd†„Z\dôd‡e<dˆed‰eddfdŠ„Z]dòd‹„Z^e	 	 	 dõdŽed�ed�ed‘ed’ed“ed”edeeef         fd•„¦   «         Z_d–eddfd—„Z`dïd–eddfd˜„Zad\efd™„Zbdïdedšedefd›„Zcdïdedšedefdœ„Zdd�„ Zedž„ ZfedefdŸ„¦   «         Zgd\eddfd „Zhdlefd¡„Zidlefd¢„Zjdlefd£„Zkd¤„ ZldBedefd¥„Zmdlefd¦„Zned§ed¨edefd©„¦   «         Zodlefdª„Zpdlefd«„Zqd¬„ Zrd­„ Zsdlefd®„Ztdlefd¯„Zudlefd°„Zvd3efd±„Zwdöd\efd³„Zxd´„ Zydµ„ Zzd÷dBefd·„Z{dòd¸„Z|d¹„ Z}dºeddfd»„Z~dødxed¼ed½ed¾e4fd¿„ZdÀed¼ed¾e4fdÁ„Z€dÀed¼ed¾e4dÂefdÃ„Z�dÄ„ Z‚dÅ„ ZƒdefdÆ„Z„dBefdÇ„Z…defdÈ„Z†dÉ„ Z‡dÊ„ ZˆdË„ Z‰dÌ„ ZŠdÍ„ Z‹defdÎ„ZŒd_dÏœdBedÐedÑedefdÒ„Z�d_dÏœdBedÑede<e         fdÓ„ZŽdòdÔ„Z�dÕ„ Z�dñdÖed×ede4fdØ„Z‘dòdÙ„Z’dòdÚ„Z“dÛeddfdÜ„Z”dòdÝ„Z•dòdÞ„Z–dñdae<dee         fdß„Z—dà„ Z˜deeef         fdá„Z™defdâ„Zšdã„ Z›defdä„Zœde4eef         fdå„Z�defdæ„Zžde<fdç„ZŸdòdè„Z dddéœde<fdê„Z¡dë„ Z¢dS )ùÚ	HermesCLIzž
    Interactive CLI for the Hermes Agent.
    
    Provides a REPL interface with rich formatting, command history,
    and tool execution capabilities.
    NFrõ   Útoolsetsr¿   rö   r¾   rä   rå   rí   ÚresumeÚcheckpointsÚpass_session_idÚignore_rulesc                 ó®  ‡ — t          ¦   «         | _        t          | _        |�|n t          d                              dd¦  «        | _        t          d                              dd¦  «        }|du rdnt          |¦  «        | _        t          d                              dd	¦  «        | _        t          d                              d
d¦  «        | _	        t          d                              dd¦  «        | _
        t          d                              dd¦  «        }t          |¦  «                             ¦   «                              ¦   «         dk    rdnd| _        |�|n
| j        dk    | _        t          d                              dd¦  «        | _        t          t          d                              dd¦  «        ¦  «                             ¦   «                              ¦   «         pd| _        | j        dvrd| _        t          d                              dd¦  «        | _        t          d                              di ¦  «        }t%          |t&          ¦  «        si }	 t)          |                     dd¦  «        ¦  «        }n# t*          t,          f$ r d}Y nw xY w	 t)          |                     dd¦  «        ¦  «        }n# t*          t,          f$ r d}Y nw xY wt/          d|¦  «        | _        t/          d|¦  «        | _        d| _        d| _        d| _        d| _        i | _        t                               di ¦  «        }t%          |t&          ¦  «        r,|                     d¦  «        p|                     d¦  «        pdn|pd}d}|p|p|| _        | j        |k    rPt%          |t&          ¦  «        r|                     d¦  «        pdnd}d |v sd!|v rdd"l m!}  ||¦  «        }|r|| _        | o| p||k    | _"        || _#        || _$        |p5t          d                              d#¦  «        ptK          j&        d$¦  «        pd%| _'        d| _(        | j'        | _)        d&| _*        d| _+        g | _,        |p5t          d                              dd¦  «        ptK          j&        d'd¦  «        pd| _-        | j-        rEt]          | j-        d(¦  «        r0|p'tK          j&        d)¦  «        ptK          j&        d*¦  «        | _/        n/|p'tK          j&        d*¦  «        ptK          j&        d)¦  «        | _/        |�|| _0        n¨t          d+                              d,¦  «        rt          d+         d,         | _0        not                               d,¦  «        rt          d,         | _0        nBtK          j&        d-¦  «        r't)          tK          j&        d-¦  «        ¦  «        | _0        nd.| _0        || _1        |rd|vr{d/|vrwte          t                               d0¦  «        pi  3                    ¦   «         ¦  «        Š ˆ fd1„|D ¦   «         }|r,|  4                    d2d3 5                    |¦  «        › d4�¦  «         t                               d5i ¦  «        }t%          |tl          ¦  «        rd6|i}|
p|                     d6d¦  «        | _7        |                     d7d8¦  «        | _8        || _9        |p"tJ          j:                             d9¦  «        d:k    | _;        tK          j&        d;d¦  «        p t          d+                              d<d¦  «        | _<        t          d+                              d=i ¦  «        | _=        t}          t          d+                              d>d¦  «        ¦  «        | _?        t�          t          d+                              d?d¦  «        ¦  «        | _A        t…          t          d+                              d@d¦  «        ¦  «        | _C        t                               dAi ¦  «        pi }|                     dB¦  «        | _D        |                     dC¦  «        | _E        |                     dD¦  «        | _F        |                     dE¦  «        | _G        |                     dFd¦  «        | _H        |                     dG¦  «        | _I        t                               dH¦  «        pt                               dI¦  «        pg }t%          |t&          ¦  «        r/|                     d#¦  «        r|                     d¦  «        r|gng }|| _J        d| _K        d| _L        d| _M        g | _N        tŸ          jP        ¦   «         | _Q        d| _R        d| _S        dJ| _T        d| _U        	 ddKlVmW}  |¦   «         | _U        n2# t°          $ r%}t²           Z                    dL|¦  «         Y d}~nd}~ww xY wt·          | jU        ¦  «         d| _\        |	r|	| _]        d| _R        nF| jQ         ^                    dM¦  «        }t¿          j`        ¦   «         ja        ddN…         }|› dO|› �| _]        tÄ          dPz  | _c        dJ| _d        d| _M        d| _e        tÍ          jg        ¦   «         | _h        tÍ          jg        ¦   «         | _i        d| _j        d| _k        d| _l        d| _m        d| _n        d| _o        d| _p        d| _q        d| _r        d| _s        té          ju        ¦   «         | _v        d| _w        d| _x        d| _y        d| _z        dJ| _{        i | _|        d| _}        d| _~        d| _        g | _€        d| _�        g | _‚        d| _ƒ        té          ju        ¦   «         | _„        d| _…        d| _†        d| _‡        d| _ˆ        d| _‰        d| _Š        té          j‹        ¦   «         | _Œ        | jŒ         2                    ¦   «          d| _�        i | _Ž        d| _�        dS )Qa  
        Initialize the Hermes CLI.

        Args:
            model: Model to use (default: from env or claude-sonnet)
            toolsets: List of toolsets to enable (default: all)
            provider: Inference provider ("auto", "openrouter", "nous", "openai-codex", "zai", "kimi-coding", "minimax", "minimax-cn")
            api_key: API key (default: from environment)
            base_url: API base URL (default: OpenRouter)
            max_turns: Maximum tool-calling iterations shared with subagents (default: 90)
            verbose: Enable verbose logging
            compact: Use compact display mode
            resume: Session ID to resume (restores conversation history from SQLite)
            pass_session_id: Include the session ID in the agent's system prompt
        Nrÿ   rí   FÚtool_progressÚallr„   rî   rë   Úbell_on_completerï   rñ   rì   Úqueuerå   rð   Úfinal_response_markdownrG   >   r‚   rG   ra  Úinline_diffsTÚuser_message_previewÚfirst_linesr�  Ú
last_linesr  r   r:   rõ   r‡   r¾   Ú	localhostú	127.0.0.1)Ú_auto_detect_local_modelr¿   ÚHERMES_INFERENCE_PROVIDERr½   Úchat_completionsÚOPENROUTER_BASE_URLúopenrouter.aiÚOPENROUTER_API_KEYÚOPENAI_API_KEYrþ   rä   ÚHERMES_MAX_ITERATIONSrÕ   Ú*Úmcp_serversc                 ó:   •— g | ]}t          |¦  «        °|‰v¯|‘ŒS r]   )rz  )rW   ÚtÚ	mcp_namess     €rK   rY   z&HermesCLI.__init__.<locals>.<listcomp>«  s2   ø€ Ð]Ð]Ð]˜QÕ2BÀ1Ñ2EÔ2EÐ]È!ÐS\ÐJ\ÐJ\�qÐJ\ÐJ\ÐJ\rM   z%[bold red]Warning: Unknown toolsets: ú, ú[/]r8  rÓ   Úmax_snapshotsró   ÚHERMES_IGNORE_RULESr   ÚHERMES_EPHEMERAL_SYSTEM_PROMPTræ   rê   rç   rè   ré   Úprovider_routingÚsortÚonlyÚignoreÚorderÚrequire_parametersÚdata_collectionÚfallback_providersÚfallback_modelç        ©Ú	SessionDBuM   Failed to initialize SessionDB â€” session will NOT be indexed for search: %sú%Y%m%d_%H%M%Sé   Ú_z.hermes_history)�rl  ÚconsoleÚ
CLI_CONFIGr2  rT   rí   rU   Útool_progress_moderî   r>  rï   rG   rŒ   rñ   rå   Ústreaming_enabledr@  Ú_inline_diffs_enabledrR   rS   rô  Ú	TypeErrorr¦  rÐ  Ú user_message_preview_first_linesÚuser_message_preview_last_linesÚ_stream_bufÚ_stream_startedÚ_stream_box_openedÚ_reasoning_preview_bufÚ_pending_edit_snapshotsrõ   Úhermes_cli.runtime_providerrG  Ú_model_is_defaultÚ_explicit_api_keyÚ_explicit_base_urlr’   r–  Úrequested_providerÚ_provider_sourcer¿   Úapi_modeÚacp_commandÚacp_argsr¾   r.   rö   rä   Úenabled_toolsetsr´   r   Ú_console_printrb   ræ  Úcheckpoints_enabledÚcheckpoint_max_snapshotsr9  rµ   r:  ræ   rê   r{   Úprefill_messagesr�   Úreasoning_configrŽ   ré   Ú_provider_sortÚ_providers_onlyÚ_providers_ignoreÚ_providers_orderÚ_provider_require_paramsÚ_provider_data_collectionÚ_fallback_modelÚ_active_agent_route_signaturerþ   Ú_appr�  r   r  Úsession_startÚ_resumedÚ_prompt_start_timeÚ_prompt_durationÚ_session_dbÚhermes_staterd  rv   rq   rr   rù  Ú_pending_titlerŠ  Ústrftimerº  r»  r¼  ro   Ú_history_fileÚ_last_invalidateÚ_agent_runningr?  ÚQueueÚ_pending_inputÚ_interrupt_queueÚ_should_exitÚ_last_ctrl_c_timeÚ_clarify_stateÚ_clarify_freetextÚ_clarify_deadlineÚ_sudo_stateÚ_sudo_deadlineÚ_modal_input_snapshotÚ_approval_stateÚ_approval_deadlineÚ	threadingÚLockÚ_approval_lockÚ_model_picker_stateÚ_secret_stateÚ_secret_deadlineÚ_spinner_textÚ_tool_start_timeÚ_pending_tool_infoÚ_last_scrollback_toolÚ_command_runningÚ_command_statusÚ_attached_imagesÚ_image_counterÚpreloaded_skillsÚ_startup_skills_line_shownÚ_voice_lockÚ_voice_modeÚ
_voice_ttsÚ_voice_recorderÚ_voice_recordingÚ_voice_processingÚ_voice_continuousÚEventÚ_voice_tts_doneÚ_status_bar_visibleÚ_background_tasksÚ_background_task_counter)!r7  rõ   r6  r¿   rö   r¾   rä   rå   rí   r7  r8  r9  r:  Ú_raw_tpÚ_bimÚ_umpÚ_ump_first_linesÚ_ump_last_linesÚ_model_configÚ_config_modelÚ_DEFAULT_CONFIG_MODELÚ	_base_urlrG  Ú	_detectedÚinvalidÚcp_cfgÚprÚfbrd  rz   Útimestamp_strÚ
short_uuidrS  s!                                   @rK   r8  zHermesCLI.__init__  sË  ø€ õ> ‘y”yˆŒÝ ˆŒØ")Ð"5�w�w½:ÀiÔ;P×;TÒ;TÐU^Ð`eÑ;fÔ;fˆŒõ ˜YÔ'×+Ò+¨O¸UÑCÔCˆØ+2°eÐ+;Ð+; % %ÅÀWÁÄˆÔå(¨Ô3×7Ò7Ð8HÈ&ÑQÔQˆÔå *¨9Ô 5× 9Ò 9Ð:LÈeÑ TÔ TˆÔå(¨Ô3×7Ò7Ð8HÈ%ÑPÔPˆÔå˜)Ô$×(Ò(Ð):¸KÑHÔHˆÝ*-¨d©)¬)¯/ª/Ñ*;Ô*;×*AÒ*AÑ*CÔ*CÀwÒ*NÐ*N˜w˜wÐT_ˆÔà")Ð"5�w�w¸DÔ<SÐW`Ò<`ˆŒõ ",¨IÔ!6×!:Ò!:¸;ÈÑ!NÔ!NˆÔÝ'*Ý�yÔ!×%Ò%Ð&?ÀÑIÔIñ(
ô (
ç
Š%‰'Œ'—%’%‘'”'ð(%à$ð 	Ô$ð Ô'Ð/IÐIÐIØ+2ˆDÔ(õ &0°	Ô%:×%>Ò%>¸~ÈtÑ%TÔ%TˆÔ"õ ˜)Ô$×(Ò(Ð)?ÀÑDÔDˆÝ˜$¥Ñ%Ô%ð 	ØˆDð	!Ý" 4§8¢8¨M¸1Ñ#=Ô#=Ñ>Ô>ÐÐøÝ�:Ð&ð 	!ð 	!ð 	!Ø ÐÐÐð	!øøøð	 Ý! $§(¢(¨<¸Ñ";Ô";Ñ<Ô<ˆOˆOøÝ�:Ð&ð 	 ð 	 ð 	 ØˆOˆOˆOð	 øøøå03°AÐ7GÑ0HÔ0HˆÔ-Ý/2°1°oÑ/FÔ/FˆÔ,ð ˆÔØ$ˆÔØ"'ˆÔØ&(ˆÔ#Ø')ˆÔ$õ #Ÿš w°Ñ3Ô3ˆÝ^hÐivÕx|Ñ^}Ô^}ð  Y˜×*Ò*¨9Ñ5Ô5ÐY¸×9JÒ9JÈ7Ñ9SÔ9SÐYÐWYøð  ERð  EXð  VXˆØ "ÐØÐD˜mÐDÐ/DˆŒ
àŒ:Ð.Ò.Ð.ÝAKÈMÕ[_ÑA`ÔA`Ðh˜×*Ò*¨:Ñ6Ô6Ð<¸"øÐfhˆIØ˜iÐ'Ð'¨;¸)Ð+CÐ+CØPÐPÐPÐPÐPÐPØ4Ð4°YÑ?Ô?�	Øð +Ø!*�D”Jð &+ ð "
ØÐÐG Ð2GÒ!Gð 	Ôð ")ˆÔØ"*ˆÔð ð Ý˜'Ô"×&Ò& zÑ2Ô2ðåŒyÐ4Ñ5Ô5ðð ð	 	Ôð 04ˆÔØÔ/ˆŒØ*ˆŒØ*.ˆÔØ#%ˆŒàð 4Ý˜'Ô"×&Ò& z°2Ñ6Ô6ð4åŒyÐ.°Ñ3Ô3ðð ð	 	Œð Œ=ð 	eÕ2°4´=À/ÑRÔRð 	eØ"Ðd¥b¤iÐ0DÑ&EÔ&EÐdÍÌÐScÑIdÔIdˆDŒLˆLà"Ðd¥b¤iÐ0@Ñ&AÔ&AÐdÅRÄYÐOcÑEdÔEdˆDŒLàÐ Ø&ˆDŒNˆNÝ˜Ô ×$Ò$ [Ñ1Ô1ð 	 Ý'¨Ô0°Ô=ˆDŒNˆNÝ�^Š^˜KÑ(Ô(ð 	 Ý'¨Ô4ˆDŒNˆNÝŒYÐ.Ñ/Ô/ð 	 Ý ¥¤Ð+BÑ!CÔ!CÑDÔDˆDŒNˆNàˆDŒNð !)ˆÔØð 	e˜ XÐ-Ð-°#¸XÐ2EÐ2Eõ �ZŸ^š^¨MÑ:Ô:Ð@¸b×FÒFÑHÔHÑIÔIˆIØ]Ð]Ð]Ð] (Ð]Ñ]Ô]ˆGØð eØ×#Ò#Ð$cÈDÏIÊIÐV]ÑL^ÔL^Ð$cÐ$cÐ$cÑdÔdÐdõ —’ ¨rÑ2Ô2ˆÝ�f�dÑ#Ô#ð 	)Ø Ð(ˆFØ#.Ð#N°&·*²*¸YÈÑ2NÔ2NˆÔ Ø(.¯
ª
°?ÀBÑ(GÔ(GˆÔ%Ø.ˆÔð
 )ÐX­B¬J¯NªNÐ;PÑ,QÔ,QÐUXÒ,XˆÔõ ŒIÐ6¸Ñ;Ô;ð <Ý˜'Ô"×&Ò& ¸Ñ;Ô;ð 	Ôõ (¨Ô0×4Ò4°_ÀbÑIÔIˆÔõ !7Ý�wÔ×#Ò#Ð$;¸RÑ@Ô@ñ!
ô !
ˆÔõ
 !8Ý�wÔ×#Ò#Ð$6¸Ñ;Ô;ñ!
ô !
ˆÔõ 7Ý�wÔ×#Ò# N°BÑ7Ô7ñ
ô 
ˆÔõ
 �^Š^Ð.°Ñ3Ô3Ð9°rˆØ Ÿfšf V™nœnˆÔØ!Ÿvšv f™~œ~ˆÔØ!#§¢¨Ñ!1Ô!1ˆÔØ "§¢ w¡¤ˆÔØ(*¯ªÐ/CÀUÑ(KÔ(KˆÔ%Ø)+¯ªÐ0AÑ)BÔ)BˆÔ&õ �^Š^Ð0Ñ1Ô1Ð[µZ·^²^ÐDTÑ5UÔ5UÐ[ÐY[ˆå�b�$ÑÔð 	HØŸš 
Ñ+Ô+ÐG°·²°w±´ÐG�"��ÀRˆBØ!ˆÔð
 .2ˆÔ*ð )-ˆŒ
ØˆŒ	ð ;=ˆÔ!Ý%œ\™^œ^ˆÔØˆŒð 48ˆÔØ'*ˆÔàˆÔð	oØ.Ð.Ð.Ð.Ð.Ð.Ø(˜y™{œ{ˆDÔÐøÝð 	oð 	oð 	oÝ�NŠNÐjÐlmÑnÔnÐnÐnÐnÐnÐnÐnøøøøð	oøøøõ 	' tÔ'7Ñ8Ô8Ð8ð .2ˆÔð ð 	>Ø$ˆDŒOØ ˆDŒMˆMà Ô.×7Ò7¸ÑHÔHˆMÝœ™œÔ)¨"¨1¨"Ô-ˆJØ!.Ð=Ð=°Ð=Ð=ˆDŒOõ *Ð,=Ñ=ˆÔØ'*ˆÔØˆŒ	ð
 $ˆÔÝ#œk™mœmˆÔÝ %¤¡¤ˆÔØ!ˆÔØ!"ˆÔØ"ˆÔØ!&ˆÔØ!"ˆÔØˆÔØˆÔØ%)ˆÔ"Ø#ˆÔØ"#ˆÔÝ'œnÑ.Ô.ˆÔØ#'ˆÔ Ø!ˆÔØ !ˆÔØ"$ˆÔØ'*ˆÔØ(*ˆÔØ*,ˆÔ"Ø %ˆÔØ!ˆÔØ,.ˆÔØˆÔØ+-ˆÔØ*/ˆÔ'õ %œ>Ñ+Ô+ˆÔØ ˆÔØˆŒØ#ˆÔØ %ˆÔØ!&ˆÔØ!&ˆÔÝ(œÑ0Ô0ˆÔØÔ× Ò Ñ"Ô"Ð"ð $(ˆÔ ð ?AˆÔØ()ˆÔ%Ð%Ð%s<   É#I? É?JÊJÊ#J= Ê=KËKæf æ
gæ&gçgç      Ð?Úmin_intervalr7   c                 óÂ   — t          j        ¦   «         }t          | d¦  «        r7| j        r2|| j        z
  |k    r&|| _        | j                             ¦   «          dS dS dS dS )uL   Throttled UI repaint â€” prevents terminal blinking on slow/SSH connections.rŒ  N)rÿ  Ú	monotonicr•  rŒ  r–  Ú
invalidate)r7  rÒ  r  s      rK   Ú_invalidatezHermesCLI._invalidateB  sy   € åŒnÑÔˆÝ�4˜Ñ Ô ð 	# T¤Yð 	#°C¸$Ô:OÑ4OÐT`Ò3`Ð3`Ø$'ˆDÔ!ØŒI× Ò Ñ"Ô"Ð"Ð"Ð"ð	#ð 	#ð 	#ð 	#Ð3`Ð3`rM   Úpercent_usedc                 ó>   — |€dS |dk    rdS |dk    rdS |dk    rdS dS )	Núclass:status-bar-dimé_   zclass:status-bar-criticalrÌ  zclass:status-bar-badró   zclass:status-bar-warnzclass:status-bar-goodr]   )r7  r×  s     rK   Ú_status_bar_context_stylez#HermesCLI._status_bar_context_styleI  sG   € ØÐØ)Ð)Ø˜2ÒÐØ.Ð.Ø˜"ÒÐØ)Ð)Ø˜2ÒÐØ*Ð*Ø&Ð&rM   rá  rÉ  c                 ó¬   — t          dt          d|pd¦  «        ¦  «        }t          |dz  |z  ¦  «        }dd|z  dt          d||z
  ¦  «        z  z   › d�S )Nr   éd   ú[u   â–ˆõ   â–‘r£  )rÐ  r  Úround)r7  r×  rÉ  Úsafe_percentÚfilleds        rK   Ú_build_context_barzHermesCLI._build_context_barT  sd   € Ý˜1�c # |Ð'8°qÑ9Ô9Ñ:Ô:ˆÝ˜ sÑ*¨eÑ3Ñ4Ô4ˆØI�E˜F‘N u­s°1°e¸f±nÑ/EÔ/EÑ'EÑFÐIÐIÐIÐIrM   Úprompt_start_timeÚprompt_durationÚlivec                 óÔ  — | €|dk    rdS | �t          j         ¦   «         | z
  n|}t          d|¦  «        }t          |dz  ¦  «        }|dz  }t          |dz  ¦  «        }|dz  }t          |dz  ¦  «        }t          |dz  ¦  «        }|dk    r|› d|› d	|› d
�}	nD|dk    r|r|› d	|› d|› d�n|› d	|› d
�}	n(|dk    r|r|› d|› d�n|› d
�}	nt          |¦  «        › d�}	|rdnd}
|
› d|	› �S )uE  Format per-prompt elapsed time for the status bar.

        Always returns a string â€” shows 0s on fresh start before first turn.
        Keeps seconds visible at all scales so it increments smoothly:
            59s â†’ 1m â†’ 1m 1s â†’ ... â†’ 1m 59s â†’ 2m â†’ 2m 1s â†’ ...
            59m 59s â†’ 1h â†’ 1h 0m 1s â†’ ...
            23h 59m 59s â†’ 1d â†’ 1d 0h 1m â†’ ...

        Emoji prefix: â�± when turn is live, â�² when frozen or fresh start.
        Uses width-1 (no variation selector) glyphs so the status bar stays
        aligned in monospace terminals.
        Nrb  u   â�² 0si€Q rü  rÂ   r   zd úh r'  úm Úsu   â�±u   â�²r‚  )rÿ  rÐ  rô  )rä  rå  ræ  ÚelapsedÚdaysÚ	remainingÚhoursÚminutesÚsecondsÚtime_strÚemojis              rK   Ú_format_prompt_elapsedz HermesCLI._format_prompt_elapsedY  sr  € ð Ð$¨¸CÒ)?Ð)?Ø�8Ø5FÐ5R•$”)‘+”+Ð 1Ñ1Ð1ÐXgˆÝ�c˜7Ñ#Ô#ˆå�7˜eÑ#Ñ$Ô$ˆØ˜e‘Oˆ	Ý�I Ñ%Ñ&Ô&ˆØ Ñ$ˆ	Ý�i 2‘oÑ&Ô&ˆÝ�i "‘nÑ%Ô%ˆà�!Š8ˆ8ØÐ5Ð5 %Ð5Ð5¨7Ð5Ð5Ð5ˆHˆHØ�QŠYˆYØ<CÐ_˜%Ð8Ð8 7Ð8Ð8¨gÐ8Ð8Ð8Ð8ÈEÐI_ÐI_ÐU\ÐI_ÐI_ÐI_ˆHˆHØ�qŠ[ˆ[Ø3:ÐM˜'Ð/Ð/ WÐ/Ð/Ð/Ð/À7ÀÀÀˆHˆHå˜g™,œ,Ð)Ð)Ð)ˆHàÐ(�� 5ˆØÐ$Ð$˜(Ð$Ð$Ð$rM   c                 ó$  — t          | dd ¦  «        }t          |dd ¦  «        p| j        pd}d|v r|                     d¦  «        d         n|}|                     d¦  «        r
|d d…         }t	          |¦  «        dk    r|d d	…         › d
�}t          dt          j        ¦   «         | j        z
   	                    ¦   «         ¦  «        }i d|“d|“dt          |¦  «        “d|                      t          | dd ¦  «        t          | dd¦  «        t          | dd ¦  «        d u¬¦  «        “dd“dd “dd “dd“dd“dd“dd“dd“dd“dd“dd“dd“}|s|S t          |dd¦  «        pd|d<   t          |dd¦  «        pd|d<   t          |dd¦  «        pd|d<   t          |dd¦  «        pd|d<   t          |dd¦  «        pd|d<   t          |dd¦  «        pd|d<   t          |dd¦  «        pd|d<   t          |dd¦  «        pd|d<   t          |d d ¦  «        }|r~t          |d!d¦  «        pd}t          |dd¦  «        pd}||d<   |pd |d<   t          |d"d¦  «        pd|d<   |r4t          dt          d#t          ||z  d#z  ¦  «        ¦  «        ¦  «        |d<   |S )$Nrþ   rõ   rŸ  r�  r  z.gguféûÿÿÿé   é   rÏ  rb  Ú
model_nameÚmodel_shortÚdurationÚprompt_elapsedr�  r�  )ræ  Úcontext_tokensr   Úcontext_lengthÚcontext_percentÚsession_input_tokensÚsession_output_tokensÚsession_cache_read_tokensÚsession_cache_write_tokensÚsession_prompt_tokensÚsession_completion_tokensÚsession_total_tokensÚsession_api_callsÚcompressionsÚcontext_compressorÚlast_prompt_tokensÚcompression_countrÝ  )r–  rõ   r  rÀ  r  rÐ  r   r  r�  Útotal_secondsr%   ró  r  rà  )	r7  rþ   rø  rù  Úelapsed_secondsÚsnapshotÚ
compressorrü  rý  s	            rK   Ú_get_status_bar_snapshotz"HermesCLI._get_status_bar_snapshot  s¯  € õ
 ˜˜g tÑ,Ô,ˆÝ˜e W¨dÑ3Ô3ÐN°t´zÐNÀYˆ
Ø36¸*Ð3DÐ3D�j×&Ò& sÑ+Ô+¨BÔ/Ð/È*ˆØ×Ò Ñ(Ô(ð 	+Ø% c r cÔ*ˆKÝˆ{ÑÔ˜bÒ Ð Ø(¨¨"¨Ô-Ð2Ð2Ð2ˆKå˜c¥H¤L¡N¤N°TÔ5GÑ$G×#VÒ#VÑ#XÔ#XÑYÔYˆð
Ø˜*ð
à˜;ð
ð Õ/°Ñ@Ô@ð
ð ˜d×9Ò9Ý˜Ð2°DÑ9Ô9Ý˜Ð0°#Ñ6Ô6Ý˜TÐ#7¸Ñ>Ô>ÀdÐJð :ñ ô ð	
ð ˜að
ð ˜dð
ð ˜tð
ð # Að
ð $ Qð
ð (¨ð
ð )¨!ð
ð  $ Qð!
ð" (¨ð#
ð$ # Að%
ð&   ð'
ð( ˜Að)
ˆð. ð 	ØˆOå+2°5Ð:PÐRSÑ+TÔ+TÐ+YÐXYˆÐ'Ñ(Ý,3°EÐ;RÐTUÑ,VÔ,VÐ,[ÐZ[ˆÐ(Ñ)Ý07¸Ð?ZÐ\]Ñ0^Ô0^Ð0cÐbcˆÐ,Ñ-Ý18¸Ð@\Ð^_Ñ1`Ô1`Ð1eÐdeˆÐ-Ñ.Ý,3°EÐ;RÐTUÑ,VÔ,VÐ,[ÐZ[ˆÐ(Ñ)Ý07¸Ð?ZÐ\]Ñ0^Ô0^Ð0cÐbcˆÐ,Ñ-Ý+2°5Ð:PÐRSÑ+TÔ+TÐ+YÐXYˆÐ'Ñ(Ý(/°Ð7JÈAÑ(NÔ(NÐ(SÐRSˆÐ$Ñ%å˜UÐ$8¸$Ñ?Ô?ˆ
Øð 	oÝ$ ZÐ1EÀqÑIÔIÐNÈQˆNÝ$ ZÐ1AÀ1ÑEÔEÐJÈˆNØ)7ˆHÐ%Ñ&Ø)7Ð)?¸4ˆHÐ%Ñ&Ý'.¨zÐ;NÐPQÑ'RÔ'RÐ'WÐVWˆH�^Ñ$Øð oÝ.1°!µS¸½eÀ^ÐVdÑEdÐhkÑDkÑ>lÔ>lÑ5mÔ5mÑ.nÔ.n�Ð*Ñ+àˆrM   r6   c                 ól   — 	 ddl m}  || pd¦  «        S # t          $ r t          | pd¦  «        cY S w xY w)aV  Return terminal cell width for status-bar text.

        len() is not enough for prompt_toolkit layout decisions because some
        glyphs can render wider than one Python codepoint. Keeping the status
        bar within the real display width prevents it from wrapping onto a
        second line and leaving behind duplicate rows.
        r   ©Ú
get_cwidthr:   )Úprompt_toolkit.utilsr  rv   r  )r6   r  s     rK   Ú_status_bar_display_widthz#HermesCLI._status_bar_display_width¼  s^   € ð	#Ø7Ð7Ð7Ð7Ð7Ð7Ø�:˜d˜j bÑ)Ô)Ð)øÝð 	#ð 	#ð 	#Ý�t�z˜r‘?”?Ð"Ð"Ð"ð	#øøøs   ‚ •3²3Ú	max_widthc                 ó¸  — |dk    rdS 	 ddl m} n# t          $ r d}Y nw xY w|                      |¦  «        |k    r|S d}|                      |¦  «        }||k    r
|d|…         S g }d}|D ]F}|r ||¦  «        nt	          |¦  «        }	||	z   |z   |k    r n|                     |¦  «         ||	z  }ŒGd                     |¦  «                             ¦   «         |z   S )z.Trim status-bar text to a single terminal row.r   r:   r  NrÏ  )r  r  rv   r  r  r–   rb   r¾  )
Úclsr6   r  r  ÚellipsisÚellipsis_widthÚoutrÉ  r‡  Úch_widths
             rK   Ú_trim_status_bar_textzHermesCLI._trim_status_bar_textË  s-  € ð ˜Š>ˆ>Ø�2ð	Ø7Ð7Ð7Ð7Ð7Ð7Ð7øÝð 	ð 	ð 	ØˆJˆJˆJð	øøøð ×(Ò(¨Ñ.Ô.°)Ò;Ð;ØˆKàˆØ×6Ò6°xÑ@Ô@ˆØ˜Ò&Ð&Ø˜J˜Y˜JÔ'Ð'àˆØˆØð 	ð 	ˆBØ)3Ð@�z�z "‘~”~�~½¸R¹¼ˆHØ�xÑ .Ñ0°9Ò<Ð<Ø�Ø�JŠJ�r‰NŒNˆNØ�XÑˆEˆEØ�wŠw�s‰|Œ|×"Ò"Ñ$Ô$ xÑ/Ð/s   Š ‘ Ÿ rË  r‡   c                 ó®   — 	 ddl m}  |¦   «         j                             ¦   «         j        S # t
          $ r t          j        | ¦  «        j        cY S w xY w)a  Return the live prompt_toolkit width, falling back to ``shutil``.

        The TUI layout can be narrower than ``shutil.get_terminal_size()`` reports,
        especially on Termux/mobile shells, so prefer prompt_toolkit's width whenever
        an app is active.
        r   ©Úget_app)Úprompt_toolkit.applicationr  r§  Úget_sizer×  rv   rž   rÖ  )r‡   r  s     rK   Ú_get_tui_terminal_widthz!HermesCLI._get_tui_terminal_widthç  sl   € ð	=Ø:Ð:Ð:Ð:Ð:Ð:Ø�7‘9”9Ô#×,Ò,Ñ.Ô.Ô6Ð6øÝð 	=ð 	=ð 	=ÝÔ+¨GÑ4Ô4Ô<Ð<Ð<Ð<ð	=øøøs   ‚+. ®#AÁAc                 ó:   — |€|                       ¦   «         }|dk     S )zBHide low-value chrome on narrow/mobile terminals to preserve rows.Né@   )r"  ©r7  rÉ  s     rK   Ú_use_minimal_tui_chromez!HermesCLI._use_minimal_tui_chromeõ  s"   € àˆ=Ø×0Ò0Ñ2Ô2ˆEØ�rŠzÐrM   Úpositionc                 ór   — |dvrt          d|› �¦  «        ‚|dk    rdS |                      |¬¦  «        rdndS )zCReturn the visible height for the top/bottom input separator rules.>   ÚtopÚbottomzUnknown input rule position: r)  r  ©rÉ  r   )r¦  r&  )r7  r'  rÉ  s      rK   Ú_tui_input_rule_heightz HermesCLI._tui_input_rule_heightû  sU   € àÐ,Ð,Ð,ÝÐG¸XÐGÐGÑHÔHÐHØ�uÒÐØ�1Ø×0Ò0°uÐ0Ñ=Ô=ÐDˆqˆqÀ1ÐDrM   c                 ó\   — t          | dd¦  «        sdS |                      |¬¦  «        rdndS )zIReturn the spacer height shown above the status bar while the agent runs.r—  Fr   r+  r  )r–  r&  r%  s     rK   Ú_agent_spacer_heightzHermesCLI._agent_spacer_height	  s<   € å�tÐ-¨uÑ5Ô5ð 	Ø�1Ø×0Ò0°uÐ0Ñ=Ô=ÐDˆqˆqÀ1ÐDrM   c                 ó   — |                       ¦   «         }|sdS |                      |¬¦  «        rdS |p|                      ¦   «         }|rE|dk    r?ddl}|                      |¦  «        }t          d|                     ||z  ¦  «        ¦  «        S dS )zPReturn the visible height for the spinner/status text line above the status bar.r   r+  rá  Nr  )Ú_render_spinner_textr&  r"  Úmathr  rÐ  Úceil)r7  rÉ  Úspinner_liner1  Ú
text_widths        rK   Ú_spinner_widget_heightz HermesCLI._spinner_widget_height		  s¦   € à×0Ò0Ñ2Ô2ˆØð 	Ø�1Ø×'Ò'¨eÐ'Ñ4Ô4ð 	Ø�1ØÐ7˜×5Ò5Ñ7Ô7ˆØð 	9�U˜R’Z�ZØˆKˆKˆKØ×7Ò7¸ÑEÔEˆJÝ�q˜$Ÿ)š) J°Ñ$6Ñ7Ô7Ñ8Ô8Ð8ØˆqrM   c                 ó  — t          | dd¦  «        }|sdS t          | dd¦  «        pd}|dk    rXt          j        ¦   «         |z
  }|dk    r-t          |dz  ¦  «        t          |dz  ¦  «        }}|› d|› d�}n|d›d�}d	|› d
|› d�S d	|› �S )zCReturn the live spinner/status text exactly as rendered in the TUI.r«  r:   r¬  r   rÂ   ré  rê  ú.1fú  ú  (ú))r–  rÿ  rÔ  rô  )r7  ÚtxtÚt0rë  Ú_mÚ_sÚelapsed_strs          rK   r0  zHermesCLI._render_spinner_text	  sÅ   € å�d˜O¨RÑ0Ô0ˆØð 	Ø�2Ý�TÐ-¨qÑ1Ô1Ð6°QˆØ�Š6ˆ6Ý”nÑ&Ô&¨Ñ+ˆGØ˜"Š}ˆ}Ý˜W¨™]Ñ+Ô+­S°¸2±Ñ->Ô->�B�Ø!#˜n˜n r˜n˜n˜n��à!(Ð/Ð/Ð/Ð/�Ø.˜Ð.Ð. Ð.Ð.Ð.Ð.Ø�CˆzˆzÐrM   c                 óâ   — |p|                       ¦   «         }|                      |¬¦  «        }| j        r|rdgS dgS | j        r|rdgS dgS |rdgS | j        rdnd}| j        rd	nd}d
d|› |› d�fgS )z>Return the voice status bar fragments for the interactive TUI.r+  )úclass:voice-status-recordingu	    â—� REC )rA  u    â—� REC  Ctrl+B to stop )úclass:voice-statusu	    â—‰ STT )rB  u    â—‰ Transcribing... )rB  u    ðŸŽ¤ Ctrl+B z	 | TTS onr:   z | ContinuousrB  u    ðŸŽ¤ Voice modeu     â€”  Ctrl+B to record )r"  r&  r¹  rº  r·  r»  )r7  rÉ  rí   ÚttsÚconts        rK   Ú_get_voice_status_fragmentsz%HermesCLI._get_voice_status_fragments'	  sÌ   € àÐ7˜×5Ò5Ñ7Ô7ˆØ×.Ò.°UÐ.Ñ;Ô;ˆØÔ ð 	SØð GØEÐFÐFØQÐRÐRØÔ!ð 	EØð =Ø;Ð<Ð<ØCÐDÐDØð 	=Ø;Ð<Ð<Ø!œ_Ð4ˆkˆk°"ˆØ"&Ô"8Ð@ˆˆ¸bˆØ%Ð']¸#Ð']¸tÐ']Ð']Ð']Ð^Ð_Ð_rM   c                 óB  — 	 |                       ¦   «         }|€|                      ¦   «         }|d         }|�|› d�nd}|d         }|dk     r$d|d         › d	|› �}|                      ||¦  «        S |d
k     rKd|d         › �|g}|                     |¦  «         |                      d	                     |¦  «        |¦  «        S |d         r2t          |d         ¦  «        }t          |d         ¦  «        }	|	› d|› �}
nd}
d|d         › �|
|g}|                     |¦  «         |                     d¦  «        }|r|                     |¦  «         |                      d                     |¦  «        |¦  «        S # t          $ r  dt          | dd¦  «        r| j
        nd› �cY S w xY w)zCReturn a compact one-line session status string for the TUI footer.Nrþ  ú%ú--rú  rÒ  u   âš• rù  õ    Â· éL   rý  rü  r�  úctx --rû  õ    â”‚ rõ   ÚHermes)r  r"  r  r–   rb   r)   r&   rT   rv   r–  rõ   )r7  rÉ  r  ÚpercentÚpercent_labelÚduration_labelr6   rc   Ú	ctx_totalÚctx_usedÚcontext_labelrû  s               rK   Ú_build_status_bar_textz HermesCLI._build_status_bar_text9	  sö  € ð	UØ×4Ò4Ñ6Ô6ˆHØˆ}Ø×4Ò4Ñ6Ô6�ØÐ0Ô1ˆGØ-4Ð-@˜w˜M˜M˜M˜MÀdˆMØ% jÔ1ˆNà�rŠzˆzØK˜h }Ô5ÐKÐK¸>ÐKÐK�Ø×1Ò1°$¸Ñ>Ô>Ð>Ø�rŠzˆzØ9 ¨Ô 7Ð9Ð9¸=ÐI�Ø—’˜^Ñ,Ô,Ð,Ø×1Ò1°&·+²+¸eÑ2DÔ2DÀeÑLÔLÐLàÐ(Ô)ð )Ý2°8Ð<LÔ3MÑNÔN�	Ý5°hÐ?OÔ6PÑQÔQ�Ø#+Ð 9Ð 9¨iÐ 9Ð 9��à (�à5˜H ]Ô3Ð5Ð5°}ÀmÐTˆEØ�LŠL˜Ñ(Ô(Ð(Ø%Ÿ\š\Ð*:Ñ;Ô;ˆNØð -Ø—’˜^Ñ,Ô,Ð,Ø×-Ò-¨g¯lªl¸5Ñ.AÔ.AÀ5ÑIÔIÐIøÝð 	Uð 	Uð 	UØT­°°g¸tÑ(DÔ(DÐR˜$œ*˜*È(ÐTÐTÐTÐTÐTð	Uøøøs    ‚A,E4 Á/AE4 Ã B3E4 Å4'FÆFc                 ó  ‡ — ‰ j         rt          ‰ dd ¦  «        rg S 	 ‰                      ¦   «         }‰                      ¦   «         }|d         }|dk     rdd|d         fdd|fd	g}�n|d
         }|�|› d�nd}|dk     r)dd|d         fd‰                      |¦  «        |fdd|fd	g}nØ|d         r2t          |d         ¦  «        }t          |d         ¦  «        }|› d|› �}	nd}	‰                      |¦  «        }
dd|d         fdd|	fd|
‰                      |¦  «        fd|
|fdd|fg
}|                     d¦  «        }|r,| 	                    d¦  «         | 	                    d|f¦  «         | 	                    d	¦  «         t          ˆ fd„|D ¦   «         ¦  «        }||k    r:d                     d„ |D ¦   «         ¦  «        }‰                      ||¦  «        }d|fgS |S # t          $ r dd‰                      ¦   «         › d�fgcY S w xY w)Nr¨  rú  rÒ  )úclass:status-baru    âš• zclass:status-bar-strongrù  )rÙ  rI  rÙ  )rV  r‚  rþ  rG  rH  rJ  rý  rü  r�  rK  )rÙ  rL  )rÙ  r‚  rû  c              3   óH   •K  — | ]\  }}‰                      |¦  «        V — Œd S r\   )r  )rW   rg  r6   r7  s      €rK   r`   z6HermesCLI._get_status_bar_fragments.<locals>.<genexpr>™	  s5   øè è € ÐXÐXÁwÀqÈ$˜d×<Ò<¸TÑBÔBÐXÐXÐXÐXÐXÐXrM   r:   c              3   ó    K  — | ]	\  }}|V — Œ
d S r\   r]   ©rW   rg  r6   s      rK   r`   z6HermesCLI._get_status_bar_fragments.<locals>.<genexpr>›	  s&   è è € Ð$?Ð$?©g¨a° TÐ$?Ð$?Ð$?Ð$?Ð$?Ð$?rM   rV  r‚  )r¾  r–  r  r"  rÛ  r)   r&   rã  rT   r–   Úsumrb   r  rv   rT  )r7  r  rÉ  rP  ÚfragsrN  rO  rQ  rR  rS  Ú	bar_stylerû  Útotal_widthÚ
plain_textÚtrimmeds   `              rK   Ú_get_status_bar_fragmentsz#HermesCLI._get_status_bar_fragments[	  sÇ  ø€ ØÔ'ð 	­7°4Ð9NÐPTÑ+UÔ+Uð 	ØˆIðB	PØ×4Ò4Ñ6Ô6ˆHð ×0Ò0Ñ2Ô2ˆEØ% jÔ1ˆNà�rŠzˆzà1Ø.°¸Ô0GÐHØ4Ø+¨^Ð<Ø-ð�‘ð #Ð#4Ô5�Ø18Ð1D 7    È$�Ø˜2’:�:à5Ø2°H¸]Ô4KÐLØ8Ø×7Ò7¸Ñ@Ô@À-ÐPØ8Ø/°Ð@Ø1ð�E�Eð  Ð 0Ô1ð 1Ý$:¸8ÐDTÔ;UÑ$VÔ$V˜	Ý#=¸hÐGWÔ>XÑ#YÔ#Y˜Ø+3Ð(AÐ(A°iÐ(AÐ(A˜˜à(0˜à $× >Ò >¸wÑ GÔ G�Ià5Ø2°H¸]Ô4KÐLØ9Ø/°Ð?Ø9Ø" D×$;Ò$;¸GÑ$DÔ$DÐEØ5Ø" MÐ2Ø9Ø/°Ð@ð�Eð &.§\¢\Ð2BÑ%CÔ%C�NØ%ð OØŸšÐ%FÑGÔGÐGØŸšÐ&<¸nÐ%MÑNÔNÐNØ—L’LÐ!:Ñ;Ô;Ð;åÐXÐXÐXÐXÐRWÐXÑXÔXÑXÔXˆKØ˜UÒ"Ð"ØŸWšWÐ$?Ð$?¸Ð$?Ñ$?Ô$?Ñ?Ô?�
Ø×4Ò4°ZÀÑGÔG�Ø+¨WÐ5Ð6Ð6ØˆLøÝð 	Pð 	Pð 	PØ'Ð)M¨T×-HÒ-HÑ-JÔ-JÐ)MÐ)MÐ)MÐNÐOÐOÐOÐOð	Pøøøs   �F;G ÇG Ç%HÈHÚresolved_providerc           	      ó„  — | j         pd                     ¦   «         }d}	 ddlm}m} ||vrE |||¦  «        }|r7||k    r1| j        s|                      d|› d|› d|› d�¦  «         || _         |}d	}n# t          $ r Y nw xY w|d
k    rŠ	 ddlm	}m
}  ||| j        ¬¦  «        }	|	r4|	|k    r.| j        s|                      d|› d|	› d�¦  «         |	| _         |	}d	} ||| j        ¬¦  «        }
|
| j        k    r	|
| _        d	}n# t          $ r Y nw xY w|S |dv r�	 ddlm}m}  |||¦  «        }	|	r7|	|k    r1| j        s|                      d|› d|	› d|› d�¦  «         |	| _         |	}d	} |||¦  «        }
|
| j        k    r	|
| _        d	}n# t          $ r Y nw xY w|S |dk    r|S d|v rJ|                     dd¦  «        d         }| j        s|                      d|› d|› d�¦  «         || _         |}d	}| j        rMd}	 ddlm}  || j        r| j        nd¬¦  «        }|r|d         }n# t          $ r Y nw xY w||k    r	|| _         d	}|S )z2Normalize provider-specific model IDs and routing.r:   Fr   )Ú_AGGREGATOR_PROVIDERSÚnormalize_model_for_provideru"   [yellow]âš ï¸�  Normalized model 'z' to 'z' for z.[/]TÚcopilot)Úcopilot_model_api_modeÚnormalize_copilot_model_id)rö   u*   [yellow]âš ï¸�  Normalized Copilot model 'z'.[/]>   úopencode-goúopencode-zen)Únormalize_opencode_model_idÚopencode_model_api_modeu/   [yellow]âš ï¸�  Stripped provider prefix from 'z
'; using 'zopenai-codexr�  r  z' for OpenAI Codex.[/]zgpt-5.3-codex)Úget_codex_model_idsN)Úaccess_token)rõ   rG   Úhermes_cli.model_normalizerc  rd  rv  r  rv   Úhermes_cli.modelsrf  rg  rö   r{  rj  rk  r  Úhermes_cli.codex_modelsrl  )r7  ra  Úcurrent_modelÚchangedrc  rd  Únormalized_modelrf  rg  Ú	canonicalÚresolved_moderj  rk  Úslugra  rl  Ú	availables                    rK   Ú_normalize_model_for_providerz'HermesCLI._normalize_model_for_provider¢	  sJ  € àœÐ) r×0Ò0Ñ2Ô2ˆØˆð	ðð ð ð ð ð ð ð ð
 !Ð(=Ð=Ð=Ø#?Ð#?ÀÐO`Ñ#aÔ#aÐ Ø#ð #Ð(8¸MÒ(IÐ(IØÔ1ð Ø×+Ò+ð FÀð  Fð  FÐVfð  Fð  FÐnð  Fð  Fð  Fñô ð ð "2�D”JØ$4�MØ"�GøøÝð 	ð 	ð 	ØˆDð	øøøð  	Ò)Ð)ðØ`Ð`Ð`Ð`Ð`Ð`Ð`Ð`à6Ð6°}ÈdÌlÐ[Ñ[Ô[�	Øð # ¨mÒ!;Ð!;ØÔ1ð Ø×+Ò+ØnÈÐnÐnÐ^gÐnÐnÐnñô ð ð "+�D”JØ$-�MØ"�Gà 6Ð 6°}ÈdÌlÐ [Ñ [Ô [�Ø  D¤MÒ1Ð1Ø$1�D”MØ"�GøøÝð ð ð Ø�ðøøøàˆNàÐ ?Ð?Ð?ðØbÐbÐbÐbÐbÐbÐbÐbà7Ð7Ð8IÈ=ÑYÔY�	Øð # ¨mÒ!;Ð!;ØÔ1ð Ø×+Ò+ð PÈmð  Pð  PÐgpð  Pð  Pð  yJð  Pð  Pð  Pñô ð ð "+�D”JØ$-�MØ"�Gà 7Ð 7Ð8IÈ=Ñ YÔ Y�Ø  D¤MÒ1Ð1Ø$1�D”MØ"�GøøÝð ð ð Ø�ðøøøàˆNà Ò.Ð.ØˆNð �-ÐÐØ ×&Ò& s¨AÑ.Ô.¨qÔ1ˆDØÔ)ð Ø×#Ò#ð;Àmð ;ð ;Ø"ð;ð ;ð ;ñô ð ð ˆDŒJØ ˆMØˆGð Ô!ð 	Ø,ˆNð	ØGÐGÐGÐGÐGÐGà/Ð/Ø15´Ð!G ¤ À4ðñ ô �	ð ð 2Ø%.¨q¤\�NøøÝð ð ð Ø�ðøøøð  Ò.Ð.Ø+�”
Ø�àˆsJ   ŸAA1 Á1
A>Á=A>ÂA6C? Ã?
DÄDÄA-F Æ
FÆFÇ6*H! È!
H.È-H.c                 ó~   — |s|                       d¬¦  «         |pd| _        d| _        |                      ¦   «          dS )z@Called by agent when thinking starts/stops. Updates TUI spinner.T©r  r:   rb  N)Ú_flush_reasoning_previewr«  r¬  rÖ  )r7  r6   s     rK   Ú_on_thinkingzHermesCLI._on_thinking	
  sM   € àð 	6Ø×)Ò)°Ð)Ñ5Ô5Ð5Ø!˜Z RˆÔØ #ˆÔØ×ÒÑÔÐÐÐrM   c                 óZ   — | j         r| j        r| j        S | j        r| j         s| j        S dS )zBReturn the active reasoning display callback for the current mode.N)rï   rk  Ú_stream_reasoning_deltarå   Ú_on_reasoningrG  s    rK   Ú_current_reasoning_callbackz%HermesCLI._current_reasoning_callback
  sB   € àÔð 	0 4Ô#9ð 	0ØÔ/Ð/ØŒ<ð 	& Ô 3ð 	&ØÔ%Ð%ØˆtrM   Úreasoning_textc                 óx  — |                      ¦   «         }|sdS 	 t          j        ¦   «         j        }n# t          $ r d}Y nw xY wd}t          d|t          |¦  «        z
  dz
  ¦  «        }g }t          j        d| 	                    dd¦  «        ¦  «        }|D ]^}d	 
                    d
„ |                     ¦   «         D ¦   «         ¦  «        }	|	r)|                     t          j        |	|¬¦  «        ¦  «         Œ_d 
                    |¦  «        }|sdS | j        r#t!          dt"          › d|› t$          › �¦  «         dS |                     ¦   «         }
t          |
¦  «        dk    r7d 
                    |
dd…         ¦  «        }|dt          |
¦  «        dz
  › d�z  }n|}t!          dt"          › d|› t$          › �¦  «         dS )zARender a buffered reasoning preview as a single [thinking] block.NrÌ  ú  [thinking] r³  r�  z\n\s*\n+ú
rZ   r‚  c              3   óf   K  — | ],}|                      ¦   «         ¯|                      ¦   «         V — Œ-d S r\   r  ©rW   rÖ  s     rK   r`   z4HermesCLI._emit_reasoning_preview.<locals>.<genexpr>+
  s<   è è € Ð_Ð_°ÐRV×R\ÒR\ÑR^ÔR^Ð_˜tŸzšz™|œ|Ð_Ð_Ð_Ð_Ð_Ð_rM   r+  r8  z[thinking] rœ  ú
  ... (ú more lines))rG   rž   rÖ  r×  rv   rÐ  r  rC   r  r„  rb   r¿  r–   ÚtextwrapÚfillrå   rj  Ú_DIMÚ_RST)r7  r�  Úpreview_textÚ
term_widthr+  Ú
wrap_widthÚ
paragraphsÚraw_paragraphsÚ	paragraphrí   ÚlinesÚpreviews               rK   Ú_emit_reasoning_previewz!HermesCLI._emit_reasoning_preview
  së  € à%×+Ò+Ñ-Ô-ˆØð 	ØˆFð	ÝÔ1Ñ3Ô3Ô;ˆJˆJøÝð 	ð 	ð 	ØˆJˆJˆJð	øøøà ˆÝ˜˜Z­#¨f©+¬+Ñ5¸Ñ9Ñ:Ô:ˆ
àˆ
Ýœ +¨|×/CÒ/CÀFÈDÑ/QÔ/QÑRÔRˆØ'ð 	Lð 	LˆIØ—h’hÐ_Ð_¸	×8LÒ8LÑ8NÔ8NÐ_Ñ_Ô_Ñ_Ô_ˆGØð LØ×!Ò!¥(¤-°¸zÐ"JÑ"JÔ"JÑKÔKÐKøØ—y’y Ñ,Ô,ˆØð 	ØˆFàŒ<ð 	ÝÐ>�Ð>Ð>¨,Ð>½Ð>Ð>Ñ?Ô?Ð?ØˆFà×'Ò'Ñ)Ô)ˆÝˆu‰:Œ:˜Š>ˆ>Ø—i’i  b q b¤	Ñ*Ô*ˆGØÐ?¥3 u¡:¤:°¡>Ð?Ð?Ð?Ñ?ˆGˆGà"ˆGÝÐ5•TÐ5Ð5 gÐ5­tÐ5Ð5Ñ6Ô6Ð6Ð6Ð6s   š3 ³AÁArz  r  c          	      ó
  — t          | dd¦  «        }|sdS 	 t          j        ¦   «         j        }n# t          $ r d}Y nw xY wt          d|t          d¦  «        z
  dz
  ¦  «        }d}|r|}d}�n^|                     d¦  «        }t          d	|d
z  ¦  «        }|dk    rŠ||k    si|                     d¦  «        sT|                     d¦  «        s?|                     d¦  «        s*|                     d¦  «        s|                     d¦  «        r|d|dz   …         }||dz   d…         }n¦t          |¦  «        |k    r“t          d|dz  ¦  «        }t          t          |¦  «        t          ||d
z  z   |dz   ¦  «        ¦  «        }	d}
dD ]'}t          |
|                     |||	¦  «        ¦  «        }
Œ(|
dk    r|d|
dz   …         }||
dz   d…         }|r| 
                    ¦   «         n|| _        |r|                      |¦  «         dS dS )zïFlush buffered reasoning text at natural boundaries.

        Some providers stream reasoning in tiny word or punctuation chunks.
        Buffer them here so the preview path does not print one `[thinking]`
        line per token.
        rs  r:   NrÌ  é(   rƒ  r¶  rZ   r$  rý  r  r]  z.
z!
z?
z:
r  rÓ  r�  rª  )r‚  ú	rÁ   ú!r¦  r'  r&  r‘  )r–  rž   rÖ  r×  rv   rÐ  r  ÚrfindrÀ  r  Úlstriprs  r•  )r7  r  ÚbufrŽ  Útarget_widthÚ
flush_textÚ
line_breakÚmin_newline_flushÚsearch_startÚ
search_endÚcutÚboundarys               rK   r{  z"HermesCLI._flush_reasoning_preview>
  sf  € õ �dÐ4°bÑ9Ô9ˆØð 	ØˆFð	ÝÔ1Ñ3Ô3Ô;ˆJˆJøÝð 	ð 	ð 	ØˆJˆJˆJð	øøøå˜2˜z­C°Ñ,@Ô,@Ñ@À1ÑDÑEÔEˆàˆ
àð 	)ØˆJØˆC‰CàŸš 4™œˆJÝ # B¨¸Ñ(9Ñ :Ô :ÐØ˜RÒÐØÐ/Ò/Ð/Ø—<’< Ñ'Ô'ð 0à—<’< Ñ&Ô&ð 0ð —<’< Ñ&Ô&ð 0ð —<’< Ñ&Ô&ð	 0ð
 —<’< Ñ&Ô&ð 0ð !Ð!1 :°¡>Ð!1Ô2�
Ø˜* q™.Ð*Ð*Ô+��Ý�S‘”˜\Ò)Ð)Ý" 2 |°qÑ'8Ñ9Ô9�Ý ¥ S¡¤­3¨|¸|ÈqÑ?PÑ/QÐS_ÐbcÑScÑ+dÔ+dÑeÔe�
Ø�Ø Ið Rð R�HÝ˜c 3§9¢9¨X°|ÀZÑ#PÔ#PÑQÔQ�C�CØ˜"’9�9Ø!$ Y s¨Q¡w Y¤�JØ˜c A™g˜i˜iœ.�Cà6@Ð&I c§j¢j¡l¤l lÀcˆÔ#Øð 	5Ø×(Ò(¨Ñ4Ô4Ð4Ð4Ð4ð	5ð 	5s   —0 °?¾?r³  c                 óÌ  — |                      d¦  «        }t          |¦  «        dk    r"dt          ¦   «         › dt          |¦  «        › d�S t	          t          | dd¦  «        ¦  «        }t	          t          | dd¦  «        ¦  «        }t          d|¦  «        }t          d	|¦  «        }|d
|…         }t          d	t          |¦  «        t          |¦  «        z
  ¦  «        }t          ||¦  «        }|r|| d
…         ng }t          |¦  «        t          |¦  «        z
  t          |¦  «        z
  }	|	d	k     rd	}	g }dt          ¦   «         › dt          |d	         ¦  «        › d�g}
|
                     d„ |dd
…         D ¦   «         ¦  «         |	d	k    r&|	dk    rdnd}|
 	                    d|	› d|› d�¦  «         |
                     d„ |D ¦   «         ¦  «         d 
                    |
¦  «        S )z5Format the submitted user-message scrollback preview.rZ   r  ú[bold õ   ]â—�[/] [bold]rU  rn  r�  ro  r   Nc              3   ó<   K  — | ]}d t          |¦  «        › d�V — ŒdS ©z[bold]rU  N©Ú_escaper†  s     rK   r`   zCHermesCLI._format_submitted_user_message_preview.<locals>.<genexpr>†
  s4   è è € ÐNÐN¸TÐ8¥g¨d¡m¤mÐ8Ð8Ð8ÐNÐNÐNÐNÐNÐNrM   rÖ  r“  z[dim]... (+z more ú)[/]c              3   ó<   K  — | ]}d t          |¦  «        › d�V — ŒdS r©  rª  r†  s     rK   r`   zCHermesCLI._format_submitted_user_message_preview.<locals>.<genexpr>Œ
  s4   è è € ÐJÐJ¸TÐ8¥g¨d¡m¤mÐ8Ð8Ð8ÐJÐJÐJÐJÐJÐJrM   )r  r  rT  r«  rô  r–  rÐ  r  Úextendr–   rb   )r7  r³  r“  rC  rD  ÚheadÚremaining_after_headÚ
tail_countÚtailÚhidden_middle_countÚpreview_linesÚnouns               rK   Ú&_format_submitted_user_message_previewz0HermesCLI._format_submitted_user_message_previewo
  s  € à× Ò  Ñ&Ô&ˆÝˆu‰:Œ:˜Š?ˆ?ØQ�K™MœMÐQÐQ½ÀÑ9LÔ9LÐQÐQÐQÐQå�' $Ð(JÈAÑNÔNÑOÔOˆÝ� Ð'HÈ!ÑLÔLÑMÔMˆ
Ý˜!˜[Ñ)Ô)ˆÝ˜˜JÑ'Ô'ˆ
Ø�\�k�\Ô"ˆÝ" 1¥c¨%¡j¤jµ3°t±9´9Ñ&<Ñ=Ô=ÐÝ˜Ð%9Ñ:Ô:ˆ
Ø&0Ð8ˆu�j�[�\�\Ô"Ð"°bˆå! %™jœj­3¨t©9¬9Ñ4µs¸4±y´yÑ@ÐØ Ò"Ð"Ø"#ÐØˆDð H•[‘]”]ÐGÐGµ'¸$¸q¼'Ñ2BÔ2BÐGÐGÐGð
ˆð 	×ÒÐNÐNÀTÈ!È"È"ÄXÐNÑNÔNÑNÔNÐNà Ò"Ð"Ø0°AÒ5Ð5�6�6¸7ˆDØ× Ò Ð!TÐ/BÐ!TÐ!TÈ$Ð!TÐ!TÐ!TÑUÔUÐUà×ÒÐJÐJÀTÐJÑJÔJÑJÔJÐJØ�yŠy˜Ñ'Ô'Ð'rM   c                 ó–   — t          |t          ¦  «        rd|vr|pdS t          j        d¦  «        }d„ }|                     ||¦  «        S )z@Expand [Pasted text #N -> file] placeholders into file contents.ú[Pasted text #r:   ú,\[Pasted text #\d+: \d+ lines \u2192 (.+?)\]c                 óÄ   — t          |                      d¦  «        ¦  «        }|                     ¦   «         r|                     d¬¦  «        n|                      d¦  «        S )Nr  rj   rk   r   )r   Úgrouprp   r¾  )Úmatchrw   s     rK   Ú_expand_refz7HermesCLI._expand_paste_references.<locals>._expand_ref•
  sJ   € Ý˜Ÿš A™œÑ'Ô'ˆDØ7;·{²{±}´}ÐX�4—>’>¨7�>Ñ3Ô3Ð3È%Ï+Ê+ÐVWÉ.Ì.ÐXrM   )rR   rU   rC   ÚcompilerD   )r7  r6   Úpaste_ref_rer½  s       rK   Ú_expand_paste_referencesz"HermesCLI._expand_paste_references�
  sc   € å˜$¥Ñ$Ô$ð 	Ð(8ÀÐ(DÐ(DØ�:˜2ÐÝ”zÐ"QÑRÔRˆð	Yð 	Yð 	Yð ×Ò ¨TÑ2Ô2Ð2rM   c                 ó†  — t          ¦   «                              dt          ¦   «         › dd› d�¦  «         t          |pd¦  «        }d|v r6t          ¦   «                              |                      |¦  «        ¦  «         d	S t          ¦   «                              dt          ¦   «         › dt          |¦  «        › d�¦  «         d	S )
z=Render a user message using the normal chat scrollback style.rÞ  r£  õx   â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€rU  r:   rZ   r¦  r§  N)ré  r¹  rT  rU   r¶  r«  )r7  r³  r6   s      rK   Ú_print_user_message_previewz%HermesCLI._print_user_message_preview›
  sµ   € å‰Œ×ÒÐ?¥¡¤Ð?Ð?°
Ð?Ð?Ð?Ñ@Ô@Ð@Ý�:Ð# Ñ$Ô$ˆØ�4ˆ<ˆ<Ý‰MŒM×Ò × KÒ KÈDÑ QÔ QÑRÔRÐRÐRÐRå‰MŒM×ÒÐ X­©¬Ð XÐ XÅgÈdÁmÄmÐ XÐ XÐ XÑYÔYÐYÐYÐYrM   c                 ó¤  — |sdS d| _         t          | dd¦  «        rdS t          | dd¦  «        snd| _        t          j        ¦   «         j        }d}|dz
  t          |¦  «        z
  }t          dt          › d	|› d
t          |dz
  d¦  «        z  › dt          › �¦  «         t          | dd¦  «        |z   | _        d| j        v rK| j                             dd¦  «        \  }| _        t          t          › |› t          › �¦  «         d| j        v °Kt          | j        ¦  «        dk    r-t          t          › | j        › t          › �¦  «         d| _        dS dS )uæ  Stream reasoning/thinking tokens into a dim box above the response.

        Opens a dim reasoning box on first token, streams line-by-line.
        The box is closed automatically when content tokens start arriving
        (via _stream_delta â†’ _emit_stream_text).

        Once the response box is open, suppress any further reasoning
        rendering â€” a late thinking block (e.g. after an interrupt) would
        otherwise draw a reasoning box inside the response box.
        NTrr  FÚ_reasoning_box_openedú Reasoning r�  rZ   õ   â”Œâ”€õ   â”€r  r   õ   â”�Ú_reasoning_bufr:   rÌ  )Ú_reasoning_shown_this_turnr–  rÅ  rž   rÖ  r×  r  rj  r‹  rÐ  rŒ  rÊ  r  )r7  r6   r  Úr_labelÚr_fillrÖ  s         rK   r~  z!HermesCLI._stream_reasoning_delta¤
  sƒ  € ð ð 	ØˆFØ*.ˆÔ'Ý�4Ð-¨uÑ5Ô5ð 	ØˆFõ �tÐ4°eÑ<Ô<ð 	UØ)-ˆDÔ&ÝÔ(Ñ*Ô*Ô2ˆAØ#ˆGØ˜‘U�S ™\œ\Ñ)ˆFÝÐS�ÐSÐS WÐS¨eµc¸&À1¹*ÀaÑ6HÔ6HÑ.HÐSÐSÍTÐSÐSÑTÔTÐTå% dÐ,<¸bÑAÔAÀDÑHˆÔð �dÔ)Ð)Ð)Ø(,Ô(;×(AÒ(AÀ$ÈÑ(JÔ(JÑ%ˆD�$Ô%Ý•tÐ)˜TÐ)¥4Ð)Ð)Ñ*Ô*Ð*ð �dÔ)Ð)Ð)õ ˆtÔ"Ñ#Ô# bÒ(Ð(Ý•tÐ8˜TÔ0Ð8µ$Ð8Ð8Ñ9Ô9Ð9Ø"$ˆDÔÐÐð )Ð(rM   c                 óŒ  — t          | dd¦  «        r°t          | dd¦  «        }|r&t          t          › |› t          › �¦  «         d| _        t          j        ¦   «         j        }t          t          › dd|dz
  z  › dt          › �¦  «         d| _        t          | d	d¦  «        }|r d| _	        |  
                    |¦  «         d
S d
S d
S )z*Close the live reasoning box if it's open.rÅ  FrÊ  r:   õ   â””rÈ  r�  õ   â”˜Ú_deferred_contentN)r–  rj  r‹  rŒ  rÊ  rž   rÖ  r×  rÅ  rÑ  Ú_emit_stream_text)r7  rœ  r  Údeferreds       rK   Ú_close_reasoning_boxzHermesCLI._close_reasoning_boxÈ
  sî   € å�4Ð0°%Ñ8Ô8ð 	1å˜$Ð 0°"Ñ5Ô5ˆCØð )Ý�4Ð, Ð,¥dÐ,Ð,Ñ-Ô-Ð-Ø&(�Ô#ÝÔ(Ñ*Ô*Ô2ˆAÝ•tÐ:Ð: ¨¨Q©¡Ð:Ð:µDÐ:Ð:Ñ;Ô;Ð;Ø).ˆDÔ&õ ˜tÐ%8¸"Ñ=Ô=ˆHØð 1Ø)+�Ô&Ø×&Ò& xÑ0Ô0Ð0Ð0Ð0ð	1ð 	1ð1ð 1rM   c                 ó0  — |€*|                       ¦   «          |                      ¦   «          dS |sdS d| _        d}d}t          | dd¦  «        |z   | _        t          | d¦  «        sd| _        t          | dd	¦  «        �sù|D �]0}d
}	 | j                             ||¦  «        }|dk    rnõ| j        d|…         }|d
k    rt          | dd¦  «        }nh|                     d¦  «        }	|	dk    r*t          | dd¦  «        o| 	                    ¦   «         dk    }n#||	dz   d…          	                    ¦   «         dk    }|r]|r/|  
                    |¦  «         |                     d¦  «        | _        d| _        | j        |t          |¦  «        z   d…         | _        n|dz   }�Œt          | dd	¦  «        r n�Œ2t          | dd	¦  «        s´| j        }
|D ]V}t          dt          |¦  «        ¦  «        D ]6}| j                             |d|…         ¦  «        r| j        d| …         }
 nŒ7ŒW|
rP|  
                    |
¦  «         |
                     d¦  «        | _        | j        t          |
¦  «        d…         | _        dS t          | dd	¦  «        �r|D ]–}| j                             |¦  «        }|dk    rtd	| _        | j        r&| j        d|…         }|r|                      |¦  «         | j        |t          |¦  «        z   d…         }d| _        |r|                      |¦  «          dS Œ—t%          d„ |D ¦   «         ¦  «        }t          | j        ¦  «        |k    rA| j        r%| j        d| …         }|                      |¦  «         | j        | d…         | _        dS dS )a£  Line-buffered streaming callback for real-time token rendering.

        Receives text deltas from the agent as tokens arrive. Buffers
        partial lines and emits complete lines via _cprint to work
        reliably with prompt_toolkit's patch_stdout.

        Reasoning/thinking blocks (<REASONING_SCRATCHPAD>, <think>, etc.)
        are suppressed during streaming since they'd display raw XML tags.
        The agent strips them from the final response anyway.

        A ``None`` value signals an intermediate turn boundary (tools are
        about to execute).  Flushes any open boxes and resets state so
        tool feed lines render cleanly between turns.
        NT)z<REASONING_SCRATCHPAD>z<think>z<reasoning>z
<THINKING>z
<thinking>z	<thought>)z</REASONING_SCRATCHPAD>z</think>z</reasoning>z</THINKING>z</thinking>z
</thought>Ú_stream_prefiltr:   Ú_stream_last_was_newlineÚ_in_reasoning_blockFr   r  rZ   r  c              3   ó4   K  — | ]}t          |¦  «        V — Œd S r\   ©r  ©rW   rR  s     rK   r`   z*HermesCLI._stream_delta.<locals>.<genexpr>]  s(   è è € Ð:Ð:¨�c !™fœfÐ:Ð:Ð:Ð:Ð:Ð:rM   )Ú_flush_streamÚ_reset_stream_staterq  r–  rÖ  r•  r×  Úfindrš  rG   rÒ  rÀ  rØ  r  r  rï   r~  Ú_stream_deltarÐ  )r7  r6   Ú
_OPEN_TAGSÚ_CLOSE_TAGSrI   r¡  r¹  Ú	precedingÚis_block_boundaryÚlast_nlÚsafer  r  ÚafterÚmax_tag_lenÚsafe_reasonings                   rK   rß  zHermesCLI._stream_deltaÚ
  s[  € ð ˆ<Ø×ÒÑ Ô Ð Ø×$Ò$Ñ&Ô&Ð&ØˆFØð 	ØˆFà#ˆÔð sˆ
Øyˆõ  ' tÐ->ÀÑCÔCÀdÑJˆÔõ �tÐ7Ñ8Ô8ð 	1Ø,0ˆDÔ)å�tÐ2°EÑ:Ô:ñ 7	Ø!ð 'ñ '�Ø �ð#+ØÔ.×3Ò3°C¸ÑFÔF�CØ˜b’y�yØà $Ô 4°T°c°TÔ :�IØ˜a’x�xõ -4°DÐ:TÐVZÑ,[Ô,[Ð)Ð)ð #,§/¢/°$Ñ"7Ô"7˜Ø" bš=˜=õ
 !(¨Ð.HÈ$Ñ OÔ Oð !<Ø$-§O¢OÑ$5Ô$5¸Ò$;ð .Ð-ð 1:¸'ÀA¹+¸,¸,Ô0G×0MÒ0MÑ0OÔ0OÐSUÒ0UÐ-Ø(ð à$ð UØ ×2Ò2°9Ñ=Ô=Ð=Ø<E×<NÒ<NÈtÑ<TÔ<T˜DÔ9Ø37˜Ô0Ø/3Ô/CÀCÍ#ÈcÉ(Ì(ÁNÀOÀOÔ/T˜Ô,Øà#&¨¡7�LñG#+õH ˜4Ð!6¸Ñ>Ô>ð Ø�Eñõ ˜4Ð!6¸Ñ>Ô>ð àÔ+�Ø%ð "ð "�CÝ" 1¥c¨#¡h¤hÑ/Ô/ð "ð "˜ØÔ/×8Ò8¸¸R¸a¸R¼ÑAÔAð "Ø#'Ô#7¸¸!¸¸Ô#<˜DØ!˜Eð"øð ð LØ×*Ò*¨4Ñ0Ô0Ð0Ø48·M²MÀ$Ñ4GÔ4G�DÔ1Ø+/Ô+?ÅÀDÁ	Ä	À
À
Ô+K�DÔ(Ø�õ
 �4Ð.°Ñ6Ô6ñ 	Ø"ð ð �ØÔ*×/Ò/°Ñ4Ô4�Ø˜"’9�9Ø/4�DÔ,ð Ô*ð @Ø $Ô 4°T°c°TÔ :˜Ø ð @Ø ×8Ò8¸Ñ?Ô?Ð?Ø Ô0°µs¸3±x´x±°°ÔA�EØ+-�DÔ(ð ð 2Ø×*Ò*¨5Ñ1Ô1Ð1Ø�F�Fð õ$ Ð:Ð:¨kÐ:Ñ:Ô:Ñ:Ô:ˆKÝ�4Ô'Ñ(Ô(¨;Ò6Ð6ØÔ&ð Aà%)Ô%9¸-¸K¸<¸-Ô%H�NØ×0Ò0°Ñ@Ô@Ð@Ø'+Ô';¸[¸L¸M¸MÔ'J�Ô$ØˆFð9	ð 	rM   c                 óŒ  — |sdS | j         r,t          | dd¦  «        rt          | dd¦  «        |z   | _        dS |                      ¦   «          | j        �sP|                     d¦  «        }|sdS d| _        	 dd	lm}  |¦   «         }|                     d
d¦  «        }| 	                    dd¦  «        }n# t          $ r d}d}Y nw xY w	 t          |dd…         d¦  «        }t          |dd…         d¦  «        }t          |dd…         d¦  «        }d|› d|› d|› d�| _        n# t          t          f$ r
 d| _        Y nw xY wt          j        ¦   «         j        }	|	dz
  t%          |¦  «        z
  }
t'          dt(          › d|› dt+          |
dz
  d¦  «        z  › dt,          › �¦  «         | xj        |z  c_        t          | dd¦  «        }d| j        v rv| j                             dd¦  «        \  }| _        | j        dk    rt5          |¦  «        }t'          |rt6          › |› |› t,          › �n
t6          › |› �¦  «         d| j        v °tdS dS )z,Emit filtered text to the streaming display.NrÅ  FrÑ  r:   rZ   Tr   r:  Úresponse_labelõ
   âš• HermesÚbanner_textú#FFF8DCr  rý  r$  rœ  r%  z[38;2;r&  r'  r�  õ   â•­â”€rÈ  õ   â•®Ú_stream_text_ansirG   )rï   r–  rÑ  rÔ  rr  r›  r<  r;  r  r=  rv   rô  rð  r¦  r(  rž   rÖ  r×  r  rj  Ú_ACCENTrÐ  rŒ  rp  r  r@  r`  Ú_STREAM_PAD)r7  r6   r;  r  ÚlabelÚ	_text_hexÚ_rÚ_gÚ_br  rŠ  Ú_tcrÖ  s                rK   rÒ  zHermesCLI._emit_stream_textf  s×  € àð 	ØˆFð
 Ôð 	¥7¨4Ð1HÈ%Ñ#PÔ#Pð 	Ý%,¨TÐ3FÈÑ%KÔ%KÈdÑ%RˆDÔ"ØˆFð 	×!Ò!Ñ#Ô#Ð#ð Ô&ñ 	Tà—;’;˜tÑ$Ô$ˆDØð Ø�Ø&*ˆDÔ#ð&ØBÐBÐBÐBÐBÐBØ'˜Ñ)Ô)�Ø×*Ò*Ð+;¸\ÑJÔJ�Ø!ŸOšO¨M¸9ÑEÔE�	�	øÝð &ð &ð &Ø$�Ø%�	�	�	ð&øøøð
,Ý˜ 1 Q 3œ¨Ñ,Ô,�Ý˜ 1 Q 3œ¨Ñ,Ô,�Ý˜ 1 Q 3œ¨Ñ,Ô,�Ø)E°bÐ)EÐ)E¸2Ð)EÐ)EÀÐ)EÐ)EÐ)E�Ô&Ð&øÝ¥
Ð+ð ,ð ,ð ,Ø)+�Ô&Ð&Ð&ð,øøøåÔ(Ñ*Ô*Ô2ˆAØ�q‘5�3˜u™:œ:Ñ%ˆDÝÐR�ÐRÐR¨ÐR¨uµs¸4À!¹8ÀQÑ7GÔ7GÑ/GÐRÐRÍDÐRÐRÑSÔSÐSàÐÔ˜DÑ ÐÔõ �dÐ/°Ñ4Ô4ˆØ�dÔ&Ð&Ð&Ø%)Ô%5×%;Ò%;¸DÀ!Ñ%DÔ%DÑ"ˆD�$Ô"ØÔ+¨wÒ6Ð6Ý-¨dÑ3Ô3�Ý¸ÐX•{Ð5 CÐ5¨Ð5­tÐ5Ð5Ð5Å[ÐBXÐRVÐBXÐBXÑYÔYÐYð	 �dÔ&Ð&Ð&Ð&Ð&Ð&Ð&s%   Á5<B2 Â2CÃCÃAD! Ä!D<Ä;D<c                 ó8  — t          | dd¦  «        r9t          | dd¦  «        r(d| _        |                      | j        ¦  «         d| _        |                      ¦   «          | j        rlt          | dd¦  «        }| j        dk    rt          | j        ¦  «        n| j        }t          |rt          › |› |› t          › �n
t          › |› �¦  «         d| _        | j        rAt          j        ¦   «         j        }t          t          › dd|d	z
  z  › d
t          › �¦  «         dS dS )zIEmit any remaining partial line from the stream buffer and close the box.rØ  FrÖ  r:   rð  rG   õ   â•°rÈ  r�  õ   â•¯N)r–  rØ  rÒ  rÖ  rÔ  rp  r@  r`  rj  rò  rŒ  rr  rž   rÖ  r×  rñ  )r7  rø  rÖ  r  s       rK   rÜ  zHermesCLI._flush_stream›  sI  € õ
 �4Ð.°Ñ6Ô6ð 	&½7À4ÐIZÐ\^Ñ;_Ô;_ð 	&Ø',ˆDÔ$Ø×"Ò" 4Ô#7Ñ8Ô8Ð8Ø#%ˆDÔ ð 	×!Ò!Ñ#Ô#Ð#àÔð 	"Ý˜$Ð 3°RÑ8Ô8ˆCØ?CÔ?[Ð_fÒ?fÐ?fÕ)¨$Ô*:Ñ;Ô;Ð;ÐlpÔl|ˆDÝ¸ÐX•{Ð5 CÐ5¨Ð5­tÐ5Ð5Ð5Å[ÐBXÐRVÐBXÐBXÑYÔYÐYØ!ˆDÔð Ô"ð 	?ÝÔ(Ñ*Ô*Ô2ˆAÝ•wÐ=Ð= 5¨A°©E¡?Ð=Ð=µtÐ=Ð=Ñ>Ô>Ð>Ð>Ð>ð	?ð 	?rM   c                 ó    — d| _         d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _	        d| _
        dS )z3Reset streaming state before each agent invocation.r:   FTN)rp  rq  rr  rð  rÖ  rØ  r×  rÅ  rÊ  rs  rÑ  rG  s    rK   rÝ  zHermesCLI._reset_stream_state³  s`   € àˆÔØ$ˆÔØ"'ˆÔØ!#ˆÔØ!ˆÔØ#(ˆÔ Ø(,ˆÔ%Ø%*ˆÔ"Ø ˆÔØ&(ˆÔ#Ø!#ˆÔÐÐrM   r   c                 óv  — |                      ¦   «                              ¦   «         }|                     d¦  «        rdS |                     d¦  «        rdS |                     d¦  «        rdS |                     d¦  «        rdS |                     d	¦  «        rd
S |dk    rdS |                     d¦  «        rdS dS )z>Return a user-facing status message for slower slash commands.z/skills searchzSearching skills...z/skills browsezLoading skills...z/skills inspectzInspecting skill...z/skills installzInstalling skill...z/skillszProcessing skills command...z/reload-mcpzReloading MCP servers...z/browserzConfiguring browser...úProcessing command...)rŒ   rG   rÅ  )r7  r   Ú	cmd_lowers      rK   Ú_slow_command_statuszHermesCLI._slow_command_statusÁ  sÞ   € à—M’M‘O”O×)Ò)Ñ+Ô+ˆ	Ø×ÒÐ 0Ñ1Ô1ð 	)Ø(Ð(Ø×ÒÐ 0Ñ1Ô1ð 	'Ø&Ð&Ø×ÒÐ 1Ñ2Ô2ð 	)Ø(Ð(Ø×ÒÐ 1Ñ2Ô2ð 	)Ø(Ð(Ø×Ò 	Ñ*Ô*ð 	2Ø1Ð1Ø˜Ò%Ð%Ø-Ð-Ø×Ò 
Ñ+Ô+ð 	,Ø+Ð+Ø&Ð&rM   c                 óŒ   — t          t          j        ¦   «         dz  ¦  «        t          t          ¦  «        z  }t          |         S )z9Return the current spinner frame for slow slash commands.rá  )rô  rÿ  rÔ  r  Ú_COMMAND_SPINNER_FRAMES)r7  Ú	frame_idxs     rK   Ú_command_spinner_framez HermesCLI._command_spinner_frameÔ  s5   € å�œÑ(Ô(¨2Ñ-Ñ.Ô.µÕ5LÑ1MÔ1MÑMˆ	Ý& yÔ1Ð1rM   rý  c              #   ó  K  — d| _         || _        |                      d¬¦  «         	 t          d|› �¦  «         dV — d| _         d| _        |                      d¬¦  «         dS # d| _         d| _        |                      d¬¦  «         w xY w)zDExpose a temporary busy state in the TUI while a slash command runs.Trb  ©rÒ  u   â�³ NFr:   )r¯  r°  rÖ  r¹  )r7  rý  s     rK   Ú_busy_commandzHermesCLI._busy_commandÙ  s®   è è € ð !%ˆÔØ%ˆÔØ×Ò cÐÑ*Ô*Ð*ð	/Ý�/˜�/�/Ñ"Ô"Ð"ØˆEˆEˆEà$)ˆDÔ!Ø#%ˆDÔ Ø×Ò¨#ÐÑ.Ô.Ð.Ð.Ð.øð %*ˆDÔ!Ø#%ˆDÔ Ø×Ò¨#ÐÑ.Ô.Ð.Ð.øøøs   ¨A$ Á$&B
c                 ó$  — t          | dd¦  «        }|s t          t          › dt          › �¦  «         dS | j        r t          t          › dt          › �¦  «         dS | j        s| j        s| j        s| j        r t          t          › dt          › �¦  «         dS |pt          |dd¦  «        }|€ t          t          › dt          › �¦  «         dS 	 t          |d	d
¦  «        }|  	                    |¦  «        }||k    rBt          |d	¦  «        r2d| _        ||_        t          |d¦  «        rt          |¦  «        |_        d| _        |                     d¬¦  «         dS # t           $ r+}t          t          › d|› t          › �¦  «         Y d}~dS d}~ww xY w)z3Open the active input buffer in an external editor.rŒ  Nz=External editor is only available inside the interactive CLI.FzAWait for the current command to finish before opening the editor.z3Finish the active prompt before opening the editor.Úcurrent_bufferz<No active input buffer is available for the external editor.r6   r:   TÚcursor_position)Úvalidate_and_handlez Failed to open external editor: )r–  rj  r‹  rŒ  r¯  r   r©  r£  r�  rÀ  r•  Ú_skip_paste_collapser6   r  r
  Úopen_in_editorrv   )r7  Úbufferr¶   Útarget_bufferÚexisting_textÚexpanded_textrø  s          rK   Ú_open_external_editorzHermesCLI._open_external_editorç  sÞ  € å�d˜F DÑ)Ô)ˆØð 	Ý•tÐ`Ð`ÕZ^Ð`Ð`ÑaÔaÐaØ�5ØÔ ð 	Ý•tÐdÐdÕ^bÐdÐdÑeÔeÐeØ�5ØÔð 	˜tÔ1ð 	°TÔ5Ið 	ÈTÔM`ð 	Ý•tÐVÐVÕPTÐVÐVÑWÔWÐWØ�5ØÐF¥'¨#Ð/?ÀÑ"FÔ"FˆØÐ Ý•tÐ_Ð_ÕY]Ð_Ð_Ñ`Ô`Ð`Ø�5ð	Ý# M°6¸2Ñ>Ô>ˆMØ ×9Ò9¸-ÑHÔHˆMØ Ò-Ð-µ'¸-ÈÑ2PÔ2PÐ-Ø,0�Ô)Ø%2�Ô"Ý˜=Ð*;Ñ<Ô<ð GÝ47¸Ñ4FÔ4F�MÔ1ð )-ˆDÔ%Ø×(Ò(¸UÐ(ÑCÔCÐCØ�4øÝð 	ð 	ð 	Ý•tÐHÐH¸SÐHÅ$ÐHÐHÑIÔIÐIØ�5�5�5�5�5øøøøð	øøøs   ÃBE Å
FÅ$ F
Æ
Fc                 ó   — ddl m}m} d}d}	  || j        | j        | j        ¬¦  «        }n# t          $ r}|}Y d}~nd}~ww xY w|�€
|��ddlm} t          ||¦  «        rñt          | j
        t          ¦  «        r| j
        ng }|D ]Ë}|                     d¦  «        pd                     ¦   «                              ¦   «         }	|                     d¦  «        pd                     ¦   «         }
|	r|
sŒk	  ||	¬	¦  «        }t                               d
||	|
¦  «         t#          d|	› d|
› �¦  «         |	| _        |
| _        d} n# t          $ r Y ŒÈw xY w|€6|r ||¦  «        nd}t'          ¦   «                              d|› d�¦  «         dS |                     d¦  «        }|                     d¦  «        }|                     dd¦  «        }|                     d| j        ¦  «        }|                     d¦  «        }t          |                     d¦  «        pg ¦  «        }|                     d¦  «        }t          |t,          ¦  «        r|sc|                     dd¦  «        }t          |t,          ¦  «        o|od|v}|rd}t                               d||¦  «         nt)          d¦  «         dS t          |t,          ¦  «        r|st)          d¦  «         dS || j        k    p
|| j        k    }|| j        k    p || j        k    p|| j        k    p
|| j        k    }|| _        || _        || _        || _        || _        |                     d¦  «        | _        || _        || _        |                     d¦  «        }|rTt          |t,          ¦  «        r?| j         p-| j        | j        k    p| j        |                     d¦  «        k    }|r|| _        | j        sJ|rH	 ddlm }  ||¦  «        }|r#|| _        t           !                    d ||¦  «         n# t          $ r Y nw xY w|  "                    |¦  «        }|s|s|r| j#        �d| _#        d| _$        d!S )"a  
        Ensure runtime credentials are resolved before agent use.
        Re-resolves provider credentials so key rotation and token refresh
        are picked up without restarting the CLI.
        Returns True if credentials are ready, False on auth failure.
        r   )Úresolve_runtime_providerÚformat_runtime_provider_errorN)Ú	requestedÚexplicit_api_keyÚexplicit_base_url)Ú	AuthErrorr¿   r:   rõ   )r  zEPrimary provider auth failed (%s). Falling through to fallback: %s/%su7   âš ï¸�  Primary auth failed â€” switching to fallback: ú / zProvider resolution failed.z
[bold red]rU  Frö   r¾   Ú
openrouterr{  r   rø  Úcredential_poolÚsourcerK  zno-key-requireduh   No API key for custom endpoint %s (source=%s), using placeholder â€” local servers typically ignore authua   
âš ï¸�  Provider resolver returned an empty API key. Set OPENROUTER_API_KEY or run: hermes setupuf   
âš ï¸�  Provider resolver returned an empty base URL. Check your provider config or run: hermes setupr    )Úget_default_model_for_provideru8   No model configured â€” defaulting to %s for provider %sT)%ru  r  r  ry  rw  rx  rv   Úhermes_cli.authr  rR   rŠ  ra   rT   rG   rŒ   rq   rr   rj  rõ   ré  r¹  r{  rU   rÂ  rö   r¾   r¿   r|  r}  Ú_credential_poolrz  ro  r  rÜ  rx  rþ   r‹  )r7  r  r  Ú_primary_excÚruntimerø  r  Ú	_fb_chainÚ_fbÚ_fb_providerÚ	_fb_modelr¢  rö   r¾   ra  Úresolved_api_modeÚresolved_acp_commandÚresolved_acp_argsÚresolved_credential_poolÚ_sourceÚ_has_custom_baseÚcredentials_changedÚrouting_changedÚruntime_modelÚshould_use_runtime_modelr  Ú_defaultÚmodel_changeds                               rK   Ú_ensure_runtime_credentialsz%HermesCLI._ensure_runtime_credentials  s’  € ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð
 ˆØˆð	Ø.Ð.ØÔ1Ø!%Ô!7Ø"&Ô"9ðñ ô ˆGˆGøõ
 ð 	ð 	ð 	ØˆLˆLˆLˆLˆLˆLøøøøð	øøøð ‰?˜|Ñ7Ø1Ð1Ð1Ð1Ð1Ð1Ý˜,¨	Ñ2Ô2ð !Ý4>¸tÔ?SÕUYÑ4ZÔ4ZÐb˜DÔ0Ð0Ð`b�	Ø$ð !ð !�CØ$'§G¢G¨JÑ$7Ô$7Ð$=¸2×#DÒ#DÑ#FÔ#F×#LÒ#LÑ#NÔ#N�LØ!$§¢¨Ñ!1Ô!1Ð!7°R× >Ò >Ñ @Ô @�IØ'ð !¨yð !Ø ð!Ø":Ð":À\Ð"RÑ"RÔ"R˜ÝŸšØcØ(¨,¸	ñô ð õ  Ð vÐZfÐ vÐ vÐktÐ vÐ vÑwÔwÐwØ2>˜Ô/Ø%.˜œ
Ø'+˜Ø˜øÝ$ð !ð !ð !Ø ˜ð!øøøð ˆ?ØEQÐtÐ3Ð3°LÑAÔAÐAÐWtˆGÝ‰MŒM×ÒÐ 9¨WÐ 9Ð 9Ð 9Ñ:Ô:Ð:Ø�5à—+’+˜iÑ(Ô(ˆØ—;’;˜zÑ*Ô*ˆØ#ŸKšK¨
°LÑAÔAÐØ#ŸKšK¨
°D´MÑBÔBÐØ&Ÿ{š{¨9Ñ5Ô5ÐÝ  §¢¨VÑ!4Ô!4Ð!:¸Ñ;Ô;ÐØ#*§;¢;Ð/@Ñ#AÔ#AÐ Ý˜'¥3Ñ'Ô'ð 	¨wð 	ð
 —k’k (¨BÑ/Ô/ˆGÝ)¨(µCÑ8Ô8Ði¸XÐiÈ/ÐaiÐJiÐØð 
Ø+�Ý—’ðPà˜gñô ð ð õ ð Dñ Eô Eð Eà�uÝ˜(¥CÑ(Ô(ð 	°ð 	Ýð Dñ Eô Eð Eà�5à%¨¬Ò5ÐR¸ÀTÄ]Ò9RÐà ¤Ò.ð 2Ø  D¤MÒ1ð2à# tÔ'7Ò7ð2ð ! D¤MÒ1ð	 	ð *ˆŒØ)ˆŒØ/ˆÔØ)ˆŒØ 8ˆÔØ '§¢¨HÑ 5Ô 5ˆÔØˆŒØ ˆŒð  Ÿš GÑ,Ô,ˆØð 	+�Z¨µsÑ;Ô;ð 	+ð ”J�ð 2Ø”
˜dœmÒ+ð2à”
˜gŸkšk¨&Ñ1Ô1Ò1ð %ð
 (ð +Ø*�”
ð
 Œzð 	Ð/ð 	ð
ØLÐLÐLÐLÐLÐLØ9Ð9Ð:KÑLÔL�Øð Ø!)�D”JÝ—K’KØRØ Ð"3ñô ð øøõ ð ð ð Ø�ðøøøð
 ×:Ò:Ð;LÑMÔMˆð  ð 	6 ?ð 	6°mð 	6ÈÌÐI_ØˆDŒJØ15ˆDÔ.àˆts7   Ž, ¬
A¶=½AÃ2AEÅ
EÅEÏ6P Ð
PÐPÚuser_messagec                 ó¨  — ddl m} | j        | j        | j        | j        | j        t          | j        pg ¦  «        t          | dd¦  «        dœ}| j
        || j
        |d         |d         |d         |d	         t          |d
         ¦  «        fdœ}t          | dd¦  «        }|sd|d<   |S 	  ||d         ¦  «        }n# t          $ r d}Y nw xY w||d<   |S )aL  Build the effective model/runtime config for a single user turn.

        Always uses the session's primary model/provider.  If the user has
        toggled `/fast` on and the current model supports Priority
        Processing / Anthropic fast mode, attach `request_overrides` so the
        API call is marked accordingly.
        r   )Úresolve_fast_mode_overridesr   N©rö   r¾   r¿   r{  r   rø  r  r¿   r¾   r{  r   rø  )rõ   r"  Ú	signatureré   Úrequest_overridesrõ   )ro  r6  rö   r¾   r¿   r{  r|  ra   r}  r–  rõ   r(  rv   )r7  r4  r6  r"  Úrouteré   Ú	overridess          rK   Ú_resolve_turn_agent_configz$HermesCLI._resolve_turn_agent_config–  s*  € ð 	BÐAÐAÐAÐAÐAð ”|ØœØœØœØÔ'Ý˜œÐ,¨"Ñ-Ô-Ý& tÐ-?ÀÑFÔFð
ð 
ˆð ”ZØà”
Ø˜
Ô#Ø˜
Ô#Ø˜
Ô#Ø˜	Ô"Ý�g˜f”oÑ&Ô&ðð
ð 
ˆõ ˜t ^°TÑ:Ô:ˆØð 	Ø)-ˆEÐ%Ñ&ØˆLð	Ø3Ð3°E¸'´NÑCÔCˆIˆIøÝð 	ð 	ð 	ØˆIˆIˆIð	øøøà%.ˆÐ!Ñ"Øˆs   Â)B; Â;C
Ã	C
©Úmodel_overrideÚruntime_overrider9  r>  r?  r9  c                ó„  — | j         �dS |                      ¦   «         sdS | j        €I	 ddlm}  |¦   «         | _        n2# t
          $ r%}t                               d|¦  «         Y d}~nd}~ww xY w| j        �r½| j        �rµ| j	        �s­| j         
                    | j        ¦  «        }|s>t          d| j        › t          › �¦  «         t          t          › dt          › �¦  «         dS 	 | j                             | j        ¦  «        }n# t
          $ r
 | j        }Y nw xY w|r„|| j        k    ryt!          ¦   «                              d	t          › d
t%          | j        ¦  «        › dt%          |¦  «        › d�¦  «         || _        | j         
                    | j        ¦  «        }|r|}| j                             | j        ¦  «        }	|	rÓd„ |	D ¦   «         }	|	| _	        t)          d„ |	D ¦   «         ¦  «        }
d}|                     d¦  «        rd|d         › d�}t!          ¦   «                              dt-          ¦   «         › dt%          | j        ¦  «        › dt-          ¦   «         › dt%          |¦  «        › d|
› d|
dk    rdnd› dt)          |	¦  «        › d�¦  «         nFt!          ¦   «                              dt-          ¦   «         › d
t%          | j        ¦  «        › d�¦  «         	 | j        j                             d| j        f¦  «         | j        j                             ¦   «          n# t
          $ r Y nw xY w	 |pE| j        | j        | j        | j        | j        t?          | j         pg ¦  «        tC          | dd¦  «        d œ}|p| j"        }tG          dLi d!|“d"|                     d"¦  «        “d#|                     d#¦  «        “d$|                     d$¦  «        “d%|                     d%¦  «        “d&|                     d'¦  «        “d(|                     d)¦  «        “d*|                     d*¦  «        “d+| j$        “d,| j%        “d-| j&        “d.| j&         “d/| j'        r| j'        nd“d0| j(        pd“d1| j)        “d2| j*        “d3|“d4| j+        “d5| j,        “d6| j-        “d7| j.        “d8| j/        “d9| j0        “d:| j        “d;d<“d=| j        “d>| j1        “d?|  2                    ¦   «         “d@| j3        “dA| j4        “dB| j5        “dC| j6        “dD| j7        “dE| j8        “dF| j8        “dG| j9        “dH| j:        r| j;        nd“dI| j:        r| j<        nd“dJ| j=        r| j>        nd“dK| j=        r| j?        nd“Ž| _         | j         a@t          | j         _A        ||                     d$¦  «        |                     d#¦  «        |                     d%¦  «        |                     d'¦  «        t…          |                     d)¦  «        pdL¦  «        f| _C        | jD        rƒ| j        r|	 | j         E                    | j        | jD        ¦  «         t          dM| jD        › �¦  «         d| _D        n7# tŒ          t
          f$ r#}t          dN|› �¦  «         d| _D        Y d}~nd}~ww xY wdS # t
          $ r0}t!          ¦   «                              dO|› dP�¦  «         Y d}~dS d}~ww xY w)QzÐ
        Initialize the agent on first use.
        When resuming a session, restores conversation history from SQLite.
        
        Returns:
            bool: True if successful, False otherwise
        NTFr   rc  uF   SQLite session store not available â€” session will NOT be indexed: %sz[1;31mSession not found: z@Use a session ID from a previous CLI run (hermes sessions list).rÞ  ú	]Session ú was compressed into ú2; resuming the descendant with your transcript.[/]c                 óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS ©ÚroleÚsession_metarª  ©rW   r'  s     rK   rY   z)HermesCLI._init_agent.<locals>.<listcomp>õ  s,   € ÐSÐSÐS !°1·5²5¸±=´=ÀNÒ3RÐ3R˜AÐ3RÐ3RÐ3RrM   c                 óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS ©rF  Úuserrª  rH  s     rK   rY   z)HermesCLI._init_agent.<locals>.<listcomp>÷  s,   € Ð PÐ PÐ P q¸¿º¸f¹¼ÈÒ8OÐ8O Ð8OÐ8OÐ8OrM   r:   Útitleú "r~  r¦  u   ]â†» Resumed session[/] [bold]z	[/][bold r£  z[/] (ú user messager  rê  rT  z total messages)ú. found but has no messages. Starting fresh.[/]úCUPDATE sessions SET ended_at = NULL, end_reason = NULL WHERE id = ?r   r7  rõ   rö   r¾   r¿   r{  r|  r   r}  rø  r  rú   r~  Úverbose_loggingÚ
quiet_modeÚephemeral_system_promptr‚  rƒ  ré   r9  Úproviders_allowedÚproviders_ignoredÚproviders_orderÚprovider_sortÚprovider_require_parametersÚprovider_data_collectionrŠ  r‹  rc  rõ  Úclarify_callbackÚreasoning_callbackra  Úthinking_callbackr€  r�  r9  Úskip_context_filesÚskip_memoryÚtool_progress_callbackÚtool_start_callbackÚtool_complete_callbackÚstream_delta_callbackÚtool_gen_callbackr]   z  Session title applied: z!  Could not apply pending title: z&[bold red]Failed to initialize agent: rU  )Grþ   r3  r‘  r’  rd  rv   rq   rr   rŽ  r�  Úget_sessionrŠ  rj  rŒ  r‹  Úresolve_resume_session_idré  r¹  r«  Úget_messages_as_conversationr  rT   rT  Ú_connÚexecuteÚcommitrö   r¾   r¿   r{  r|  ra   r}  r–  rõ   rr  rä   r~  rå   ræ   r‚  rƒ  ré   r…  r†  r‡  r„  rˆ  r‰  Ú_clarify_callbackr€  rŠ  r|  r€  r�  r9  r:  Ú_on_tool_progressrl  Ú_on_tool_startÚ_on_tool_completerk  rß  Ú_on_tool_gen_startr”  Ú	_print_fnr(  r‹  r“  Úset_session_titler¦  )r7  r>  r?  r9  rd  rz   rG  Úresolved_idÚresolved_metaÚrestoredÚ	msg_countÚ
title_partr"  Úeffective_models                 rK   Ú_init_agentzHermesCLI._init_agentÂ  s	  € ð Œ:Ð!Ø�4à×/Ò/Ñ1Ô1ð 	Ø�5ð ÔÐ#ðlØ2Ð2Ð2Ð2Ð2Ð2Ø#, 9¡;¤;�Ô Ð øÝð lð lð lÝ—’ÐgÐijÑkÔkÐkÐkÐkÐkÐkÐkøøøøðløøøð Œ=ñ 1	˜TÔ-ñ 1	°dÔ6Oñ 1	ØÔ+×7Ò7¸¼ÑHÔHˆLØð ÝÐO¸¼ÐOÍÐOÐOÑPÔPÐPÝ�4ÐgÐgÕaeÐgÐgÑhÔhÐhØ�uð.Ø"Ô.×HÒHÈÌÑYÔY��øÝð .ð .ð .Ø"œo���ð.øøøàð 	1˜{¨d¬oÒ=Ð=Ý‘”×#Ò#ð&�ð &ð &¥w¨t¬Ñ'?Ô'?ð &ð &Ý˜{Ñ+Ô+ð&ð &ð &ñô ð ð
 #.�”Ø $Ô 0× <Ò <¸T¼_Ñ MÔ M�Ø ð 1Ø#0�LØÔ'×DÒDÀTÄ_ÑUÔUˆHØð ØSÐS xÐSÑSÔS�Ø,4�Ô)ÝÐ PÐ P¨HÐ PÑ PÔ PÑQÔQ�	Ø�
Ø×#Ò# GÑ,Ô,ð AØ!@ |°GÔ'<Ð!@Ð!@Ð!@�JÝ‘”×#Ò#ðq�[™]œ]ð qð qÝ$ T¤_Ñ5Ô5ðqð qå(™]œ]ðqð qå-4°ZÑ-@Ô-@ðqð qð "ðqð qð 8AÀA²~°~°°È2ðqð qõ RUÐU]ÑQ^ÔQ^ðqð qð qñô ð ð õ ‘”×#Ò#Ø}�[™]œ]Ð}Ð}µW¸T¼_Ñ5MÔ5MÐ}Ð}Ð}ñô ð ðØÔ Ô&×.Ò.ØYØ”_Ð&ñô ð ð Ô Ô&×-Ò-Ñ/Ô/Ð/Ð/øÝð ð ð Ø�ðøøøðP	Ø&ð Øœ<Ø œMØ œMØ œMØÔ+Ý˜Tœ]Ð0¨bÑ1Ô1Ý#*¨4Ð1CÀTÑ#JÔ#Jð+ð +ˆGð -Ð:°´
ˆOÝ ð *ð *ð *Ø%�oð*àŸš IÑ.Ô.Ð.ð*ð !Ÿš ZÑ0Ô0Ð0ð*ð !Ÿš ZÑ0Ô0Ð0ð	*ð
 !Ÿš ZÑ0Ô0Ð0ð*ð $ŸKšK¨	Ñ2Ô2Ð2ð*ð !Ÿš VÑ,Ô,Ð,ð*ð !(§¢Ð,=Ñ >Ô >Ð >ð*ð  $œ~˜~ð*ð "&Ô!6Ð!6ð*ð !%¤ ð*ð  $œ|Ð+Ð+ð*ð ?CÔ>PÐ(Z¨Ô(:Ð(:ÐVZøð*ð "&Ô!6Ð!>¸$øð*ð "&Ô!6Ð!6ð*ð  "Ô.Ð.ð!*ð" #4Ð"3ð#*ð$ #'Ô"6Ð"6ð%*ð& #'Ô"8Ð"8ð'*ð( !%Ô 5Ð 5ð)*ð* #Ô1Ð1ð+*ð, -1Ô,IÐ,Ið-*ð. *.Ô)GÐ)Gð/*ð0  œ?˜?ð1*ð2 ˜ð3*ð4  Ô+Ð+ð5*ð6 "&Ô!7Ð!7ð7*ð8 $(×#CÒ#CÑ#EÔ#EÐ#Eð9*ð<  $Ô3Ð3ð=*ð> #'Ô"3Ð"3ð?*ð@ %)Ô$<Ð$<ðA*ðB *.Ô)FÐ)FðC*ðD !%Ô 4Ð 4ðE*ðF $(Ô#4Ð#4ðG*ðH !Ô-Ð-ðI*ðJ (,Ô'=Ð'=ðK*ðL <@Ô;UÐ$_ DÔ$7Ð$7Ð[_øðM*ðN BFÔA[Ð'e tÔ'=Ð'=ÐaeøðO*ðP =AÔ<RÐ&\ dÔ&8Ð&8ÐX\øðQ*ðR >BÔ=SÐ"] $Ô"9Ð"9ÐY]øðS*ˆDŒJðZ !%¤
Ðõ $+ˆDŒJÔ àØ—’˜JÑ'Ô'Ø—’˜JÑ'Ô'Ø—’˜JÑ'Ô'Ø—’˜IÑ&Ô&Ý�g—k’k &Ñ)Ô)Ð/¨RÑ0Ô0ð2ˆDÔ.ð Ô"ð / tÔ'7ð /ð/ØÔ$×6Ò6°t´ÈÔH[Ñ\Ô\Ð\ÝÐM¸Ô8KÐMÐMÑNÔNÐNØ*.�DÔ'Ð'øÝ"¥IÐ.ð /ð /ð /ÝÐCÀÐCÐCÑDÔDÐDØ*.�DÔ'Ð'Ð'Ð'Ð'Ð'øøøøð/øøøð �4øÝð 	ð 	ð 	Ý‰MŒM×ÒÐ OÈÐ OÐ OÐ OÑPÔPÐPØ�5�5�5�5�5øøøøð	øøøs~   ¨> ¾
A-ÁA(Á(A-Ã(D ÄDÄDË AL% Ì%
L2Ì1L2Ì6KZ ØAY ÙZ ÙZ ÙY;Ù6Z Ù;Z Ú Z Ú
Z?Ú%Z:Ú:Z?c           	      óô  — | j                              ¦   «          d}t          | d¦  «        r-| j        r&t          | j        d¦  «        r| j        j        j        }t          j        ¦   «         j        }| j	        p|dk     }|r6|  
                    t          ¦   «         ¦  «         |                      ¦   «          nft          | j        d¬¦  «        }t          j        dt          j        ¦   «         ¦  «        }t%          | j         | j        ||| j        | j        |¬¦  «         |                      ¦   «          |r»|d	k    rµ|  
                    ¦   «          |  
                    d
|d›d�¦  «         |  
                    d¦  «         t-          | dd¦  «        pd}d|v sd|                     ¦   «         v r|  
                    d¦  «         n/d|v r|  
                    d¦  «         n|  
                    d¦  «         ddlm} t-          | dd¦  «        pd} ||¦  «        rS|  
                    ¦   «          |  
                    d¦  «         |  
                    d¦  «         |  
                    d¦  «         |  
                    ¦   «          dS )z0Display the welcome banner in Claude Code style.Nrþ   r  rÌ  T©r~  rR  r  ©rh  rõ   rÅ   Útoolsr~  rŠ  rý  i    u'   [yellow]âš ï¸�  Context length is only r'  u?    tokens â€” this is likely too low for agent use with tools.[/]u[   [dim]   Hermes needs 16kâ€“32k minimum. Tool schemas + system prompt alone use ~4kâ€“8k.[/]r¾   r:   Ú11434Úollamaz?[dim]   Ollama fix: OLLAMA_CONTEXT_LENGTH=32768 ollama serve[/]Ú1234uO   [dim]   LM Studio fix: Set context length in model settings â†’ reload model[/]zb[dim]   Fix: Set model.context_length in config.yaml, or increase your server's context setting[/]r   )Úis_nous_hermes_non_agenticrõ   uv   [bold yellow]âš   Nous Research Hermes 3 & 4 models are NOT agentic and are not designed for use with Hermes Agent.[/]z“[dim]   They lack tool-calling capabilities required for agent workflows. Consider using an agentic model (Claude, GPT, Gemini, DeepSeek, etc.).[/]z6[dim]   Switch with: /model sonnet  or  /model gpt5[/])rh  Úclearr•  rþ   r  rý  rž   rÖ  r×  rí   r  r  Ú_show_statusrs  r~  r’   r–  r@  ru  rõ   rŠ  Ú _show_tool_availability_warningsr–  rŒ   Úhermes_cli.model_switchr  )	r7  Úctx_lenrŽ  Úuse_compactr{  rÅ   r¾   r  rø  s	            rK   Úshow_bannerzHermesCLI.show_bannera  s  € àŒ×ÒÑÔÐð ˆÝ�4˜Ñ!Ô!ð 	C d¤jð 	CµW¸T¼ZÐI]Ñ5^Ô5^ð 	CØ”jÔ3ÔBˆGõ Ô-Ñ/Ô/Ô7ˆ
Ø”lÐ5 j°2¢oˆàð 	Ø×ÒÕ 5Ñ 7Ô 7Ñ8Ô8Ð8Ø×ÒÑÔÐÐõ )¸$Ô:OÐ\`ÐaÑaÔaˆEõ ”)˜N­B¬I©K¬KÑ8Ô8ˆCõ !ØœØ”jØØØ!%Ô!6Øœ?Ø&ðñ ô ð ð 	×-Ò-Ñ/Ô/Ð/ð ð 	�w $’�Ø×ÒÑ!Ô!Ð!Ø×ÒðG¸'ÐQð Gð Gð Gñô ð ð ×ÒØmñô ð õ ˜t Z°Ñ4Ô4Ð:¸ˆHØ˜(Ð"Ð" h°(·.².Ñ2BÔ2BÐ&BÐ&BØ×#Ò#ØUñô ð ð ð ˜8Ð#Ð#Ø×#Ò#Øeñô ð ð ð ×#Ò#Øxñô ð ð
 	GÐFÐFÐFÐFÐFå˜T 7¨BÑ/Ô/Ð5°2ˆ
Ø%Ð% jÑ1Ô1ð 	Ø×ÒÑ!Ô!Ð!Ø×Òð9ñô ð ð ×Òð\ñô ð ð ×ÒØHñô ð ð 	×ÒÑÔÐÐÐrM   c                 ó‚  — | j         r| j        sdS | j                             | j        ¦  «        }|s5|                      d| j        › d�¦  «         |                      d¦  «         dS 	 | j                             | j        ¦  «        }n# t          $ r
 | j        }Y nw xY w|rV|| j        k    rK|                      d| j        › d|› d�¦  «         || _        | j                             | j        ¦  «        }|r|}| j                             | j        ¦  «        }|r d„ |D ¦   «         }|| _        t          d	„ |D ¦   «         ¦  «        }d
}| 
                    d¦  «        rd|d         › d�}t          ¦   «         }|                      d|› d| j        › d|› d|› d|dk    rdnd
› dt          |¦  «        › d�¦  «         n1t          ¦   «         }|                      d|› d| j        › d�¦  «         dS 	 | j        j                             d| j        f¦  «         | j        j                             ¦   «          n# t          $ r Y nw xY wdS )aå  Load a resumed session's history from the DB early (before first chat).

        Called from run() so the conversation history is available for display
        before the user sends their first message.  Sets
        ``self.conversation_history`` and prints the one-liner status.  Returns
        True if history was loaded, False otherwise.

        The corresponding block in ``_init_agent()`` checks whether history is
        already populated and skips the DB round-trip.
        Fz[bold red]Session not found: rU  zH[dim]Use a session ID from a previous CLI run (hermes sessions list).[/]z[dim]Session rB  rC  c                 óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS rE  rª  rH  s     rK   rY   z6HermesCLI._preload_resumed_session.<locals>.<listcomp>ß  s,   € ÐOÐOÐO˜a¨q¯uªu°V©}¬}ÀÒ/NÐ/N˜Ð/NÐ/NÐ/NrM   c                 óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS rJ  rª  rH  s     rK   rY   z6HermesCLI._preload_resumed_session.<locals>.<listcomp>á  s,   € ÐLÐLÐL 1°A·E²E¸&±M´MÀVÒ4KÐ4K˜QÐ4KÐ4KÐ4KrM   r:   rL  rM  r~  rÞ  u   ]â†» Resumed session [bold]z[/bold]ú (rN  r  rê  rT  z total messages)[/]rA  rO  rP  T)rŽ  r‘  rd  rŠ  r  re  rv   rf  r�  r  rT   rT  rg  rh  ri  )r7  rG  rq  rr  rs  rt  ru  Úaccent_colors           rK   Ú_preload_resumed_sessionz"HermesCLI._preload_resumed_session´  s0  € ð Œ}ð 	 DÔ$4ð 	Ø�5àÔ'×3Ò3°D´OÑDÔDˆØð 	Ø×ÒØD°´ÐDÐDÐDñô ð ð ×Òð-ñô ð ð �5ð	*ØÔ*×DÒDÀTÄ_ÑUÔUˆKˆKøÝð 	*ð 	*ð 	*Øœ/ˆKˆKˆKð	*øøøàð 	-˜;¨$¬/Ò9Ð9Ø×ÒðS ¤ð Sð SØðSð Sð Sñô ð ð *ˆDŒOØ Ô,×8Ò8¸¼ÑIÔIˆMØð -Ø,�àÔ#×@Ò@ÀÄÑQÔQˆØð 	ØOÐO 8ÐOÑOÔOˆHØ(0ˆDÔ%ÝÐLÐL¨ÐLÑLÔLÑMÔMˆIØˆJØ×Ò Ñ(Ô(ð ;Ø: ,¨wÔ"7Ð:Ð:Ð:�
Ý&™=œ=ˆLØ×Òð6�Lð 6ð 6¸T¼_ð 6ð 6Øð6ð 6àð6ð 6à3<À²>°>¨C¨CÀrð6ð 6õ �x‘=”=ð6ð 6ð 6ñô ð ð õ '™=œ=ˆLØ×Òð0�Lð 0ð 0¨4¬?ð 0ð 0ð 0ñô ð ð �5ð	ØÔÔ"×*Ò*ðà”Ð"ñô ð ð
 ÔÔ"×)Ò)Ñ+Ô+Ð+Ð+øÝð 	ð 	ð 	ØˆDð	øøøð ˆts%   Á(B ÂBÂBÇ*AH/ È/
H<È;H<c                 ó<  — | j         sdS | j        dk    rdS d}d}d}d}g }d}d}| j         D �]p}|                     dd¦  «        }	|                     d	¦  «        }
|                     d
¦  «        pg }|	dk    rŒL|	dk    rŒS|	dk    �r|
€dnt          |
¦  «        }t	          |
t
          ¦  «        r·g }|
D ]�}t	          |t          ¦  «        rC|                     d¦  «        dk    r*|                     |                     dd¦  «        ¦  «         ŒZt	          |t          ¦  «        r.|                     d¦  «        dk    r|                     d¦  «         Œžd                     |¦  «        }t          |¦  «        |k    r|d|…         dz   }|                     d|f¦  «         �Œr|	dk    �r÷|
€dnt          |
¦  «        }t          |¦  «        }g }g }|r‘|                     |¦  «         |                     ¦   «         }t          |¦  «        |k    r d                     |d|…         ¦  «        dz   }t          |¦  «        |k    r|d|…         dz   }|                     |¦  «         |rçt          |¦  «        }g }|D ]^}|                     di ¦  «        }t	          |t          ¦  «        r|                     dd¦  «        nd}||vr|                     |¦  «         Œ_d                     |dd…         ¦  «        }t          |¦  «        dk    r|dz  }|dk    rdnd}d |› d!|› d"|› d#�}|                     |¦  «         |                     |¦  «         |s�Œ|                     dd                     |¦  «        f¦  «         t          |¦  «        dz
  }d                     |¦  «        }�Œr|sdS d$}t          |¦  «        |d%z  k    rt          |¦  «        |d%z  z
  }||d…         }|�+|r)||z
  }d$|cxk    rt          |¦  «        k     r
n nd&|f||<   d$d'lm} d$d(lm} 	 d$d)lm}  |¦   «         }|                     d*d+¦  «        }|                     d,d-¦  «        } |                     d.d/¦  «        }!|                     d0d1¦  «        }"n# t&          $ r d+}d-} d/}!d1}"Y nw xY w |¦   «         }|r|                     d2|› d3�d4¬5¦  «         t)          |¦  «        D �]¤\  }#\  }	}|	dk    rw|                     d6d7| › �¬5¦  «         |                     ¦   «         }$|                     |$d$         dz   d8¬5¦  «         |$dd…         D ]}%|                     d9|%› d�d8¬5¦  «         Œnó|	d&k    rw|                     d:d;|"› �¬5¦  «         |                     ¦   «         }$|                     |$d$         dz   d¬5¦  «         |$dd…         D ]}%|                     d<|%› d�d¬5¦  «         Œnv|                     d:d7|"› �¬5¦  «         |                     ¦   «         }$|                     |$d$         dz   d8¬5¦  «         |$dd…         D ]}%|                     d<|%› d�d8¬5¦  «         Œ|#t          |¦  «        dz
  k     r|                     d¦  «         �Œ¦ ||d=| › d>�d?|!› �d@|¬A¦  «        }&|                      |&¦  «         dS )BaP  Render a compact recap of previous conversation messages.

        Uses Rich markup with dim/muted styling so the recap is visually
        distinct from the active conversation.  Caps the display at the
        last ``MAX_DISPLAY_EXCHANGES`` user/assistant exchanges and shows
        an indicator for earlier hidden messages.
        NÚminimalrá  rÃ   éÈ   rý  rF  r:   rN   r>   r�   ÚtoolrK  rQ   r6   Ú	image_urlz[image]r‚  rÏ  Ú	assistantrZ   z ...Úfunctionr    rŸ  rT  r¶  z, ...r  ÚcallÚcallsrÞ  ú tool ú: r£  r   r�  Úassistant_lastrn  rp  r:  rì  rí  Úsession_labelú#DAA520Úsession_borderz#8B8682Úui_okz#8FBC8Fz  ... z earlier messages ...

z
dim italic)Ústyleu     â—� You: z	dim bold Údimz	         u     â—† Hermes: zbold z            ú[dim z]Previous Conversation[/]zdim )r   r  )rL  Úborder_styleÚpaddingr�  )r�  rî   rT   rU   rR   ra   rS   r–   rb   r  rL   r¿  Ú
rich.panelro  Ú	rich.textrq  r<  r;  r=  rv   r¼  r  )'r7  ÚMAX_DISPLAY_EXCHANGESÚMAX_USER_LENÚMAX_ASST_LENÚMAX_ASST_LINESÚentriesÚ_last_asst_idxÚ_last_asst_fullÚmsgrF  rN   r>   r6   rc   rX   Ú
full_partsr“  Útc_countrœ   ÚtcÚfnr    Ú	names_strrµ  Ú
tc_summaryÚskippedÚadj_idxro  rq  r;  r  Ú_history_text_cÚ_session_label_cÚ_session_border_cÚ_assistant_label_cr  Ú	msg_linesÚmlÚpanels'                                          rK   Ú_display_resumed_historyz"HermesCLI._display_resumed_history  s  € ð Ô(ð 	ØˆFð Ô )Ò+Ð+ØˆFà "ÐØˆØˆØˆð ˆØˆØˆØÔ,ð ;	7ñ ;	7ˆCØ—7’7˜6 2Ñ&Ô&ˆDØ—g’g˜iÑ(Ô(ˆGØŸš Ñ.Ô.Ð4°"ˆJà�xÒÐØØ�vŠ~ˆ~Øà�vŠ~‰~Ø$˜_�r�rµ#°g±,´,�å˜g¥tÑ,Ô,ð +Ø�EØ 'ð 4ð 4˜Ý% d­DÑ1Ô1ð 4°d·h²h¸vÑ6FÔ6FÈ&Ò6PÐ6PØ!ŸLšL¨¯ª°&¸"Ñ)=Ô)=Ñ>Ô>Ð>Ð>Ý'¨­dÑ3Ô3ð 4¸¿ºÀÑ8HÔ8HÈKÒ8WÐ8WØ!ŸLšL¨Ñ3Ô3Ð3øØŸ8š8 E™?œ?�DÝ�t‘9”9˜|Ò+Ð+Ø   Ô.°Ñ6�DØ—’ ¨˜~Ñ.Ô.Ð.Ñ.à˜Ò$Ñ$Ø$˜_�r�rµ#°g±,´,�Ý,¨TÑ2Ô2�Ø�Ø�
Øð 'Ø×%Ò% dÑ+Ô+Ð+Ø ŸOšOÑ-Ô-�EÝ˜5‘z”z NÒ2Ð2Ø#Ÿyšy¨¨°¨Ô)?Ñ@Ô@À6ÑI˜Ý˜4‘y”y <Ò/Ð/Ø# M \ MÔ2°UÑ:˜Ø—L’L Ñ&Ô&Ð&Øð 2Ý" :™œ�Hà�EØ(ð /ð /˜ØŸVšV J°Ñ3Ô3˜Ý<FÀrÍ4Ñ<PÔ<PÐ_˜rŸvšv f¨iÑ8Ô8Ð8ÐV_˜Ø uÐ,Ð,Ø!ŸLšL¨Ñ.Ô.Ð.øØ $§	¢	¨%°°°¬)Ñ 4Ô 4�IÝ˜5‘z”z A’~�~Ø! WÑ,˜	Ø%-°¢] ]˜6˜6¸�DØ!I XÐ!IÐ!I°TÐ!IÐ!I¸YÐ!IÐ!IÐ!I�JØ—L’L Ñ,Ô,Ð,Ø×%Ò% jÑ1Ô1Ð1Øð áØ—’ ¨S¯XªX°e©_¬_Ð=Ñ>Ô>Ð>Ý!$ W¡¤°Ñ!1�Ø"%§(¢(¨:Ñ"6Ô"6�ùàð 	ØˆFð ˆÝˆw‰<Œ<Ð/°!Ñ3Ò3Ð3Ý˜'‘l”lÐ%:¸QÑ%>Ñ>ˆGØ˜g˜h˜hÔ'ˆGð Ð%¨/Ð%Ø$ wÑ.ˆGØ�GÐ*Ð*Ò*Ð*�c '™lœlÒ*Ð*Ð*Ð*Ð*Ø$4°oÐ#F�˜Ñ ð 	%Ð$Ð$Ð$Ð$Ð$Ø"Ð"Ð"Ð"Ð"Ð"ð	+Ø>Ð>Ð>Ð>Ð>Ð>Ø#�OÑ%Ô%ˆEØ#Ÿošo¨m¸YÑGÔGˆOØ$Ÿš¨À	ÑJÔJÐØ %§¢Ð0@À)Ñ LÔ LÐØ!&§¢°¸)Ñ!DÔ!DÐÐøÝð 	+ð 	+ð 	+Ø'ˆOØ(ÐØ )ÐØ!*ÐÐÐð		+øøøð �‘”ˆØð 	Ø�LŠLØ;˜Ð;Ð;Ð;Ø"ð ñ ô ð õ
  )¨Ñ1Ô1ð 	!ñ 	!‰OˆA‰|��dØ�vŠ~ˆ~Ø—’˜]Ð2PÐ>NÐ2PÐ2P�ÑQÔQÐQà ŸOšOÑ-Ô-�	Ø—’˜Y qœ\¨DÑ0¸�Ñ>Ô>Ð>Ø# A B Bœ-ð Bð B�BØ—L’LÐ!3¨RÐ!3Ð!3Ð!3¸5�LÑAÔAÐAÐAðBàÐ)Ò)Ð)à—’Ð-Ð5QÐ=OÐ5QÐ5Q�ÑRÔRÐRØ ŸOšOÑ-Ô-�	Ø—’˜Y qœ\¨DÑ0¸�Ñ;Ô;Ð;Ø# A B Bœ-ð Bð B�BØ—L’LÐ!6°Ð!6Ð!6Ð!6¸b�LÑAÔAÐAÐAðBð —’Ð-Ð5UÐASÐ5UÐ5U�ÑVÔVÐVØ ŸOšOÑ-Ô-�	Ø—’˜Y qœ\¨DÑ0¸�Ñ>Ô>Ð>Ø# A B Bœ-ð Eð E�BØ—L’LÐ!6°Ð!6Ð!6Ð!6¸e�LÑDÔDÐDÐDØ•3�w‘<”< !Ñ#Ò#Ð#Ø—’˜RÑ Ô Ð ùà�ØØEÐ*ÐEÐEÐEØ3Ð 1Ð3Ð3ØØ!ð
ñ 
ô 
ˆð 	×Ò˜EÑ"Ô"Ð"Ð"Ð"s   ÐA(Q< Ñ<RÒRc                 ó0  — ddl m} t          ¦   «         dz  }| xj        dz  c_        t	          j        ¦   «                              d¦  «        }|d|› d| j        › d�z  } ||¦  «        r| j                             |¦  «         d	S | xj        dz  c_        d
S )zÉCheck clipboard for an image and attach it if found.

        Saves the image to ~/.hermes/images/ and appends the path to
        ``_attached_images``.  Returns True if an image was attached.
        r   )Úsave_clipboard_imagerâ  r  re  Úclip_rg  rt  TF)	Úhermes_cli.clipboardr½  r+   r²  r   r  r”  r±  r–   )r7  r½  Úimg_dirÚtsÚimg_paths        rK   Ú_try_attach_clipboard_imagez%HermesCLI._try_attach_clipboard_imageŸ  s¼   € ð 	>Ð=Ð=Ð=Ð=Ð=å!Ñ#Ô# hÑ.ˆØÐÔ˜qÑ ÐÔÝŒ\‰^Œ^×$Ò$ _Ñ5Ô5ˆØÐC RÐCÐC¨$Ô*=ÐCÐCÐCÑCˆàÐ Ñ)Ô)ð 	ØÔ!×(Ò(¨Ñ2Ô2Ð2Ø�4ØÐÔ˜qÑ ÐÔØˆurM   c           	      óŽ  — ddl m} t          | d¦  «        r| j        st	          d¦  «         dS | j        j        }|j        s/t	          d¦  «         t	          d¦  «         t	          d¦  «         dS t          j        d	t          j	        ¦   «         ¦  «        }| 
                    ¦   «         }t          |¦  «        d
k    r
|d
d…         ng }|s0|                     |¦  «        }t	           |||¦  «        ¦  «         dS |d                              ¦   «         dk    �r…t          |¦  «        dk     rt	          d¦  «         dS |                     |¦  «        }|st	          d|› �¦  «         dS |                      |d
         |¦  «        }|sdS |                     ||¦  «        }	|	d         rÞ|	                     dd¦  «        }
|	                     dd¦  «        }|
s|st	          d¦  «         n¶|
rt	          d|
› �¦  «         |r‡|                     ¦   «         }t          |¦  «        dk    rNt	          d                     |dd…         ¦  «        ¦  «         t	          dt          |¦  «        dz
  › d�¦  «         n+t	          d|› �¦  «         nt	          d|	d         › �¦  «         dS |                     |¦  «        }|st	          d|› �¦  «         dS |                      |d         |¦  «        }|sdS t          |¦  «        d
k    r|d
         nd}|                     |||¬¦  «        }	|	d         r…|r%t	          d|› d|	d         › d|	d         › �¦  «         n!t	          d|	d         › d|	d         › �¦  «         t	          d ¦  «         | j        r%|                      ¦   «          t	          d!¦  «         dS dS t	          d|	d         › �¦  «         dS )"u“  Handle /rollback â€” list, diff, or restore filesystem checkpoints.

        Syntax:
            /rollback                 â€” list checkpoints
            /rollback <N>             â€” restore checkpoint N (also undoes last chat turn)
            /rollback diff <N>        â€” preview changes since checkpoint N
            /rollback <N> <file>      â€” restore a single file from checkpoint N
        r   )Úformat_checkpoint_listrþ   z  No active agent session.Nz  Checkpoints are not enabled.z#  Enable with: hermes --checkpointsz3  Or in config.yaml: checkpoints: { enabled: true }r  r  Údiffr�  z  Usage: /rollback diff <N>z  No checkpoints found for Úsuccessr  r:   z#  No changes since this checkpoint.rZ   rÌ  r‡  z more lines, showing first 80)u     â�Œ r1  )rg   u     âœ… Restored z from checkpoint Úrestored_tor—  Úreasonu     âœ… Restored to checkpoint z2  A pre-rollback snapshot was saved automatically.z0  Chat turn undone to match restored file state.)Útools.checkpoint_managerrÅ  r•  rþ   r¹  Ú_checkpoint_mgrrÓ   r’   r–  r@  r  r  Úlist_checkpointsrŒ   Ú_resolve_checkpoint_refrÆ  rT   r¿  rb   Úrestorer�  Ú	undo_last)r7  r   rÅ  ÚmgrrÅ   rc   rø  r8  Útarget_hashr€   r  rÆ  Ú
diff_linesrg   s                 rK   Ú_handle_rollback_commandz"HermesCLI._handle_rollback_command²  sH  € ð 	DÐCÐCÐCÐCÐCå�t˜WÑ%Ô%ð 	¨T¬Zð 	ÝÐ.Ñ/Ô/Ð/ØˆFàŒjÔ(ˆØŒ{ð 	ÝÐ2Ñ3Ô3Ð3ÝÐ7Ñ8Ô8Ð8ÝÐGÑHÔHÐHØˆFåŒi˜­¬	©¬Ñ4Ô4ˆØ—’‘”ˆÝ ™JœJ¨šN˜Nˆu�Q�R�RŒyˆy°ˆàð 	à×.Ò.¨sÑ3Ô3ˆKÝÐ(Ð(¨°cÑ:Ô:Ñ;Ô;Ð;ØˆFð �Œ7�=Š=‰?Œ?˜fÒ$Ñ$Ý�4‰yŒy˜1Š}ˆ}ÝÐ3Ñ4Ô4Ð4Ø�Ø×.Ò.¨sÑ3Ô3ˆKØð ÝÐ9°CÐ9Ð9Ñ:Ô:Ð:Ø�Ø×6Ò6°t¸A´wÀÑLÔLˆKØð Ø�Ø—X’X˜c ;Ñ/Ô/ˆFØ�iÔ ð 2Ø—z’z &¨"Ñ-Ô-�Ø—z’z &¨"Ñ-Ô-�Øð / Dð /ÝÐ?Ñ@Ô@Ð@Ð@àð +Ý˜k 4˜k˜kÑ*Ô*Ð*Øð /à%)§_¢_Ñ%6Ô%6˜
Ý˜z™?œ?¨RÒ/Ð/Ý! $§)¢)¨J°s¸°s¬OÑ"<Ô"<Ñ=Ô=Ð=Ý!Ð"b­c°*©o¬oÀÑ.BÐ"bÐ"bÐ"bÑcÔcÐcÐcå! + t + +Ñ.Ô.Ð.øåÐ0˜v gœÐ0Ð0Ñ1Ô1Ð1ØˆFð ×*Ò*¨3Ñ/Ô/ˆØð 	ÝÐ5°Ð5Ð5Ñ6Ô6Ð6ØˆFà×2Ò2°4¸´7¸KÑHÔHˆØð 	ØˆFõ  # 4™yœy¨1š}˜}�D˜”G�G°$ˆ	à—’˜S +¸�ÑCÔCˆØ�)Ôð 	.Øð cÝÐo¨	ÐoÐoÀFÈ=ÔDYÐoÐoÐ]cÐdlÔ]mÐoÐoÑpÔpÐpÐpåÐa°f¸]Ô6KÐaÐaÈvÐV^ÔO_ÐaÐaÑbÔbÐbÝÐFÑGÔGÐGð Ô(ð JØ—’Ñ Ô Ð ÝÐHÑIÔIÐIÐIÐIðJð Jõ Ð,˜6 'œ?Ð,Ð,Ñ-Ô-Ð-Ð-Ð-rM   Úrefc                 óæ   — 	 t          |¦  «        dz
  }d|cxk    rt          |¦  «        k     rn n||         d         S t          dt          |¦  «        › d�¦  «         dS # t          $ r |cY S w xY w)z:Resolve a checkpoint number or hash to a full commit hash.r  r   Úhashz#  Invalid checkpoint number. Use 1-rÁ   N)rô  r  r¹  r¦  )r7  rÔ  r8  r¹  s       rK   rÍ  z!HermesCLI._resolve_checkpoint_ref  s›   € ð		Ý�c‘(”(˜Q‘,ˆCØ�CÐ*Ð*Ò*Ð*�#˜kÑ*Ô*Ò*Ð*Ð*Ð*Ð*Ø" 3Ô'¨Ô/Ð/åÐO½CÀÑ<LÔ<LÐOÐOÐOÑPÔPÐPØ�tøÝð 	ð 	ð 	àˆJˆJˆJð	øøøs   ‚<A! ¿ A! Á!A0Á/A0c                 óT  — ddl m}m}m}m} ddlm} |                     ¦   «         }t          |¦  «        dk    r|d          	                    ¦   «         nd}|dv �r0 |¦   «         }	|	s t          d¦  «         t          d¦  «         d	S t          d
 |¦   «         › d�¦  «         t          ddd›ddd›ddd›ddd›dd› �
¦  «         t          dd› dd› dd› dd› dd› �
¦  «         t          |	d¦  «        D ]–\  }
}|                     dd¦  «        }|dk     r|› d�}n|dk     r
|dz  d ›d!�}n|dz  dz  d"›d#�}|                     d$¦  «        pd%}t          d|
d&›d|d'         d›d|                     d(d¦  «        d›d|d›d|› �
¦  «         Œ—d	S |d)k    ret          |¦  «        d*k    rd                     |d*d	…         ¦  «        nd	} ||¬+¦  «        }|rt          d,|› �¦  «         d	S t          d-¦  «         d	S |d.v �rt          |¦  «        d/k     r=t          d0¦  «          |d¬1¦  «        }	|	rt          d2|	d         d'         › �¦  «         d	S |d*         }	 t          |¦  «        } |¦   «         }	d|cxk    rt          |	¦  «        k    rn n|	|dz
           d'         }n"t          d3t          |	¦  «        › d4�¦  «         d	S n# t          $ r Y nw xY w ||¦  «        r#t          d5|› �¦  «         t          d6¦  «         d	S t          d7|› �¦  «         d	S |d8k    rpd9}t          |¦  «        d*k    r7	 t          |d*         ¦  «        }n # t          $ r t          d:¦  «         Y d	S w xY w ||¬;¦  «        }t          d<|› d=|› d>�¦  «         d	S t          d?|› �¦  «         t          d@¦  «         d	S )Auu  Handle /snapshot â€” lightweight state snapshots for Hermes config/state.

        Syntax:
            /snapshot                  â€” list recent snapshots
            /snapshot create [label]   â€” create a snapshot
            /snapshot restore <id>     â€” restore state from snapshot
            /snapshot prune [N]        â€” prune to N snapshots (default 20)
        r   )Úcreate_quick_snapshotÚlist_quick_snapshotsÚrestore_quick_snapshotÚprune_quick_snapshots©r,   r  ra   )ra   Úlsz  No state snapshots yet.z&  Create one: /snapshot create [label]Nz  State snapshots (z/state-snapshots/):
r8  r¶  z>3ÚIDz<35r‚  ÚFilesz>5ÚSizeú>10ÚLabelu	   â”€â”€â”€ui   â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€u   â”€â”€â”€â”€â”€u   â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€u<   â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€Ú
total_sizeé   z Bi   ú.0fz KBr7  z MBró  r:   Ú3ÚidÚ
file_countÚcreater�  )ró  z  Snapshot created: z#  No state files found to snapshot.)rÎ  Úrewindrý  z(  Usage: /snapshot restore <snapshot-id>©rÍ  z  Most recent: z!  Invalid snapshot number. Use 1-rÁ   z  Restored state from: z:  Restart recommended for state.db changes to take effect.z  Snapshot not found: ÚprunerÓ  z%  Usage: /snapshot prune [keep-count])Úkeepz	  Pruned z old snapshot(s) (keeping z).z  Unknown subcommand: z?  Usage: /snapshot [list|create [label]|restore <id>|prune [N]])Úhermes_cli.backuprØ  rÙ  rÚ  rÛ  r   r,   r  r  rŒ   r¹  r¼  rT   rb   rô  r¦  )r7  r   rØ  rÙ  rÚ  rÛ  r,   rc   ÚsubcmdÚsnapsr  rê  ÚsizeÚsize_strró  Úsnap_idr¹  rí  Údeleteds                      rK   Ú_handle_snapshot_commandz"HermesCLI._handle_snapshot_command  s/  € ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	9Ð8Ð8Ð8Ð8Ð8à—’‘”ˆÝ%(¨¡Z¤Z°!¢^ ^��q”—’Ñ!Ô!Ð!¸ˆà�^Ð#Ñ#Ø(Ð(Ñ*Ô*ˆEØð ÝÐ1Ñ2Ô2Ð2ÝÐ>Ñ?Ô?Ð?Ø�ÝÐTÐ(;Ð(;Ñ(=Ô(=ÐTÐTÐTÑUÔUÐUÝÐO�sÐOÐOÐO ÐOÐOÐO¨GÐOÐOÐO¸ÐOÐOÐOÀgÐOÐOÑPÔPÐPÝÐL�wÐLÐL (ÐLÐL¨WÐLÐL°xÐLÐLÀ(ÐLÐLÑMÔMÐMÝ! %¨Ñ+Ô+ð 	dð 	d‘��1Ø—u’u˜\¨1Ñ-Ô-�Ø˜$’;�;Ø"&˜{˜{˜{�H�HØ˜KÒ'Ð'Ø"&¨¡+Ð6Ð6Ð6Ð6�H�Hà"&¨¡+°Ñ"4Ð=Ð=Ð=Ð=�HØŸš˜g™œÐ,¨"�ÝÐb˜1ÐbÐbÐb ! D¤'ÐbÐbÐb°·²°lÀAÑ0FÔ0FÐbÐbÐbÈHÐbÐbÐbÐ[`ÐbÐbÑcÔcÐcÐcð	dð 	dð �xÒÐÝ+.¨u©:¬:¸ª>¨>�C—H’H˜U 1 2 2œYÑ'Ô'Ð'¸tˆEØ+Ð+°%Ð8Ñ8Ô8ˆGØð =ÝÐ6¨WÐ6Ð6Ñ7Ô7Ð7Ð7Ð7åÐ;Ñ<Ô<Ð<Ð<Ð<àÐ,Ð,Ñ,Ý�5‰zŒz˜AŠ~ˆ~ÝÐ@ÑAÔAÐAà,Ð,°1Ð5Ñ5Ô5�Øð >ÝÐ<¨E°!¬H°T¬NÐ<Ð<Ñ=Ô=Ð=Ø�Ø˜A”hˆGð	Ý˜'‘l”l�Ø,Ð,Ñ.Ô.�Ø˜Ð)Ð)Ò)Ð)�s 5™zœzÒ)Ð)Ð)Ð)Ð)Ø# C¨!¡Gœn¨TÔ2�G�GåÐK½cÀ%¹j¼jÐKÐKÐKÑLÔLÐLØ�Fð øõ ð ð ð Ø�ðøøøà%Ð% gÑ.Ô.ð :ÝÐ9°Ð9Ð9Ñ:Ô:Ð:ÝÐRÑSÔSÐSÐSÐSåÐ8¨wÐ8Ð8Ñ9Ô9Ð9Ð9Ð9à�wÒÐØˆDÝ�5‰zŒz˜AŠ~ˆ~ðÝ˜u Qœx™=œ=�D�DøÝ!ð ð ð ÝÐAÑBÔBÐBØ�F�Fðøøøð ,Ð+°Ð6Ñ6Ô6ˆGÝÐI˜gÐIÐIÀÐIÐIÐIÑJÔJÐJÐJÐJõ Ð3¨6Ð3Ð3Ñ4Ô4Ð4ÝÐSÑTÔTÐTÐTÐTs%   ÉA(J? Ê?
KËKÌ-M ÍM ÍM c                 ó  — ddl m} |                     ¦   «         }d„ |D ¦   «         }|st          d¦  «         dS t          dt	          |¦  «        › d�¦  «         |                     ¦   «         }t          d|› d	�¦  «         dS )
uÜ   Handle /stop â€” kill all running background processes.

        Inspired by OpenAI Codex's separation of interrupt (stop current turn)
        from /stop (clean up background processes). See openai/codex#14602.
        r   ©Úprocess_registryc                 óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS ©rý  Úrunningrª  r^   s     rK   rY   z2HermesCLI._handle_stop_command.<locals>.<listcomp>}  ó,   € ÐHÐHÐH˜¨1¯5ª5°©?¬?¸iÒ+GÐ+G�1Ð+GÐ+GÐ+GrM   z"  No running background processes.Nz  Stopping z background process(es)...u     âœ… Stopped z process(es).)Útools.process_registryrø  Úlist_sessionsr¹  r  Úkill_all)r7  rø  Ú	processesrû  Úkilleds        rK   Ú_handle_stop_commandzHermesCLI._handle_stop_commandt  s§   € ð 	<Ð;Ð;Ð;Ð;Ð;à$×2Ò2Ñ4Ô4ˆ	ØHÐH˜iÐHÑHÔHˆàð 	ÝÐ6Ñ7Ô7Ð7ØˆFåÐD�C ™LœLÐDÐDÐDÑEÔEÐEØ!×*Ò*Ñ,Ô,ˆÝÐ4˜vÐ4Ð4Ð4Ñ5Ô5Ð5Ð5Ð5rM   c           	      ó  — ddl m}m} |                     ¦   «         }d„ |D ¦   «         }d„ |D ¦   «         }t	          dt          |¦  «        › �¦  «         |D ]k}|                     dd¦  «        dd	…         } ||                     d
d¦  «        ¦  «        }t	          d|                     dd¦  «        › d|› d|› �¦  «         Œl|rt	          dt          |¦  «        › �¦  «         t          | dd¦  «        }	t	          d|	rdnd› �¦  «         dS )u>   Handle /agents â€” show background processes and agent status.r   )Úformat_uptime_shortrø  c                 óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS rú  rª  r^   s     rK   rY   z4HermesCLI._handle_agents_command.<locals>.<listcomp>Œ  rü  rM   c                 óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS rú  rª  r^   s     rK   rY   z4HermesCLI._handle_agents_command.<locals>.<listcomp>�  s,   € ÐIÐIÐI˜!¨A¯EªE°(©O¬O¸yÒ,HÐ,H�AÐ,HÐ,HÐ,HrM   z  Running processes: r   r:   NrÌ  Úuptime_secondsr  rŠ  r¦  rI  z  Recently finished: r—  Fz	  Agent: rû  Úidle)rý  r  rø  rþ  rj  r  rT   r–  )
r7  r  rø  r   rû  Úfinishedr_   ÚcmdÚupÚagent_runnings
             rK   Ú_handle_agents_commandz HermesCLI._handle_agents_command‡  sO  € àPÐPÐPÐPÐPÐPÐPÐPà$×2Ò2Ñ4Ô4ˆ	ØHÐH˜iÐHÑHÔHˆØIÐI˜yÐIÑIÔIˆåÐ6­¨G©¬Ð6Ð6Ñ7Ô7Ð7Øð 	Hð 	HˆAØ—%’%˜	 2Ñ&Ô& s¨ sÔ+ˆCØ$Ð$ Q§U¢UÐ+;¸QÑ%?Ô%?Ñ@Ô@ˆBÝÐF˜1Ÿ5š5 ¨sÑ3Ô3ÐFÐF¸ÐFÐFÀÐFÐFÑGÔGÐGÐGàð 	=ÝÐ;­C°©M¬MÐ;Ð;Ñ<Ô<Ð<å Ð&6¸Ñ>Ô>ˆÝÐD¨ÐB˜I˜I¸FÐDÐDÑEÔEÐEÐEÐErM   c                 óš  — t          ¦   «         r/t          dt          › dt          ¦   «         › t          › �¦  «         dS ddlm}  |¦   «         r^|                      ¦   «         r)t          | j	        ¦  «        }t          d|› d�¦  «         dS t          dt          › dt          › �¦  «         dS t          dt          › d	t          › �¦  «         dS )
u   Handle /paste â€” explicitly check clipboard for an image.

        This is the reliable fallback for terminals where BracketedPaste
        doesn't fire for image-only clipboard content (e.g., VSCode terminal,
        Windows Terminal with WSL2).
        r8  uh   Clipboard image paste is not available on Termux â€” use /image <path> or paste a local image path like Nr   )Úhas_clipboard_imageu     ðŸ“Ž Image #z attached from clipboardz2(>_<) Clipboard has an image but extraction failedz!(._.) No image found in clipboard)
Ú_is_termux_environmentrj  r‹  r{  rŒ  r¿  r  rÃ  r  r±  )r7  r  Úns      rK   Ú_handle_paste_commandzHermesCLI._handle_paste_command›  s  € õ "Ñ#Ô#ð 	Ýð8•Tð 8ð 8å-Ñ/Ô/ð8å15ð8ð 8ñô ð ð
 ˆFà<Ð<Ð<Ð<Ð<Ð<ØÐÑ Ô ð 	HØ×/Ò/Ñ1Ô1ð ]Ý˜Ô-Ñ.Ô.�ÝÐD¨ÐDÐDÐDÑEÔEÐEÐEÐEåÐ[�TÐ[Ð[ÕUYÐ[Ð[Ñ\Ô\Ð\Ð\Ð\åÐF�ÐFÐFÅÐFÐFÑGÔGÐGÐGÐGrM   c                 ó@  — t          j        |                     d¦  «        ¦  «                             d¦  «        }d|› d�}t	          | dd¦  «        }|rt	          |dd¦  «        nd}|r;t          |d¦  «        r+|                     |¦  «         |                     ¦   «          dS |r;t          |d	¦  «        r+|                     |¦  «         |                     ¦   «          dS t          j
                             |¦  «         t          j
                             ¦   «          dS )
z-Copy *text* to terminal clipboard via OSC 52.rj   Úasciiz]52;c;úrŒ  Nr§  Ú	write_rawrÁ  )Úbase64Ú	b64encodeÚencodeÚdecoder–  r•  r  ÚflushrÁ  Úsysr¡  )r7  r6   ÚpayloadÚseqr  r§  s         rK   Ú_write_osc52_clipboardz HermesCLI._write_osc52_clipboard´  s  € åÔ" 4§;¢;¨wÑ#7Ô#7Ñ8Ô8×?Ò?ÀÑHÔHˆØ(˜7Ð(Ð(Ð(ˆÝ�d˜F DÑ)Ô)ˆØ14Ð>•˜˜h¨Ñ-Ô-Ð-¸$ˆØð 	•g˜f kÑ2Ô2ð 	Ø×Ò˜SÑ!Ô!Ð!Ø�LŠL‰NŒNˆNØˆFØð 	•g˜f gÑ.Ô.ð 	Ø�LŠL˜ÑÔÐØ�LŠL‰NŒNˆNØˆFÝŒ
×Ò˜ÑÔÐÝŒ
×ÒÑÔÐÐÐrM   Úcmd_originalc                 óò  — |                      d¬¦  «        }t          |¦  «        dk    r|d                              ¦   «         nd}d„ | j        D ¦   «         }|st	          d¦  «         dS |rp	 t          |¦  «        dz
  }n # t          $ r t	          d¦  «         Y dS w xY w|dk     s|t          |¦  «        k    r"t	          d	t          |¦  «        › d
�¦  «         dS nŠt          |¦  «        dz
  }|dk    r[t          ||                              d¦  «        ¦  «        s3|dz  }|dk    r(t          ||                              d¦  «        ¦  «        ¯3|dk     rt	          d¦  «         dS t          ||                              d¦  «        ¦  «        }|st	          d¦  «         dS 	 |  	                    |¦  «         t	          d|dz   › d�¦  «         dS # t          $ r}t	          d|› �¦  «         Y d}~dS d}~ww xY w)u=   Handle /copy [number] â€” copy assistant output to clipboard.r  ©Úmaxsplitr:   c                 óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS )rF  r’  rª  rH  s     rK   rY   z2HermesCLI._handle_copy_command.<locals>.<listcomp>Ê  s,   € ÐZÐZÐZ˜1¸Q¿UºUÀ6¹]¼]ÈkÒ=YÐ=Y�QÐ=YÐ=YÐ=YrM   z  Nothing to copy yet.Nz  Usage: /copy [number]r   z!  Invalid response number. Use 1-rÁ   rN   z-  Nothing to copy in assistant responses yet.z-  Nothing to copy in that assistant response.z  Copied assistant response #z to clipboardz  Clipboard copy failed: )r  r  rG   r�  rj  rô  r¦  rf   rT   r  rv   )r7  r   rc   Úargr’  r¹  r6   rz   s           rK   Ú_handle_copy_commandzHermesCLI._handle_copy_commandÅ  sN  € à×"Ò"¨AÐ"Ñ.Ô.ˆÝ"% e¡*¤*¨q¢. .ˆe�AŒh�nŠnÑÔÐ°bˆàZÐZ Ô 9ÐZÑZÔZˆ	Øð 	ÝÐ,Ñ-Ô-Ð-ØˆFàð 	ðÝ˜#‘h”h ‘l��øÝð ð ð ÝÐ1Ñ2Ô2Ð2Ø��ðøøøð �QŠwˆw˜#¥ Y¡¤Ò/Ð/ÝÐM½CÀ	¹N¼NÐMÐMÐMÑNÔNÐNØ�ð 0õ �i‘.”. 1Ñ$ˆCØ˜’(�(Õ#7¸	À#¼×8JÒ8JÈ9Ñ8UÔ8UÑ#VÔ#V�(Ø�q‘�ð ˜’(�(Õ#7¸	À#¼×8JÒ8JÈ9Ñ8UÔ8UÑ#VÔ#V�(à�QŠwˆwÝÐGÑHÔHÐHØ�å# I¨c¤N×$6Ò$6°yÑ$AÔ$AÑBÔBˆØð 	ÝÐCÑDÔDÐDØˆFð	5Ø×'Ò'¨Ñ-Ô-Ð-ÝÐJ°C¸!±GÐJÐJÐJÑKÔKÐKÐKÐKøÝð 	5ð 	5ð 	5ÝÐ3°Ð3Ð3Ñ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4Ð4øøøøð	5øøøs*   Á-B  Â BÂBÆ"+G Ç
G6ÇG1Ç1G6c                 óD  — d|v r.|                      dd¦  «        d                              ¦   «         nd}|sAt          ¦   «         rt          ¦   «         nd}t	          dt
          › d|› t          › �¦  «         dS t          |¦  «        \  }}t          |¦  «        }|€#t	          dt
          › d|› t          › �¦  «         dS |j	         
                    ¦   «         t          vr(t	          dt
          › d	|j        › t          › �¦  «         dS | j                             |¦  «         t	          d
|j        › �¦  «         |r#t	          dt
          › d|› t          › �¦  «         dS t          ¦   «         r6t	          dt
          › dt          |j        ¦  «        › dt          › �¦  «         dS dS )uG   Handle /image <path> â€” attach a local image file for the next prompt.r‚  Nr  r:   z/path/to/image.pngr8  z"Usage: /image <path>  e.g. /image z(>_<) File not found: z"(._.) Not a supported image file: u     ðŸ“Ž Attached image: z<Now type your prompt (or use --image in single-query mode): z;Tip: type your next message, or run hermes chat -q --image z "What do you see?")r  rG   r  r{  rj  r‹  rŒ  rŠ  r›  rº  rŒ   r»  r    r±  r–   )r7  r   Úraw_argsÚhintÚ
path_tokenÚ
_remainderÚ
image_paths          rK   Ú_handle_image_commandzHermesCLI._handle_image_commandë  s
  € à>AÀ\Ð>QÐ>Q�L×&Ò& t¨QÑ/Ô/°Ô2×8Ò8Ñ:Ô:Ð:ÐWYˆØð 	Ý3IÑ3KÔ3KÐeÕ-Ñ/Ô/Ð/ÐQeˆDÝÐM�ÐMÐMÀÐMÅtÐMÐMÑNÔNÐNØˆFå!2°8Ñ!<Ô!<Ñˆ
�JÝ-¨jÑ9Ô9ˆ
ØÐÝÐG�ÐGÐG°ZÐGÅÐGÐGÑHÔHÐHØˆFØÔ×"Ò"Ñ$Ô$Õ,=Ð=Ð=ÝÐX�ÐXÐXÀÄÐXÕRVÐXÐXÑYÔYÐYØˆFàÔ×$Ò$ ZÑ0Ô0Ð0ÝÐ;¨*¬/Ð;Ð;Ñ<Ô<Ð<Øð 	dÝÐm�ÐmÐmÐ[eÐmÕgkÐmÐmÑnÔnÐnÐnÐnÝ#Ñ%Ô%ð 	dÝð  c�ð  cð  cÕZtÐuô  vEñ  [Fô  [Fð  cð  cõ  ]að  cð  cñ  dô  dð  dð  dð  dð	dð 	drM   T©Úannouncerâ  r/  c                óÜ  — ddl }ddlm} d}g }|D �]š}|                     ¦   «         sŒ|                     ¦   «         j        dz  }	|r*t          dt          › d|j        › d|	› d	t          › �¦  «         	 | 
                     |t          |¦  «        |¬
¦  «        ¦  «        }
t          j        |
¦  «        }|                     d¦  «        rT|                     dd¦  «        }|                     d|› d|› d�¦  «         |rt          dt          › dt          › �¦  «         n:|                     d|› d�¦  «         |rt          dt          › dt          › �¦  «         �ŒG# t           $ rH}|                     d|› d|› d�¦  «         |rt          dt          › dt          › �¦  «         Y d}~�Œ”d}~ww xY wt#          |t          ¦  «        r|r|nd}|r d                     |¦  «        }|r|› d|› �n|S |pdS )u,  Analyze attached images via the vision tool and return enriched text.

        Instead of embedding raw base64 ``image_url`` content parts in the
        conversation (which only works with vision-capable models), this
        pre-processes each image through the auxiliary vision model (Gemini
        Flash) and prepends the descriptions to the user's message â€” the
        same approach the messaging gateway uses.

        The local file path is included so the agent can re-examine the
        image later with ``vision_analyze`` if needed.
        r   N)Úvision_analyze_toolz¦Describe everything visible in this image in thorough detail. Include any text, code, data, objects, people, layout, colors, and any other notable visual information.rä  r8  u   ðŸ‘�ï¸�  analyzing rŠ  zKB)...)r‘  Úuser_promptrÇ  Úanalysisr:   z6[The user attached an image. Here's what it contains:
zA]
[If you need a closer look, use vision_analyze with image_url: r£  u   âœ“ image analyzedzw[The user attached an image but it couldn't be analyzed. You can try examining it with vision_analyze using image_url: u6   âš  vision analysis failed â€” path included for retryz1[The user attached an image but analysis failed (zA). You can try examining it with vision_analyze using image_url: u5   âš  vision analysis error â€” path included for retryr]  zWhat do you see in this image?)ÚasyncioÚtools.vision_toolsr1  rp   r  Úst_sizerj  r‹  r    rŒ  rŸ  rU   rt   ÚloadsrT   r–   rv   rR   rb   )r7  r6   râ  r/  Ú_asyncior1  Úanalysis_promptÚenriched_partsrÂ  Úsize_kbÚresult_jsonr€   Údescriptionrz   Ú	user_textr+  s                   rK   Ú_preprocess_images_with_visionz(HermesCLI._preprocess_images_with_vision  sÇ  € ð 	#Ð"Ð"Ð"Ø:Ð:Ð:Ð:Ð:Ð:ð8ð 	ð ˆØð #	dñ #	dˆHØ—?’?Ñ$Ô$ð ØØ—m’m‘o”oÔ-°Ñ5ˆGØð ^ÝÐ\�TÐ\Ð\°h´mÐ\Ð\ÀwÐ\Ð\ÕVZÐ\Ð\Ñ]Ô]Ð]ðdØ&ŸlšlØ'Ð'µ#°h±-´-È_Ð]Ñ]Ô]ñô �õ œ KÑ0Ô0�Ø—:’:˜iÑ(Ô(ð iØ"(§*¢*¨Z¸Ñ"<Ô"<�KØ"×)Ò)ð2ÐR]ð 2ð 2à&.ð2ð 2ð 2ñô ð ð
  ð EÝÐ C¥TÐ CÐ C½TÐ CÐ CÑDÔDÐDøà"×)Ò)ð2à&.ð2ð 2ð 2ñô ð ð
  ð iÝÐ g¥TÐ gÐ gÕaeÐ gÐ gÑhÔhÐhùøÝð dð dð dØ×%Ò%ð.Èð .ð .à"*ð.ð .ð .ñô ð ð
 ð dÝÐb¥ÐbÐbÕ\`ÐbÐbÑcÔcÐcøøøøùøøøøðdøøøõ ' t­SÑ1Ô1ÐB°dÐB�D�DÀˆ	Øð 	GØ—[’[ Ñ0Ô0ˆFØ1:ÐF�fÐ-Ð- )Ð-Ð-Ð-ÀÐFØÐ<Ð<Ð<s   Á2C$EÅ
F*Å"=F%Æ%F*c           
      ó"  — 	 ddl m}  |¦   «         \  }}d„ |D ¦   «         }|rÛ|                      ¦   «          |                      d¦  «         |D ]˜}d                     |d         dd…         ¦  «        }t	          |d         ¦  «        dk    r|d	t	          |d         ¦  «        dz
  › d
�z  }|                      d|d         › dd                     |d         ¦  «        › d�¦  «         Œ™|                      d¦  «         dS dS # t
          $ r Y dS w xY w)z;Show warnings about disabled tools due to missing API keys.r   )Úcheck_tool_availabilityc                 ó"   — g | ]}|d          ¯
|‘ŒS )Úmissing_varsr]   )rW   Úus     rK   rY   z>HermesCLI._show_tool_availability_warnings.<locals>.<listcomp>M  s"   € ÐKÐKÐK Q¸¸>Ô9JÐK˜qÐKÐKÐKrM   u:   [yellow]âš ï¸�  Some tools disabled (missing API keys):[/]rT  r{  Nr�  z, +z moreu      [dim]â€¢ r    z[/] [dim italic](rC  r¬  z*[dim]   Run 'hermes setup' to configure[/])Úmodel_toolsrA  r  rb   r  rv   )r7  rA  rw  ÚunavailableÚapi_key_missingr&  Ú	tools_strs          rK   r‚  z*HermesCLI._show_tool_availability_warningsE  so  € ð	Ø;Ð;Ð;Ð;Ð;Ð;à%<Ð%<Ñ%>Ô%>Ñ"ˆI�{ð LÐK¨+ÐKÑKÔKˆOàð RØ×#Ò#Ñ%Ô%Ð%Ø×#Ò#Ð$`ÑaÔaÐaØ+ð }ð }�DØ $§	¢	¨$¨w¬-¸¸¸Ô*;Ñ <Ô <�IÝ˜4 œ=Ñ)Ô)¨AÒ-Ð-Ø!Ð%F­3¨t°G¬}Ñ+=Ô+=¸aÑ+?Ð%FÐ%FÐ%FÑF˜	Ø×'Ò'Ð({°t¸F´|Ð({Ð({ÐVZ×V_ÒV_Ð`dÐesÔ`tÑVuÔVuÐ({Ð({Ð({Ñ|Ô|Ð|Ð|Ø×#Ò#Ð$PÑQÔQÐQÐQÐQðRð Røõ ð 	ð 	ð 	ØˆDˆDð	øøøs   ‚C:D  Ä 
DÄDc                 óô  — t          | j        d¬¦  «        }|rt          |¦  «        nd}d| j        v r | j                             d¦  «        d         n| j        }t          |¦  «        dk    r|dd…         d	z   }| j        rd
}nd}	 ddlm}  |¦   «         }|                     dd¦  «        }|                     dd¦  «        }|                     dd¦  «        }	n# t          $ r	 d\  }}}	Y nw xY wd}
| j        r-d| j        vr$d|› d|	› dd 
                    | j        ¦  «        › d�}
d|› d| j        › d�}| j        r|d|› d| j        › d�z  }|                      d|› d|› d|› d |› d!|	› d|› d"|
› |› �¦  «         dS )#z!Show compact startup status line.Try  r   r�  r  r³  Né   rÏ  u   [green bold]â—�[/]u   [red bold]â—�[/]r:  rO  rP  rR  rS  Úui_labelrš  )rP  rS  Úcyanr:   r=  z [dim u   ]Â·[/] [z]toolsets: rT  rU  u   ]Â·[/] [dim]provider: u   ]Â·[/] [dim]auth: r8  ú [r£  r  u   ]Â·[/] [bold z	 tools[/])rs  r~  r  rõ   r  rö   r<  r;  r=  rv   rb   r¿   rz  r  )r7  r{  Ú
tool_countrù  Úapi_indicatorr;  rò   Úseparator_colorr‹  Úlabel_colorÚtoolsets_infoÚprovider_infos               rK   r�  zHermesCLI._show_status[  sI  € õ %°dÔ6KÐX\Ð]Ñ]Ô]ˆØ#(Ð/•S˜‘Z”Z�Z¨aˆ
ð 47¸$¼*Ð3DÐ3D�d”j×&Ò& sÑ+Ô+¨BÔ/Ð/È$Ì*ˆÝˆ{ÑÔ˜bÒ Ð Ø% c r cÔ*¨UÑ2ˆKð Œ<ð 	/Ø0ˆMˆMà.ˆMð	VØ>Ð>Ð>Ð>Ð>Ð>Ø"�?Ñ$Ô$ˆDØ"Ÿnšn¨\¸9ÑEÔEˆOØŸ>š>¨+°yÑAÔAˆLØŸ.š.¨°YÑ?Ô?ˆKˆKøÝð 	Vð 	Vð 	VØ9UÑ6ˆO˜\¨;¨;¨;ð	VøøøàˆØÔ ð 	| U°$Ô2GÐ%GÐ%GØ{ _Ð{Ð{¸kÐ{Ð{ÐVZ×V_ÒV_Ð`dÔ`uÑVvÔVvÐ{Ð{Ð{ˆMàZ ÐZÐZÈÌÐZÐZÐZˆØÔ ð 	dØÐc oÐcÐcÈÔI^ÐcÐcÐcÑcˆMà×Òð.�ð .ð . ,ð .ð .°ð .ð .Ø#ð.ð .Ø2=ð.ð .Ø@Jð.ð .àð.à+ð.ð .ñ	
ô 	
ð 	
ð 	
ð 	
s   ÂAC ÃC-Ã,C-c                 ól  — i }| j         r5	 | j                              | j        ¦  «        pi }n# t          $ r i }Y nw xY w|                     d¦  «        pd                     ¦   «         }| j        }|                     d¦  «        }|r:	 t          j        t          |¦  «        ¦  «        }n# t          $ r
 | j        }Y nw xY w|}dD ]M}|                     |¦  «        }|sŒ	 t          j        t          |¦  «        ¦  «        } n# t          $ r Y ŒJw xY wt          | dd¦  «        }t          |dd¦  «        pd}	t          | d	d¦  «        pd
}
t          | dd¦  «        pd}t          t          | dd¦  «        ¦  «        }ddd| j        › �dt          ¦   «         › �g}|r|                     d|› �¦  «         |                     d|› d|
› d�d|                     d¦  «        › �d|                     d¦  «        › �d|	d›�d|rdnd› �g¦  «         |                      d                     |¦  «        dd¬¦  «         dS ) z6Show gateway-style status for the current CLI session.rL  r:   Ú
started_at)Ú
updated_atÚlast_updated_atÚlast_activity_atrþ   Nr  r   r¿   rŸ  rõ   z	(unknown)r—  FzHermes CLI StatuszSession ID: zPath: zTitle: zModel: rŠ  r:  z	Created: z%Y-%m-%d %H:%MzLast Activity: zTokens: r'  zAgent Running: ÚYesÚNorZ   )rð  Úmarkup)r‘  rd  rŠ  rv   rT   rG   r�  r   ÚfromtimestampÚfloatr–  ræ  r,   r–   r®  r”  r  rb   )r7  rG  rL  Ú
created_atrU  rV  Úfieldr�   rþ   Útotal_tokensr¿   rõ   Ú
is_runningr“  s                 rK   Ú_show_session_statuszHermesCLI._show_session_statusƒ  s×  € àˆØÔð 	"ð"Ø#Ô/×;Ò;¸D¼OÑLÔLÐRÐPR��øÝð "ð "ð "Ø!���ð"øøøð ×!Ò! 'Ñ*Ô*Ð0¨b×7Ò7Ñ9Ô9ˆàÔ'ˆ
Ø!×%Ò% lÑ3Ô3ˆ
Øð 	0ð0Ý%Ô3µE¸*Ñ4EÔ4EÑFÔF�
�
øÝð 0ð 0ð 0Ø!Ô/�
�
�
ð0øøøð  ˆ
ØJð 	ð 	ˆEØ ×$Ò$ UÑ+Ô+ˆEØð ØðÝ%Ô3µE¸%±L´LÑAÔA�
Ø�øÝð ð ð Ø�ðøøøõ ˜˜g tÑ,Ô,ˆÝ˜uÐ&<¸aÑ@Ô@ÐEÀAˆÝ˜4 ¨TÑ2Ô2Ð?°iˆÝ˜˜g tÑ,Ô,Ð;°ˆÝ�' $Ð(8¸%Ñ@Ô@ÑAÔAˆ
ð  ØØ,˜4œ?Ð,Ð,Ø,Õ(Ñ*Ô*Ð,Ð,ð	
ˆð ð 	,Ø�LŠLÐ* 5Ð*Ð*Ñ+Ô+Ð+Ø�ŠØ*�eÐ*Ð*˜xÐ*Ð*Ð*Ø?˜
×+Ò+Ð,<Ñ=Ô=Ð?Ð?ØE˜j×1Ò1Ð2BÑCÔCÐEÐEØ'�|Ð'Ð'Ð'Ø= zÐ;˜e˜e°tÐ=Ð=ð
ñ 	ô 	ð 	ð 	×Ò˜DŸIšI eÑ,Ô,¸ÀeÐÑLÔLÐLÐLÐLs0   ‹!- ­<»<Â!B) Â)B=Â<B=Ã!DÄ
DÄDc                 ó°   — 	 ddl m} n# t          $ r Y dS w xY wt          | dd ¦  «        }t          |dd ¦  «        pt          | dd ¦  «        } ||¦  «        S )Nr   )Úmodel_supports_fast_modeFrþ   rõ   )ro  rd  rv   r–  )r7  rd  rþ   rõ   s       rK   Ú_fast_command_availablez!HermesCLI._fast_command_available¸  s‚   € ð	ØBÐBÐBÐBÐBÐBÐBøÝð 	ð 	ð 	Ø�5�5ð	øøøå˜˜g tÑ,Ô,ˆÝ˜˜w¨Ñ-Ô-ÐMµ¸¸wÈÑ1MÔ1MˆØ'Ð'¨Ñ.Ô.Ð.s   ‚	 ‰
–Úslash_commandc                 ó:   — |dk    r|                       ¦   «         S dS )Nz/fastT)re  )r7  rf  s     rK   Ú_command_availablezHermesCLI._command_availableÁ  s$   € Ø˜GÒ#Ð#Ø×/Ò/Ñ1Ô1Ð1ØˆtrM   c                 óâ  — ddl m} 	 ddlm}  |d¦  «        }n# t          $ r d}Y nw xY w|pd                     ¦   «         pd}d}t          |¦  «        |k    r
|d|…         }t          dt          › d	d
|z  › d	t          › �¦  «         t          t          › d|d|› �›dt          › �¦  «         t          t          › d	d
|z  › d	t          › �¦  «         | 
                    ¦   «         D ]›\  }}t          dt          › d|› dt          › �¦  «         | 
                    ¦   «         D ]_\  }}|                      |¦  «        sŒt          ¦   «                              dt          ¦   «         › d|d›dt          |¦  «        › �¦  «         Œ`Œœt           r«t          dt          › dt          › dt          t           ¦  «        › d�¦  «         t#          t            
                    ¦   «         ¦  «        D ]O\  }}	t          ¦   «                              dt          ¦   «         › d|d›dt          |	d         ¦  «        › �¦  «         ŒPt          dt$          › dt          › �¦  «         t          dt$          › dt          › �¦  «         t          dt$          › dt          › �¦  «         t'          ¦   «         r1t          dt$          › dt)          ¦   «         › dt          › d�¦  «         dS t          dt$          › d t          › d�¦  «         dS )!z3Display help information with categorized commands.r   )ÚCOMMANDS_BY_CATEGORY)Úget_active_help_headerz(^_^)? Available Commandsr:   é7   NrZ   ú+Ú-Ú|ú^ú
  u   â”€â”€ u    â”€â”€z
    [bold r£  ú<15z[/] [dim]-[/] u   
  âš¡ zSkill CommandsrŠ  z installed):z<22r=  z0Tip: Just type your message to chat with Hermes!r8  z$Multi-line: Alt+Enter for a new linez-Draft editor: Ctrl+G (Alt+G in VSCode/Cursor)zAttach image: /image z- or start your prompt with a local image pathzPaste image: Alt+V (or /paste))Úhermes_cli.commandsrj  r<  rk  rv   rG   r  rj  Ú_BOLDrŒ  rB  rh  ré  r¹  rT  r«  Ú_skill_commandsÚsortedr‹  r  r{  )
r7  rj  rk  ÚheaderÚinner_widthÚcategoryÚcommandsr
  ÚdescrÜ  s
             rK   Ú	show_helpzHermesCLI.show_helpÆ  sŸ  € à<Ð<Ð<Ð<Ð<Ð<ð	1ØEÐEÐEÐEÐEÐEØ+Ð+Ð,GÑHÔHˆFˆFøÝð 	1ð 	1ð 	1Ø0ˆFˆFˆFð	1øøøà�,˜B×%Ò%Ñ'Ô'ÐFÐ+FˆØˆÝˆv‰;Œ;˜Ò$Ð$Ø˜L˜[˜LÔ)ˆFÝÐ7•UÐ7Ð7˜S ;Ñ.Ð7Ð7µÐ7Ð7Ñ8Ô8Ð8Ý•5Ð9Ð9˜6Ð9 KÐ9Ð9Ð9Ð9µ4Ð9Ð9Ñ:Ô:Ð:Ý•5Ð5Ð5˜3 Ñ,Ð5Ð5­tÐ5Ð5Ñ6Ô6Ð6à"6×"<Ò"<Ñ">Ô">ð 	ið 	iÑˆH�hÝÐ@�5Ð@Ð@¨Ð@Ð@½$Ð@Ð@ÑAÔAÐAØ%Ÿ^š^Ñ-Ô-ð ið i‘	��TØ×.Ò.¨sÑ3Ô3ð ØÝ‘”×#Ò#Ð$gµ±´Ð$gÐ$gÀÐ$gÐ$gÐ$gÕX_Ð`dÑXeÔXeÐ$gÐ$gÑhÔhÐhÐhðiõ
 ð 	ÝÐ^�uÐ^Ð^µDÐ^Ð^½CÅÑ<PÔ<PÐ^Ð^Ð^Ñ_Ô_Ð_Ý#¥O×$9Ò$9Ñ$;Ô$;Ñ<Ô<ð ð ‘	��TÝ‘”×#Ò#Øf¥¡¤ÐfÐf°ÐfÐfÐfÍÐPTÐUbÔPcÑHdÔHdÐfÐfñô ð ð õ 	ÐS•tÐSÐSÍTÐSÐSÑTÔTÐTÝÐE•TÐEÐE½tÐEÐEÑFÔFÐFÝÐN•TÐNÐNÍÐNÐNÑOÔOÐOÝ!Ñ#Ô#ð 	GÝð  H�ð  Hð  HÕ4NÑ4PÔ4Pð  Hð  Hõ  @Dð  Hð  Hð  Hñ  Iô  Ið  Ið  Ið  IåÐE�ÐEÐE½TÐEÐEÐEÑFÔFÐFÐFÐFs   ˆ š)¨)c                 ó  — t          | j        d¬¦  «        }|st          d¦  «         dS t          ¦   «          d}d}|t          |¦  «        z
  }t          dd|z  z   dz   ¦  «         t          d	d
|dz  z  z   |z   d
||dz  z
  z  z   d	z   ¦  «         t          dd|z  z   dz   ¦  «         t          ¦   «          i }t	          |d„ ¬¦  «        D ]¢}|d         d         }t          |¦  «        pd}||vrg ||<   |d                              dd¦  «        }	|	                     d¦  «        d         }	d|	v r |	d|	                     d¦  «        dz   …         }	||          	                    ||	f¦  «         Œ£t	          | 
                    ¦   «         ¦  «        D ]G}t          d|› d�¦  «         ||         D ]\  }}	t          d|d›d|	› �¦  «         Œt          ¦   «          ŒHt          dt          |¦  «        › d�¦  «         t          ¦   «          dS )z.Display available tools with kawaii ASCII art.Try  z(;_;) No tools availableNz(^_^)/ Available ToolséN   rm  rn  ro  r‚  r�  c                 ó   — | d         d         S )Nr“  r    r]   )rR  s    rK   ú<lambda>z&HermesCLI.show_tools.<locals>.<lambda>  s   € °°*´¸fÔ0E€ rM   ©rM  r“  r    rŸ  r=  r:   rZ   r   ú. r  z  [r£  z    * z<20ú - z	  Total: u    tools  ãƒ½(^o^)ãƒŽ)rs  r~  r¹  r  rv  rt  rT   r  Úindexr–   r   )
r7  r{  rL  rÉ  Úpadr6  r�  r    Útoolsetr{  s
             rK   Ú
show_toolszHermesCLI.show_toolsí  sY  € å$°dÔ6KÐX\Ð]Ñ]Ô]ˆàð 	ÝÐ,Ñ-Ô-Ð-ØˆFõ 	‰ŒˆØ(ˆØˆØ•c˜%‘j”jÑ ˆÝˆc�C˜%‘KÑ #Ñ%Ñ&Ô&Ð&Ýˆc�C˜3 !™8Ñ$Ñ$ uÑ,¨s°c¸CÀ1¹H±nÑ/EÑEÈÑKÑLÔLÐLÝˆc�C˜%‘KÑ #Ñ%Ñ&Ô&Ð&Ý‰Œˆð ˆÝ˜5Ð&EÐ&EÐFÑFÔFð 
	3ð 
	3ˆDØ˜
Ô# FÔ+ˆDÝ*¨4Ñ0Ô0Ð=°IˆGØ˜hÐ&Ð&Ø$&�˜Ñ!Ø˜
Ô#×'Ò'¨°rÑ:Ô:ˆDà—:’:˜dÑ#Ô# AÔ&ˆDØ�tˆ|ˆ|ØÐ1˜TŸZšZ¨Ñ-Ô-°Ñ1Ð1Ô2�Ø�WÔ×$Ò$ d¨D \Ñ2Ô2Ð2Ð2õ ˜hŸmšm™oœoÑ.Ô.ð 	ð 	ˆGÝÐ"˜Ð"Ð"Ð"Ñ#Ô#Ð#Ø& wÔ/ð 4ð 4‘
��dÝÐ2˜tÐ2Ð2Ð2¨DÐ2Ð2Ñ3Ô3Ð3Ð3Ý‰GŒGˆGˆGåÐ9�#˜e™*œ*Ð9Ð9Ð9Ñ:Ô:Ð:Ý‰ŒˆˆˆrM   r
  c                 ón  ‡ ‡‡‡— ddl }ddlm} ddlmŠ ddlmŠ ddlmŠ d|ddfˆˆˆ ˆfd	„}	 | 	                    |¦  «        }n$# t          $ r | 	                    ¦   «         }Y nw xY wt          |¦  «        d
k    r|d
         nd}|dvr‰                      ¦   «          dS |dk    r | |dd¬¦  «        ¦  «         dS |dd…         }|s;t          d|› d�¦  «         t          d|› d�¦  «         t          d|› d�¦  «         dS |dk    rdnd}d                     |¦  «        }	t          t           › |› d|	› dt"          › �¦  «          | |||d¬¦  «        ¦  «         ddlm}
 ddlm}  |
 |¦   «         d¦  «        ‰ _        ‰                      ¦   «          t          t.          › d t"          › �¦  «         dS )!a`  Handle /tools [list|disable|enable] slash commands.

        /tools (no args) shows the tool list.
        /tools list shows enabled/disabled status per toolset.
        /tools disable/enable saves the change to config and resets
        the session so the new tool set takes effect cleanly (no
        prompt-cache breakage mid-conversation).
        r   N)Ú	Namespace)Úredirect_stdoutrë  )Útools_disable_enable_commandÚnsr7   c                 ó@  •— t          ‰dd¦  «        € ‰| ¦  «         dS  G d„ d‰¦  «        } |¦   «         } ‰|¦  «        5   ‰| ¦  «         ddd¦  «         n# 1 swxY w Y   |                     ¦   «                              ¦   «         D ]}t          |¦  «         ŒdS )a�  Run tools_disable_enable_command, routing its ANSI-colored
            print() output through _cprint when inside the interactive TUI
            so escapes aren't mangled by patch_stdout's StdoutProxy into
            garbled '?[32m...?[0m' text.

            Outside the TUI (standalone mode, tests), call straight through
            so real stdout / pytest capture works as expected.
            rŒ  Nc                   ó   — e Zd Zdefd„ZdS )úFHermesCLI._handle_tools_command.<locals>._run_capture.<locals>._TTYBufr7   c                 ó   — dS )NTr]   rG  s    rK   ÚisattyzMHermesCLI._handle_tools_command.<locals>._run_capture.<locals>._TTYBuf.isatty8  s   € Ø˜4rM   N)rJ  rK  rL  ræ  r‘  r]   rM   rK   Ú_TTYBufr�  7  s/   € € € € € ð  Dð  ð  ð  ð  ð  ð  rM   r’  )r–  r÷  r¿  rj  )rŒ  r’  rœ  rÖ  rì  rŠ  r7  r‹  s       €€€€rK   Ú_run_capturez5HermesCLI._handle_tools_command.<locals>._run_capture&  s  ø€ õ �t˜V TÑ*Ô*Ð2Ø,Ð,¨RÑ0Ô0Ð0Ø�ð
 ð  ð  ð  ð  ˜(ñ  ô  ð  ð �'‘)”)ˆCØ � Ñ%Ô%ð 1ð 1Ø,Ð,¨RÑ0Ô0Ð0ð1ð 1ð 1ñ 1ô 1ð 1ð 1ð 1ð 1ð 1ð 1øøøð 1ð 1ð 1ð 1àŸš™œ×1Ò1Ñ3Ô3ð ð �Ý˜‘”��ðð s   ÁAÁAÁ"Ar  r:   )ra   ÚdisableÚenablera   rc  )Útools_actionr‹  r�  z(._.) Usage: /tools z <name> [name ...]z  Built-in toolset:  /tools z webz  MCP tool:          /tools z github:create_issuer”  Ú	DisablingÚEnablingrT  r‚  rÏ  )r–  rœ   r‹  ©Ú_get_platform_toolsrê  z0Session reset. New tool configuration is active.)ÚshlexÚargparser‰  Ú
contextlibrŠ  rñ  rì  Úhermes_cli.tools_configr‹  r  r¦  r  r‡  r¹  rb   rj  rñ  rŒ  rš  r>  rë  r~  Únew_sessionr‹  )r7  r
  r›  r‰  r“  rc   Ú
subcommandrœ   Úverbró  rš  rë  rì  rŠ  r‹  s   `           @@@rK   Ú_handle_tools_commandzHermesCLI._handle_tools_command  s“  øøøø€ ð 	ˆˆˆØ&Ð&Ð&Ð&Ð&Ð&Ø.Ð.Ð.Ð.Ð.Ð.ØÐÐÐÐÐØHÐHÐHÐHÐHÐHð	˜Yð 	¨4ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð6	 Ø—K’K Ñ$Ô$ˆEˆEøÝð 	 ð 	 ð 	 Ø—I’I‘K”KˆEˆEˆEð	 øøøõ "% U¡¤¨a¢ �U˜1”X�X°Rˆ
ØÐ:Ð:Ð:Ø�OŠOÑÔÐØˆFà˜ÒÐØˆL˜˜°ÀÐGÑGÔGÑHÔHÐHØˆFà�a�b�b”	ˆØð 	ÝÐG¨ÐGÐGÐGÑHÔHÐHÝÐA°ÐAÐAÐAÑBÔBÐBÝÐQ°ÐQÐQÐQÑRÔRÐRØˆFð
 )¨IÒ5Ð5ˆ{ˆ{¸:ˆØ—	’	˜%Ñ Ô ˆÝ•7Ð3˜DÐ3Ð3 5Ð3Ð3­TÐ3Ð3Ñ4Ô4Ð4àˆ�Y�Y¨J¸eÈeÐTÑTÔTÑUÔUÐUð 	@Ð?Ð?Ð?Ð?Ð?Ø1Ð1Ð1Ð1Ð1Ð1Ø 3Ð 3°K°K±M´MÀ5Ñ IÔ IˆÔØ×ÒÑÔÐÝ•4ÐOÐOÍÐOÐOÑPÔPÐPÐPÐPs   ¯A ÁA&Á%A&c                 óÔ  — t          ¦   «         }t          ¦   «          d}d}|t          |¦  «        z
  }t          dd|z  z   dz   ¦  «         t          dd|dz  z  z   |z   d||dz  z
  z  z   dz   ¦  «         t          dd|z  z   dz   ¦  «         t          ¦   «          t          |                     ¦   «         ¦  «        D ]T}t          |¦  «        }|rA|d         }|d	         }| j        r|| j        v rd
nd}	t          d|	› d|d›d|d›d|› �¦  «         ŒUt          ¦   «          t          d¦  «         t          ¦   «          t          d¦  «         t          d¦  «         t          ¦   «          dS )z1Display available toolsets with kawaii ASCII art.z(^_^)b Available Toolsetsé:   rm  rn  ro  r‚  r�  rN  r=  z(*)ú   r8  z<18rM  z>2z
 tools] - z  (*) = currently enabledz.  Tip: Use 'all' or '*' to enable all toolsetsz0  Example: python cli.py --toolsets web,terminalN)rx  r¹  r  rv  r   ry  r~  )
r7  Úall_toolsetsrL  rÉ  r…  r    rÜ  rN  r{  Úmarkers
             rK   Úshow_toolsetszHermesCLI.show_toolsetsf  s�  € å'Ñ)Ô)ˆõ 	‰ŒˆØ+ˆØˆØ•c˜%‘j”jÑ ˆÝˆc�C˜%‘KÑ #Ñ%Ñ&Ô&Ð&Ýˆc�C˜3 !™8Ñ$Ñ$ uÑ,¨s°c¸CÀ1¹H±nÑ/EÑEÈÑKÑLÔLÐLÝˆc�C˜%‘KÑ #Ñ%Ñ&Ô&Ð&Ý‰Œˆå˜<×,Ò,Ñ.Ô.Ñ/Ô/ð 	Qð 	QˆDÝ# DÑ)Ô)ˆDØð QØ! ,Ô/�
Ø˜MÔ*�ð #'Ô"7Ðd¸DÀDÔDYÐ<YÐ<Y˜˜Ð_d�ÝÐO˜6ÐOÐO DÐOÐOÐO°
ÐOÐOÐOÈÐOÐOÑPÔPÐPøå‰ŒˆÝÐ)Ñ*Ô*Ð*Ý‰ŒˆÝÐ>Ñ?Ô?Ð?ÝÐ@ÑAÔAÐAÝ‰ŒˆˆˆrM   c                 óÆ   — ddl m} ddlm}  |¦   «         } |¦   «         }t	          ¦   «          t	          d|› �¦  «         t	          d|› �¦  «         t	          ¦   «          dS )z/Display active profile name and home directory.r   rÜ  ©Úget_active_profile_namez  Profile: z  Home:    N)r   r,   Úhermes_cli.profilesr«  r¹  )r7  r,   r«  rÿ   Úprofile_names        rK   Ú_handle_profile_commandz!HermesCLI._handle_profile_command…  s†   € à8Ð8Ð8Ð8Ð8Ð8Ø?Ð?Ð?Ð?Ð?Ð?à%Ð%Ñ'Ô'ˆØ.Ð.Ñ0Ô0ˆå‰ŒˆÝÐ*˜LÐ*Ð*Ñ+Ô+Ð+ÝÐ%˜GÐ%Ð%Ñ&Ô&Ð&Ý‰ŒˆˆˆrM   c                 ó¢  — t          j        dd¦  «        }t          j        dt          j        ¦   «         ¦  «        }t          j        dd¦  «        }t          dz  }t	          t
          ¦  «        j        dz  }|                     ¦   «         r|}n|}|                     ¦   «         rdnd	}| j        r*t          | j        ¦  «        d
k    rd| j        dd…         z   nd}t          ¦   «          d}	d}
|
t          |	¦  «        z
  }t          dd|
z  z   dz   ¦  «         t          dd|dz  z  z   |	z   d||dz  z
  z  z   dz   ¦  «         t          dd|
z  z   dz   ¦  «         t          ¦   «          t          d¦  «         t          d| j        › �¦  «         t          d| j        › �¦  «         t          d|› �¦  «         t          ¦   «          t          d¦  «         t          d|› �¦  «         |dk    rWt          j        dd¦  «        }t          j        dd¦  «        }t          j        d d!¦  «        }t          d"|› d#|› d$|› �¦  «         t          d%|› �¦  «         t          d&|› d'�¦  «         t          ¦   «          t          d(¦  «         t          d)| j        › �¦  «         t          d*| j        rd+                     | j        ¦  «        nd,› �¦  «         t          d-| j        › �¦  «         t          ¦   «          t          d.¦  «         t          d/| j                             d0¦  «        › �¦  «         t          d1|› d|› �¦  «         t          ¦   «          dS )2z4Display current configuration with kawaii ASCII art.r  rÀ   r  r	  Ú60rº   r»   z(loaded)z(not found)r¶  z********éüÿÿÿNzNot set!z(^_^) Configurationró   rm  rn  ro  r‚  r�  z  -- Model --z  Model:     z  Base URL:  z  API Key:   z  -- Terminal --z  Environment:  Ússhr  znot setr  r  Ú22z  SSH Target:   ú@r‘  z  Working Dir:  z  Timeout:      rê  z  -- Agent --z  Max Turns:  z  Toolsets:   rT  r=  z  Verbose:    z  -- Session --z  Started:     z%Y-%m-%d %H:%M:%Sz  Config File: )r’   r–  r@  ro   r   r9  r:  rp   rö   r  r¹  rõ   r¾   rä   r~  rb   rå   r�  r”  )r7  Úterminal_envÚterminal_cwdÚterminal_timeoutrD  rE  rG  Úconfig_statusÚapi_key_displayrL  rÉ  r…  r  r  r  s                  rK   Úshow_configzHermesCLI.show_config’  sx  € õ ”y °Ñ9Ô9ˆÝ”y µ´±´Ñ=Ô=ˆÝœ9Ð%7¸Ñ>Ô>Ðå'¨-Ñ7ÐÝ"¥8™nœnÔ3Ð6GÑGÐØ×"Ò"Ñ$Ô$ð 	.Ø*ˆKˆKà-ˆKØ&1×&8Ò&8Ñ&:Ô&:ÐM˜
˜
Àˆà<@¼LÐrÍSÐQUÔQ]ÑM^ÔM^ÐabÒMbÐMb˜* t¤|°B°C°CÔ'8Ñ8Ð8Ðhrˆå‰ŒˆØ%ˆØˆØ•c˜%‘j”jÑ ˆÝˆc�C˜%‘KÑ #Ñ%Ñ&Ô&Ð&Ýˆc�C˜3 !™8Ñ$Ñ$ uÑ,¨s°c¸CÀ1¹H±nÑ/EÑEÈÑKÑLÔLÐLÝˆc�C˜%‘KÑ #Ñ%Ñ&Ô&Ð&Ý‰ŒˆÝˆoÑÔÐÝÐ*˜dœjÐ*Ð*Ñ+Ô+Ð+ÝÐ-˜dœmÐ-Ð-Ñ.Ô.Ð.ÝÐ/˜oÐ/Ð/Ñ0Ô0Ð0Ý‰ŒˆÝÐ Ñ!Ô!Ð!ÝÐ/ Ð/Ð/Ñ0Ô0Ð0Ø˜5Ò Ð Ý”yÐ!4°iÑ@Ô@ˆHÝ”yÐ!4°iÑ@Ô@ˆHÝ”yÐ!4°dÑ;Ô;ˆHÝÐE XÐEÐE°ÐEÐE¸8ÐEÐEÑFÔFÐFÝÐ/ Ð/Ð/Ñ0Ô0Ð0ÝÐ4Ð!1Ð4Ð4Ð4Ñ5Ô5Ð5Ý‰ŒˆÝˆoÑÔÐÝÐ/˜tœ~Ð/Ð/Ñ0Ô0Ð0ÝÐeÀ4ÔCXÐc˜tŸyšy¨Ô)>Ñ?Ô?Ð?Ð^cÐeÐeÑfÔfÐfÝÐ-˜tœ|Ð-Ð-Ñ.Ô.Ð.Ý‰ŒˆÝÐÑ Ô Ð ÝÐR Ô 2× ;Ò ;Ð<OÑ PÔ PÐRÐRÑSÔSÐSÝÐ= Ð=Ð=¨mÐ=Ð=Ñ>Ô>Ð>Ý‰ŒˆˆˆrM   rÍ  c                 ó–   ‡ — ‰ j         sg S 	 ‰ j                              ddg|¬¦  «        }n# t          $ r g cY S w xY wˆ fd„|D ¦   «         S )zCReturn recent CLI sessions for in-chat browsing/resume affordances.rc  r�  )r  Úexclude_sourcesrÍ  c                 óP   •— g | ]"}|                      d ¦  «        ‰j        k    ¯ |‘Œ#S )rç  )rT   rŠ  )rW   rê  r7  s     €rK   rY   z3HermesCLI._list_recent_sessions.<locals>.<listcomp>Ð  s/   ø€ ÐFÐFÐF�a q§u¢u¨T¡{¤{°d´oÒ'EÐ'E�Ð'EÐ'EÐ'ErM   )r‘  Úlist_sessions_richrv   )r7  rÍ  rì  s   `  rK   Ú_list_recent_sessionszHermesCLI._list_recent_sessionsÄ  s‚   ø€ àÔð 	ØˆIð	ØÔ'×:Ò:ØØ!' Øð ;ñ ô ˆHˆHøõ
 ð 	ð 	ð 	ØˆIˆIˆIð	øøøàFÐFÐFÐF˜8ÐFÑFÔFÐFs   Œ+ «:¹:Úhistory)rÉ  rÍ  rÉ  c                óš  — |                       |¬¦  «        }|sdS ddlm} t          ¦   «          |dk    rt          d¦  «         nt          d¦  «         t          ¦   «          t          dd	d
›ddd›ddd›dd› �¦  «         t          dd› dd› dd› dd› �¦  «         |D ]‚}|                     d¦  «        pddd…         }|                     d¦  «        pddd…         } ||                     d¦  «        ¦  «        }t          d|d
›d|d›d|d›d|d         › �¦  «         Œƒt          ¦   «          t          d¦  «         t          ¦   «          dS ) z˜Render recent sessions inline from the active chat TUI.

        Returns True when something was shown, False if no session list was available.
        rë  Fr   )Ú_relative_timerÀ  uV   (._.) No messages in the current chat yet â€” here are recent sessions you can resume:z  Recent sessions:r8  ÚTitlez<32r‚  ÚPreviewz<40zLast Activez<13rÞ  u`   â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€rÂ  u'   â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€uH   â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€rL  u   â€”Nr³  r”  r:   é&   Úlast_activerç  zC  Use /resume <session id or title> to continue where you left off.T)r¿  Úhermes_cli.mainrÂ  r¹  rT   )	r7  rÉ  rÍ  rì  rÂ  ÚsessionrL  r”  rÆ  s	            rK   Ú_show_recent_sessionszHermesCLI._show_recent_sessionsÒ  s­  € ð
 ×-Ò-°EÐ-Ñ:Ô:ˆØð 	Ø�5à2Ð2Ð2Ð2Ð2Ð2å‰ŒˆØ�YÒÐÝÐjÑkÔkÐkÐkåÐ&Ñ'Ô'Ð'Ý‰ŒˆÝÐK�7ÐKÐKÐK ÐKÐKÐK°ÐKÐKÐKÀTÐKÐKÑLÔLÐLÝÐF�:ÐFÐF 
ÐFÐF¨ZÐFÐF¸*ÐFÐFÑGÔGÐGØð 	Tð 	TˆGØ—[’[ Ñ)Ô)Ð2¨U°C°R°CÔ8ˆEØ—{’{ 9Ñ-Ô-Ð3°°S°b°SÔ9ˆGØ(˜.¨¯ª°]Ñ)CÔ)CÑDÔDˆKÝÐR�uÐRÐRÐR 7ÐRÐRÐR°ÐRÐRÐRÀ7È4Ä=ÐRÐRÑSÔSÐSÐSÝ‰ŒˆÝÐSÑTÔTÐTÝ‰ŒˆØˆtrM   c                 ó¤  ‡— | j         s'|                      d¬¦  «        st          d¦  «         dS d}d}dŠˆfd„}t          ¦   «          t          d¦  «         t          d	¦  «         t          d¦  «         | j         D �]9}|                     d
d¦  «        }|dk    r‰dz  ŠŒ%|dvrŒ* |¦   «          |dz  }|                     d¦  «        }|€dnt	          |¦  «        }|dk    rEt          d|› d�¦  «         t          d|d|…         › t          |¦  «        |k    rdnd› �¦  «         Œ¬t          d|› d�¦  «         |                     d¦  «        pg }|r"|d|…         }	t          |¦  «        |k    rdnd}
n+|r%t          |¦  «        }|dk    rdnd}d|› d|› d�}	d}
nd}	d}
t          d|	› |
› �¦  «         �Œ; |¦   «          t          ¦   «          dS )zDisplay conversation history.rÀ  ©rÉ  z"(._.) No conversation history yet.Ni�  r   c                  ór   •— ‰sd S ‰dk    rdnd} t          d¦  «         t          d‰› d| › d�¦  «         dŠd S )	Nr  r¢  Úmessagesz

  [Tools]z    (r–  z hidden)r   )r¹  )rµ  Úhidden_tool_messagess    €rK   Úflush_tool_summaryz2HermesCLI.show_history.<locals>.flush_tool_summaryú  s`   ø€ à'ð Ø�à 4¸Ò 9Ð 9�9�9¸zˆDÝ�-Ñ Ô Ð ÝÐDÐ.ÐDÐD°dÐDÐDÐDÑEÔEÐEØ#$Ð Ð Ð rM   ú4+--------------------------------------------------+z3|            (^_^) Conversation History           |rF  rŸ  r�  r  >   rK  r’  rN   r:   rK  z	
  [You #r£  r  rÏ  z
  [Hermes #r>   r”  r•  z(requested r–  r:  z(no text response))r�  rÉ  r¹  rT   rU   r  )r7  Úpreview_limitÚvisible_indexrÏ  r«  rF  rN   Úcontent_textr>   r”  rº  rN  rµ  rÎ  s                @rK   Úshow_historyzHermesCLI.show_historyï  sz  ø€ àÔ(ð 	Ø×-Ò-°YÐ-Ñ?Ô?ð <ÝÐ:Ñ;Ô;Ð;ØˆFàˆØˆØ Ðð	%ð 	%ð 	%ð 	%ð 	%õ 	‰ŒˆÝÐ"Ñ#Ô#Ð#ÝÐLÑMÔMÐMÝÐ"Ñ#Ô#Ð#àÔ,ð $	,ñ $	,ˆCØ—7’7˜6 9Ñ-Ô-ˆDà�vŠ~ˆ~Ø$¨Ñ)Ð$ØàÐ0Ð0Ð0ØàÐÑ Ô Ð Ø˜QÑˆMà—g’g˜iÑ(Ô(ˆGØ!( ˜2˜2µc¸'±l´lˆLà�vŠ~ˆ~ÝÐ3 =Ð3Ð3Ð3Ñ4Ô4Ð4ÝØm˜<¨¨¨Ô7ÐmÅ#ÀlÑBSÔBSÐVcÒBcÐBc¸¸ÐikÐmÐmñô ð ð åÐ2 -Ð2Ð2Ð2Ñ3Ô3Ð3ØŸš Ñ.Ô.Ð4°"ˆJØð 
Ø& ~¨ ~Ô6�Ý"% lÑ"3Ô"3°mÒ"CÐ"C˜˜È��Øð Ý  ™_œ_�
Ø!+¨q¢ �v�v°g�ØA¨
ÐAÐA¸$ÐAÐAÐA�Ø��à.�Ø�ÝÐ*˜Ð* &Ð*Ð*Ñ+Ô+Ð+Ñ+àÐÑÔÐÝ‰ŒˆˆˆrM   Ú
event_typec           	      óš   — 	 ddl m}  ||| j        r| j        j        ndt	          | dd¦  «        pd¬¦  «         dS # t
          $ r Y dS w xY w)uØ   Fire a session-boundary plugin hook (on_session_finalize or on_session_reset).

        Non-blocking â€” errors are caught and logged.  Safe to call from any
        lifecycle point (shutdown, /new, /reset).
        r   r†  Nr‹  rc  r‰  )r“  r‡  rþ   rŠ  r–  rv   )r7  rÕ  r—  s      rK   Ú_notify_session_boundaryz"HermesCLI._notify_session_boundary2  s‹   € ð	ØFÐFÐFÐFÐFÐFØˆLØØ48´JÐH˜4œ:Ô0Ð0ÀDÝ   z°4Ñ8Ô8ÐA¸Eðñ ô ð ð ð øõ
 ð 	ð 	ð 	ØˆDˆDð	øøøs   ‚8< ¼
A
Á	A
c                 óò  — | j         r<| j        r5| j                              | j        ¦  «         |                      d¦  «         n| j         r|                      d¦  «         | j        }| j        r/|r-	 | j                             |d¦  «         n# t          $ r Y nw xY wt          j	        ¦   «         | _
        | j
                             d¦  «        }t          j        ¦   «         j        dd…         }|› d|› �| _        g | _        d| _        d| _        | j         �rL| j        | j         _        | j
        | j         _
        | j                              ¦   «          t%          | j         d¦  «        rd	| j         _        t%          | j         d
¦  «        r,	 d	dlm}  |¦   «         | j         _        n# t          $ r Y nw xY wt%          | j         d¦  «        r| j                              ¦   «          | j        re	 | j                             | j        t2          j                             dd¦  «        | j        | j        | j        dœ¬¦  «         n# t          $ r Y nw xY w|                      d¦  «         |st?          d¦  «         dS dS )zDStart a fresh session with a new session ID and cleared agent state.rˆ  rŸ  re  Nrf  rg  FÚ_last_flushed_db_idxr   Ú_todo_store©Ú	TodoStoreÚ_invalidate_system_promptÚHERMES_SESSION_SOURCErc  ©rú   rƒ  )rŠ  r  rõ   Úmodel_configÚon_session_resetz(^_^)v New session started!) rþ   r�  Úcommit_memory_sessionr×  rŠ  r‘  Úend_sessionrv   r   r  r�  r”  rº  r»  r¼  r“  rŽ  Úreset_session_stater•  rÙ  Útools.todo_toolrÜ  rÚ  rÝ  Úcreate_sessionr’   rµ   rT   rõ   rä   rƒ  r¹  )r7  ÚsilentÚold_session_idrÏ  rÐ  rÜ  s         rK   rŸ  zHermesCLI.new_sessionB  sÏ  € àŒ:ð 	A˜$Ô3ð 	AàŒJ×,Ò,¨TÔ-FÑGÔGÐGØ×)Ò)Ð*?Ñ@Ô@Ð@Ð@ØŒZð 	Aà×)Ò)Ð*?Ñ@Ô@Ð@àœˆØÔð 	 ð 	ðØÔ ×,Ò,¨^¸]ÑKÔKÐKÐKøÝð ð ð Ø�ðøøøõ &œ\™^œ^ˆÔØÔ*×3Ò3°OÑDÔDˆÝ”Z‘\”\Ô% b q bÔ)ˆ
Ø*Ð9Ð9¨ZÐ9Ð9ˆŒØ$&ˆÔ!Ø"ˆÔØˆŒàŒ:ñ 	>Ø$(¤OˆDŒJÔ!Ø'+Ô'9ˆDŒJÔ$ØŒJ×*Ò*Ñ,Ô,Ð,Ý�t”zÐ#9Ñ:Ô:ð 4Ø23�”
Ô/Ý�t”z =Ñ1Ô1ð ðØ9Ð9Ð9Ð9Ð9Ð9Ø-6¨Y©[¬[�D”JÔ*Ð*øÝ ð ð ð Ø�Dðøøøå�t”zÐ#>Ñ?Ô?ð 7Ø”
×4Ò4Ñ6Ô6Ð6àÔð ðØÔ$×3Ò3Ø#'¤?Ý!œzŸ~š~Ð.EÀuÑMÔMØ"œjà.2¬nØ04Ô0Eð&ð &ð	 4ñ ô ð ð øõ !ð ð ð Ø�Dðøøøà×)Ò)Ð*<Ñ=Ô=Ð=àð 	1ÝÐ/Ñ0Ô0Ð0Ð0Ð0ð	1ð 	1s7   Á1B Â
BÂBÆ
F% Æ%
F2Æ1F2Ç+AH? È?
IÉIc                 óú  — |                      dd¦  «        }t          |¦  «        dk    r|d                              ¦   «         nd}|s8t          d¦  «         |                      d¬¦  «        rdS t          d¦  «         dS | j        st          d¦  «         dS d	d
lm}  ||¦  «        }|p|}| j                             |¦  «        }|s#t          d|› �¦  «         t          d¦  «         dS 	 | j         	                    |¦  «        }n# t          $ r |}Y nw xY w|r<||k    r6t          d|› d|› d�¦  «         |}| j                             |¦  «        }	|	r|	}|| j        k    rt          d¦  «         dS 	 | j                             | j        d¦  «         n# t          $ r Y nw xY w|| _        d| _        d| _        | j                             |¦  «        }
d„ |
pg D ¦   «         }
|
| _        	 | j                             |¦  «         n# t          $ r Y nw xY w| j        rÇ|| j        _        | j                             ¦   «          t)          | j        d¦  «        rt          | j        ¦  «        | j        _        t)          | j        d¦  «        r,	 d	dlm}  |¦   «         | j        _        n# t          $ r Y nw xY wt)          | j        d¦  «        r| j                             ¦   «          |                     d¦  «        rd|d         › d�nd}t          d„ | j        D ¦   «         ¦  «        }| j        r:t          d|› |› d|› d|dk    rdnd› d t          | j        ¦  «        › d!�
¦  «         dS t          d|› |› d"�¦  «         dS )#uW   Handle /resume <session_id_or_title> â€” switch to a previous session mid-conversation.Nr  r:   z&  Usage: /resume <session_id_or_title>r7  rË  zA  Tip:   Use /history or `hermes sessions list` to find sessions.ú!  Session database not available.r   )Ú_resolve_session_by_name_or_idz  Session not found: zC  Use /history or `hermes sessions list` to see available sessions.z
  Session rB  z/; resuming the descendant with your transcript.z  Already on that session.Úresumed_otherTc                 óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS rE  rª  rH  s     rK   rY   z4HermesCLI._handle_resume_command.<locals>.<listcomp>¸  s,   € ÐSÐSÐS˜!°1·5²5¸±=´=ÀNÒ3RÐ3R�AÐ3RÐ3RÐ3RrM   rÙ  rÚ  rÛ  rÝ  rL  rM  r~  c                 óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS rJ  rª  rH  s     rK   rY   z4HermesCLI._handle_resume_command.<locals>.<listcomp>Ñ  ó-   € ÐYÐYÐY˜qÀÇÂÀvÁÄÐRXÒAXÐAX˜ÐAXÐAXÐAXrM   u     â†» Resumed session rŠ  rN  rê  rT  z total)u!    â€” no messages, starting fresh.)r  r  rG   rj  rÉ  r‘  rÇ  rë  rd  re  rv   rŠ  rã  rŽ  r“  rf  r�  Úreopen_sessionrþ   rä  r•  rÙ  rå  rÜ  rÚ  rÝ  rT   )r7  r   rc   Útargetrë  rš  Ú	target_idrG  rq  rr  rs  rÜ  ru  rt  s                 rK   Ú_handle_resume_commandz HermesCLI._handle_resume_command|  sš  € à×"Ò" 4¨Ñ+Ô+ˆÝ%(¨¡Z¤Z°!¢^ ^��q”—’Ñ!Ô!Ð!¸ˆàð 	ÝÐ<Ñ=Ô=Ð=Ø×)Ò)°Ð)Ñ:Ô:ð Ø�ÝÐWÑXÔXÐXØˆFàÔð 	ÝÐ7Ñ8Ô8Ð8ØˆFð 	CÐBÐBÐBÐBÐBØ1Ð1°&Ñ9Ô9ˆØÐ& ˆ	àÔ'×3Ò3°IÑ>Ô>ˆØð 	ÝÐ4¨FÐ4Ð4Ñ5Ô5Ð5ÝÐYÑZÔZÐZØˆFð	$ØÔ*×DÒDÀYÑOÔOˆKˆKøÝð 	$ð 	$ð 	$Ø#ˆKˆKˆKð	$øøøàð 	-˜;¨)Ò3Ð3ÝðA˜Yð Að A¸[ð Að Að Añô ð ð $ˆIØ Ô,×8Ò8¸ÑCÔCˆMØð -Ø,�à˜œÒ'Ð'ÝÐ0Ñ1Ô1Ð1ØˆFð	ØÔ×(Ò(¨¬¸/ÑJÔJÐJÐJøÝð 	ð 	ð 	ØˆDð	øøøð $ˆŒØˆŒØ"ˆÔð Ô#×@Ò@ÀÑKÔKˆØSÐS  ¨BÐSÑSÔSˆØ$,ˆÔ!ð	ØÔ×+Ò+¨IÑ6Ô6Ð6Ð6øÝð 	ð 	ð 	ØˆDð	øøøð Œ:ð 	7Ø$-ˆDŒJÔ!ØŒJ×*Ò*Ñ,Ô,Ð,Ý�t”zÐ#9Ñ:Ô:ð QÝ25°dÔ6OÑ2PÔ2P�”
Ô/Ý�t”z =Ñ1Ô1ð ðØ9Ð9Ð9Ð9Ð9Ð9Ø-6¨Y©[¬[�D”JÔ*Ð*øÝ ð ð ð Ø�Dðøøøå�t”zÐ#>Ñ?Ô?ð 7Ø”
×4Ò4Ñ6Ô6Ð6à8D×8HÒ8HÈÑ8QÔ8QÐYÐ4˜<¨Ô0Ð4Ð4Ð4Ð4ÐWYˆ
ÝÐYÐY DÔ$=ÐYÑYÔYÑZÔZˆ	ØÔ$ð 	gÝð<¨ð <°Jð <ð <Øð<ð <Ø4=À²N°N¨S¨SÈð<ð <å˜Ô1Ñ2Ô2ð<ð <ð <ñô ð ð ð õ Ðe¨YÐe¸
ÐeÐeÐeÑfÔfÐfÐfÐfsH   Ã-D ÄDÄDÅ5 F Æ
F#Æ"F#Ç+H È
HÈHÊJ& Ê&
J3Ê2J3c                 ó°  — | j         st          d¦  «         dS | j        st          d¦  «         dS |                     dd¦  «        }t	          |¦  «        dk    r|d                              ¦   «         nd}t          j        ¦   «         }|                     d¦  «        }t          j
        ¦   «         j        dd…         }|› d|› �}|r|}nFd}	| j        r| j                             | j        ¦  «        }	|	pd	}
| j                             |
¦  «        }| j        }	 | j                             | j        d
¦  «         n# t           $ r Y nw xY w	 | j                             |t$          j                             dd¦  «        | j        | j        | j        dœ|¬¦  «         n*# t           $ r}t          d|› �¦  «         Y d}~dS d}~ww xY w| j         D ]¼}	 | j                             ||                     dd¦  «        |                     d¦  «        |                     d¦  «        p|                     d¦  «        |                     d¦  «        |                     d¦  «        |                     d¦  «        ¬¦  «         Œ­# t           $ r Y Œ¹w xY w	 | j                             ||¦  «         n# t           $ r Y nw xY w|| _        || _        d| _        d| _        | j        �r|| j        _        || j        _        t=          | j        d¦  «        r2t=          | j        d¦  «        r| j        j        d|› d�z  | j        _         | j         !                    ¦   «          t=          | j        d¦  «        rt	          | j         ¦  «        | j        _"        t=          | j        d¦  «        r,	 d d!l#m$}  |¦   «         | j        _%        n# t           $ r Y nw xY wt=          | j        d"¦  «        r| j         &                    ¦   «          t	          d#„ | j         D ¦   «         ¦  «        }t          d$|› d%|› d&|dk    rd'nd› d(�¦  «         t          d)|› �¦  «         t          d*|› �¦  «         dS )+u*  Handle /branch [name] â€” fork the current session into a new independent copy.

        Copies the full conversation history to a new session so the user can
        explore a different approach without losing the original session state.
        Inspired by Claude Code's /branch command.
        u5     No conversation to branch â€” send a message first.Nrê  r  r:   re  rf  rg  r¸  ÚbranchedrÞ  rc  rß  )rŠ  r  rõ   rà  Úparent_session_idz#  Failed to create branch session: rF  rK  rN   Ú	tool_namer    r>   Útool_call_idr4   )rŠ  rF  rN   r÷  r>   rø  r4   TÚsession_log_fileÚlogs_dirÚsession_ú.jsonrÙ  rÚ  r   rÛ  rÝ  c                 óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS rJ  rª  rH  s     rK   rY   z4HermesCLI._handle_branch_command.<locals>.<listcomp>H  rï  rM   u     â‘‚ Branched session "z" (rN  rê  r:  z  Original session: z  Branch session:   )'r�  rj  r‘  r  r  rG   r   r  r”  rº  r»  r¼  Úget_session_titlerŠ  Úget_next_title_in_lineagerã  rv   ræ  r’   rµ   rT   rõ   rä   rƒ  Úappend_messagerp  r�  r“  rŽ  rþ   r•  rú  rù  rä  rÙ  rå  rÜ  rÚ  rÝ  )r7  r   rc   rÍ  r  rÏ  rÐ  Únew_session_idÚbranch_titleÚcurrent_titler·   rö  rz   r«  rÜ  rt  s                   rK   Ú_handle_branch_commandz HermesCLI._handle_branch_commandÛ  s$  € ð Ô(ð 	ÝÐKÑLÔLÐLØˆFàÔð 	ÝÐ7Ñ8Ô8Ð8ØˆFà×"Ò" 4¨Ñ+Ô+ˆÝ*-¨e©*¬*°qª.¨.�e˜A”h—n’nÑ&Ô&Ð&¸bˆõ Œl‰nŒnˆØŸš _Ñ5Ô5ˆÝ”Z‘\”\Ô% b q bÔ)ˆ
Ø)Ð8Ð8¨JÐ8Ð8ˆð ð 	LØ&ˆLˆLð !ˆMØÔð TØ $Ô 0× BÒ BÀ4Ä?Ñ SÔ S�Ø Ð, HˆDØÔ+×EÒEÀdÑKÔKˆLð !œOÐð	ØÔ×(Ò(¨¬¸*ÑEÔEÐEÐEøÝð 	ð 	ð 	ØˆDð	øøøð	ØÔ×+Ò+Ø)Ý”z—~’~Ð&=¸uÑEÔEØ”jà&*¤nØ(,Ô(=ðð ð #4ð ,ñ 	ô 	ð 	ð 	øõ ð 	ð 	ð 	ÝÐ=¸!Ð=Ð=Ñ>Ô>Ð>ØˆFˆFˆFˆFˆFøøøøð	øøøð
 Ô,ð 	ð 	ˆCðØÔ ×/Ò/Ø-ØŸš ¨Ñ0Ô0ØŸGšG IÑ.Ô.Ø!Ÿgšg kÑ2Ô2ÐE°c·g²g¸f±o´oØ"Ÿwšw |Ñ4Ô4Ø!$§¢¨Ñ!8Ô!8Ø!Ÿgšg kÑ2Ô2ð 0ñ ô ð ð øõ ð ð ð Ø�ðøøøð	ØÔ×.Ò.¨~¸|ÑLÔLÐLÐLøÝð 	ð 	ð 	ØˆDð	øøøð )ˆŒØ ˆÔØ"ˆÔØˆŒð Œ:ñ 	7Ø$2ˆDŒJÔ!Ø'*ˆDŒJÔ$õ �t”zÐ#5Ñ6Ô6ð ½7À4Ä:ÈzÑ;ZÔ;Zð à”JÔ'Ð*J°^Ð*JÐ*JÐ*JÑJð ”
Ô+ð ŒJ×*Ò*Ñ,Ô,Ð,Ý�t”zÐ#9Ñ:Ô:ð QÝ25°dÔ6OÑ2PÔ2P�”
Ô/Ý�t”z =Ñ1Ô1ð ðØ9Ð9Ð9Ð9Ð9Ð9Ø-6¨Y©[¬[�D”JÔ*Ð*øÝ ð ð ð Ø�Dðøøøå�t”zÐ#>Ñ?Ô?ð 7Ø”
×4Ò4Ñ6Ô6Ð6åÐYÐY DÔ$=ÐYÑYÔYÑZÔZˆ	ÝðJ¨ð Jð JØðJð JØ09¸Q²°¨¨ÀBðJð Jð Jñ	
ô 	
ð 	
õ 	Ð:Ð'8Ð:Ð:Ñ;Ô;Ð;ÝÐ7 ~Ð7Ð7Ñ8Ô8Ð8Ð8Ð8sb   Ä D9 Ä9
EÅEÅ
AF Æ
GÆ$F<Æ<GÇB)I8É8
JÊJÊ	J% Ê%
J2Ê1J2ÎN5 Î5
OÏOc                 óÖ  — | j         st          d¦  «         dS t          j        ¦   «                              d¦  «        }d|› d�}	 t          |dd¬¦  «        5 }t          j        | j        | j	         
                    ¦   «         | j         d	œ|d
d¬¦  «         ddd¦  «         n# 1 swxY w Y   t          d|› �¦  «         dS # t          $ r}t          d|› �¦  «         Y d}~dS d}~ww xY w)z(Save the current conversation to a file.z(;_;) No conversation to save.Nre  Úhermes_conversation_rü  r  rj   rk   )rõ   r�  rÍ  r�  F)ÚindentÚensure_asciiz(^_^)v Conversation saved to: z(x_x) Failed to save: )r�  r¹  r   r  r”  rs   rt   Údumprõ   r�  Ú	isoformatrv   )r7  Ú	timestamprw  rx   rz   s        rK   Úsave_conversationzHermesCLI.save_conversationP  sf  € àÔ(ð 	ÝÐ2Ñ3Ô3Ð3ØˆFå”L‘N”N×+Ò+¨OÑ<Ô<ˆ	Ø:¨)Ð:Ð:Ð:ˆð		0Ý�h ¨gÐ6Ñ6Ô6ð 4¸!Ý”	Ø!œZØ%)Ô%7×%AÒ%AÑ%CÔ%CØ $Ô 9ðð ð ˜Q¨Uð	4ñ 4ô 4ð 4ð4ð 4ð 4ñ 4ô 4ð 4ð 4ð 4ð 4ð 4ð 4øøøð 4ð 4ð 4ð 4õ Ð=°8Ð=Ð=Ñ>Ô>Ð>Ð>Ð>øÝð 	0ð 	0ð 	0ÝÐ.¨1Ð.Ð.Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/øøøøð	0øøøs<   ÁC Á>B"ÂC Â"B&Â&C Â)B&Â*C Ã
C(ÃC#Ã#C(c                 óÐ  — | j         st          d¦  «         dS d}t          t          | j         ¦  «        dz
  dd¦  «        D ]*}| j         |                              d¦  «        dk    r|} nŒ+|€t          d¦  «         dS | j         |                              dd	¦  «        }| j         d|…         | _         t          d
|dd…         › t          |¦  «        dk    rdnd	› d�¦  «         |S )aB  Retry the last user message by removing the last exchange and re-sending.
        
        Removes the last assistant response (and any tool-call messages) and
        the last user message, then re-sends that user message to the agent.
        Returns the message to re-send, or None if there's nothing to retry.
        z(._.) No messages to retry.Nr  r  rF  rK  z%(._.) No user message found to retry.rN   r:   z(^_^)b Retrying: "rÂ   rÏ  r~  ©r�  r¹  r  r  rT   )r7  Úlast_user_idxr  Úlast_messages       rK   Ú
retry_lastzHermesCLI.retry_lastd  s  € ð Ô(ð 	ÝÐ/Ñ0Ô0Ð0Ø�4ð ˆÝ•s˜4Ô4Ñ5Ô5¸Ñ9¸2¸rÑBÔBð 	ð 	ˆAØÔ(¨Ô+×/Ò/°Ñ7Ô7¸6ÒAÐAØ !�Ø�ð Bð Ð ÝÐ9Ñ:Ô:Ð:Ø�4ð Ô0°Ô?×CÒCÀIÈrÑRÔRˆØ$(Ô$=¸n¸}¸nÔ$MˆÔ!åÐb L°°"°Ô$5ÐbÅÀLÑ@QÔ@QÐTVÒ@VÐ@V°u°uÐ\^ÐbÐbÐbÑcÔcÐcØÐrM   c           	      óR  — | j         st          d¦  «         dS d}t          t          | j         ¦  «        dz
  dd¦  «        D ]*}| j         |                              d¦  «        dk    r|} nŒ+|€t          d¦  «         dS t          | j         ¦  «        |z
  }| j         |                              dd	¦  «        }| j         d|…         | _         t          d
|› d|dd…         › t          |¦  «        dk    rdnd	› d�¦  «         t          | j         ¦  «        }t          d|› d�¦  «         dS )zâRemove the last user/assistant exchange from conversation history.
        
        Walks backwards and removes all messages from the last user message
        onward (including assistant responses, tool calls, etc.).
        z(._.) No messages to undo.Nr  r  rF  rK  z$(._.) No user message found to undo.rN   r:   z(^_^)b Undid z message(s). Removed: "rÂ   rÏ  r~  r8  z! message(s) remaining in history.r  )r7  r  r  Úremoved_countÚremoved_msgrí  s         rK   rÏ  zHermesCLI.undo_last�  s‰  € ð Ô(ð 	ÝÐ.Ñ/Ô/Ð/ØˆFð ˆÝ•s˜4Ô4Ñ5Ô5¸Ñ9¸2¸rÑBÔBð 	ð 	ˆAØÔ(¨Ô+×/Ò/°Ñ7Ô7¸6ÒAÐAØ !�Ø�ð Bð Ð ÝÐ8Ñ9Ô9Ð9ØˆFõ ˜DÔ5Ñ6Ô6¸ÑFˆØÔ/°Ô>×BÒBÀ9ÈbÑQÔQˆð %)Ô$=¸n¸}¸nÔ$MˆÔ!åð  B˜mð  Bð  BÀ[ÐQTÐRTÐQTÔEUð  BÕ`cÐdoÑ`pÔ`pÐsuÒ`uÐ`uÐW\ÐW\Ð{}ð  Bð  Bð  Bñ  	Cô  	Cð  	CÝ˜Ô1Ñ2Ô2ˆ	ÝÐ?�9Ð?Ð?Ð?Ñ@Ô@Ð@Ð@Ð@rM   r   rL  rB  Údefault_indexc                 ó¨  ‡‡‡‡	‡
— ddl }ddlmŠ	 dgŠ
ˆ	ˆˆˆ
ˆfd„} |j        ¦   «          |j        ¦   «         u }| j        r�|rddlm} | j        }d| _        | j         	                    ¦   «          	  ||¦  «         || _        | j         	                    ¦   «          n/# || _        | j         	                    ¦   «          w xY w |¦   «          ‰
d         S )zbRun curses_single_select via run_in_terminal so prompt_toolkit handles terminal ownership cleanly.r   N)Úcurses_single_selectc                  ó*   •—  ‰ ‰‰‰¬¦  «        ‰d<   d S )N)r  r   r]   )r  r  rB  r€   rL  s   €€€€€rK   Ú_pickz+HermesCLI._run_curses_picker.<locals>._pick¨  s"   ø€ Ø,Ð,¨U°EÈÐWÑWÔWˆF�1‰IˆIˆIrM   ©Úrun_in_terminalF)
r¥  Úhermes_cli.curses_uir  Úcurrent_threadÚmain_threadrŒ  r   r  r¾  rÕ  )r7  rL  rB  r  r¥  r  Úin_main_threadr  Úwas_visibler  r€   s    ```     @@rK   Ú_run_curses_pickerzHermesCLI._run_curses_picker¡  s:  øøøøø€ àÐÐÐØ=Ð=Ð=Ð=Ð=Ð=à�ˆð	Xð 	Xð 	Xð 	Xð 	Xð 	Xð 	Xð 	Xð 	Xð 2˜Ô1Ñ3Ô3Ð7L°yÔ7LÑ7NÔ7NÐNˆàŒ9ð 	˜ð 	ØBÐBÐBÐBÐBÐBØÔ2ˆKØ',ˆDÔ$ØŒI× Ò Ñ"Ô"Ð"ð'Ø� Ñ&Ô&Ð&à+6�Ô(Ø”	×$Ò$Ñ&Ô&Ð&Ð&øð ,7�Ô(Ø”	×$Ò$Ñ&Ô&Ð&Ð&øøøàˆE‰GŒGˆGà�aŒyÐs   Á1B Â"B?Úprompt_textc                 óH  ‡‡— dgŠˆˆfd„}| j         rddlm} | j        }d| _        | j                              ¦   «          	  ||¦  «         || _        | j                              ¦   «          n/# || _        | j                              ¦   «          w xY w |¦   «          ‰d         S )zCPrompt for free-text input safely inside or outside prompt_toolkit.Nc                  ó†   •— 	 t          ‰ ¦  «                             ¦   «         pd ‰d<   d S # t          t          f$ r Y d S w xY w)Nr   )ÚinputrG   ÚKeyboardInterruptÚEOFError)r"  r€   s   €€rK   Ú_askz*HermesCLI._prompt_text_input.<locals>._askÃ  sU   ø€ ðÝ! +Ñ.Ô.×4Ò4Ñ6Ô6Ð>¸$��q‘	�	�	øÝ%¥xÐ0ð ð ð Ø��ðøøøs   ƒ&+ «A ¿A r   r  F)rŒ  r   r  r¾  rÕ  )r7  r"  r(  r  r   r€   s    `   @rK   Ú_prompt_text_inputzHermesCLI._prompt_text_input¿  sÙ   øø€ à�ˆð	ð 	ð 	ð 	ð 	ð 	ð Œ9ð 	ØBÐBÐBÐBÐBÐBØÔ2ˆKØ',ˆDÔ$ØŒI× Ò Ñ"Ô"Ð"ð'Ø� Ñ%Ô%Ð%à+6�Ô(Ø”	×$Ò$Ñ&Ô&Ð&Ð&øð ,7�Ô(Ø”	×$Ò$Ñ&Ô&Ð&Ð&øøøàˆD‰FŒFˆFØ�aŒyÐs   ÁA- Á-"BÚ	providersrq  Úcurrent_providerc                 óÆ   — |                       ¦   «          t          d„ t          |¦  «        D ¦   «         d¦  «        }d||||||dœ| _        |                      d¬¦  «         dS )z/Open prompt_toolkit-native /model picker modal.c              3   óJ   K  — | ]\  }}|                      d ¦  «        ¯|V — ŒdS )Ú
is_currentNrª  )rW   r  r_   s      rK   r`   z/HermesCLI._open_model_picker.<locals>.<genexpr>Ú  s7   è è € ÐVÐV¡$ ! QÀ!Ç%Â%ÈÑBUÔBUÐV˜AÐVÐVÐVÐVÐVÐVrM   r   r¿   )Ústager*  Úselectedrq  r+  Ú
user_provsÚcustom_provsrb  r  N)Ú_capture_modal_input_snapshotÚnextr¼  r¨  rÖ  )r7  r*  rq  r+  r1  r2  Údefault_idxs          rK   Ú_open_model_pickerzHermesCLI._open_model_picker×  s~   € à×*Ò*Ñ,Ô,Ð,ÝÐVÐV­)°IÑ*>Ô*>ÐVÑVÔVÐXYÑZÔZˆàØ"Ø#Ø*Ø 0Ø$Ø(ð$
ð $
ˆÔ ð 	×Ò cÐÑ*Ô*Ð*Ð*Ð*rM   c                 óh   — d | _         |                      ¦   «          |                      d¬¦  «         d S )Nrb  r  )r¨  Ú_restore_modal_input_snapshotrÖ  rG  s    rK   Ú_close_model_pickerzHermesCLI._close_model_pickeræ  s9   € Ø#'ˆÔ Ø×*Ò*Ñ,Ô,Ð,Ø×Ò cÐÑ*Ô*Ð*Ð*Ð*rM   rf  rý  r0  Úscroll_offsetr  Ú	term_rowsÚreserved_belowÚpanel_chromeÚmin_visiblec                 óÄ   — t          |||z
  |z
  ¦  «        }||k    rd|fS |}| |k     r| }n| ||z   k    r| |z
  dz   }t          dt          |||z
  ¦  «        ¦  «        }||fS )u‡  Resolve (scroll_offset, visible) for the /model picker viewport.

        ``reserved_below`` matches the approval / clarify panels â€” input area,
        status bar, and separators below the panel. ``panel_chrome`` covers
        this panel's own borders + blanks + hint row. The remaining rows hold
        the scrollable list, with the offset slid to keep ``selected`` on screen.
        r   r  )rÐ  r  )	r0  r:  r  r;  r<  r=  r>  Úmax_visibleÚvisibles	            rK   Ú_compute_model_picker_viewportz(HermesCLI._compute_model_picker_viewportë  s�   € õ" ˜+ y°>Ñ'AÀLÑ'PÑQÔQˆØ�ÒÐØ�a�4ˆKØˆØ�mÒ#Ð#Ø$ˆMˆMØ˜¨Ñ0Ò0Ð0Ø$ wÑ.°Ñ2ˆMÝ˜A�s =°!°g±+Ñ>Ô>Ñ?Ô?ˆØ˜gÐ%Ð%rM   Úpersist_globalc                 ó  — |j         st          d|j        › �¦  «         d S | j        }|j        | _        |j        | _        |j        | _        |j        r|j        | _        |j        | _	        |j
        r|j
        | _
        |j
        | _        |j        r|j        | _        | j        �d	 | j                             |j        |j        |j        |j
        |j        ¬¦  «         n*# t          $ r}t          d|› d�¦  «         Y d }~nd }~ww xY wd|› d|j        › d|j        p|j        › d�| _        |j        p|j        }t          d	|j        › �¦  «         t          d
|› �¦  «         |j        }	 ddlm}  ||j        |j        |j
        p| j
        pd|j        p| j        pd|¬¦  «        }|rt          d|d›d�¦  «         n# t          $ r Y nw xY w|r||j        rt          d|j        d›d�¦  «         |                     ¦   «         r$t          d|                     ¦   «         › �¦  «         t          d|                     ¦   «         › �¦  «         t3          |j
        pdd¦  «        rd|j                             ¦   «         v p
|j        dk    }	|	rt          d¦  «         |j        rt          d|j        › �¦  «         |rBt9          d|j        ¦  «         |j        rt9          d|j        ¦  «         t          d¦  «         d S t          d¦  «         d S )Nõ     âœ— ©Ú	new_modelÚnew_providerrö   r¾   r{  õ     âš  Agent swap failed (ú"); change applied to next session.ú$[Note: model was just switched from ú to ú via ú/. Adjust your self-identification accordingly.]õ     âœ“ Model switched: ú    Provider: r   ©Úresolve_display_context_lengthr:   ©r¾   rö   Ú
model_infoú    Context: r'  ú tokensú    Max output: ú
    Cost: ú    Capabilities: rK  ÚclaudeÚanthropic_messagesú    Prompt caching: enabledõ       âš  úmodel.defaultúmodel.providerú#    Saved to config.yaml (--global)õ.       (session only â€” add --global to persist))rÇ  rj  Úerror_messagerõ   rG  Útarget_providerr¿   ry  rö   rw  r¾   rx  r{  rþ   Úswitch_modelrv   Úprovider_labelÚ_pending_model_switch_noterT  rƒ  rR  Ú
max_outputÚhas_cost_dataÚformat_costÚformat_capabilitiesr.   rŒ   Úwarning_messager3  Úprovider_changed)
r7  r€   rC  Ú	old_modelrø  re  ÚmirR  ÚctxÚcache_enableds
             rK   Ú_apply_model_switch_resultz$HermesCLI._apply_model_switch_result  sæ  € ØŒ~ð 	ÝÐ3˜VÔ1Ð3Ð3Ñ4Ô4Ð4ØˆFà”Jˆ	ØÔ%ˆŒ
ØÔ.ˆŒØ"(Ô"8ˆÔØŒ>ð 	4Ø!œ>ˆDŒLØ%+¤^ˆDÔ"ØŒ?ð 	6Ø"œOˆDŒMØ&,¤oˆDÔ#ØŒ?ð 	,Ø"œOˆDŒMàŒ:Ð!ð	]Ø”
×'Ò'Ø$Ô.Ø!'Ô!7Ø"œNØ#œ_Ø#œ_ð (ñ ô ð ð øõ ð ]ð ]ð ]ÝÐ[°CÐ[Ð[Ð[Ñ\Ô\Ð\Ð\Ð\Ð\Ð\Ð\øøøøð]øøøð=°9ð =ð =À&ÔBRð =ð =ØÔ(ÐB¨FÔ,Bð=ð =ð =ð 	Ô'ð  Ô.ÐH°&Ô2HˆÝÐ;¨Ô)9Ð;Ð;Ñ<Ô<Ð<ÝÐ1 Ð1Ð1Ñ2Ô2Ð2ð
 Ôˆð	ØNÐNÐNÐNÐNÐNØ0Ð0ØÔ ØÔ&ØœÐ?¨D¬MÐ?¸RØœÐ<¨$¬,Ð<¸"Øðñ ô ˆCð ð 8ÝÐ6¨Ð6Ð6Ð6Ð6Ñ7Ô7Ð7øøÝð 	ð 	ð 	ØˆDð	øøøàð 	EØŒ}ð EÝÐC¨2¬=ÐCÐCÐCÐCÑDÔDÐDØ×ÒÑ!Ô!ð 9ÝÐ7 R§^¢^Ñ%5Ô%5Ð7Ð7Ñ8Ô8Ð8ÝÐC¨×)?Ò)?Ñ)AÔ)AÐCÐCÑDÔDÐDõ # 6¤?Ð#8°b¸/ÑJÔJÐsÈxÐ[aÔ[k×[qÒ[qÑ[sÔ[sÐOsð 7ØŒÐ"6Ò6ð 	ð ð 	3ÝÐ1Ñ2Ô2Ð2ØÔ!ð 	9ÝÐ7˜vÔ5Ð7Ð7Ñ8Ô8Ð8Øð 	FÝ˜o¨vÔ/?Ñ@Ô@Ð@ØÔ&ð LÝ!Ð"2°FÔ4JÑKÔKÐKÝÐ9Ñ:Ô:Ð:Ð:Ð:åÐDÑEÔEÐEÐEÐEs+   Â%8C Ã
DÃ(D Ä DÅ)AF< Æ<
G	ÇG	c                 ó6  ‡— | j         }|sd S |                     dd¦  «        }|                     d¦  «        }|dk    r¹|                     d¦  «        pg }|t          |¦  «        k    r|                      ¦   «          d S ||         Š‰                     dg ¦  «        }|s-	 ddlm}  |‰d         ¦  «        }|r|}n# t          $ r Y nw xY wd	|d<   ‰|d
<   ||d<   d|d<   |                      d¬¦  «         d S |d	k    �r›|                     d
¦  «        pi Š|                     d¦  «        pg }t          |¦  «        }	t          |¦  «        dz   }
||	k    r^d|d<   t          ˆfd„t          |                     d¦  «        pg ¦  «        D ¦   «         d¦  «        |d<   |                      d¬¦  «         d S ||
k    r|                      ¦   «          d S |t          |¦  «        k     r£ddl
m} ||         } ||| j        pd| j        pd| j        pd| j        pd|‰                     d¦  «        |                     d¦  «        |                     d¦  «        ¬¦	  «	        }|                      ¦   «          |                      ||¦  «         d S |                      ¦   «          d S d S )Nr0  r   r/  r¿   r*  Úmodels)Úprovider_model_idsrv  rõ   Úprovider_dataÚ
model_listrb  r  r  c              3   óz   •K  — | ]5\  }}|                      d ¦  «        ‰                      d ¦  «        k    ¯1|V — Œ6dS )rv  Nrª  )rW   r  r_   ru  s      €rK   r`   z;HermesCLI._handle_model_picker_selection.<locals>.<genexpr>}  s�   øè è € ð  *Oð  *O±°°1Ðcd×chÒchÐioÑcpÔcpð  uB÷  uFò  uFð  GMñ  uNô  uNò  dNð  dN¨!ð  dNð  dNð  dNð  dNð  *Oð  *OrM   )rd  r:   r1  r2  ©	Ú	raw_inputr+  rq  Úcurrent_base_urlÚcurrent_api_keyÚ	is_globalÚexplicit_providerÚuser_providersÚcustom_providers)r¨  rT   r  r9  ro  rt  rv   rÖ  r4  r¼  rƒ  rd  r¿   rõ   r¾   rö   rq  )r7  rC  Ústater0  r/  r*  rv  rt  ræ  Úback_idxÚ
cancel_idxrd  Úchosen_modelr€   ru  s                 @rK   Ú_handle_model_picker_selectionz(HermesCLI._handle_model_picker_selectionW  sA  ø€ ØÔ(ˆØð 	ØˆFØ—9’9˜Z¨Ñ+Ô+ˆØ—	’	˜'Ñ"Ô"ˆØ�JÒÐØŸ	š	 +Ñ.Ô.Ð4°"ˆIØ�3˜y™>œ>Ò)Ð)Ø×(Ò(Ñ*Ô*Ð*Ø�Ø% hÔ/ˆMð
 '×*Ò*¨8°RÑ8Ô8ˆJØð ðØDÐDÐDÐDÐDÐDØ-Ð-¨m¸FÔ.CÑDÔD�DØð *Ø%)˜
øøÝ ð ð ð Ø�Dðøøøà$ˆE�'‰NØ%2ˆE�/Ñ"Ø",ˆE�,ÑØ !ˆE�*ÑØ×Ò¨#ÐÑ.Ô.Ð.ØˆFØ�GÒÑØ!ŸIšI oÑ6Ô6Ð<¸"ˆMØŸš <Ñ0Ô0Ð6°BˆJÝ˜:‘”ˆHÝ˜Z™œ¨1Ñ,ˆJØ˜8Ò#Ð#Ø!+��g‘Ý$(ð  *Oð  *Oð  *Oð  *O½	À%Ç)Â)ÈKÑBXÔBXÐB^Ð\^Ñ8_Ô8_ð  *Oñ  *Oô  *Oð  QRñ  %Sô  %S��jÑ!Ø× Ò ¨cÐ Ñ2Ô2Ð2Ø�Ø˜:Ò%Ð%Ø×(Ò(Ñ*Ô*Ð*Ø�Ø�#˜j™/œ/Ò)Ð)Ø@Ð@Ð@Ð@Ð@Ð@Ø)¨(Ô3�Ø%˜Ø*Ø%)¤]Ð%8°bØ"&¤*Ð"2°Ø%)¤]Ð%8°bØ$(¤LÐ$6°BØ,Ø&3×&7Ò&7¸Ñ&?Ô&?Ø#(§9¢9¨\Ñ#:Ô#:Ø%*§Y¢Y¨~Ñ%>Ô%>ð
ñ 
ô 
�ð ×(Ò(Ñ*Ô*Ð*Ø×/Ò/°¸ÑGÔGÐGØ�Ø×$Ò$Ñ&Ô&Ð&Ð&Ð&ð= Ðs   ÂB; Â;
CÃCc                 ó	  — ddl m}m}m} ddlm} |                     dd¦  «        }t          |¦  «        dk    r|d                              ¦   «         nd} ||¦  «        \  }}	}
d}d}	 ddl	m
}m}  |¦   «         }|                     d¦  «        } ||¦  «        }n# t          $ r Y nw xY w|sª|	s¨| j        pd	}| j        r || j        ¦  «        nd	}	  || j        pd||d
¬¦  «        }n# t          $ r g }Y nw xY w|s>t!          d¦  «         t!          d¦  «         t!          d¦  «         t!          d¦  «         dS |                      |||||¬¦  «         dS  ||| j        pd| j        pd| j        pd| j        pd|
|	||¬¦	  «	        }|j        st!          d|j        › �¦  «         dS | j        }|j        | _        |j        | _        |j        | _        |j        r|j        | _        |j        | _        |j        r|j        | _        |j        | _        |j        r|j        | _        | j        �d	 | j                             |j        |j        |j        |j        |j        ¬¦  «         n*# t          $ r}t!          d|› d�¦  «         Y d}~nd}~ww xY wd|› d|j        › d|j        p|j        › d�| _        |j        p|j        }t!          d|j        › �¦  «         t!          d|› �¦  «         |j        }ddl m }  ||j        |j        |j        p| j        pd|j        p| j        pd|¬¦  «        }|rt!          d|d›d�¦  «         |r||j!        rt!          d |j!        d›d�¦  «         | "                    ¦   «         r$t!          d!| #                    ¦   «         › �¦  «         t!          d"| $                    ¦   «         › �¦  «         tK          |j        pdd#¦  «        rd$|j         &                    ¦   «         v p
|j        d%k    }|rt!          d&¦  «         |j'        rt!          d'|j'        › �¦  «         |
rBtQ          d(|j        ¦  «         |j)        rtQ          d)|j        ¦  «         t!          d*¦  «         dS t!          d+¦  «         dS ),uì  Handle /model command â€” switch model for this session.

        Supports:
          /model                              â€” show current model + usage hints
          /model <name>                       â€” switch for this session only
          /model <name> --global              â€” switch and persist to config.yaml
          /model <name> --provider <provider> â€” switch provider + model
          /model --provider <provider>        â€” switch to provider, auto-detect model
        r   )rd  Úparse_model_flagsÚlist_authenticated_providers)Ú	get_labelNr  r:   )Úget_compatible_custom_providersrë  r*  rŸ  ró   )r+  r~  r  Ú
max_modelsz#  No authenticated providers found.z3  /model <name>                        switch modelz6  /model --provider <slug>             switch provider)r1  r2  rx  rE  rF  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rS  rU  r'  rV  rW  rX  rY  rK  rZ  r[  r\  r]  r^  r_  r`  ra  )*rƒ  rd  r†  r‡  Úhermes_cli.providersrˆ  r  r  rG   r>  r‰  rë  rT   rv   rõ   r¿   rj  r6  r¾   rö   rÇ  rb  rG  rc  ry  rw  rx  r{  rþ   re  rf  rT  rR  rg  rh  ri  rj  r.   rŒ   rk  r3  rl  )r7  r   rd  r†  r‡  rˆ  rc   r(  Úmodel_inputr}  rC  r1  r2  r‰  rë  r÷  Úmodel_displayÚprovider_displayr*  r€   rm  rø  re  rn  rR  ro  rp  s                              rK   Ú_handle_model_switchzHermesCLI._handle_model_switch–  s(  € ð 	jÐiÐiÐiÐiÐiÐiÐiÐiÐiØ2Ð2Ð2Ð2Ð2Ð2ð ×"Ò" 4¨Ñ+Ô+ˆÝ'*¨5¡z¤z°A¢~ ~�5˜”8—>’>Ñ#Ô#Ð#¸2ˆð :KÐ9JÈ8Ñ9TÔ9TÑ6ˆÐ&¨ð ˆ
Øˆð	ØVÐVÐVÐVÐVÐVÐVÐVØ�+‘-”-ˆCØŸš Ñ-Ô-ˆJØ:Ð:¸3Ñ?Ô?ˆLˆLøÝð 	ð 	ð 	ØˆDð	øøøð ð 	Ð#4ð 	Ø œJÐ3¨)ˆMØ;?¼=ÐW˜y˜y¨¬Ñ7Ô7Ð7ÈiÐðØ8Ð8Ø%)¤]Ð%8°bØ#-Ø%1Ø!ð	ñ ô �	�	øõ ð ð ð Ø�	�	�	ðøøøð ð ÝÐ=Ñ>Ô>Ð>Ý˜‘”�ÝÐMÑNÔNÐNÝÐPÑQÔQÐQØ�à×#Ò#ØØØ Ø%Ø)ð $ñ ô ð ð ˆFð �Ø!Ø!œ]Ð0¨bØœ*Ð*¨Ø!œ]Ð0¨bØ œLÐ.¨BØ$Ø/Ø%Ø)ð

ñ 

ô 

ˆð Œ~ð 	ÝÐ3˜VÔ1Ð3Ð3Ñ4Ô4Ð4ØˆFð
 ”Jˆ	ØÔ%ˆŒ
ØÔ.ˆŒØ"(Ô"8ˆÔØŒ>ð 	4Ø!œ>ˆDŒLØ%+¤^ˆDÔ"ØŒ?ð 	6Ø"œOˆDŒMØ&,¤oˆDÔ#ØŒ?ð 	,Ø"œOˆDŒMð Œ:Ð!ð	]Ø”
×'Ò'Ø$Ô.Ø!'Ô!7Ø"œNØ#œ_Ø#œ_ð (ñ ô ð ð øõ ð ]ð ]ð ]ÝÐ[°CÐ[Ð[Ð[Ñ\Ô\Ð\Ð\Ð\Ð\Ð\Ð\øøøøð]øøøð=°9ð =ð =À&ÔBRð =ð =ØÔ(ÐB¨FÔ,Bð=ð =ð =ð 	Ô'ð  Ô.ÐH°&Ô2HˆÝÐ;¨Ô)9Ð;Ð;Ñ<Ô<Ð<ÝÐ1 Ð1Ð1Ñ2Ô2Ð2ð
 ÔˆØJÐJÐJÐJÐJÐJØ,Ð,ØÔØÔ"Ø”_Ð;¨¬Ð;¸Ø”NÐ8 d¤lÐ8°bØð
ñ 
ô 
ˆð ð 	4ÝÐ2 CÐ2Ð2Ð2Ð2Ñ3Ô3Ð3Øð 	EØŒ}ð EÝÐC¨2¬=ÐCÐCÐCÐCÑDÔDÐDØ×ÒÑ!Ô!ð 9ÝÐ7 R§^¢^Ñ%5Ô%5Ð7Ð7Ñ8Ô8Ð8ÝÐC¨×)?Ò)?Ñ)AÔ)AÐCÐCÑDÔDÐDõ # 6¤?Ð#8°b¸/ÑJÔJÐsÈxÐ[aÔ[k×[qÒ[qÑ[sÔ[sÐOsð 7ØŒÐ"6Ò6ð 	ð ð 	3ÝÐ1Ñ2Ô2Ð2ð Ô!ð 	9ÝÐ7˜vÔ5Ð7Ð7Ñ8Ô8Ð8ð ð 	FÝ˜o¨vÔ/?Ñ@Ô@Ð@ØÔ&ð LÝ!Ð"2°FÔ4JÑKÔKÐKÝÐ9Ñ:Ô:Ð:Ð:Ð:åÐDÑEÔEÐEÐEÐEs<   Á*2B Â
B*Â)B*ÃC+ Ã+C:Ã9C:È-8I& É&
JÉ0JÊJÚ
has_imagesc                 ó(  — |r|st          |¦  «        sdS 	 ddlm} |                     dd¦  «        d                              ¦   «                              d¦  «        } ||¦  «        }t          |o
|j        dk    ¦  «        S # t          $ r Y dS w xY w)zGReturn True when /model should be handled immediately on the UI thread.Fr   ©Úresolve_commandNr  r�  rõ   )	r  rs  r“  r  rŒ   r›  ræ  r    rv   ©r7  r6   r�  r“  r·   r
  s         rK   Ú#_should_handle_model_command_inlinez-HermesCLI._should_handle_model_command_inline:  sº   € àð 	�zð 	Õ)BÀ4Ñ)HÔ)Hð 	Ø�5ð	Ø;Ð;Ð;Ð;Ð;Ð;Ø—:’:˜d AÑ&Ô& qÔ)×/Ò/Ñ1Ô1×8Ò8¸Ñ=Ô=ˆDØ!�/ $Ñ'Ô'ˆCÝ˜Ð3 ¤¨GÒ 3Ñ4Ô4Ð4øÝð 	ð 	ð 	Ø�5�5ð	øøøs   —A+B Â
BÂBc                 óN  — |r|st          |¦  «        sdS t          | dd¦  «        sdS 	 ddlm} |                     dd¦  «        d                              ¦   «                              d¦  «        } ||¦  «        }t          |o
|j        dk    ¦  «        S # t          $ r Y dS w xY w)	u¯  Return True when /steer should be dispatched immediately while the agent is running.

        /steer MUST bypass the normal _pending_input â†’ process_loop path when
        the agent is active, because process_loop is blocked inside
        self.chat() for the duration of the run.  By the time the queued
        command is pulled from _pending_input, _agent_running has already
        flipped back to False, and process_command() takes the idle
        fallback â€” delivering the steer as a next-turn message instead of
        injecting it mid-run.  Dispatching inline on the UI thread calls
        agent.steer() directly, which is thread-safe (uses _pending_steer_lock).
        Fr—  r   r’  Nr  r�  Ústeer)
r  r–  rs  r“  r  rŒ   r›  ræ  r    rv   r”  s         rK   Ú#_should_handle_steer_command_inlinez-HermesCLI._should_handle_steer_command_inlineF  sÖ   € ð ð 	�zð 	Õ)BÀ4Ñ)HÔ)Hð 	Ø�5Ý�tÐ-¨uÑ5Ô5ð 	Ø�5ð	Ø;Ð;Ð;Ð;Ð;Ð;Ø—:’:˜d AÑ&Ô& qÔ)×/Ò/Ñ1Ô1×8Ò8¸Ñ=Ô=ˆDØ!�/ $Ñ'Ô'ˆCÝ˜Ð3 ¤¨GÒ 3Ñ4Ô4Ð4øÝð 	ð 	ð 	Ø�5�5ð	øøøs   ªA+B Â
B$Â#B$c                 óN   — t          | dd¦  «        rt          ¦   «         S | j        S )z<Use prompt_toolkit-safe Rich rendering once the TUI is live.rŒ  N)r–  ré  rh  rG  s    rK   Ú_output_consolezHermesCLI._output_console^  s(   € å�4˜ Ñ&Ô&ð 	!Ý‘=”=Ð ØŒ|ÐrM   c                 óD   —  |                       ¦   «         j        |i |¤Ž dS )z.Print through the active command-safe console.N)rš  r¹  )r7  rø  rù  s      rK   r  zHermesCLI._console_printd  s,   € à$ˆ×ÒÑÔÔ$ dÐ5¨fÐ5Ð5Ð5Ð5Ð5rM   c                 ó‚  — t          | t          ¦  «        rœ|                      dd¦  «        g}|                      d¦  «        r|                     d| d         › �¦  «         |                      d¦  «        r|                     d| d         › �¦  «         d                     d„ |D ¦   «         ¦  «        S t          | ¦  «        S )	zEAccept string or dict personality value; return system prompt string.ræ   r:   ÚtonezTone: r�  zStyle: rZ   c              3   ó   K  — | ]}|¯|V — Œ	d S r\   r]   r^   s     rK   r`   z8HermesCLI._resolve_personality_prompt.<locals>.<genexpr>q  s'   è è € Ð3Ð3 1°Ð3˜QÐ3Ð3Ð3Ð3Ð3Ð3rM   )rR   rS   rT   r–   rb   rU   )r�   rc   s     rK   Ú_resolve_personality_promptz%HermesCLI._resolve_personality_prompth  s¿   € õ �e�TÑ"Ô"ð 	4Ø—Y’Y˜°Ñ3Ô3Ð4ˆEØ�yŠy˜Ñ Ô ð 8Ø—’Ð5 e¨F¤mÐ5Ð5Ñ7Ô7Ð7Ø�yŠy˜Ñ!Ô!ð :Ø—’Ð7 u¨W¤~Ð7Ð7Ñ9Ô9Ð9Ø—9’9Ð3Ð3¨Ð3Ñ3Ô3Ñ3Ô3Ð3Ý�5‰zŒzÐrM   c           	      ó*  — 	 ddl m}m}m} ddlm}m} n1# t          $ r$}|                      d|› d�¦  «         Y d}~dS d}~ww xY w	  |¦   «         }nA# |$ r9}|                      d|› d�¦  «         |                      d¦  «         Y d}~dS d}~ww xY w |¦   «         }	|	r|	j	        nd	pd	}
	  |||
¬
¦  «        }n+# |$ r#}|                      d|› �¦  «         Y d}~dS d}~ww xY w|s|                      d¦  «         dS | 
                    d„ ¬¦  «         |                      ¦   «          |                      d|
pd› d�¦  «         |                      ¦   «          |D ]¥}t          dt          d|j        ¦  «        ¦  «        }d}t          t          ||z  ¦  «        ¦  «        }d|z  d||z
  z  z   }t          |dz  ¦  «        d›d�}|j        }|j        r|d|j        › d�z  }|                      d|d›d|› d|› �¦  «         Œ¦|                      ¦   «          dS )zIShow Google Gemini Code Assist quota usage for the current OAuth account.r   )Úget_valid_access_tokenÚGoogleOAuthErrorÚload_credentials)Úretrieve_user_quotaÚCodeAssistErrorz#  [red]Gemini modules unavailable: rU  Nz
  [yellow]zB  Run [bold]/model[/] and pick 'Google Gemini (OAuth)' to sign in.r:   )Ú
project_idz  [red]Quota lookup failed:[/] zN  [dim]No quota buckets reported (account may be on legacy/unmetered tier).[/]c                 ó   — | j         | j        fS r\   )Úmodel_idÚ
token_type)r  s    rK   r€  z2HermesCLI._handle_gquota_command.<locals>.<lambda>’  s   €  A¤J°´Ð#=€ rM   r�  z/  [bold]Gemini Code Assist quota[/]  (project: z(auto / free-tier)r:  rb  ç      ð?rÓ  u   â–“rß  rÝ  Ú3drG  rM  r£  r  Ú40sr8  )Úagent.google_oauthr¡  r¢  r£  Úagent.google_code_assistr¤  r¥  ÚImportErrorr  r¦  rZ  rÐ  r  Úremaining_fractionrô  rà  r¨  r©  )r7  r   r¡  r¢  r£  r¤  r¥  rø  rm  Úcredsr¦  Úbucketsr  ÚpctrÉ  râ  r  Úpct_strrw  s                      rK   Ú_handle_gquota_commandz HermesCLI._handle_gquota_commandt  s  € ð	ØeÐeÐeÐeÐeÐeÐeÐeÐeÐeØUÐUÐUÐUÐUÐUÐUÐUÐUøÝð 	ð 	ð 	Ø×ÒÐ NÀcÐ NÐ NÐ NÑOÔOÐOØˆFˆFˆFˆFˆFøøøøð	øøøð	Ø1Ð1Ñ3Ô3ˆLˆLøØð 	ð 	ð 	Ø×ÒÐ 5¨SÐ 5Ð 5Ð 5Ñ6Ô6Ð6Ø×ÒÐ dÑeÔeÐeØˆFˆFˆFˆFˆFøøøøð	øøøð
 !Ð Ñ"Ô"ˆØ*/Ð7�eÔ&Ð&°RÐ>¸Bˆ
ð	Ø)Ð)¨,À:ÐNÑNÔNˆGˆGøØð 	ð 	ð 	Ø×ÒÐ GÀ#Ð GÐ GÑHÔHÐHØˆFˆFˆFˆFˆFøøøøð	øøøð ð 	Ø×ÒÐ pÑqÔqÐqØˆFð 	�ŠÐ=Ð=ˆÑ>Ô>Ð>Ø×ÒÑÔÐØ×ÒÐsÈjÐNpÐ\pÐsÐsÐsÑtÔtÐtØ×ÒÑÔÐØð 		Gð 		GˆAÝ�c�3˜s AÔ$8Ñ9Ô9Ñ:Ô:ˆCØˆEÝ�˜s U™{Ñ+Ô+Ñ,Ô,ˆFØ˜&‘. 5¨E°F©NÑ#;Ñ;ˆCÝ˜S 3™Y™œÐ-Ð-Ð-Ð-ˆGØ”ZˆFØŒ|ð /ØÐ.˜qœ|Ð.Ð.Ð.Ñ.�Ø×ÒÐ E vÐ EÐ EÐ E°SÐ EÐ E¸GÐ EÐ EÑFÔFÐFÐFØ×ÒÑÔÐÐÐsB   ‚ •
AŸ>¾AÁ
A ÁBÁ.BÂBÂ+B9 Â9C!Â>CÃC!c                 óŽ  — |                      d¬¦  «        }t          |¦  «        dk    �r}|d                              ¦   «                              ¦   «         }|dv rNd| _        d| _        t          dd¦  «        rt          d¦  «         nt          d¦  «         t          d	¦  «         dS || j        v r¦|  	                    | j        |         ¦  «        | _        d| _        t          d| j        ¦  «        rt          d
|› d�¦  «         nt          d|› d�¦  «         t          d| j        dd…         › t          | j        ¦  «        dk    rdnd› d�¦  «         dS t          d|› �¦  «         t          dd 
                    | j                             ¦   «         ¦  «        › �¦  «         dS t          ¦   «          t          d¦  «         t          d¦  «         t          d¦  «         t          ¦   «          t          ddd›d�¦  «         | j                             ¦   «         D ]{\  }}t          |t          ¦  «        r4|                     d¦  «        p|                     dd¦  «        dd…         }nt!          |¦  «        dd…         }t          d|d›d|› �¦  «         Œ|t          ¦   «          t          d¦  «         t          ¦   «          dS ) z@Handle the /personality command to set predefined personalities.r  r"  )r…   r‡   Úneutralr:   Nzagent.system_promptz,(^_^)b Personality cleared (saved to config)z((^_^) Personality cleared (session only)u7     No personality overlay â€” using base agent behavior.z(^_^)b Personality set to 'ú' (saved to config)z(^_^) Personality set to 'ú' (session only)z  "rÂ   rÏ  r~  z(._.) Unknown personality: z  Available: none, rT  rÐ  z1|            (^o^)/ Personalities               |r8  r…   ú<12z - (no personality overlay)r=  ræ   ró   rƒ  z  Usage: /personality <name>)r  r  rG   rŒ   ræ   rþ   r3  r¹  rê   rŸ  rb   r   rB  rR   rS   rT   rU   )r7  r
  rc   Úpersonality_namer    Úpromptr”  s          rK   Ú_handle_personality_commandz%HermesCLI._handle_personality_command¢  sì  € à—	’	 1�	Ñ%Ô%ˆåˆu‰:Œ:˜Š>‰>à$ QœxŸ~š~Ñ/Ô/×5Ò5Ñ7Ô7ÐàÐ#AÐAÐAØ%'�Ô"Ø!�”
Ý$Ð%:¸BÑ?Ô?ð FÝÐHÑIÔIÐIÐIåÐDÑEÔEÐEÝÐOÑPÔPÐPÐPÐPØ! TÔ%7Ð7Ð7Ø%)×%EÒ%EÀdÔFXÐYiÔFjÑ%kÔ%k�Ô"Ø!�”
Ý$Ð%:¸DÔ<NÑOÔOð [ÝÐ]Ð8HÐ]Ð]Ð]Ñ^Ô^Ð^Ð^åÐYÐ7GÐYÐYÐYÑZÔZÐZÝÐg˜TÔ/°°°Ô4Ðg½sÀ4ÔCUÑ?VÔ?VÐY[Ò?[Ð?[°e°eÐacÐgÐgÐgÑhÔhÐhÐhÐhåÐFÐ4DÐFÐFÑGÔGÐGÝÐR¨D¯IªI°dÔ6H×6MÒ6MÑ6OÔ6OÑ,PÔ,PÐRÐRÑSÔSÐSÐSÐSõ ‰GŒGˆGÝÐ&Ñ'Ô'Ð'ÝÐJÑKÔKÐKÝÐ&Ñ'Ô'Ð'Ý‰GŒGˆGÝÐ>�vÐ>Ð>Ð>Ð>Ñ?Ô?Ð?Ø $Ô 2× 8Ò 8Ñ :Ô :ð 3ð 3‘��fÝ˜f¥dÑ+Ô+ð /Ø$Ÿjšj¨Ñ7Ô7Ð_¸6¿:º:ÀoÐWYÑ;ZÔ;ZÐ[^Ð\^Ð[^Ô;_�G�Gå! &™kœk¨#¨2¨#Ô.�GÝÐ1˜4Ð1Ð1Ð1¨Ð1Ð1Ñ2Ô2Ð2Ð2Ý‰GŒGˆGÝÐ0Ñ1Ô1Ð1Ý‰GŒGˆGˆGˆGrM   c           
      óÐ  ‡‡— ddl }ddlmŠ ˆfd„}d„ }d„ }|                     |¦  «        }t	          |¦  «        dk    �rat          ¦   «          t          d¦  «         t          d	¦  «         t          d¦  «         t          ¦   «          t          d
¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «         t          ¦   «           |d¬¦  «        }|                     d¦  «        r|                     dg ¦  «        ng }|�r
t          d¦  «         t          d¦  «         |D ]è}	|	                     dd¦  «        }
t          d|	d         dd…         d ›d!|	d"         d#›d!|
d$›�¦  «         |	                     d%¦  «        r+t          d&d'                     |	d%         ¦  «        › �¦  «         t          d(|	                     d)d*¦  «        › �¦  «         |	                     d+¦  «        rt          d,|	d+         › �¦  «         t          ¦   «          Œént          d-¦  «         t          ¦   «          dS |d                              ¦   «         } ||d.d…         ¦  «        }|€dS |dk    �rí |d|d/         ¬0¦  «        }|                     d¦  «        r|                     dg ¦  «        ng }|st          d1¦  «         dS t          ¦   «          t          d2¦  «         t          d3¦  «         |D �]h}	t          d4|	d         › �¦  «         t          d5|	d6         › �¦  «         t          d7|	                     d8d¦  «        › �¦  «         t          d9|	d"         › d:|	                     dd¦  «        › d;�¦  «         t          d<|	                     d+d=¦  «        › �¦  «         |	                     d%¦  «        r+t          d>d'                     |	d%         ¦  «        › �¦  «         t          d?|	                     d)d*¦  «        › �¦  «         |	                     d@¦  «        r0t          dA|	d@         › d:|	                     dBd¦  «        › d;�¦  «         t          ¦   «          �ŒjdS |dCv �rc|dD         }|st          dE¦  «         dS |d"         p|d         }|dF         pdG                     |dd…         ¦  «        } ||d%         ¦  «        }|s|st          dH¦  «         dS  |dI||pd|d6         |dJ         |d         |pd¬K¦  «        }|                     d¦  «        r‰t          dL|d         › �¦  «         t          d9|d"         › �¦  «         |                     d%¦  «        r+t          d>d'                     |d%         ¦  «        › �¦  «         t          d<|d+         › �¦  «         n%t          dM|                     dN¦  «        › �¦  «         dS |dOk    �r|dD         }|st          dP¦  «         dS |d         }t          |¦  «        }|st          dQ|› �¦  «         dS d} ||d%         ¦  «        } ||dR         ¦  «        }t           ||dS         ¦  «        ¦  «        Št          |                     d%¦  «        p,|                     dT¦  «        sg n|                     dT¦  «        g¦  «        }|dU         rg }n5|r|}n0|s‰r,ˆfdV„|D ¦   «         }|D ]}||vr|                     |¦  «         Œ |dW||d"         |dF         |d6         |dJ         |d         |¬X¦  «        }|                     d¦  «        r‰|dY         }	t          dZ|	d         › �¦  «         t          d9|	d"         › �¦  «         |	                     d%¦  «        r,t          d>d'                     |	d%         ¦  «        › �¦  «         n5t          d[¦  «         n%t          d\|                     dN¦  «        › �¦  «         dS |d]v �r{|dD         }|st          d^|› d_�¦  «         dS |d         }|d`v rdan|} ||||dbk    rdcnd¬d¦  «        }|                     d¦  «        s*t          de|› df|                     dN¦  «        › �¦  «         dS |dbk    r#t          dg|dY         d6         › d:|› d;�¦  «         nÌ|dhk    rNt          di|dY         d6         › d:|› d;�¦  «         t          d<|dY                              d+¦  «        › �¦  «         nx|djk    r2t          dk|dY         d6         › d:|› d;�¦  «         t          dl¦  «         n@|                     dmi ¦  «        }t          dn|                     d6|¦  «        › d:|› d;�¦  «         dS t          do|› �¦  «         t          dp¦  «         dS )qz3Handle the /cron command to manage scheduled tasks.r   N)Úcronjobc                  ó8   •— t          j         ‰di | ¤Ž¦  «        S )Nr]   )rt   r7  )rù  Úcronjob_tools    €rK   Ú	_cron_apiz1HermesCLI._handle_cron_command.<locals>._cron_apiÔ  s#   ø€ Ý”:˜l˜lÐ4Ð4¨VÐ4Ð4Ñ5Ô5Ð5rM   c                 ó�   — g }| D ]@}t          |pd¦  «                             ¦   «         }|r||vr|                     |¦  «         ŒA|S ©Nr:   )rU   rG   r–   )Úvaluesr˜   r�   r6   s       rK   Ú_normalize_skillsz9HermesCLI._handle_cron_command.<locals>._normalize_skills×  s`   € ØˆJØð ,ð ,�Ý˜5˜; BÑ'Ô'×-Ò-Ñ/Ô/�Øð ,˜D¨
Ð2Ð2Ø×%Ò% dÑ+Ô+Ð+øØÐrM   c                 óô  — d d d g g g ddd d g dœ}d}|t          | ¦  «        k     �rS| |         }|dk    r+|dz   t          | ¦  «        k     r| |dz            |d<   |dz  }�n|dk    r+|dz   t          | ¦  «        k     r| |dz            |d	<   |dz  }�nÕ|d
k    rZ|dz   t          | ¦  «        k     rD	 t          | |dz            ¦  «        |d<   n # t          $ r t          d¦  «         Y d S w xY w|dz  }�nu|dk    rA|dz   t          | ¦  «        k     r+|d                              | |dz            ¦  «         |dz  }�n.|dk    r@|dz   t          | ¦  «        k     r*|d                              | |dz            ¦  «         |dz  }nè|dk    r@|dz   t          | ¦  «        k     r*|d                              | |dz            ¦  «         |dz  }n¢|dk    rd|d<   |dz  }n‘|dk    rd|d<   |dz  }n€|dk    r*|dz   t          | ¦  «        k     r| |dz            |d<   |dz  }nP|dk    r*|dz   t          | ¦  «        k     r| |dz            |d<   |dz  }n |d                              |¦  «         |dz  }|t          | ¦  «        k     �°S|S )NF)r    ÚdeliverÚrepeatr"  Ú
add_skillsÚremove_skillsÚclear_skillsr=  r¼  ÚscheduleÚpositionalsr   z--namer  r    r�  z	--deliverrÈ  z--repeatrÉ  z!(._.) --repeat must be an integerz--skillr"  z--add-skillrÊ  z--remove-skillrË  z--clear-skillsTrÌ  z--allr=  z--promptr¼  z
--schedulerÍ  rÎ  )r  rô  r¦  r¹  r–   )ÚtokensÚoptsr  rˆ  s       rK   Ú_parse_flagsz4HermesCLI._handle_cron_command.<locals>._parse_flagsß  s  € àØØØØ Ø!#Ø %ØØØ Ø!ðð ˆDð ˆAØ•c˜&‘k”k’/‘/Ø˜qœ	�Ø˜HÒ$Ð$¨¨Q©µ°V±´Ò)<Ð)<Ø#)¨!¨a©%¤=�D˜‘LØ˜‘F�A‘AØ˜kÒ)Ð)¨a°!©eµc¸&±k´kÒ.AÐ.AØ&,¨Q°©U¤m�D˜‘OØ˜‘F�A‘AØ˜jÒ(Ð(¨Q°©UµS¸±[´[Ò-@Ð-@ð$Ý),¨V°A¸±E¬]Ñ);Ô);˜˜X™˜øÝ%ð $ð $ð $ÝÐAÑBÔBÐBØ#˜t˜tð$øøøð ˜‘F�A‘AØ˜iÒ'Ð'¨A°©EµC¸±K´KÒ,?Ð,?Ø˜”N×)Ò)¨&°°Q±¬-Ñ8Ô8Ð8Ø˜‘F�A‘AØ˜mÒ+Ð+°°A±½¸F¹¼Ò0CÐ0CØ˜Ô&×-Ò-¨f°Q¸±U¬mÑ<Ô<Ð<Ø˜‘F�A�AØÐ.Ò.Ð.°1°q±5½3¸v¹;¼;Ò3FÐ3FØ˜Ô)×0Ò0°¸¸A¹´Ñ?Ô?Ð?Ø˜‘F�A�AØÐ.Ò.Ð.Ø+/�D˜Ñ(Ø˜‘F�A�AØ˜gÒ%Ð%Ø"&�D˜‘KØ˜‘F�A�AØ˜jÒ(Ð(¨Q°©UµS¸±[´[Ò-@Ð-@Ø%+¨A°©E¤]�D˜‘NØ˜‘F�A�AØ˜lÒ*Ð*¨q°1©uµs¸6±{´{Ò/BÐ/BØ'-¨a°!©e¤}�D˜Ñ$Ø˜‘F�A�Aà˜Ô'×.Ò.¨uÑ5Ô5Ð5Ø˜‘F�AðM •c˜&‘k”k’/‘/ðN ˆKs   Â,C ÃC%Ã$C%r  zF+--------------------------------------------------------------------+zD|                      (^_^) Scheduled Tasks                       |z  Commands:z    /cron listzD    /cron add "every 2h" "Check server status" [--skill blogwatcher]zA    /cron edit <job_id> --schedule "every 4h" --prompt "New task"z8    /cron edit <job_id> --skill blogwatcher --skill mapsz2    /cron edit <job_id> --remove-skill blogwatcherz&    /cron edit <job_id> --clear-skillsz    /cron pause <job_id>z    /cron resume <job_id>z    /cron run <job_id>z    /cron remove <job_id>ra   )ÚactionrÇ  Újobsz  Current Jobs:zA  ---------------------------------------------------------------rÉ  r¦  r  Újob_idé   rº  z | rÍ  rr  z<8r"  z      Skills: rT  z      Úprompt_previewr:   Únext_run_atz      Next: z3  No scheduled jobs. Use '/cron add' to create one.r�  r=  )rÒ  Úinclude_disabledz(._.) No scheduled jobs.zScheduled Jobs:zP--------------------------------------------------------------------------------z  ID: z  Name: r    z	  State: r€  z  Schedule: rŠ  r:  z  Next run: zN/Az
  Skills: z
  Prompt: Úlast_run_atz  Last run: Úlast_status>   r—   ré  rÎ  z*(._.) Usage: /cron add <schedule> <prompt>r¼  r‚  z3(._.) Please provide a prompt or at least one skillré  rÈ  )rÒ  rÍ  r¼  r    rÈ  rÉ  r"  z(^_^)b Created job: z(x_x) Failed to create job: r1  ÚeditzN(._.) Usage: /cron edit <job_id> [--schedule ...] [--prompt ...] [--skill ...]z(._.) Job not found: rÊ  rË  ÚskillrÌ  c                 ó   •— g | ]}|‰v¯|‘Œ	S r]   r]   )rW   rÜ  rË  s     €rK   rY   z2HermesCLI._handle_cron_command.<locals>.<listcomp>Ž  s$   ø€ ÐaÐaÐa¨%ÀeÐS`ÐF`ÐF` ÐF`ÐF`ÐF`rM   r=  )rÒ  rÔ  rÍ  r¼  r    rÈ  rÉ  r"  Újobz(^_^)b Updated job: z  Skills: nonez(x_x) Failed to update job: >   ÚrmrŸ  ÚpauseÚdeleterâ  r7  z(._.) Usage: /cron z	 <job_id>>   rß  rá  râ  râ  rà  zpaused from /cron)rÒ  rÔ  rÉ  z(x_x) Failed to z job: z(^_^)b Paused job: r7  z(^_^)b Resumed job: rŸ  z(^_^)b Triggered job: z)  It will run on the next scheduler tick.Úremoved_jobz(^_^)b Removed job: z(._.) Unknown cron command: z8  Available: list, add, edit, pause, resume, run, remove)r›  Útools.cronjob_toolsr¿  r  r  r¹  rT   rb   rŒ   r{  r´   ra   r–   )r7  r
  r›  rÂ  rÆ  rÑ  rÏ  r€   rÓ  rÞ  Ú
repeat_strr   rÐ  rÎ  rÍ  r¼  r"  rÔ  rÒ  Úfinal_skillsÚreplacement_skillsrÊ  Úexisting_skillsrÜ  rÒ  ÚremovedrÁ  rË  s                             @@rK   Ú_handle_cron_commandzHermesCLI._handle_cron_commandÏ  s�  øø€ àˆˆˆØ?Ð?Ð?Ð?Ð?Ð?ð	6ð 	6ð 	6ð 	6ð 	6ð	ð 	ð 	ð6	ð 6	ð 6	ðp —’˜SÑ!Ô!ˆåˆv‰;Œ;˜!ÒÑÝ‰GŒGˆGÝÐ&Ñ'Ô'Ð'ÝÐKÑLÔLÐLÝÐ&Ñ'Ô'Ð'Ý‰GŒGˆGÝ�-Ñ Ô Ð ÝÐ"Ñ#Ô#Ð#ÝÐXÑYÔYÐYÝÐUÑVÔVÐVÝÐLÑMÔMÐMÝÐFÑGÔGÐGÝÐ:Ñ;Ô;Ð;ÝÐ,Ñ-Ô-Ð-ÝÐ-Ñ.Ô.Ð.ÝÐ*Ñ+Ô+Ð+ÝÐ-Ñ.Ô.Ð.Ý‰GŒGˆGØ�Y fÐ-Ñ-Ô-ˆFØ-3¯ZªZ¸	Ñ-BÔ-BÐJ�6—:’:˜f bÑ)Ô)Ð)ÈˆDØñ MÝÐ'Ñ(Ô(Ð(Ý�oÑ&Ô&Ð&Øð ð �CØ!$§¢¨°3Ñ!7Ô!7�JÝÐc  X¤¨s°¨sÔ!3ÐcÐcÐc¸CÀ
¼OÐcÐcÐcÐT^ÐcÐcÐcÑdÔdÐdØ—w’w˜xÑ(Ô(ð KÝÐI¨t¯yªy¸¸X¼Ñ/GÔ/GÐIÐIÑJÔJÐJÝÐB 3§7¢7Ð+;¸RÑ#@Ô#@ÐBÐBÑCÔCÐCØ—w’w˜}Ñ-Ô-ð CÝÐA¨S°Ô-?ÐAÐAÑBÔBÐBÝ‘G”G�G�Gðõ ÐKÑLÔLÐLÝ‰GŒGˆGØˆFà˜A”Y—_’_Ñ&Ô&ˆ
Øˆ|˜F 1 2 2œJÑ'Ô'ˆØˆ<ØˆFà˜ÒÑØ�Y f¸tÀE¼{ÐKÑKÔKˆFØ-3¯ZªZ¸	Ñ-BÔ-BÐJ�6—:’:˜f bÑ)Ô)Ð)ÈˆDØð ÝÐ0Ñ1Ô1Ð1Ø�å‰GŒGˆGÝÐ#Ñ$Ô$Ð$Ý�(‰OŒOˆOØð ñ �ÝÐ.˜s 8œ}Ð.Ð.Ñ/Ô/Ð/ÝÐ.  V¤Ð.Ð.Ñ/Ô/Ð/ÝÐ9 #§'¢'¨'°3Ñ"7Ô"7Ð9Ð9Ñ:Ô:Ð:ÝÐQ S¨¤_ÐQÐQ¸¿ºÀÈ#Ñ8NÔ8NÐQÐQÐQÑRÔRÐRÝÐD S§W¢W¨]¸EÑ%BÔ%BÐDÐDÑEÔEÐEØ—7’7˜8Ñ$Ô$ð CÝÐA t§y¢y°°X´Ñ'?Ô'?ÐAÐAÑBÔBÐBÝÐB 3§7¢7Ð+;¸RÑ#@Ô#@ÐBÐBÑCÔCÐCØ—7’7˜=Ñ)Ô)ð _ÝÐ]¨¨]Ô);Ð]Ð]¸s¿wºwÀ}ÐVYÑ?ZÔ?ZÐ]Ð]Ð]Ñ^Ô^Ð^Ý‘”�‘ØˆFàÐ*Ð*Ñ*Ø˜}Ô-ˆKØð ÝÐBÑCÔCÐCØ�Ø˜JÔ'Ð9¨;°q¬>ˆHØ˜(”^Ð@ s§x¢x°¸A¸B¸B´Ñ'@Ô'@ˆFØ&Ð& t¨H¤~Ñ6Ô6ˆFØð  &ð ÝÐKÑLÔLÐLØ�Ø�YØØ!Ø�~ Ø˜&”\Ø˜YœØ˜H”~Ø�~ ðñ ô ˆFð �zŠz˜)Ñ$Ô$ð LÝÐ?¨V°HÔ-=Ð?Ð?Ñ@Ô@Ð@ÝÐ9 V¨JÔ%7Ð9Ð9Ñ:Ô:Ð:Ø—:’:˜hÑ'Ô'ð FÝÐD t§y¢y°¸Ô1AÑ'BÔ'BÐDÐDÑEÔEÐEÝÐ< V¨MÔ%:Ð<Ð<Ñ=Ô=Ð=Ð=åÐJ°V·Z²ZÀÑ5HÔ5HÐJÐJÑKÔKÐKØˆFà˜ÒÑØ˜}Ô-ˆKØð ÝÐfÑgÔgÐgØ�Ø  ”^ˆFÝ˜v‘”ˆHØð ÝÐ6¨fÐ6Ð6Ñ7Ô7Ð7Ø�àˆLØ!2Ð!2°4¸´>Ñ!BÔ!BÐØ*Ð*¨4°Ô+=Ñ>Ô>ˆJÝÐ 1Ð 1°$°Ô2GÑ HÔ HÑIÔIˆMÝ" 8§<¢<°Ñ#9Ô#9Ð#{ÈÏÊÐU\ÑH]ÔH]Ð>z¸b¸bÐdl×dpÒdpÐqxÑdyÔdyÐczÑ|Ô|ˆOØ�NÔ#ð 3Ø!��Ø#ð 3Ø1��Øð 3˜}ð 3ØaÐaÐaÐa°?ÐaÑaÔa�Ø'ð 3ð 3�EØ LÐ0Ð0Ø$×+Ò+¨EÑ2Ô2Ð2øà�YØØØ˜jÔ)Ø˜H”~Ø˜&”\Ø˜YœØ˜H”~Ø#ð	ñ 	ô 	ˆFð �zŠz˜)Ñ$Ô$ð 	LØ˜U”m�ÝÐ<¨S°¬]Ð<Ð<Ñ=Ô=Ð=ÝÐ6 S¨¤_Ð6Ð6Ñ7Ô7Ð7Ø—7’7˜8Ñ$Ô$ð ,ÝÐA t§y¢y°°X´Ñ'?Ô'?ÐAÐAÑBÔBÐBÐBåÐ*Ñ+Ô+Ð+Ð+åÐJ°V·Z²ZÀÑ5HÔ5HÐJÐJÑKÔKÐKØˆFàÐMÐMÑMØ˜}Ô-ˆKØð ÝÐA¨JÐAÐAÐAÑBÔBÐBØ�Ø  ”^ˆFØ!+Ð/IÐ!IÐ!I�X�XÈzˆFØ�Y f°VÐ[aÐelÒ[lÐ[lÐDWÐDWÐrvÐwÑwÔwˆFØ—:’:˜iÑ(Ô(ð ÝÐL¨ÐLÐL°v·z²zÀ'Ñ7JÔ7JÐLÐLÑMÔMÐMØ�Ø˜Ò Ð ÝÐN¨F°5¬M¸&Ô,AÐNÐNÀVÐNÐNÐNÑOÔOÐOÐOØ˜8Ò#Ð#ÝÐO¨V°E¬]¸6Ô-BÐOÐOÀfÐOÐOÐOÑPÔPÐPÝÐG V¨E¤]×%6Ò%6°}Ñ%EÔ%EÐGÐGÑHÔHÐHÐHØ˜5’�ÝÐQ¨v°e¬}¸VÔ/DÐQÐQÈÐQÐQÐQÑRÔRÐRÝÐAÑBÔBÐBÐBà Ÿ*š* ]°BÑ7Ô7�ÝÐU¨W¯[ª[¸ÀÑ-HÔ-HÐUÐUÈFÐUÐUÐUÑVÔVÐVØˆFåÐ9¨ZÐ9Ð9Ñ:Ô:Ð:ÝÐHÑIÔIÐIÐIÐIrM   c                 óB   — ddl m}  ||t          ¦   «         ¦  «         dS )uD   Handle /skills slash command â€” delegates to hermes_cli.skills_hub.r   )Úhandle_skills_slashN)Úhermes_cli.skills_hubrë  ré  )r7  r
  rë  s      rK   Ú_handle_skills_commandz HermesCLI._handle_skills_commandÄ  s1   € à=Ð=Ð=Ð=Ð=Ð=ØÐ˜C¥¡¤Ñ/Ô/Ð/Ð/Ð/rM   c                 óN  — ddl m}m} t          ¦   «          t          d¦  «         t          d¦  «         t          d¦  «         t          ¦   «          	  |¦   «         }t          d¦  «         t          d¦  «         |j        d|j        d|j        d	i}|                     ¦   «         D ]|\  }\  }}|j         	                    |¦  «        }|rA|j
        r:|                     |¦  «        }	|	r
d
|	j        › �nd}
t          d|d›d|
› �¦  «         Œet          d|d›d|› d�¦  «         Œ}t          ¦   «          t          d¦  «         t          d¦  «         |j        }t          d|j        › �¦  «         t          d|j        › d�¦  «         t          d|j        › d�¦  «         t          ¦   «          t          d¦  «         t          d¦  «         t          ¦   «          t          dt#          ¦   «         › d�¦  «         t          ¦   «          d"S # t$          $ r”}t          d|› �¦  «         t          ¦   «          t          d¦  «         t          d¦  «         t          d¦  «         t          d ¦  «         t          d!t#          ¦   «         › d�¦  «         t          ¦   «          Y d"}~d"S d"}~ww xY w)#z=Show status of the gateway and connected messaging platforms.r   )Úload_gateway_configÚPlatformz>+------------------------------------------------------------+u?   |               (âœ¿â— â€¿â— ) Gateway Status                 |z#  Messaging Platform Configuration:z9  -------------------------------------------------------)ÚTelegramÚTELEGRAM_BOT_TOKEN)ÚDiscordÚDISCORD_BOT_TOKEN)ÚWhatsAppÚWHATSAPP_ENABLEDu    â†’ r:   u       âœ“ rº  z Enabledu       â—‹ z Not configured (r:  z  Session Reset Policy:z
    Mode: z    Daily reset at: z:00z    Idle timeout: z minutesz  To start the gateway:z    python cli.py --gatewayz  Configuration file: z/config.yamlz   Error loading gateway config: z  To configure the gateway:z!    1. Set environment variables:z$       TELEGRAM_BOT_TOKEN=your_tokenz#       DISCORD_BOT_TOKEN=your_tokenz     2. Or configure settings in N)Úgateway.configrï  rð  r¹  ÚTELEGRAMÚDISCORDÚWHATSAPPrB  Ú	platformsrT   rÓ   Úget_home_channelr    Údefault_reset_policyre  Úat_hourÚidle_minutesr,   rv   )r7  rï  rð  r2  Úplatform_statusr‹  r    rU  ÚpconfigÚhomeÚhome_strÚpolicyrz   s                rK   Ú_show_gateway_statuszHermesCLI._show_gateway_statusÉ  s  € à@Ð@Ð@Ð@Ð@Ð@Ð@Ð@å‰ŒˆÝÐ"Ñ#Ô#Ð#ÝÐOÑPÔPÐPÝÐ"Ñ#Ô#Ð#Ý‰Œˆð,	Ø(Ð(Ñ*Ô*ˆFåÐ7Ñ8Ô8Ð8Ý�/Ñ"Ô"Ð"ð Ô!Ð#EØÔ Ð"BØÔ!Ð#CðˆOð .=×-BÒ-BÑ-DÔ-Dð Lð LÑ)�™/˜4 Ø Ô*×.Ò.¨xÑ8Ô8�Øð L˜wœð LØ!×2Ò2°8Ñ<Ô<�DØ6:ÐBÐ2 t¤yÐ2Ð2Ð2À�HÝÐA TÐAÐAÐA°xÐAÐAÑBÔBÐBÐBåÐJ TÐJÐJÐJÀÐJÐJÐJÑKÔKÐKÐKå‰GŒGˆGÝÐ+Ñ,Ô,Ð,Ý�/Ñ"Ô"Ð"ØÔ0ˆFÝÐ,˜vœ{Ð,Ð,Ñ-Ô-Ð-ÝÐ<¨¬Ð<Ð<Ð<Ñ=Ô=Ð=ÝÐD vÔ':ÐDÐDÐDÑEÔEÐEå‰GŒGˆGÝÐ+Ñ,Ô,Ð,ÝÐ/Ñ0Ô0Ð0Ý‰GŒGˆGÝÐNÕ+>Ñ+@Ô+@ÐNÐNÐNÑOÔOÐOÝ‰GŒGˆGˆGˆGøåð 	ð 	ð 	ÝÐ8°QÐ8Ð8Ñ9Ô9Ð9Ý‰GŒGˆGÝÐ/Ñ0Ô0Ð0ÝÐ5Ñ6Ô6Ð6ÝÐ8Ñ9Ô9Ð9ÝÐ7Ñ8Ô8Ð8ÝÐXÕ5HÑ5JÔ5JÐXÐXÐXÑYÔYÐYÝ‰GŒGˆGˆGˆGˆGˆGˆGˆGøøøøð	øøøs   ÁF1H È
J$ÈB	JÊJ$c           
      ó*  ‡A‡B— |                      ¦   «                              ¦   «         }|                     ¦   «         }ddlm} |                     ¦   «         d                              d¦  «        } ||¦  «        }|r|j        n|}|dv rdS |dk    r|                      ¦   «          �n`|dk    r|                      ¦   «          �nD|dk    r|  	                    |¦  «         �n'|d	k    r|  
                    ¦   «          �n|d
k    r|                      ¦   «          �nï|dk    �r |                      d¬¦  «         | j        rK| j        j        }|                     ¦   «          |                     dd¦  «         |                     ¦   «          n| j                             ¦   «          | j        �r|t)          ¦   «         }	t+          j        ¦   «         j        }
| j        s|
dk     r"|	                     t5          ¦   «         ¦  «         n t7          | j        d¬¦  «        }t;          j        dt;          j        ¦   «         ¦  «        }d}tA          | d¦  «        r-| j!        r&tA          | j!        d¦  «        r| j!        j"        j#        }tI          |	| j%        ||| j        | j&        |¬¦  «         tO          d¦  «         	 ddl(m)}  |¦   «         }	 ddl*m+}  |¦   «          ,                    dd¦  «        }n# tZ          $ r d}Y nw xY w|	                     d|› d|› d�¦  «         �nô# tZ          $ r Y �nçw xY w|  .                    ¦   «          t3          d¦  «         	 ddl(m)}  |¦   «         }	 ddl*m+}  |¦   «          ,                    dd¦  «        }n# tZ          $ r d}Y nw xY w|  /                    d|› d|› d�¦  «         �nY# tZ          $ r Y �nLw xY w|dk    r|  0                    ¦   «          �n,|dk    �r_|                     d¬ ¦  «        }tc          |¦  «        dk    �r…|d                              ¦   «         }|�rW| j2        �r>	 dd!l3m4} | 5                    |¦  «        }n+# tl          $ r}tO          d"|› �¦  «         d}Y d}~nd}~ww xY w|stO          d#¦  «         �n{| j2         7                    | j&        ¦  «        ro	 | j2         8                    | j&        |¦  «        rtO          d$|› �¦  «         ntO          d%¦  «         �n# tl          $ r}tO          d"|› �¦  «         Y d}~�nõd}~ww xY w| j2         9                    |¦  «        }|rtO          d&|› d'|d(         › �¦  «         �n´|| _:        tO          d)|› d*�¦  «         �n˜tO          d+¦  «         �n‡tO          d,¦  «         �nv| j2        r˜tO          d-| j&        › �¦  «         | j2         7                    | j&        ¦  «        }|r/| ;                    d¦  «        rtO          d.|d         › �¦  «         �n| j:        rtO          d/| j:        › �¦  «         �nètO          d0¦  «         �n×tO          d+¦  «         �nÆ|d1k    r|                      ¦   «          �nª|d2k    r|  <                    |¦  «         �n�|d3k    r|  =                    |¦  «         �np|d4k    r|  >                    |¦  «         �nS|d5k    r|  ?                    |¦  «         �n6|d6k    rB|  @                    ¦   «         }|r*tA          | d7¦  «        r| jA         B                    |¦  «         �nî|d8k    r|  C                    ¦   «          �nÒ|d9k    r|  D                    |¦  «         �nµ|d:k    r|  E                    ¦   «          �n™|d;k    r|  F                    |¦  «         �n||d<k    rW|  G                    |  H                    |¦  «        ¦  «        5  |  I                    |¦  «         ddd¦  «         n# 1 swxY w Y   �n|d=k    r|  J                    ¦   «          �n|d>k    r|  K                    ¦   «          �nç|d?k    r2| jL         | _L        | jL        rd@ndA}|  /                    dB|› �¦  «         �n¯|dCk    r|  M                    ¦   «          �n“|dDk    r|  N                    ¦   «          �nw|dEk    r|  O                    |¦  «         �nZ|dFk    r|  P                    |¦  «         �n=|dGk    r|  Q                    |¦  «         �n |dHk    r|  R                    ¦   «          �n|dIk    r|  S                    |¦  «         �nç|dJk    r|  T                    |¦  «         �nÊ|dKk    r|  U                    ¦   «          �n®|dLk    r|  V                    ¦   «          �n’|dMk    r|  W                    |¦  «         �nu|dNk    r%ddOlXmY}  |¦   «         }t3          dP|› dQ�¦  «         �nJ|dRk    rV|  G                    |  H                    |¦  «        ¦  «        5  |  Z                    ¦   «          ddd¦  «         n# 1 swxY w Y   �
nî|dSk    r|  [                    |¦  «         �
nÑ|dTk    �rv	 ddUl\m]}  |¦   «         }| ^                    ¦   «         }|s/t3          dV¦  «         t3          dWt¿          ¦   «         › dX�¦  «         nôt3          dYtc          |¦  «        › dZ�¦  «         |D ]Ñ} | d[         rd\nd]}!| d^         rd_| d^         › �nd`}"| d         r| d         › da�nd`}| db         r| db         › dc�nd`}#|  ;                    dd¦  «        r| dd         › de�nd`}$df„ ||#|$fD ¦   «         }|rdgdh `                    |¦  «        › di�nd`}%| dj         rdk| dj         › �nd`}&t3          d"|!› dl| dm         › |"› |%› |&› �¦  «         ŒÒ�	n~# tZ          $ r}t3          dn|› �¦  «         Y d}~�	n\d}~ww xY w|dok    r|  a                    |¦  «         �	n7|dpk    r|  b                    |¦  «         �	n|dqk    r|  c                    ¦   «          �nþ|drk    r|  d                    ¦   «          �nâ|dsk    r|  e                    |¦  «         �nÅ|dtk    rß|                     dd¦  «        }tc          |¦  «        dk    r|d                              ¦   «         nd`}'|'stO          du¦  «         �ng| jA         B                    |'¦  «         | jf        r3tO          dv|'dd…         › tc          |'¦  «        dk    rdwnd`› �¦  «         �ntO          dx|'dd…         › tc          |'¦  «        dk    rdwnd`› �¦  «         �nà|dyk    �rS|                     dd¦  «        }tc          |¦  «        dk    r|d                              ¦   «         nd`}'|'stO          dz¦  «         �n�| jf        r§| j!        � tA          | j!        dy¦  «        r‹	 | j!         g                    |'¦  «        }(|(r3tO          d{|'dd…         › tc          |'¦  «        dk    rdwnd`› �¦  «         �ntO          d|¦  «         �ný# tZ          $ r})tO          d}|)› �¦  «         Y d})~)�nÛd})~)ww xY w| jA         B                    |'¦  «         tO          d~|'dd…         › tc          |'¦  «        dk    rdwnd`› �¦  «         �n†|dk    r|  h                    |¦  «         �ni|d€k    r|  i                    |¦  «         �nL|d�k    r|  j                    |¦  «         �n/|                     ¦   «         d         }*| jk         ;                    d‚i ¦  «        }+|*                     d¦  «        |+v �r3|+|*                     d¦  «                 },|, ;                    dƒ¦  «        d„k    �rddll}-|, ;                    d…d`¦  «        }.|.rÛ	 |- m                    |.dddd†¬‡¦  «        }/|/jn                             ¦   «         p|/jo                             ¦   «         }0|0r#|  /                    tá          |0¦  «        ¦  «         n|  /                    dˆ¦  «         �n# |-jq        $ r |  /                    d‰¦  «         Y �nætZ          $ r$}|  /                    dŠ|› d�¦  «         Y d}~�n¾d}~ww xY w|  /                    d‹|*› dŒ�¦  «         �n›|, ;                    dƒ¦  «        d�k    r¸|, ;                    dŽd`¦  «                             ¦   «         }1|1rs|1 r                    d¦  «        r|1nd|1› �}1|tc          |*¦  «        d…                              ¦   «         }2|1› dl|2› �                     ¦   «         }3|  s                    |3¦  «        S |  /                    d‹|*› d��¦  «         �nÊ|  /                    d‹|*› d��¦  «         �n¯|*                     d¦  «        té          ¦   «         v r®dd‘l\mu}4  |4|*                     d¦  «        ¦  «        }5|5r†|tc          |*¦  «        d…                              ¦   «         }2	  |5|2¦  «        }/|/rtO          tí          |/¦  «        ¦  «         �n# tZ          $ r$}tO          d’|› tî          › �¦  «         Y d}~�nèd}~ww xY w�nÞ|*tð          v rº|tc          |*¦  «        d…                              ¦   «         }6tó          |*|6| j&        ¬“¦  «        }7|7rQtð          |*         dm         }8t3          d”|8› �¦  «         tA          | d7¦  «        r| jA         B                    |7¦  «         �nBt)          ¦   «                              d•|*› d�¦  «         �ndd–lmz}9 |                     ¦   «         d         ŠBt÷          |9¦  «        t÷          tð          ¦  «        z  }:ˆBfd—„|:D ¦   «         };tc          |;¦  «        dk    r`ˆBfd˜„|;D ¦   «         }<tc          |<¦  «        dk    r|<};n<tù          d™„ |;D ¦   «         ¦  «        ŠAˆAfdš„|;D ¦   «         }=tc          |=¦  «        dk    r|=};tc          |;¦  «        dk    r�|;d         }>|>‰Bk    r?tO          d›|› tî          › �¦  «         tO          tú          › tü          › dœtî          › �¦  «         nö|                     ¦   «         tc          ‰B¦  «        d…         }?|>|?z   }@|  s                    |@¦  «        S tc          |;¦  «        dk    rbtO          tü          › d�|› tî          › �¦  «         tO          tú          › dždh `                    tÿ          |;¦  «        ¦  «        › dŸtî          › �¦  «         n>tO          d›|› tî          › �¦  «         tO          tú          › tü          › dœtî          › �¦  «         dS ) zË
        Process a slash command.
        
        Args:
            command: The command string (starting with /)
            
        Returns:
            bool: True to continue, False to exit
        r   r’  r�  )ÚquitÚexitÚqFÚhelpÚprofiler{  r6  r2  r€  T)rç  rÌ  ry  r  Nrþ   r  rz  uI     âœ¨ (â—•â€¿â—•)âœ¨ Fresh start! Screen cleared and conversation reset.
©Úget_random_tipr:  rO  rP  rŸ  õ
   ]âœ¦ Tip: rU  rÀ  rL  r  r"  rc  r8  z@  Title is empty after cleanup. Please use printable characters.z  Session title set: z   Session not found in database.z	  Title 'z' is already in use by session rç  z  Session title queued: z! (will be saved on first message)rê  z$  Usage: /title <your session title>z  Session ID: z	  Title: z  Title (pending): z2  No title set. Usage: /title <your session title>Únewr7  rõ   ÚgquotaÚpersonalityÚretryr™  Úundor¸  ÚsaveÚcronr"  rû  rý  Ú	statusbarrA  Úhiddenz  Status bar rå   Úyolor4   rŠ   ÚcompressÚusageÚinsightsÚcopyrÂ  ÚpasteÚimageÚreload)Ú
reload_envz  Reloaded .env (z var(s) updated)z
reload-mcprü   Úpluginsr  zNo plugins installed.zDrop plugin directories into z/plugins/ to get started.z	Plugins (z):rÓ   u   âœ“u   âœ—Úversionz vr:   z toolsÚhooksz hooksrz  z	 commandsc                 ó   — g | ]}|¯|‘ŒS r]   r]   ©rW   Úxs     rK   rY   z-HermesCLI.process_command.<locals>.<listcomp>ê  s   € Ð JÐ JÐ J qÈÐ J Ð JÐ JÐ JrM   rŠ  rT  r:  r1  õ    â€” r‚  r    zPlugin system error: Úrollbackr  ÚstopÚagentsÚ
backgroundr?  z  Usage: /queue <prompt>ú  Queued for the next turn: rÏ  z
  Queued: r—  z  Usage: /steer <prompt>u9     â�© Steer queued â€” arrives after the next tool call: z!  Steer rejected (empty payload).z  Steer failed: z)  No agent running; queued as next turn: rò   ÚvoiceÚbusyÚquick_commandsrQ   Úexecr   r³  )Úshellr�  r6   rÆ   z"[dim]Command returned no output[/]z*[bold red]Quick command timed out (30s)[/]z[bold red]Quick command error: z[bold red]Quick command 'z' has no command defined[/]Úaliasrñ  z' has no target defined[/]z6' has unsupported type (supported: 'exec', 'alias')[/])Úget_plugin_command_handlerz[1;31mPlugin command error: ©Útask_idu   
âš¡ Loading skill: z#[bold red]Failed to load skill for )ÚCOMMANDSc                 ó>   •— g | ]}|                      ‰¦  «        ¯|‘ŒS r]   r  ©rW   ÚcÚ
typed_bases     €rK   rY   z-HermesCLI.process_command.<locals>.<listcomp>i  s*   ø€ ÐLÐLÐL °1·<²<À
Ñ3KÔ3KÐL˜1ÐLÐLÐLrM   c                 ó    •— g | ]
}|‰k    ¯|‘ŒS r]   r]   r8  s     €rK   rY   z-HermesCLI.process_command.<locals>.<listcomp>l  s   ø€ ÐCÐCÐC 1°1¸
²?°?˜Q°?°?°?rM   c              3   ó4   K  — | ]}t          |¦  «        V — Œd S r\   rÚ  )rW   r9  s     rK   r`   z,HermesCLI.process_command.<locals>.<genexpr>r  s(   è è € Ð%>Ð%>°¥c¨!¡f¤fÐ%>Ð%>Ð%>Ð%>Ð%>Ð%>rM   c                 ó:   •— g | ]}t          |¦  «        ‰k    ¯|‘ŒS r]   rÚ  )rW   r9  Úmin_lens     €rK   rY   z-HermesCLI.process_command.<locals>.<listcomp>s  s)   ø€ Ð#LÐ#LÐ#L¨!½#¸a¹&¼&ÀGÒ:KÐ:K AÐ:KÐ:KÐ:KrM   z[1;31mUnknown command: z!Type /help for available commandszAmbiguous command: zDid you mean: r¦  )€rŒ   rG   rs  r“  r  r›  r    r|  r®  r¢  r¨  rº  rŸ  rŒ  r§  Úerase_screenÚcursor_gotor  rh  r€  ré  rž   rÖ  r×  rí   r¹  r  rs  r~  r’   r–  r@  r•  rþ   r  rý  ru  rõ   rŠ  rj  Úhermes_cli.tipsr  r<  r;  r=  rv   r†  r  rÔ  r  r‘  r’  rd  Úsanitize_titler¦  rd  rp  Úget_session_by_titler“  rT   ró  r�  rµ  r½  r  r™  ÚputrÏ  r  r  ré  r  r   rí  r  rb  r¾  Ú_toggle_verboseÚ_toggle_yoloÚ_handle_reasoning_commandÚ_handle_fast_commandÚ_manual_compressÚ_show_usageÚ_show_insightsr&  Ú_handle_debug_commandr  r-  r>  r   Ú_reload_mcpÚ_handle_browser_commandr“  r  Úlist_pluginsr,   rb   rÓ  rõ  r  r  Ú_handle_background_commandr—  r—  Ú_handle_skin_commandÚ_handle_voice_commandÚ_handle_busy_commandr2  rž  rŸ  r¡  rÃ  rY  ÚTimeoutExpiredrÅ  Úprocess_commandr!  r3  rU   rŒ  ru  r  r6  r´   r  r‹  rñ  rv  )Cr7  r   rÿ  r   Ú_resolve_cmdÚ
_base_wordÚ_cmd_defrt  r  ÚccÚterm_wr{  rÅ   r„  r  Ú_tipr;  Ú
_tip_colorrc   Ú	raw_titlerd  Ú	new_titlerz   rÒ  rÈ  Ú	retry_msgr€  r   Úcountr  rÐ  r!  r_   rý  r"  r#  rz  Údetailr1  r  Úacceptedrø  Úbase_cmdr/  Úqcmdrž  Úexec_cmdr€   r§  rñ  Ú	user_argsÚaliased_commandr3  Úplugin_handlerÚuser_instructionr«  Ú
skill_namer6  Ú	all_knownÚmatchesÚexactÚshortestÚ	full_namer‰  Úfull_cmdr>  r:  sC                                                                    @@rK   rU  zHermesCLI.process_command  sj  øø€ ð —M’M‘O”O×)Ò)Ñ+Ô+ˆ	Ø—}’}‘”ˆð 	HÐGÐGÐGÐGÐGØ—_’_Ñ&Ô& qÔ)×0Ò0°Ñ5Ô5ˆ
Ø�< 
Ñ+Ô+ˆØ%-Ð=�H”M�M°:ˆ	àÐ-Ð-Ð-Ø�5Ø˜&Ò Ð Ø�NŠNÑÔÐÑØ˜)Ò#Ð#Ø×(Ò(Ñ*Ô*Ð*Ñ*Ø˜'Ò!Ð!Ø×&Ò& |Ñ4Ô4Ð4Ñ4Ø˜*Ò$Ð$Ø×ÒÑ Ô Ð Ñ Ø˜(Ò"Ð"Ø×ÒÑÔÐÑØ˜'Ò!Ñ!Ø×Ò DÐÑ)Ô)Ð)ð
 Œyð %Ø”iÔ&�Ø× Ò Ñ"Ô"Ð"Ø—’  1Ñ%Ô%Ð%Ø—	’	‘”��à”×"Ò"Ñ$Ô$Ð$ð
 Œyñ /Ý ‘]”]�ÝÔ1Ñ3Ô3Ô;�Ø”<ð  6¨B¢; ;Ø—H’HÕ2Ñ4Ô4Ñ5Ô5Ð5Ð5å0À$ÔBWÐdhÐiÑiÔi�EÝœ) NµB´I±K´KÑ@Ô@�CØ"�GÝ˜t WÑ-Ô-ð O°$´*ð OÅÈÌÐUiÑAjÔAjð OØ"&¤*Ô"?Ô"N˜Ý(Ø "Ø"œjØØ#Ø)-Ô)>Ø#'¤?Ø'.ðñ ô ð õ ÐdÑeÔeÐeð
Ø>Ð>Ð>Ð>Ð>Ð>Ø)˜>Ñ+Ô+�Dð/ØJÐJÐJÐJÐJÐJØ%4 _Ñ%6Ô%6×%@Ò%@ÀÈyÑ%YÔ%Y˜
˜
øÝ$ð /ð /ð /Ø%.˜
˜
˜
ð/øøøà—H’HÐD ZÐDÐD¸4ÐDÐDÐDÑEÔEÐEÑEøÝ ð ð ð Ø‘Dðøøøð × Ò Ñ"Ô"Ð"ÝÐbÑcÔcÐcð
Ø>Ð>Ð>Ð>Ð>Ð>Ø)˜>Ñ+Ô+�Dð/ØJÐJÐJÐJÐJÐJØ%4 _Ñ%6Ô%6×%@Ò%@ÀÈyÑ%YÔ%Y˜
˜
øÝ$ð /ð /ð /Ø%.˜
˜
˜
ð/øøøà×'Ò'Ð(O°
Ð(OÐ(OÀdÐ(OÐ(OÐ(OÑPÔPÐPÑPøÝ ð ð ð Ø‘Dðøøøà˜)Ò#Ð#Ø×ÒÑÔÐÑØ˜'Ò!Ñ!Ø ×&Ò&°Ð&Ñ2Ô2ˆEÝ�5‰zŒz˜AŠ~‰~Ø! !œHŸNšNÑ,Ô,�	Øñ  DØÔ'ñ Eð-Ø>Ð>Ð>Ð>Ð>Ð>Ø(1×(@Ò(@ÀÑ(KÔ(K˜I˜IøÝ)ð -ð -ð -Ý# H¨ H HÑ-Ô-Ð-Ø(,˜I˜I˜I˜I˜I˜Iøøøøð-øøøð  )ð qÝ#Ð$fÑgÔgÐgÑgØ!Ô-×9Ò9¸$¼/ÑJÔJð qð2Ø#'Ô#3×#EÒ#EÀdÄoÐW`Ñ#aÔ#að !PÝ$+Ð,OÀIÐ,OÐ,OÑ$PÔ$PÐ$PÐ$På$+Ð,NÑ$OÔ$OÐ$OùøÝ#-ð 2ð 2ð 2Ý '¨¨Q¨¨Ñ 1Ô 1Ð 1Ð 1Ð 1Ð 1Ð 1Ñ 1øøøøð2øøøð
 (,Ô'7×'LÒ'LÈYÑ'WÔ'W˜HØ'ð qÝ 'Ð(n°IÐ(nÐ(nÐ^fÐgkÔ^lÐ(nÐ(nÑ oÔ oÐ oÑ oà6? Ô 3Ý 'Ð(oÀ9Ð(oÐ(oÐ(oÑ pÔ pÐ pÑ påÐ CÑDÔDÐDÑDåÐBÑCÔCÐCÑCð Ô#ð 
AÝÐ>¨T¬_Ð>Ð>Ñ?Ô?Ð?Ø"Ô.×:Ò:¸4¼?ÑKÔK�GØð V 7§;¢;¨wÑ#7Ô#7ð VÝÐ >¨G°GÔ,<Ð >Ð >Ñ?Ô?Ð?Ñ?ØÔ,ð VÝÐ K°dÔ6IÐ KÐ KÑLÔLÐLÑLåÐ TÑUÔUÐUÑUåÐ?Ñ@Ô@Ð@Ñ@Ø˜%ÒÐØ×ÒÑÔÐÑØ˜(Ò"Ð"Ø×'Ò'¨Ñ5Ô5Ð5Ñ5Ø˜'Ò!Ð!Ø×%Ò% lÑ3Ô3Ð3Ñ3Ø˜(Ò"Ð"Ø×'Ò'¨Ñ5Ô5Ð5Ñ5à˜-Ò'Ð'à×,Ò,¨\Ñ:Ô:Ð:Ñ:Ø˜'Ò!Ð!ØŸšÑ)Ô)ˆIØð 3�W TÐ+;Ñ<Ô<ð 3àÔ#×'Ò'¨	Ñ2Ô2Ð2ùØ˜&Ò Ð Ø�NŠNÑÔÐÑØ˜(Ò"Ð"Ø×'Ò'¨Ñ5Ô5Ð5Ñ5Ø˜&Ò Ð Ø×"Ò"Ñ$Ô$Ð$Ñ$Ø˜&Ò Ð Ø×%Ò% lÑ3Ô3Ð3Ñ3Ø˜(Ò"Ð"Ø×#Ò# D×$=Ò$=¸lÑ$KÔ$KÑLÔLð :ð :Ø×+Ò+¨LÑ9Ô9Ð9ð:ð :ð :ñ :ô :ð :ð :ð :ð :ð :ð :øøøð :ð :ð :ð :ùà˜+Ò%Ð%Ø×%Ò%Ñ'Ô'Ð'Ñ'Ø˜(Ò"Ð"Ø×%Ò%Ñ'Ô'Ð'Ñ'Ø˜+Ò%Ð%Ø+/Ô+CÐ'CˆDÔ$Ø!%Ô!9ÐG�I�I¸xˆEØ×ÒÐ 7°Ð 7Ð 7Ñ8Ô8Ð8Ñ8Ø˜)Ò#Ð#Ø× Ò Ñ"Ô"Ð"Ñ"Ø˜&Ò Ð Ø×ÒÑÔÐÑØ˜+Ò%Ð%Ø×*Ò*¨<Ñ8Ô8Ð8Ñ8Ø˜&Ò Ð Ø×%Ò% lÑ3Ô3Ð3Ñ3Ø˜*Ò$Ð$Ø×!Ò! ,Ñ/Ô/Ð/Ñ/Ø˜'Ò!Ð!Ø×ÒÑÔÐÑØ˜*Ò$Ð$Ø×Ò Ñ-Ô-Ð-Ñ-Ø˜&Ò Ð Ø×%Ò% lÑ3Ô3Ð3Ñ3Ø˜'Ò!Ð!Ø×&Ò&Ñ(Ô(Ð(Ñ(Ø˜'Ò!Ð!Ø×&Ò&Ñ(Ô(Ð(Ñ(Ø˜'Ò!Ð!Ø×&Ò& |Ñ4Ô4Ð4Ñ4Ø˜(Ò"Ð"Ø4Ð4Ð4Ð4Ð4Ð4Ø�J‘L”LˆEÝÐ= eÐ=Ð=Ð=Ñ>Ô>Ð>Ñ>Ø˜,Ò&Ð&Ø×#Ò# D×$=Ò$=¸lÑ$KÔ$KÑLÔLð #ð #Ø× Ò Ñ"Ô"Ð"ð#ð #ð #ñ #ô #ð #ð #ð #ð #ð #ð #øøøð #ð #ð #ð #ùà˜)Ò#Ð#Ø×(Ò(¨Ñ6Ô6Ð6Ñ6Ø˜)Ò#Ñ#ð3ØAÐAÐAÐAÐAÐAØ(Ð(Ñ*Ô*�Ø×*Ò*Ñ,Ô,�Øð QÝÐ1Ñ2Ô2Ð2ÝÐjÕ:MÑ:OÔ:OÐjÐjÐjÑkÔkÐkÐkåÐ6¥c¨'¡l¤lÐ6Ð6Ð6Ñ7Ô7Ð7Ø$ð 	Qð 	Q˜Ø*+¨I¬,Ð!A  ¸E˜Ø9:¸9¼Ð"MÐ"5 q¨¤|Ð"5Ð"5Ð"5È2˜Ø9:¸7¼Ð K 1 W¤:Ð 5Ð 5Ð 5Ð 5È˜Ø9:¸7¼Ð K 1 W¤:Ð 5Ð 5Ð 5Ð 5È˜ØBCÇ%Â%È
ÑBSÔBSÐ#[ a¨
¤mÐ#>Ð#>Ð#>Ð#>ÐY[˜Ø JÐ J¨U°E¸8Ð,DÐ JÑ JÔ J˜Ø=BÐ!JÐ!9 d§i¢i°Ñ&6Ô&6Ð!9Ð!9Ð!9Ð!9È˜Ø89¸'¼
Ð JÐ 4¨¨'¬
Ð 4Ð 4Ð 4È˜ÝÐO 6ÐOÐO¨A¨f¬IÐO°wÐOÀÐOÈÐOÐOÑPÔPÐPÐPùøÝð 3ð 3ð 3ÝÐ1¨aÐ1Ð1Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ñ2øøøøð3øøøà˜*Ò$Ð$Ø×)Ò)¨,Ñ7Ô7Ð7Ñ7Ø˜*Ò$Ð$Ø×)Ò)¨,Ñ7Ô7Ð7Ñ7Ø˜&Ò Ð Ø×%Ò%Ñ'Ô'Ð'Ñ'Ø˜(Ò"Ð"Ø×'Ò'Ñ)Ô)Ð)Ñ)Ø˜,Ò&Ð&Ø×+Ò+¨LÑ9Ô9Ð9Ñ9Ø˜'Ò!Ð!à ×&Ò& t¨QÑ/Ô/ˆEÝ*-¨e©*¬*°qª.¨.�e˜A”h—n’nÑ&Ô&Ð&¸bˆGØð ]ÝÐ2Ñ3Ô3Ð3Ñ3àÔ#×'Ò'¨Ñ0Ô0Ð0ØÔ&ð ]ÝÐm¸7À3ÀBÀ3¼<ÐmÕRUÐV]ÑR^ÔR^ÐacÒRcÐRcÈÈÐikÐmÐmÑnÔnÐnÑnåÐ[¨°°"°¬Ð[ÅÀGÁÄÈrÒ@QÐ@Q°u°uÐWYÐ[Ð[Ñ\Ô\Ð\Ñ\Ø˜'Ò!Ñ!ð !×&Ò& t¨QÑ/Ô/ˆEÝ*-¨e©*¬*°qª.¨.�e˜A”h—n’nÑ&Ô&Ð&¸bˆGØð xÝÐ2Ñ3Ô3Ð3Ñ3ØÔ$ð x¨¬Ð)?ÅGÈDÌJÐX_ÑD`ÔD`Ð)?ðEØ#œz×/Ò/°Ñ8Ô8�Hð  ð EÝð  !OÐ\cÐdgÐegÐdgÔ\hð  !OÕsvÐw~ÑsÔsð  CEò  tEð  tEÐjoÐjoð  KMð  !Oð  !Oñ  Pô  Pð  Pñ  PåÐ CÑDÔDÐDÑDøõ !ð 6ð 6ð 6ÝÐ4¨sÐ4Ð4Ñ5Ô5Ð5Ð5Ð5Ð5Ð5Ñ5øøøøð6øøøð Ô#×'Ò'¨Ñ0Ô0Ð0ÝÐvÀGÈCÈRÈCÄLÐvÕ[^Ð_fÑ[gÔ[gÐjlÒ[lÐ[lÐRWÐRWÐrtÐvÐvÑwÔwÐwÑwØ˜&Ò Ð Ø×%Ò% lÑ3Ô3Ð3Ñ3Ø˜'Ò!Ð!Ø×&Ò& |Ñ4Ô4Ð4Ñ4Ø˜&Ò Ð Ø×%Ò% lÑ3Ô3Ð3Ñ3ð !—’Ñ(Ô(¨Ô+ˆHØ!œ[Ÿ_š_Ð-=¸rÑBÔBˆNØ�Š˜sÑ#Ô# ~Ð5Ñ5Ø% h§o¢o°cÑ&:Ô&:Ô;�Ø—8’8˜FÑ#Ô# vÒ-Ñ-Ø%Ð%Ð%Ð%Ø#Ÿxšx¨	°2Ñ6Ô6�HØð oðZØ%/§^¢^Ø (°ÀTØ%)°2ð &4ñ &ô &˜Fð &,¤]×%8Ò%8Ñ%:Ô%:Ð%S¸f¼m×>QÒ>QÑ>SÔ>S˜FØ%ð ZØ $× 3Ò 3Õ4HÈÑ4PÔ4PÑ QÔ QÐ QÐ Qà $× 3Ò 3Ð4XÑ YÔ YÐ YùøØ)Ô8ð ^ð ^ð ^Ø ×/Ò/Ð0\Ñ]Ô]Ð]Ð]Ñ]Ý(ð Zð Zð ZØ ×/Ò/Ð0XÐRSÐ0XÐ0XÐ0XÑYÔYÐYÐYÐYÐYÐYÑYøøøøðZøøøð ×+Ò+Ð,mÈÐ,mÐ,mÐ,mÑnÔnÐnÑnØ—X’X˜fÑ%Ô%¨Ò0Ð0Ø!ŸXšX h°Ñ3Ô3×9Ò9Ñ;Ô;�FØð nØ+1×+<Ò+<¸SÑ+AÔ+AÐ!S  À|È6À|À|˜Ø$0µ°X±´°°Ô$@×$FÒ$FÑ$HÔ$H˜	Ø-3Ð*AÐ*A°iÐ*AÐ*A×*GÒ*GÑ*IÔ*I˜Ø#×3Ò3°OÑDÔDÐDà×+Ò+Ð,lÈÐ,lÐ,lÐ,lÑmÔmÐmÑmà×'Ò'ð  )EÀHð  )Eð  )Eð  )Eñ  Fô  Fð  Fñ  Fà—’ Ñ%Ô%Õ)FÑ)HÔ)HÐHÐHØIÐIÐIÐIÐIÐIØ!;Ð!;¸H¿OºOÈCÑ<PÔ<PÑ!QÔ!Q�Ø!ð NØ ,­S°©]¬]¨^¨^Ô <× BÒ BÑ DÔ D�IðNØ!/ °	Ñ!:Ô!:˜Ø!ð 1Ý#¥C¨¡K¤KÑ0Ô0Ð0ùøÝ$ð Nð Nð NÝÐ LÀ1Ð LÅdÐ LÐ LÑMÔMÐMÐMÐMÐMÐMÑMøøøøðNøøøñNð �_Ð,Ð,Ø#/µ°H±´°°Ô#?×#EÒ#EÑ#GÔ#GÐ Ý4ØÐ.¸¼ðñ ô �ð ð ]Ý!0°Ô!:¸6Ô!B�JÝÐ>°*Ð>Ð>Ñ?Ô?Ð?Ý˜tÐ%5Ñ6Ô6ð 5ØÔ+×/Ò/°Ñ4Ô4Ð4ùå‘M”M×'Ò'Ð([ÈhÐ([Ð([Ð([Ñ\Ô\Ð\Ñ\ð
 9Ð8Ð8Ð8Ð8Ð8Ø&Ÿ_š_Ñ.Ô.¨qÔ1�
Ý ™MœM­CµÑ,@Ô,@Ñ@�	ØLÐLÐLÐL iÐLÑLÔL�Ý�w‘<”< !Ò#Ð#àCÐCÐCÐC¨ÐCÑCÔC�EÝ˜5‘z”z Q’�Ø"'˜˜õ #&Ð%>Ð%>°gÐ%>Ñ%>Ô%>Ñ">Ô">˜Ø#LÐ#LÐ#LÐ#L¨wÐ#LÑ#LÔ#L˜Ý˜x™=œ=¨AÒ-Ð-Ø&.˜GÝ�w‘<”< 1Ò$Ð$ð
 !(¨¤
�IØ  JÒ.Ð.åÐ O¸iÐ OÍÐ OÐ OÑPÔPÐPÝ¥4Ð Y­Ð YÐ YÕSWÐ YÐ YÑZÔZÐZÐZà$0×$6Ò$6Ñ$8Ô$8½¸Z¹¼Ð9IÐ9IÔ$J˜	Ø#,¨yÑ#8˜Ø#×3Ò3°HÑ=Ô=Ð=Ý˜‘\”\ AÒ%Ð%Ý�wÐLÐL¸9ÐLÅdÐLÐLÑMÔMÐMÝ�tÐVÐV°4·9²9½VÀG¹_¼_Ñ3MÔ3MÐVÐVÕPTÐVÐVÑWÔWÐWÐWåÐK¸)ÐKÅTÐKÐKÑLÔLÐLÝ�tÐU¥WÐUÐUÍtÐUÐUÑVÔVÐVàˆts:  Ê.L Ê?$K$ Ë#L Ë$K3Ë0L Ë2K3Ë3L Ì
L"Ì!L"Í	N/ Í$M? Í>N/ Í?NÎN/ ÎNÎN/ Î/
N=Î<N=Ð3Q Ñ
Q7ÑQ2Ñ2Q7Ò-AS1 Ó1
TÓ;TÔTÞ:_ß_ ß#_ ç,hèhèhè?E	n
 î

n1în,î,n1ö+x ø
x2øx-ø-x2ý8BA@  Á@ AAÁ@"	AAÁ@+AA
ÁA
AAÁG)AG7 ÁG7
AH%ÁHAH ÁH AH%c           	      ó°  ‡ ‡‡‡‡— |                      ¦   «                              d¬¦  «        }t          |¦  «        dk     s|d                               ¦   «         s/t          d¦  «         t          d¦  «         t          d¦  «         dS |d                               ¦   «         Š‰ xj        dz  c_        ‰ j        Šdt          j        ¦   «                              d	¦  «        › d
t          j	        ¦   «         j
        dd…         › �Š‰                      ¦   «         st          d¦  «         dS t          d‰› d‰dd…         › t          ‰¦  «        dk    rdnd› d�¦  «         t          d‰› �¦  «         t          d¦  «         ‰                      ‰¦  «        Šˆˆ ˆˆˆfd„}t          j        |dd‰› �¬¦  «        }|‰ j        ‰<   |                     ¦   «          dS )u  Handle /background <prompt> â€” run a prompt in a separate background session.

        Spawns a new AIAgent in a background thread with its own session.
        When it completes, prints the result to the CLI without modifying
        the active session's conversation history.
        r  r"  r�  z  Usage: /background <prompt>z9  Example: /background Summarize the top HN stories todayzI  The task runs in a separate session and results display here when done.NÚbg_ú%H%M%Srg  rf  z;  (>_<) Cannot start background task: no valid credentials.u     ðŸ”„ Background task #z started: "rÂ   rÏ  r:   r~  z  Task ID: u?     You can continue chatting â€” results will appear when done.
c                  ó$  •— t          ‰j        ¦  «         t          ‰j        ¦  «         	 t	          ‰j        ¦  «         n# t          $ r Y nw xY w	 t          dGi d‰d         “d‰d                              d¦  «        “d‰d                              d¦  «        “d‰d                              d¦  «        “d‰d                              d¦  «        “d‰d                              d¦  «        “d	‰d                              d
¦  «        “d‰j	        “d‰j
        “dd“dd“d‰“dd“d‰j        “d‰j        “d‰j        “d‰                     d¦  «        “d‰j        “d‰j        “d‰j        “d‰j        “d‰j        “d‰j        “d‰j        “Ž} d„ | _        d t,          d!d fˆfd"„}|| _        |                      ‰‰¬#¦  «        }|r|                     d$d%¦  «        nd%}|s"|r |                     d&¦  «        rd'|d&         › �}‰j        r-‰j                             ¦   «          t7          j        d(¦  «         t;          ¦   «          t=          ¦   «                              d)t?          ¦   «         › d*d+› d,�¦  «         tA          d-‰› d.�¦  «         tA          d/‰d d0…         › tC          ‰¦  «        d0k    rd1nd%› d2�¦  «         t=          ¦   «                              d)t?          ¦   «         › d*d+› d,�¦  «         |rÊ	 d3d4l"m#}  |¦   «         }| $                    d5d6¦  «        }| %                    d7d8¦  «        }| %                    d9d:¦  «        }n# t          $ r	 d6}d8}d:}Y nw xY wt=          ¦   «         }	|	                     tM          tO          |‰j(        ¬;¦  «        d)|› d<|› d=‰› d>�d?||tR          j*        d@¬A¦  «        ¦  «         ntA          dB¦  «         ‰j+        r=tX          j-         .                    dC¦  «         tX          j-         /                    ¦   «          nn# t          $ ra}
‰j        r-‰j                             ¦   «          t7          j        d(¦  «         t;          ¦   «          tA          dD‰› dE|
› �¦  «         Y d }
~
nd }
~
ww xY w	 t          d ¦  «         t          d ¦  «         t	          d ¦  «         n# t          $ r Y nw xY w‰j0         1                    ‰d ¦  «         ‰j2        sd%‰_3        ‰j        r‰ 4                    d3¬F¦  «         d S d S # 	 t          d ¦  «         t          d ¦  «         t	          d ¦  «         n# t          $ r Y nw xY w‰j0         1                    ‰d ¦  «         ‰j2        sd%‰_3        ‰j        r‰ 4                    d3¬F¦  «         w w xY w)HNrõ   rö   r"  r¾   r¿   r{  r|  r   r}  rø  rú   r~  rR  TrQ  FrŠ  r‹  rc  rõ  rƒ  ré   r9  rT  rU  rV  rW  rX  rY  ra  c                  ó   — d S r\   r]   )Ú_aÚ_kws     rK   r€  zNHermesCLI._handle_background_command.<locals>.run_background.<locals>.<lambda>Î  s   € ¸€ rM   r6   r7   c                 ól   •— ‰j         s)| ‰_        ‰j        r‰j                             ¦   «          d S d S d S r\   )r—  r«  rŒ  rÕ  )r6   r7  s    €rK   Ú_bg_thinkingzRHermesCLI._handle_background_command.<locals>.run_background.<locals>._bg_thinkingÐ  sN   ø€ àÔ.ð 3Ø-1˜Ô*Øœ9ð 3Ø œI×0Ò0Ñ2Ô2Ð2Ð2Ð2ð3ð 3ð3ð 3rM   )r4  r5  Úfinal_responser:   r1  úError: gš™™™™™©?rÞ  r£  rÂ  rU  u     âœ… Background task #z	 completez  Prompt: "rÂ   rÏ  r~  r   r:  rê  rë  rN  ú#CD7F32rì  rí  rd  ú bold]z (background #r¬  Úleft©r  r¶  ©rL  Útitle_alignr   r�  rk  r¡  z  (No response generated)r  u     â�Œ Background task #z	 failed: r  r]   )5r}  Ú_sudo_password_callbackr~  Ú_approval_callbackr  Ú_secret_capture_callbackrv   rr  rT   rä   r~  r‘  rƒ  ré   r…  r†  r‡  r„  rˆ  r‰  rŠ  ro  rU   r\  Úrun_conversationrŒ  rÕ  rÿ  Úsleepr¹  ré  rT  rj  r  r<  r;  r  r=  ro  rf  r@  Úrich_boxÚHORIZONTALSr>  r  r¡  rÁ  r  r¿  rA  r—  r«  rÖ  )Úbg_agentry  r€   Úresponser;  r  ró  Ú_resp_colorÚ
_resp_textÚ_chat_consolerz   r¼  r7  r5  Útask_numÚ
turn_routes              €€€€€rK   Úrun_backgroundz<HermesCLI._handle_background_command.<locals>.run_background«  s5  ø€ Ý& tÔ'CÑDÔDÐDÝ! $Ô"9Ñ:Ô:Ð:ðÝ+¨DÔ,IÑJÔJÐJÐJøÝð ð ð Ø�ðøøøðl5Ý"ð ð ð Ø$ WÔ-Ð-ðà& yÔ1×5Ò5°iÑ@Ô@Ð@ðð (¨	Ô2×6Ò6°zÑBÔBÐBðð (¨	Ô2×6Ò6°zÑBÔBÐBð	ð
 (¨	Ô2×6Ò6°zÑBÔBÐBðð !+¨9Ô 5× 9Ò 9¸)Ñ DÔ DÐ Dðð (¨	Ô2×6Ò6°vÑ>Ô>Ð>ðð $(¤> >ðð &*Ô%:Ð%:ðð  $˜tðð %* Eðð  '˜wðð #˜Uðð  $Ô/Ð/ðð &*Ô%:Ð%:ðð  "&Ô!2Ð!2ð!ð" '1§n¢nÐ5HÑ&IÔ&IÐ&Ið#ð$ '+Ô&:Ð&:ð%ð& '+Ô&<Ð&<ð'ð( %)Ô$9Ð$9ð)ð* #'Ô"5Ð"5ð+ð, 15Ô0MÐ0Mð-ð. .2Ô-KÐ-Kð/ð0 $(Ô#7Ð#7ð1�ð6 &=Ð%<�Ô"ð3¥sð 3¨tð 3ð 3ð 3ð 3ð 3ð 3ð .:�Ô*à!×2Ò2Ø!'Ø#ð 3ñ ô �ð
 @FÐM˜6Ÿ:š:Ð&6¸Ñ;Ô;Ð;È2�Øð ; Fð ;¨v¯zªz¸'Ñ/BÔ/Bð ;Ø:¨°¬Ð:Ð:�Hð
 ”9ð %Ø”I×(Ò(Ñ*Ô*Ð*Ý”J˜tÑ$Ô$Ð$Ý‘”�Ý‘”×#Ò#Ð$G­©¬Ð$GÐ$G¸
Ð$GÐ$GÐ$GÑHÔHÐHÝÐE°(ÐEÐEÐEÑFÔFÐFÝÐY v¨c¨r¨c¤{ÐY½SÀ¹[¼[È2Ò=MÐ=M°E°EÐSUÐYÐYÐYÑZÔZÐZÝ‘”×#Ò#Ð$G­©¬Ð$GÐ$G¸
Ð$GÐ$GÐ$GÑHÔHÐHØð 9ð	/ØJÐJÐJÐJÐJÐJØ / Ñ 1Ô 1˜Ø %× 2Ò 2Ð3CÀ\Ñ RÔ R˜Ø&+§o¢oÐ6GÈÑ&SÔ&S˜Ø%*§_¢_°]ÀIÑ%NÔ%N˜
˜
øÝ$ð /ð /ð /Ø ,˜Ø&/˜Ø%.˜
˜
˜
ð/øøøõ
 %0¡M¤M�MØ!×'Ò'­Ý7¸ÀtÔGcÐdÑdÔdØX +ÐXÐX°UÐXÐXÈ(ÐXÐXÐXØ$*Ø%0Ø(Ý$Ô0Ø &ð)ñ )ô )ñ ô ð ð õ Ð7Ñ8Ô8Ð8ð Ô(ð 'Ý”J×$Ò$ TÑ*Ô*Ð*Ý”J×$Ò$Ñ&Ô&Ð&øøåð Jð Jð Jà”9ð %Ø”I×(Ò(Ñ*Ô*Ð*Ý”J˜tÑ$Ô$Ð$Ý‘”�ÝÐH°(ÐHÐHÀQÐHÐHÑIÔIÐIÐIÐIÐIÐIÐIøøøøðJøøøðÝ.¨tÑ4Ô4Ð4Ý)¨$Ñ/Ô/Ð/Ý/°Ñ5Ô5Ð5Ð5øÝ ð ð ð Ø�DðøøøàÔ&×*Ò*¨7°DÑ9Ô9Ð9àÔ*ð ,Ø)+�DÔ&Ø”9ð 5Ø×$Ò$°!Ð$Ñ4Ô4Ð4Ð4Ð4ð5ð 5øðÝ.¨tÑ4Ô4Ð4Ý)¨$Ñ/Ô/Ð/Ý/°Ñ5Ô5Ð5Ð5øÝ ð ð ð Ø�DðøøøàÔ&×*Ò*¨7°DÑ9Ô9Ð9àÔ*ð ,Ø)+�DÔ&Ø”9ð 5Ø×$Ò$°!Ð$Ñ4Ô4Ð4Ð4ð5øøøs    «A  Á 
AÁAÁJ!P Ë3AM ÍP ÍMÍP ÍMÍB6P ÐT Ð
Q;ÐAQ6Ñ1T Ñ6Q;Ñ;T Ñ?-R- Ò-
R:Ò9R:ÔVÔ	-T7Ô6VÔ7
UÕVÕUÕAVTzbg-task-)rñ  Údaemonr    )rG   r  r  rj  rÀ  r   r  r”  rº  r»  r¼  r3  r<  r¥  ÚThreadr¿  Ústart)	r7  r
  rc   r�  Úthreadr¼  r5  rŽ  r�  s	   `    @@@@rK   rP  z$HermesCLI._handle_background_command�  s  øøøøø€ ð —	’	‘”×!Ò!¨1Ð!Ñ-Ô-ˆÝˆu‰:Œ:˜Š>ˆ>  q¤§¢Ñ!1Ô!1ˆ>ÝÐ3Ñ4Ô4Ð4ÝÐOÑPÔPÐPÝÐ_Ñ`Ô`Ð`ØˆFà�q”—’Ñ!Ô!ˆØÐ%Ô%¨Ñ*Ð%Ô%ØÔ0ˆØR�œ™œ×/Ò/°Ñ9Ô9ÐRÐR½D¼J¹L¼LÔ<LÈRÈaÈRÔ<PÐRÐRˆð ×/Ò/Ñ1Ô1ð 	ÝÐQÑRÔRÐRØˆFåÐs¨8ÐsÐsÀÈÈÈÄÐsÕWZÐ[aÑWbÔWbÐegÒWgÐWgÈeÈeÐmoÐsÐsÐsÑtÔtÐtÝÐ'˜gÐ'Ð'Ñ(Ô(Ð(ÝÐRÑSÔSÐSà×4Ò4°VÑ<Ô<ˆ
ðs	5ð s	5ð s	5ð s	5ð s	5ð s	5ð s	5ð s	5ð s	5õj Ô!¨ÀÐK_ÐV]ÐK_ÐK_Ð`Ñ`Ô`ˆØ*0ˆÔ˜wÑ'Ø�Š‰ŒˆˆˆrM   Úportr�   c                 ó  — ddl }t          |¦  «        }|sdS t          t          dz  ¦  «        }t	          j        |d¬¦  «         |d         }	 |                     |d| › �d|› �d	d
g|j        |j        d¬¦  «         dS # t          $ r Y dS w xY w)a*  Try to launch Chrome/Chromium with remote debugging enabled.

        Uses a dedicated user-data-dir so the debug instance doesn't conflict
        with an already-running Chrome using the default profile.

        Returns True if a launch command was executed (doesn't guarantee success).
        r   NFúchrome-debugT©r¯  z--remote-debugging-port=z--user-data-dir=z--no-first-runz--no-default-browser-check)r¡  rÃ  Ústart_new_session)	rž  r¸   rU   ro   r’   ÚmakedirsÚPopenÚDEVNULLrv   )r•  r�   Ú_spr™   Údata_dirr¨   s         rK   Ú_try_launch_chrome_debugz"HermesCLI._try_launch_chrome_debug$  sØ   € ð 	!Ð Ð Ð å1°&Ñ9Ô9ˆ
àð 	Ø�5õ •| nÑ4Ñ5Ô5ˆÝ
Œ�H tÐ,Ñ,Ô,Ð,à˜A”ˆð	Ø�IŠIàØ5¨tÐ5Ð5Ø1 xÐ1Ð1Ø$Ø0ðð ”{Ø”{Ø"&ð ñ ô ð ð �4øÝð 	ð 	ð 	Ø�5�5ð	øøøs   Á.A> Á>
BÂBc                 ó,  — ddl }|                     ¦   «                              dd¦  «        }t          |¦  «        dk    r,|d                              ¦   «                              ¦   «         nd}d}t
          j                             dd¦  «                             ¦   «         }|                     d¦  «        �rÂ|                     ¦   «                              dd	¦  «        }t          |¦  «        d	k    r|d	                              ¦   «         n|}	 dd
l	m
}	  |	¦   «          n# t          $ r Y nw xY wt          ¦   «          d}
	 t          |                     dd¦  «        d                              d¦  «        d         ¦  «        }
n# t          t           f$ r Y nw xY wddl}d}	 |                     |j        |j        ¦  «        }|                     d¦  «         |                     d|
f¦  «         |                     ¦   «          d}n# t.          |j        f$ r Y nw xY w|rt          d|
› �¦  «         �nª||k    �rŽt          d¦  «         |                      |
|                     ¦   «         ¦  «        }|rÙt7          d¦  «        D ]‘}	 |                     |j        |j        ¦  «        }|                     d¦  «         |                     d|
f¦  «         |                     ¦   «          d} n+# t.          |j        f$ r t9          j        d¦  «         Y ŒŽw xY w|rt          d|
› �¦  «         n´t          d|
› d�¦  «         t          d¦  «         n‘t          d¦  «         t=          t>          dz  ¦  «        }|                     ¦   «         }|dk    rd|› d�}n|dk    rd |› d�}nd!|› d�}t          d"¦  «         t          d#|› �¦  «         nt          d$|
› d%|› �¦  «         |t
          j        d<   	 dd&l	m }  |d'¦  «         n# t          $ r Y nw xY wt          ¦   «          t          d(¦  «         t          d)|› �¦  «         t          ¦   «          tC          | d*¦  «        r| j"         #                    d+¦  «         dS dS |d,k    ræ|r·t
          j         $                    dd¦  «         	 dd-l	m
}	m%}  |d'¦  «          |	¦   «          n# t          $ r Y nw xY wt          ¦   «          t          d.¦  «         t          d/¦  «         t          ¦   «          tC          | d*¦  «        r| j"         #                    d0¦  «         dS dS t          ¦   «          t          d1¦  «         t          ¦   «          dS |dk    �rÁt          ¦   «          |�rt          d2¦  «         t          d)|› �¦  «         d}
	 t          |                     dd¦  «        d                              d¦  «        d         ¦  «        }
n# t          t           f$ r Y nw xY w	 ddl}|                     |j        |j        ¦  «        }|                     d¦  «         |                     d|
f¦  «         |                     ¦   «          t          d3¦  «         n�# t.          t          f$ r t          d4¦  «         Y n_w xY w	 dd5l	m&}  |¦   «         }n# t          $ r d}Y nw xY w|�&t          d6| '                    ¦   «         › d7�¦  «         nt          d8¦  «         t          ¦   «          t          d9¦  «         t          d:¦  «         t          ¦   «          dS t          ¦   «          t          d;¦  «         t          ¦   «          t          d<¦  «         t          d=¦  «         t          d>¦  «         t          ¦   «          dS )?uP   Handle /browser connect|disconnect|status â€” manage live Chrome CDP connection.r   Nr  rý  zhttp://127.0.0.1:9222ÚBROWSER_CDP_URLr:   Úconnectr�  )Úcleanup_all_browsersi$  r‘  r  r�  FrF  Tu+      âœ“ Chrome is already listening on port uI      Chrome isn't running with remote debugging â€” attempting to launch...rá  rÒ   u-      âœ“ Chrome launched and listening on port u       âš  Chrome launched but port z isn't responding yetuL        Try again in a few seconds â€” the debug instance may still be startingu#      âš  Could not auto-launch Chromer—  r¢   zMopen -a "Google Chrome" --args --remote-debugging-port=9222 --user-data-dir="z+" --no-first-run --no-default-browser-checkr£   z9chrome.exe --remote-debugging-port=9222 --user-data-dir="z<google-chrome --remote-debugging-port=9222 --user-data-dir="z     Launch Chrome manually:ú     u      âš  Port z is not reachable at )Ú_ensure_cdp_supervisorr‡   u-   ðŸŒ� Browser connected to live Chrome via CDPz   Endpoint: r™  uJ  [System note: The user has connected your browser tools to their live Chrome browser via Chrome DevTools Protocol. Your browser_navigate, browser_snapshot, browser_click, and other browser tools now control their real browser â€” including any pages they have open, logged-in sessions, and cookies. They likely opened specific sites or logged into services before connecting. Please await their instruction before attempting to operate the browser. When you do act, be mindful that your actions affect their real browser â€” don't close tabs or navigate away from pages without asking.]Ú
disconnect)r£  Ú_stop_cdp_supervisoru*   ðŸŒ� Browser disconnected from live ChromezL   Browser tools reverted to default mode (local headless or cloud provider)z¥[System note: The user has disconnected the browser tools from their live Chrome. Browser tools are back to default mode (headless local browser or cloud provider).]zDBrowser is not connected to live Chrome (already using default mode)u.   ðŸŒ� Browser: connected to live Chrome via CDPu      Status: âœ“ reachableu8      Status: âš  not reachable (Chrome may not be running))Ú_get_cloud_provideru   ðŸŒ� Browser: z (cloud)u5   ðŸŒ� Browser: local headless Chromium (agent-browser)u8      /browser connect      â€” connect to your live Chromeu.      /browser disconnect   â€” revert to defaultz)Usage: /browser connect|disconnect|statuszA   connect      Connect browser tools to your live Chrome sessionz1   disconnect   Revert to default browser backendz)   status       Show current browser mode)(r‹  rG   r  r  rŒ   r’   rµ   rT   rÅ  Útools.browser_toolr£  rv   r¹  rô  Úrsplitr¦  r(  ÚsocketÚAF_INETÚSOCK_STREAMÚ
settimeoutr¢  ÚcloserÆ  rÆ   rŸ  r�   r  rÿ  r†  rU   ro   r¥  r•  r™  rD  rA  r§  r¨  Úprovider_name)r7  r
  Ú_platrc   rD   Ú_DEFAULT_CDPr  Úconnect_partsÚcdp_urlr£  Ú_portr«  Ú_already_openrê  Ú	_launchedÚ_waitÚ	_data_dirÚsys_nameÚ
chrome_cmdr¥  r§  r¨  r¿   s                          rK   rN  z!HermesCLI._handle_browser_commandJ  sß  € à Ð Ð Ð à—	’	‘”×!Ò! $¨Ñ*Ô*ˆÝ*-¨e©*¬*°qª.¨.ˆe�AŒh�nŠnÑÔ×$Ò$Ñ&Ô&Ð&¸hˆà.ˆÝ”*—.’.Ð!2°BÑ7Ô7×=Ò=Ñ?Ô?ˆà�>Š>˜)Ñ$Ô$ñ q	àŸIšI™KœK×-Ò-¨d°AÑ6Ô6ˆMÝ25°mÑ2DÔ2DÀqÒ2HÐ2H�m AÔ&×,Ò,Ñ.Ô.Ð.ÈlˆGðØCÐCÐCÐCÐCÐCØ$Ð$Ñ&Ô&Ð&Ð&øÝð ð ð Ø�ðøøøõ ‰GŒGˆGð ˆEðÝ˜GŸNšN¨3°Ñ2Ô2°2Ô6×<Ò<¸SÑAÔAÀ!ÔDÑEÔE��øÝ¥
Ð+ð ð ð Ø�ðøøøð ˆMˆMˆMØ!ˆMðØ—M’M &¤.°&Ô2DÑEÔE�Ø—’˜Q‘”�Ø—	’	˜;¨Ð.Ñ/Ô/Ð/Ø—’‘	”	�	Ø $��øÝ˜Vœ^Ð,ð ð ð Ø�ðøøøð ð 2LÝÐKÀEÐKÐKÑLÔLÐLÑLØ˜LÒ(Ñ(åÐaÑbÔbÐbØ ×9Ò9¸%ÀÇÂÁÄÑPÔP�	Øð *0å!& r¡¤ð 	,ð 	,˜ð,Ø &§¢¨f¬n¸fÔ>PÑ QÔ Q˜AØŸLšL¨™OœO˜OØŸIšI {°EÐ&:Ñ;Ô;Ð;ØŸGšG™IœI˜IØ,0˜MØ!˜EøÝ '¨¬Ð8ð ,ð ,ð ,Ý œJ s™OœO˜O˜O˜Oð,øøøà$ð nÝÐUÈeÐUÐUÑVÔVÐVÐVåÐ]ÀÐ]Ð]Ð]Ñ^Ô^Ð^ÝÐlÑmÔmÐmÐmåÐ?Ñ@Ô@Ð@å #¥L°>Ñ$AÑ BÔ B�IØ$Ÿ|š|™~œ~�HØ 8Ò+Ð+ðIà1:ðIð Ið Ið #˜
ð " YÒ.Ð.ðJØ1:ðJð Jð Jð #˜
ðJØ1:ðJð Jð Jð #õ
 Ð9Ñ:Ô:Ð:ÝÐ. *Ð.Ð.Ñ/Ô/Ð/Ð/åÐJ UÐJÐJÀÐJÐJÑKÔKÐKà,3�BŒJÐ(Ñ)ðØEÐEÐEÐEÐEÐEØ&Ð& yÑ1Ô1Ð1Ð1øÝð ð ð Ø�ðøøøå‰GŒGˆGÝÐAÑBÔBÐBÝÐ+ 'Ð+Ð+Ñ,Ô,Ð,Ý‰GŒGˆGõ �tÐ-Ñ.Ô.ð 	ØÔ#×'Ò'ðTñô ð ð ð ð	ð 	ð �LÒ Ð Øð Ý”
—’Ð0°$Ñ7Ô7Ð7ðØ]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ø(Ð(¨Ñ3Ô3Ð3Ø(Ð(Ñ*Ô*Ð*Ð*øÝ ð ð ð Ø�Dðøøøå‘”�ÝÐBÑCÔCÐCÝÐdÑeÔeÐeÝ‘”�å˜4Ð!1Ñ2Ô2ð ØÔ'×+Ò+ðnñô ð ð ð ðð õ ‘”�ÝÐ\Ñ]Ô]Ð]Ý‘”���à�HŠ_‰_Ý‰GŒGˆGØñ SÝÐFÑGÔGÐGÝÐ/ gÐ/Ð/Ñ0Ô0Ð0à�ðÝ §¢¨s°AÑ 6Ô 6°rÔ :× @Ò @ÀÑ EÔ EÀaÔ HÑIÔI�E�EøÝ"¥JÐ/ð ð ð Ø�DðøøøðVØ!�M�M�MØŸš f¤n°fÔ6HÑIÔI�AØ—L’L ‘O”O�OØ—I’I˜{¨EÐ2Ñ3Ô3Ð3Ø—G’G‘I”I�IÝÐ4Ñ5Ô5Ð5Ð5øÝ¥Ð+ð Vð Vð VÝÐTÑUÔUÐUÐUÐUðVøøøð$ØFÐFÐFÐFÐFÐFØ2Ð2Ñ4Ô4�H�HøÝ ð $ð $ð $Ø#�H�H�Hð$øøøð Ð'ÝÐM¨8×+AÒ+AÑ+CÔ+CÐMÐMÐMÑNÔNÐNÐNåÐQÑRÔRÐRÝ‰GŒGˆGÝÐLÑMÔMÐMÝÐBÑCÔCÐCÝ‰GŒGˆGˆGˆGõ ‰GŒGˆGÝÐ=Ñ>Ô>Ð>Ý‰GŒGˆGÝÐUÑVÔVÐVÝÐEÑFÔFÐFÝÐ=Ñ>Ô>Ð>Ý‰GŒGˆGˆGˆGs§   ÄD! Ä!
D.Ä-D.ÅAF ÆFÆFÆ#A"H ÈHÈHÊA"K)Ë)%LÌLÏ-O? Ï?
PÐPÒ#S Ó
SÓSÖ"AW% ×%W9×8W9×=A3Y1 Ù1 ZÚZÚZ) Ú)Z8Ú7Z8c                 óÞ  — 	 ddl m}m}m} n # t          $ r t          d¦  «         Y dS w xY w|                     ¦   «                              d¬¦  «        }t          |¦  «        dk     s|d                              ¦   «         sº |¦   «         } |¦   «         }t          d|› �¦  «         t          d	¦  «         |D ]R}|d
         |k    rdnd}	|d         dk    rd|d         › d�nd}
t          d|	› d|d
         › |
› d|d         › �¦  «         ŒSt          d¦  «         t          dt          ¦   «         › d�¦  «         dS |d                              ¦   «          
                    ¦   «         }d„  |¦   «         D ¦   «         }||vrFt          d|› �¦  «         t          dd                     t          |¦  «        ¦  «        › �¦  «         dS  ||¦  «         t                               ¦   «          t                               ¦   «          t!          d|¦  «        rt          d|› d�¦  «         nt          d|› �¦  «         t          d ¦  «         |                      ¦   «         rt          d!¦  «         dS dS )"u8   Handle /skin [name] â€” show or change the display skin.r   )Ú
list_skinsÚset_active_skinÚget_active_skin_namezSkin engine not available.Nr  r"  r�  z
  Current skin: z  Available skins:r    u    â—�r8  r  rK  rŠ  r:  r:   r¥  r‚  r'  r=  z
  Usage: /skin <name>z$  Custom skins: drop a YAML file in z/skins/
c                 ó   — h | ]
}|d          ’ŒS )r    r]   )rW   rê  s     rK   ú	<setcomp>z1HermesCLI._handle_skin_command.<locals>.<setcomp>  s   € Ð5Ð5Ð5 1�Q�v”YÐ5Ð5Ð5rM   z  Unknown skin: z  Available: rT  zdisplay.skinz  Skin set to: z (saved)z8  Note: banner colors will update on next session start.z  Prompt + TUI colors updated.)r<  r½  r¾  r¿  r¯  r¹  rG   r  r  r,   rŒ   rb   rv  rñ  rH  r‹  r3  Ú_apply_tui_skin_style)r7  r
  r½  r¾  r¿  rc   r  Úskinsrê  r§  r  Únew_skinrw  s                rK   rQ  zHermesCLI._handle_skin_command  sÒ  € ð	Ø`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ð`øÝð 	ð 	ð 	ÝÐ.Ñ/Ô/Ð/ØˆFˆFð	øøøð —	’	‘”×!Ò!¨1Ð!Ñ-Ô-ˆÝˆu‰:Œ:˜Š>ˆ>  q¤§¢Ñ!1Ô!1ˆ>à*Ð*Ñ,Ô,ˆGØ�J‘L”LˆEÝÐ0 wÐ0Ð0Ñ1Ô1Ð1ÝÐ&Ñ'Ô'Ð'Øð Qð Q�Ø#$ V¤9°Ò#7Ð#7˜˜¸T�Ø01°(´¸vÒ0EÐ0EÐ,˜a œkÐ,Ð,Ð,Ð,È2�ÝÐO˜FÐOÐO Q v¤YÐO°ÐOÐO¸Q¸}Ô=MÐOÐOÑPÔPÐPÐPÝÐ+Ñ,Ô,Ð,ÝÐYÕ9LÑ9NÔ9NÐYÐYÐYÑZÔZÐZØˆFà˜”8—>’>Ñ#Ô#×)Ò)Ñ+Ô+ˆØ5Ð5¨
¨
©¬Ð5Ñ5Ô5ˆ	Ø˜9Ð$Ð$ÝÐ/ XÐ/Ð/Ñ0Ô0Ð0ÝÐ@ $§)¢)­F°9Ñ,=Ô,=Ñ">Ô">Ð@Ð@ÑAÔAÐAØˆFàˆ˜Ñ!Ô!Ð!Ý�Š‰ŒˆÝ�
Š
‰ŒˆÝ˜^¨XÑ6Ô6ð 	0ÝÐ6 HÐ6Ð6Ð6Ñ7Ô7Ð7Ð7åÐ. HÐ.Ð.Ñ/Ô/Ð/ÝÐHÑIÔIÐIØ×%Ò%Ñ'Ô'ð 	4ÝÐ2Ñ3Ô3Ð3Ð3Ð3ð	4ð 	4s   ‚
 �*©*c                 óR  — g d¢}	 |                      | j        ¦  «        }n# t          $ r d}Y nw xY w||dz   t          |¦  «        z           | _        | j        dk    | _        | j        rA| j        | j        _        | j         | j        _        |                      ¦   «         | j        _	        ddl
m} |j        › d|j        › d�|j        › d	|j        › d
�|j        › d|j        › d�|j        › |j        › d|j        › d�dœ}t#          |                     | j        d¦  «        ¦  «         dS )uB   Cycle tool progress mode: off â†’ new â†’ all â†’ verbose â†’ off.)r„   r  r=  rå   r�  r  rå   r   ©ÚColorszTool progress: OFFu*    â€” silent mode, just the final response.zTool progress: NEWu'    â€” show each new tool (skip repeats).zTool progress: ALLu    â€” show every tool call.zTool progress: VERBOSEu6    â€” full args, results, think blocks, and debug logs.r:   N)r„  rj  r¦  r  rå   rþ   rQ  rR  r€  r[  Úhermes_cli.colorsrÇ  ÚDIMÚRESETÚYELLOWÚGREENÚBOLDrj  rT   )r7  Úcycler¹  Ú_ColorsÚlabelss        rK   rE  zHermesCLI._toggle_verbose0  ss  € à0Ð0Ð0ˆð	Ø—+’+˜dÔ5Ñ6Ô6ˆCˆCøÝð 	ð 	ð 	ØˆCˆCˆCð	øøøà"'¨¨q©µC¸±J´JÑ(>Ô"?ˆÔØÔ.°)Ò;ˆŒàŒ:ð 	OØ)-¬ˆDŒJÔ&Ø(,¬Ð$4ˆDŒJÔ!Ø,0×,LÒ,LÑ,NÔ,NˆDŒJÔ)ð 	8Ð7Ð7Ð7Ð7Ð7à”kÐnÐn°W´]ÐnÐnÐnØ”nÐnÐn¸¼ÐnÐnÐnØ”mÐ`Ð`°w´}Ð`Ð`Ð`Ø!œ,ð  S¨¬ð  Sð  SÈWÌ]ð  Sð  Sð  Sð	
ð 
ˆõ 	�—
’
˜4Ô2°BÑ7Ô7Ñ8Ô8Ð8Ð8Ð8s   †! ¡0¯0c                 óV  — ddl }ddlm} t          |j                             d¦  «        ¦  «        }|rD|j                             dd¦  «         t          d|j        › |j	        › d|j
        › d�¦  «         dS d|j        d<   t          d	|j        › |j        › d
|j
        › d�¦  «         dS )uA   Toggle YOLO mode â€” skip all dangerous command approval prompts.r   NrÆ  ÚHERMES_YOLO_MODEu     âš  YOLO mode ÚOFFu.    â€” dangerous commands will require approval.r   u     âš¡ YOLO mode ÚONu2    â€” all commands auto-approved. Use with caution.)r’   rÈ  rÇ  ræ  rµ   rT   rA  rj  rÍ  ÚREDrÊ  rÌ  )r7  r’   rÏ  r  s       rK   rF  zHermesCLI._toggle_yoloL  s  € àˆ	ˆ	ˆ	Ø7Ð7Ð7Ð7Ð7Ð7å�r”z—~’~Ð&8Ñ9Ô9Ñ:Ô:ˆØð 	ØŒJ�NŠNÐ-¨tÑ4Ô4Ð4ÝðA 7¤<ð A°´ð Að AÀÄð Að Að Añô ð ð ð ð
 .1ˆBŒJÐ)Ñ*ÝðE 7¤<ð E°´ð Eð EÀ'Ä-ð Eð Eð Eñô ð ð ð rM   c                 ó–  — |                      ¦   «                              d¬¦  «        }t          |¦  «        dk     rª| j        }|€d}n0|                     d¦  «        du rd}n|                     d	d
¦  «        }| j        rdnd}t          dt          › d|› t          › �¦  «         t          dt          › d|› t          › �¦  «         t          dt          › dt          › �¦  «         dS |d                               ¦   «          
                    ¦   «         }|dv r|d| _        | j        r|                      ¦   «         | j        _        t          dd¦  «         t          dt          › dt          › �¦  «         t          dt          › dt          › �¦  «         dS |dv r]d| _        | j        r|                      ¦   «         | j        _        t          dd¦  «         t          dt          › dt          › �¦  «         dS t          |¦  «        }|€at          dt          › d|› t          › �¦  «         t          dt          › dt          › �¦  «         t          dt          › dt          › �¦  «         dS || _        d| _        t          d|¦  «        r$t          dt          › d|› dt          › �¦  «         dS t          dt          › d|› dt          › �¦  «         dS )u£  Handle /reasoning â€” manage effort level and display toggle.

        Usage:
            /reasoning              Show current effort level and display state
            /reasoning <level>      Set reasoning effort (none, minimal, low, medium, high, xhigh)
            /reasoning show|on      Show model thinking/reasoning in output
            /reasoning hide|off     Hide model thinking/reasoning from output
        r  r"  r�  Nzmedium (default)rÓ   Fznone (disabled)r|   Úmediumu   on âœ“r„   r8  zReasoning effort:  zReasoning display: z@Usage: /reasoning <none|minimal|low|medium|high|xhigh|show|hide>)Úshowr‰   Tzdisplay.show_reasoningu!   âœ“ Reasoning display: ON (saved)z>  Model thinking will be shown during and after each response.)Úhider„   u"   âœ“ Reasoning display: OFF (saved)ú(._.) Unknown argument: z5Valid levels: none, minimal, low, medium, high, xhighzDisplay:      show, hidezagent.reasoning_effortu   âœ“ Reasoning effort set to 'r¸  r¹  )rG   r  r  rƒ  rT   rï   rj  rñ  rŒ  r‹  rŒ   rþ   r€  r[  r3  r�   )r7  r
  rc   ÚrcÚlevelÚdisplay_stater%  r˜  s           rK   rG  z#HermesCLI._handle_reasoning_command_  s  € ð —	’	‘”×!Ò!¨1Ð!Ñ-Ô-ˆåˆu‰:Œ:˜Š>ˆ>àÔ&ˆBØˆzØ*��Ø—’˜	Ñ"Ô" eÐ+Ð+Ø)��àŸš˜x¨Ñ2Ô2�Ø(,Ô(;ÐF˜H˜HÀˆMÝÐB�ÐBÐB°UÐB½DÐBÐBÑCÔCÐCÝÐJ�ÐJÐJ°]ÐJÅDÐJÐJÑKÔKÐKÝÐe�ÐeÐeÕ_cÐeÐeÑfÔfÐfØˆFà�AŒh�nŠnÑÔ×$Ò$Ñ&Ô&ˆð �.Ð Ð Ø"&ˆDÔØŒzð SØ04×0PÒ0PÑ0RÔ0R�”
Ô-ÝÐ6¸Ñ=Ô=Ð=ÝÐI�ÐIÐIÅ4ÐIÐIÑJÔJÐJÝÐc�ÐcÐcÕ]aÐcÐcÑdÔdÐdØˆFØ�/Ð!Ð!Ø"'ˆDÔØŒzð SØ04×0PÒ0PÑ0RÔ0R�”
Ô-ÝÐ6¸Ñ>Ô>Ð>ÝÐJ�ÐJÐJÅDÐJÐJÑKÔKÐKØˆFõ )¨Ñ-Ô-ˆØˆ>ÝÐB�ÐBÐB°sÐB½DÐBÐBÑCÔCÐCÝÐZ�ÐZÐZÕTXÐZÐZÑ[Ô[Ð[ÝÐ=�Ð=Ð=µtÐ=Ð=Ñ>Ô>Ð>ØˆFà &ˆÔØˆŒ
åÐ5°sÑ;Ô;ð 	\ÝÐ]�Ð]Ð]¸sÐ]Ð]ÕW[Ð]Ð]Ñ^Ô^Ð^Ð^Ð^åÐZ�ÐZÐZ¸sÐZÐZÕTXÐZÐZÑ[Ô[Ð[Ð[Ð[rM   c                 ó¸  — |                      ¦   «                              d¬¦  «        }t          |¦  «        dk     s0|d                               ¦   «                              ¦   «         dk    rut	          dt
          › d| j        › t          › �¦  «         t	          dt          › d| j        dk    rd	nd
› t          › �¦  «         t	          dt          › dt          › �¦  «         dS |d                               ¦   «                              ¦   «         }|dvrBt	          dt          › d|› t          › �¦  «         t	          dt          › dt          › �¦  «         dS || _        t          d|¦  «        rN|dk    rdnd}t	          dt
          › d|› dt          › �¦  «         t	          dt          › |› t          › �¦  «         dS t	          dt
          › d|› dt          › �¦  «         dS )uw  Handle /busy â€” control what Enter does while Hermes is working.

        Usage:
            /busy               Show current busy input mode
            /busy status        Show current busy input mode
            /busy queue         Queue input for the next turn instead of interrupting
            /busy interrupt     Interrupt the current run on Enter (default)
        r  r"  r�  rý  r8  zBusy input mode: zEnter while busy: r?  zqueues for next turnzinterrupts current runz%Usage: /busy [queue|interrupt|status]N>   r?  rì   rÚ  zdisplay.busy_input_modez6Enter will queue follow-up input while Hermes is busy.z:Enter will interrupt the current run while Hermes is busy.u   âœ“ Busy input mode set to 'r¸  r¹  )
rG   r  r  rŒ   rj  rñ  rñ   rŒ  r‹  r3  )r7  r
  rc   r%  Úbehaviors        rK   rS  zHermesCLI._handle_busy_commandœ  s$  € ð —	’	‘”×!Ò!¨1Ð!Ñ-Ô-ˆÝˆu‰:Œ:˜Š>ˆ>˜U 1œXŸ^š^Ñ-Ô-×3Ò3Ñ5Ô5¸ÒAÐAÝÐO�ÐOÐO°4Ô3GÐOÍÐOÐOÑPÔPÐPÝð  Q�ð  Qð  QÈ4ÔK_ÐcjÒKjÐKjÐ1GÐ1Gð  qIð  Qõ  KOð  Qð  Qñ  Rô  Rð  RÝÐJ�ÐJÐJÅDÐJÐJÑKÔKÐKØˆFà�AŒh�nŠnÑÔ×$Ò$Ñ&Ô&ˆØÐ,Ð,Ð,ÝÐB�ÐBÐB°sÐB½DÐBÐBÑCÔCÐCÝÐJ�ÐJÐJÅDÐJÐJÑKÔKÐKØˆFà"ˆÔÝÐ6¸Ñ<Ô<ð 	[ØSVÐZaÒSaÐSaÐOÐOð  hdˆHÝÐ\�Ð\Ð\¸cÐ\Ð\ÕVZÐ\Ð\Ñ]Ô]Ð]ÝÐ/�Ð/˜xÐ/­Ð/Ð/Ñ0Ô0Ð0Ð0Ð0åÐY�ÐYÐY¸cÐYÐYÕSWÐYÐYÑZÔZÐZÐZÐZrM   c           
      óf  — |                       ¦   «         st          d¦  «         dS 	 ddlm} t	          | dd¦  «        }t	          |dd¦  «        pt	          | dd¦  «        } ||¦  «        rdnd}n# t
          $ r d	}Y nw xY w|                     ¦   «                              d
¬¦  «        }t          |¦  «        dk     s0|d
                              ¦   «          	                    ¦   «         dk    rS| j
        dk    rdnd}t          dt          › |› d|› t          › �¦  «         t          dt          › dt          › �¦  «         dS |d
                              ¦   «          	                    ¦   «         }|dv rd| _
        d}	d}
nR|dv rd| _
        d}	d}
nBt          dt          › d|› t          › �¦  «         t          dt          › dt          › �¦  «         dS d| _        t          d|	¦  «        r't          dt          › d|› d|
› dt          › �¦  «         dS t          dt          › d|› d|
› dt          › �¦  «         dS )uU   Handle /fast â€” toggle fast mode (OpenAI Priority Processing / Anthropic Fast Mode).zv  (._.) /fast is only available for models that support fast mode (OpenAI Priority Processing or Anthropic Fast Mode).Nr   )Ú_is_anthropic_fast_modelrþ   rõ   zAnthropic Fast ModezPriority Processingz	Fast moder  r"  r�  rý  r‹   rŠ   r†   r8  r—  z!Usage: /fast [normal|fast|status]>   r‰   rŠ   ÚFAST>   r„   r†   ÚNORMALrÚ  zagent.service_tieru   âœ“ z set to z (saved to config)z (session only))re  rj  ro  rá  r–  rv   rG   r  r  rŒ   ré   rñ  rŒ  r‹  rþ   r3  )r7  r
  rá  rþ   rõ   Úfeature_namerc   rý  r%  Úsaved_valueró  s              rK   rH  zHermesCLI._handle_fast_commandº  s¥  € à×+Ò+Ñ-Ô-ð 	Ýð  Mñ  Nô  Nð  NØˆFð	'ØBÐBÐBÐBÐBÐBÝ˜D '¨4Ñ0Ô0ˆEÝ˜E 7¨DÑ1Ô1ÐQµW¸TÀ7ÈDÑ5QÔ5QˆEØ4LÐ4LÈUÑ4SÔ4SÐnÐ0Ð0ÐYnˆLˆLøÝð 	'ð 	'ð 	'Ø&ˆLˆLˆLð	'øøøð —	’	‘”×!Ò!¨1Ð!Ñ-Ô-ˆÝˆu‰:Œ:˜Š>ˆ>˜U 1œXŸ^š^Ñ-Ô-×3Ò3Ñ5Ô5¸ÒAÐAØ#Ô0°JÒ>Ð>�V�VÀHˆFÝÐ@�Ð@ ,Ð@Ð@°&Ð@½$Ð@Ð@ÑAÔAÐAÝÐF�ÐFÐFÅÐFÐFÑGÔGÐGØˆFà�AŒh�nŠnÑÔ×$Ò$Ñ&Ô&ˆà�.Ð Ð Ø *ˆDÔØ ˆKØˆEˆEØÐ%Ð%Ð%Ø $ˆDÔØ"ˆKØˆEˆEåÐB�ÐBÐB°sÐB½DÐBÐBÑCÔCÐCÝÐF�ÐFÐFÅÐFÐFÑGÔGÐGØˆFàˆŒ
ÝÐ1°;Ñ?Ô?ð 	ZÝÐ[�Ð[Ð[ lÐ[Ð[¸EÐ[Ð[ÕUYÐ[Ð[Ñ\Ô\Ð\Ð\Ð\åÐX�ÐXÐX lÐXÐX¸EÐXÐXÕRVÐXÐXÑYÔYÐYÐYÐYs   §AA0 Á0A?Á>A?c                 ól   — |sdS t          | dd¦  «        |z   | _        |                      d¬¦  «         dS )zCCallback for intermediate reasoning display during tool-call loops.Nrs  r:   Frz  )r–  rs  r{  )r7  r�  s     rK   r  zHermesCLI._on_reasoningå  sG   € àð 	ØˆFÝ&-¨dÐ4LÈbÑ&QÔ&QÐTbÑ&bˆÔ#Ø×%Ò%¨EÐ%Ñ2Ô2Ð2Ð2Ð2rM   r:   c           
      ó  — | j         rt          | j         ¦  «        dk     rt          d¦  «         dS | j        st          d¦  «         dS | j        j        st          d¦  «         dS d}|rU|                     ¦   «                              dd¦  «        }t          |¦  «        dk    r|d                              ¦   «         }t          | j         ¦  «        }|                      d¦  «        5  	 d	d
lm	} d	dl
m} t          | j         ¦  «        } ||¦  «        }|rt          d|› d|d›d|› d�¦  «         nt          d|› d|d›d�¦  «         | j                             || j        j        pd||pd¬¦  «        \  }	}
|	| _         t          | j        dd¦  «        r-| j        j        | j        k    r| j        j        | _        d| _         || j         ¦  «        } ||| j         ||¦  «        }|d         rdnd}t          d|› d|d         › �¦  «         t          d|d         › �¦  «         |d         rt          d|d         › �¦  «         n)# t$          $ r}t          d|› �¦  «         Y d}~nd}~ww xY wddd¦  «         dS # 1 swxY w Y   dS )aZ  Manually trigger context compression on the current conversation.

        Accepts an optional focus topic: ``/compress <focus>`` guides the
        summariser to preserve information related to *focus* while being
        more aggressive about discarding everything else.  Inspired by
        Claude Code's ``/compact <focus>`` feature.
        r¶  zE(._.) Not enough conversation to compress (need at least 4 messages).Nú.(._.) No active agent -- send a message first.z((._.) Compression is disabled in config.r:   r  zCompressing context...r   )Úestimate_messages_tokens_rough)Úsummarize_manual_compressionu   ðŸ—œï¸�  Compressing z messages (~r'  z tokens), focus: "z"...z tokens)...)Úapprox_tokensÚfocus_topicrŠ  Únoopu   ðŸ—œï¸�u   âœ…r8  r‚  Úheadliner¤  Ú
token_lineÚnoteu     â�Œ Compression failed: )r�  r  r¹  rþ   Úcompression_enabledrG   r  r  Úagent.model_metadataré  Ú!agent.manual_compression_feedbackrê  ra   Ú_compress_contextÚ_cached_system_promptr–  rŠ  r“  rv   )r7  r   rì  rc   Úoriginal_countré  rê  Úoriginal_historyrë  Ú
compressedrg  Ú
new_tokensÚsummaryÚiconrz   s                  rK   rI  zHermesCLI._manual_compressì  s�  € ð Ô(ð 	­C°Ô0IÑ,JÔ,JÈQÒ,NÐ,NÝÐYÑZÔZÐZØˆFàŒzð 	ÝÐBÑCÔCÐCØˆFàŒzÔ-ð 	ÝÐ<Ñ=Ô=Ð=ØˆFð ˆØð 	/Ø ×&Ò&Ñ(Ô(×.Ò.¨t°QÑ7Ô7ˆEÝ�5‰zŒz˜AŠ~ˆ~Ø# AœhŸnšnÑ.Ô.�å˜TÔ6Ñ7Ô7ˆØ×ÒÐ 8Ñ9Ô9ð -	8ð -	8ð,8ØOÐOÐOÐOÐOÐOØZÐZÐZÐZÐZÐZÝ#'¨Ô(AÑ#BÔ#BÐ Ø >Ð >Ð?OÑ PÔ P�Øð lÝð 9°.ð 9ð 9ÈmÐið 9ð 9Ø&1ð9ð 9ð 9ñ :ô :ð :ð :õ Ðj°.ÐjÐjÈmÐjÐjÐjÐjÑkÔkÐkà $¤
× <Ò <Ø$Ø”JÔ4Ð:¸Ø"/Ø +Ð 3¨tð	 !=ñ !ô !‘�
˜Að -7�Ô)õ ˜DœJ¨°dÑ;Ô;ð/àœ
Ô-°´Ò@Ð@à&*¤jÔ&;�D”OØ*.�DÔ'Ø;Ð;¸DÔ<UÑVÔV�
Ø6Ð6Ø$ØÔ-Ø!Øñ	ô �ð %,¨F¤OÐ>�y�y¸�ÝÐ7˜4Ð7Ð7 '¨*Ô"5Ð7Ð7Ñ8Ô8Ð8ÝÐ5˜g lÔ3Ð5Ð5Ñ6Ô6Ð6Ø˜6”?ð 5ÝÐ3 '¨&¤/Ð3Ð3Ñ4Ô4Ð4øøåð 8ð 8ð 8ÝÐ6°1Ð6Ð6Ñ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7øøøøð8øøøðY-	8ð -	8ð -	8ñ -	8ô -	8ð -	8ð -	8ð -	8ð -	8ð -	8ð -	8ð -	8øøøð -	8ð -	8ð -	8ð -	8ð -	8ð -	8s=   Ã(I;Ã*EIÉI;É
I+ÉI&É!I;É&I+É+I;É;I?ÊI?c                 óP   — ddl m} ddlm}  |ddd¬¦  «        } ||¦  «         dS )	uB   Handle /debug â€” upload debug report + logs and print paste URLs.r   )Úrun_debug_share)ÚSimpleNamespacer�  r%  F)r“  ÚexpirerÀ   N)Úhermes_cli.debugrý  Útypesrþ  )r7  rý  rþ  rø  s       rK   rL  zHermesCLI._handle_debug_command7  sR   € à4Ð4Ð4Ð4Ð4Ð4Ø)Ð)Ð)Ð)Ð)Ð)àˆ S°¸%Ð@Ñ@Ô@ˆØˆ˜ÑÔÐÐÐrM   c           
      óŒ  — | j         st          d¦  «         dS | j         }|j        }|dk    rt          d¦  «         dS |                     ¦   «         }|rA|j        r:ddlm} t          ¦   «          t           ||¦  «        ¦  «         t          ¦   «          t          |dd¦  «        pd}t          |dd¦  «        pd}t          |dd¦  «        pd}t          |d	d¦  «        pd}|j        }	|j	        }
|j
        }|j        }|j        }|j        }|rt          d
||z  d
z  ¦  «        nd}|j        }t!          | j        ¦  «        }t%          |j        t)          ||||¬¦  «        t          |dd¦  «        t          |dd¦  «        ¬¦  «        }t+          t-          j        ¦   «         | j        z
                       ¦   «         ¦  «        }t          d¦  «         t          dd› �¦  «         t          d|j        › �¦  «         t          d|d›�¦  «         t          d|d›�¦  «         t          d|d›�¦  «         t          d|d›�¦  «         t          d|	d›�¦  «         t          d|
d›�¦  «         t          d|d›�¦  «         t          d|d›�¦  «         t          d|d›�¦  «         t          d|j        d›�¦  «         t          d|j        d›�¦  «         |j        �8|j        d k    rd!nd"}t          d#|› d$t;          |j        ¦  «        d%›�¦  «         n2|j        d&k    rt          d#d&d›�¦  «         nt          d#d'd›�¦  «         t          dd› �¦  «         t          d(|d)›d*|d)›d+|d,›d-�¦  «         t          d.|› �¦  «         t          d/|› �¦  «         |j        d0k    rt          d1|j        › �¦  «         t          |dd¦  «        pt          | dd¦  «        }t          |dd¦  «        pt          | dd¦  «        }t          |d2d¦  «        pt          | d2d¦  «        }d}|r�t<          j                              d3¬4¦  «        5 }	 | !                    tD          |||¬5¦  «         #                    d6¬7¦  «        }n## t<          j        j$        tJ          f$ r d}Y nw xY wddd¦  «         n# 1 swxY w Y   d8„ tM          |¦  «        D ¦   «         }|r"t          ¦   «          |D ]}t          |¦  «         Œ| j'        rhtQ          j)        ¦   «          *                    tP          j+        ¦  «         d9D ]3}tQ          j)        |¦  «         *                    tP          j,        ¦  «         Œ4dS tQ          j)        ¦   «          *                    tP          j-        ¦  «         d:D ]3}tQ          j)        |¦  «         *                    tP          j.        ¦  «         Œ4dS );z8Show rate limits (if available) and session token usage.rè  Nr   z,(._.) No API calls made yet in this session.)Úformat_rate_limit_displayrÿ  r   r  r  rÝ  )Úinput_tokensÚoutput_tokensÚcache_read_tokensÚcache_write_tokensr¿   r¾   )r¿   r¾   u     ðŸ“Š Session Token Usager8  rÂ  z  Model:                     z  Input tokens:              z>10,z  Cache read tokens:         z  Cache write tokens:        z  Output tokens:             z  Prompt tokens (total):     z  Completion tokens:         z  Total tokens:              z  API calls:                 z  Session duration:          rá  z  Cost status:              z  Cost source:              Ú	estimatedrµ  r:   z  Total cost:              ú$z>10.4fÚincludedzn/az  Current context:  r'  r  rŠ  rå  z%)z  Messages:         z  Compressions:     rŸ  z(  Note:             Pricing unknown for rö   r  )Úmax_workers©r¾   rö   g      $@©rÆ   c                 ó   — g | ]}d |› �‘ŒS )r8  r]   r†  s     rK   rY   z)HermesCLI._show_usage.<locals>.<listcomp>œ  s   € Ð^Ð^Ð^¨˜˜d˜˜Ð^Ð^Ð^rM   )Úopenaizopenai._base_clientÚhttpxÚhttpcorer4  ÚhpackÚgrpcÚmodal)r{  Ú	run_agentÚtrajectory_compressorr  Ú
hermes_cli)/rþ   r¹  r  Úget_rate_limit_stateÚhas_dataÚagent.rate_limit_trackerr	  r–  r  r  r  r  r	  rý  r  r
  r  r�  r$   rõ   r#   r%   r   r  r�  r  rý  r  Ú
amount_usdr]  Ú
concurrentÚfuturesÚThreadPoolExecutorÚsubmitr'   r€   ÚTimeoutErrorrv   r(   rå   ÚloggingÚ	getLoggerÚsetLevelÚDEBUGÚWARNINGÚINFOÚERROR)r7  rþ   r•  Úrl_stater	  r	  r	  r	  r	  r¼  rž  Útotalr  Úlast_promptr„  r³  r  rt  Úcost_resultrë  r+  r¿   r¾   rö   Úaccount_snapshotÚ_poolÚaccount_linesrÖ  ÚnoisyÚquiet_loggers                                 rK   rJ  zHermesCLI._show_usage?  s  € àŒzð 	ÝÐBÑCÔCÐCØˆFà”
ˆØÔ'ˆà�AŠ:ˆ:ÝÐ@ÑAÔAÐAØˆFð ×-Ò-Ñ/Ô/ˆØð 	˜Ô)ð 	ØJÐJÐJÐJÐJÐJÝ‰GŒGˆGÝÐ+Ð+¨HÑ5Ô5Ñ6Ô6Ð6Ý‰GŒGˆGõ ˜uÐ&<¸aÑ@Ô@ÐEÀAˆÝ Ð'>ÀÑBÔBÐGÀaˆÝ# EÐ+FÈÑJÔJÐOÈaÐÝ$ UÐ,HÈ!ÑLÔLÐQÐPQÐØÔ,ˆØÔ4ˆ
ØÔ*ˆàÔ-ˆ
Ø Ô3ˆØÔ+ˆØ9@ÐG�c�#˜ gÑ-°Ñ3Ñ5Ô5Ð5ÀaˆØ!Ô3ˆå˜Ô1Ñ2Ô2ˆ	Ý)ØŒKÝØ)Ø+Ø"3Ø#5ð	ñ ô õ ˜U J°Ñ5Ô5Ý˜U J°Ñ5Ô5ð

ñ 

ô 

ˆõ *­8¬<©>¬>¸DÔ<NÑ+N×*]Ò*]Ñ*_Ô*_Ñ`Ô`ˆåÐ*Ñ+Ô+Ð+ÝÐ�:ÐÐÑ Ô Ð ÝÐ;¨e¬kÐ;Ð;Ñ<Ô<Ð<ÝÐA¨lÐAÐAÐAÑBÔBÐBÝÐFÐ.?ÐFÐFÐFÑGÔGÐGÝÐGÐ.@ÐGÐGÐGÑHÔHÐHÝÐB¨mÐBÐBÐBÑCÔCÐCÝÐ;¨fÐ;Ð;Ð;Ñ<Ô<Ð<ÝÐ?¨jÐ?Ð?Ð?Ñ@Ô@Ð@ÝÐ:¨eÐ:Ð:Ð:Ñ;Ô;Ð;ÝÐ:¨eÐ:Ð:Ð:Ñ;Ô;Ð;ÝÐ;¨gÐ;Ð;Ð;Ñ<Ô<Ð<ÝÐE¨[Ô-?ÐEÐEÐEÑFÔFÐFÝÐE¨[Ô-?ÐEÐEÐEÑFÔFÐFØÔ!Ð-Ø'Ô.°+Ò=Ð=�S�SÀ2ˆFÝÐ_°Ð_Ð_½¸{Ô?UÑ9VÔ9VÐ_Ð_Ð_Ñ`Ô`Ð`Ð`ØÔ :Ò-Ð-ÝÐ@°
Ð@Ð@Ð@ÑAÔAÐAÐAåÐ;°Ð;Ð;Ð;Ñ<Ô<Ð<ÝÐ�:ÐÐÑ Ô Ð ÝÐO [ÐOÐOÐO°wÐOÐOÐOÀCÐOÐOÐOÐOÑPÔPÐPÝÐ0 YÐ0Ð0Ñ1Ô1Ð1ÝÐ3 \Ð3Ð3Ñ4Ô4Ð4ØÔ Ò*Ð*ÝÐJ¸U¼[ÐJÐJÑKÔKÐKõ ˜5 *¨dÑ3Ô3ÐVµw¸tÀZÐQUÑ7VÔ7VˆÝ˜5 *¨dÑ3Ô3ÐVµw¸tÀZÐQUÑ7VÔ7VˆÝ˜% ¨DÑ1Ô1ÐSµW¸TÀ9ÈdÑ5SÔ5SˆØÐØð 	,ÝÔ#×6Ò6À1Ð6ÑEÔEð ,Èð,Ø',§|¢|Ý+¨XØ!)°7ð (4ñ (ô (÷ ’f T�fÑ*Ô*ð %Ð$øõ #Ô*Ô7½ÐCð ,ð ,ð ,Ø'+Ð$Ð$Ð$ð,øøøð,ð ,ð ,ñ ,ô ,ð ,ð ,ð ,ð ,ð ,ð ,øøøð ,ð ,ð ,ð ,ð _Ð^Õ1KÐL\Ñ1]Ô1]Ð^Ñ^Ô^ˆØð 	Ý‰GŒGˆGØ%ð ð �Ý�d‘”��àŒ<ð 	HÝÔÑÔ×(Ò(­¬Ñ7Ô7Ð7Øtð Cð C�ÝÔ! %Ñ(Ô(×1Ò1µ'´/ÑBÔBÐBÐBðCð Cõ ÔÑÔ×(Ò(­¬Ñ6Ô6Ð6Ø eð Hð H�ÝÔ! ,Ñ/Ô/×8Ò8½¼ÑGÔGÐGÐGðHð Hs6   ÑR'Ñ2Q8Ñ7R'Ñ8RÒR'ÒRÒR'Ò'R+Ò.R+ú	/insightsc                 ó  — |                      ¦   «         }d}d}d}|t          |¦  «        k     r¹||         dk    rb|dz   t          |¦  «        k     rL	 t          ||dz            ¦  «        }n,# t          $ r t	          d||dz            › �¦  «         Y dS w xY w|dz  }n8||         dk    r'|dz   t          |¦  «        k     r||dz            }|dz  }n|dz  }|t          |¦  «        k     °¹	 dd	lm} dd
lm}  |¦   «         } ||¦  «        }	|	 	                    ||¬¦  «        }
t	          |	 
                    |
¦  «        ¦  «         |                     ¦   «          dS # t          $ r}t	          d|› �¦  «         Y d}~dS d}~ww xY w)z7Show usage insights and analytics from session history.r³  Nr  z--daysz  Invalid --days value: r�  z--sourcer   rc  )ÚInsightsEngine)rì  r  z  Error generating insights: )r  r  rô  r¦  r¹  r’  rd  Úagent.insightsr3	  ÚgenerateÚformat_terminalr¯  rv   )r7  r   rc   rì  r  r  rd  r3	  ÚdbÚengineÚreportrz   s               rK   rK  zHermesCLI._show_insights«  sÞ  € ð —’‘”ˆØˆØˆØˆØ•#�e‘*”*ŠnˆnØ�QŒx˜8Ò#Ð#¨¨A©µ°E±
´
Ò(:Ð(:ðÝ˜u Q¨¡Uœ|Ñ,Ô,�D�DøÝ!ð ð ð ÝÐC°U¸1¸q¹5´\ÐCÐCÑDÔDÐDØ�F�Fðøøøð �Q‘��Ø�q”˜ZÒ'Ð'¨A°©EµC¸±J´JÒ,>Ð,>Ø˜q 1™uœ�Ø�Q‘��à�Q‘�ð •#�e‘*”*Šnˆnð
	7Ø.Ð.Ð.Ð.Ð.Ð.Ø5Ð5Ð5Ð5Ð5Ð5à�‘”ˆBØ#�^ BÑ'Ô'ˆFØ—_’_¨$°v�_Ñ>Ô>ˆFÝ�&×(Ò(¨Ñ0Ô0Ñ1Ô1Ð1Ø�HŠH‰JŒJˆJˆJˆJøÝð 	7ð 	7ð 	7ÝÐ5°!Ð5Ð5Ñ6Ô6Ð6Ð6Ð6Ð6Ð6Ð6Ð6øøøøð	7øøøs+   ÁA* Á*%BÂBÃ(A.E Å
E?Å"E:Å:E?c                 ó<  — ddl }d}t          j        ¦   «         }|| j        z
  |k     rdS || _        ddlm}  |¦   «         }|                     ¦   «         sdS 	 |                     ¦   «         j        }n# t          $ r Y dS w xY w|| j
        k    rdS || _
        	 t          |d¬¦  «        5 }|                     |¦  «        pi }ddd¦  «         n# 1 swxY w Y   n# t          $ r Y dS w xY w|                     d¦  «        pi }	|	| j        k    rdS |	| _        t!          ¦   «          t!          d¦  «         t#          j        | j        d	¬
¦  «        }
|
                     ¦   «          |
                     d¬¦  «         |
                     ¦   «         rt!          d¦  «         dS dS )ax  Detect mcp_servers changes in config.yaml and auto-reload MCP connections.

        Called from process_loop every CONFIG_WATCH_INTERVAL seconds.
        Compares config.yaml mtime + mcp_servers section against the last
        known state.  When a change is detected, triggers _reload_mcp() and
        informs the user so they know the tool list has been refreshed.
        r   Nç      @©Úget_config_pathrj   rk   rP  u;   ðŸ”„ MCP server config changed â€” reloading connections...T©rñ  r‘  r³  r	  uL     âš ï¸�  MCP reload timed out (30s). Some servers may not have reconnected.)r;  rÿ  rÔ  Ú_last_config_checkr>  r=	  rp   r  r  rÆ  Ú_config_mtimers   r<  rv   rT   Ú_config_mcp_serversr¹  r¥  r’  rM  r“  rb   Úis_alive)r7  Ú_yamlÚCONFIG_WATCH_INTERVALr  Ú_get_config_pathÚcfg_pathr  rx   Únew_cfgÚnew_mcpÚ_reload_threads              rK   Ú_check_config_mcp_changesz#HermesCLI._check_config_mcp_changesÌ  sC  € ð 	ÐÐÐà #ÐåŒnÑÔˆØ�Ô(Ñ(Ð+@Ò@Ð@ØˆFØ"%ˆÔàIÐIÐIÐIÐIÐIØ#Ð#Ñ%Ô%ˆØ�ŠÑ Ô ð 	ØˆFð	Ø—M’M‘O”OÔ,ˆEˆEøÝð 	ð 	ð 	ØˆFˆFð	øøøð �DÔ&Ò&Ð&ØˆFð #ˆÔð	Ý�h¨Ð1Ñ1Ô1ð 3°QØŸ/š/¨!Ñ,Ô,Ð2°�ð3ð 3ð 3ñ 3ô 3ð 3ð 3ð 3ð 3ð 3ð 3øøøð 3ð 3ð 3ð 3øøåð 	ð 	ð 	ØˆFˆFð	øøøð —+’+˜mÑ,Ô,Ð2°ˆØ�dÔ.Ò.Ð.ØˆFà#*ˆÔ õ 	‰ŒˆÝÐKÑLÔLÐLÝ"Ô)ØÔ#¨Dð
ñ 
ô 
ˆð 	×ÒÑÔÐØ×Ò BÐÑ'Ô'Ð'Ø×"Ò"Ñ$Ô$ð 	bÝÐ`ÑaÔaÐaÐaÐað	bð 	bsH   ÁA2 Á2
B Á?B ÂC Â)CÃC ÃCÃC ÃCÃC Ã
C'Ã&C'c                 ót  — 	 ddl m}m}m}m} |5  t          |                     ¦   «         ¦  «        }ddd¦  «         n# 1 swxY w Y   | j        st          d¦  «          |¦   «           |¦   «         }|5  t          |                     ¦   «         ¦  «        }ddd¦  «         n# 1 swxY w Y   ||z
  }||z
  }	||z  }
|
r2t          dd 	                    t          |
¦  «        ¦  «        › �¦  «         |r2t          dd 	                    t          |¦  «        ¦  «        › �¦  «         |	r2t          dd 	                    t          |	¦  «        ¦  «        › �¦  «         |st          d	¦  «         n0t          d
t          |¦  «        › dt          |¦  «        › d�¦  «         | j        �vt          t          | j        d¦  «        r| j        j        ndd¬¦  «        | j        _        | j        j        rd„ | j        j        D ¦   «         nt          ¦   «         | j        _        g }|r8|                     dd 	                    t          |¦  «        ¦  «        › �¦  «         |	r8|                     dd 	                    t          |	¦  «        ¦  «        › �¦  «         |
r8|                     dd 	                    t          |
¦  «        ¦  «        › �¦  «         |rt          |¦  «        › d�nd}|rd 	                    |¦  «        dz   nd}| j                             dd|› |› d�dœ¦  «         | j        �7	 | j                             | j        | j        ¦  «         n# t*          $ r Y nw xY wt          dt          | j        r| j        j        ng ¦  «        › d�¦  «         dS # t*          $ r}t          d|› �¦  «         Y d}~dS d}~ww xY w)zÇReload MCP servers: disconnect all, re-read config.yaml, reconnect.

        After reconnecting, refreshes the agent's tool list so the model
        sees the updated tools on the next turn.
        r   )r„  Údiscover_mcp_toolsÚ_serversÚ_lockNu   ðŸ”„ Reloading MCP servers...u     â™»ï¸�  Reconnected: rT  u     âž• Added: u     âž– Removed: z  No MCP servers connected.u     ðŸ”§ z tool(s) available from z
 server(s)r~  Try  c                 ó*   — h | ]}|d          d         ’ŒS )r“  r    r]   )rW   r�  s     rK   rÁ  z(HermesCLI._reload_mcp.<locals>.<setcomp>4  s/   € ð /ð /ð /Ø15�D˜Ô$ VÔ,ð/ð /ð /rM   zAdded servers: zRemoved servers: zReconnected servers: z MCP tool(s) now availablezNo MCP tools availabler‚  r:   rK  z,[IMPORTANT: MCP servers have been reloaded. zD. The tool list for this conversation has been updated accordingly.]©rF  rN   u     âœ… Agent updated â€” z tool(s) availableu     â�Œ MCP reload failed: )r‘  r„  rL	  rM	  rN	  r´   r   r¯  r¹  rb   rv  r  rþ   rs  r•  r~  r{  Úvalid_tool_namesr–   r�  Ú_persist_sessionrv   )r7  r„  rL	  rM	  rN	  Úold_serversÚ	new_toolsÚconnected_serversÚaddedrè  ÚreconnectedÚchange_partsÚtool_summaryÚchange_detailrz   s                  rK   rM  zHermesCLI._reload_mcp  sþ  € ðM	3Ø`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ð`ð ð 3ð 3Ý! (§-¢-¡/¤/Ñ2Ô2�ð3ð 3ð 3ñ 3ô 3ð 3ð 3ð 3ð 3ð 3ð 3øøøð 3ð 3ð 3ð 3ð Ô(ð 7ÝÐ5Ñ6Ô6Ð6ð !Ð Ñ"Ô"Ð"ð +Ð*Ñ,Ô,ˆIð ð 9ð 9Ý$'¨¯ª©¬Ñ$8Ô$8Ð!ð9ð 9ð 9ñ 9ô 9ð 9ð 9ð 9ð 9ð 9ð 9øøøð 9ð 9ð 9ð 9ð &¨Ñ3ˆEØ!Ð$5Ñ5ˆGØ+¨kÑ9ˆKàð RÝÐP°·	²	½&ÀÑ:MÔ:MÑ0NÔ0NÐPÐPÑQÔQÐQØð BÝÐ@ d§i¢iµ°u±´Ñ&>Ô&>Ð@Ð@ÑAÔAÐAØð FÝÐD¨¯	ª	µ&¸±/´/Ñ(BÔ(BÐDÐDÑEÔEÐEØ$ð lÝÐ3Ñ4Ô4Ð4Ð4åÐj¥ I¡¤ÐjÐjÍÐL]ÑH^ÔH^ÐjÐjÐjÑkÔkÐkð ŒzÐ%Ý#7å˜tœzÐ+=Ñ>Ô>ð&I T¤ZÔ%@Ð%@ØDHØ#ð$ñ $ô $�”
Ô ð ”ZÔ%ð/1ð /ð /Ø9=¼Ô9Ið/ñ /ô /ð /å+.©5¬5ð ”
Ô+ð ˆLØð RØ×#Ò#Ð$P°d·i²iÅÀuÁÄÑ6NÔ6NÐ$PÐ$PÑQÔQÐQØð VØ×#Ò#Ð$T¸¿	º	Å&ÈÁ/Ä/Ñ8RÔ8RÐ$TÐ$TÑUÔUÐUØð ^Ø×#Ò#Ð$\¸D¿IºIÅfÈ[ÑFYÔFYÑ<ZÔ<ZÐ$\Ð$\Ñ]Ô]Ð]ØLUÐs�c )™nœnÐHÐHÐHÐHÐ[sˆLØ>JÐR˜DŸIšI lÑ3Ô3°dÑ:Ð:ÐPRˆMØÔ%×,Ò,Øð lÈ-ð  lÐYeð  lð  lð  lð.ð .ñ ô ð ð ŒzÐ%ðØ”J×/Ò/ØÔ1ØÔ1ñô ð ð øõ !ð ð ð Ø�Dðøøøõ Ðl­SÀTÄZÐ1W°´Ô1AÐ1AÐUWÑ-XÔ-XÐlÐlÐlÑmÔmÐmÐmÐmøåð 	3ð 	3ð 	3ÝÐ1¨aÐ1Ð1Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2Ð2øøøøð	3øøøs€   ‚N �">²N ¾AÁN ÁAÁ/N Á5"B#ÂN Â#B'Â'N Â*B'Â+I9N Ì%%M Í
N Í
MÍN ÍMÍ6N Î
N7ÎN2Î2N7r÷  c                 óØ   — t          | dd¦  «        r|                      ¦   «          d| _        |                      ¦   «          ddlm}  ||d¬¦  «        }t          d|› d|› d	�¦  «         d
S )a/  Called when the model begins generating tool-call arguments.

        Closes any open streaming boxes (reasoning / response) exactly once,
        then prints a short status line so the user sees activity instead of
        a frozen screen while a large payload (e.g. 45 KB write_file) streams.
        rr  Fr   ©Úget_tool_emojiu   âš¡)r‡   u     â”Š z preparing u   â€¦N)r–  rÜ  rr  rÔ  Úagent.displayr]	  rj  )r7  r÷  r]	  rò  s       rK   rn  zHermesCLI._on_tool_gen_start]  s“   € õ �4Ð-¨uÑ5Ô5ð 	,Ø×ÒÑ Ô Ð Ø&+ˆDÔ#Ø×!Ò!Ñ#Ô#Ð#à0Ð0Ð0Ð0Ð0Ð0Ø�˜y°%Ð8Ñ8Ô8ˆÝÐ9˜Ð9Ð9¨9Ð9Ð9Ð9Ñ:Ô:Ð:Ð:Ð:rM   Úfunction_namer”  Úfunction_argsc                 ó(  — |dk    �rÌd| _         |�r¬| j        dv �r¢|                     dd¦  «        }|                     dd¦  «        }| j                             |¦  «        }|r|                     d¦  «        ni }	|�
|s| j        |= | j        d	k    r!|| j        k    r|                      ¦   «          dS || _        	 dd
lm}
  |
||	|¦  «        }|r|› d�}t          d|› �¦  «         n# t          $ r Y nw xY w	 t          | dd¦  «        s£| j        dk    r˜|dk    r’ddlm}m}m}m}  |t"          |¦  «        sud| _        t          dt&          ›  |¦   «         › t(          › �¦  «          |t*          dz  |¦  «         dt"                               di ¦  «                             di ¦  «        |<   n# t          $ r Y nw xY w|                      ¦   «          dS |dk    rdS |rÍ|                     d¦  «        s¸ddlm}  ||¦  «        }|p|}ddlm}  |¦   «         }|dk    r#t5          |¦  «        |k    r|d|dz
  …         dz   }|› d|› �| _        t9          j        ¦   «         | _         | j                             |g ¦  «                             |�|ni ¦  «         |                      ¦   «          | j        sdS |r|                     d¦  «        rdS 	 ddl m!} tE          j#        |dddd œd¬!¦  «         $                    ¦   «          dS # t          $ r Y dS w xY w)"aû  Called on tool lifecycle events (tool.started, tool.completed, reasoning.available, etc.).

        Updates the TUI spinner widget so the user can see what the agent
        is doing during tool execution (fills the gap between thinking
        spinner and next response).  Also plays audio cue in voice mode.

        On tool.started, records a monotonic timestamp so get_spinner_text()
        can show a live elapsed timer (the TUI poll loop already invalidates
        every ~0.15s, so the counter updates automatically).

        When tool_progress_mode is "all" or "new", also prints a persistent
        stacked line to scrollback on tool.completed so users can see the
        full history of tool calls (not just the current one in the spinner).
        ztool.completedrb  )r=  r  rú  Úis_errorFr   Nr  )Úget_cute_tool_messagez [error]r8  Ú_long_tool_hint_firedr=  g      >@)ÚTOOL_PROGRESS_FLAGÚis_seenÚ	mark_seenÚtool_progress_hint_cliTrº   r  rš   ztool.startedrg  r\	  )Úget_tool_preview_max_lenrý  rÏ  r‚  ©Ú	play_beepi°  g¸…ëQ¸®?r  )Ú	frequencyrú  r`  )rñ  rù  r‘  )%r¬  rj  rT   r­  rA  r®  rÖ  r^	  rc	  rj  rv   r–  Úagent.onboardingre	  rf	  rg	  rh	  ri  rd	  r‹  rŒ  ro   Ú
setdefaultrÅ  r]	  ri	  r  r«  rÿ  rÔ  r–   r¶  Útools.voice_moderk	  r¥  r’  r“  )r7  rÕ  r_	  r”  r`	  rù  rú  rb	  ÚstoredÚstored_argsrc	  rÖ  re	  rf	  rg	  rh	  r]	  rò  ró  ri	  Ú_plrk	  s                         rK   rk  zHermesCLI._on_tool_progressq  s<  € ð Ð)Ò)Ñ)Ø$'ˆDÔ!àñ - Ô!8¸NÐ!JÑ!JØ!Ÿ:š: j°#Ñ6Ô6�Ø!Ÿ:š: j°%Ñ8Ô8�àÔ0×4Ò4°]ÑCÔC�Ø/5Ð=˜fŸjšj¨™mœm˜m¸2�ØÐ%¨fÐ%ØÔ/°Ð>àÔ*¨eÒ3Ð3¸ÈÔIcÒ8cÐ8cØ×$Ò$Ñ&Ô&Ð&Ø�FØ-:�Ô*ðØCÐCÐCÐCÐCÐCØ0Ð0°ÀÈXÑVÔV�DØð 1Ø"&Ð0Ð0Ð0˜Ý˜K ˜K˜KÑ(Ô(Ð(Ð(øÝ ð ð ð Ø�Dðøøøðå# DÐ*AÀ5ÑIÔIðvà Ô3°uÒ<Ð<Ø$¨Ò,Ð,ðð ð ð ð ð ð ð ð ð ð ð ð  '˜w¥zÐ3EÑFÔFð vØ9=˜DÔ6Ý#Ð$O­Ð$OÐ/EÐ/EÑ/GÔ/GÐ$OÍÐ$OÐ$OÑPÔPÐPØ%˜I¥l°]Ñ&BÐDVÑWÔWÐWØqu�J×1Ò1°,ÀÑCÔC×NÒNÈvÐWYÑZÔZÐ[mÑnøøÝ ð ð ð Ø�Dðøøøà×ÒÑÔÐØˆFØ˜Ò'Ð'ØˆFØð 	 ×!9Ò!9¸#Ñ!>Ô!>ð 	Ø4Ð4Ð4Ð4Ð4Ð4Ø"�N =Ñ1Ô1ˆEØÐ,˜}ˆEØ>Ð>Ð>Ð>Ð>Ð>Ø*Ð*Ñ,Ô,ˆCØ�QŠwˆw�3˜u™:œ:¨Ò+Ð+Ø˜h˜s Q™w˜hœ¨%Ñ/�Ø$)Ð!3Ð!3¨EÐ!3Ð!3ˆDÔÝ$(¤NÑ$4Ô$4ˆDÔ!àÔ#×.Ò.¨}¸bÑAÔA×HÒHØ!.Ð!:��Àñô ð ð ×ÒÑÔÐàÔð 	ØˆFØð 	 × 8Ò 8¸Ñ =Ô =ð 	ØˆFð	Ø2Ð2Ð2Ð2Ð2Ð2ÝÔØ Ø%)°tÀaÐHÐHØðñ ô ÷ Še‰gŒgˆgˆgˆgøÝð 	ð 	ð 	ØˆDˆDð	øøøs7   Â;,C( Ã(
C5Ã4C5Ã9B4F. Æ.
F;Æ:F;Ë3L Ì
LÌLrø  c                 ó¤   — 	 ddl m}  |||¦  «        }|�|| j        |<   dS dS # t          $ r! t                               d|d¬¦  «         Y dS w xY w)z3Capture local before-state for write-capable tools.r   )Úcapture_local_edit_snapshotNz#Edit snapshot capture failed for %sT©Úexc_info)r^	  rt	  rt  rv   rq   rÂ  )r7  rø  r_	  r`	  rt	  r  s         rK   rl  zHermesCLI._on_tool_startÓ  s�   € ð	^ØAÐAÐAÐAÐAÐAà2Ð2°=À-ÑPÔPˆHØÐ#Ø=E�Ô,¨\Ñ:Ð:Ð:ð $Ð#øåð 	^ð 	^ð 	^Ý�LŠLÐ>ÀÐX\ˆLÑ]Ô]Ð]Ð]Ð]Ð]ð	^øøøs   ‚$ ¤'AÁAÚfunction_resultc                 óÐ   — | j                              |d¦  «        }	 ddlm}  |||||t          ¬¦  «         dS # t
          $ r! t                               d|d¬¦  «         Y dS w xY w)zFRender file edits with inline diff after write-capable tools complete.Nr   )Úrender_edit_diff_with_delta)r`	  r  Úprint_fnzEdit diff preview failed for %sTru	  )rt  rA  r^	  ry	  rj  rv   rq   rÂ  )r7  rø  r_	  r`	  rw	  r  ry	  s          rK   rm  zHermesCLI._on_tool_completeÞ  s©   € àÔ/×3Ò3°LÀ$ÑGÔGˆð	ZØAÐAÐAÐAÐAÐAà'Ð'ØØØ+Ø!Ý ðñ ô ð ð ð øõ ð 	Zð 	Zð 	ZÝ�LŠLÐ:¸MÐTXˆLÑYÔYÐYÐYÐYÐYð	Zøøøs   �: º'A%Á$A%c                 ó`  ‡ — t          ‰ dd¦  «        rdS ddlm}m}  |¦   «         }|d         sct	          ¦   «         r8|                     dd¦  «        }d	|v rt          d
¦  «        ‚t          d¦  «        ‚t          dt          j        › d�¦  «        ‚|                     d|                     d¦  «        ¦  «        st          d¦  «        ‚‰ j	        5  ‰ j
        r	 ddd¦  «         dS d‰ _
        ddd¦  «         n# 1 swxY w Y   i }	 ddlm}  |¦   «                              di ¦  «        }n# t          $ r Y nw xY w‰ j        € |¦   «         ‰ _        |                     dd¦  «        ‰ j        _        |                     dd¦  «        ‰ j        _        ˆ fd„}‰                      ¦   «         r%	 ddlm}  |dd¬¦  «         n# t          $ r Y nw xY w	 ‰ j                             |¬¦  «         n5# t          $ r( ‰ j	        5  d‰ _
        ddd¦  «         n# 1 swxY w Y   ‚ w xY wt          ‰ j        dd¦  «        rd}	nt	          ¦   «         rd }	nd!}	t)          d"t*          › d#t,          › d$t.          › d%|	› d&t,          › �
¦  «         ˆ fd'„}
t1          j        |
d¬(¦  «                             ¦   «          dS ))z*Start capturing audio from the microphone.r›  FNr   )Úcreate_audio_recorderÚcheck_voice_requirementsÚaudio_availableÚdetailsr:   z'Termux:API Android app is not installedz×Termux:API command package detected, but the Android app is missing.
Install/update the Termux:API Android app, then retry /voice on.
Fallback: pkg install python-numpy portaudio && python -m pip install sounddevicezìVoice mode requires either Termux:API microphone access or Python audio libraries.
Option 1: pkg install termux-api and install the Termux:API Android app
Option 2: pkg install python-numpy portaudio && python -m pip install sounddevicez9Voice mode requires sounddevice and numpy.
Install with: z! -m pip install sounddevice numpyÚstt_availableÚstt_key_setz½Voice mode requires an STT provider for transcription.
Option 1: pip install faster-whisper  (free, local)
Option 2: Set GROQ_API_KEY (free tier)
Option 3: Set VOICE_TOOLS_OPENAI_KEY (paid)Trê  r-  Úsilence_thresholdr�  Úsilence_durationg      @c                  ó8  •— ‰ j         5  ‰ j        s	 ddd¦  «         dS 	 ddd¦  «         n# 1 swxY w Y   t          dt          › dt          › �¦  «         t          ‰ d¦  «        r ‰ j        r‰ j                             ¦   «          ‰                      ¦   «          dS )z>Called by AudioRecorder when silence is detected after speech.NrZ   z"Silence detected, auto-stopping...rŒ  )	rµ  r¹  rj  r‹  rŒ  r•  rŒ  rÕ  Ú_voice_stop_and_transcriberG  s   €rK   Ú_on_silencez5HermesCLI._voice_start_recording.<locals>._on_silence(  s  ø€ àÔ!ð ð ØÔ,ð Øðð ð ñ ô ð ð ð ððð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð õ ÐG�ÐGÐGÅÐGÐGÑHÔHÐHÝ�t˜VÑ$Ô$ð '¨¬ð 'Ø”	×$Ò$Ñ&Ô&Ð&Ø×+Ò+Ñ-Ô-Ð-Ð-Ð-s   ‰	,¬0³0rj	  ip  r  ©rl	  r`  )Úon_silence_stopÚsupports_silence_autostopz8auto-stops on silence | Ctrl+B to stop & exit continuousz#Termux:API capture | Ctrl+B to stopzCtrl+B to stoprZ   u   â—� Recording...r‚  ú(r:  c                  óä   •— 	 ‰j         5  ‰j        } d d d ¦  «         n# 1 swxY w Y   | sd S t          ‰d¦  «        r ‰j        r‰j                             ¦   «          t          j        d¦  «         Œo)NTrŒ  ç333333Ã?)rµ  r¹  r•  rŒ  rÕ  rÿ  r†  )Ústill_recordingr7  s    €rK   Ú_refresh_levelz8HermesCLI._voice_start_recording.<locals>._refresh_levelI  s¿   ø€ ð!ØÔ%ð <ð <Ø&*Ô&;�Oð<ð <ð <ñ <ô <ð <ð <ð <ð <ð <ð <øøøð <ð <ð <ð <à&ð Ø�EÝ˜4 Ñ(Ô(ð +¨T¬Yð +Ø”I×(Ò(Ñ*Ô*Ð*Ý”
˜4Ñ Ô Ð ð!s   Šž"¥"r>	  )r–  ro	  r|	  r}	  r  rT   ÚRuntimeErrorr  Ú
executablerµ  r¹  r>  rë  rv   r¸  Ú_silence_thresholdÚ_silence_durationÚ_voice_beeps_enabledrk	  r“  rj  rñ  rŒ  r‹  r¥  r’  )r7  r|	  r}	  Úreqsr	  Ú	voice_cfgrë  r†	  rk	  Ú_recording_hintrŽ	  s   `          rK   Ú_voice_start_recordingz HermesCLI._voice_start_recordingò  sB  ø€ å�4˜¨Ñ/Ô/ð 	ØˆFØTÐTÐTÐTÐTÐTÐTÐTà'Ð'Ñ)Ô)ˆØÐ%Ô&ð 	Ý%Ñ'Ô'ð ØŸ(š( 9¨bÑ1Ô1�Ø<ÀÐGÐGÝ&ðlñô ð õ
 #ðhñô ð õ
 ðSÝ!$¤ðSð Sð Sñô ð ð �xŠx˜¨¯ª°-Ñ)@Ô)@ÑAÔAð 	Ýð>ñô ð ð Ôð 	)ð 	)ØÔ$ð Øð	)ð 	)ð 	)ñ 	)ô 	)ð 	)ð 	)ð 	)ð %)ˆDÔ!ð	)ð 	)ð 	)ñ 	)ô 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)øøøð 	)ð 	)ð 	)ð 	)ð ˆ	ð	Ø5Ð5Ð5Ð5Ð5Ð5Ø#˜™œ×)Ò)¨'°2Ñ6Ô6ˆIˆIøÝð 	ð 	ð 	ØˆDð	øøøð ÔÐ'Ø#8Ð#8Ñ#:Ô#:ˆDÔ ð 3<·-²-Ð@SÐUXÑ2YÔ2YˆÔÔ/Ø1:·²Ð?QÐSVÑ1WÔ1WˆÔÔ.ð	.ð 	.ð 	.ð 	.ð 	.ð ×$Ò$Ñ&Ô&ð 	ðØ6Ð6Ð6Ð6Ð6Ð6Ø�	 C¨qÐ1Ñ1Ô1Ð1Ð1øÝð ð ð Ø�ðøøøð	ØÔ ×&Ò&°{Ð&ÑCÔCÐCÐCøÝð 	ð 	ð 	ØÔ!ð .ð .Ø(-�Ô%ð.ð .ð .ñ .ô .ð .ð .ð .ð .ð .ð .øøøð .ð .ð .ð .àð	øøøõ �4Ô'Ð)DÀdÑKÔKð 	/ØXˆOˆOÝ#Ñ%Ô%ð 	/ØCˆOˆOà.ˆOÝÐT•WÐTÐT­dÐTÐTµTÐTÐT¸OÐTÐTÍdÐTÐTÑUÔUÐUð	!ð 	!ð 	!ð 	!ð 	!õ 	Ô °tÐ<Ñ<Ô<×BÒBÑDÔDÐDÐDÐDsl   Ã	C:Ã'C:Ã:C>ÄC>Ä$D- Ä-
D:Ä9D:Æ-G Ç
GÇGÇG. Ç.H Ç?HÈH ÈH	ÈH ÈH	ÈH c                 óž  ‡ — ‰ j         5  ‰ j        s	 ddd¦  «         dS d‰ _        d‰ _        ddd¦  «         n# 1 swxY w Y   d}d}	 ‰ j        �€?	 ‰ j         5  d‰ _        ddd¦  «         n# 1 swxY w Y   t	          ‰ d¦  «        r ‰ j        r‰ j                             ¦   «          	 |r3t          j         	                    |¦  «        rt          j
        |¦  «         n# t          $ r Y nw xY w|sSt          ‰ dd¦  «        dz   ‰ _        ‰ j        dk    r.d‰ _        d‰ _        t          t           › d	t"          › �¦  «         dS nd‰ _        ‰ j        r8|s8‰ j        s3ˆ fd
„}t%          j        |d¬¦  «                             ¦   «          dS dS dS dS ‰ j                             ¦   «         }‰                      ¦   «         r%	 ddlm}  |dd¬¦  «         n# t          $ r Y nw xY w|�€]t          t           › dt"          › �¦  «         	 ‰ j         5  d‰ _        ddd¦  «         n# 1 swxY w Y   t	          ‰ d¦  «        r ‰ j        r‰ j                             ¦   «          	 |r3t          j         	                    |¦  «        rt          j
        |¦  «         n# t          $ r Y nw xY w|sSt          ‰ dd¦  «        dz   ‰ _        ‰ j        dk    r.d‰ _        d‰ _        t          t           › d	t"          › �¦  «         dS nd‰ _        ‰ j        r8|s8‰ j        s3ˆ fd
„}t%          j        |d¬¦  «                             ¦   «          dS dS dS dS t	          ‰ d¦  «        r ‰ j        r‰ j                             ¦   «          t          t           › dt"          › �¦  «         d}	 ddlm}  |¦   «                              di ¦  «        }|                     d¦  «        }n# t          $ r Y nw xY wddlm}  |||¬¦  «        }	|	                     d¦  «        r¨|	                     dd¦  «                             ¦   «         r€|	d                              ¦   «         }
‰ j                             ¦   «          t	          ‰ d¦  «        r ‰ j        r‰ j                             ¦   «          ‰ j          !                    |
¦  «         d}nk|	                     d¦  «        rt          t           › dt"          › �¦  «         n7|	                     dd¦  «        }t          dt           › d|› t"          › �¦  «         n8# t          $ r+}t          dt           › d|› t"          › �¦  «         Y d}~nd}~ww xY w‰ j         5  d‰ _        ddd¦  «         n# 1 swxY w Y   t	          ‰ d¦  «        r ‰ j        r‰ j                             ¦   «          	 |r3t          j         	                    |¦  «        rt          j
        |¦  «         n# t          $ r Y nw xY w|sSt          ‰ dd¦  «        dz   ‰ _        ‰ j        dk    r.d‰ _        d‰ _        t          t           › d	t"          › �¦  «         dS nd‰ _        ‰ j        r8|s8‰ j        s3ˆ fd
„}t%          j        |d¬¦  «                             ¦   «          dS dS dS dS # ‰ j         5  d‰ _        ddd¦  «         n# 1 swxY w Y   t	          ‰ d¦  «        r ‰ j        r‰ j                             ¦   «          	 |r3t          j         	                    |¦  «        rt          j
        |¦  «         n# t          $ r Y nw xY w|sUt          ‰ dd¦  «        dz   ‰ _        ‰ j        dk    r0d‰ _        d‰ _        t          t           › d	t"          › �¦  «          Y dS nd‰ _        ‰ j        r7|s6‰ j        s0ˆ fd
„}t%          j        |d¬¦  «                             ¦   «          w w w w xY w)zFStop recording, transcribe via STT, and queue the transcript as input.NFTrŒ  Ú_no_speech_countr   r  rý  z4No speech detected 3 times, continuous mode stopped.c                  ó
  •— 	 ‰                      ¦   «          t          ‰d¦  «        r"‰j        r‰j                             ¦   «          d S d S d S # t          $ r+} t          t          › d| › t          › �¦  «         Y d } ~ d S d } ~ ww xY w)NrŒ  úVoice auto-restart failed: ©r—	  r•  rŒ  rÕ  rv   rj  r‹  rŒ  )rz   r7  s    €rK   Ú_restart_recordingz@HermesCLI._voice_stop_and_transcribe.<locals>._restart_recording¯  sº   ø€ ðOØ×3Ò3Ñ5Ô5Ð5Ý" 4¨Ñ0Ô0ð 3°T´Yð 3Ø œI×0Ò0Ñ2Ô2Ð2Ð2Ð2ð3ð 3ð 3ð 3øå$ð Oð Oð OÝ¥4Ð MÐ MÀAÐ MÅtÐ MÐ MÑNÔNÐNÐNÐNÐNÐNÐNÐNøøøøðOøøøs   ƒAA Á
BÁ A=Á=Br>	  rj	  i”  r�  r‡	  zNo speech detected.zTranscribing...rê  Ústtrõ   )Útranscribe_recording)rõ   rÇ  Ú
transcriptr:   r1  úUnknown errorrZ   zTranscription failed: zVoice processing error: )"rµ  r¹  rº  r¸  r•  rŒ  rÕ  r’   rw   r•   Úunlinkrv   r–  r™	  r»  rj  r‹  rŒ  r¥  r’  r“  r)  r“	  ro	  rk	  r>  rë  rT   rŸ	  rG   r±  r€  r™  rD  )r7  Ú	submittedÚwav_pathr�	  rk	  Ú	stt_modelrë  Ú
stt_configrŸ	  r€   r 	  r1  rz   s   `            rK   r…	  z$HermesCLI._voice_stop_and_transcribeT  sb  ø€ ð
 Ôð 	*ð 	*ØÔ(ð Øð	*ð 	*ð 	*ñ 	*ô 	*ð 	*ð 	*ð 	*ð %*ˆDÔ!Ø%)ˆDÔ"ð		*ð 	*ð 	*ñ 	*ô 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*øøøð 	*ð 	*ð 	*ð 	*ð ˆ	ØˆðU	QØÔ#Ñ+Øðb Ô!ð /ð /Ø).�Ô&ð/ð /ð /ñ /ô /ð /ð /ð /ð /ð /ð /øøøð /ð /ð /ð /å�t˜VÑ$Ô$ð '¨¬ð 'Ø”	×$Ò$Ñ&Ô&Ð&ðØð (¥¤§¢¨xÑ 8Ô 8ð (Ý”I˜hÑ'Ô'Ð'øøÝð ð ð Ø�ðøøøð ð *Ý(/°Ð6HÈ!Ñ(LÔ(LÈqÑ(P�Ô%ØÔ(¨AÒ-Ð-Ø-2�DÔ*Ø,-�DÔ)Ý�tÐ_Ð_ÕY]Ð_Ð_Ñ`Ô`Ð`Ø�Fð	 .ð )*�Ô%ð Ô%ð Q¨ið QÀÔ@Uð QðOð Oð Oð Oð Oõ Ô Ð(:À4ÐHÑHÔH×NÒNÑPÔPÐPÐPÐPðQð Qð Qð Qð Qð QðS Ô+×0Ò0Ñ2Ô2ˆHð ×(Ò(Ñ*Ô*ð ðØ:Ð:Ð:Ð:Ð:Ð:Ø�I¨°1Ð5Ñ5Ô5Ð5Ð5øÝ ð ð ð Ø�Dðøøøð ÑÝ�4Ð:Ð:µDÐ:Ð:Ñ;Ô;Ð;ØðF Ô!ð /ð /Ø).�Ô&ð/ð /ð /ñ /ô /ð /ð /ð /ð /ð /ð /øøøð /ð /ð /ð /å�t˜VÑ$Ô$ð '¨¬ð 'Ø”	×$Ò$Ñ&Ô&Ð&ðØð (¥¤§¢¨xÑ 8Ô 8ð (Ý”I˜hÑ'Ô'Ð'øøÝð ð ð Ø�ðøøøð ð *Ý(/°Ð6HÈ!Ñ(LÔ(LÈqÑ(P�Ô%ØÔ(¨AÒ-Ð-Ø-2�DÔ*Ø,-�DÔ)Ý�tÐ_Ð_ÕY]Ð_Ð_Ñ`Ô`Ð`Ø�Fð	 .ð )*�Ô%ð Ô%ð Q¨ið QÀÔ@Uð QðOð Oð Oð Oð Oõ Ô Ð(:À4ÐHÑHÔH×NÒNÑPÔPÐPÐPÐPðQð Qð Qð Qð Qð Qõu �t˜VÑ$Ô$ð '¨¬ð 'Ø”	×$Ò$Ñ&Ô&Ð&Ý•tÐ2Ð2­DÐ2Ð2Ñ3Ô3Ð3ð ˆIðØ9Ð9Ð9Ð9Ð9Ð9Ø(˜[™]œ]×.Ò.¨u°bÑ9Ô9�
Ø&ŸNšN¨7Ñ3Ô3�	�	øÝð ð ð Ø�ðøøøð >Ð=Ð=Ð=Ð=Ð=Ø)Ð)¨(¸)ÐDÑDÔDˆFà�zŠz˜)Ñ$Ô$ð H¨¯ª°LÀ"Ñ)EÔ)E×)KÒ)KÑ)MÔ)Mð HØ# LÔ1×7Ò7Ñ9Ô9�
ØÔ%×+Ò+Ñ-Ô-Ð-Ý˜4 Ñ(Ô(ð +¨T¬Yð +Ø”I×(Ò(Ñ*Ô*Ð*ØÔ#×'Ò'¨
Ñ3Ô3Ð3Ø �	�	Ø—’˜IÑ&Ô&ð HÝ�4Ð:Ð:µDÐ:Ð:Ñ;Ô;Ð;Ð;àŸ
š
 7¨OÑ<Ô<�ÝÐF�TÐFÐF¸ÐFÅÐFÐFÑGÔGÐGøøåð 	Bð 	Bð 	BÝÐ@�Ð@Ð@°qÐ@½$Ð@Ð@ÑAÔAÐAÐAÐAÐAÐAÐAøøøøð	Bøøøð Ô!ð /ð /Ø).�Ô&ð/ð /ð /ñ /ô /ð /ð /ð /ð /ð /ð /øøøð /ð /ð /ð /å�t˜VÑ$Ô$ð '¨¬ð 'Ø”	×$Ò$Ñ&Ô&Ð&ðØð (¥¤§¢¨xÑ 8Ô 8ð (Ý”I˜hÑ'Ô'Ð'øøÝð ð ð Ø�ðøøøð ð *Ý(/°Ð6HÈ!Ñ(LÔ(LÈqÑ(P�Ô%ØÔ(¨AÒ-Ð-Ø-2�DÔ*Ø,-�DÔ)Ý�tÐ_Ð_ÕY]Ð_Ð_Ñ`Ô`Ð`Ø�Fð	 .ð )*�Ô%ð Ô%ð Q¨ið QÀÔ@Uð QðOð Oð Oð Oð Oõ Ô Ð(:À4ÐHÑHÔH×NÒNÑPÔPÐPÐPÐPðQð Qð Qð Qð Qð Qøð5 Ô!ð /ð /Ø).�Ô&ð/ð /ð /ñ /ô /ð /ð /ð /ð /ð /ð /øøøð /ð /ð /ð /å�t˜VÑ$Ô$ð '¨¬ð 'Ø”	×$Ò$Ñ&Ô&Ð&ðØð (¥¤§¢¨xÑ 8Ô 8ð (Ý”I˜hÑ'Ô'Ð'øøÝð ð ð Ø�ðøøøð ð *Ý(/°Ð6HÈ!Ñ(LÔ(LÈqÑ(P�Ô%ØÔ(¨AÒ-Ð-Ø-2�DÔ*Ø,-�DÔ)Ý�tÐ_Ð_ÕY]Ð_Ð_Ñ`Ô`Ð`Ø�F�F�Fð	 .ð )*�Ô%ð Ô%ð Q¨ið QÀÔ@Uð QðOð Oð Oð Oð Oõ Ô Ð(:À4ÐHÑHÔH×NÒNÑPÔPÐPÐPðQð Qð QøøøsS  ‰	9Ÿ9¹=Á =Á	T ÁA-Á-A1Á4A1Â)5C Ã
C,Ã+C,Æ-T Æ>G ÇT Ç
GÇT ÇGÇ$T ÈHÈH#È&H#É5J Ê
JÊJÍAT Î9O ÏT Ï
OÏT ÏOÏD>T ÔZ Ô
UÔ#!U	ÕZ Õ	UÕZ ÕU,Õ,U0Õ3U0Ö(5W ×
W+×*W+Ú_ÚZ+Ú_Ú+Z/Ú/_Ú2Z/Ú33_Û'5\Ü_Ü
\*Ü'_Ü)\*Ü*A_ÞA	_c                 óÀ  — | j         sdS | j                             ¦   «          	 ddlm} ddlm} t          |¦  «        dk    r
|dd…         n|}t          j	        dd|¦  «        }t          j	        dd	|¦  «        }t          j	        d
d|¦  «        }t          j	        dd	|¦  «        }t          j	        dd	|¦  «        }t          j	        dd	|¦  «        }t          j	        dd|t          j
        ¬¦  «        }t          j	        dd|t          j
        ¬¦  «        }t          j	        dd|¦  «        }t          j	        dd|¦  «        }|                     ¦   «         }|s	 | j                             ¦   «          dS t          j        t          j                             t#          j        ¦   «         d¦  «        d¬¦  «         t          j                             t#          j        ¦   «         ddt'          j        d¦  «        › d�¦  «        } |||¬¦  «         t          j                             |¦  «        r¦t          j                             |¦  «        dk    rƒ ||¦  «         	 t          j        |¦  «         |                     dd¦  «        d         dz   }t          j                             |¦  «        rt          j        |¦  «         n# t2          $ r Y nw xY wnR# t4          $ rE}t6                               d|¦  «         t;          t<          › d |› t>          › �¦  «         Y d}~nd}~ww xY w| j                             ¦   «          dS # | j                             ¦   «          w xY w)!zGSpeak the agent's response aloud using TTS (runs in background thread).Nr   )Útext_to_speech_tool)Úplay_audio_filei   z```[\s\S]*?```r‚  z\[([^\]]+)\]\([^)]+\)r[  zhttps?://\S+r:   z\*\*(.+?)\*\*z	\*(.+?)\*z`(.+?)`z^#+\s*r;   z^\s*[-*]\s+z---+r\  r]  Úhermes_voiceTr˜  Útts_re  z.mp3)r6   Úoutput_pathrÁ   r  z.oggzVoice TTS playback failed: %szTTS playback failed: ) r·  r½  r€  Útools.tts_toolr¨	  ro	  r©	  r  rC   rD   r_  rG   r´   r’   rš  rw   rb   ÚtempfileÚ
gettempdirrÿ  r”  r•   Úgetsizer¢	  rª  rÆ  rv   rq   rr   rj  r‹  rŒ  )r7  r6   r¨	  r©	  Útts_textÚmp3_pathÚogg_pathrz   s           rK   Ú_voice_speak_responsezHermesCLI._voice_speak_response¸  sR  € àŒð 	ØˆFØÔ×"Ò"Ñ$Ô$Ð$ð-	'Ø:Ð:Ð:Ð:Ð:Ð:Ø8Ð8Ð8Ð8Ð8Ð8õ '*¨$¡i¤i°$Ò&6Ð&6�t˜E˜T˜E”{�{¸DˆHÝ”vÐ/°°hÑ?Ô?ˆHÝ”vÐ6¸¸xÑHÔHˆHÝ”v˜o¨r°8Ñ<Ô<ˆHÝ”vÐ.°°xÑ@Ô@ˆHÝ”v˜l¨E°8Ñ<Ô<ˆHÝ”v˜j¨%°Ñ:Ô:ˆHÝ”v˜i¨¨X½R¼\ÐJÑJÔJˆHÝ”v˜n¨b°(Å"Ä,ÐOÑOÔOˆHÝ”v˜g r¨8Ñ4Ô4ˆHÝ”v˜i¨°Ñ:Ô:ˆHØ—~’~Ñ'Ô'ˆHØð Øð6 Ô ×$Ò$Ñ&Ô&Ð&Ð&Ð&õ/ ŒK�œŸš¥XÔ%8Ñ%:Ô%:¸NÑKÔKÐVZÐ[Ñ[Ô[Ð[Ý”w—|’|ÝÔ#Ñ%Ô% ~Ø;•t”} _Ñ5Ô5Ð;Ð;Ð;ñô ˆHð
  Ð X¸8ÐDÑDÔDÐDõ Œw�~Š~˜hÑ'Ô'ð 	­B¬G¯OªO¸HÑ,EÔ,EÈÒ,IÐ,IØ� Ñ)Ô)Ð)ðÝ”I˜hÑ'Ô'Ð'Ø'Ÿš¨s°AÑ6Ô6°qÔ9¸FÑB�HÝ”w—~’~ hÑ/Ô/ð ,Ýœ	 (Ñ+Ô+Ð+øøÝð ð ð Ø�Dðøøøøøåð 	=ð 	=ð 	=Ý�NŠNÐ:¸AÑ>Ô>Ð>Ý•tÐ;Ð;°!Ð;µTÐ;Ð;Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<øøøøð	=øøøð Ô ×$Ò$Ñ&Ô&Ð&Ð&Ð&øˆDÔ ×$Ò$Ñ&Ô&Ð&Ð&øøøs\   ¤D5K Å5C'K ÉA&K ËK Ë
KËK ËKËK ËM Ë
L$Ë;LÌM ÌL$Ì$M ÍMc                 ól  — |                      ¦   «                              d¬¦  «        }t          |¦  «        dk    r,|d                              ¦   «                               ¦   «         nd}|dk    r|                      ¦   «          d
S |dk    r|                      ¦   «          d
S |dk    r|                      ¦   «          d
S |dk    r|                      ¦   «          d
S |dk    r3| j        r|                      ¦   «          d
S |                      ¦   «          d
S t          d|› �¦  «         t          d	¦  «         d
S )z*Handle /voice [on|off|tts|status] command.r  r"  r:   r‰   r„   rC  rý  zUnknown voice subcommand: z!Usage: /voice [on|off|tts|status]N)
rG   r  r  rŒ   Ú_enable_voice_modeÚ_disable_voice_modeÚ_toggle_voice_ttsÚ_show_voice_statusr¶  rj  )r7  r   rc   r   s       rK   rR  zHermesCLI._handle_voice_commandì  sP  € à—’‘”×%Ò%¨qÐ%Ñ1Ô1ˆÝ14°U±´¸a²°�U˜1”X—^’^Ñ%Ô%×+Ò+Ñ-Ô-Ð-ÀRˆ
à˜ÒÐØ×#Ò#Ñ%Ô%Ð%Ð%Ð%Ø˜5Ò Ð Ø×$Ò$Ñ&Ô&Ð&Ð&Ð&Ø˜5Ò Ð Ø×"Ò"Ñ$Ô$Ð$Ð$Ð$Ø˜8Ò#Ð#Ø×#Ò#Ñ%Ô%Ð%Ð%Ð%Ø˜2ÒÐàÔð *Ø×(Ò(Ñ*Ô*Ð*Ð*Ð*à×'Ò'Ñ)Ô)Ð)Ð)Ð)åÐ=°Ð=Ð=Ñ>Ô>Ð>ÝÐ7Ñ8Ô8Ð8Ð8Ð8rM   c                 óâ   — 	 ddl m}  |¦   «                              di ¦  «        }t          |t          ¦  «        r#t          |                     dd¦  «        ¦  «        S n# t          $ r Y nw xY wdS )zBReturn whether CLI voice mode should play record start/stop beeps.r   rê  r-  Úbeep_enabledT)r>  rë  rT   rR   rS   ræ  rv   )r7  rë  r•	  s      rK   r“	  zHermesCLI._voice_beeps_enabled  sŽ   € ð	Ø5Ð5Ð5Ð5Ð5Ð5Ø#˜™œ×)Ò)¨'°2Ñ6Ô6ˆIÝ˜)¥TÑ*Ô*ð AÝ˜IŸMšM¨.¸$Ñ?Ô?Ñ@Ô@Ð@ðAøåð 	ð 	ð 	ØˆDð	øøøàˆts   ‚AA Á
A,Á+A,c                 ó   — | j         r t          t          › dt          › �¦  «         dS ddlm}m}  |¦   «         }|d         sLt          dt          › dt          › �¦  «         |d         D ]"}t          d	t          › |› t          › �¦  «         Œ#dS  |¦   «         }|d         �st          dt          › d
t          › �¦  «         |d                              d¦  «        D ]"}t          d	t          › |› t          › �¦  «         Œ#|d         r³t          ¦   «         r^t          dt          › dt          › �¦  «         t          d	t          › dt          › �¦  «         t          d	t          › dt          › �¦  «         nGt          dt          › dt          j        › dd                     |d         ¦  «        › t          › �¦  «         dS | j        5  d| _         ddd¦  «         n# 1 swxY w Y   	 ddlm}  |¦   «                              di ¦  «        }|                     dd¦  «        r&| j        5  d| _        ddd¦  «         n# 1 swxY w Y   n# t&          $ r Y nw xY w| j        rdnd}		 ddlm}  |¦   «                              di ¦  «                             dd¦  «        }
|
                     ¦   «                              dd¦  «                             dd ¦  «        }n# t&          $ r d!}Y nw xY w|                     dd"¦  «                             ¦   «         }t          dt          › d#|	› t          › �¦  «         t          d	t          › |› d$t          › �¦  «         t          d	t          › d%t          › �¦  «         t          d	t          › d&t          › �¦  «         dS )'z.Enable voice mode after checking requirements.zVoice mode is already enabled.Nr   )r}	  Údetect_audio_environmentrw  rZ   z+Voice mode unavailable in this environment:Úwarningsr8  z Voice mode requirements not met:r	  Úmissing_packagesrq  z Option 1: pkg install termux-apizEThen install/update the Termux:API Android app for microphone capturezQOption 2: pkg install python-numpy portaudio && python -m pip install sounddevicez	Install: z -m pip install r‚  Trê  r-  Úauto_ttsFz (TTS enabled)r:   Ú
record_keyúctrl+búctrl+úc-úalt+úa-úc-búCtrl+zVoice mode enabledz to start/stop recordingz#/voice tts  to toggle speech outputz!/voice off  to disable voice mode)r¶  rj  r‹  rŒ  ro	  r}	  r½	  rñ  r  r  rt  r  r�	  rb   rµ  r>  rë  rT   r·  rv   rŒ   r„  Úupper)r7  r}	  r½	  Ú	env_checkrr   r”	  rÖ  rë  Úvoice_configÚ
tts_statusÚ_raw_pttÚ_ptt_keyÚ_ptt_displays                rK   r¶	  zHermesCLI._enable_voice_mode  s¢  € àÔð 	Ý•tÐAÐA½4ÐAÐAÑBÔBÐBØˆFàWÐWÐWÐWÐWÐWÐWÐWð -Ð,Ñ.Ô.ˆ	Ø˜Ô%ð 	ÝÐS�ÐSÐSÍTÐSÐSÑTÔTÐTØ$ ZÔ0ð 4ð 4�ÝÐ2�TÐ2 7Ð2­DÐ2Ð2Ñ3Ô3Ð3Ð3ØˆFà'Ð'Ñ)Ô)ˆØ�KÔ ñ 	ÝÐH�ÐHÐHÅ$ÐHÐHÑIÔIÐIØ˜Yœ×-Ò-¨dÑ3Ô3ð 1ð 1�ÝÐ/�TÐ/ 4Ð/­Ð/Ð/Ñ0Ô0Ð0Ð0ØÐ&Ô'ð Ý)Ñ+Ô+ð ÝÐP¥5ÐPÐPÍ$ÐPÐPÑQÔQÐQÝÐr¥ÐrÐrÕlpÐrÐrÑsÔsÐsÝÐ¥ÐÐÕy}ÐÐñ  Aô  Að  Að  AåÐ}¥5Ð}Ð}µ3´>Ð}Ð}ÐSV×S[ÒS[Ð\`ÐasÔ\tÑSuÔSuÐ}Õw{Ð}Ð}Ñ~Ô~Ð~ØˆFàÔð 	$ð 	$Ø#ˆDÔð	$ð 	$ð 	$ñ 	$ô 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$øøøð 	$ð 	$ð 	$ð 	$ð	Ø5Ð5Ð5Ð5Ð5Ð5Ø&˜;™=œ=×,Ò,¨W°bÑ9Ô9ˆLØ×Ò 
¨EÑ2Ô2ð +ØÔ%ð +ð +Ø&*�D”Oð+ð +ð +ñ +ô +ð +ð +ð +ð +ð +ð +øøøð +ð +ð +ð +øøåð 	ð 	ð 	ØˆDð	øøøð *.¬Ð@Ð%Ð%¸bˆ
ð	Ø5Ð5Ð5Ð5Ð5Ð5Ø"�{‘}”}×(Ò(¨°"Ñ5Ô5×9Ò9¸,ÈÑQÔQˆHØ—~’~Ñ'Ô'×/Ò/°¸Ñ>Ô>×FÒFÀvÈtÑTÔTˆHˆHøÝð 	ð 	ð 	ØˆHˆHˆHð	øøøà×'Ò'¨¨gÑ6Ô6×<Ò<Ñ>Ô>ˆÝÐB•WÐBÐB°
ÐB½DÐBÐBÑCÔCÐCÝÐG•TÐG˜<ÐGÐGÅÐGÐGÑHÔHÐHÝÐD•TÐDÐD½dÐDÐDÑEÔEÐEÝÐB•TÐBÐB½DÐBÐBÑCÔCÐCÐCÐCs\   ÇGÇGÇGÇ"AI È#H7È+I È7H;È;I È>H;È?I É
IÉIÉA4K ËK#Ë"K#c                 óü  — d}| j         5  | j        r'| j        r | j                             ¦   «          d| _        | j        }d| _        d| _        d| _        ddd¦  «         n# 1 swxY w Y   |�4|fd„}t          j        |d¬¦  «         	                    ¦   «          d| _        	 ddl
m}  |¦   «          n# t          $ r Y nw xY w| j                             ¦   «          t          dt           › d	t"          › �¦  «         dS )
z>Disable voice mode, cancel any active recording, and stop TTS.NFc                 óR   — 	 |                       ¦   «          d S # t          $ r Y d S w xY wr\   )Úshutdownrv   )Úrecs    rK   Ú_bg_shutdownz3HermesCLI._disable_voice_mode.<locals>._bg_shutdownX  s:   € ðØ—L’L‘N”N�N�N�NøÝ ð ð ð Ø�D�Dðøøøs   ‚ ˜
&¥&Tr>	  r   ©Ústop_playbackrZ   zVoice mode disabled.)rµ  r¹  r¸  Úcancelr¶  r·  r»  r¥  r’  r“  ro	  rÖ	  rv   r½  r´   rj  r‹  rŒ  )r7  ÚrecorderrÔ	  rÖ	  s       rK   r·	  zHermesCLI._disable_voice_modeJ  s  € àˆØÔð 	+ð 	+ØÔ$ð .¨Ô)=ð .ØÔ$×+Ò+Ñ-Ô-Ð-Ø(-�Ô%ØÔ+ˆHØ$ˆDÔØ#ˆDŒOØ%*ˆDÔ"ð	+ð 	+ð 	+ñ 	+ô 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+øøøð 	+ð 	+ð 	+ð 	+ð ÐØ!)ð ð ð ð õ
 Ô L¸Ð>Ñ>Ô>×DÒDÑFÔFÐFØ#'ˆDÔ ð	Ø6Ð6Ð6Ð6Ð6Ð6ØˆM‰OŒOˆOˆOøÝð 	ð 	ð 	ØˆDð	øøøàÔ× Ò Ñ"Ô"Ð"åÐ5•TÐ5Ð5­tÐ5Ð5Ñ6Ô6Ð6Ð6Ð6s$   ŠAA!Á!A%Á(A%Â#B4 Â4
CÃ Cc                 ón  — | j         s t          t          › dt          › �¦  «         dS | j        5  | j         | _        ddd¦  «         n# 1 swxY w Y   | j        rdnd}| j        r.ddlm}  |¦   «         st          t          › dt          › �¦  «         t          t          › d|› d	t          › �¦  «         dS )
z!Toggle TTS output for voice mode.z"Enable voice mode first: /voice onNrÓ   Údisabledr   )Úcheck_tts_requirementszEWarning: No TTS provider available. Install edge-tts or set API keys.z
Voice TTS rÁ   )	r¶  rj  r‹  rŒ  rµ  r·  r­	  rÛ	  rñ  )r7  rý  rÛ	  s      rK   r¸	  zHermesCLI._toggle_voice_ttsj  s  € àÔð 	Ý•tÐEÐE½tÐEÐEÑFÔFÐFØˆFàÔð 	2ð 	2Ø"&¤/Ð1ˆDŒOð	2ð 	2ð 	2ñ 	2ô 	2ð 	2ð 	2ð 	2ð 	2ð 	2ð 	2øøøð 	2ð 	2ð 	2ð 	2à"œoÐ=��°:ˆàŒ?ð 	nØ=Ð=Ð=Ð=Ð=Ð=Ø)Ð)Ñ+Ô+ð nÝ�4ÐlÐlÕfjÐlÐlÑmÔmÐmå•7Ð5Ð5 fÐ5Ð5­tÐ5Ð5Ñ6Ô6Ð6Ð6Ð6s   ¯A	Á	AÁAc                 ó¸  — ddl m} ddlm}  |¦   «         }t	          dt
          › dt          › �¦  «         t	          d| j        rdnd› �¦  «         t	          d	| j        rdnd› �¦  «         t	          d
| j	        rdnd› �¦  «          |¦   «          
                    di ¦  «         
                    dd¦  «        }d|                     ¦   «         v r(|                     dd¦  «                             ¦   «         n|}t	          d|› �¦  «         t	          dt
          › dt          › �¦  «         |d                              d¦  «        D ]}t	          d|› �¦  «         ŒdS )zShow current voice mode status.r   rê  )r}	  rZ   zVoice Mode Statusz  Mode:      rÔ  rÓ  z  TTS:       z  Recording: ÚYESÚnor-  rÁ	  rÂ	  rÃ	  rÈ	  z  Record key: rq  zRequirements:r	  r  N)r>  rë  ro	  r}	  rj  rt  rŒ  r¶  r·  r¹  rT   rŒ   r„  rÉ	  r  )r7  rë  r}	  r”	  Ú_raw_keyÚ_display_keyrÖ  s          rK   r¹	  zHermesCLI._show_voice_status{  sœ  € à1Ð1Ð1Ð1Ð1Ð1Ø=Ð=Ð=Ð=Ð=Ð=à'Ð'Ñ)Ô)ˆåÐ3•UÐ3Ð3­TÐ3Ð3Ñ4Ô4Ð4ÝÐE¨Ô(8Ð C  ¸eÐEÐEÑFÔFÐFÝÐD¨¬Ð B  ¸UÐDÐDÑEÔEÐEÝÐJ¨Ô)>Ð H  ÀDÐJÐJÑKÔKÐKØ�;‘=”=×$Ò$ W¨bÑ1Ô1×5Ò5°lÀHÑMÔMˆØELÐPX×P^ÒP^ÑP`ÔP`ÐE`ÐE`�x×'Ò'¨°Ñ9Ô9×?Ò?ÑAÔAÐAÐfnˆÝÐ/ Ð/Ð/Ñ0Ô0Ð0ÝÐ1•uÐ1Ð1­4Ð1Ð1Ñ2Ô2Ð2Ø˜”O×)Ò)¨$Ñ/Ô/ð 	#ð 	#ˆDÝ�M˜4�M�MÑ"Ô"Ð"Ð"ð	#ð 	#rM   c                 ó@  — ddl }t                               di ¦  «                             dd¦  «        }t          j        ¦   «         }| }||s|ng d|dœ| _        |                     ¦   «         |z   | _        || _        |  	                    ¦   «          |                     ¦   «         }	 	 |                     d¬	¦  «        }d| _        |S # t          j
        $ ry | j        |                     ¦   «         z
  }	|	dk    rY nY|                     ¦   «         }
|
|z
  d
k    r|
}|  	                    ¦   «          |
|z
  d
k    r|
}|  	                    ¦   «          Y nw xY wŒ¬d| _        d| _        d| _        |  	                    ¦   «          t          dt          › d|› dt          › �¦  «         	 dS )a‘  
        Platform callback for the clarify tool. Called from the agent thread.

        Sets up the interactive selection UI (or freetext prompt for open-ended
        questions), then blocks until the user responds via the prompt_toolkit
        key bindings.  If no response arrives within the configured timeout the
        question is dismissed and the agent is told to decide on its own.
        r   Nr   rÆ   rÏ   )ÚquestionÚchoicesr0  Úresponse_queueTr  r	  r;	  FrZ   z(clarify timed out after u   s â€” agent will decide)zrThe user did not provide a response within the time limit. Use your best judgement to make the choice and proceed.)rÿ  ri  rT   r?  r˜  r�  rÔ  rŸ  rž  rÖ  ÚEmptyrj  r‹  rŒ  )r7  râ	  rã	  Ú_timerÆ   rä	  Úis_open_endedÚ_last_countdown_refreshr€   rí  r  s              rK   rj  zHermesCLI._clarify_callback�  sí  € ð 	ÐÐÐå—.’. ¨BÑ/Ô/×3Ò3°I¸sÑCÔCˆÝœ™œˆØ#˜ˆð !Ø&3Ð;�w�w¸ØØ,ð	
ð 
ˆÔð "'§¢Ñ!2Ô!2°WÑ!<ˆÔà!.ˆÔð 	×ÒÑÔÐð #(§/¢/Ñ"3Ô"3Ðð	'ð'Ø'×+Ò+°AÐ+Ñ6Ô6�Ø)*�Ô&Ø�øÝ”;ð 'ð 'ð 'Ø Ô2°U·_²_Ñ5FÔ5FÑF�	Ø ’>�>Ø�Eà—o’oÑ'Ô'�ØÐ0Ñ0°CÒ7Ð7Ø.1Ð+Ø×$Ò$Ñ&Ô&Ð&ØÐ0Ñ0°CÒ7Ð7Ø.1Ð+Ø×$Ò$Ñ&Ô&Ð&øøð'øøøð	'ð& #ˆÔØ!&ˆÔØ!"ˆÔØ×ÒÑÔÐÝÐ[•TÐ[Ð[°GÐ[Ð[ÕUYÐ[Ð[Ñ\Ô\Ð\ðFð	
ð 	
s   Â'C Ã1EÃ9AEÅEc                 ó:  — ddl }d}t          j        ¦   «         }|                      ¦   «          d|i| _        |                     ¦   «         |z   | _        |                      ¦   «          	 	 |                     d¬¦  «        }d| _        d| _        |  	                    ¦   «          |                      ¦   «          |r t          dt          › d	t          › �¦  «         nt          dt          › d
t          › �¦  «         |S # t          j        $ r; | j        |                     ¦   «         z
  }|dk    rY n|                      ¦   «          Y nw xY wŒÞd| _        d| _        |  	                    ¦   «          |                      ¦   «          t          dt          › dt          › �¦  «         dS )a%  
        Prompt for sudo password through the prompt_toolkit UI.
        
        Called from the agent thread when a sudo command is encountered.
        Uses the same clarify-style mechanism: sets UI state, waits on a
        queue for the user's response via the Enter key binding.
        r   Nrù   rä	  Tr  r	  rZ   u,     âœ“ Password received (cached for session)u     â�­ Skippedu)     â�± Timeout â€” continuing without sudor:   )rÿ  r?  r˜  r3  r   rÔ  r¡  rÖ  rT   r8  rj  r‹  rŒ  rå	  )r7  ræ	  rÆ   rä	  r€   rí  s         rK   r‚  z!HermesCLI._sudo_password_callbackÐ  sÈ  € ð 	ÐÐÐàˆÝœ™œˆà×*Ò*Ñ,Ô,Ð,à˜nð
ˆÔð $ŸošoÑ/Ô/°'Ñ9ˆÔà×ÒÑÔÐð	#ð#Ø'×+Ò+°AÐ+Ñ6Ô6�Ø#'�Ô Ø&'�Ô#Ø×2Ò2Ñ4Ô4Ð4Ø× Ò Ñ"Ô"Ð"Øð <ÝÐY¥ÐYÐYÕSWÐYÐYÑZÔZÐZÐZåÐ:¥Ð:Ð:µDÐ:Ð:Ñ;Ô;Ð;Ø�øÝ”;ð #ð #ð #Ø Ô/°%·/²/Ñ2CÔ2CÑC�	Ø ’>�>Ø�EØ× Ò Ñ"Ô"Ð"Ð"Ð"ð	#øøøð	#ð$  ˆÔØˆÔØ×*Ò*Ñ,Ô,Ð,Ø×ÒÑÔÐÝÐJ•TÐJÐJÅDÐJÐJÑKÔKÐKØˆrs   Á)BC8 Ã81EÄ+EÅE©Úallow_permanentr=  rë	  c                ó2  — ddl }| j        5  d}t          j        ¦   «         }|||                      ||¬¦  «        d|dœ| _        |                     ¦   «         |z   | _        |                      ¦   «          |                     ¦   «         }	 	 | 	                    d¬¦  «        }d| _        d| _        |                      ¦   «          |cddd¦  «         S # t          j
        $ rZ | j        |                     ¦   «         z
  }	|	dk    rY n:|                     ¦   «         }
|
|z
  d	k    r|
}|                      ¦   «          Y nw xY wŒ´d| _        d| _        |                      ¦   «          t          d
t          › dt          › �¦  «         	 ddd¦  «         dS # 1 swxY w Y   dS )a…  
        Prompt for dangerous command approval through the prompt_toolkit UI.

        Called from the agent thread. Shows a selection UI similar to clarify
        with choices: once / session / always / deny. When allow_permanent
        is False (tirith warnings present), the 'always' option is hidden.
        Long commands also get a 'view' option so the full command can be
        expanded before deciding.

        Uses _approval_lock to serialize concurrent requests (e.g. from
        parallel delegation subtasks) so each prompt gets its own turn
        and the shared _approval_state / _approval_deadline aren't clobbered.
        r   NrÂ   rê	  )r   r=  rã	  r0  rä	  Tr  r	  r;	  rZ   u!     â�± Timeout â€” denying commandÚdeny)rÿ  r§  r?  r˜  Ú_approval_choicesr£  rÔ  r¤  rÖ  rT   rå	  rj  r‹  rŒ  )r7  r   r=  rë	  ræ	  rÆ   rä	  rè	  r€   rí  r  s              rK   rƒ  zHermesCLI._approval_callbackþ  s2  € ð 	ÐÐÐàÔ ð $	ð $	ØˆGÝ"œ[™]œ]ˆNð #Ø*Ø×1Ò1°'È?Ð1Ñ[Ô[ØØ"0ð$ð $ˆDÔ ð ',§o¢oÑ&7Ô&7¸'Ñ&AˆDÔ#à×ÒÑÔÐà&+§o¢oÑ&7Ô&7Ð#ð+ð+Ø+×/Ò/¸Ð/Ñ:Ô:�FØ+/�DÔ(Ø./�DÔ+Ø×$Ò$Ñ&Ô&Ð&Ø!ð-$	ð $	ð $	ð $	ñ $	ô $	ð $	ð $	øõ. ”{ð +ð +ð +Ø $Ô 7¸%¿/º/Ñ:KÔ:KÑ K�IØ  A’~�~Ø˜ØŸ/š/Ñ+Ô+�CØÐ4Ñ4¸Ò;Ð;Ø25Ð/Ø×(Ò(Ñ*Ô*Ð*øøð+øøøð+ð  $(ˆDÔ Ø&'ˆDÔ#Ø×ÒÑÔÐÝÐF�ÐFÐFÅÐFÐFÑGÔGÐGØðI$	ð $	ð $	ñ $	ô $	ð $	ð $	ð $	ð $	ð $	ð $	ð $	øøøð $	ð $	ð $	ð $	ð $	ð $	s=   ŒA=FÂ
9CÃ1D9ÄFÄ3D9Ä6FÄ8D9Ä9AFÆFÆFc                ój   — |rg d¢ng d¢}t          |¦  «        dk    r|                     d¦  «         |S )z7Return approval choices for a dangerous command prompt.)ÚoncerÈ  Úalwaysrí	  )rð	  rÈ  rí	  éF   Úview)r  r–   )r7  r   rë	  rã	  s       rK   rî	  zHermesCLI._approval_choices5  sG   € à;JÐkÐ7Ð7Ð7Ð7ÐPkÐPkÐPkˆÝˆw‰<Œ<˜"ÒÐØ�NŠN˜6Ñ"Ô"Ð"ØˆrM   c                 óH  — | j         }|sdS |                     dd¦  «        }|                     d¦  «        }t          |t          ¦  «        sg }d|cxk    rt	          |¦  «        k     sn dS ||         }|dk    rrd|d<   d„ |D ¦   «         |d<   |d         t	          |d         ¦  «        k    r)t          dt	          |d         ¦  «        d	z
  ¦  «        |d<   |                      ¦   «          dS |d
                              |¦  «         d| _         |                      ¦   «          dS )zAProcess the currently selected dangerous-command approval choice.Nr0  r   rã	  ró	  TÚ	show_fullc                 ó   — g | ]
}|d k    ¯|‘ŒS )ró	  r]   )rW   Úchoices     rK   rY   z8HermesCLI._handle_approval_selection.<locals>.<listcomp>L  s"   € ÐQÐQÐQ¨6ÀÈ&Ò@PÐ@P Ð@PÐ@PÐ@PrM   r  rä	  )r£  rT   rR   ra   r  rÐ  rÖ  rD  )r7  r€  r0  rã	  Úchosens        rK   Ú_handle_approval_selectionz$HermesCLI._handle_approval_selection<  sG  € àÔ$ˆØð 	ØˆFà—9’9˜Z¨Ñ+Ô+ˆØ—)’)˜IÑ&Ô&ˆÝ˜'¥4Ñ(Ô(ð 	ØˆGØ�XÐ,Ð,Ò,Ð,¥ G¡¤Ò,Ð,Ð,Ð,ØˆFà˜Ô"ˆØ�VÒÐØ!%ˆE�+ÑØQÐQ°WÐQÑQÔQˆE�)ÑØ�ZÔ ¥C¨¨iÔ(8Ñ$9Ô$9Ò9Ð9Ý$'¨­3¨u°YÔ/?Ñ+@Ô+@À1Ñ+DÑ$EÔ$E��jÑ!Ø×ÒÑÔÐØˆFàÐÔ×#Ò# FÑ+Ô+Ð+Ø#ˆÔØ×ÒÑÔÐÐÐrM   c                 óð  — | j         }|sg S dBdt          dt          t                   dt          dt          dt          f
d„}dCd
t          dt          dt          dt          t                   fd„}dt          dt          d
t          dt          ddf
d„}dt          dt          ddfd„}|d         }|d         }|d         }|                     dd¦  «        }	|                     dd¦  «        }
d}|
st          |¦  «        dk    r|n|dd…         dz   }ddd d!d"d#œ} ||d$¦  «        }|                      ||d$¦  «        ¦  «         t          |¦  «        D ]H\  }}||	k    rd%nd&}|                      ||› |                     ||¦  «        › �d$d&¬'¦  «        ¦  «         ŒI |||¦  «        }t          d(|d)z
  ¦  «        } |||¦  «        }g }t          |¦  «        D ]~\  }}|                     ||¦  «        }|d*k     rt          |d+z   ¦  «        }n|d*k    rd,}nd-}||	k    rd%|› d.�}nd&|› d.�} ||› |› �|d/¬'¦  «        D ]}| 	                    ||f¦  «         ŒŒt          j        d0¦  «        j        }d1}d2}d3}t          d||z
  ¦  «        }|t          |¦  «        z   t          |¦  «        z   }||k    }|r|n|} t          d+|| z
  t          |¦  «        z
  ¦  «        }!t          |¦  «        |!k    r)|!d+k    rt          d+|!d+z
  ¦  «        nd+}"|d|"…         d4gz   }| t          |¦  «        z   t          |¦  «        z   }#|rdnd+}$||#z
  |$z
  }%t          dt          |%d5¦  «        ¦  «        }%|r |||¦  «        ng }&|%d+k     s|&sg }&n4t          |&¦  «        |%k    r!t          d+|%d+z
  ¦  «        }"|&d|"…         d6gz   }&g }'|' 	                    d7d8d9|z  z   d:z   f¦  «          ||'d7d;||¦  «         |s ||'d7|¦  «         |D ]} ||'d7d<||¦  «         Œ|s ||'d7|¦  «         |D ]\  }}||	k    rd=nd>}( ||'d7|(||¦  «         Œ|&r#|s ||'d7|¦  «         |&D ]} ||'d7d?||¦  «         Œ|' 	                    d7d@d9|z  z   dAz   f¦  «         |'S )Da  Render the dangerous-command approval panel for the prompt_toolkit UI.

        Layout priority: title + command + choices must always render, even if
        the terminal is short or the description is long. Description is placed
        at the bottom of the panel and gets truncated to fit the remaining row
        budget. This prevents HSplit from clipping approve/deny off-screen when
        tirith findings produce multi-paragraph descriptions or when the user
        runs in a compact terminal pane.
        é.   rJ  Ú
title_textÚcontent_linesÚ	min_widthr  r7   c           	      ó  — t          j        d¦  «        j        }t          t	          | ¦  «        gd„ |D ¦   «         z   |dz
  gz   ¦  «        }t          t          |dz   |dz
  ¦  «        |dz
  t          d|dz
  ¦  «        ¦  «        }|dz   S )N©rÝ  rÓ  c                 ó,   — g | ]}t          |¦  «        ‘ŒS r]   rÚ  r†  s     rK   rY   zWHermesCLI._get_approval_display_fragments.<locals>._panel_box_width.<locals>.<listcomp>f  s   € Ð.SÐ.SÐ.S¸T­s°4©y¬yÐ.SÐ.SÐ.SrM   r¶  r�  rð  rf  ©rž   rÖ  r×  rÐ  r  r  )rü	  rý	  rþ	  r  Ú	term_colsÚlongestr  s          rK   Ú_panel_box_widthzCHermesCLI._get_approval_display_fragments.<locals>._panel_box_widthd  s�   € ÝÔ0°Ñ;Ô;ÔCˆIÝ�3˜z™?œ?Ð+Ð.SÐ.SÀ]Ð.SÑ.SÔ.SÑSÐW`ÐcdÑWdÐVeÑeÑfÔfˆGÝ�˜G a™K¨°Q©Ñ7Ô7¸ÀQ¹ÍÈBÐPYÐ\]ÑP]ÑH^ÔH^Ñ_Ô_ˆEØ˜1‘9ÐrM   r:   r6   rÉ  Úsubsequent_indentc                 óZ   — t          j        | t          d|¦  «        dd|¬¦  «        }|pdgS )Nrª  F)rÉ  Úreplace_whitespaceÚdrop_whitespacer
  r:   ©r‰  ÚwraprÐ  ©r6   rÉ  r
  Úwrappeds       rK   Ú_wrap_panel_textzCHermesCLI._get_approval_display_fragments.<locals>._wrap_panel_textj  s=   € Ý”mØÝ˜!˜U‘m”mØ#(Ø %Ø"3ðñ ô ˆGð �?˜r˜dÐ"rM   r   Úcontent_styleÚ	box_widthNc                 óÜ   — t          d|dz
  ¦  «        }|                      |df¦  «         |                      ||                     |¦  «        f¦  «         |                      |df¦  «         d S ©Nr   r�  u   â”‚ u    â”‚
©rÐ  r–   r  ©r“  r   r
  r6   r
  rx  s         rK   Ú_append_panel_linezEHermesCLI._get_approval_display_fragments.<locals>._append_panel_linet  ól   € Ý˜a ¨Q¡Ñ/Ô/ˆKØ�LŠL˜,¨Ð/Ñ0Ô0Ð0Ø�LŠL˜-¨¯ª°KÑ)@Ô)@ÐAÑBÔBÐBØ�LŠL˜,¨Ð1Ñ2Ô2Ð2Ð2Ð2rM   c                 óF   — |                       |dd|z  z   dz   f¦  «         d S ©Nu   â”‚r‚  u   â”‚
©r–   ©r“  r   r
  s      rK   Ú_append_blank_panel_linezKHermesCLI._get_approval_display_fragments.<locals>._append_blank_panel_linez  ó-   € Ø�LŠL˜,¨°°y±Ñ(AÀGÑ(KÐLÑMÔMÐMÐMÐMrM   r   r=  rã	  r0  r   rõ	  Fu   âš ï¸�  Dangerous Commandrò	  rÏ  z
Allow oncezAllow for this sessionzAdd to permanent allowlistÚDenyzShow full command)rð	  rÈ  rñ	  rí	  ró	  rÂ   õ   â�¯ r8  ©r
  rª  r�  é	   r  Ú0r‚  r‚  r  ©rÝ  rð  rœ  rý  rf  u=   â€¦ (command truncated â€” use /logs or /debug for full text)rá  u   â€¦ (description truncated)zclass:approval-borderu   â•­rÈ  õ   â•®
zclass:approval-titlezclass:approval-cmdzclass:approval-selectedzclass:approval-choicezclass:approval-descrú  õ   â•¯
©rû	  rJ  ©r:   )r£  rU   ra   rô  rT   r  r®  r¼  rÐ  r–   rž   rÖ  r“  r  ))r7  r€  r
  r
  r
  r
  r   r=  rã	  r0  rõ	  rL  Úcmd_displayÚchoice_labelsr´  r  r÷	  r+  r
  Úinner_text_widthÚcmd_wrappedÚchoice_wrappedró  Ú
num_prefixr
  r;  Úchrome_fullÚchrome_tightr<  rw  Úmandatory_fullÚuse_compact_chromeÚchrome_rowsÚmax_cmd_rowsrí  Úmandatory_no_descÚdesc_sep_costÚavailable_for_descÚdesc_wrappedr“  r�  s)                                            rK   Ú_get_approval_display_fragmentsz)HermesCLI._get_approval_display_fragmentsV  s¢  € ð Ô$ˆØð 	ØˆIð	ð 	­ð 	½TÅ#¼Yð 	ÕSVð 	Õhkð 	Õuxð 	ð 	ð 	ð 	ð	#ð 	#¥3ð 	#­sð 	#Åsð 	#ÕTXÕY\ÔT]ð 	#ð 	#ð 	#ð 	#ð	3µCð 	3Íð 	3ÕSVð 	3Õcfð 	3Ðkoð 	3ð 	3ð 	3ð 	3ð	N½#ð 	NÍ#ð 	NÐRVð 	Nð 	Nð 	Nð 	Nð ˜	Ô"ˆØ˜MÔ*ˆØ˜	Ô"ˆØ—9’9˜Z¨Ñ+Ô+ˆØ—I’I˜k¨5Ñ1Ô1ˆ	à+ˆØ!*ÐZ­c°'©l¬l¸bÒ.@Ð.@�g�gÀgÈcÈrÈcÄlÐUZÑFZˆà Ø/Ø2ØØ'ð
ð 
ˆð )Ð(¨°bÑ9Ô9ˆØ×ÒÐ-Ð-¨k¸2Ñ>Ô>Ñ?Ô?Ð?Ý" 7Ñ+Ô+ð 	ð 	‰IˆAˆvØ  Hš}˜}�V�V°$ˆFØ× Ò Ð!1Ð!1ØÐ>˜=×,Ò,¨V°VÑ<Ô<Ð>Ð>ØØ"&ð"ñ "ô "ñ ô ð ð ð %Ð$ U¨MÑ:Ô:ˆ	Ý˜q )¨a¡-Ñ0Ô0Ðð 'Ð& {Ð4DÑEÔEˆð 13ˆÝ" 7Ñ+Ô+ð 	4ð 	4‰IˆAˆvØ!×%Ò% f¨fÑ5Ô5ˆEà�1ŠuˆuÝ   Q¡™ZœZ�
�
Ø�a’�Ø �
�
à �
Ø�HŠ}ˆ}Ø. 
Ð.Ð.Ð.��à,˜jÐ,Ð,Ð,�Ø+Ð+¨vÐ,>°uÐ,>Ð,>Ð@PÐdjÐkÑkÔkð 4ð 4�Ø×%Ò% q¨' lÑ3Ô3Ð3Ð3ð4õ Ô,¨YÑ7Ô7Ô=ˆ	ØˆØˆØˆå˜˜9 ~Ñ5Ñ6Ô6ˆ	Ø$¥s¨;Ñ'7Ô'7Ñ7½#¸nÑ:MÔ:MÑMˆð ,¨iÒ7ÐØ&8ÐI�l�l¸kˆõ
 ˜1˜i¨+Ñ5½¸NÑ8KÔ8KÑKÑLÔLˆÝˆ{ÑÔ˜lÒ*Ð*Ø/;¸aÒ/?Ð/?•3�q˜,¨Ñ*Ñ+Ô+Ð+ÀQˆDØ% e t eÔ,Ð0oÐ/pÑpˆKð (­#¨kÑ*:Ô*:Ñ:½SÀÑ=PÔ=PÑPÐØ/Ð6˜˜°QˆØ&Ð):Ñ:¸]ÑJÐå  ¥CÐ(:¸BÑ$?Ô$?Ñ@Ô@ÐàJUÐ]Ð'Ð'¨Ð5EÑFÔFÐFÐ[]ˆØ Ò!Ð!¨Ð!ØˆLˆLÝ�ÑÔÐ!3Ò3Ð3Ý�qÐ,¨qÑ0Ñ1Ô1ˆDØ'¨¨¨Ô.Ð2OÐ1PÑPˆLð ˆØ�ŠÐ-¨u¸À	Ñ8IÑ/JÈWÑ/TÐUÑVÔVÐVØÐ˜5Ð"9Ð;QÐSXÐZcÑdÔdÐdØ!ð 	PØ$Ð$ UÐ,CÀYÑOÔOÐOà"ð 	ið 	iˆGØÐ˜uÐ&=Ð?SÐU\Ð^gÑhÔhÐhÐhØ!ð 	PØ$Ð$ UÐ,CÀYÑOÔOÐOà(ð 	Zð 	Z‰JˆAˆwØ12°h²°Ð-Ð-ÐD[ˆEØÐ˜uÐ&=¸uÀgÈyÑYÔYÐYÐYàð 	nØ%ð TØ(Ð(¨Ð0GÈÑSÔSÐSØ'ð nð n�Ø"Ð" 5Ð*AÐCXÐZaÐclÑmÔmÐmÐmà�ŠÐ-¨u¸À	Ñ8IÑ/JÈWÑ/TÐUÑVÔVÐVØˆrM   Úvar_namer¼  c                 ó&   — t          | |||¦  «        S r\   r€  )r7  r8
  r¼  Úmetadatas       rK   r„  z"HermesCLI._secret_capture_callbackú  s   € Ý   x°¸ÑBÔBÐBrM   c                 óÔ   — | j         €t          | dd¦  «        sdS 	 | j        j        }|j        |j        dœ| _         |                     ¦   «          dS # t          $ r d| _         Y dS w xY w)zITemporarily clear the input buffer and save the user's in-progress draft.NrŒ  )r6   r
  )r¢  r–  rŒ  r	  r6   r
  rH  rv   )r7  rœ  s     rK   r3  z'HermesCLI._capture_modal_input_snapshotý  s‰   € àÔ%Ð1½ÀÀvÈtÑ9TÔ9TÐ1ØˆFð	.Ø”)Ô*ˆCàœØ#&Ô#6ð*ð *ˆDÔ&ð �IŠI‰KŒKˆKˆKˆKøÝð 	.ð 	.ð 	.Ø)-ˆDÔ&Ð&Ð&Ð&ð	.øøøs   œ4A ÁA'Á&A'c                 ó4  — | j         }d| _         |rt          | dd¦  «        sdS 	 | j        j        }|                     dd¦  «        |_        t          |                     dd¦  «        t          |j        ¦  «        ¦  «        |_        dS # t          $ r Y dS w xY w)zERestore any draft text that was present before a modal prompt opened.NrŒ  r6   r:   r
  r   )
r¢  r–  rŒ  r	  rT   r6   r  r  r
  rv   )r7  r  rœ  s      rK   r8  z'HermesCLI._restore_modal_input_snapshot   s§   € àÔ-ˆØ%)ˆÔ"Øð 	�w t¨V°TÑ:Ô:ð 	ØˆFð	Ø”)Ô*ˆCØ—|’| F¨BÑ/Ô/ˆCŒHÝ"% h§l¢lÐ3DÀaÑ&HÔ&HÍ#ÈcÌhÉ-Ì-Ñ"XÔ"XˆCÔÐÐøÝð 	ð 	ð 	ØˆDˆDð	øøøs   ¥A"B	 Â	
BÂBr�   c                 óœ   — | j         sd S | j         d                              |¦  «         d | _         d| _        |                      ¦   «          d S )Nrä	  r   )r©  rD  rª  rÖ  )r7  r�   s     rK   Ú_submit_secret_responsez!HermesCLI._submit_secret_response   sW   € ØÔ!ð 	ØˆFØÔÐ+Ô,×0Ò0°Ñ7Ô7Ð7Ø!ˆÔØ !ˆÔØ×ÒÑÔÐÐÐrM   c                 ó0   — |                       d¦  «         d S rÄ  )r>
  rG  s    rK   Ú_cancel_secret_capturez HermesCLI._cancel_secret_capture    s   € Ø×$Ò$ RÑ(Ô(Ð(Ð(Ð(rM   c                 óŒ   — t          | dd ¦  «        r2	 | j        j                             ¦   «          d S # t          $ r Y d S w xY wd S )NrŒ  )r–  rŒ  r	  rH  rv   rG  s    rK   Ú_clear_secret_input_bufferz$HermesCLI._clear_secret_input_buffer#   sd   € Ý�4˜ Ñ&Ô&ð 	ðØ”	Ô(×.Ò.Ñ0Ô0Ð0Ð0Ð0øÝð ð ð Ø��ðøøøð	ð 	s   “3 ³
AÁ Ac                 ó"   ‡ ‡‡;‡<‡=‡>‡?— t          ‰ j        ¦  «         ‰                      ¦   «         sdS ‰                      ‰¦  «        }|d         ‰ j        k    rd‰ _        ‰ j        €t          t          › dt          › �¦  «         ‰  	                    |d         |d         | 
                    d¦  «        ¬¦  «        sdS |r-‰                      t          ‰t          ¦  «        r‰nd|¦  «        Št          ‰t          ¦  «        �r%d	‰v �r 	 d
dlm} d
dlm}  |‰ j        ‰ j        pd‰ j        pd¬¦  «        } |‰t+          j        ¦   «         |¬¦  «        }|j        s|j        r˜|j        r<t          dt          › dt5          |j        ¦  «        › d|j        › dt          › �¦  «         |j        D ]#}t          dt          › d|› t          › �¦  «         Œ$|j        rd                     |j        ¦  «        pdS |j        Šn,# t>          $ r}	tA          j!        d|	¦  «         Y d}	~	nd}	~	ww xY wt          ‰t          ¦  «        rd
dl"m#}
  |
‰¦  «        Š‰ j$         %                    d‰dœ¦  «         tM          ¦   «          '                    dtQ          ¦   «         › dd› d�¦  «         tO          d¬¦  «         	 dŠ=‰  )                    ¦   «          d ‰ _*        d }d Š;dŠ?d}dŠ>d}‰ j+        ra	 d
d!l,m-}m.}m/}m0}m1}  |¦   «         } ||¦  «        d"k    r |¦   «           |¦   «          d}n"# td          tf          f$ r Y nt>          $ r Y nw xY w|rwti          j5        ¦   «         Š?tm          j7        ¦   «         }d#t          fˆ;ˆ fd$„}tm          j8        |‰?|‰ j9        fd%|id¬&¦  «        }| :                    ¦   «          d't          fˆ?fd(„Š>dŠ<‰ j;        rt          ‰t          ¦  «        rd)Š<ˆ<ˆˆ=ˆ ˆ>fd*„}ty          j<        ¦   «         ‰ _=        d+‰ _>        tm          j8        |d¬,¦  «        }| :                    ¦   «          d}| ?                    ¦   «         �rÃt�          ‰ d-¦  «        �rˆ	 ‰ jA         
                    d.¬/¦  «        }|�r=‰ jB        s‰ jC        rŒTtO          d0¦  «         |�| D                    ¦   «          ‰ j         E                    |¦  «         	 tŒ          d1z  }t�          |d2¦  «        5 }| H                    ty          jI        d3¦  «        › d4t          |¦  «        dd5…         ›d6t5          ‰ j        jJ        ¦  «        › d7‰ j        jK        › d�¦  «         t™          ‰ j        jJ        ¦  «        D ]&\  }}| H                    d8|› d9|jK        › d�¦  «         Œ'	 ddd¦  «         n# 1 swxY w Y   n# t>          $ r Y nw xY wnVn@# th          jM        $ r ‰  N                    d:¬;¦  «         Y nw xY w|                     d.¦  «         | ?                    ¦   «         �°Ã|�†tŸ          d<¦  «        D ]A}|                     d=¬/¦  «         | ?                    ¦   «         s nt¡          ‰ d>d ¦  «        r nŒB| ?                    ¦   «         r t¢           R                    d?|jS        ¦  «         n|                     d@¬/¦  «         ‰ j=        �5t©          d+ty          j<        ¦   «         ‰ j=        z
  ¦  «        ‰ _>        d‰ _=        	 d
dAlUmV}  |¦   «          n# t>          $ r Y nw xY w‰  W                    ¦   «          |r/‰?�-‰? X                    d¦  «         |�|                     dB¬/¦  «         t²          jZ         [                    ¦   «          ty          j\        d:¦  «         ‰=r‰= 
                    dC‰ j$        ¦  «        n‰ j$        ‰ _$        ‰ j        rCt¡          ‰ j        dDd¦  «        r-‰ j        j]        ‰ j]        k    r‰ j        j]        ‰ _]        d‰ _^        ‰=r‰= 
                    dEd¦  «        nd}|rb‰=r`‰= 
                    dF¦  «        sK‰= 
                    dG¦  «        s6	 d
dHl_m`}  |‰ ja        ‰ j]        ‰|‰ j$        ¦  «         n# t>          $ r Y nw xY w‰=rt‰= 
                    dF¦  «        s‰= 
                    dG¦  «        rJ|sH‰= 
                    dIdJ¦  «        } dK| › �}‰ jb        r&d ‰ _b        t          dt          › dLt          › �¦  «         d}!‰=r5‰= 
                    dM¦  «        r ‰= 
                    dN¦  «        p|}!|r|!r|dOz   }‰=r‰= 
                    dPd ¦  «        nd }"t¡          ‰ dQd ¦  «        }#‰ jc        �rJ‰=�rG|#�sD‰= 
                    dR¦  «        }$|$�r,tÉ          je        ¦   «         jf        }dS}%|dTz
  t5          |%¦  «        z
  }&t          › dU|%› dVt©          |&dWz
  d
¦  «        z  › dXt          › �}'t          › dYdV|dTz
  z  › dZt          › �}(|$ g                    ¦   «          h                    ¦   «         })t5          |)¦  «        d[k    rFd                     |)dd[…         ¦  «        }*|*dt          › d\t5          |)¦  «        d[z
  › d]t          › �z  }*n|$ g                    ¦   «         }*t          d|'› dt          › |*› t          › d|(› �¦  «         |�rP|"�sM	 d
d^limj}+  |+¦   «         },|, k                    d_d`¦  «        }-|, l                    dadb¦  «        }.|, l                    dcdd¦  «        }/n# t>          $ r	 d`}-db}.dd}/Y nw xY w‰=o)‰= 
                    dF¦  «        p‰= 
                    dG¦  «        }0‰ jm        o	‰ jn        o|0 }1|rE‰;rC|0sAtÉ          je        ¦   «         jf        }t          dtÞ          › dedV|dTz
  z  › dft          › �¦  «         n_|1rn\tM          ¦   «         }2|2 '                    tá          tã          |‰ jr        ¬g¦  «        d|.› dh|-› d�di|.|/tæ          jt        dj¬k¦  «        ¦  «         ‰ ju        r=t²          jZ         H                    dl¦  «         t²          jZ         [                    ¦   «          ‰=r•‰= 
                    dm¦  «        s€‰= 
                    dM¦  «        sk‰= 
                    dnd
¦  «        }3|3t¡          ‰ j        dodp¦  «        k    r;t¡          ‰ j        dodp¦  «        }4t          dt          › dq|3› dr|4› dst          › �¦  «         ‰ j+        r3|r1|s/tm          j8        ‰ jv        |fd¬t¦  «         :                    ¦   «          |!�rt�          ‰ du¦  «        �r|!g}5‰ jA         w                    ¦   «         s`	 ‰ jA         x                    ¦   «         }6|6r|5 %                    |6¦  «         n# th          jM        $ r Y nw xY w‰ jA         w                    ¦   «         ¯`d                     |5¦  «        }7t5          |5¦  «        }8|7dd<…         t5          |7¦  «        d<k    rdvndz   }9|8dWk    rtO          dw|8› dx|9› dy�¦  «         ntO          dz|9› dy�¦  «         ‰ jy         X                    |7¦  «         ‰=r‰= 
                    d{¦  «        nd}:|:r_t�          ‰ du¦  «        rO|:dd5…         t5          |:¦  «        d5k    rdvndz   }9tO          d||9› dy�¦  «         ‰ jy         X                    |:¦  «         |‰?�'	 ‰? z                    d¦  «         n# t>          $ r Y nw xY w|�| D                    ¦   «          |�+| ?                    ¦   «         r|                     d}¬/¦  «         S S S # t>          $ rŒ}	tO          dK|	› �¦  «         Y d}	~	‰?�'	 ‰? z                    d¦  «         n# t>          $ r Y nw xY w|�| D                    ¦   «          |�,| ?                    ¦   «         r|                     d}¬/¦  «         dS dS dS d}	~	ww xY w# ‰?�'	 ‰? z                    d¦  «         n# t>          $ r Y nw xY w|�| D                    ¦   «          |�+| ?                    ¦   «         r|                     d}¬/¦  «         w w w xY w)~aö  
        Send a message to the agent and get a response.
        
        Handles streaming output, interrupt detection (user typing while agent
        is working), and re-queueing of interrupted messages.
        
        Uses a dedicated _interrupt_queue (separate from _pending_input) to avoid
        race conditions between the process_loop and interrupt monitoring. Messages
        typed while the agent is running go to _interrupt_queue; messages typed while
        idle go to _pending_input.
        
        Args:
            message: The user's message (str or multimodal content list)
            images: Optional list of Path objects for attached images
            
        Returns:
            The agent's response, or None on error
        Nr8  zInitializing agent...rõ   r"  r9  r=  r:   r´  r   )Úpreprocess_context_references)Úget_model_context_lengthr	  )rÅ   rý  r8  z[@ context: z	 ref(s), z tokens]u   âš  rZ   zContext injection refused.z(@ context reference expansion failed: %s©Ú_sanitize_surrogatesrK  rP	  rÞ  r£  rÂ  rU  T)r  F)Ú_load_tts_configÚ_get_providerÚ_import_elevenlabsÚ_import_sounddeviceÚstream_tts_to_speakerÚ
elevenlabsÚsentencec                 ó  •— ‰s]dŠ‰j         j        }d}|dz
  t          |¦  «        z
  }t          dt          › d|› dt          |dz
  d¦  «        z  › d	t          › �¦  «         t          t          › |                      ¦   «         › �¦  «         d
S )zCCalled by TTS consumer when a sentence is ready to display + speak.Tu    âš• Hermes r�  rZ   rî  rÈ  r  r   rï  N)	rh  rÉ  r  rj  rñ  rÐ  rŒ  rò  r¾  )rN
  r  ró  rŠ  Ú_streaming_box_openedr7  s       €€rK   Údisplay_callbackz(HermesCLI.chat.<locals>.display_callback¬   s¡   ø€ ð 1ð `Ø04Ð-Ø œLÔ.˜Ø .˜Ø  1™u¥s¨5¡z¤zÑ1˜ÝÐ ^¥WÐ ^Ð ^°EÐ ^¸5Å3ÀtÈaÁxÐQRÑCSÔCSÑ;SÐ ^Ð ^ÕX\Ð ^Ð ^Ñ_Ô_Ð_Ý�{Ð?¨H¯OªOÑ,=Ô,=Ð?Ð?Ñ@Ô@Ð@Ð@Ð@rM   rQ
  )rñ  rø  rù  r‘  Údeltac                 ó:   •— ‰�‰                      | ¦  «         d S d S r\   )rD  )rR
  Ú
text_queues    €rK   Ústream_callbackz'HermesCLI.chat.<locals>.stream_callback¿   s)   ø€ Ø!Ð-Ø"Ÿš uÑ-Ô-Ð-Ð-Ð-ð .Ð-rM   ui   [Voice input â€” respond concisely and conversationally, 2-3 sentences max. No code blocks or markdown.] c                  ó   •— t          ‰j        ¦  «         t          ‰j        ¦  «         	 t	          ‰j        ¦  «         n# t          $ r Y nw xY w‰r‰‰z   n‰} t          ‰dd ¦  «        }|r|dz   | z   } d ‰_        	 ‰j	         
                    | ‰j        d d…         ‰‰j        ‰r‰nd ¬¦  «        ŠnZ# t          $ rM}t          j        d|d¬¦  «          t          ‰j	        dd	„ ¦  «        |¦  «        }d
|› �g ddd|dœŠY d }~nd }~ww xY w	 t          d ¦  «         t          d ¦  «         t	          d ¦  «         d S # t          $ r Y d S w xY w# 	 t          d ¦  «         t          d ¦  «         t	          d ¦  «         w # t          $ r Y w w xY wxY w)Nrf  r]  r  )r4  r�  rU
  r5  Úpersist_user_messagezrun_conversation raised: %sTru	  Ú_summarize_api_errorc                 ó0   — t          | ¦  «        d d…         S )NrÃ   rA  )rz   s    rK   r€  z3HermesCLI.chat.<locals>.run_agent.<locals>.<lambda>ê   s   € ÕUXÐYZÑU[ÔU[Ð\`Ð]`Ð\`ÔUa€ rM   r{  r   F)rz  rÍ  Ú	api_callsÚ	completedÚfailedr1  )r}  r‚  r~  rƒ  r  r„  rv   r–  rf  rþ   r…  r�  rŠ  r!	  r1  )	Úagent_messageÚ_msnrø  Ú_summaryÚ_voice_prefixr¢  r€   r7  rU
  s	       €€€€€rK   r	  z!HermesCLI.chat.<locals>.run_agentÍ   s&  ø€ õ +¨4Ô+GÑHÔHÐHÝ% dÔ&=Ñ>Ô>Ð>ðÝ/°Ô0MÑNÔNÐNÐNøÝ ð ð ð Ø�Dðøøøà;HÐ U °Ñ 7Ð 7Èg�å˜tÐ%AÀ4ÑHÔH�Øð ;Ø$(¨6¡M°MÑ$A�MØ6:�DÔ3ðØ!œZ×8Ò8Ø%2Ø-1Ô-FÀsÈÀsÔ-KØ(7Ø $¤Ø8EÐ-O¨W¨WÈ4ð 9ñ ô �F�Føõ !ð 
ð 
ð 
Ý”MÐ"?ÀÈtÐTÑTÔTÐTØb�w t¤zÐ3IÐKaÐKaÑbÔbÐcfÑgÔg�Hà*>°HÐ*>Ð*>Ø$&Ø%&Ø%*Ø"&Ø!)ðð �F�F�F�F�F�Føøøøð
øøøðÝ2°4Ñ8Ô8Ð8Ý-¨dÑ3Ô3Ð3Ý3°DÑ9Ô9Ð9Ð9Ð9øÝ$ð ð ð Ø˜˜ðøøøøð	Ý2°4Ñ8Ô8Ð8Ý-¨dÑ3Ô3Ð3Ý3°DÑ9Ô9Ð9Ð9øÝ$ð ð ð Ø˜ðøøøøøøsx   «A  Á 
AÁAÁ<5B2 Â1E Â2
D	Â<ADÃ?E ÄD	Ä	E Ä-D< Ä<
E
Å	E
ÅFÅ-E=Å<FÅ=
F
ÆFÆ	F
Æ
Frb  r>	  rš  çš™™™™™¹?r	  u*   
âš¡ New message detected, interrupting...úinterrupt_debug.logr°  ú%H:%M:%Sz interrupt fired: msg=rÂ   z, children=z, parent._interrupt=z  child[z]._interrupt=rŒ	  r  ró   çš™™™™™É?r›  z_Agent thread still alive after interrupt (thread %s). Daemon thread will be cleaned up on exit.r³  )Úcleanup_stale_async_clientsrÏ   rÍ  rŠ  rz  r\
  Úpartial)Úmaybe_auto_titler1  r¡	  r{  z+Continuous voice mode stopped due to error.ÚinterruptedÚinterrupt_messagez.

---
_[Interrupted - processing new message]_Úresponse_previewedrË  Úlast_reasoningrÆ  r�  rÇ  rÈ  r  rÉ  rÏ  rÐ  rá  z  ... (rˆ  r:  rê  rë  rN  r|  rì  rí  rú  rû  rd  r}  r~  r  r€  r  r[
  rZ
  rú   rÕ   u   âš  Iteration budget reached (r�  u    ) â€” response may be incomplete)rñ  rø  r‘  r™  rÏ  u   
âš¡ Sending z messages after interrupt: 'r  u   
âš¡ Sending after interrupt: 'Úpending_steeru/   
â�© Delivering leftover /steer as next turn: 'rœ  ){r  r„  r3  r<  r‹  rþ   rj  r‹  rŒ  rw  rT   r?  rR   rU   Úagent.context_referencesrD
  rò  rE
  rõ   r¾   rö   r’   r@  r—  ÚblockedÚ
referencesr  Úinjected_tokensr¾	  rb   r¢  rv   r!	  rÂ  r	  rG
  r�  r–   ré  r¹  rT  rÝ  rË  r·  r­	  rH
  rI
  rJ
  rK
  rL
  r¯  rÆ  r?  r˜  r¥  r¼  r’  r½  r“  r¶  rÿ  r�  r�  rB	  r•  rš  r�  rž  r´   rì   ro   rs   rÁ  r”  Ú_active_childrenÚ_interrupt_requestedr¼  rå	  rÖ  r  r–  rq   rr   ÚidentrÐ  r’  re
  rÜ  rD  r  r¡  r  r†  rŠ  r“  Úagent.title_generatorrg
  r‘  r»  rï   rž   rÖ  r×  rG   r¿  r<  r;  r  r=  rq  rr  rñ  ro  rf  r@  r‡  rˆ  r>  r´	  ÚemptyÚ
get_nowaitr™  Ú
put_nowait)@r7  r¢  râ  r�  rD
  rE
  Ú_ctx_lenÚ_ctx_resultr  rz   rG
  Úuse_streaming_ttsÚ
tts_threadÚ
stop_eventÚ_load_tts_cfgÚ	_get_provrJ
  rK
  rL
  Ú_tts_cfgrQ
  r	  Úagent_threadÚinterrupt_msgÚ_dbgÚ_fÚ_ciÚ_chÚ
_wait_tickre
  rŠ  rg
  Úerror_detailÚpending_messagerj
  Ú_reasoning_already_shownr4   rÌ  rÍ  Úr_topÚr_botr“  Údisplay_reasoningr;  r  ró  r‹  rŒ  Úis_error_responseÚalready_streamedr�  Ú
_api_callsÚ	_max_iterÚ	all_partsrÙ  Úcombinedr  r”  Ú_leftover_steerrP
  r`
  r€   rU
  rT
  s@   ``                                                         @@@@@rK   ÚchatzHermesCLI.chat*   së  øøøøøøø€ õ* 	$ DÔ$AÑBÔBÐBð ×/Ò/Ñ1Ô1ð 	Ø�4à×4Ò4°WÑ=Ô=ˆ
Ø�kÔ" dÔ&HÒHÐHØˆDŒJð Œ:ÐÝ•tÐ8Ð8µ$Ð8Ð8Ñ9Ô9Ð9Ø×ÒØ% gÔ.Ø'¨	Ô2Ø(ŸnšnÐ-@ÑAÔAð  ñ 
ô 
ð 	ð
 �4ð
 ð 	Ø×9Ò9Ý% g­sÑ3Ô3Ð;��¸¸Vñô ˆGõ
 �g�sÑ#Ô#ñ 	M¨¨w¨©ðMØRÐRÐRÐRÐRÐRØIÐIÐIÐIÐIÐIØ3Ð3Ø”J¨¬Ð)<¸"ÀdÄlÐFXÐVXðZñ Zô Z�à;Ð;Ø¥¤¡¤¸XðGñ Gô G�àÔ'ð 	2¨;Ô+>ð 	2Ø"Ô-ð LÝðK¥ð Kð Kµ3°{Ô7MÑ3NÔ3Nð Kð KØ*Ô:ðKð KÝDHðKð KñLô Lð Lð )Ô1ð :ð :˜ÝÐ 8¥TÐ 8Ð 8¨qÐ 8µ$Ð 8Ð 8Ñ9Ô9Ð9Ð9Ø"Ô*ð _Ø#Ÿyšy¨Ô)=Ñ>Ô>Ð^ÐB^Ð^Ø)Ô1�GøøÝð Mð Mð MÝ”ÐHÈ!ÑLÔLÐLÐLÐLÐLÐLÐLøøøøðMøøøõ �g�sÑ#Ô#ð 	4Ø6Ð6Ð6Ð6Ð6Ð6Ø*Ð*¨7Ñ3Ô3ˆGð 	Ô!×(Ò(°&ÀWÐ)MÐ)MÑNÔNÐNå‰Œ×ÒÐ?¥¡¤Ð?Ð?°
Ð?Ð?Ð?Ñ@Ô@Ð@Ý�DÐÑÔÐðr	+àˆFð ×$Ò$Ñ&Ô&Ð&ð /4ˆDÔ+ð !&ÐØ$)Ð!ØˆJØˆJØ"ˆOØˆJàŒð ððð ð ð ð ð ð ð ð ð ð ð ð ð ð  -˜}™œ�HØ �y Ñ*Ô*¨lÒ:Ð:à*Ð*Ñ,Ô,Ð,Ø+Ð+Ñ-Ô-Ð-Ø,0Ð)øøÝ#¥WÐ-ð ð ð Ø�DÝ ð ð ð Ø�Dðøøøð !ð .Ý"œ[™]œ]�
Ý&œ_Ñ.Ô.�
ð	A­sð 	Að 	Að 	Að 	Að 	Að 	Að 	Aõ 'Ô-Ø0Ø$ j°$Ô2FÐGØ.Ð0@ÐAØð	ñ ô �
ð × Ò Ñ"Ô"Ð"ð.­3ð .ð .ð .ð .ð .ð .ð ˆMØÔð ¥J¨w½Ñ$<Ô$<ð ðGð ð
.ð .ð .ð .ð .ð .ð .ð .ð .õj '+¤i¡k¤kˆDÔ#Ø$'ˆDÔ!Ý$Ô+°9ÀTÐJÑJÔJˆLØ×ÒÑ Ô Ð ð !ˆMØ×'Ò'Ñ)Ô)ñ $+Ý˜4Ð!3Ñ4Ô4ñ #+ð<Ø(,Ô(=×(AÒ(AÈ#Ð(AÑ(NÔ(N˜Ø(ñ "ð  $Ô2ð )°dÔ6Lð )Ø (Ý!Ð"OÑPÔPÐPà)Ð5Ø *§¢Ñ 0Ô 0Ð 0Ø œJ×0Ò0°Ñ?Ô?Ð?ð	%Ý'3Ð6KÑ'K Ý%)¨$°¡_¤_ð !l¸Ø$&§H¢Hµ´¸jÑ0IÔ0Ið .fð .fÕadÐerÑasÔasÐtwÐuwÐtwÔaxð .fð .fÝ9<¸T¼ZÔ=XÑ9YÔ9Yð.fð .fàBFÄ*ÔBað.fð .fð .fñ %gô %gð %gõ 5>¸d¼jÔ>YÑ4ZÔ4Zð %lð %l©¨¨SØ(*¯ªÐ1j¸CÐ1jÐ1jÈcÔNfÐ1jÐ1jÐ1jÑ(kÔ(kÐ(kÐ(kð%lð	!lð !lð !lñ !lô !lð !lð !lð !lð !lð !lð !løøøð !lð !lð !lð !løøõ $-ð %ð %ð %Ø $ ð%øøøà!ð-"øõ. !œ;ð <ð <ð <ð ×(Ò(°dÐ(Ñ;Ô;Ð;Ð;Ð;ð<øøøð !×%Ò% cÑ*Ô*Ð*ðI ×'Ò'Ñ)Ô)ñ $+ðV Ð(õ #(¨¡)¤)ð ð �JØ ×%Ò%¨cÐ%Ñ2Ô2Ð2Ø'×0Ò0Ñ2Ô2ð Ø˜õ ˜t ^°UÑ;Ô;ð Ø˜ðà×(Ò(Ñ*Ô*ð Ý—N’Nð#ð %Ô*ñ	ô ð øð ×!Ò!¨"Ð!Ñ-Ô-Ð-ð Ô&Ð2Ý(+¨Cµ´±´¸tÔ?VÑ1VÑ(WÔ(W�Ô%Ø*.�Ô'ðØNÐNÐNÐNÐNÐNØ+Ð+Ñ-Ô-Ð-Ð-øÝð ð ð Ø�ðøøøð ×ÒÑ Ô Ð ð !ð 1 ZÐ%;Ø—’˜tÑ$Ô$Ð$ØÐ)Ø—O’O¨C�OÑ0Ô0Ð0õ ŒJ×ÒÑÔÐÝŒJ�tÑÔÐð ^dð  )C¨¯
ª
°:¸tÔ?XÑ(YÔ(YÐ(YÐimô  jCˆDÔ%ð ”
ð+å˜DœJ¨°dÑ;Ô;ð+ð ”JÔ)¨T¬_Ò<Ð<à"&¤*Ô"7�”Ø&*�Ô#ð <BÐI�v—z’zÐ"2°BÑ7Ô7Ð7ÀrˆHð ð ˜Fð ¨6¯:ª:°hÑ+?Ô+?ð ÈÏ
Ê
ÐS\ÑH]ÔH]ð ð
ØFÐFÐFÐFÐFÐFØ$Ð$ØÔ(ØœØØ ØÔ1ñô ð ð øõ !ð ð ð Ø�Dðøøøð ð Z˜6Ÿ:š: hÑ/Ô/ð Z°6·:²:¸iÑ3HÔ3Hð ZÐRZð ZØ%Ÿzšz¨'°?ÑCÔC�Ø3 \Ð3Ð3�ð Ô)ð ZØ-2�DÔ*ÝÐX¥ÐXÐXÕRVÐXÐXÑYÔYÐYð #ˆOØð ^˜&Ÿ*š* ]Ñ3Ô3ð ^Ø"(§*¢*Ð-@Ñ"AÔ"AÐ"RÀ]�àð ^ ð ^Ø'Ð*]Ñ]�HàLRÐ!] §¢Ð,@À%Ñ!HÔ!HÐ!HÐX]Ðõ (/¨tÐ5QÐSXÑ'YÔ'YÐ$ØÔ"ñ T vñ TÐ6Nñ TØ"ŸJšJÐ'7Ñ8Ô8�	Øñ TÝÔ0Ñ2Ô2Ô:�AØ+�GØ ™U¥S¨¡\¤\Ñ1�FÝ#ÐYÐY¨7ÐY°E½CÀÈÁ
ÈAÑ<NÔ<NÑ4NÐYÐYÕSWÐYÐY�EÝ#ÐBÐB¨°°Q±©ÐBÐB½DÐBÐB�Eà%ŸOšOÑ-Ô-×8Ò8Ñ:Ô:�EÝ˜5‘z”z B’�Ø,0¯IªI°e¸C¸R¸C´jÑ,AÔ,AÐ)Ø)Ð-bµ$Ð-bÐ-b½sÀ5¹z¼zÈB¹Ð-bÐ-bÕ\`Ð-bÐ-bÑbÐ)Ð)à,5¯OªOÑ,=Ô,=Ð)ÝÐR ÐRÐR­$ÐRÐ0AÐRÅ4ÐRÐRÈ5ÐRÐRÑSÔSÐSàñ !Ð 2ñ !ð	+ØFÐFÐFÐFÐFÐFØ+˜OÑ-Ô-�EØ!×.Ò.Ð/?ÀÑNÔN�EØ"'§/¢/Ð2CÀYÑ"OÔ"O�KØ!&§¢°À	Ñ!JÔ!J�J�JøÝ ð +ð +ð +Ø(�EØ"+�KØ!*�J�J�Jð+øøøð
 %+Ð$^°·
²
¸8Ñ0DÔ0DÐ0]ÈÏ
Ê
ÐS\ÑH]ÔH]Ð!Ø#'Ô#7Ð#m¸DÔ<SÐ#mÐ\mÐXmÐ Ø$ð Ð)>ð ÐGXð åÔ0Ñ2Ô2Ô:�AÝÐG¥ÐGÐG¨U°a¸!±e©_ÐGÐGÅÐGÐGÑHÔHÐHÐHØ%ð ð å$/¡M¤M�MØ!×'Ò'­Ý7¸ÀtÔGcÐdÑdÔdØ? +Ð?Ð?°UÐ?Ð?Ð?Ø$*Ø%0Ø(Ý$Ô0Ø &ð)ñ )ô )ñ ô ð ð Ô$ð #Ý”
× Ò  Ñ&Ô&Ð&Ý”
× Ò Ñ"Ô"Ð"ð ð ˜fŸjšj¨Ñ5Ô5ð ¸f¿jºjÈÑ>WÔ>Wð Ø#ŸZšZ¨°QÑ7Ô7�
Ø¥¨¬Ð5EÀrÑ!JÔ!JÒJÐJÝ '¨¬
Ð4DÀbÑ IÔ I�IÝð<�Tð <ð <Ø&ð<ð <Ø)2ð<ð <å59ð<ð <ñô ð ð Œð  8ð Ð4Eð ÝÔ ØÔ5Ø"˜Øðñ ô ÷ ’%‘'”'�'ð ñ 2¥7¨4Ð1AÑ#BÔ#Bñ 2Ø,Ð-�	ØÔ/×5Ò5Ñ7Ô7ð ðØ $Ô 5× @Ò @Ñ BÔ B˜Ø ð 4Ø%×,Ò,¨UÑ3Ô3Ð3øøÝ œ;ð ð ð Ø˜ðøøøð Ô/×5Ò5Ñ7Ô7ð ð  Ÿ9š9 YÑ/Ô/�Ý˜	‘N”N�Ø" 3 B 3œ-µC¸±M´MÀBÒ4FÐ4F¨5¨5ÈBÑO�Ø�q’5�5ÝÐT¨1ÐTÐTÈ'ÐTÐTÐTÑUÔUÐUÐUåÐG¸WÐGÐGÐGÑHÔHÐHØÔ#×'Ò'¨Ñ1Ô1Ð1ð >DÐM˜fŸjšj¨Ñ9Ô9Ð9ÈˆOØð 9¥7¨4Ð1AÑ#BÔ#Bð 9Ø)¨#¨2¨#Ô.½3¸Ñ;OÔ;OÐRTÒ;TÐ;T°%°%ÐZ\Ñ]�ÝÐSÈÐSÐSÐSÑTÔTÐTØÔ#×'Ò'¨Ñ8Ô8Ð8àð Ð%ðØ×)Ò)¨$Ñ/Ô/Ð/Ð/øÝ ð ð ð Ø�DðøøøàÐ%Ø—’Ñ Ô Ð ØÐ%¨*×*=Ò*=Ñ*?Ô*?Ð%Ø—’¨�Ñ*Ô*Ð*Ð*ð &Ð%øõ ð 	ð 	ð 	Ý�-˜A�-�-Ñ Ô Ð Ø�4�4�4ð Ð%ðØ×)Ò)¨$Ñ/Ô/Ð/Ð/øÝ ð ð ð Ø�DðøøøàÐ%Ø—’Ñ Ô Ð ØÐ%¨*×*=Ò*=Ñ*?Ô*?Ð%Ø—’¨�Ñ*Ô*Ð*Ð*Ð*ð &Ð%Ð%Ð%øøøøð	øøøøð Ð%ðØ×)Ò)¨$Ñ/Ô/Ð/Ð/øÝ ð ð ð Ø�DðøøøàÐ%Ø—’Ñ Ô Ð ØÐ%¨*×*=Ò*=Ñ*?Ô*?Ð%Ø—’¨�Ñ*Ô*Ð*Ð*ð &Ð%øøøsÖ  ÄC*G; Ç3G; Ç;
H$ÈHÈH$Ê/0| Ë =L Ì| ÌL=Ì/| Ì1	L=Ì:| Ì<L=Ì=D| Ñ,V0 Ò | Ò?V0 ÓV ÓB*VÖV ÖVÖV ÖVÖV ÖV0 Ö
V+Ö(V0 Ö*V+Ö+V0 Ö.| Ö0%W×| ×W×D| Û [1 Û0| Û1
[>Û;| Û=[>Û>D5| à4$a á| á
a&á#| á%a&á&H5| êAk/ ë.| ë/lë?| ìlìH+| ô.0u õ| õu1õ.| õ0u1õ1D'| úz1ú1
z>ú=z>ü
~ü~ü"~ ü)|? ü?
}ý}þ~þ~ þA@þ#~9þ8A@þ9
ÿA@ÿÿAA@c           	      óú  — t          ¦   «          t          | j        ¦  «        }|dk    �r�t          d„ | j        D ¦   «         ¦  «        }t          d„ | j        D ¦   «         ¦  «        }t          j        ¦   «         | j        z
  }t          t          |                     ¦   «         ¦  «        d¦  «        \  }}t          |d¦  «        \  }}|dk    r|› d|› d|› d�}	n|dk    r	|› d|› d�}	n|› d�}	d	}
| j	        r1	 | j	         
                    | j        ¦  «        }
n# t          $ r Y nw xY wt          d
¦  «         t          d| j        › �¦  «         |
rt          d|
› d�¦  «         t          ¦   «          t          d| j        › �¦  «         |
rt          d|
› �¦  «         t          d|	› �¦  «         t          d|› d|› d|› d�¦  «         d	S 	 ddlm}  |d¦  «        }n# t          $ r d}Y nw xY wt          |¦  «         d	S )z:Print session resume info on exit, similar to Claude Code.r   c                 óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS rJ  rª  rH  s     rK   rY   z1HermesCLI._print_exit_summary.<locals>.<listcomp>7"  s-   € Ð]Ð]Ð] 1ÀQÇUÂUÈ6Á]Ä]ÐV\ÒE\ÐE\˜QÐE\ÐE\ÐE\rM   c                 ón   — g | ]2}|                      d ¦  «        dk    s|                      d¦  «        ¯0|‘Œ3S )rF  r�  r>   rª  rH  s     rK   rY   z1HermesCLI._print_exit_summary.<locals>.<listcomp>8"  sB   € ÐuÐuÐu AÀaÇeÂeÈFÁmÄmÐW]ÒF]ÐF]Ðab×afÒafÐgsÑatÔatÐF]˜aÐF]ÐF]ÐF]rM   rü  rÂ   rè  ré  rê  NzResume this session with:z  hermes --resume z  hermes -c "r~  zSession:        zTitle:          zDuration:       zMessages:       rŠ  z user, z tool calls))Úget_active_goodbyeu   Goodbye! âš•)r¹  r  r�  r   r  r�  Údivmodrô  r  r‘  rþ  rŠ  rv   r<  r˜
  )r7  rt  Ú	user_msgsr>   rë  rî  r‰  rï  rð  Úduration_strÚsession_titler˜
  Úgoodbyes                rK   Ú_print_exit_summaryzHermesCLI._print_exit_summary2"  s‡  € å‰ŒˆÝ˜Ô1Ñ2Ô2ˆ	Ø�qŠ=‰=ÝÐ]Ð]¨Ô(AÐ]Ñ]Ô]Ñ^Ô^ˆIÝÐuÐu¨Ô)BÐuÑuÔuÑvÔvˆJÝ”l‘n”n tÔ'9Ñ9ˆGÝ%¥c¨'×*?Ò*?Ñ*AÔ*AÑ&BÔ&BÀDÑIÔIÑˆE�9Ý% i°Ñ4Ô4ÑˆG�WØ�qŠyˆyØ"'Ð@Ð@¨7Ð@Ð@°gÐ@Ð@Ð@��Ø˜1’�Ø")Ð7Ð7¨WÐ7Ð7Ð7��à")˜}˜}˜}�ð !ˆMØÔð ðØ$(Ô$4×$FÒ$FÀtÄÑ$WÔ$W�M�MøÝ ð ð ð Ø�Dðøøøõ Ð-Ñ.Ô.Ð.ÝÐ8 t¤Ð8Ð8Ñ9Ô9Ð9Øð :ÝÐ8 }Ð8Ð8Ð8Ñ9Ô9Ð9Ý‰GŒGˆGÝÐ6 T¤_Ð6Ð6Ñ7Ô7Ð7Øð :ÝÐ8¨Ð8Ð8Ñ9Ô9Ð9ÝÐ3 \Ð3Ð3Ñ4Ô4Ð4ÝÐ\ YÐ\Ð\°)Ð\Ð\ÀJÐ\Ð\Ð\Ñ]Ô]Ð]Ð]Ð]ð)ØEÐEÐEÐEÐEÐEØ,Ð,¨^Ñ<Ô<��øÝð )ð )ð )Ø(���ð)øøøå�'‰NŒNˆNˆNˆNs$   Ã6D Ä
D#Ä"D#ÇG ÇG)Ç(G)c                 ó¾  ‡— 	 ddl m}  |d¦  «        }n# t          $ r d}Y nw xY w|pd                     ¦   «         dz   }	 ddlm}  |¦   «         }|dvr|› d|› �}n# t          $ r Y nw xY w|                     ¦   «         }|sdS |                     ¦   «         }|r|d         nd	Šd
}t          ˆfd„|D ¦   «         ¦  «        r|‰                     ¦   «         dz   fS ||fS )u—  Return ``(normal_prompt, state_suffix)`` for the active skin.

        ``normal_prompt`` is the full ``branding.prompt_symbol``.
        ``state_suffix`` is what special states (sudo/secret/approval/agent)
        should render after their leading icon.

        When a profile is active (not "default"), the profile name is
        prepended to the prompt symbol: ``coder â�¯`` instead of ``â�¯``.
        r   )Úget_active_prompt_symbolr
  r‚  rª  )r‡   Úcustom)r
  r
  r  r:   )u   â�¯Ú>r		  r¶  u   â€ºõ   Â»u   â†’c              3   ó    •K  — | ]}|‰v V — Œ	d S r\   r]   )rW   r‡  rÅ  s     €rK   r`   z4HermesCLI._get_tui_prompt_symbols.<locals>.<genexpr>~"  s'   øè è € Ð5Ð5 2ˆr�YˆÐ5Ð5Ð5Ð5Ð5Ð5rM   )r<  r 
  rv   r¾  r¬  r«  r  Úany)	r7  r 
  Úsymbolr«  r  r¿  rc   Úarrow_charsrÅ  s	           @rK   Ú_get_tui_prompt_symbolsz!HermesCLI._get_tui_prompt_symbols]"  s_  ø€ ð	ØGÐGÐGÐGÐGÐGØ-Ð-¨fÑ5Ô5ˆFˆFøÝð 	ð 	ð 	ØˆFˆFˆFð	øøøð Ð"˜F×*Ò*Ñ,Ô,¨sÑ2ˆð	ØCÐCÐCÐCÐCÐCØ-Ð-Ñ/Ô/ˆGØÐ3Ð3Ð3Ø#Ð.Ð. fÐ.Ð.�øøÝð 	ð 	ð 	ØˆDð	øøøà—=’=‘?”?ˆØð 	"Ø!�>à—’Ñ Ô ˆØ!&Ð.�E˜"”I�I¨Bˆ	Ø@ˆÝÐ5Ð5Ð5Ð5¨Ð5Ñ5Ô5Ñ5Ô5ð 	4Ø˜9×+Ò+Ñ-Ô-°Ñ3Ð3Ð3ð �vˆ~Ðs   ƒ •$£$ÁA Á
A*Á)A*c                 óz   — d}t          | dd¦  «        }|€dS |j        }t          |d¦  «        dz  dz  }||         S )z;Return a visual audio level indicator based on current RMS.u    â–�â–‚â–ƒâ–„â–…â–†â–‡r¸  Nr:   i@  r%  )r–  Úcurrent_rmsr  )r7  Ú_LEVEL_BARSrÓ	  ÚrmsrÜ  s        rK   Ú_audio_level_barzHermesCLI._audio_level_bar„"  sN   € à.ˆÝ�dÐ-¨tÑ4Ô4ˆØˆ;Ø�2ØŒoˆõ �C˜‘” Ñ" dÑ*ˆØ˜5Ô!Ð!rM   c                 ó’  ‡‡— |                       ¦   «         \  }Š|                      |                      ¦   «         ¬¦  «        Šddt          dt          dt          fˆˆfd„}| j        r!|                      ¦   «         } |dd|¦  «        S | j        r |d	d
¦  «        S | j        r |dd¦  «        S | j        r |dd¦  «        S | j	        r |dd¦  «        S | j
        r |dd¦  «        S | j        r |dd¦  «        S | j        r |d|                      ¦   «         ¦  «        S | j        r |dd¦  «        S | j        r |dd¦  «        S d|fgS )zFReturn the prompt_toolkit fragments for the current interactive state.r+  r:   r�  rû  rÙ  c                 ó¨   •— ‰r7|}|r+|› d|                      ¦   «         › �                     ¦   «         }| |dz   fgS |r| |› d|› d‰› �fgS | |› d‰› �fgS )Nr‚  )rG   r¾  )r�  rû  rÙ  r6   rí   Ústate_suffixs       €€rK   Ú_state_fragmentz<HermesCLI._get_tui_prompt_fragments.<locals>._state_fragment•"  sš   ø€ Øð -Ø�Øð >Ø"Ð4Ð4 U§[¢[¡]¤]Ð4Ð4×;Ò;Ñ=Ô=�DØ  s¡
Ð+Ð,Ð,Øð CØ 4Ð @Ð @¨%Ð @Ð @°,Ð @Ð @ÐAÐBÐBØ˜tÐ4Ð4 lÐ4Ð4Ð5Ð6Ð6rM   zclass:voice-recordingu   â—�zclass:voice-processingu   â—‰zclass:sudo-promptu   ðŸ”�u   ðŸ”‘zclass:prompt-workingu   âš úclass:clarify-selectedu   âœŽr¦  u   âš•zclass:voice-promptu   ðŸŽ¤zclass:promptr&
  )r¨
  r&  r"  rU   r¹  r­
  rº  r   r©  r£  rž  r�  r¯  r  r—  r¶  )r7  r¦
  r±
  r  rí   r°
  s       @@rK   Ú_get_tui_prompt_fragmentsz#HermesCLI._get_tui_prompt_fragments�"  sÞ  øø€ à#×;Ò;Ñ=Ô=Ñˆ�Ø×.Ò.°T×5QÒ5QÑ5SÔ5SÐ.ÑTÔTˆð	7ð 	7¥3ð 	7­cð 	7½#ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð Ô ð 	HØ×'Ò'Ñ)Ô)ˆCØ"�?Ð#:¸EÀ3ÑGÔGÐGØÔ!ð 	DØ"�?Ð#;¸UÑCÔCÐCØÔð 	@Ø"�?Ð#6¸Ñ?Ô?Ð?ØÔð 	@Ø"�?Ð#6¸Ñ?Ô?Ð?ØÔð 	BØ"�?Ð#9¸5ÑAÔAÐAØÔ!ð 	DØ"�?Ð#;¸UÑCÔCÐCØÔð 	@Ø"�?Ð#9¸3Ñ?Ô?Ð?ØÔ ð 	ZØ"�?Ð#9¸4×;VÒ;VÑ;XÔ;XÑYÔYÐYØÔð 	BØ"�?Ð#9¸5ÑAÔAÐAØÔð 	AØ"�?Ð#7¸Ñ@Ô@Ð@Ø Ð(Ð)Ð)rM   c                 ód   — d                      d„ |                      ¦   «         D ¦   «         ¦  «        S )z6Return the visible prompt text for width calculations.r:   c              3   ó    K  — | ]	\  }}|V — Œ
d S r\   r]   rY  s      rK   r`   z1HermesCLI._get_tui_prompt_text.<locals>.<genexpr>¸"  s&   è è € ÐLÐL¡  4�tÐLÐLÐLÐLÐLÐLrM   )rb   r³
  rG  s    rK   Ú_get_tui_prompt_textzHermesCLI._get_tui_prompt_text¶"  s/   € à�wŠwÐLÐL¨4×+IÒ+IÑ+KÔ+KÐLÑLÔLÑLÔLÐLrM   c                 ó°   — t          t          | di ¦  «        pi ¦  «        }	 ddlm} |                      |¦   «         ¦  «         n# t
          $ r Y nw xY w|S )zFLayer the active skin's prompt_toolkit colors over the base TUI style.Ú_tui_style_baser   )Ú"get_prompt_toolkit_style_overrides)rS   r–  r<  r¹
  r=  rv   )r7  Ú
style_dictr¹
  s      rK   Ú_build_tui_style_dictzHermesCLI._build_tui_style_dictº"  s   € å�' $Ð(9¸2Ñ>Ô>ÐDÀ"ÑEÔEˆ
ð	ØQÐQÐQÐQÐQÐQØ×ÒÐ@Ð@ÑBÔBÑCÔCÐCÐCøÝð 	ð 	ð 	ØˆDð	øøøàÐs   ¢#A Á
AÁAc                 óÚ   — t          | dd¦  «        rt          | dd¦  «        sdS t          j        |                      ¦   «         ¦  «        | j        _        |                      d¬¦  «         dS )z=Refresh prompt_toolkit styling for a running interactive TUI.rŒ  Nr¸
  Frb  r  T)r–  ÚPTStyleÚ	from_dictr»
  rŒ  r�  rÖ  rG  s    rK   rÂ  zHermesCLI._apply_tui_skin_styleÄ"  sl   € å�t˜V TÑ*Ô*ð 	µ'¸$Ð@QÐSWÑ2XÔ2Xð 	Ø�5Ý!Ô+¨D×,FÒ,FÑ,HÔ,HÑIÔIˆŒ	ŒØ×Ò cÐÑ*Ô*Ð*ØˆtrM   c                 ó   — g S )a#  Return extra prompt_toolkit widgets to insert into the TUI layout.

        Wrapper CLIs can override this to inject widgets (e.g. a mini-player,
        overlay menu) into the layout without overriding ``run()``.  Widgets
        are inserted between the spacer and the status bar.
        r]   rG  s    rK   Ú_get_extra_tui_widgetsz HermesCLI._get_extra_tui_widgetsÎ"  s	   € ð ˆ	rM   c                ó   — dS )a  Register extra keybindings on the TUI ``KeyBindings`` object.

        Wrapper CLIs can override this to add keybindings (e.g. transport
        controls, modal shortcuts) without overriding ``run()``.

        Parameters
        ----------
        kb : KeyBindings
            The active keybinding registry for the prompt_toolkit application.
        input_area : TextArea
            The main input widget, for wrappers that need to inspect or
            manipulate user input from a keybinding handler.
        Nr]   )r7  ÚkbÚ
input_areas      rK   Ú_register_extra_tui_keybindingsz)HermesCLI._register_extra_tui_keybindings×"  s   € € € rM   )Úmodel_picker_widgetÚspinner_widgetc          	      óŠ   — d„ t          d¬¦  «        |||||||g|                      ¦   «         ¢|‘|	‘|
‘|‘|‘|‘|‘D ¦   «         S )zøAssemble the ordered list of children for the root ``HSplit``.

        Wrapper CLIs typically override ``_get_extra_tui_widgets`` instead of
        this method.  Override this only when you need full control over widget
        ordering.
        c                 ó   — g | ]}|®|‘ŒS r\   r]   r%  s     rK   rY   z8HermesCLI._build_tui_layout_children.<locals>.<listcomp>þ"  s,   € ð 
ð 
ð 
Øð" Ð!ð# ð" "Ð!Ð!rM   r   ©Úheight)r   rÀ
  )r7  Úsudo_widgetÚsecret_widgetÚapproval_widgetÚclarify_widgetrÅ
  rÆ
  ÚspacerÚ
status_barÚinput_rule_topÚ	image_barrÃ
  Úinput_rule_botÚvoice_status_barÚcompletions_menus                  rK   Ú_build_tui_layout_childrenz$HermesCLI._build_tui_layout_childrenæ"  s¤   € ð0
ð 
å˜aÐ Ñ Ô ØØØØØ#ØØðð ×,Ò,Ñ.Ô.ðð ðð ðð ðð ðð ðð !ðð  !ð!ð
ñ 
ô 
ð 	
rM   c                 ó+  ‡ ‡b‡c‡d‡e‡f‡g‡h‡i‡j‡k‡l‡m— 	 t          j        ¦   «         j        }|dk    rt          d|dz
  z  dd¬¦  «         n# t          $ r Y nw xY w‰                      ¦   «          ‰ j        r(‰                      ¦   «         r‰                      ¦   «          	 ddl	m
}  |¦   «         }|                     d	d
¦  «        }|                     dd¦  «        }n# t          $ r d
}d}Y nw xY w‰                      d|› d|› d�¦  «         	 ddlm}  |¦   «         }	 |                     dd¦  «        }n# t          $ r d}Y nw xY w‰                      d|› d|› d�¦  «         n# t          $ r Y nw xY w‰ j        rO‰ j        sHd                     ‰ j        ¦  «        }	‰                      dt'          ¦   «         › d|	› �¦  «         d‰ _        ‰                      ¦   «          d‰ _        t+          j        ¦   «         ‰ _        t+          j        ¦   «         ‰ _        d‰ _        d‰ _        ddlm}
 ‰  |
¦   «         _        ddlm}  |¦   «         }|                      ¦   «         r| !                    ¦   «         j"        nd‰ _#        ‰ j$         %                    d¦  «        pi ‰ _&        d‰ _'        d‰ _(        d‰ _)        d‰ _*        d‰ _+        d‰ _,        d‰ _-        d‰ _.        d‰ _/        ta          j1        ¦   «         ‰ _2        d‰ _3        d‰ _4        d‰ _5        d‰ _6        g ‰ _7        d‰ _8        ta          j1        ¦   «         ‰ _9        d‰ _:        d‰ _;        d‰ _<        d‰ _=        d‰ _>        d‰ _?        ta          j@        ¦   «         ‰ _A        ‰ jA         B                    ¦   «          t‡          ‰ jD        ¦  «         t‹          ‰ jF        ¦  «         t�          ‰ jH        ¦  «         	 ddlImJ}  |d¬¦  «        }|€T‰ j$         %                    d i ¦  «        pi }| %                    d!d¦  «        }|rt—          d"t˜          › d#tš          › �¦  «         n# t          $ r Y nw xY wt�          ¦   «         }| O                    d$¦  «        ˆ fd%„¦   «         }| O                    d&d$¦  «        d'„ ¦   «         }| O                    d(¦  «        d)„ ¦   «         }t¡          ˆ fd*„¦  «        }| O                    d+|¬,¦  «        | O                    d&d-|¬,¦  «        ˆlfd.„¦   «         ¦   «         }| O                    d/d¬0¦  «        d1„ ¦   «         }| O                    d2t¡          ˆ fd3„¦  «        ¬,¦  «        ˆ fd4„¦   «         }| O                    d5t¡          ˆ fd6„¦  «        ¬,¦  «        ˆ fd7„¦   «         }ˆ fd8„}t£          d9¦  «        D ]U}|dk    rd:n|dz
  } | O                    t¥          |¦  «        t¡          ˆ fd;„¦  «        ¬,¦  «         ||¦  «        ¦  «         ŒV| O                    d2t¡          ˆ fd<„¦  «        ¬,¦  «        ˆ fd=„¦   «         }| O                    d5t¡          ˆ fd>„¦  «        ¬,¦  «        ˆ fd?„¦   «         }| O                    d2t¡          ˆ fd@„¦  «        ¬,¦  «        ˆ fdA„¦   «         }| O                    d5t¡          ˆ fdB„¦  «        ¬,¦  «        ˆ fdC„¦   «         } | O                    d&t¡          ˆ fdD„¦  «        d¬E¦  «        ˆ fdF„¦   «         }!ˆ fdG„}"t£          d9¦  «        D ]U}|dk    rd:n|dz
  } | O                    t¥          |¦  «        t¡          ˆ fdH„¦  «        ¬,¦  «         |"|¦  «        ¦  «         ŒVt¡          ˆ fdI„¦  «        }#| O                    d2|#¬,¦  «        dJ„ ¦   «         }$| O                    d5|#¬,¦  «        dK„ ¦   «         }%| O                    dL¦  «        ˆlˆ fdM„¦   «         }&| O                    dN¦  «        ˆ fdO„¦   «         }'t¡          ˆ fdP„¦  «        }(| O                    d&|(d¬E¦  «        ˆ fdQ„¦   «         })| O                    dR¦  «        dS„ ¦   «         }*	 ddTlmS}+  |+¦   «          %                    dUi ¦  «         %                    dVdW¦  «        },|, T                    ¦   «          U                    dXdY¦  «         U                    dZd[¦  «        }-n# t          $ r d\}-Y nw xY w| O                    |-¦  «        ˆlfd]„¦   «         }.dd^lVmW}/ | O                    |/jX        d¬0¦  «        ˆfˆgˆ fd_„¦   «         }0| O                    d`¦  «        ˆ fda„¦   «         }1| O                    d&db¦  «        ˆ fdc„¦   «         }2‰ Šlˆlfdd„}3ddelYmZ}4 t·          df„ ‰lj\        ¬g¦  «        }5t»          t½          ddhd¬i¦  «        |3djddt¡          ˆlfdk„¦  «        t¿          t¥          ‰ j`        ¦  «        ¦  «        |5dtÃ           |4¦   «         |5¬l¦  «        ¬m¦
  «
        Šmdn‰mjb        _c        ˆmˆ fdo„}6|6‰mjd        _e        dgŠfdgŠidgŠhdgŠgd‰ _f        ˆfˆgˆhˆiˆ fdp„}7‰mjb        xjg        |7z  c_g        ‰mjh        ji         j                    t×          tÙ          ¦   «         t¡          ˆlfdq„¦  «        ¬,¦  «        ¦  «          G dr„ dstÚ          ¦  «        }8ˆlfdt„}9‰mjh        ji         j                     |8|9¦  «        ¦  «         ˆlfdu„}:ˆlfdv„};ˆlfdw„}<ˆlfdx„}=tÝ          tß          |<¦  «        |=d¬y¦  «        }>tÝ          tß          |:¦  «        |;¬z¦  «        }?dÿd}t¤          d~tà          t¤                   dtâ          d€tâ          d�tâ          f
d‚„Še�d dƒt¤          d„tâ          d…t¤          d�tà          t¤                   fd†„Šjd‡t¤          dˆt¤          dƒt¤          d‰tâ          d�df
dŠ„Šcd‡t¤          d‰tâ          d�dfd‹„ŠbˆbˆcˆeˆjˆlfdŒ„}@tå          tÝ          tß          |@¦  «        d¬�¦  «        t¡          ˆlfdŽ„¦  «        ¬,¦  «        }Aˆbˆcˆeˆlfd�„}Btå          tÝ          tß          |B¦  «        d¬�¦  «        t¡          ˆlfd�„¦  «        ¬,¦  «        }Cˆbˆcˆeˆlfd‘„}Dtå          tÝ          tß          |D¦  «        d¬�¦  «        t¡          ˆlfd’„¦  «        ¬,¦  «        }Eˆlfd“„}Ftå          tÝ          tß          |F¦  «        d¬�¦  «        t¡          ˆlfd”„¦  «        ¬,¦  «        }Gˆbˆcˆeˆjˆlfd•„}Htå          tÝ          tß          |H¦  «        d¬�¦  «        t¡          ˆlfd–„¦  «        ¬,¦  «        }ItÝ          d—ˆlfd˜„d™¬š¦  «        }JtÝ          d—ˆlfd›„d™¬š¦  «        }K‰ Šlˆlfdœ„}LtÝ          tß          |L¦  «        t¡          ˆlfd�„¦  «        ¬z¦  «        }Mˆlfdž„}Ntå          tÝ          tß          |N¦  «        d¬Ÿ¦  «        t¡          ˆlfd „¦  «        ¬,¦  «        }Otå          tÝ          tß          ˆlfd¡„¦  «        dd¬y¦  «        t¡          ˆlfd¢„¦  «        ¬,¦  «        }P‰  s                    |‰m¬£¦  «         té          d¤d¬¥¦  «        }Qtë          tí          ‰  w                    |C|E|G|A|I|>|?|P|J|M‰m|K|O|Q¬¦¦  «        ¦  «        ¦  «        }Ri d§d“d¨d©“dªd“d«d¬“d­d©“d®d¯“d°d±“d²d³“d´dµ“d¶d±“d·d¸“d¹dº“d»d¼“d½d¾“d¿dÀ“dÁdÀ“dÂdÃ“i dÄdÅ“dÆdÇ“dÈd¼“dÉdÊ“dËdÌ“dÍdÎ“dÏdÊ“dÐdÑ“dÒd¼“dÓdÔ“dÕd¼“dÖdÔ“d×d“dØd¼“dÙdÚ“dÛdÌ“dÜdÝ“¥dÎdÊdÞdßdàdádâdãœ¥‰ _x        tó          jz        ‰  {                    ¦   «         ¦  «        }Stù          �d|R||Sdddäœtú          �	dåtú          ini ¤ŽŠk‰k‰ _~        ‰kj        Šdˆdˆkfdæ„}T|T‰k_        ˆ fdç„}Uta          j€        |Ud¬è¦  «        }V|V �                    ¦   «          ˆkˆ fdé„}Wta          j€        |Wd¬è¦  «        }X|X �                    ¦   «          �t          jƒ        �t          ¦  «         ˆ fdê„}Y	 ddl…}Z|Z …                    |Zj†        |Y¦  «         �t          |Zdë¦  «        r|Z …                    |Zjˆ        |Y¦  «         n# t          $ r Y nw xY wdì„ }[	 �t          jŠ        d¦  «         nD# �t          $ r6 t          dí¦  «         �t	          ¦   «          ‰  Œ                    ¦   «          Y dS w xY w	 �t          ¦   «         5  	 ddlŽ}\|\ �                    ¦   «         }]|] �                    |[¦  «         n# t          $ r Y nw xY w‰k ‘                    ¦   «          ddd¦  «         n# 1 swxY w Y   n«# �t$          �t&          �t(          f$ r Y n��t*          �t          f$ rz}^�t-          |^�t          ¦  «        r"�t/          |^dîd¦  «        �t0          j™        k    rn7dït¥          |^¦  «        v sdðt¥          |^¦  «        v rt          dñ|^› dò�¦  «         n‚ Y d}^~^nd}^~^ww xY wd‰ _        ‰ jš        r=�t/          ‰ dód¦  «        r+	 ‰ jš         ›                    ¦   «          n# t          $ r Y nw xY w�t          ‰ dô¦  «        r9‰ j<        r2	 ‰ j<         œ                    ¦   «          n# t          $ r Y nw xY wd‰ _<        	 ddõl�mž}_  |_¦   «          n# t          $ r Y nw xY wt‡          d¦  «         t‹          d¦  «         t�          d¦  «         �t          ‰ dö¦  «        rp‰ jŸ        ri‰ jš        rb	 ‰ jŸ                              ‰ jš        j¡        d÷¦  «         n;# t          �t&          f$ r&}`�tD           £                    dø|`¦  «         Y d}`~`nd}`~`ww xY w‰ jš        rq�t/          ‰ dód¦  «        r_	 ddùlm¤}a  |adú‰ jš        j¡        dd�t/          ‰ jš        dûd¦  «        �t/          ‰ jš        düd¦  «        pdý¬þ¦  «         n# t          $ r Y nw xY w�t	          ¦   «          ‰  Œ                    ¦   «          dS # d‰ _        ‰ jš        r=�t/          ‰ dód¦  «        r+	 ‰ jš         ›                    ¦   «          n# t          $ r Y nw xY w�t          ‰ dô¦  «        r9‰ j<        r2	 ‰ j<         œ                    ¦   «          n# t          $ r Y nw xY wd‰ _<        	 ddõl�mž}_  |_¦   «          n# t          $ r Y nw xY wt‡          d¦  «         t‹          d¦  «         t�          d¦  «         �t          ‰ dö¦  «        rp‰ jŸ        ri‰ jš        rb	 ‰ jŸ                              ‰ jš        j¡        d÷¦  «         n;# t          �t&          f$ r&}`�tD           £                    dø|`¦  «         Y d}`~`nd}`~`ww xY w‰ jš        rq�t/          ‰ dód¦  «        r_	 ddùlm¤}a  |adú‰ jš        j¡        dd�t/          ‰ jš        dûd¦  «        �t/          ‰ jš        düd¦  «        pdý¬þ¦  «         n# t          $ r Y nw xY w�t	          ¦   «          ‰  Œ                    ¦   «          w xY w(  z=Run the interactive CLI loop with persistent input at bottom.r�  rZ   r  r:   T)Úendr  r   r:  ÚwelcomezAWelcome to Hermes Agent! Type your message or /help for commands.rì  rí  rÞ  r£  rU  r  rO  rP  rŸ  r  rT  r¦  z]Activated skills:[/] Fr  r<	  rb  rP  N)Úensure_installed)Úlog_failuresr6  Útirith_enabledr8  ui   âš  tirith security scanner enabled but not available â€” command scanning will use pattern matching onlyÚenterc           	      ó  •— ‰j         rS| j        j        j        }‰j         d                              |¦  «         d‰_         | j                             ¦   «          dS ‰j        r_| j        j        j        }‰                     |¦  «         | j        j                             ¦   «          | j                             ¦   «          dS ‰j	        r/‰ 
                    ¦   «          | j                             ¦   «          dS ‰j        rM‰                     ¦   «          | j        j                             ¦   «          | j                             ¦   «          dS ‰j        r“‰j        rŒ| j        j        j                             ¦   «         }|re‰j        d                              |¦  «         d‰_        d‰_        | j        j                             ¦   «          | j                             ¦   «          dS ‰j        r¤‰j        s�‰j        }|d         }|                     d¦  «        pg }|t#          |¦  «        k     rB|d                              ||         ¦  «         d‰_        | j                             ¦   «          n d‰_        | j                             ¦   «          dS | j        j        j                             ¦   «         }t%          ‰j        ¦  «        }|s|�r=‰                     ||¬¦  «        rc‰                     |¦  «        s,d‰_        | j        j        r| j                             ¦   «          | j        j                             d¬¦  «         dS ‰                     ||¬¦  «        r7‰                     |¦  «         | j        j                             d¬¦  «         dS t5          ‰j        ¦  «        }‰j                             ¦   «          | j                             ¦   «          |r||fn|}‰j        �rã|rt;          |¦  «        �sÑ‰j        d	k    r{‰j                             |¦  «         |r|n*d
t#          |¦  «        › dt#          |¦  «        dk    rdnd› d�}tA          d|dd…         › t#          |¦  «        dk    rdnd› �¦  «         n¨‰j!                             |¦  «         	 tD          dz  }	tG          |	d¦  «        5 }
|
 $                    tK          j&        d¦  «        › dtO          |¦  «        dd…         ›d‰j        › d�¦  «         ddd¦  «         n# 1 swxY w Y   n# tP          $ r Y nw xY w	 ddl)m*}m+}m,}m-}  |t\          |¦  «        sttA          dt^          ›  |‰j        ¦  «        › t`          › �¦  «          |tD          dz  |¦  «         dt\           1                    di ¦  «         1                    di ¦  «        |<   n*# tP          $ r Y nw xY w‰j                             |¦  «         | j        j                             d¬¦  «         dS dS ) aï  Handle Enter key - submit input.
            
            Routes to the correct queue based on active UI state:
            - Sudo password prompt: password goes to sudo response queue
            - Approval selection: selected choice goes to approval response queue
            - Clarify freetext mode: answer goes to the clarify response queue
            - Clarify choice mode: selected choice goes to the clarify response queue
            - Agent running: goes to _interrupt_queue (chat() monitors this)
            - Agent idle: goes to _pending_input (process_loop monitors this)
            Commands (starting with /) always go to _pending_input so they're
            handled as commands, not sent as interrupt text to the agent.
            rä	  NFr0  rã	  T)r�  )Úappend_to_historyr?  rÞ  ú imager  rê  r:   z
 attached]r,  rÌ  rÏ  rb
  r°  rc
  z ENTER: queued interrupt msg=rÂ   z, agent_running=rZ   r   )ÚBUSY_INPUT_FLAGÚbusy_input_hint_clirf	  rg	  r8  rº   r  rš   )2r   r¶   r	  r6   rD  rÕ  r©  r>
  rH  r£  rù	  r¨  r„  rž  r�  rG   rT   r  ræ  r±  r•  rU  r›  ra  r  r˜  ra   r€  r—  r  rñ   r™  rj  rš  ro   rs   rÁ  rÿ  r”  rU   rv   rm	  rá
  râ
  rf	  rg	  ri  r‹  rŒ  rn	  )Úeventr6   r€  r0  rã	  r�  râ  r  r”  r‚
  rƒ
  rá
  râ
  rf	  rg	  r7  s                  €rK   Úhandle_enterz#HermesCLI.run.<locals>.handle_enter˜#  s  ø€ ð Ôð Ø”yÔ/Ô4�ØÔ Ð!1Ô2×6Ò6°tÑ<Ô<Ð<Ø#'�Ô Ø”	×$Ò$Ñ&Ô&Ð&Ø�ð Ô!ð Ø”yÔ/Ô4�Ø×,Ò,¨TÑ2Ô2Ð2Ø”	Ô(×.Ò.Ñ0Ô0Ð0Ø”	×$Ò$Ñ&Ô&Ð&Ø�ð Ô#ð Ø×/Ò/Ñ1Ô1Ð1Ø”	×$Ò$Ñ&Ô&Ð&Ø�ð Ô'ð Ø×3Ò3Ñ5Ô5Ð5Ø”	Ô(×.Ò.Ñ0Ô0Ð0Ø”	×$Ò$Ñ&Ô&Ð&Ø�ð Ô%ð ¨$Ô*=ð Ø”yÔ/Ô4×:Ò:Ñ<Ô<�Øð +ØÔ'Ð(8Ô9×=Ò=¸dÑCÔCÐCØ*.�DÔ'Ø-2�DÔ*Ø”IÔ,×2Ò2Ñ4Ô4Ð4Ø”I×(Ò(Ñ*Ô*Ð*Ø�ð Ô"ð ¨4Ô+Að ØÔ+�Ø  Ô,�ØŸ)š) IÑ.Ô.Ð4°"�Ø�c '™lœlÒ*Ð*ØÐ*Ô+×/Ò/°¸Ô0AÑBÔBÐBØ*.�DÔ'Ø”I×(Ò(Ñ*Ô*Ð*Ð*ð .2�DÔ*Ø”I×(Ò(Ñ*Ô*Ð*Ø�ð ”9Ô+Ô0×6Ò6Ñ8Ô8ˆDÝ˜dÔ3Ñ4Ô4ˆJØð @G�zñ @Gð ×;Ò;¸DÈZÐ;ÑXÔXð Ø×/Ò/°Ñ5Ô5ð -Ø,0˜Ô)Ø œ9Ô/ð -Ø!œIŸNšNÑ,Ô,Ð,Ø”IÔ,×2Ò2ÀTÐ2ÑJÔJÐJØ�Fð ×;Ò;¸DÈZÐ;ÑXÔXð Ø×(Ò(¨Ñ.Ô.Ð.Ø”IÔ,×2Ò2ÀTÐ2ÑJÔJÐJØ�Fõ ˜dÔ3Ñ4Ô4�ØÔ%×+Ò+Ñ-Ô-Ð-Ø”	×$Ò$Ñ&Ô&Ð&à,2Ð<˜4 ˜.˜.¸�ØÔ&ñ #5°ð #5Õ9RÐSWÑ9XÔ9Xñ #5ØÔ+¨wÒ6Ð6àÔ+×/Ò/°Ñ8Ô8Ð8Ø*.Ð"v $ $Ð4v½¸F¹¼Ð4vÐ4vÕRUÐV\ÑR]ÔR]ÐabÒRbÐRbÈ3È3ÐhjÐ4vÐ4vÐ4v˜ÝÐ q¸wÀsÈÀs¼|Ð qÕVYÐZaÑVbÔVbÐegÒVgÐVgÈUÈUÐmoÐ qÐ qÑrÔrÐrÐràÔ-×1Ò1°'Ñ:Ô:Ð:ð!Ý#/Ð2GÑ#G˜DÝ!% d¨C¡¤ð S°BØ "§¢­D¬M¸*Ñ,EÔ,Eð *Rð *RÕdgÐhoÑdpÔdpÐqtÐrtÐqtÔduð *Rð *RØ:>Ô:Mð*Rð *Rð *Rñ !Sô !Sð !SðSð Sð Sñ Sô Sð Sð Sð Sð Sð Sð Søøøð Sð Sð Sð Søøõ  )ð !ð !ð !Ø ˜Dð!øøøððð ð ð ð ð ð ð ð ð ð ð ð  '˜w¥z°?ÑCÔCð sÝ#Ð$`­Ð$`Ð/BÐ/BÀ4ÔCWÑ/XÔ/XÐ$`ÕZ^Ð$`Ð$`ÑaÔaÐaØ%˜I¥l°]Ñ&BÀOÑTÔTÐTØnr�J×1Ò1°,ÀÑCÔC×NÒNÈvÐWYÑZÔZÐ[jÑkøøÝ$ð ð ð Ø˜ðøøøð Ô'×+Ò+¨GÑ4Ô4Ð4Ø”	Ô(×.Ò.ÀÐ.ÑFÔFÐFÐFÐFðA@Gð @GsJ   ÒT Ò8ATÔT ÔTÔT ÔTÔT Ô
T(Ô'T(Ô,BV> Ö>
W×
Wrm  c                 ó:   — | j                              d¦  «         dS )z1Alt+Enter inserts a newline for multi-line input.rZ   N©r	  Úinsert_text©rã
  s    rK   Úhandle_alt_enterz'HermesCLI.run.<locals>.handle_alt_enter"$  ó!   € ð Ô ×,Ò,¨TÑ2Ô2Ð2Ð2Ð2rM   zc-jc                 ó:   — | j                              d¦  «         dS )zKCtrl+Enter (c-j) inserts a newline. Most terminals send c-j for Ctrl+Enter.rZ   Nræ
  rè
  s    rK   Úhandle_ctrl_enterz(HermesCLI.run.<locals>.handle_ctrl_enter'$  rê
  rM   c                  óD   •— ‰ j          o‰ j         o‰ j         o‰ j         S r\   )r�  r£  r   r©  rG  s   €rK   r€  zHermesCLI.run.<locals>.<lambda>1$  s0   ø€ ˜Ô+Ð+Ð|°DÔ4HÐ0HÐ|ÐQUÔQaÐMaÐ|ÐjnÔj|Ðf|€ rM   zc-g)Úfilterr*  c                 ó<   •— ‰                      | j        ¦  «         dS )zQCtrl+G (or Alt+G in VSCode/Cursor) opens the current draft in an external editor.N)r  r	  )rã
  Úcli_refs    €rK   Úhandle_open_in_editorz,HermesCLI.run.<locals>.handle_open_in_editor4$  s"   ø€ ð ×)Ò)¨%Ô*>Ñ?Ô?Ð?Ð?Ð?rM   Útab)Úeagerc                 óT  — | j         }|j        rQ|j        j        }|€(|                     d¦  «         |j        o|j        j        }|€dS |                     |¦  «         dS |j        r-|j        j        r!|                     |j        j        ¦  «         dS |                     ¦   «          dS )u  Tab: accept completion, auto-suggestion, or start completions.

            Priority:
            1. Completion menu open â†’ accept selected completion
            2. Ghost text suggestion available â†’ accept auto-suggestion
            3. Otherwise â†’ start completion menu

            After accepting a provider like 'anthropic:', the completion menu
            closes and complete_while_typing doesn't fire (no keystroke).
            This binding re-triggers completions so stage-2 models appear
            immediately.
            Nr   )	r	  Úcomplete_stateÚcurrent_completionÚgo_to_completionÚapply_completionÚ
suggestionr6   rç
  Ústart_completion)rã
  rœ  rž  s      rK   Ú
handle_tabz!HermesCLI.run.<locals>.handle_tab:$  sÁ   € ð Ô&ˆCØÔ!ð 'à Ô/ÔB�
ØÐ%à×(Ò(¨Ñ+Ô+Ð+Ø!$Ô!3Ð!]¸Ô8JÔ8]�JØÐ%Ø�Fà×$Ò$ ZÑ0Ô0Ð0Ð0Ð0Ø”ð ' C¤NÔ$7ð 'à—’ ¤Ô 3Ñ4Ô4Ð4Ð4Ð4ð ×$Ò$Ñ&Ô&Ð&Ð&Ð&rM   r  c                  ó<   •— t          ‰ j        ¦  «        o‰ j         S r\   ©ræ  r�  rž  rG  s   €rK   r€  zHermesCLI.run.<locals>.<lambda>]$  s   ø€ ­t°DÔ4GÑ/HÔ/HÐ/gÐQUÔQgÐMg€ rM   c                 ó˜   •— ‰j         rAt          d‰j         d         dz
  ¦  «        ‰j         d<   | j                             ¦   «          dS dS )z%Move selection up in clarify choices.r   r0  r  N)r�  rÐ  r¶   rÕ  ©rã
  r7  s    €rK   Ú
clarify_upz!HermesCLI.run.<locals>.clarify_up]$  sY   ø€ ð Ô"ð 'Ý25°a¸Ô9LÈZÔ9XÐ[\Ñ9\Ñ2]Ô2]�Ô# JÑ/Ø”	×$Ò$Ñ&Ô&Ð&Ð&Ð&ð'ð 'rM   Údownc                  ó<   •— t          ‰ j        ¦  «        o‰ j         S r\   rý
  rG  s   €rK   r€  zHermesCLI.run.<locals>.<lambda>d$  s   ø€ µ°dÔ6IÑ1JÔ1JÐ1iÐSWÔSiÐOi€ rM   c                 óî   •— ‰j         rl‰j                              d¦  «        pg }t          |¦  «        }t          |‰j         d         dz   ¦  «        ‰j         d<   | j                             ¦   «          dS dS )z'Move selection down in clarify choices.rã	  r0  r  N)r�  rT   r  r  r¶   rÕ  )rã
  rã	  Úmax_idxr7  s      €rK   Úclarify_downz#HermesCLI.run.<locals>.clarify_downd$  s€   ø€ ð Ô"ð 'ØÔ-×1Ò1°)Ñ<Ô<ÐBÀ�Ý˜g™,œ,�Ý25°g¸tÔ?RÐS]Ô?^ÐabÑ?bÑ2cÔ2c�Ô# JÑ/Ø”	×$Ò$Ñ&Ô&Ð&Ð&Ð&ð	'ð 'rM   c                 ó   •‡ — ˆ ˆfd„}|S )Nc                 ó’  •— ‰j         rº‰j        sµ‰j                              d¦  «        pg }‰t          |¦  «        k     rO‰j         d                              |‰         ¦  «         d ‰_         d‰_        | j                             ¦   «          d S ‰t          |¦  «        k    r&d‰_        | j                             ¦   «          d S d S d S d S )Nrã	  rä	  FT)r�  rž  rT   r  rD  r¶   rÕ  )rã
  rã	  r¹  r7  s     €€rK   ÚhandlerzDHermesCLI.run.<locals>._make_clarify_number_handler.<locals>.handlero$  sÞ   ø€ ØÔ&ð /¨tÔ/Eð /Ø"Ô1×5Ò5°iÑ@Ô@ÐFÀB�Gà�S ™\œ\Ò)Ð)àÔ+Ð,<Ô=×AÒAÀ'È#Ä,ÑOÔOÐOØ.2˜Ô+Ø16˜Ô.Øœ	×,Ò,Ñ.Ô.Ð.Ð.Ð.Ø¥ G¡¤Ò,Ð,à15˜Ô.Øœ	×,Ò,Ñ.Ô.Ð.Ð.Ð.ð/ð /ð /ð /ð -Ð,rM   r]   ©r¹  r  r7  s   ` €rK   Ú_make_clarify_number_handlerz3HermesCLI.run.<locals>._make_clarify_number_handlern$  s)   øø€ ð/ð /ð /ð /ð /ð /ð ˆNrM   rá  r 
  c                  ó<   •— t          ‰ j        ¦  «        o‰ j         S r\   rý
  rG  s   €rK   r€  zHermesCLI.run.<locals>.<lambda>‚$  s   ø€ µt¸DÔ<OÑ7PÔ7PÐ7oÐY]ÔYoÐUo€ rM   c                  ó,   •— t          ‰ j        ¦  «        S r\   ©ræ  r£  rG  s   €rK   r€  zHermesCLI.run.<locals>.<lambda>†$  s   ø€ ­t°DÔ4HÑ/IÔ/I€ rM   c                 ó˜   •— ‰j         rAt          d‰j         d         dz
  ¦  «        ‰j         d<   | j                             ¦   «          d S d S ©Nr   r0  r  )r£  rÐ  r¶   rÕ  rÿ
  s    €rK   Úapproval_upz"HermesCLI.run.<locals>.approval_up†$  sW   ø€ àÔ#ð 'Ý36°q¸$Ô:NÈzÔ:ZÐ]^Ñ:^Ñ3_Ô3_�Ô$ ZÑ0Ø”	×$Ò$Ñ&Ô&Ð&Ð&Ð&ð'ð 'rM   c                  ó,   •— t          ‰ j        ¦  «        S r\   r  rG  s   €rK   r€  zHermesCLI.run.<locals>.<lambda>Œ$  s   ø€ µ°dÔ6JÑ1KÔ1K€ rM   c                 óÒ   •— ‰j         r^t          ‰j         d         ¦  «        dz
  }t          |‰j         d         dz   ¦  «        ‰j         d<   | j                             ¦   «          d S d S )Nrã	  r  r0  )r£  r  r  r¶   rÕ  )rã
  r  r7  s     €rK   Úapproval_downz$HermesCLI.run.<locals>.approval_downŒ$  sr   ø€ àÔ#ð 'Ý˜dÔ2°9Ô=Ñ>Ô>ÀÑB�Ý36°wÀÔ@TÐU_Ô@`ÐcdÑ@dÑ3eÔ3e�Ô$ ZÑ0Ø”	×$Ò$Ñ&Ô&Ð&Ð&Ð&ð'ð 'rM   c                  ó,   •— t          ‰ j        ¦  «        S r\   ©ræ  r¨  rG  s   €rK   r€  zHermesCLI.run.<locals>.<lambda>”$  s   ø€ ­t°DÔ4LÑ/MÔ/M€ rM   c                 ó´   •— ‰j         rOt          d‰j                              dd¦  «        dz
  ¦  «        ‰j         d<   | j                             ¦   «          d S d S r  )r¨  rÐ  rT   r¶   rÕ  rÿ
  s    €rK   Úmodel_picker_upz&HermesCLI.run.<locals>.model_picker_up”$  sd   ø€ àÔ'ð 'Ý7:¸1¸dÔ>V×>ZÒ>ZÐ[eÐghÑ>iÔ>iÐlmÑ>mÑ7nÔ7n�Ô(¨Ñ4Ø”	×$Ò$Ñ&Ô&Ð&Ð&Ð&ð'ð 'rM   c                  ó,   •— t          ‰ j        ¦  «        S r\   r  rG  s   €rK   r€  zHermesCLI.run.<locals>.<lambda>š$  s   ø€ µ°dÔ6NÑ1OÔ1O€ rM   c                 ón  •— ‰j         }|sd S |                     d¦  «        dk    r%t          |                     d¦  «        pg ¦  «        }n't          |                     d¦  «        pg ¦  «        dz   }t          ||                     dd¦  «        dz   ¦  «        |d<   | j                             ¦   «          d S )Nr/  r¿   r*  rv  r  r0  r   )r¨  rT   r  r  r¶   rÕ  )rã
  r€  r  r7  s      €rK   Úmodel_picker_downz(HermesCLI.run.<locals>.model_picker_downš$  s³   ø€ àÔ,ˆEØð Ø�Ø�yŠy˜Ñ!Ô! ZÒ/Ð/Ý˜eŸiši¨Ñ4Ô4Ð:¸Ñ;Ô;��å˜eŸiši¨Ñ5Ô5Ð;¸Ñ<Ô<¸qÑ@�Ý # G¨U¯YªY°zÀ1Ñ-EÔ-EÈÑ-IÑ JÔ JˆE�*ÑØŒI× Ò Ñ"Ô"Ð"Ð"Ð"rM   c                  ó,   •— t          ‰ j        ¦  «        S r\   r  rG  s   €rK   r€  zHermesCLI.run.<locals>.<lambda>¦$  s   ø€ µ4¸Ô8PÑ3QÔ3Q€ rM   )rî
  ró
  c                 óž   •— ‰                      ¦   «          | j        j                             ¦   «          | j                             ¦   «          dS )zESC closes the /model picker.N)r9  r¶   r	  rH  rÕ  rÿ
  s    €rK   Úmodel_picker_escapez*HermesCLI.run.<locals>.model_picker_escape¦$  sH   ø€ ð ×$Ò$Ñ&Ô&Ð&ØŒIÔ$×*Ò*Ñ,Ô,Ð,ØŒI× Ò Ñ"Ô"Ð"Ð"Ð"rM   c                 ó   •‡ — ˆ ˆfd„}|S )Nc                 óÈ   •— ‰j         rW‰t          ‰j         d         ¦  «        k     r;‰‰j         d<   ‰                     ¦   «          | j                             ¦   «          d S d S d S )Nrã	  r0  )r£  r  rù	  r¶   rÕ  )rã
  r¹  r7  s    €€rK   r  zEHermesCLI.run.<locals>._make_approval_number_handler.<locals>.handler¯$  sq   ø€ ØÔ'ð +¨Cµ#°dÔ6JÈ9Ô6UÑ2VÔ2VÒ,VÐ,VØ7:�DÔ(¨Ñ4Ø×3Ò3Ñ5Ô5Ð5Ø”I×(Ò(Ñ*Ô*Ð*Ð*Ð*ð+ð +Ð,VÐ,VrM   r]   r	  s   ` €rK   Ú_make_approval_number_handlerz4HermesCLI.run.<locals>._make_approval_number_handler®$  s)   øø€ ð+ð +ð +ð +ð +ð +ð
 ˆNrM   c                  ó,   •— t          ‰ j        ¦  «        S r\   r  rG  s   €rK   r€  zHermesCLI.run.<locals>.<lambda>¹$  s   ø€ µt¸DÔ<PÑ7QÔ7Q€ rM   c                  óT   •— ‰ j          o‰ j         o‰ j         o‰ j         o‰ j         S r\   )r�  r£  r   r©  r¨  rG  s   €rK   r€  zHermesCLI.run.<locals>.<lambda>À$  sT   ø€ ˜Ô+Ð+ð  ^°DÔ4HÐ0Hð  ^ÐQUÔQaÐMað  ^ÐjnÔj|Ðf|ð  ^ð  FJô  F^ð  B^€ rM   c                 óP   — | j         j                             | j        ¬¦  «         dS )zAUp arrow: browse history when on first line, else move cursor up.©r`  N)r¶   r	  Úauto_upr%  rè
  s    rK   Ú
history_upz!HermesCLI.run.<locals>.history_upÃ$  s(   € ð ŒIÔ$×,Ò,°5´9Ð,Ñ=Ô=Ð=Ð=Ð=rM   c                 óP   — | j         j                             | j        ¬¦  «         dS )zDDown arrow: browse history when on last line, else move cursor down.r$  N)r¶   r	  Ú	auto_downr%  rè
  s    rK   Úhistory_downz#HermesCLI.run.<locals>.history_downÈ$  s(   € ð ŒIÔ$×.Ò.°U´YÐ.Ñ?Ô?Ð?Ð?Ð?rM   zc-cc                 óð  •— t          j         ¦   «         }d}d}‰j        5  ‰j        r‰j        r‰j        }d‰_        d‰_        d}ddd¦  «         n# 1 swxY w Y   |rgt          dt          › dt          › �¦  «         t          j	        |j
        d¬¦  «                             ¦   «          | j                             ¦   «          dS ‰j        rB‰j        d                              d¦  «         d‰_        | j                             ¦   «          dS ‰j        rM‰                     ¦   «          | j        j                             ¦   «          | j                             ¦   «          dS ‰j        rB‰j        d                              d	¦  «         d‰_        | j                             ¦   «          dS ‰j        rM‰                     ¦   «          | j        j                             ¦   «          | j                             ¦   «          dS ‰j        rg‰j        d                              d
¦  «         d‰_        d‰_        | j        j                             ¦   «          | j                             ¦   «          dS ‰j        rw‰j        rp|‰j        z
  dk     r1t9          d¦  «         d‰_        | j                             ¦   «          dS |‰_        t9          d¦  «         ‰j                             ¦   «          dS | j        j        j         s‰j!        rR| j        j                             ¦   «          ‰j!         "                    ¦   «          | j                             ¦   «          dS d‰_        | j                             ¦   «          dS )aV  Handle Ctrl+C - cancel interactive prompts, interrupt agent, or exit.
            
            Priority:
            0. Cancel active voice recording
            1. Cancel active sudo/approval/clarify prompt
            2. Interrupt the running agent (first press)
            3. Force exit (second press within 2s, or when idle)
            FNTrZ   zRecording cancelled.r>	  rä	  r:   rí	  z7The user cancelled. Use your best judgement to proceed.g       @u   
âš¡ Force exiting...u=   
âš¡ Interrupting agent... (press Ctrl+C again to force exit))#rÿ  rµ  r¹  r¸  r»  rj  r‹  rŒ  r¥  r’  r×	  r“  r¶   rÕ  r   rD  r©  r@
  r	  rH  r£  r¨  r9  r�  rž  r—  rþ   rœ  r¹  r›  r  rì   r6   r±  r€  )rã
  r  Ú_should_cancel_voiceÚ_recorder_refrð
  r7  s       €€rK   Úhandle_ctrl_cz$HermesCLI.run.<locals>.handle_ctrl_cÍ$  sÇ  ø€ õ ”)‘+”+ˆCð
 $)Ð Ø ˆMØÔ$ð 0ð 0ØÔ+ð 0°Ô0Gð 0Ø$+Ô$;�MØ/4�GÔ,Ø05�GÔ-Ø+/Ð(ð0ð 0ð 0ñ 0ô 0ð 0ð 0ð 0ð 0ð 0ð 0øøøð 0ð 0ð 0ð 0ð $ð ÝÐ=�TÐ=Ð=µtÐ=Ð=Ñ>Ô>Ð>ÝÔ Ø(Ô/¸ðñ ô ç’%‘'”'�'Ø”	×$Ò$Ñ&Ô&Ð&Ø�ð Ôð ØÔ Ð!1Ô2×6Ò6°rÑ:Ô:Ð:Ø#'�Ô Ø”	×$Ò$Ñ&Ô&Ð&Ø�ð Ô!ð Ø×+Ò+Ñ-Ô-Ð-Ø”	Ô(×.Ò.Ñ0Ô0Ð0Ø”	×$Ò$Ñ&Ô&Ð&Ø�ð Ô#ð ØÔ$Ð%5Ô6×:Ò:¸6ÑBÔBÐBØ'+�Ô$Ø”	×$Ò$Ñ&Ô&Ð&Ø�ð Ô'ð Ø×(Ò(Ñ*Ô*Ð*Ø”	Ô(×.Ò.Ñ0Ô0Ð0Ø”	×$Ò$Ñ&Ô&Ð&Ø�ð Ô"ð ØÔ#Ð$4Ô5×9Ò9ØMñô ð ð '+�Ô#Ø).�Ô&Ø”	Ô(×.Ò.Ñ0Ô0Ð0Ø”	×$Ò$Ñ&Ô&Ð&Ø�àÔ"ð % t¤zð %Ø˜Ô/Ñ/°#Ò5Ð5ÝÐ2Ñ3Ô3Ð3Ø(,�DÔ%Ø”I—N’NÑ$Ô$Ð$Ø�Fà),�Ô&ÝÐVÑWÔWÐWØ”
×$Ò$Ñ&Ô&Ð&Ð&Ð&ð ”9Ô+Ô0ð %°DÔ4Ið %Ø”IÔ,×2Ò2Ñ4Ô4Ð4ØÔ)×/Ò/Ñ1Ô1Ð1Ø”I×(Ò(Ñ*Ô*Ð*Ð*Ð*à(,�DÔ%Ø”I—N’NÑ$Ô$Ð$Ð$Ð$s    &AÁAÁAzc-dc                 ó¬   •— | j         j        }|j        r|                     ¦   «          dS ‰j        rdS d‰_        | j                              ¦   «          dS )u  Ctrl+D: delete char under cursor (standard readline behaviour).
            Only exit when the input is empty â€” same as bash/zsh. Pending
            attached images count as input and block the EOF-exit so the
            user doesn't lose them silently.
            NT)r¶   r	  r6   rá  r±  r›  r  )rã
  rœ  r7  s     €rK   Úhandle_ctrl_dz$HermesCLI.run.<locals>.handle_ctrl_d(%  sZ   ø€ ð ”)Ô*ˆCØŒxð !Ø—
’
‘”���ØÔ&ð !à�à$(�Ô!Ø”	—’Ñ Ô Ð Ð Ð rM   c                  ó:   •— t          ‰ j        p‰ j        ¦  «        S r\   )ræ  r©  r   rG  s   €rK   r€  zHermesCLI.run.<locals>.<lambda>:%  s   ø€ •D˜Ô+Ð?¨tÔ/?Ñ@Ô@€ rM   c                 óB  •— ‰j         rM‰                     ¦   «          | j        j                             ¦   «          | j                             ¦   «          dS ‰j        rB‰j        d                              d¦  «         d‰_        | j                             ¦   «          dS dS )z'ESC cancels active secret/sudo prompts.Nrä	  r:   )r©  r@
  r¶   r	  rH  rÕ  r   rD  rÿ
  s    €rK   Úhandle_escape_modalz*HermesCLI.run.<locals>.handle_escape_modal=%  s¥   ø€ ð Ô!ð Ø×+Ò+Ñ-Ô-Ð-Ø”	Ô(×.Ò.Ñ0Ô0Ð0Ø”	×$Ò$Ñ&Ô&Ð&Ø�ØÔð ØÔ Ð!1Ô2×6Ò6°rÑ:Ô:Ð:Ø#'�Ô Ø”	×$Ò$Ñ&Ô&Ð&Ø�ð	ð rM   zc-zc                 ó.  ‡‡— t           j        dk    r:t          dt          › dt          › �¦  «         | j                             ¦   «          dS ddlŠddlm	} ddl
m}  |¦   «                              dd	¦  «        }d|› d
|› d�Šˆˆfd„} ||¦  «         dS )z:Handle Ctrl+Z - suspend process to background (Unix only).Úwin32rZ   z-Suspend (Ctrl+Z) is not supported on Windows.Nr   r  r:  r  r  z' has been suspended. Run `fg` to bring z back.c                  óŠ   •— t          j        d‰                     ¦   «         ¦  «         t          j        d‰ j        ¦  «         d S )Nr  r   )r’   rÁ  r  ÚkillÚSIGTSTP)Ú_sigr«  s   €€rK   Ú_suspendz6HermesCLI.run.<locals>.handle_ctrl_z.<locals>._suspendW%  s7   ø€ Ý”˜˜CŸJšJ™LœLÑ)Ô)Ð)Ý”˜˜4œ<Ñ(Ô(Ð(Ð(Ð(rM   )r  r‹  rj  r‹  rŒ  r¶   rÕ  Úsignalr   r  r<  r;  r  )rã
  r  r;  r  r9  r8  r«  s        @@rK   Úhandle_ctrl_zz$HermesCLI.run.<locals>.handle_ctrl_zK%  sç   øø€ õ Œ|˜wÒ&Ð&ÝÐV�TÐVÐVÕPTÐVÐVÑWÔWÐWØ”	×$Ò$Ñ&Ô&Ð&Ø�Ø!Ð!Ð!Ð!ØBÐBÐBÐBÐBÐBØ>Ð>Ð>Ð>Ð>Ð>Ø(˜Ñ*Ô*×7Ò7¸ÀnÑUÔUˆJØ\�zÐ\Ð\È*Ð\Ð\Ð\ˆCð)ð )ð )ð )ð )ð )ð ˆO˜HÑ%Ô%Ð%Ð%Ð%rM   rê  r-  rÁ	  rÂ	  rÃ	  rÄ	  rÅ	  rÆ	  rÇ	  c                 óÖ  •— ‰j         sdS ‰j        rn‰j        5  d‰_        ddd¦  «         n# 1 swxY w Y   | j                             ¦   «          t          j        ‰j        d¬¦  «         	                    ¦   «          dS ‰j
        rdS ‰j        s‰j        s‰j        rdS ‰j        rdS ‰j                             ¦   «         s;	 ddlm}  |¦   «          ‰j                             ¦   «          n# t(          $ r Y nw xY w‰j        5  d‰_        ddd¦  «         n# 1 swxY w Y   ˆfd„}t          j        |d¬¦  «         	                    ¦   «          | j                             ¦   «          dS )a!  Toggle voice recording when voice mode is active.

            IMPORTANT: This handler runs in prompt_toolkit's event-loop thread.
            Any blocking call here (locks, sd.wait, disk I/O) freezes the
            entire UI.  All heavy work is dispatched to daemon threads.
            NFTr>	  r   rÕ	  c                  ó  •— 	 ‰                      ¦   «          t          ‰d¦  «        r"‰j        r‰j                             ¦   «          d S d S d S # t          $ r,} t          dt          › d| › t          › �¦  «         Y d } ~ d S d } ~ ww xY w)NrŒ  rZ   zVoice recording failed: rœ	  )rz   rð
  s    €rK   Ú_start_recordingzDHermesCLI.run.<locals>.handle_voice_record.<locals>._start_recording—%  s½   ø€ ðNØ×6Ò6Ñ8Ô8Ð8Ý" 7¨FÑ3Ô3ð 6¸¼ð 6Ø#œL×3Ò3Ñ5Ô5Ð5Ð5Ð5ð6ð 6ð 6ð 6øå$ð Nð Nð NÝÐ L¥TÐ LÐ LÀ1Ð LÅdÐ LÐ LÑMÔMÐMÐMÐMÐMÐMÐMÐMøøøøðNøøøs   ƒAA Á
BÁ!A>Á>B)r¶  r¹  rµ  r»  r¶   rÕ  r¥  r’  r…	  r“  r—  r�  r   r£  rº  r½  Úis_setro	  rÖ	  r´   rv   )rã
  rÖ	  r>  rð
  s      €rK   Úhandle_voice_recordz*HermesCLI.run.<locals>.handle_voice_recordf%  sK  ø€ ð Ô&ð Ø�àÔ'ð /'àÔ(ð 6ð 6Ø05�GÔ-ð6ð 6ð 6ñ 6ô 6ð 6ð 6ð 6ð 6ð 6ð 6øøøð 6ð 6ð 6ð 6ð ”	×$Ò$Ñ&Ô&Ð&ÝÔ Ø"Ô=Øðñ ô ÷ ’%‘'”'�'�'�'ð Ô)ð Ø�FØÔ)ð ¨WÔ-@ð ÀGÔD[ð Ø�Fð Ô,ð Ø�Fð Ô.×5Ò5Ñ7Ô7ð ðØBÐBÐBÐBÐBÐBØ%˜™œ˜ØÔ/×3Ò3Ñ5Ô5Ð5Ð5øÝ$ð ð ð Ø˜ðøøøð Ô(ð 5ð 5Ø04�GÔ-ð5ð 5ð 5ñ 5ô 5ð 5ð 5ð 5ð 5ð 5ð 5øøøð 5ð 5ð 5ð 5ðNð Nð Nð Nð Nõ Ô Ð(8ÀÐFÑFÔF×LÒLÑNÔNÐNØ”	×$Ò$Ñ&Ô&Ð&Ð&Ð&s0   ™-­1´1Ã)C- Ã-
C:Ã9C:ÄDÄDÄD)ÚKeysc                 óŽ  •— | j         pd}|                     dd¦  «                             dd¦  «        }t          |¦  «        r-‰                     ¦   «         r| j                             ¦   «          |�rQddlm}  ||¦  «        }|                     d¦  «        }| j	        }|dk    �r|j
                             ¦   «                              d¦  «        sÚ‰	dxx         d	z  cc<   t          d
z  }|                     dd¬¦  «         |d‰	d         › dt          j        ¦   «                              d¦  «        › d�z  }|                     |d¬¦  «         d‰	d         › d|d	z   › d|› d�}d}|j        dk    r|j
        |j        d	z
           dk    rd}d‰
d<   |                     ||z   ¦  «         dS |                     |¦  «         dS dS )u  Handle terminal paste â€” detect clipboard images.

            When the terminal supports bracketed paste, Ctrl+V / Cmd+V
            triggers this with the pasted text. We only auto-attach a
            clipboard image for image-only/empty paste gestures so text
            pastes and dictation do not accidentally attach stale images.

            Large pastes (5+ lines) are collapsed to a file reference
            placeholder while preserving any existing user text in the
            buffer.
            r:   r„  rZ   úr   rF
  rœ  r�  r  ÚpastesTr­  Úpaste_rg  rs  ú.txtrj   rk   r¸  r—  õ    lines â†’ r£  N)ry   r„  rÝ  rÃ  r¶   rÕ  r	  rG
  r`  r	  r6   rG   rÅ  ro   r½  r   r  r”  Ú
write_textr
  rç
  )rã
  rÛ  rG
  Ú
line_countrœ  Ú	paste_dirÚ
paste_fileÚplaceholderr+  Ú_paste_counterÚ_paste_just_collapsedr7  s            €€€rK   Úhandle_pastez#HermesCLI.run.<locals>.handle_paste£%  s  ø€ ð  œ*Ð*¨ˆKð &×-Ò-¨f°dÑ;Ô;×CÒCÀDÈ$ÑOÔOˆKÝ;¸KÑHÔHð 'ÈT×MmÒMmÑMoÔMoð 'Ø”	×$Ò$Ñ&Ô&Ð&Øñ 1à:Ð:Ð:Ð:Ð:Ð:Ø2Ð2°;Ñ?Ô?�Ø(×.Ò.¨tÑ4Ô4�
ØÔ*�Ø ’?‘?¨3¬8¯>ª>Ñ+;Ô+;×+FÒ+FÀsÑ+KÔ+K�?Ø" 1Ð%Ð%Ô%¨Ñ*Ð%Ð%Ñ%Ý ,¨xÑ 7�IØ—O’O¨D¸4�OÑ@Ô@Ð@Ø!*Ð-q°nÀQÔ6GÐ-qÐ-qÍ(Ì,É.Ì.×JaÒJaÐbjÑJkÔJkÐ-qÐ-qÐ-qÑ!q�JØ×)Ò)¨+ÀÐ)ÑHÔHÐHØ"s°>À!Ô3DÐ"sÐ"sÈ
ÐUVÉÐ"sÐ"sÐfpÐ"sÐ"sÐ"s�KØ�FØÔ*¨QÒ.Ð.°3´8¸CÔ<OÐRSÑ<SÔ3TÐX\Ò3\Ð3\Ø!%˜Ø/3Ð)¨!Ñ,Ø—O’O F¨[Ñ$8Ñ9Ô9Ð9Ð9Ð9à—O’O KÑ0Ô0Ð0Ð0Ð0ð'1ð 1rM   zc-vc                 óf   •— ‰                      ¦   «         r| j                             ¦   «          dS dS )aî  Fallback image paste for terminals without bracketed paste.

            On Linux terminals (GNOME Terminal, Konsole, etc.), Ctrl+V
            sends raw byte 0x16 instead of triggering a paste.  This
            binding catches that and checks the clipboard for images.
            On terminals that DO intercept Ctrl+V for paste (macOS
            Terminal, iTerm2, VSCode, Windows Terminal), the bracketed
            paste handler fires instead and this binding never triggers.
            N©rÃ  r¶   rÕ  rÿ
  s    €rK   Úhandle_ctrl_vz$HermesCLI.run.<locals>.handle_ctrl_vË%  s=   ø€ ð ×/Ò/Ñ1Ô1ð 'Ø”	×$Ò$Ñ&Ô&Ð&Ð&Ð&ð'ð 'rM   Úvc                 óf   •— ‰                      ¦   «         r| j                             ¦   «          dS dS )u’  Alt+V â€” paste image from clipboard.

            Alt key combos pass through all terminal emulators (sent as
            ESC + key), unlike Ctrl+V which terminals intercept for text
            paste.  This is the reliable way to attach clipboard images
            on WSL2, VSCode, and any terminal over SSH where Ctrl+V
            can't reach the application for image-only clipboard.
            NrQ  rÿ
  s    €rK   Úhandle_alt_vz#HermesCLI.run.<locals>.handle_alt_vÙ%  s:   ø€ ð ×/Ò/Ñ1Ô1ð Ø”	×$Ò$Ñ&Ô&Ð&Ð&Ð&ð �rM   c                  ó,   •— ‰                       ¦   «         S r\   )r³
  ©rð
  s   €rK   Ú
get_promptz!HermesCLI.run.<locals>.get_promptí%  s   ø€ Ø×4Ò4Ñ6Ô6Ð6rM   )ÚAutoSuggestFromHistoryc                  ó   — t           S r\   )ru  r]   rM   rK   r€  zHermesCLI.run.<locals>.<lambda>õ%  s   € ­O€ rM   )Úskill_commands_providerÚcommand_filterrª  )r  rÐ  Ú	preferredzclass:input-areac                  ó,   •— t          ‰ j        ¦  «        S r\   )ræ  r¯  rW  s   €rK   r€  zHermesCLI.run.<locals>.<lambda>þ%  s   ø€ ­¨WÔ-EÑ(FÔ(F€ rM   )Úhistory_suggestÚ	completer)
rÊ
  r¼  r�  Ú	multilineÚ
wrap_linesÚ	read_onlyrÀ  r`  Úcomplete_while_typingÚauto_suggestz.mdc                  ó  •— 	 ddl m}  ddlm} ‰j        j        }t          d |‰	                     ¦   «         ¦  «        ¦  «        }	  | ¦   «         j         	                    ¦   «         j
        |z
  }n,# t          $ r t          j        d¦  «        j
        |z
  }Y nw xY w|dk     rd}d}|j        D ]1} ||¦  «        }|dk    r|dz  }Œ|t          d| |z   ¦  «        z  }Œ2t          t          |d¦  «        d	¦  «        S # t          $ r Y dS w xY w)
Nr   r  r  r�  rË  rá  r—  r  rª  )r   r  r  r  r  ÚdocumentrÐ  r¶
  r§  r!  r×  rv   rž   rÖ  r“  r  )
r  r  ÚdocÚprompt_widthÚavailable_widthÚvisual_linesrÖ  Ú
line_widthrÃ
  r7  s
           €€rK   Ú_input_heightz$HermesCLI.run.<locals>._input_height&  sl  ø€ ðØ>Ð>Ð>Ð>Ð>Ð>Ø;Ð;Ð;Ð;Ð;Ð;à Ô'Ô0�Ý" 1 j j°×1JÒ1JÑ1LÔ1LÑ&MÔ&MÑNÔN�ð`Ø&- g¡i¤iÔ&6×&?Ò&?Ñ&AÔ&AÔ&IÈLÑ&X�O�OøÝ ð `ð `ð `Ý&,Ô&>¸xÑ&HÔ&HÔ&PÐS_Ñ&_�O�O�Oð`øøøà" RÒ'Ð'Ø&(�OØ �ØœIð Rð R�Dð ", ¨DÑ!1Ô!1�JØ! Q’�Ø$¨Ñ)˜˜à$­¨A°*°ÀÑ1OÐ/PÑ(QÔ(QÑQ˜˜Ý�3˜|¨QÑ/Ô/°Ñ3Ô3Ð3øÝð ð ð Ø�q�qðøøøs7   ƒAC> Á)A1 Á0C> Á1&BÂC> ÂBÂA#C> Ã>
DÄDc                 óè  •— | j         }t          |¦  «        ‰d         z
  }t          |¦  «        ‰d<   ‰	d         s‰j        r&d‰	d<   d‰_        |                     d¦  «        ‰
d<   dS |                     d¦  «        }|‰
d         z
  }|‰
d<   |dk    p|dk    }|dk    rÏ|rÏ|                     d¦  «        s¼‰dxx         dz  cc<   t
          d	z  }|                     d
d
¬¦  «         |d‰d         › dt          j        ¦   «          	                    d¦  «        › d�z  }| 
                    |d¬¦  «         d
‰	d<   d‰d         › d|dz   › d|› d�| _         t          | j         ¦  «        | _        dS dS dS dS )uà  Detect large pastes and collapse them to a file reference.

            When bracketed paste is available, handle_paste collapses
            large pastes directly.  This handler is a fallback for
            terminals without bracketed paste support.

            Two heuristics (either triggers collapse):
            1. Many characters added at once (chars_added > 1) â€” works
               when the terminal delivers the paste in one event-loop tick.
            2. Newline count jumped by 4+ in a single text-change event â€”
               catches terminals that feed characters individually but
               still batch newlines.  Alt+Enter only adds 1 newline per
               event so it never triggers this.
            r   FrZ   Nr  r¶  rœ  r�  rD  Tr­  rE  rg  rs  rF  rj   rk   r¸  r—  rG  r£  )r6   r  r  r`  rÅ  ro   r½  r   r  r”  rH  r
  )rœ  r6   Úchars_addedrI  Únewlines_addedÚis_pasterJ  rK  rM  rN  Ú_prev_newline_countÚ_prev_text_lenr7  s           €€€€€rK   Ú_on_text_changedz'HermesCLI.run.<locals>._on_text_changed2&  s¼  ø€ ð ”8ˆDÝ˜d™)œ) n°QÔ&7Ñ7ˆKÝ # D¡	¤	ˆN˜1ÑØ$ QÔ'ð ¨4Ô+Dð Ø+0Ð% aÑ(Ø,1�Ô)Ø)-¯ª°DÑ)9Ô)9Ð# AÑ&Ø�ØŸš DÑ)Ô)ˆJØ'Ð*=¸aÔ*@Ñ@ˆNØ%/Ð Ñ"Ø" Q’Ð=¨.¸AÒ*=ˆHØ˜QŠˆ 8ˆ°D·O²OÀCÑ4HÔ4HˆØ˜qÐ!Ð!Ô! QÑ&Ð!Ð!Ñ!Ý(¨8Ñ3�	Ø—’¨°t�Ñ<Ô<Ð<Ø&Ð)m°.ÀÔ2CÐ)mÐ)mÅhÄlÁnÄn×F]ÒF]Ð^fÑFgÔFgÐ)mÐ)mÐ)mÑm�
Ø×%Ò% d°WÐ%Ñ=Ô=Ð=Ø+/Ð% aÑ(Øl¨N¸1Ô,=ÐlÐlÀÈaÁÐlÐlÐ_iÐlÐlÐl�”Ý&)¨#¬(¡m¤m�Ô#Ð#Ð#ð ˆˆˆˆˆrM   c                  óT   •— t          ‰ j        ¦  «        pt          ‰ j        ¦  «        S r\   )ræ  r   r©  rW  s   €rK   r€  zHermesCLI.run.<locals>.<lambda>`&  s"   ø€ �D Ô!4Ñ5Ô5ÐT½¸gÔ>SÑ9TÔ9T€ rM   c                   ó   — e Zd ZdZd„ Zd„ ZdS )ú,HermesCLI.run.<locals>._PlaceholderProcessorz?Render grayed-out placeholder text inside the input when empty.c                 ó   — || _         d S r\   )Ú	_get_text)r7  Úget_texts     rK   r8  z5HermesCLI.run.<locals>._PlaceholderProcessor.__init__g&  s   € Ø!)�”��rM   c                 ó¼   — |j         j        s<|j        dk    r1|                      ¦   «         }|rt	          |j        d|fgz   ¬¦  «        S t	          |j        ¬¦  «        S )Nr   zclass:placeholder)Ú	fragments)rg  r6   Úlinenory  r   r|  )r7  Útir6   s      rK   Úapply_transformationzAHermesCLI.run.<locals>._PlaceholderProcessor.apply_transformationj&  sg   € Ø”{Ô'ð f¨B¬I¸ªN¨NØŸ>š>Ñ+Ô+�DØð få-¸¼ÐI\Ð^bÐHcÐGdÑ8dÐeÑeÔeÐeÝ%°´Ð=Ñ=Ô=Ð=rM   N)rJ  rK  rL  rM  r8  r  r]   rM   rK   Ú_PlaceholderProcessorrw  e&  s8   € € € € € ØQÐQð*ð *ð *ð>ð >ð >ð >ð >rM   r€  c                  ó   •— ‰j         rdS ‰j        rdS ‰j        rdS ‰j        rdS ‰j        rdS ‰j        rdS ‰j        rdS ‰j        r$‰                     ¦   «         } ‰j	        pd}| › d|› �S ‰j
        rd	S ‰j        rd
S dS )Nz-recording... Ctrl+B to stop, Ctrl+C to cancelztranscribing...u6   type password (hidden), Enter to submit Â· ESC to skipu4   type secret (hidden), Enter to submit Â· ESC to skipr:   z%type your answer here and press Enterrþ  r‚  u9   msg=interrupt Â· /queue Â· /bg Â· /steer Â· Ctrl+C cancelztype or Ctrl+B to record)r¹  rº  r   r©  r£  rž  r�  r¯  r  r°  r—  r¶  )Úframerý  rð
  s     €rK   Ú_get_placeholderz'HermesCLI.run.<locals>._get_placeholderr&  sá   ø€ ØÔ'ð GØFÐFØÔ(ð )Ø(Ð(ØÔ"ð PØOÐOØÔ$ð NØMÐMØÔ&ð Ø�rØÔ(ð ?Ø>Ð>ØÔ%ð Ø�rØÔ'ð +Ø×6Ò6Ñ8Ô8�Ø Ô0ÐKÐ4K�ØÐ*Ð* &Ð*Ð*Ð*ØÔ%ð SØRÐRØÔ"ð 2Ø1Ð1Ø�2rM   c                  ó¸  •— ‰j         r@t          dt          ‰j        t	          j        ¦   «         z
  ¦  «        ¦  «        } ddd| › d�fgS ‰j        r@t          dt          ‰j        t	          j        ¦   «         z
  ¦  «        ¦  «        } ddd| › d�fgS ‰j        r@t          dt          ‰j	        t	          j        ¦   «         z
  ¦  «        ¦  «        } ddd| › d�fgS ‰j
        rXt          dt          ‰j        t	          j        ¦   «         z
  ¦  «        ¦  «        } ‰j        rd| › d�nd}‰j        rd	d|fgS dd|fgS ‰j        r‰                     ¦   «         }d
d|› d�fgS g S )Nr   )ú
class:hintu"     password hidden Â· Enter to skipzclass:clarify-countdownr9  zs))r…  u      secret hidden Â· Enter to skip)r…  u%     â†‘/â†“ to select, Enter to confirmr:   )r…  z"  type your answer and press Enterr…  r8  u2    command in progress Â· input temporarily disabled)r   rÐ  rô  r¡  rÿ  rÔ  r©  rª  r£  r¤  r�  rŸ  rž  r¯  r  )rí  Ú	countdownr‚  rð
  s      €rK   Úget_hint_textz$HermesCLI.run.<locals>.get_hint_text�&  sÎ  ø€ ØÔ"ð Ý ¥3 wÔ'=ÅÄÑ@PÔ@PÑ'PÑ#QÔ#QÑRÔR�	àHØ.Ð0C°iÐ0CÐ0CÐ0CÐDðð ð
 Ô$ð Ý ¥3 wÔ'?Å$Ä.ÑBRÔBRÑ'RÑ#SÔ#SÑTÔT�	àFØ.Ð0C°iÐ0CÐ0CÐ0CÐDðð ð
 Ô&ð Ý ¥3 wÔ'AÅDÄNÑDTÔDTÑ'TÑ#UÔ#UÑVÔV�	àKØ.Ð0C°iÐ0CÐ0CÐ0CÐDðð ð
 Ô%ð Ý ¥3 wÔ'@Å4Ä>ÑCSÔCSÑ'SÑ#TÔ#TÑUÔU�	Ø3:Ô3LÐTÐ/ )Ð/Ð/Ð/Ð/ÐRT�	ØÔ,ð àLØ2°IÐ>ðð ð
 LØ.°	Ð:ðð ð
 Ô'ð Ø×6Ò6Ñ8Ô8�à!Ð#a¨Ð#aÐ#aÐ#aÐbðð ð ˆIrM   c                  óv   •— ‰ j         s‰ j        s‰ j        s‰ j        s‰ j        rdS ‰                      ¦   «         S )Nr  )r   r©  r£  r�  r¯  r.  rW  s   €rK   Úget_hint_heightz&HermesCLI.run.<locals>.get_hint_height»&  sU   ø€ ØÔ"ð  gÔ&;ð ¸wÔ?Vð ÐZaÔZpð Ðt{ô  uMð Ø�qð ×/Ò/Ñ1Ô1Ð1rM   c                  ó>   •— ‰                      ¦   «         } | sg S d| fgS )Nr…  )r0  )r3  rð
  s    €rK   Úget_spinner_textz'HermesCLI.run.<locals>.get_spinner_textÂ&  s/   ø€ Ø"×7Ò7Ñ9Ô9ˆLØð Ø�	Ø! <Ð0Ð1Ð1rM   c                  ó,   •— ‰                       ¦   «         S r\   )r5  rW  s   €rK   Úget_spinner_heightz)HermesCLI.run.<locals>.get_spinner_heightÈ&  s   ø€ Ø×1Ò1Ñ3Ô3Ð3rM   )rN   rÊ
  rb  )rN   rÊ
  rû	  rJ  rL  rý	  rþ	  r  r7   c           	      ó  — t          j        d¦  «        j        }t          t	          | ¦  «        gd„ |D ¦   «         z   |dz
  gz   ¦  «        }t          t          |dz   |dz
  ¦  «        |dz
  t          d|dz
  ¦  «        ¦  «        }|dz   S )zBChoose a stable panel width wide enough for the title and content.r 
  c                 ó,   — g | ]}t          |¦  «        ‘ŒS r]   rÚ  r†  s     rK   rY   z;HermesCLI.run.<locals>._panel_box_width.<locals>.<listcomp>Û&  s   € Ð)NÐ)NÐ)N¸­#¨d©)¬)Ð)NÐ)NÐ)NrM   r¶  r�  rð  rf  r
  )rL  rý	  rþ	  r  r
  r
  r  s          rK   r
  z'HermesCLI.run.<locals>._panel_box_widthØ&  s�   € åÔ0°Ñ;Ô;ÔCˆIÝ�3˜u™:œ:˜,Ð)NÐ)NÀÐ)NÑ)NÔ)NÑNÐR[Ð^_ÑR_ÐQ`Ñ`ÑaÔaˆGÝ�˜G a™K¨°Q©Ñ7Ô7¸ÀQ¹ÍÈBÐPYÐ\]ÑP]ÑH^ÔH^Ñ_Ô_ˆEØ˜1‘9ÐrM   r6   rÉ  r
  c                 óZ   — t          j        | t          d|¦  «        dd|¬¦  «        }|pdgS )Nrª  F)rÉ  Úbreak_long_wordsÚbreak_on_hyphensr
  r:   r

  r
  s       rK   r
  z'HermesCLI.run.<locals>._wrap_panel_textß&  s=   € Ý”mØÝ˜!˜U‘m”mØ!&Ø!&Ø"3ðñ ô ˆGð �?˜r˜dÐ"rM   r   r
  r
  c                 óÜ   — t          d|dz
  ¦  «        }|                      |df¦  «         |                      ||                     |¦  «        f¦  «         |                      |df¦  «         d S r
  r
  r
  s         rK   r
  z)HermesCLI.run.<locals>._append_panel_lineé&  r
  rM   c                 óF   — |                       |dd|z  z   dz   f¦  «         d S r
  r
  r
  s      rK   r
  z/HermesCLI.run.<locals>._append_blank_panel_lineï&  r
  rM   c                  ó°	  •— ‰%j         } | sg S | d         }|                      d¦  «        pg }|                      dd¦  «        } ‰$|d¦  «        }t          |¦  «        D ]h\  }}|dk     rt          |dz   ¦  «        }n|dk    rd}nd	}||k    r‰%j        sd
|› d�}nd|› d�}|                      ‰$|› |› �dd¬¦  «        ¦  «         Œit          |¦  «        dz   }	|	dk     rt          |	¦  «        }
n|	dk    rd}
nd	}
‰%j        rd
|
› d�n|t          |¦  «        k    rd
|
› d�nd|
› d�}|                      ‰$|dd¬¦  «        ¦  «          ‰#d|¦  «        }t          d|dz
  ¦  «        }g }|rët          |¦  «        D ]o\  }}|dk     rt          |dz   ¦  «        }n|dk    rd}nd	}||k    r‰%j        sd
|› d�}nd|› d�} ‰$|› |› �|d¬¦  «        D ]}|                     ||f¦  «         ŒŒpt          |¦  «        }|dz   }	|	dk     rt          |	¦  «        }
n|	dk    rd}
nd	}
||k    r‰%j        sd
|
› d�}n‰%j        rd
|
› d�}nd|
› d�} ‰$||d¬¦  «        }n‰%j        r ‰$d|¦  «        }ng }t          j
        d¦  «        j        }d}d}d}t          d||z
  ¦  «        }|t          |¦  «        z   t          |¦  «        z   }||k    }|r|n|}t          d||z
  t          |¦  «        z
  t          |¦  «        z
  ¦  «        }t          |d¦  «        } ‰$||¦  «        }t          |¦  «        |k    r!t          d|dz
  ¦  «        }|d|…         dgz   }g }|                     d¦  «         |                     d¦  «         |                     dd	dt          d|t          d¦  «        z
  d z
  ¦  «        z  z   d!z   f¦  «         |s ‰!|d|¦  «         |D ]} ‰"|dd"||¦  «         Œ|s ‰!|d|¦  «         ‰%j        r%|s#|D ]} ‰"|dd#||¦  «         Œ|s ‰!|d|¦  «         |r�|D ]%\  }}||k    r	‰%j        sd$nd#} ‰"|d|||¦  «         Œ&t          |¦  «        }|dz   }	|	dk     rt          |	¦  «        }
n|	dk    rd}
nd	}
||k    r
‰%j        sd$} n‰%j        rd%} nd#} |D ]} ‰"|d| ||¦  «         Œ|s ‰!|d|¦  «         |                     dd&d|z  z   d'z   f¦  «         |S )(a]  Build styled text for the clarify question/choices panel.

            Layout priority: choices + Other option must always render even if
            the question is very long. The question is budgeted to leave enough
            rows for the choices and trailing chrome; anything over the budget
            is truncated with a marker.
            râ	  rã	  r0  r   rÂ   r 
  r  r!
  r‚  r
  r‚  r8  r  r
  rá  z. Other (type below)z. Other (type your answer)úHermes needs your inputrª  r�  z7Type your answer in the prompt below, then press Enter.r"
  rœ  rf  rÕ  Nu   â€¦ (question truncated)©úclass:clarify-borderõ   â•­â”€ )úclass:clarify-titler–  r˜  rÈ  rý  r#
  zclass:clarify-questionúclass:clarify-choicer²
  zclass:clarify-active-otherrú  r$
  )r�  rT   r¼  rU   rž  r®  r  rÐ  r–   rž   rÖ  r“  r  )&r€  râ	  rã	  r0  r´  r  r÷	  r,
  r+  Ú	other_numÚother_num_prefixÚother_labelr
  r)
  r+
  r
  Ú	other_idxÚother_label_mandÚother_wrappedr;  r-
  r.
  r<  rw  r/
  r0
  r1
  Úmax_question_rowsÚquestion_wrappedrí  r“  r�  Úother_styler
  r
  r
  r
  rð
  s&                                    €€€€€rK   Ú_get_clarify_displayz+HermesCLI.run.<locals>._get_clarify_displayò&  so  ø€ ð Ô*ˆEØð Ø�	à˜ZÔ(ˆHØ—i’i 	Ñ*Ô*Ð0¨bˆGØ—y’y ¨QÑ/Ô/ˆHØ,Ð,¨X°rÑ:Ô:ˆMÝ& wÑ/Ô/ð jð j‘	��6à�q’5�5Ý!$ Q¨¡U¡¤�J�JØ˜!’V�VØ!$�J�Jà!$�JØ˜’=�=¨Ô)B�=Ø2 JÐ2Ð2Ð2�F�Fà0 *Ð0Ð0Ð0�FØ×$Ò$Ð%5Ð%5¸Ð6IÀÐ6IÐ6IÈ2ÐagÐ%hÑ%hÔ%hÑiÔiÐiÐiå˜G™œ qÑ(ˆIØ˜2Š~ˆ~Ý#& y¡>¤>Ð Ð Ø˜b’�Ø#&Ð Ð à#&Ð àAHÔAZð GÐ=Ð'Ð=Ð=Ð=Ð=ØLTÕX[Ð\cÑXdÔXdÒLdÐLdÐHÐ,ÐHÐHÐHÐHØFÐ*ÐFÐFÐFð ð
 × Ò Ð!1Ð!1°+¸rÐU[Ð!\Ñ!\Ô!\Ñ]Ô]Ð]Ø(Ð(Ð)BÀMÑRÔRˆIÝ" 1 i°!¡mÑ4Ô4Ðð 57ˆNØð &#Ý!*¨7Ñ!3Ô!3ð <ð <‘I�A�và˜1’u�uÝ%(¨¨Q©¡Z¤Z˜
˜
Ø˜aš˜Ø%(˜
˜
à%(˜
Ø˜H’}�}¨WÔ-F�}Ø!6¨
Ð!6Ð!6Ð!6˜˜à!4 jÐ!4Ð!4Ð!4˜Ø#3Ð#3°vÐ4G¸vÐ4GÐ4GÐIYÐmsÐ#tÑ#tÔ#tð <ð <˜Ø&×-Ò-¨q°'¨lÑ;Ô;Ð;Ð;ð<õ   ™LœL�	Ø%¨™M�	Ø˜r’>�>Ý'*¨9¡~¤~Ð$Ð$Ø "’_�_Ø'*Ð$Ð$à'*Ð$Ø˜yÒ(Ð(°Ô1JÐ(Ø'ZÐ.>Ð'ZÐ'ZÐ'ZÐ$Ð$ØÔ.ð YØ'TÐ.>Ð'TÐ'TÐ'TÐ$Ð$à'XÐ,<Ð'XÐ'XÐ'XÐ$Ø 0Ð 0Ð1AÐCSÐgmÐ nÑ nÔ n��ØÔ*ð #à 0Ð 0ØMØ$ñ!ô !��ð
 !#�õ Ô0°Ñ;Ô;ÔAˆIØˆKØˆLØˆNå˜A˜y¨>Ñ9Ñ:Ô:ˆIØ(­3¨~Ñ+>Ô+>Ñ>ÅÀ]ÑASÔASÑSˆNà!/°)Ò!;ÐØ*<ÐM˜,˜,À+ˆKå # A y°;Ñ'>ÅÀ^ÑATÔATÑ'TÕWZÐ[hÑWiÔWiÑ'iÑ jÔ jÐÝ #Ð$5°rÑ :Ô :Ðà/Ð/°Ð:JÑKÔKÐÝÐ#Ñ$Ô$Ð'8Ò8Ð8Ý˜1Ð/°!Ñ3Ñ4Ô4�Ø#3°E°T°EÔ#:Ð>XÐ=YÑ#YÐ àˆEà�LŠLÐ<Ñ=Ô=Ð=Ø�LŠLÐKÑLÔLÐLØ�LŠLÐ0°#¸ÅÀQÈ	ÕTWÐXqÑTrÔTrÑHrÐuvÑHvÑAwÔAwÑ9wÑ2xð  |Cñ  3Cð  Dñ  Eô  Eð  EØ%ð SØ(Ð(¨Ð0FÈ	ÑRÔRÐRð ,ð pð p�Ø"Ð" 5Ð*@ÐBZÐ\cÐenÑoÔoÐoÐoØ%ð SØ(Ð(¨Ð0FÈ	ÑRÔRÐRàÔ(ð W°ð WØ,ð rð r�GØ&Ð& uÐ.DÐF\Ð^eÐgpÑqÔqÐqÐqØ)ð WØ,Ð,¨UÐ4JÈIÑVÔVÐVàð gà"0ð að a‘J�A�wØ89¸Xº¸ÈgÔNg¸Ð4Ð4ð  nD�EØ&Ð& uÐ.DÀeÈWÐV_Ñ`Ô`Ð`Ð`õ   ™LœL�	à%¨™M�	Ø˜r’>�>Ý'*¨9¡~¤~Ð$Ð$Ø "’_�_Ø'*Ð$Ð$à'*Ð$à˜yÒ(Ð(°Ô1JÐ(Ø":�K�KØÔ.ð 9Ø">�K�Kà"8�KØ,ð gð g�GØ&Ð& uÐ.DÀkÐSZÐ\eÑfÔfÐfÐfà%ð SØ(Ð(¨Ð0FÈ	ÑRÔRÐRØ�LŠLÐ0°%¸5À9Ñ;LÑ2MÐPWÑ2WÐXÑYÔYÐYØˆLrM   )rb  c                  ó   •— ‰ j         d uS r\   )r�  rW  s   €rK   r€  zHermesCLI.run.<locals>.<lambda>�'  s   ø€  WÔ%;À4Ð%G€ rM   c                  ó°  •— ‰j         } | sg S d}d} ‰||g¦  «        }g }|                     d¦  «         |                     d|f¦  «         |                     dddt          d|t          |¦  «        z
  d	z
  ¦  «        z  z   d
z   f¦  «          ‰|d|¦  «          ‰|dd||¦  «          ‰|d|¦  «         |                     ddd|z  z   dz   f¦  «         |S )Nu   ðŸ”� Sudo Password Requiredz5Enter password below (hidden), or press Enter to skip©úclass:sudo-borderr™  úclass:sudo-titler©  r‚  rÈ  r   rý  r#
  úclass:sudo-textrú  r$
  )r   r–   rÐ  r  )	r€  rL  Úbodyr
  r“  r
  r
  r
  rð
  s	        €€€€rK   Ú_get_sudo_displayz(HermesCLI.run.<locals>._get_sudo_display¢'  s!  ø€ ØÔ'ˆEØð Ø�	Ø1ˆEØJˆDØ(Ð(¨°°Ñ7Ô7ˆIØˆEØ�LŠLÐ9Ñ:Ô:Ð:Ø�LŠLÐ,¨eÐ4Ñ5Ô5Ð5Ø�LŠLÐ-¨s°e½cÀ!ÀYÕQTÐUZÑQ[ÔQ[ÑE[Ð^_ÑE_Ñ>`Ô>`Ñ6`Ñ/aÐdkÑ/kÐlÑmÔmÐmØ$Ð$ UÐ,?ÀÑKÔKÐKØÐ˜uÐ&9Ð;LÈdÐT]Ñ^Ô^Ð^Ø$Ð$ UÐ,?ÀÑKÔKÐKØ�LŠLÐ-¨u¸À	Ñ8IÑ/JÈWÑ/TÐUÑVÔVÐVØˆLrM   c                  ó   •— ‰ j         d uS r\   )r   rW  s   €rK   r€  zHermesCLI.run.<locals>.<lambda>¸'  s   ø€  WÔ%8ÀÐ%D€ rM   c                  ó(  •— ‰j         } | sg S d}|                      d¦  «        pd|                      dd¦  «        › �}|                      d¦  «        pi }|                     d¦  «        }d}||g}|r#|                     d	t          |¦  «        ¦  «          ‰||¦  «        }g }|                     d
¦  «         |                     d|f¦  «         |                     dddt          d|t          |¦  «        z
  dz
  ¦  «        z  z   dz   f¦  «          ‰	|d|¦  «          ‰
|dd||¦  «         |r ‰
|ddt          |¦  «        |¦  «          ‰	|d|¦  «          ‰
|dd||¦  «          ‰	|d|¦  «         |                     ddd|z  z   dz   f¦  «         |S )Nu   ðŸ”‘ Skill Setup Requiredr¼  zEnter value for r8
  Úsecretr:
  r
  z2Enter secret below (hidden), ESC or Ctrl+C to skipr  r¨  rª  r©  r‚  rÈ  r   rý  r#
  r«  rú  r$
  )r©  rT   ÚinsertrU   r–   rÐ  r  )r€  rL  r¼  r:
  Ú	help_textr¬  rý	  r
  r“  r
  r
  r
  rð
  s            €€€€rK   Ú_get_secret_displayz*HermesCLI.run.<locals>._get_secret_display»'  s  ø€ ØÔ)ˆEØð Ø�	à/ˆEØ—Y’Y˜xÑ(Ô(Ð`Ð,`¸u¿yºyÈÐU]Ñ?^Ô?^Ð,`Ð,`ˆFØ—y’y Ñ,Ô,Ð2°ˆHØ Ÿš VÑ,Ô,ˆIØGˆDØ# T˜NˆMØð 8Ø×$Ò$ Q­¨I©¬Ñ7Ô7Ð7Ø(Ð(¨°Ñ>Ô>ˆIØˆEØ�LŠLÐ9Ñ:Ô:Ð:Ø�LŠLÐ,¨eÐ4Ñ5Ô5Ð5Ø�LŠLÐ-¨s°e½cÀ!ÀYÕQTÐUZÑQ[ÔQ[ÑE[Ð^_ÑE_Ñ>`Ô>`Ñ6`Ñ/aÐdkÑ/kÐlÑmÔmÐmØ$Ð$ UÐ,?ÀÑKÔKÐKØÐ˜uÐ&9Ð;LÈfÐV_Ñ`Ô`Ð`Øð mØ"Ð" 5Ð*=Ð?PÕRUÐV_ÑR`ÔR`ÐbkÑlÔlÐlØ$Ð$ UÐ,?ÀÑKÔKÐKØÐ˜uÐ&9Ð;LÈdÐT]Ñ^Ô^Ð^Ø$Ð$ UÐ,?ÀÑKÔKÐKØ�LŠLÐ-¨u¸À	Ñ8IÑ/JÈWÑ/TÐUÑVÔVÐVØˆLrM   c                  ó   •— ‰ j         d uS r\   )r©  rW  s   €rK   r€  zHermesCLI.run.<locals>.<lambda>Ü'  s   ø€  WÔ%:À$Ð%F€ rM   c                  ó,   •— ‰                       ¦   «         S r\   )r7
  rW  s   €rK   Ú_get_approval_displayz,HermesCLI.run.<locals>._get_approval_displayá'  s   ø€ Ø×:Ò:Ñ<Ô<Ð<rM   c                  ó   •— ‰ j         d uS r\   )r£  rW  s   €rK   r€  zHermesCLI.run.<locals>.<lambda>é'  s   ø€  WÔ%<ÀDÐ%H€ rM   c                  ó>  •— ‰j         } | sg S |                      dd¦  «        }|dk    rúd}g }|                      d¦  «        }t          |t          ¦  «        r|ng D ]�}|                     dt	          |                     dg ¦  «        ¦  «        ¦  «        }|d         › d|› d	|d
k    rdnd› d�}|                     d¦  «        r|dz  }|                     |¦  «         Œ‚|                     d¦  «         d|                      dd¦  «        › d|                      dd¦  «        › �}n‡|                      d¦  «        pi }	|                      d¦  «        pg }
d|	                     d|	                     dd¦  «        ¦  «        › �}t          |
¦  «        ddgz   }|
rdt	          |
¦  «        › d�}nd} ‰||g|z   dd ¬!¦  «        }t          d"|d#z
  ¦  «        }|                      d$d%¦  «        }	 d%d&lm}  |¦   «         j	         
                    ¦   «         j        }n)# t          $ r t          j        d'¦  «        j        }Y nw xY wt                                ||                      d(d%¦  «        t	          |¦  «        |¦  «        \  }}|| d(<   g }|                     d)¦  «         |                     d*|f¦  «         |                     d+d,d-t          d%|t	          |¦  «        z
  d.z
  ¦  «        z  z   d/z   f¦  «          ‰|d+|¦  «          ‰|d+d0||¦  «          ‰|d+|¦  «         t%          |||z   ¦  «        D ]A}||         }||k    rd1nd2}||k    rd3nd4} ‰||z   |d4¬5¦  «        D ]} ‰|d+|||¦  «         ŒŒB ‰|d+|¦  «         |                     d+d6d-|z  z   d7z   f¦  «         |S )8Nr/  r¿   u$   âš™ Model Picker â€” Select Providerr*  Útotal_modelsrs  r    rŠ  z modelr  rê  r:   r:  r.  u     â†� currentÚCancelz	Current: rq  rŸ  z on r+  ru  rv  u   âš™ Model Picker â€” rv  ÚProvideru   â†� BackzSelect a model (z available)z7No models listed for this provider. Use Back or Cancel.rû	  éT   )rþ	  r  rª  rf  r0  r   r  r"
  Ú_scroll_offsetr—  rš  r˜  r‚  rÈ  rý  r#
  zclass:clarify-hintr²
  r›  r
  r8  r
  rú  r$
  )r¨  rT   rR   ra   r  r–   rÐ  r   r  r§  r!  Úrowsrv   rž   rÖ  r“  r5  rB  r  )r€  r/  rL  rã	  Ú
_providersr_   r`  ró  r)  ru  rv  r
  r)
  r0  r  r;  r:  rA  r“  r¹  r÷	  r�  r+  r
  r
  r
  r
  r
  rð
  s                           €€€€€rK   Ú_get_model_picker_displayz0HermesCLI.run.<locals>._get_model_picker_displayí'  su  ø€ ØÔ/ˆEØð Ø�	Ø—I’I˜g zÑ2Ô2ˆEØ˜
Ò"Ð"Ø>�Ø�Ø"ŸYšY {Ñ3Ô3�
Ý'1°*½dÑ'CÔ'CÐK˜˜Èð *ð *�AØŸEšE .µ#°a·e²e¸HÀbÑ6IÔ6IÑ2JÔ2JÑKÔK�EØ  œyÐUÐU¨EÐUÐUÀÈÂ
À
¸¸ÐPRÐUÐUÐU�EØ—u’u˜\Ñ*Ô*ð 1Ø Ñ0˜Ø—N’N 5Ñ)Ô)Ð)Ð)Ø—’˜xÑ(Ô(Ð(Øx 5§9¢9¨_¸iÑ#HÔ#HÐxÐxÈeÏiÊiÐXjÐluÑNvÔNvÐxÐx��à %§	¢	¨/Ñ :Ô :Ð @¸b�Ø"ŸYšY |Ñ4Ô4Ð:¸�
Ør°×0AÒ0AÀ&È-×J[ÒJ[Ð\bÐdnÑJoÔJoÑ0pÔ0pÐrÐr�Ý˜zÑ*Ô*¨j¸(Ð-CÑC�Øð UØJ­c°*©o¬oÐJÐJÐJ�D�DàT�Dà(Ð(¨°°¸Ñ0@ÈBÐZ\Ð]Ñ]Ô]ˆIÝ" 1 i°!¡mÑ4Ô4ÐØ—y’y ¨QÑ/Ô/ˆHðFØ>Ð>Ð>Ð>Ð>Ð>Ø#˜G™IœIÔ,×5Ò5Ñ7Ô7Ô<�	�	øÝð Fð Fð FÝ"Ô4°YÑ?Ô?ÔE�	�	�	ðFøøøå%.×%MÒ%MØ˜%Ÿ)š)Ð$4°aÑ8Ô8½#¸g¹,¼,È	ñ&ô &Ñ"ˆM˜7ð '4ˆEÐ"Ñ#àˆEØ�LŠLÐ<Ñ=Ô=Ð=Ø�LŠLÐ/°Ð7Ñ8Ô8Ð8Ø�LŠLÐ0°#¸ÅÀQÈ	ÕTWÐX]ÑT^ÔT^ÑH^ÐabÑHbÑAcÔAcÑ9cÑ2dÐgnÑ2nÐoÑpÔpÐpØ$Ð$ UÐ,BÀIÑNÔNÐNØÐ˜uÐ&<Ð>RÐTXÐZcÑdÔdÐdØ$Ð$ UÐ,BÀIÑNÔNÐNÝ˜]¨M¸GÑ,CÑDÔDð að a�Ø  œ�Ø47¸8²O°OÐ0Ð0ÐI_�Ø#&¨(¢? ?˜˜¸�Ø/Ð/°¸±ÐAQÐeiÐjÑjÔjð að a�GØ&Ð& uÐ.DÀeÈWÐV_Ñ`Ô`Ð`Ð`ðaà$Ð$ UÐ,BÀIÑNÔNÐNØ�LŠLÐ0°%¸5À9Ñ;LÑ2MÐPWÑ2WÐXÑYÔYÐYØˆLs   Ç',H È#H:È9H:c                  ó   •— ‰ j         d uS r\   )r¨  rW  s   €rK   r€  zHermesCLI.run.<locals>.<lambda>0(  s   ø€  WÔ%@ÈÐ%L€ rM   rÈ  c                  ó.   •— ‰                       d¦  «        S )Nr)  ©r,  rW  s   €rK   r€  zHermesCLI.run.<locals>.<lambda>8(  s   ø€ ˜7×9Ò9¸%Ñ@Ô@€ rM   zclass:input-rule)ÚcharrÊ
  r�  c                  ó.   •— ‰                       d¦  «        S )Nr*  rÃ  rW  s   €rK   r€  zHermesCLI.run.<locals>.<lambda>=(  s   ø€ ˜7×9Ò9¸(ÑCÔC€ rM   c                  ó\   •— ‰j         sg S t          ‰j         ‰j        ¦  «        } dd| › d�fgS )Nzclass:image-badger‚  )r±  rÚ  r²  )Úbadgesrð
  s    €rK   Ú_get_image_barz%HermesCLI.run.<locals>._get_image_barD(  sF   ø€ ØÔ+ð Ø�	Ý4ØÔ(ØÔ&ñô ˆFð )¨-¨f¨-¨-¨-Ð8Ð9Ð9rM   c                  ó,   •— t          ‰ j        ¦  «        S r\   )ræ  r±  rW  s   €rK   r€  zHermesCLI.run.<locals>.<lambda>O(  s   ø€ ¥T¨'Ô*BÑ%CÔ%C€ rM   c                  ó,   •— ‰                       ¦   «         S r\   )rE  rW  s   €rK   Ú_get_voice_statusz(HermesCLI.run.<locals>._get_voice_statusS(  s   ø€ Ø×6Ò6Ñ8Ô8Ð8rM   rÉ
  c                  ó   •— ‰ j         S r\   )r¶  rW  s   €rK   r€  zHermesCLI.run.<locals>.<lambda>[(  s
   ø€  WÔ%8€ rM   c                  ó,   •— ‰                       ¦   «         S r\   )r`  rW  s   €rK   r€  zHermesCLI.run.<locals>.<lambda>`(  s   ø€ °W×5VÒ5VÑ5XÔ5X€ rM   c                  ó   •— ‰ j         S r\   )r¾  rW  s   €rK   r€  zHermesCLI.run.<locals>.<lambda>l(  s
   ø€  WÔ%@€ rM   )rÃ
  rÕ  )Ú
max_heightr:  )rË
  rÌ
  rÍ
  rÎ
  rÅ
  rÆ
  rÏ
  rÐ
  rÑ
  rÒ
  rÃ
  rÓ
  rÔ
  rÕ
  z
input-arearL  z#555555 italicr¼  zprompt-workingz#888888 italicr)  z
status-barzbg:#1a1a2e #C0C0C0zstatus-bar-strongzbg:#1a1a2e #FFD700 boldzstatus-bar-dimzbg:#1a1a2e #8B8682zstatus-bar-goodzbg:#1a1a2e #8FBC8F boldzstatus-bar-warnzstatus-bar-badzbg:#1a1a2e #FF8C00 boldzstatus-bar-criticalzbg:#1a1a2e #FF6B6B boldz
input-ruler|  zimage-badgez#87CEEB boldzcompletion-menuzbg:#1a1a2e #FFF8DCzcompletion-menu.completionz"completion-menu.completion.currentzbg:#333355 #FFD700zcompletion-menu.meta.completionzbg:#1a1a2e #888888z'completion-menu.meta.completion.currentzbg:#333355 #FFBF00zclarify-borderzclarify-titlez#FFD700 boldzclarify-questionz#FFF8DC boldzclarify-choicez#AAAAAAzclarify-selectedzclarify-active-otherz#FFD700 italiczclarify-countdownzsudo-promptz#FF6B6B boldzsudo-borderz
sudo-titlez	sudo-textzapproval-borderzapproval-titlez#FF8C00 boldzapproval-desczapproval-cmdz#AAAAAA italicz#87CEEBz#FF4444 boldz#FFA500 italiczbg:#1a1a2e #87CEEBzbg:#1a1a2e #FF4444 bold)zapproval-choicezapproval-selectedzvoice-promptzvoice-recordingzvoice-processingzvoice-statuszvoice-status-recording)ÚlayoutÚkey_bindingsr�  Úfull_screenÚmouse_supportÚcursorc                  ó   •— ddl m}  ‰j        }	 |j        }|j                             ¦   «         }|r�|j        |j        k     rq|j        dk    rf|j        |j        z   dz
  |j        z  }|j        r|j        j        nd}||dz
  z  }|dk    r) | |j	        j
        |j	        j        |z   ¬¦  «        |_	        n# t          $ r Y nw xY w ‰¦   «          d S )Nr   )ÚPointr  )r&  Úy)Úprompt_toolkit.data_structuresrÖ  ÚrendererÚ
_last_sizer§  r!  r×  Ú_last_screenrÊ
  Ú_cursor_posr&  r×  rv   )	Ú_PtrÙ  Úold_sizeÚnew_sizeÚreflow_factorÚlast_hrÙ  Ú_original_on_resizer¶   s	          €€rK   Ú_resize_clear_ghostsz+HermesCLI.run.<locals>._resize_clear_ghostsÖ(  s*  ø€ ØCÐCÐCÐCÐCÐCØ”|ˆHðØ#Ô.�Ø#œ?×3Ò3Ñ5Ô5�àðà Ô(¨8Ô+;Ò;Ð;Ø Ô(¨1Ò,Ð,ð "Ô)¨HÔ,<Ñ<¸qÑ@Ø#Ô+ñ,ð "ð $Ô0ð˜Ô-Ô4Ð4àð ð
 # m°aÑ&7Ñ8�EØ˜q’y�yØ/2¨sØ&Ô2Ô4Ø&Ô2Ô4°uÑ<ð0ñ 0ô 0˜Ô,øøõ ð ð ð Ø�ðøøøàÐÑ!Ô!Ð!Ð!Ð!s   �B#B4 Â4
CÃ Cc                  óX  •— d} ‰j         sŸ‰j        st          j        d¦  «         Œ#‰j        r+‰                     d¬¦  «         t          j        d¦  «         nHt          j        ¦   «         }|| z
  dk    r|} ‰                     d¬¦  «         t          j        d¦  «         ‰j         ¯�d S d S )Nrb  ra
  r  rª  rd
  )r›  rŒ  rÿ  r†  r¯  rÖ  rÔ  )Úlast_idle_refreshr  r7  s     €rK   Úspinner_loopz#HermesCLI.run.<locals>.spinner_loopö(  sÈ   ø€ Ø #ÐØÔ'ð $Ø”yð Ý”J˜s‘O”O�OØØÔ(ð $Ø×$Ò$°#Ð$Ñ6Ô6Ð6Ý”J˜s‘O”O�O�Oåœ.Ñ*Ô*�CØÐ.Ñ.°#Ò5Ð5Ø,/Ð)Ø×(Ò(°cÐ(Ñ:Ô:Ð:Ý”J˜s‘O”O�Oð Ô'ð $ð $ð $ð $ð $rM   r>	  c            
      ót  •— ‰j         �s.	 	 ‰j                             d¬¦  «        } në# t          j        $ rÙ ‰j        sÎ‰                     ¦   «          	 ddlm} |j	         
                    ¦   «         s‰|j	                             ¦   «         }|                     dd¦  «        }|                     d¦  «        dk    r|                     |¦  «        rn+t          |¦  «        }|r‰j                             |¦  «         n# t          $ r Y nw xY wY �Œw xY w| s�Œg }t!          | t"          ¦  «        r| \  } }t!          | t$          ¦  «        rt'          | ¦  «        nd }|ry|d	         }|d
         }|d         r:|                     |¦  «         |p
d|j        › d�} t-          d|j        › �¦  «         n't-          d|j        › �¦  «         d|› d�|rd|› �ndz   } |sot!          | t$          ¦  «        rZt/          | ¦  «        rKt-          d| › �¦  «         ‰                     | ¦  «        s"d‰_         ‰j        r‰                     ¦   «          �ŒCt7          j        d¦  «        }	t!          | t$          ¦  «        r"t;          |	                     | ¦  «        ¦  «        ng }
|
r‰                     | ¦  «        } tA          ¦   «          ‰ !                    | ¦  «         |r<tE          |¦  «        }t-          dtF          › d|› d|dk    rdnd› dtH          › �¦  «         d‰_        ‰ %                    ¦   «          	 ‰ &                    | |pd ¬¦  «         d‰_        d‰_'        d‰_(        ‰j)         *                    ¦   «          d‰_+        ‰ %                    ¦   «          ‰j,        r<‰j-        r5‰j.        s.ˆˆfd„}t_          j0        |d¬¦  «         1                    ¦   «          	 ddlm} |j	         
                    ¦   «         s¢|j	                             ¦   «         }|                     dd¦  «        }|                     d¦  «        dk    r|                     |¦  «        rŒwt          |¦  «        }|r‰j                             |¦  «         |j	         
                    ¦   «         ¯¢�nu# t          $ r Y �nhw xY w# d‰_        d‰_'        d‰_(        ‰j)         *                    ¦   «          d‰_+        ‰ %                    ¦   «          ‰j,        r<‰j-        r5‰j.        s.ˆˆfd„}t_          j0        |d¬¦  «         1                    ¦   «          	 ddlm} |j	         
                    ¦   «         s£|j	                             ¦   «         }|                     dd¦  «        }|                     d¦  «        dk    r|                     |¦  «        rŒwt          |¦  «        }|r‰j                             |¦  «         |j	         
                    ¦   «         ¯¢w w # t          $ r Y w w xY wxY wn)# t          $ r}tA          d |› �¦  «         Y d }~nd }~ww xY w‰j         �¯,d S d S )!Nra
  r	  r   r÷  rŠ  r:   rQ   rž  rw   r‰  r·  rá  r£  u     ðŸ“Ž Auto-attached image: u     ðŸ“„ Detected file: z[User attached file: rZ   u	   
âš™ï¸�  Tr¹  r8  u   ðŸ“Ž rà
  r  rê  z	 attached©râ  Frb  c                  ó6  •— 	 ‰j         r/‰j                             d¬¦  «         t          j        d¦  «         ‰                     ¦   «          ‰                     ¦   «          d S # t          $ r+} t          t          › d| › t          › �¦  «         Y d } ~ d S d } ~ ww xY w)NrÂ   r	  g333333Ó?r›	  )r·  r½  Úwaitrÿ  r†  r—	  rÕ  rv   rj  r‹  rŒ  )rz   r¶   r7  s    €€rK   r�	  z?HermesCLI.run.<locals>.process_loop.<locals>._restart_recordingi)  sº   ø€ ð![Ø'+¤ð %8Ø(,Ô(<×(AÒ(AÈ"Ð(AÑ(MÔ(MÐ(MÝ(,¬
°3©¬¨Ø$(×$?Ò$?Ñ$AÔ$AÐ$AØ$'§N¢NÑ$4Ô$4Ð$4Ð$4Ð$4øÝ'0ð ![ð ![ð ![Ý$+­tÐ,YÐ,YÐPQÐ,YÕSWÐ,YÐ,YÑ$ZÔ$ZÐ$ZÐ$ZÐ$ZÐ$ZÐ$ZÐ$ZÐ$Zøøøøð![øøøs   ƒAA# Á#
BÁ- BÂBr>	  r{  )2r›  r™  rT   r?  rå	  r—  rJ	  rý  rø  Úcompletion_queueru
  rv
  Úis_completion_consumedr²  rD  rv   rR   r(  rU   rÆ  r–   r    rj  r  rU  ra  r  rC   r¾  ra   ÚfinditerrÀ  r¹  rÃ  r  r‹  rŒ  rÕ  r”
  r«  r¬  r­  r€  r®  r¶  r»  r¹  r¥  r’  r“  )r³  rø  rœ  Ú_evt_sidÚ_synthÚsubmit_imagesÚ
_file_dropÚ
_drop_pathr+  Ú_paste_ref_reÚ
paste_refsr  r�	  rz   r¶   r7  s                 €€rK   Úprocess_loopz#HermesCLI.run.<locals>.process_loop
)  sš  ø€ ØÔ'ñ z)ðy)ð!Ø%)Ô%8×%<Ò%<ÀSÐ%<Ñ%IÔ%I˜
˜
øÝ œ;ð !ð !ð !à#Ô2ð %Ø ×:Ò:Ñ<Ô<Ð<ð%Ø SÐ SÐ SÐ SÐ SÐ SØ'7Ô'H×'NÒ'NÑ'PÔ'Pð 	!LØ*:Ô*K×*VÒ*VÑ*XÔ*X Cà/2¯wªw°|ÀRÑ/HÔ/H HØ'*§w¢w¨v¡¤¸,Ò'FÐ'FÐK[×KrÒKrÐs{ÑK|ÔK|Ð'FØ(,å1MÈcÑ1RÔ1R¨Ø+1ð )LØ,0Ô,?×,CÒ,CÀFÑ,KÔ,KÐ,KøøÝ#,ð %ð %ð %Ø $ ð%øøøà ™ð)!øøøð, &ð !Ù ð %'�MÝ! *­eÑ4Ô4ð ?Ø4>Ñ1˜
 Mõ CMÈZÕY\ÑB]ÔB]Ð!gÕ!2°:Ñ!>Ô!>Ð!>Ðcg�JØ!ð Ø%/°Ô%7˜
Ø%/°Ô%<˜
Ø% jÔ1ð 	Ø)×0Ò0°Ñ<Ô<Ð<Ø)3Ð)bÐ7bÐPZÔP_Ð7bÐ7bÐ7b˜JÝ#Ð$TÀ:Ä?Ð$TÐ$TÑUÔUÐUÐUå#Ð$N¸Z¼_Ð$NÐ$NÑOÔOÐOà E¸
Ð EÐ EÐ EØ8BÐ#JÐ#4¨
Ð#4Ð#4Ð#4Èñ!Lð 'ð
 &ð !­*°ZÅÑ*EÔ*Eð !ÕJcÐdnÑJoÔJoð !ÝÐ 9¨ZÐ 9Ð 9Ñ:Ô:Ð:Ø#×3Ò3°JÑ?Ô?ð +Ø04˜DÔ-à"œ~ð +Ø #§¢¡
¤
 
Ù õ %'¤JÐ/^Ñ$_Ô$_�MÝMWÐXbÕdgÑMhÔMhÐ!p¥ m×&<Ò&<¸ZÑ&HÔ&HÑ!IÔ!IÐ!IÐnp�JØ!ð OØ%)×%BÒ%BÀ:Ñ%NÔ%N˜
Ý‘G”G�GØ×4Ò4°ZÑ@Ô@Ð@ð %ð `Ý Ñ.Ô.˜ÝÐ ^¥TÐ ^Ð ^°Ð ^Ð ^ÀÀAÂÀ¸¸È2Ð ^Ð ^ÕX\Ð ^Ð ^Ñ_Ô_Ð_ð +/�DÔ'Ø—N’NÑ$Ô$Ð$ð)!ØŸ	š	 *°]Ð5JÀd˜	ÑKÔKÐKà.3˜Ô+Ø-/˜Ô*Ø03˜Ô-ØÔ/×5Ò5Ñ7Ô7Ð7Ø57˜Ô2àŸšÑ(Ô(Ð(ð  Ô+ð 
]°Ô0Fð 
]ÈtÔOdð 
]ð[ð [ð [ð [ð [ð [õ &Ô,Ð4FÈtÐTÑTÔT×ZÒZÑ\Ô\Ð\ð!ØOÐOÐOÐOÐOÐOØ&6Ô&G×&MÒ&MÑ&OÔ&Oð DØ&6Ô&G×&RÒ&RÑ&TÔ&T à+.¯7ª7°<ÀÑ+DÔ+D Ø#&§7¢7¨6¡?¤?°lÒ#BÐ#BÐGW×GnÒGnÐowÑGxÔGxÐ#BØ$,Ý)EÀcÑ)JÔ)J Ø#)ð !DØ$(Ô$7×$;Ò$;¸FÑ$CÔ$CÐ$Cð '7Ô&G×&MÒ&MÑ&OÔ&Oð Dùøõ  )ð !ð !ð !Ø ™Dð!øøøøðK /4˜Ô+Ø-/˜Ô*Ø03˜Ô-ØÔ/×5Ò5Ñ7Ô7Ð7Ø57˜Ô2àŸšÑ(Ô(Ð(ð  Ô+ð 
]°Ô0Fð 
]ÈtÔOdð 
]ð[ð [ð [ð [ð [ð [õ &Ô,Ð4FÈtÐTÑTÔT×ZÒZÑ\Ô\Ð\ð!ØOÐOÐOÐOÐOÐOØ&6Ô&G×&MÒ&MÑ&OÔ&Oð DØ&6Ô&G×&RÒ&RÑ&TÔ&T à+.¯7ª7°<ÀÑ+DÔ+D Ø#&§7¢7¨6¡?¤?°lÒ#BÐ#BÐGW×GnÒGnÐowÑGxÔGxÐ#BØ$,Ý)EÀcÑ)JÔ)J Ø#)ð !DØ$(Ô$7×$;Ò$;¸FÑ$CÔ$CÐ$Cð '7Ô&G×&MÒ&MÑ&OÔ&Oð Dð Dð Døõ  )ð !ð !ð !Ø ˜Dð!øøøøøøøøõ !ð )ð )ð )Ý˜- A˜-˜-Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(øøøøð)øøøðs Ô'ñ z)ð z)ð z)ð z)ð z)sÉ   Œ( §X ¨*DÁB(C<Ã;DÃ<
D	ÄDÄD	Ä	DÄX ÄDÄX ÄD,X ÉC X Ì&R  Ì?BX ÏCR ÒX Ò
RÒX ÒRÒX Ò BXÔ.CW1×/X×1
W>×;X×=W>×>XØX Ø
X+ØX&Ø&X+c                 ó¦  •— t                                d| ¦  «         	 t          ‰dd¦  «        r…t          ‰dd¦  «        rt‰j                             d| › �¦  «         	 t          t          j        dd¦  «        ¦  «        }n# t          t          f$ r d	}Y nw xY w|d
k    rt          j        |¦  «         n# t          $ r Y nw xY wt          ¦   «         ‚)uÃ  Handle SIGHUP/SIGTERM by triggering graceful cleanup.

            Calls ``self.agent.interrupt()`` first so the agent daemon
            thread's poll loop sees the per-thread interrupt and kills the
            tool's subprocess group via ``_kill_process`` (os.killpg).
            Without this, the main thread dies from KeyboardInterrupt and
            the daemon thread is killed with it â€” before it can run one
            more poll iteration to clean up the subprocess, which was
            spawned with ``os.setsid`` and therefore survives as an orphan
            with PPID=1.

            Grace window (``HERMES_SIGTERM_GRACE``, default 1.5 s) gives
            the daemon time to: detect the interrupt (next 200 ms poll) â†’
            call _kill_process (SIGTERM + 1 s wait + SIGKILL if needed) â†’
            return from _wait_for_process.  ``time.sleep`` releases the
            GIL so the daemon actually runs during the window.
            z0Received signal %s, triggering graceful shutdownrþ   Nr—  Fúreceived signal ÚHERMES_SIGTERM_GRACEú1.5ç      ø?r   )rq   rÂ  r–  rþ   rì   r]  r’   r–  rm  r¦  rÿ  r†  rv   r&  )Úsignumr‚  Ú_gracer7  s      €rK   Ú_signal_handlerz&HermesCLI.run.<locals>._signal_handler�)  s÷   ø€ õ$ �LŠLÐKÈVÑTÔTÐTð
Ý˜4 ¨$Ñ/Ô/ð +µG¸DÐBRÐTYÑ4ZÔ4Zð +Ø”J×(Ò(Ð)D¸FÐ)DÐ)DÑEÔEÐEð%Ý!&¥r¤yÐ1GÈÑ'OÔ'OÑ!PÔ!P˜˜øÝ%¥zÐ2ð %ð %ð %Ø!$˜˜˜ð%øøøà ’z�zÝœ
 6Ñ*Ô*Ð*øøÝð ð ð Ø�ðøøøå#Ñ%Ô%Ð%s5   ž?B5 Á"B Â B5 ÂBÂB5 ÂBÂB5 Â5
CÃCÚSIGHUPc                 óf  — |                      d¦  «        }t          |t          ¦  «        rdt          |¦  «        v rd S t          |t          ¦  «        rdt          |¦  «        v rd S t          |t
          ¦  «        r!t          |dd ¦  «        t          j        k    rd S |  	                    |¦  «         d S )NÚ	exceptionzEvent loop is closedúis not registeredÚerrno)
rT   rR   r�	  rU   ÚKeyErrorrÆ  r–  r  ÚEIOÚdefault_exception_handler)ÚloopÚcontextrø  s      rK   Ú_suppress_closed_loop_errorsz3HermesCLI.run.<locals>._suppress_closed_loop_errors¾)  s¬   € Ø—+’+˜kÑ*Ô*ˆCÝ˜#�|Ñ,Ô,ð Ð1GÍ3ÈsÉ8Ì8Ð1SÐ1SØ�Ý˜#�xÑ(Ô(ð Ð-@ÅCÈÁHÄHÐ-LÐ-LØ�Ý˜#�wÑ'Ô'ð ­G°C¸À$Ñ,GÔ,GÍ5Ì9Ò,TÐ,TØ�à×*Ò*¨7Ñ3Ô3Ð3Ð3Ð3rM   zÄError: stdin (fd 0) is not available.
This can happen with certain Python installations (e.g. uv-managed cPython on macOS).
Try reinstalling Python via pyenv or Homebrew, then re-run: hermes setupr  r  zBad file descriptorz
Error: stdin is not usable (z¡).
This can happen with certain Python installations (e.g. uv-managed cPython on macOS).
Try reinstalling Python via pyenv or Homebrew, then re-run: hermes setupr—  r¸  )Úcleanup_temp_recordingsr‘  Ú	cli_closez!Could not close session in DB: %sr†  Úon_session_endrõ   r‹  rc  )rŠ  r[
  rh
  rõ   r‹  r%
  r&
  r]   )¥rž   rÖ  r“  r¹  rv   r†  rŽ  rŒ  r»  r<  r;  r  r=  r  rA  r  r³  r´  rb   rT  r—  r?  r˜  r™  rš  r›  rœ  r“  r  Ú_cli_refr>  r=	  rp   r  r  r@	  r2  rT   rA	  r?	  r�  rž  rŸ  r   r¡  r¢  r£  r¤  r¥  r¦  r§  r¯  r°  r©  rª  r±  r²  rµ  r¶  r·  r¸  r¹  rº  r»  r¼  r½  r´   r}  r‚  r~  rƒ  r  r„  Útools.tirith_securityrÚ
  rj  r‹  rŒ  r   r—   r   r  rU   rë  rŒ   r„  Úprompt_toolkit.keysrA  ÚBracketedPasteÚprompt_toolkit.auto_suggestrY  rv  rh  r   r   r   r•  rw  r  Útempfile_suffixÚwindowrÊ
  r  Úon_text_changedÚcontrolÚinput_processorsr–   r   r   r   r   r   ra   rô  r   rÄ
  r   r   r   rÖ
  r¸
  r½
  r¾
  r»
  r   Ú_STEADY_CURSORrŒ  Ú
_on_resizer’  r“  ÚatexitÚregisterr˜  r:  ÚSIGTERMr•  rþ  r’   ÚfstatrÆ  rž
  r   r4  Úget_event_loopÚset_exception_handlerrŸ  r'  r&  ÚBrokenPipeErrorr  rR   r–  r  r  rþ   rì   rÒ	  ro	  r	  r‘  rã  rŠ  rq   rÂ  r‡  )nr7  Ú_term_linesr;  Ú_welcome_skinÚ_welcome_textÚ_welcome_colorr  r[  r\  Úskills_labelr  rE	  Ú	_cfg_pathrÚ
  Útirith_pathÚsecurity_cfgrÜ
  rÂ
  rä
  ré
  rì
  Ú_editor_filterrñ
  rû
  r   r  r
  Ú_numÚ_idxr  r  r  r  r  r   Ú_normal_inputr&  r)  r-  r/  Ú_modal_prompt_activer2  r;  rë  rß	  Ú
_voice_keyr@  rA  rO  rR  rU  rX  rY  Ú
_completerrm  rt  r€  rƒ  r‡  r‰  r‹  r�  rÆ
  rÏ
  r¥  rÎ
  r­  rË
  r³  rÌ
  r¶  rÍ
  rÀ  rÅ
  rÑ
  rÓ
  rÈ  rÒ
  rË  rÔ
  rÐ
  rÕ
  rÐ  r�  rã  ræ  Úspinner_threadrõ  Úprocess_threadrý  Ú_signalr  Ú_aioÚ_loopÚ
_stdin_errr	  rz   r—  r
  r
  râ  r
  rM  rN  rr  rs  r
  r¶   rð
  rÃ
  sn   `                                                                                                 @@@@@@@@@@@@rK   rŸ  zHermesCLI.run#  sù  øøøøøøøøøøøøø€ ð	Ý Ô2Ñ4Ô4Ô:ˆKØ˜QŠˆÝ�d˜k¨A™oÑ.°B¸dÐCÑCÔCÐCøøÝð 	ð 	ð 	ØˆDð	øøøð 	×ÒÑÔÐð Œ=ð 	0Ø×,Ò,Ñ.Ô.ð 0Ø×-Ò-Ñ/Ô/Ð/ð	'Ø>Ð>Ð>Ð>Ð>Ð>Ø+˜OÑ-Ô-ˆMØ)×6Ò6°yð  CFñ  Gô  GˆMØ*×4Ò4°]ÀIÑNÔNˆNˆNøÝð 	'ð 	'ð 	'Ø_ˆMØ&ˆNˆNˆNð	'øøøð 	×ÒÐC ÐCÐC°ÐCÐCÐCÑDÔDÐDð		Ø6Ð6Ð6Ð6Ð6Ð6Ø!�>Ñ#Ô#ˆDð'Ø*×4Ò4°\À9ÑMÔM�
�
øÝð 'ð 'ð 'Ø&�
�
�
ð'øøøà×ÒÐ G¨
Ð GÐ G¸dÐ GÐ GÐ GÑHÔHÐHÐHøÝð 	ð 	ð 	ØˆDð	øøøàÔ ð 	3¨Ô)Hð 	3ØŸ9š9 TÔ%:Ñ;Ô;ˆLØ×ÒØL�™œÐLÐL¸lÐLÐLñô ð ð /3ˆDÔ+Ø×ÒÑÔÐð $ˆÔÝ#œk™mœmˆÔÝ %¤¡¤ˆÔØ!ˆÔØ!"ˆÔð 	:Ð9Ð9Ð9Ð9Ð9Ø(,ÐÐÑÔÔ%ð 	JÐIÐIÐIÐIÐIØ$Ð$Ñ&Ô&ˆ	ØAJ×AQÒAQÑASÔASÐ$\ I§N¢NÑ$4Ô$4Ô$=Ð$=ÐY\ˆÔØ)-¬¯ª¸Ñ)GÔ)GÐ)MÈ2ˆÔ Ø),ˆÔð
 #ˆÔØ!&ˆÔØ!"ˆÔð  ˆÔØˆÔØ%)ˆÔ"ð  $ˆÔØ"#ˆÔÝ'œnÑ.Ô.ˆÔð !&ˆÔØ!ˆÔð "ˆÔØ !ˆÔð -/ˆÔØˆÔõ %œ>Ñ+Ô+ˆÔØ ˆÔØˆŒØ#ˆÔØ %ˆÔØ!&ˆÔØ!&ˆÔÝ(œÑ0Ô0ˆÔØÔ× Ò Ñ"Ô"Ð"õ 	# 4Ô#?Ñ@Ô@Ð@Ý˜dÔ5Ñ6Ô6Ð6Ý# DÔ$AÑBÔBÐBð

	Ø>Ð>Ð>Ð>Ð>Ð>Ø*Ð*¸Ð>Ñ>Ô>ˆKØÐ"Ø#œ{Ÿš¨z¸2Ñ>Ô>ÐDÀ"�Ø!-×!1Ò!1Ð2BÀDÑ!IÔ!I�Ø!ð ZÝð Y¥ð Yð YÝRVðYð Yñ Zô Zð Zøøåð 	ð 	ð 	ØˆDð	øøøõ ‰]Œ]ˆà	�Š�‰ŒðG	Gð G	Gð G	Gð G	Gñ 
ŒðG	GðR 
�Š�˜'Ñ	"Ô	"ð	3ð 	3ñ 
#Ô	"ð	3ð 
�Š�‰Œð	3ð 	3ñ 
Œð	3õ #Ø|Ð|Ð|Ð|ñ
ô 
ˆð 
�Š�˜nˆÑ	-Ô	-Ø	�Š�˜# nˆÑ	5Ô	5ð	@ð 	@ð 	@ð 	@ñ 
6Ô	5ñ 
.Ô	-ð	@ð 
�Š�˜TˆÑ	"Ô	"ð	'ð 	'ñ 
#Ô	"ð	'ðD 
�Š��YÐ'gÐ'gÐ'gÐ'gÑhÔhˆÑ	iÔ	ið	'ð 	'ð 	'ð 	'ñ 
jÔ	ið	'ð 
�Š��yÐ)iÐ)iÐ)iÐ)iÑjÔjˆÑ	kÔ	kð	'ð 	'ð 	'ð 	'ñ 
lÔ	kð	'ð	ð 	ð 	ð 	ð 	õ" ˜"‘I”Ið 	Vð 	VˆDà š	˜	�1�1 t¨a¡xˆDØqˆB�FŠF•3�t‘9”9¥YÐ/oÐ/oÐ/oÐ/oÑ%pÔ%pˆFÑqÔqð  sOð  sOð  PTñ  sUô  sUñ  Vô  Vð  Vð  Vð 
�Š��YÐ'IÐ'IÐ'IÐ'IÑJÔJˆÑ	KÔ	Kð	'ð 	'ð 	'ð 	'ñ 
LÔ	Kð	'ð
 
�Š��yÐ)KÐ)KÐ)KÐ)KÑLÔLˆÑ	MÔ	Mð	'ð 	'ð 	'ð 	'ñ 
NÔ	Mð	'ð 
�Š��YÐ'MÐ'MÐ'MÐ'MÑNÔNˆÑ	OÔ	Oð	'ð 	'ð 	'ð 	'ñ 
PÔ	Oð	'ð
 
�Š��yÐ)OÐ)OÐ)OÐ)OÑPÔPˆÑ	QÔ	Qð		#ð 		#ð 		#ð 		#ñ 
RÔ	Qð		#ð 
�Š�¥Ð+QÐ+QÐ+QÐ+QÑ!RÔ!RÐZ^ˆÑ	_Ô	_ð	#ð 	#ð 	#ð 	#ñ 
`Ô	_ð	#ð	ð 	ð 	ð 	ð 	õ ˜"‘I”Ið 	yð 	yˆDà š	˜	�1�1 t¨a¡xˆDØSˆB�FŠF•3�t‘9”9¥YÐ/QÐ/QÐ/QÐ/QÑ%RÔ%RˆFÑSÔSÐTqÐTqÐrvÑTwÔTwÑxÔxÐxÐxõ "ð ^ð  ^ð  ^ð  ^ñ
ô 
ˆð 
�Š�˜]ˆÑ	+Ô	+ð	>ð 	>ñ 
,Ô	+ð	>ð 
�Š�˜}ˆÑ	-Ô	-ð	@ð 	@ñ 
.Ô	-ð	@ð 
�Š�‰ŒðX	%ð X	%ð X	%ð X	%ð X	%ñ 
ŒðX	%ðt 
�Š�‰Œð	!ð 	!ð 	!ð 	!ñ 
Œð	!õ   )Ø@Ð@Ð@Ð@ñ 
ô  
Ðð 
�Š�Ð!5¸TˆÑ	BÔ	Bð	ð 	ð 	ð 	ñ 
CÔ	Bð	ð 
�Š�‰Œð	&ð 	&ñ 
Œð	&ð&	Ø5Ð5Ð5Ð5Ð5Ð5Ø"�{‘}”}×(Ò(¨°"Ñ5Ô5×9Ò9¸,ÈÑQÔQˆHØ!ŸšÑ)Ô)×1Ò1°'¸4Ñ@Ô@×HÒHÈÐQUÑVÔVˆJˆJøÝð 	ð 	ð 	ØˆJˆJˆJð	øøøð 
�Š�
Ñ	Ô	ð9	'ð 9	'ð 9	'ð 9	'ñ 
Ô	ð9	'ðt 	-Ð,Ð,Ð,Ð,Ð,à	�Š�Ô#¨4ˆÑ	0Ô	0ð%	1ð %	1ð %	1ð %	1ð %	1ð %	1ñ 
1Ô	0ð%	1ðN 
�Š�‰Œð	'ð 	'ð 	'ð 	'ñ 
Œð	'ð 
�Š�˜#Ñ	Ô	ð	ð 	ð 	ð 	ñ 
Ô	ð	ð" ˆð	7ð 	7ð 	7ð 	7ð 	7ð 	GÐFÐFÐFÐFÐFõ +Ø$;Ð$;Ø"Ô5ð
ñ 
ô 
ˆ
õ Ý ¨°QÐ7Ñ7Ô7ØØ$ØØÝÐ FÐ FÐ FÐ FÑGÔGÝ¥ DÔ$6Ñ 7Ô 7Ñ8Ô8Ø Ø"&Ý0Ø 6Ð 6Ñ 8Ô 8Ø$ðñ ô ð
ñ 
ô 
ˆ
ð& -2ˆ
ÔÔ)ð	ð 	ð 	ð 	ð 	ð 	ð4 $1ˆ
ÔÔ ð ˜ˆØ˜ˆØ ˜cÐØ!& ÐØ$)ˆÔ!ð#	4ð #	4ð #	4ð #	4ð #	4ð #	4ð #	4ð #	4ð #	4ðJ 	ÔÐ)Ô)Ð-=Ñ=Ð)Ô)ð
 	ÔÔ+×2Ò2Ý Ý!Ñ#Ô#Ý ØTÐTÐTÐTñô ðñ ô ñ	
ô 	
ð 	
ð	>ð 	>ð 	>ð 	>ð 	>¥Iñ 	>ô 	>ð 	>ð	ð 	ð 	ð 	ð 	ð2 	ÔÔ+×2Ò2Ð3HÐ3HÐIYÑ3ZÔ3ZÑ[Ô[Ð[ð
)	ð )	ð )	ð )	ð )	ðV	2ð 	2ð 	2ð 	2ð 	2ð	2ð 	2ð 	2ð 	2ð 	2ð	4ð 	4ð 	4ð 	4ð 	4õ  Ý(Ð)9Ñ:Ô:Ø%Øð
ñ 
ô 
ˆõ Ý(¨Ñ7Ô7Ø"ð
ñ 
ô 
ˆð	ð 	¥Cð 	½½S¼	ð 	Ícð 	Õcfð 	Õpsð 	ð 	ð 	ð 	ñ	#ð 	#¥3ð 	#­sð 	#Åsð 	#ÕTXÕY\ÔT]ð 	#ð 	#ð 	#ð 	#ð	3µCð 	3Íð 	3ÕSVð 	3Õcfð 	3Ðkoð 	3ð 	3ð 	3ð 	3ð	N½#ð 	NÍ#ð 	NÐRVð 	Nð 	Nð 	Nð 	Nðd	ð d	ð d	ð d	ð d	ð d	ð d	ð d	ð d	õL .ÝÝ$Ð%9Ñ:Ô:Øðñ ô õ ÐGÐGÐGÐGÑHÔHð
ñ 
ô 
ˆð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	õ" +ÝÝ$Ð%6Ñ7Ô7Øðñ ô õ ÐDÐDÐDÐDÑEÔEð
ñ 
ô 
ˆð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	õ8 -ÝÝ$Ð%8Ñ9Ô9Øðñ ô õ ÐFÐFÐFÐFÑGÔGð
ñ 
ô 
ˆð	=ð 	=ð 	=ð 	=ð 	=õ /ÝÝ$Ð%:Ñ;Ô;Øðñ ô õ ÐHÐHÐHÐHÑIÔIð
ñ 
ô 
ˆð<	ð <	ð <	ð <	ð <	ð <	ð <	ð <	ð <	õ| 3ÝÝ$Ð%>Ñ?Ô?Øðñ ô õ ÐLÐLÐLÐLÑMÔMð
ñ 
ô 
Ðõ  ØØ@Ð@Ð@Ð@Ø$ð
ñ 
ô 
ˆõ
  ØØCÐCÐCÐCØ$ð
ñ 
ô 
ˆð ˆð	:ð 	:ð 	:ð 	:ð 	:õ Ý(¨Ñ8Ô8ÝÐCÐCÐCÐCÑDÔDð
ñ 
ô 
ˆ	ð	9ð 	9ð 	9ð 	9ð 	9õ 0ÝÝ$Ð%6Ñ7Ô7Øðñ ô õ Ð8Ð8Ð8Ð8Ñ9Ô9ð
ñ 
ô 
Ðõ *ÝÝ,Ð-XÐ-XÐ-XÐ-XÑYÔYØð !ðñ ô õ Ð@Ð@Ð@Ð@ÑAÔAð
ñ 
ô 
ˆ
ð$ 	×,Ò,¨R¸JÐ,ÑGÔGÐGõ
 +°bÈÐJÑJÔJÐåÝØ×/Ò/Ø +Ø"/Ø$3Ø#1Ø(;Ø#1Ø!Ø)Ø#1Ø'Ø)Ø#1Ø%5Ø%5ð 0ñ ô ñô ñ
ô 
ˆð,0 
Ø˜)ð0 
àÐ+ð0 
ð �ið0 
ð Ð.ð	0 
ð
 Ð$ð0 
ð Ð.ð0 
ð  Ð!:ð0 
ð Ð2ð0 
ð Ð8ð0 
ð Ð8ð0 
ð Ð7ð0 
ð "Ð#<ð0 
ð ˜)ð0 
ð  ˜>ð!0 
ð" Ð3ð#0 
ð$ )Ð*>ð%0 
ð& 1Ð2Fð'0 
ð 0 
ð( .Ð/Cð)0 
ð* 6Ð7Kð+0 
ð. ˜ið/0 
ð0 ˜^ð10 
ð2  ð30 
ð4 ˜ið50 
ð6  ð70 
ð8 #Ð$4ð90 
ð:   ð;0 
ð> ˜>ð?0 
ð@ ˜9ðA0 
ðB ˜.ðC0 
ðD ˜ðE0 
ðH ˜yðI0 
ðJ ˜nðK0 
ðL ˜^ðM0 
ðN Ð,ðO0 
ð 0 
ðP  )Ø!/à%Ø-Ø 0Ø0Ø&?ð_0 
ð 0 
ð 0 
ˆÔõb Ô! $×"<Ò"<Ñ">Ô">Ñ?Ô?ˆõ ñ 
ØØØØØð
ð 
õ .<Ð-G��.Ð)Ð)ÈRð
ð 
ˆð ˆŒ	ð "œnÐð	"ð 	"ð 	"ð 	"ð 	"ð 	"ð< .ˆŒð	$ð 	$ð 	$ð 	$ð 	$õ  #Ô)°ÀdÐKÑKÔKˆØ×ÒÑÔÐð{	)ð {	)ð {	)ð {	)ð {	)ð {	)õ| #Ô)°ÀdÐKÑKÔKˆØ×ÒÑÔÐö 	ŒžÑ%Ô%Ð%ð	&ð 	&ð 	&ð 	&ð 	&ð@	Ø$Ð$Ð$Ð$Ø�NŠN˜7œ?¨OÑ<Ô<Ð<Þ�w Ñ)Ô)ð @Ø—’˜wœ~¨Ñ?Ô?Ð?øøÝð 	ð 	ð 	ØˆDð	øøøð		4ð 		4ð 		4ð
	ÞŒH�Q‰KŒKˆKˆKøÞð 	ð 	ð 	Ýð[ñô ð ö
 ‰NŒNˆNØ×$Ò$Ñ&Ô&Ð&ØˆFˆFð	øøøðM	'Þ‘”ð ð ðØ*Ð*Ð*Ð*Ø ×/Ò/Ñ1Ô1�EØ×/Ò/Ð0LÑMÔMÐMÐMøÝ ð ð ð Ø�Dðøøøà—’‘	”	�	ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð øøö Ö+®_Ð=ð 	ð 	ð 	ØˆDÞž'Ð"ð 	ð 	ð 	ö ˜*¦gÑ.Ô.ð 	¶7¸:ÀwÐPTÑ3UÔ3UÖY^ÔYbÒ3bÐ3bØØ$­¨J©¬Ð7Ð7Ð;PÕTWÐXbÑTcÔTcÐ;cÐ;cÝð_°Zð _ð _ð _ñô ð ð ð øøøøøøøøøð	øøøð !%ˆDÔð
 Œzð žg dÐ,<¸eÑDÔDð ðØ”J×(Ò(Ñ*Ô*Ð*Ð*øÝ ð ð ð Ø�Dðøøøö �tÐ.Ñ/Ô/ð ,°DÔ4Hð ,ðØÔ(×1Ò1Ñ3Ô3Ð3Ð3øÝ ð ð ð Ø�Dðøøøà'+�Ô$ðØDÐDÐDÐDÐDÐDØ'Ð'Ñ)Ô)Ð)Ð)øÝð ð ð Ø�ðøøøõ ' tÑ,Ô,Ð,Ý! $Ñ'Ô'Ð'Ý'¨Ñ-Ô-Ð-æ�t˜]Ñ+Ô+ð I°Ô0@ð IÀTÄZð IðIØÔ$×0Ò0°´Ô1FÈÑTÔTÐTÐTøÝ!Ö#4Ð5ð Ið Ið IÞ—L’LÐ!DÀaÑHÔHÐHÐHÐHÐHÐHÐHøøøøðIøøøð Œzð žg dÐ,<¸eÑDÔDð ðØNÐNÐNÐNÐNÐNØ �LØ(Ø#'¤:Ô#8Ø"'Ø$(Þ% d¤j°'¸4Ñ@Ô@Þ!(¨¬°ZÀÑ!FÔ!FÐ!OÈ%ðñ ô ð ð øõ !ð ð ð Ø�Dðøøøæ‰NŒNˆNØ×$Ò$Ñ&Ô&Ð&Ð&Ð&øðg !%ˆDÔð
 Œzð žg dÐ,<¸eÑDÔDð ðØ”J×(Ò(Ñ*Ô*Ð*Ð*øÝ ð ð ð Ø�Dðøøøö �tÐ.Ñ/Ô/ð ,°DÔ4Hð ,ðØÔ(×1Ò1Ñ3Ô3Ð3Ð3øÝ ð ð ð Ø�Dðøøøà'+�Ô$ðØDÐDÐDÐDÐDÐDØ'Ð'Ñ)Ô)Ð)Ð)øÝð ð ð Ø�ðøøøõ ' tÑ,Ô,Ð,Ý! $Ñ'Ô'Ð'Ý'¨Ñ-Ô-Ð-æ�t˜]Ñ+Ô+ð I°Ô0@ð IÀTÄZð IðIØÔ$×0Ò0°´Ô1FÈÑTÔTÐTÐTøÝ!Ö#4Ð5ð Ið Ið IÞ—L’LÐ!DÀaÑHÔHÐHÐHÐHÐHÐHÐHøøøøðIøøøð Œzð žg dÐ,<¸eÑDÔDð ðØNÐNÐNÐNÐNÐNØ �LØ(Ø#'¤:Ô#8Ø"'Ø$(Þ% d¤j°'¸4Ñ@Ô@Þ!(¨¬°ZÀÑ!FÔ!FÐ!OÈ%ðñ ô ð ð øõ !ð ð ð Ø�Dðøøøæ‰NŒNˆNØ×$Ò$Ñ&Ô&Ð&Ð&øøøsÕ  �6A Á
AÁAÂ<C ÃC(Ã'C(ÄE ÄD0 Ä/E Ä0D?Ä<E Ä>D?Ä?E Å
E,Å+E,Ï	A(P2 Ð2
P?Ð>P?à9A4b. â.b=â<b=þA+ ÿ+
8ÿ78ÿ?A@ Á@=AAÁAAAÁAAC ÁA)AC	ÁA+-ABÁBAC	ÁB
AB&ÁB#AC	ÁB%AB&ÁB&AC	ÁB=AC ÁC	ACÁCAC ÁCACÁCAC ÁCAN ÁCAE=ÁC/AN ÁC1AE=ÁDA0AE8ÁE3AN ÁE8AE=ÁE=AN ÁF!AF; ÁF;
AGÁGAGÁG$AG> ÁG>
AHÁH
AHÁHAH' ÁH'
AH4ÁH3AH4ÁJ%AJ* ÁJ*AK"ÁJ<AKÁKAK"ÁK?AAM ÁM
AMÁMAMÁN!AVÁN$AN>ÁN=AVÁN>
AOÁOAVÁO
AOÁOAVÁO'APÁP AVÁP
APÁPAVÁPAPÁP
AVÁPAP*ÁP)AVÁP*
AP7ÁP4AVÁP6AP7ÁP7AAVÁR%AR-ÁR,AVÁR-AS%ÁR?AS ÁSAVÁS AS%ÁS%AVÁTAAUÁUAVÁU
AUÁUAVÁUAUÁU'AV)NNNNNNFFNFFF)rÑ  )rá  )F)rË  r\   rI  )r   )NN)rf  rf  rý  r&
  )r1	  )NNN)£rJ  rK  rL  rM  rU   r   rô  ræ  r8  r]  rÖ  r   rÛ  rã  Ústaticmethodró  r	   r
   r  r  Úclassmethodr  r(  r"  r&  r,  r.  r5  r0  rE  rT  r`  rx  r|  r€  r•  r{  r¶  rÀ  rÃ  r~  rÔ  rß  rÒ  rÜ  rÝ  r   r  r   r  r  r3  rS   r<  rw  r†  rŒ  r»  rÃ  rÓ  ra   rÍ  rõ  r  r  r  r  r&  r-  r?  r‚  r�  rb  re  rh  r|  r‡  r¢  r¨  r®  rº  r¿  rÉ  rÔ  r×  rŸ  ró  r  r  r  rÏ  r!  r)  r6  r9  rB  rq  r„  r�  r•  r˜  rš  r  rŸ  rµ  r½  ré  rí  r  rU  rP  rŸ  rN  rQ  rE  rF  rG  rS  rH  r  rI  rL  rJ  rK  rJ	  rM  rn  rk  rl  rm  r—	  r…	  r´	  rR  r“	  r¶	  r·	  r¸	  r¹	  rj  r‚  rƒ  rî	  rù	  r7
  r„  r3  r8  r>
  r@
  rB
  r”
  rž
  r¨
  r­
  r³
  r¶
  r»
  rÂ  rÀ
  rÄ
  rÖ
  rŸ  r]   rM   rK   r5  r5    së  € € € € € ðð ð Ø"ØØØØØØØØ!Ø %Ø"ðq*ð q*àðq*ð �s”)ðq*ð ð	q*ð
 ðq*ð ðq*ð ðq*ð ðq*ð ðq*ð ðq*ð ðq*ð ðq*ð ðq*ð q*ð q*ð q*ðf	#ð #¨ð #¸ð #ð #ð #ð #ð	'°h¸s´mð 	'Èð 	'ð 	'ð 	'ð 	'ðJð J¨x¸¬}ð JÀSð JÐRUð Jð Jð Jð Jð
 ð#%ð #%°(¸5´/ð #%ÐTYð #%Ðaeð #%Ðruð #%ð #%ð #%ñ „\ð#%ðJ;¨$¨s°C¨x¬.ð ;ð ;ð ;ð ;ðz ð#¨ð #°ð #ð #ð #ñ „\ð#ð ð0¨ð 0¸ð 0Àð 0ð 0ð 0ñ „[ð0ð6 ð=ð =¨¨s°C¨x¬ð =Èð =ð =ð =ñ „\ð=ðð ¨X°c¬]ð Àdð ð ð ð ðEð E¨sð E¸8ÀC¼=ð EÐTWð Eð Eð Eð EðEð E¨(°3¬-ð EÀ3ð Eð Eð Eð Eðð ¨H°S¬Mð ÀSð ð ð ð ð cð ð ð ð ð `ð `°¸#´ð `ð `ð `ð `ð$ Uð  U¨H°S¬Mð  UÀSð  Uð  Uð  Uð  UðDEPð EPð EPðNe¸sð eÀtð eð eð eð eðN ð ¨ð ð ð ð ðð ð ð!7°cð !7¸dð !7ð !7ð !7ð !7ðF 9>ð /5ð /5ð /5°ð /5À$ð /5ð /5ð /5ð /5ðb(Àð (Èð (ð (ð (ð (ð@
3¨S°4©Zð 
3¸Cð 
3ð 
3ð 
3ð 
3ðZ°cð Z¸dð Zð Zð Zð Zð"%¨Cð "%°Dð "%ð "%ð "%ð "%ðH1ð 1ð 1ð 1ð$Jð Jð Jð JðX3Z cð 3Z¨dð 3Zð 3Zð 3Zð 3Zðj?ð ?ð ?ð ?ð0$ð $ð $ð $ð'¨Cð '°Cð 'ð 'ð 'ð 'ð&2¨ð 2ð 2ð 2ð 2ð
 ð/ Cð /ð /ð /ñ „^ð/ðð °Dð ð ð ð ðBL¨Tð Lð Lð Lð Lð\*°sð *¸tð *ð *ð *ð *ðX 48ÐRVÐy}ð ]ð ]ð ]¨Sð ]È4ð ]ÐkoÐrvÑkvð ]ð  CGð ]ð ]ð ]ð ]ð~Qð Qð QðfK¨$ð Kð Kð Kð KðZ\#ð \#ð \#ð|¨Tð ð ð ð ð&\.°ð \.ð \.ð \.ð \.ð|¨3ð ¸Tð ÀcÈDÁjð ð ð ð ðUU°ð UUð UUð UUð UUðn6ð 6ð 6ð&Fð Fð Fð(Hð Hð Hð2¨3ð °4ð ð ð ð ð"$5°ð $5¸ð $5ð $5ð $5ð $5ðLd°#ð dð dð dð dð0 [_ð @=ð @=ð @=°3ð @=Àð @=ÐSWð @=Ðcfð @=ð @=ð @=ð @=ðDð ð ð,&
ð &
ð &
ðP3Mð 3Mð 3Mðj/¨ð /ð /ð /ð /ð°ð ¸ð ð ð ð ð
%Gð %Gð %GðN(ð (ð (ðTMQ¨ð MQð MQð MQð MQð^ð ð ð>ð ð ð0ð 0ð 0ðdGð G¨3ð G¸¸TÀ#ÀsÀ(¼^Ô8Lð Gð Gð Gð Gð 6?ÈRð ð ð ¨sð Àsð ÐTXð ð ð ð ð:Að Að AðF°3ð ¸4ð ð ð ð ð 81ð 81ð 81ð 81ðt]g°3ð ]g¸4ð ]gð ]gð ]gð ]gð~s9°3ð s9¸4ð s9ð s9ð s9ð s9ðj0ð 0ð 0ð(ð ð ð:Að Að Að@ð ¨ð °D¸´Ið Ècð ÐZ]Ð`dÑZdð ð ð ð ð<¨cð °c¸D±jð ð ð ð ð0+ð +¨Dð +Àð +ÐX[ð +ð  EIð +ð +ð +ð +ð+ð +ð +ð +ð
 ð  ØØð&ð &Øð&àð&ð ð&ð ð	&ð
 ð&ð ð&ð ð&ð 
ˆs�CˆxŒð&ð &ð &ñ „\ð&ð6NFÀð NFÈ$ð NFð NFð NFð NFð`='ð ='¸Tð ='Èdð ='ð ='ð ='ð ='ð~bF°ð bFð bFð bFð bFðH
ð 
¸ð 
Èð 
ÐZ^ð 
ð 
ð 
ð 
ðð ¸ð Èð ÐZ^ð ð ð ð ð0ð ð ð6ð 6ð 6ð ð	¨cð 	ð 	ð 	ñ „\ð	ð,°3ð ,¸4ð ,ð ,ð ,ð ,ð\+¨sð +ð +ð +ð +ðZsJ¨ð sJð sJð sJð sJðj0¨#ð 0ð 0ð 0ð 0ð
6ð 6ð 6ðpJ sð J¨tð Jð Jð Jð JðXU¨cð Uð Uð Uð Uðn ð# sð #°Cð #¸Dð #ð #ð #ñ „\ð#ðJ{¨3ð {ð {ð {ð {ðz'4¨ð '4ð '4ð '4ð '4ðR9ð 9ð 9ð8ð ð ð&;\¨Sð ;\ð ;\ð ;\ð ;\ðz[¨ð [ð [ð [ð [ð<)Z¨ð )Zð )Zð )Zð )ZðV3¨Cð 3ð 3ð 3ð 3ðI8ð I8¨Sð I8ð I8ð I8ð I8ðVð ð ðjHð jHð jHðX7ð 7 cð 7ð 7ð 7ð 7ðB6bð 6bð 6bð 6bðpS3ð S3ð S3ðr;¨Cð ;°Dð ;ð ;ð ;ð ;ð(`ð `¨Cð `Àð `ÐUXð `Ðptð `ð `ð `ð `ðD	^¨3ð 	^¸sð 	^ÐSWð 	^ð 	^ð 	^ð 	^ðZ¨cð ZÀ#ð ZÐVZð ZÐmpð Zð Zð Zð Zð(`Eð `Eð `EðDbQð bQð bQðH2'¨#ð 2'ð 2'ð 2'ð 2'ðh9¨Sð 9ð 9ð 9ð 9ð.	 dð 	ð 	ð 	ð 	ð:Dð :Dð :Dðx7ð 7ð 7ð@7ð 7ð 7ð"#ð #ð #ð$A
ð A
ð A
ðF,¨ð ,ð ,ð ,ð ,ð^ 7;ð5ð 5ð 5¨#ð 5¸Cð 5Ø/3ð5Ø?Bð5ð 5ð 5ð 5ðn JNð ð ð ¨ð À$ð ÐRVÐWZÔR[ð ð ð ð ðð ð ð ð4bð bð bðHCð C°ð C¸cð CÐUYð Cð Cð Cð Cð.ð .ð .ð .ðð ð ð ð¨Sð °Tð ð ð ð ð)ð )ð )ð )ðð ð ð ðF+ð F+ Dð F+°H¸S´Mð F+ð F+ð F+ð F+ðP)ð )ð )ðV%¨¨s°C¨x¬ð %ð %ð %ð %ðN
" #ð 
"ð 
"ð 
"ð 
"ð$*ð $*ð $*ðLM cð Mð Mð Mð Mð t¨C°¨H¤~ð ð ð ð ð tð ð ð ð ð¨ð ð ð ð ðð ð ð ð, !Øð+
ð +
ð +
ð" 
ð#+
ð +
ð +
ð +
ðZS'ð S'ð S'ð S'ð S'rM   r5  r	  r  r6  rõ   r¿   rö   r¾   rä   rå   Úquietrí   Ú
list_toolsÚlist_toolsetsÚgatewayr7  r±  r  r8  r9  rF  r:  c                 óV  ‡-— dt           j        d<   |r8ddl}ddlm} t          d¦  «         |                      |¦   «         ¦  «         dS |s‰|s‡|p|pt                               dd¦  «        }d}|rct          ¦   «         }|rt          |¦  «         t          ¦   «         }|r2|a|d	         t           j        d
<   t          j        t          |¦  «         ndS nd}| p|} d}|rÃt!          |t"          ¦  «        r d„ |                     d¦  «        D ¦   «         }n²t!          |t&          t(          f¦  «        rqg }|D ]l}t!          |t"          ¦  «        r3|                     d„ |                     d¦  «        D ¦   «         ¦  «         ŒJ|                     t#          |¦  «        ¦  «         Œmn$ddlm} t3           |t          d¦  «        ¦  «        }t5          |¦  «        }t7          ||||||	|
|||||¬¦  «        Š-|r‰t9          |‰-j        ¬¦  «        \  } }!}"|"r'd                     |"¦  «        }#t?          d|#› �¦  «        ‚| rDd                     d„ ‰-j         | fD ¦   «         ¦  «         !                    ¦   «         ‰-_         |!‰-_"        |r/d|d	         › d|d         › d|d         › d�}$‰-j         pd|$z   ‰-_         |r<‰- #                    ¦   «          ‰- $                    ¦   «          tK          j&        d¦  «         |r<‰- #                    ¦   «          ‰- '                    ¦   «          tK          j&        d¦  «         t          j        tP          ¦  «         ˆ-fd„}%	 ddl)}&|& )                    |&j*        |%¦  «         tW          |&d¦  «        r|& )                    |&j,        |%¦  «         n# tZ          $ r Y nw xY w| s|�rmt]          | |¦  «        \  } }'|�ríd‰-_/        ‰- 0                    ¦   «         �r¼| }(|'r‰- 1                    | |'d¬ ¦  «        }(‰- 2                    |(¦  «        })|)d!         ‰-j3        k    rd‰-_4        ‰- 5                    |)d"         |)d#         |)                     d$¦  «        ¬%¦  «        �r;d&‰-j4        _6        d&‰-j4        _7        d‰-j4        _8        d‰-j4        _9        ‰-j4         :                    |(‰-j;        ¬'¦  «        }*ty          ‰-j4        d(d¦  «        r&‰-j4        j        ‰-j        k    r‰-j4        j        ‰-_        t!          |*tz          ¦  «        r|*                     d)d¦  «        nt#          |*¦  «        }+|+rt          |+¦  «         t          d*‰-j        › �tJ          j>        ¬+¦  «         tK          j&        t!          |*tz          ¦  «        r|*                     d,¦  «        rd-nd¦  «         tK          j&        d-¦  «         nh‰- #                    ¦   «          | p|'rd.nd},|,r‰-j?                             d/|,› �¦  «         ‰- @                    | |'pd¬0¦  «         ‰- A                    ¦   «          dS ‰-                     ¦   «          dS )1a  
    Hermes Agent CLI - Interactive AI Assistant
    
    Args:
        query: Single query to execute (then exit). Alias: -q
        q: Shorthand for --query
        image: Optional local image path to attach to a single query
        toolsets: Comma-separated list of toolsets to enable (e.g., "web,terminal")
        skills: Comma-separated or repeated list of skills to preload for the session
        model: Model to use (default: anthropic/claude-opus-4-20250514)
        provider: Inference provider ("auto", "openrouter", "nous", "openai-codex", "zai", "kimi-coding", "minimax", "minimax-cn")
        api_key: API key for authentication
        base_url: Base URL for the API
        max_turns: Maximum tool-calling iterations (default: 60)
        verbose: Enable verbose logging
        compact: Use compact display mode
        list_tools: List available tools and exit
        list_toolsets: List available toolsets and exit
        resume: Resume a previous session by its ID (e.g., 20260225_143052_a1b2c3)
        worktree: Run in an isolated git worktree (for parallel agents). Alias: -w
        w: Shorthand for --worktree
    
    Examples:
        python cli.py                            # Start interactive mode
        python cli.py --toolsets web,terminal    # Use specific toolsets
        python cli.py --skills hermes-agent-dev,github-auth
        python cli.py -q "What is Python?"       # Single query mode
        python cli.py -q "Describe this" --image ~/storage/shared/Pictures/cat.png
        python cli.py --list-tools               # List tools and exit
        python cli.py --resume 20260225_143052_a1b2c3  # Resume session
        python cli.py -w                         # Start in isolated git worktree
        python cli.py -w -q "Fix issue #123"     # Single query in worktree
    r   ÚHERMES_INTERACTIVEr   N)Ústart_gatewayz0Starting Hermes Gateway (messaging platforms)...r±  Frw   r  c                 ó6   — g | ]}|                      ¦   «         ‘ŒS r]   r  rÛ  s     rK   rY   zmain.<locals>.<listcomp>•*  s    € ÐDÐDÐD¨1˜QŸWšW™YœYÐDÐDÐDrM   r'  c                 ó6   — g | ]}|                      ¦   «         ‘ŒS r]   r  r%  s     rK   rY   zmain.<locals>.<listcomp>›*  s    € Ð)JÐ)JÐ)J¸¨!¯'ª'©)¬)Ð)JÐ)JÐ)JrM   r™  rc  )rõ   r6  r¿   rö   r¾   rä   rå   rí   r7  r8  r9  r:  r4  rT  zUnknown skill(s): r]  c              3   ó   K  — | ]}|¯|V — Œ	d S r\   r]   rV   s     rK   r`   zmain.<locals>.<genexpr>¾*  s;   è è € ð ,ð ,ØÀtð,Øð,ð ,ð ,ð ,ð ,ð ,rM   z?

[System note: You are working in an isolated git worktree at z. Your branch is `r¸  z§`. Changes here do not affect the main working tree or other agents. Remember to commit and push your changes, and create a PR if appropriate. The original repo is at r¨  z.]r:   c                 ó~  •— t                                d| ¦  «         	 t          ‰dd ¦  «        }|�o|                     d| › �¦  «         	 t	          t          j        dd¦  «        ¦  «        }n# t          t          f$ r d}Y nw xY w|dk    rt          j
        |¦  «         n# t          $ r Y nw xY wt          ¦   «         ‚)Nz'Received signal %s in single-query moderþ   r÷  rø  rù  rú  r   )rq   rÂ  r–  rì   r]  r’   r–  rm  r¦  rÿ  r†  rv   r&  )rû  r‚  Ú_agentrü  rc  s       €rK   Ú_signal_handler_qzmain.<locals>._signal_handler_që*  sá   ø€ Ý�ŠÐ>ÀÑGÔGÐGð	Ý˜S '¨4Ñ0Ô0ˆFØÐ!Ø× Ò Ð!<°FÐ!<Ð!<Ñ=Ô=Ð=ð!Ý"¥2¤9Ð-CÀUÑ#KÔ#KÑLÔL�F�FøÝ!¥:Ð.ð !ð !ð !Ø �F�F�Fð!øøøà˜A’:�:Ý”J˜vÑ&Ô&Ð&øøÝð 	ð 	ð 	ØˆDð	øøøåÑ!Ô!Ð!s5   ž+B! Á
"A- Á,B! Á-BÂ B! ÂBÂB! Â!
B.Â-B.rþ  r„   r.  r8  rõ   r"  r9  r=  T)r4  r�  rŠ  rz  z
session_id: )rŽ  r\
  r  z[image attached]z[bold blue]Query:[/] rè  )Br’   rµ   r4  Úgateway.runr<  r¹  rŸ  ri  rT   r¢  r
  rÝ  r™  r  r  rè  rR   rU   r  ra   r(  r®  r–   rž  rš  rv  r*  r5  r  rŠ  rb   r¦  ræ   rG   r³  r†  r‡  r  r  r¨  r˜  r:  r  r•  rþ  rv   rç  rj  r3  r?  r<  r‹  rþ   rw  rR  Úsuppress_status_outputrb  rc  r…  r�  r–  rS   rÃ  rh  r”
  rž
  ).rÞ  r	  r  r6  r"  rõ   r¿   rö   r¾   rä   rå   r6  rí   r7  r8  r9  r7  r±  r  r8  r9  rF  r:  r4  r<  Úuse_worktreeÚwt_infoÚ_repoÚtoolsets_listrR  rš  Úparsed_skillsÚskills_promptÚloaded_skillsÚmissing_skillsÚmissing_displayÚwt_noterB  r0  Úsingle_query_imagesÚeffective_queryr�  r€   rŠ  Ú_query_labelrc  s.                                                @rK   r  r  -*  sI  ø€ ð| (+…B„JÐ#Ñ$ð ð ØˆˆˆØ-Ð-Ð-Ð-Ð-Ð-ÝÐ@ÑAÔAÐAØ�Š�M�M‘O”OÑ$Ô$Ð$Øˆð ð ˜mð ð  ÐI 1ÐI­
¯ª°zÀ5Ñ(IÔ(IˆØˆØð 	å"Ñ$Ô$ˆEØð .Ý& uÑ-Ô-Ð-Ý%Ñ'Ô'ˆGØð Ø#*Ð Ø-4°V¬_•”
˜>Ñ*Ý”Õ 1°7Ñ;Ô;Ð;Ð;ð �ð	ð ˆð ˆJ�Q€Eð €MØð GÝ�h¥Ñ$Ô$ð 		1ØDÐD°·²¸sÑ0CÔ0CÐDÑDÔDˆMˆMÝ˜¥4­ -Ñ0Ô0ð 	1àˆMØð 1ð 1�Ý˜a¥Ñ%Ô%ð 1Ø!×(Ò(Ð)JÐ)J¸Q¿WºWÀS¹\¼\Ð)JÑ)JÔ)JÑKÔKÐKÐKà!×(Ò(­¨Q©¬Ñ0Ô0Ð0Ð0øð 	@Ð?Ð?Ð?Ð?Ð?ÝÐ2Ð2µ:¸uÑEÔEÑFÔFˆå*¨6Ñ2Ô2€Mõ ØØØØØØØØØØØ'Ø!ðñ ô €Cð ð 1Ý7TØØ”Nð8
ñ 8
ô 8
Ñ4ˆ�} nð ð 	EØ"Ÿiši¨Ñ7Ô7ˆOÝÐC°/ÐCÐCÑDÔDÐDØð 	1Ø &§¢ð ,ð ,Ø"%Ô"3°]Ð!Cð,ñ ,ô ,ñ !ô !çŠe‰gŒgð Ôð $1ˆCÔ ð ð @ð@Ø�vŒð@ð @Ø29¸(Ô2Cð@ð @ð (/¨{Ô';ð	@ð @ð @ð 	ð !Ô.Ð4°"¸Ñ?ˆÔð ð Ø�ŠÑÔÐØ�ŠÑÔÐÝŒ�‰Œˆàð Ø�ŠÑÔÐØ×ÒÑÔÐÝŒ�‰Œˆõ „O•LÑ!Ô!Ð!ð""ð "ð "ð "ð "ðØ Ð Ð Ð Ø�Š�w”Ð(9Ñ:Ô:Ð:Ý�7˜HÑ%Ô%ð 	>Ø�NŠN˜7œ>Ð+<Ñ=Ô=Ð=øøÝð ð ð Øˆðøøøð ð <�ñ <Ý%:¸5À%Ñ%HÔ%HÑ"ˆÐ"Øñ 9	&ð &+ˆCÔ"Ø×.Ò.Ñ0Ô0ñ +\Ø"'�Ø&ð Ø&)×&HÒ&HØØ+Ø!&ð 'Iñ 'ô '�Oð
 !×;Ò;¸OÑLÔL�
Ø˜kÔ*¨cÔ.OÒOÐOØ $�C”IØ—?’?Ø#-¨gÔ#6Ø%/°	Ô%:Ø&0§n¢nÐ5HÑ&IÔ&Ið #ñ ô ñ  \ð
 ,0�C”IÔ(Ø7;�C”IÔ4ð 7;�C”IÔ3Ø26�C”IÔ/Ø œY×7Ò7Ø%4Ø-0Ô-Eð 8ñ ô �Fõ   ¤	¨<¸Ñ>Ô>ð>àœIÔ0°C´NÒBÐBà),¬Ô)=˜œÝCMÈfÕVZÑC[ÔC[Ðl˜vŸzšzÐ*:¸BÑ?Ô?Ð?ÕadÐekÑalÔal�HØð (Ý˜h™œ˜åÐ;¨3¬>Ð;Ð;Å#Ä*ÐMÑMÔMÐMõ ”H¥*¨VµTÑ":Ô":ÐZ¸v¿zºzÈ(Ñ?SÔ?SÐZ˜Q˜QÐYZÑ[Ô[Ð[õ ŒH�Q‰KŒKˆKˆKà�OŠOÑÔÐØ ÐWÐ;NÐ%VÐ%7Ð%7ÐTVˆLØð JØ”×!Ò!Ð"H¸,Ð"HÐ"HÑIÔIÐIØ�HŠH�UÐ#6Ð#>¸$ˆHÑ?Ô?Ð?Ø×#Ò#Ñ%Ô%Ð%Øˆð ‡G‚G�I„I€I€I€Is   ÍA
N Î
N ÎN Ú__main__r\   rI  )rð  )ra  )rv  )NNNNNNNNNNFFFFFFNFFFFFF)ârM  r!	  r’   rž   r  rt   rC   Úconcurrent.futuresr	  r  r  r  r®	  rÿ  rº  r‰  Úurllib.parser   r   r�  r   Úpathlibr   r   Útypingr   r	   r
   r   r"	  rJ  rq   rµ   r;  Úprompt_toolkit.historyr   Úprompt_toolkit.stylesr   r½
  Úprompt_toolkit.patch_stdoutr   r   r   Úprompt_toolkit.layoutr   r   r   r   r   Ú prompt_toolkit.layout.processorsr   r   r   r   Úprompt_toolkit.filtersr   Úprompt_toolkit.layout.dimensionr   Úprompt_toolkit.layout.menusr   Úprompt_toolkit.widgetsr   Úprompt_toolkit.key_bindingr   Úprompt_toolkitr    rh  Úprompt_toolkit.formatted_textr!   ri  Úprompt_toolkit.cursor_shapesr"   ÚBLOCKr  r¯  ÚAttributeErrorr¥  r?  Úagent.usage_pricingr#   r$   r%   r&   Úagent.account_usager'   r(   Úhermes_cli.bannerr)   r*   r  r   r+   r,   Úhermes_cli.env_loaderr-   r.  r.   ro   r9  r:  Ú_project_envrB   rU   rL   rd   rf   r{   rS   r�   rŽ   ra   r¸   ra  ri  Úhermes_loggingrb  rv   r>  rf  r<  rg  r^	  rh  rT   Ú_tplrô  r’  rj  Úrichrk  r‡  Úrich.consolerl  Úrich.markuprm  r«  r¢  ro  r£  rq  rV  Úfirer	  rr  rE  rs  rt  ru  rs  rv  rw  r6  rx  ry  rz  r  r{  Útools.terminal_toolr|  r�  r}  r~  Útools.skills_toolr  Úhermes_cli.callbacksr�  r©  r‚  r�  rŽ  r”  r˜  r™  Ú__annotations__r¢  ræ  r§  rÝ  rè  rù  r
  r   r)  rt  rŒ  rò  r,  r.  rñ  r‹  rT  rY  r`  rf  rj  Ú	frozensetr»  ru  r  r{  r(  rŠ  r›  r²  rÆ  rÚ  rÝ  rç  ré  ÚHERMES_AGENT_LOGOÚHERMES_CADUCEUSr  r  Úagent.skill_commandsr  r  r  ru  r´   r!  r*  r¥
  r3  r5  r  ÚFirer]   rM   rK   ú<module>rz     sh  ððð ð ð €€€Ø 	€	€	€	Ø €€€Ø 
€
€
€
Ø €€€Ø 	€	€	€	Ø Ð Ð Ð Ø €€€Ø €€€Ø €€€Ø €€€Ø €€€Ø €€€Ø €€€Ø *Ð *Ð *Ð *Ð *Ð *Ð *Ð *Ø %Ð %Ð %Ð %Ð %Ð %Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,à	ˆÔ	˜8Ñ	$Ô	$€ð !€„
ˆ>Ñ à €€€ð /Ð .Ð .Ð .Ð .Ð .Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø dÐ dÐ dÐ dÐ dÐ dÐ dÐ dÐ dÐ dÐ dÐ dÐ dÐ dØ oÐ oÐ oÐ oÐ oÐ oÐ oÐ oÐ oÐ oÐ oÐ oØ ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø +Ð +Ð +Ð +Ð +Ð +Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø <Ð <Ð <Ð <Ð <Ð <Ø :Ð :Ð :Ð :Ð :Ð :ðØ8Ð8Ð8Ð8Ð8Ð8Ø Ô&€N€NøØ�^Ð$ð ð ð Ø€N€N€Nðøøøà Ð Ð Ð Ø €€€ðð ð ð ð ð ð ð ð ð ð ð ð PÐ OÐ OÐ OÐ OÐ OÐ OÐ OØ QÐ QÐ QÐ QÐ QÐ QÐ QÐ Qà`Ð ð
 BÐ AÐ AÐ AÐ AÐ AÐ AÐ AØ 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'àˆÑ Ô €Øˆt�H‰~Œ~Ô$ vÑ-€Ø Ð ˜|¸Ð FÑ FÔ FÐ Fð€ðE ð E¨ð Eð Eð Eð EðP¨ð °ð ð ð ð ðF #ð F¨#ð Fð Fð Fð Fð cð ¨d°4¸¸S¸´>Ô.Bð ð ð ð ð: Cð ¨D°4©Kð ð ð ð ð Cð ¨C°$©Jð ð ð ð ð6¨ð 6°°c´ð 6ð 6ð 6ð 6ðr\˜˜c 3˜hœð \ð \ð \ð \ð~
 ˆ_ÑÔ€
ð	Ø,Ð,Ð,Ð,Ð,Ð,Ø€M�uÐÑÔÐÐøØð 	ð 	ð 	Ø€Dð	øøøð	Ø7Ð7Ð7Ð7Ð7Ð7ØÐÑÔÐÐøØð 	ð 	ð 	Ø€Dð	øøøð	Ø<Ð<Ð<Ð<Ð<Ð<ØÐ˜*Ñ%Ô%Ð%Ð%øØð 	ð 	ð 	Ø€Dð	øøøð	Ø6Ð6Ð6Ð6Ð6Ð6Ø�>Š>˜) RÑ(Ô(×,Ò,Ð-BÀAÑFÔF€DØÐ¨$Ð5˜S˜S ™YœY˜Y°AÑ6Ô6Ð6Ð6øØð 	ð 	ð 	Ø€Dð	øøøð	Ø=Ð=Ð=Ð=Ð=Ð=ØÐÑÔÐÐøØð 	ð 	ð 	Ø€Dð	øøøð !Ð  Ð  Ð  Ð  Ð  Ø  Ð  Ð  Ð  Ð  Ð  Ø )Ð )Ð )Ð )Ð )Ð )Ø Ð Ð Ð Ð Ð Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'à €€€ð Ð Ð Ð Ð Ð Ø BÐ BÐ BÐ BÐ BÐ BÐ BÐ Bð 3Ð 2Ð 2Ð 2Ð 2Ð 2Ø NÐ NÐ NÐ NÐ NÐ NÐ NÐ NØ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ Ið Ð Ð Ð Ð Ð ð SÐ RÐ RÐ RÐ RÐ RØ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QØ 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø WÐ WÐ WÐ WÐ WÐ Wð €àÐ ð(ð (ð (ð` .2Ð �(˜4  S œ>Ô*Ð 1Ð 1Ñ 1ð˜ œð ð ð ð ð˜tð ¨4ð °Dð ð ð ð ð`ð `˜sð `¨h°t¸CÀ¸H´~Ô.Fð `ð `ð `ð `ðF=@ð =@˜D  c œNð =@°dð =@ð =@ð =@ð =@ð@Cð Cð Cð Cð4F(ð F( cð F(¸#ð F(Àtð F(ð F(ð F(ð F(ðRB?¨ð B?°ð B?ð B?ð B?ð B?ð` 0Ð Ø€Ø€Ø€ð 27ð 	Ið 	Ið 	I˜Cð 	I¨$ð 	I¸3ð 	Ið 	Ið 	Ið 	Ið!ð !ð !ð !ð !ñ !ô !ð !ðH ˆ.Ð*¨I¸DÐ
AÑ
AÔ
A€Ø€~�l IÑ.Ô.€ð�Sð ð ð ð ð+˜sð + yð +ð +ð +ð +ð ð ¨ð ð ð ð ð*ð ¨#ð °Sð ð ð ð ð�#ð ð ð ð ð �Ið ð ð ñ ô Ð ð AÐ @Ð @Ð @Ð @Ð @ðBð B¨ð B¸Sð Bð Bð Bð Bð(˜3ð ( 5¨¨c¨¤?ð (ð (ð (ð (ðV, sð ,¨t°d©{ð ,ð ,ð ,ð ,ð^$ dð $¨|ð $ð $ð $ð $ðNA #ð A¨-ð Að Að Að AðHð °T¸$´Zð ÐPSð Ð\_ÐbfÑ\fð Ðruð ð ð ð ðB#¸cð #Àdð #ð #ð #ð #ð
ð   t¡ð ¸¸d¹
ð ÈeÐTWÐY]Ð^bÔYcÐTcÔNdð ð ð ð ð<(ð (ð (ð (ð (ñ (ô (ð (ðVFÐ ðj€ð$(˜sð (ð (ð (ð (ð`% Cð %¨Dð %ð %ð %ð %ð,ð ð ð ð ð ð ð ð ð ð &Ð%Ñ'Ô'€ð sð ð ð ð ð 3¨¨c¬¡?°U¸3À¸8´_Ñ#DÀtÑ#Kð ÐPTÐUXÔPYð ð ð ð ð06 ð 6¨Cð 6°Dð 6ð 6ð 6ð 6ð~_L'ð _L'ð _L'ð _L'ð _L'ñ _L'ô _L'ð _L'ðNY ØØØØ04ØØØØØØØØØØØØØØØØ!Ø$Øð/Uð UØðUà
ðUð ðUð ð	Uð
 �$�s”)‰O˜e C¨ HœoÑ-ðUð ðUð ðUð ðUð ðUð ðUð ðUð ðUð ðUð ðUð ðUð  ð!Uð" ð#Uð$ ð%Uð& ð'Uð( ð)Uð* ð+Uð, ð-Uð. ð/Uð Uð Uð Uðp ˆzÒÐØ€D„Iˆd�O„O€O€O€Oð Ðsm   ÃC+ Ã+	C7Ã6C7ÇG ÇG&Ç%G&Ç*G; Ç;HÈHÈH ÈH!È H!È%AI. É.I6É5I6É:J ÊJÊJ