
    Ji3                        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mZm	Z	 ddl
mZ ddlmZ dZdZ ej        e          ZdZdZd	Zd
ZdZdZdZdZe G d d                      Zdaeed<   deddfdZdefdZ d Z!de"de#de#fdZ$de#fdZ%de"fdZ&d`de"de"de"fdZ'de"de"fd Z(dade"d!e)d"edz  de"dz  fd#Z*d$e"defd%Z+d$ede"dz  fd&Z,d$ede"fd'Z-d!e)de#e         fd(Z.de"d)e)dz  de#e         fd*Z/de"d)e)dz  dedz  fd+Z0d,e"dz  de1fd-Z2d.edz  de"dz  fd/Z3ddd0de"d,e"dz  d)e)dz  d.edz  de"dz  f
d1Z4d2e"de1fd3Z5d4e"de#e"         fd5Z6d4e"de#e"         fd6Z7eed7d4e"d8ed9ede#e"         fd:Z8dddd;de"d,e"dz  d)e)dz  d.edz  de1f
d<Z9 G d= d>          Z:g d?Z;g d@Z<g dAZ=g dBZ>g dCZ?g dDZ@g dEZAg dFZBde"d,e"dz  deCe1e"f         fdGZD	 dade"d!e)dHeEd,e"dz  de"f
dIZFdJZGdKZHdZdLe"dMe"de"fdNZIdOe"de"de"fdPZJdLe"dMe"de"fdQZKde"ddfdRZLdSZMdTZNdUZOdJZPdVZQdWZRdXZS	 dbdZeEd[ed\eEd]e1de"f
d^ZT	 dbdZeEd\eEd]e1de"fd_ZUdS )czCLI presentation -- spinner, kawaii faces, tool preview formatting.

Pure display functions and classes with no AIAgent dependency.
Used by AIAgent._execute_tool_calls for CLI feedback.
    N)	dataclassfield)unified_diff)Pathz[31mz[0mz[38;2;150;150;150mz[38;2;180;160;255mz[38;2;120;120;140mz"[38;2;255;255;255;48;2;120;20;20mz![38;2;255;255;255;48;2;20;90;20m   P   c                   z    e Zd ZU dZ ee          Zee         ed<    ee	          Z
e	eedz  f         ed<   dS )LocalEditSnapshotzGPre-tool filesystem snapshot used to render diffs locally after writes.)default_factorypathsNbefore)__name__
__module____qualname____doc__r   listr   r   __annotations__dictr   str     */home/ubuntu/hermes-agent/agent/display.pyr
   r
   !   sc         QQd333E4:333$)E$$?$?$?FDcDj!?????r   r
   _tool_preview_max_lennreturnc                 H    | rt          t          |           d          ndadS )z?Set the global max length for tool call previews. 0 = no limit.r   N)maxintr   )r   s    r   set_tool_preview_max_lenr   .   s'     /06CANNNQr   c                      t           S )z9Return the configured max preview length (0 = unlimited).)r   r   r   r   get_tool_preview_max_lenr!   4   s      r   c                  F    	 ddl m}   |             S # t          $ r Y dS w xY w)z5Get the active skin config, or None if not available.r   get_active_skinN)hermes_cli.skin_enginer$   	Exceptionr#   s    r   	_get_skinr'   =   sI    ::::::      tts    
  keydefaultc                 X    t                      }|r|                    |           }|r|S |S )z@Get spinner face list from active skin, falling back to default.)r'   get_spinner_list)r(   r)   skinfacess       r   get_skin_facesr.   F   s8    ;;D %%c** 	LNr   c                  l    t                      } | r|                     d          }|r|S t          j        S )z$Get thinking verbs from active skin.thinking_verbs)r'   r+   KawaiiSpinnerTHINKING_VERBS)r,   verbss     r   get_skin_verbsr4   P   s=    ;;D %%&677 	L''r   c                  4    t                      } | r| j        S dS )z2Get tool output prefix character from active skin.   ┊)r'   tool_prefix)r,   s    r   get_skin_tool_prefixr8   Z   s!    ;;D  5r      ⚡	tool_namec                     t                      }|r%|j        r|j                            |           }|r|S 	 ddlm} |                    | d          }|r|S n# t          $ r Y nw xY w|S )zGet the display emoji for a tool.

    Resolution order:
    1. Active skin's ``tool_emojis`` overrides (if a skin is loaded)
    2. Tool registry's per-tool ``emoji`` field
    3. *default* fallback
    r   )registry )r)   )r'   tool_emojisgettools.registryr<   	get_emojir&   )r:   r)   r,   overrider<   emojis         r   get_tool_emojirD   b   s     ;;D   #''	22 	O++++++""9b"99 	L	    Ns    A 
A&%A&textc                 P    d                     |                                           S )z:Collapse whitespace (including newlines) to single spaces. )joinsplit)rE   s    r   _onelinerJ      s    88DJJLL!!!r   argsmax_lenc                 	   |t           }|sdS 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$k    r|                    d d%          }|                    d&d%          }|                    d'd%          }|                    d(          }|g}|r|                    |dd)                    |r.|                    d*t          |dd+                    d*           |r|d,k    r|                    | d-           |rd.                    |          ndS | d/k    rW|                    d0          }	|                    d1d2          }
|	d3S |
rd4t          |	           d5S d6t          |	           d5S | d7k    rHt          |                    dd%                    }d8|dd9          t          |          d9k    rd:nd% d*S | d;k    r|                    d d%          }|                    d<d%          }|d=k    rKt          |                    d>d%                    }d?| d@|dd9          t          |          d9k    rd:nd% d*S |dAk    r2dB| d@t          |                    dCd%          dd+                    d*S |dDk    r2dE| d@t          |                    dCd%          dd+                    d*S |S | dFk    rb|                    d<dG          }t          |                    dHd%                    }t          |          d+k    r|ddI         d:z   }dJ| d@| d*S |                     dK          rdL|                    dd%          dM|                    dNd%           dO|                    dPd%           dQ|                    dRd%          dd)         dS|                    dRd%          dd)          |                    dRd%          dd)         dT|                    dUdV           dWdX
}|                    |           S |                    |           }|sdYD ]
}||v r|} n|r||vrdS ||         }t          |t                    r|r|dZ         nd%}t          t          |                    }|sdS |dZk    r#t          |          |k    r|d|dVz
           d:z   }|S )[zBuild a short preview of a tool call's primary argument for display.

    *max_len* controls truncation.  ``None`` (default) defers to the global
    ``_tool_preview_max_len`` set via config; ``0`` means unlimited.
    Nterminalcommand
web_searchqueryweb_extracturls	read_filepath
write_filepatchsearch_filespatternbrowser_navigateurlbrowser_clickrefbrowser_typerE   image_generateprompttext_to_speechvision_analyzequestionmixture_of_agentsuser_prompt
skill_viewnameskills_listcategorycronjobactioncodegoal)execute_codedelegate_taskclarifyskill_manageprocessr=   
session_iddatatimeout   "   waitsrG   todotodosmergeFzreading task listz	updating z task(s)z	planning session_searchz	recall: "   ...memorytargetaddcontent+: "replace~old_textremove-send_message?message   zto rl_zlisting envszreading configr   =valuestartingrun_idz	stopping zlisting runs	num_steps   z steps
rl_list_environmentsrl_select_environmentrl_get_current_configrl_edit_configrl_start_trainingrl_check_statusrl_stop_trainingrl_get_resultsrl_list_runsrl_test_inference)rQ   rE   rO   rU   rg   r`   rl   rm   r   )
r   r?   appendrJ   rH   len
startswith
isinstancer   r   )r:   rK   rL   primary_argsrk   sidrt   timeout_valparts	todos_argr}   rQ   r   r   msgrl_previewsr(   fallback_keyr   previews                       r   build_tool_previewr      s    ' tI+W6CVV)63:F 		 $6u 		 !/	
 	(
 %5f 	* ':= 	f ,Z 	8 v  L I(B''hh|R((xx##hhy)) 	#LLSbS""" 	5LL3Xd3B3i00333444 	,6V++LLK***+++"'1sxxT1FHHW%%	%((&& 	87s9~~77777s9~~7777$$$'2..//LE#2#JLUbbLLLLH(B''(B''U??txx	26677GWvWW73B3<W#g,,:K:KQSWWWWy  NvNN8DHHZ,D,DSbS,I#J#JNNNNxNvNN8DHHZ,D,DSbS,I#J#JNNNNN""(C((txx	2..//s88b==crc(U"C(V((((((E"" *$2%)XXfb%9%9%5!%'2!6!6PP'29N9NPP!+#xx"55crc: IDHHXr,B,B3B3,G I I"hhx44SbS9*$(HH[!$<$<!D!D!D
 
 y)))


9
%
%C b 	 	Lt##" $  #T//tIE% *!)ars5zz""G t{{s7||g--,7Q;,'%/Nr   rU   c                     t          t          j                            |                     }|                                r|S t          j                    |z  S )zDResolve a possibly-relative filesystem path against the current cwd.)r   osrU   
expanduseris_absolutecwd)rU   	candidates     r   _resolved_pathr      sJ    RW''--..I 8::	!!r   c                 x    	 |                      d          S # t          t          t          t          f$ r Y dS w xY w)z@Return UTF-8 file content, or None for missing/unreadable files.utf-8)encodingN)	read_textFileNotFoundErrorIsADirectoryErrorUnicodeDecodeErrorOSErrorrU   s    r   _snapshot_textr      sH    ~~w~///02DgN   tts    99c                     	 t          |                                                     t          j                                                                        S # t
          $ r t          |           cY S w xY w)z2Prefer cwd-relative paths in diffs when available.)r   resolverelative_tor   r   r&   r   s    r   _display_diff_pathr     sj    4<<>>--dhjj.@.@.B.BCCDDD   4yys   AA A54A5c                    |                      d          }|                      d          }|r|sg S ddlm}m} |dk    r% |||                      d                    }|dz  gS  ||          }|sg S t	          |d                   }|d	v r#|                      d
          }|r||z  gn|dz  gS |dv r|                      d
          }|r||z  gng S |dk    r.d t          |                    d                    D             }|S g S )z7Resolve skill_manage write targets to filesystem paths.rk   rg   r   )_find_skill_resolve_skill_dircreateri   zSKILL.mdrU   >   editrW   	file_path>   rV   remove_filedeletec                 :    g | ]}|                                 |S r   )is_file).0rU   s     r   
<listcomp>z/_resolve_skill_manage_paths.<locals>.<listcomp>%  s%    QQQ$$,,..QQQQr   *)r?   tools.skill_manager_toolr   r   r   sortedrglob)	rK   rk   rg   r   r   	skill_direxistingr   filess	            r   _resolve_skill_manage_pathsr     sc   XXhF88FD  	HHHHHHHH&&tTXXj-A-ABB	J&''{4  H 	Xf%&&I"""HH[))	*3Q	I%&&)j:P9QQ...HH[))	*3;	I%&&;QQ&)=)=">">QQQIr   function_argsc                    t          |t                    sg S | dk    r)|                    d          }|rt          |          gng S | dk    r)|                    d          }|rt          |          gng S | dk    rt	          |          S g S )z9Resolve local filesystem targets for write-capable tools.rV   rU   rW   rq   )r   r   r?   r   r   )r:   r   rU   s      r   _resolve_local_edit_pathsr   *  s    mT** 	L    (()-5t$$%%25G  (()-5t$$%%25N""*=999Ir   c                     t          | |          }|sdS t          |          }|D ]&}t          |          |j        t	          |          <   '|S )z.Capture before-state for local write previews.N)r   )r   r
   r   r   r   )r:   r   r   snapshotrU   s        r   capture_local_edit_snapshotr   =  s_    %i??E t u---H : :%3D%9%9D		""Or   resultc                    | sdS 	 t          j        |           }n# t           j        t          f$ r Y dS w xY wt	          |t
                    sdS |                    d          rdS d|v r"t          |                    d                    S dS )z?Conservatively detect whether a tool result represents success.FerrorsuccessT)jsonloadsJSONDecodeError	TypeErrorr   r   r?   bool)r   rt   s     r   _result_succeededr   I  s     uz&!! ),   uudD!! uxx uDDHHY''(((4s    55r   c           
         | sdS g }| j         D ]}| j                            t          |                    }t	          |          }||k    r?t          |          }d                    t          |g n|                    d          |g n|                    d          d| d|                     }|r|	                    |           |sdS d                    d |D                       S )	zHGenerate unified diff text from a stored before-state and current files.Nr=   T)keependsza/zb/)fromfiletofilec              3   N   K   | ] }|                     d           r|n|d z   V  !dS )
N)endswith)r   chunks     r   	<genexpr>z&_diff_from_snapshot.<locals>.<genexpr>t  s;      WWuENN400B55edlWWWWWWr   )
r   r   r?   r   r   r   rH   r   
splitlinesr   )r   chunksrU   r   afterdisplay_pathdiffs          r   _diff_from_snapshotr   Z  s%    tF    $$SYY//t$$U??)$//wwn&*;*;T*;*J*Jm)9)94)9)H)H,l,,*L**	  
 
  	 MM$ t77WWPVWWWWWWr   r   r   c                p   | dk    r|r	 t          j        |          }n# t           j        t          f$ r d}Y nw xY wt	          |t
                    r@|                    d          }t	          |t                    r|                                r|S | dvrdS t          |          sdS t          |          S )z4Extract a unified diff from a file-edit tool result.rW   Nr   >   rW   rV   rq   )r   r   r   r   r   r   r?   r   stripr   r   )r:   r   r   r   rt   r   s         r   extract_edit_diffr   w  s     G	:f%%DD$i0 	 	 	DDD	dD!! 	88F##D$$$  ???tV$$ tx(((s    ::	diff_textc                     || sdS 	  |d           |                      d                                          D ]} ||           dS # t          $ r Y dS w xY w)zFEmit rendered diff text through the CLI's prompt_toolkit-safe printer.NFu     ┊ review diffr   T)rstripr   r&   )r   print_fnlines      r   _emit_inline_diffr    s    yu$%%%$$T**5577 	 	DHTNNNNt   uus   A A
 

AAr   c                 x   g }d}d}|                                  D ]}|                    d          r|dd                                         }5|                    d          rM|dd                                         }|s|r,|                    t           |pd d|pd t
                      |                    d          r&|                    t           | t
                      |                    d	          r'|                    t           | t
                      |                    d
          r'|                    t           | t
                      J|                    d          r'|                    t           | t
                      |r|                    |           |S )z=Render unified diff lines in Hermes' inline transcript style.N---    z+++ za/?u    → zb/?z@@r   r   rG   )
r   r   r   r   
_ANSI_FILE_ANSI_RESET
_ANSI_HUNK_ANSI_MINUS
_ANSI_PLUS	_ANSI_DIM)r   rendered	from_fileto_fileraw_lines        r   _render_inline_unified_diffr    s   HIGOO%% & &v&& 	 **,,Iv&& 	qrrl((**G iG i: gy/AE g gHXSX gZe g ghhht$$ 	OOzB8B[BBCCCs## 	OO{CHCkCCDDDs## 	OOzB8B[BBCCCs## 	OOyA(AKAABBB 	&OOH%%%Or   c                    g }g }|                                  D ]G}|                    d          r|r|                    |           |g}2|                    |           H|r|                    |           d |D             S )z,Split a unified diff into per-file sections.r  c                 <    g | ]}|d                      |          S )r   )rH   )r   sections     r   r   z0_split_unified_diff_sections.<locals>.<listcomp>  s)    BBB7'BDIIgBBBr   )r   r   r   )r   sectionscurrentr   s       r   _split_unified_diff_sectionsr    s     "HG!!  ??6"" 	w 	OOG$$$fGt !   BBhBBBBr   )	max_files	max_linesr  r  c          	      
   t          |           }g }d}d}t          |          D ]"\  }}||k    r%|dz  }|t          t          |                    z  }1t          |          }	|t          |          z
  }
|
dk    r|t          |	          z  }|dz  }pt          |	          |
k    r|                    |	           |                    |	d|
                    |t          |	          |
z
  z  }|dt          dt          |          |z
  dz
            z   z  }||dz   d         D ]!}|t          t          |                    z  }" |s|r6d| d}|r	|d| dz  }|                    t           | t                      |S )zCRender diff sections while capping file count and total line count.r      Nu   … omitted z diff line(s)z across z additional file(s)/section(s))	r  	enumerater   r  extendr   r   r  r  )r   r  r  r  r  omitted_filesomitted_linesidxr  section_linesremaining_budgetleftoversummarys                r   !_summarize_rendered_diff_sectionsr#    s    ,D11HHMM!(++  W)QMS!<W!E!EFFFM3G<<$s8}}4q  S///MQM}!111OOM***&7'7&78999]++.>>>SCMMC$7!$;<<<< q* 	H 	HHS!<X!F!FGGGMM ? ?==== 	PO-OOOOG:=w===>>>Or   )r   r   r   c                    t          | |||          }|sdS 	 t          |          }n3# t          $ r&}t                              d|           Y d}~dS d}~ww xY wt          d                    |          |          S )z?Render an edit diff inline without taking over the terminal UI.r   Fz Could not render inline diff: %sNr   )r   r#  r&   loggerdebugr  rH   )r:   r   r   r   r   r   rendered_linesexcs           r   render_edit_diff_with_deltar)    s     #	  D  u:4@@   7===uuuuu TYY~66AAAs   ) 
AAAc            
           e Zd ZdZg dg dg dg dg dg dg dg d	g d
d	Zg dZg dZg dZd'dedefdZ	d(dedede
fdZede
fd            Zde
fdZd Zd Zd efd!Zdefd"Zd)d#efd$Zd% Zd& ZdS )*r1   zJAnimated spinner with kawaii faces for CLI feedback during tool execution.)
u   ⠋u   ⠙u   ⠹u   ⠸u   ⠼u   ⠴u   ⠦u   ⠧u   ⠇u   ⠏)u   ⠁u   ⠂u   ⠄u   ⡀u   ⢀u   ⠠u   ⠐u   ⠈)u   ▁   ▂   ▃   ▄   ▅   ▆   ▇u   █r0  r/  r.  r-  r,  r+  )   ←u   ↖   ↑u   ↗   →u   ↘   ↓u   ↙)u   ✶   ✷   ✸   ✹u   ✺r7  r6  r5  )u   🌑u   🌒u   🌓u   🌔u   🌕u   🌖u   🌗u   🌘)u   ◜u   ◠u   ◝u   ◞u   ◡u   ◟)u   🧠   💭   💡u   ✨u   💫u   🌟r9  r8  )u   ⁺   ˚r      ✧u   ✦r;  r   r:  )	dotsbouncegrowarrowsstarmoonpulsebrainsparkle)
   (｡◕‿◕｡)   (◕‿◕✿)   ٩(◕‿◕｡)۶   (✿◠‿◠)   ( ˘▽˘)っ   ♪(´ε` )   (◕ᴗ◕✿)   ヾ(＾∇＾)   (≧◡≦)u
   (★ω★))u   (｡•́︿•̀｡)u	   (◔_◔)u	   (¬‿¬)u   ( •_•)>⌐■-■   (⌐■_■)u   (´･_･`)u   ◉_◉u	   (°ロ°)u   ( ˘⌣˘)♡u   ヽ(>∀<☆)☆u   ٩(๑❛ᴗ❛๑)۶u	   (⊙_⊙)   (¬_¬)   ( ͡° ͜ʖ ͡°)u   ಠ_ಠ)	ponderingcontemplatingmusing
cogitating
ruminatingdeliberatingmulling
reflecting
processing	reasoning	analyzing	computingsynthesizingformulatingbrainstormingr=   r<  Nr   spinner_typec                     || _         | j                            || j        d                   | _        d| _        d | _        d| _        d | _        d| _        || _	        t          j        | _        d S )Nr<  Fr   )r   SPINNERSr?   spinner_framesrunningthread	frame_idx
start_timelast_line_len	_print_fnsysstdout_out)selfr   r`  r   s       r   __init__zKawaiiSpinner.__init__:  sf    "m//dmF>STT " J			r   r   FrE   endflushc                    | j         )	 |                      |           n# t          $ r Y nw xY wdS 	 | j                            ||z              |r| j                                         dS dS # t
          t          f$ r Y dS w xY w)u   Write to the stdout captured at spinner creation time.

        If a print_fn was supplied at construction, all output is routed through
        it instead — allowing callers to silence the spinner with a no-op lambda.
        N)ri  r&   rl  writerp  
ValueErrorr   )rm  rE   ro  rp  s       r   _writezKawaiiSpinner._writeJ  s     >%t$$$$   F	IOOD3J''' "	!!!!!" "G$ 	 	 	DD	s    
,,8A. .BBr   c                     	 t          | j        d          o| j                                        S # t          t          f$ r Y dS w xY w)z@Check if output is a real terminal, safe against closed streams.isattyF)hasattrrl  rv  rs  r   rm  s    r   _is_ttyzKawaiiSpinner._is_tty]  sS    	49h//FDI4D4D4F4FFG$ 	 	 	55	s   -0 AAc                 \    	 ddl m} t          | j        |          S # t          $ r Y dS w xY w)u  Return True when stdout is prompt_toolkit's StdoutProxy.

        patch_stdout wraps sys.stdout in a StdoutProxy that queues writes and
        injects newlines around each flush().  The \r overwrite never lands on
        the correct line — each spinner frame ends up on its own line.

        The CLI already drives a TUI widget (_spinner_text) for spinner display,
        so KawaiiSpinner's \r-based animation is redundant under StdoutProxy.
        r   )StdoutProxyF)prompt_toolkit.patch_stdoutr{  r   rl  ImportError)rm  r{  s     r   _is_patch_stdout_proxyz$KawaiiSpinner._is_patch_stdout_proxye  sM    	??????di555 	 	 	55	s    
++c                    | j         sC|                     d| j         d           | j        rt	          j        d           | j        d S |                                 r$| j        rt	          j        d           | j        d S t                      }|r|                                ng }| j        r?t          j
        d          rt	          j        d           1| j        | j        t          | j                  z           }t	          j                    | j        z
  }|r9|| j        t          |          z           \  }}d| d| d| j         d| d	|d
d}nd| d| j         d	|d
d}t          | j        t          |          z
  d          }|                     d| d|z   dd           t          |          | _        | xj        dz  c_        t	          j        d           | j        =d S d S )Nz	  [tool] Trp        ?g?HERMES_SPINNER_PAUSE  rG    (.1fs)r   r=   ro  rp  r  gQ?)ry  rt  r   rd  timesleepr~  r'   get_spinner_wingsr   getenvrc  rf  r   rg  r   rh  )	rm  r,   wingsframeelapsedleftrightr   pads	            r   _animatezKawaiiSpinner._animateu  s.    | 	KK2DL22$K???,  
3 ,  F &&(( 	,  
3 ,  F {{,08&&(((bl 	y/00 
3'T=P9Q9Q(QREikkDO3G D#DNSZZ$?@eRDRR5RR4<RR%RR7RRRRCECCDLCCGCCCCd(3t994a88CKK.T.39..BdKCCC!$TDNNaNNJt l 	 	 	 	 	r   c                     | j         rd S d| _         t          j                    | _        t          j        | j        d          | _        | j                                         d S )NT)r   daemon)rd  r  rg  	threadingThreadr  re  startrx  s    r   r  zKawaiiSpinner.start  sX    < 	F)++&dmDIIIr   new_messagec                     || _         d S N)r   )rm  r  s     r   update_textzKawaiiSpinner.update_text  s    "r   c                     | j         s|                     d| d           dS dt          | j        dz   d          z  }|                     d| d	| d           dS )
a  Print a line above the spinner without disrupting animation.

        Clears the current spinner line, prints the text, and lets the
        next animation tick redraw the spinner on the line below.
        Thread-safe: uses the captured stdout reference (self._out).
        Works inside redirect_stdout(devnull) because _write bypasses
        sys.stdout and writes to the stdout captured at spinner creation.
        r  Tr  NrG      (   r  z  )rd  rt  r   rh  )rm  rE   blankss      r   print_abovezKawaiiSpinner.print_above  sz     | 	KKT4K000F s4-12666+++T++488888r   final_messagec                    d| _         | j        r| j                            d           | j        }|r7dt	          | j        dz   d          z  }|                     d| ddd	
           |re| j        r dt          j                    | j        z
  ddnd}|r|                     d| d	           d S |                     d| | d	           d S d S )NFr  )ru   rG   r  r  r  r=   Tr  r  r  r  r  r  z	  [done] )	rd  re  rH   ry  r   rh  rt  rg  r  )rm  r  is_ttyr  r  s        r   stopzKawaiiSpinner.stop  s   ; 	*KS))) 	= 3t1A5r:::FKKVRtK<<< 	NDHO[@49;;8@@@@@Y[G N000=====@@w@@MMMMM	N 	Nr   c                 .    |                                   | S r  )r  rx  s    r   	__enter__zKawaiiSpinner.__enter__  s    

r   c                 .    |                                   dS )NF)r  )rm  exc_typeexc_valexc_tbs       r   __exit__zKawaiiSpinner.__exit__  s    		ur   )r=   r<  N)r   Fr  )r   r   r   r   rb  KAWAII_WAITINGKAWAII_THINKINGr2   r   rn  r   rt  propertyry  r~  r  r  r  r  r  r  r  r   r   r   r1   r1     s       TT WVVJJJrrrJJJHHHPPP;;;PPPEEE
 
H  N
  O  N        3 S     &     X     ' ' 'R  #s # # # #9 9 9 9 9$N N# N N N N$      r   r1   )
rJ  rE  rL  rK  rI  rG  rH  u   ♪～(´ε｀ )u   (ノ´ヮ`)ノ*:・゚✧   ＼(◎o◎)／)
u   φ(゜▽゜*)♪rI  rN     ٩(｡•́‿•̀｡)۶rF     ヾ(＠⌒ー⌒＠)ノ
   (✧ω✧)   ♪(๑ᴖ◡ᴖ๑)♪rM  u   ( ´ ▽ ` )ノ)
   ヽ(>∀<☆)ノ   (ノ°∀°)ノu   ٩(^ᴗ^)۶u   ヾ(⌐■_■)ノ♪u   (•̀ᴗ•́)وu   ┗(＾0＾)┓u   (｀・ω・´)u   ＼(￣▽￣)／u   (ง •̀_•́)งu   ヽ(´▽`)/)
r  u   (☞゚ヮ゚)☞rP  u   ┌( ಠ_ಠ)┘u   (⊙_⊙)？u   ヾ(•ω•`)ou
   (￣ω￣)u
   ( ˇωˇ )u   (ᵔᴥᵔ)r  )
u   ✧*。٩(ˊᗜˋ*)و✧u   (ﾉ◕ヮ◕)ﾉ*:・ﾟ✧r  u   ٩(♡ε♡)۶u   (◕‿◕)♡u   ✿◕ ‿ ◕✿u   (*≧▽≦)u   ヾ(＾-＾)ノ   (☆▽☆)u   °˖✧◝(⁰▿⁰)◜✧˖°)r  u   (๑˃ᴗ˂)ﻭrG  u   (✿╹◡╹)u   ヽ(・∀・)ノ   (ノ´ヮ`)ノ*:・ﾟ✧r  u   (◠‿◠)u   ٩(ˊᗜˋ*)وu   (＾▽＾)rL  u   (★ω★)/r  rK  r  r  r  rI  u   (≧◡≦) ♡u   ヾ(￣▽￣))
u   (っ°Д°;)っu   (；′⌒`)u   (・_・ヾu
   ( ´_ゝ`)u   (￣ヘ￣)u   (。-`ω´-)u   ( ˘︹˘ )rO  u   ヽ(ー_ー )ノu   (；一_一))
rJ  rF  rL  rG  rH  r  r  r  rI  rM  c                    |dS | dk    ry	 t          j        |          }|                    d          }||dk    rdd| dfS n<# t           j        t          t
          f$ r t                              d	           Y nw xY wdS | d
k    r	 t          j        |          }|                    d          du rd|                    dd          v rdS n<# t           j        t          t
          f$ r t                              d           Y nw xY w|dd                                         }d|v sd|v s|	                    d          rdS dS )a  Inspect a tool result string for signs of failure.

    Returns ``(is_failure, suffix)`` where *suffix* is an informational tag
    like ``" [exit 1]"`` for terminal failures, or ``" [error]"`` for generic
    failures.  On success, returns ``(False, "")``.
    N)Fr=   rN   	exit_coder   Tz [exit ]z;Could not parse terminal result as JSON for exit code checkr   r   Fzexceed the limitr   r=   )Tz [full]z8Could not parse memory result as JSON for capacity checki  z"error"z"failed"Error)Tz [error])
r   r   r?   r   r   AttributeErrorr%  r&  lowerr   )r:   r   rt   r  r  s        r   _detect_tool_failurer    s    ~yJ	X:f%%D--I$a3y33333$i@ 	X 	X 	XLLVWWWWW	Xy H	U:f%%Dxx	""e++0BdhhwXZF[F[0[0[&$i@ 	U 	U 	ULLSTTTTT	U 4C4L  EEZ500F4E4Eg4N4N09s$   8A 6A?>A?AC 6D
	D
durationc                     |dd}t          | |          \  t                       dd}dd}dt          dt          f fd	}| d
k    r/ |d ||                    dd          d           d|           S | dk    r|                    dg           }|rt	          |t
                    r|d         nt          |          }	|	                    dd                              dd                              d          d         }
t          |          dk    rdt          |          dz
   nd} |d ||
d           | d|           S  |d|           S | dk    rt|                    dd          }	|	                    dd                              dd                              d          d         }
 |d ||
d           d|           S | dk    r/ |d ||                    dd          d           d|           S | d k    rz|                    d!d"          }|                    d#d          d$d%         }d&d'| d(| d)| d*| d+| d,| d-} |d.|                    || d/|            d|           S | d0k    r. |d1 ||                    d2d                     d|           S | d3k    r. |d4 ||                    d2d                     d|           S | d5k    r. |d6 ||                    d2d                     d|           S | d7k    rU ||                    d8d          d          }|                    d9d:          }|d;k    rd<nd=} |d>|d?d/| d|           S | d@k    rt|                    dd          }	|	                    dd                              dd                              d          d         }
 |dA ||
d           d|           S | dBk    r*|                    dC          rdCndD} |dE| d|           S | dFk    r% |dG|                    dHd"           d|           S | dIk    r/ |dJ ||                    dKd          dL           dM|           S | dNk    rE|                    dOdP          }dQdRdSdTdU                    |dQ          } |dV| dW| d|           S | dXk    r |dY|           S | dZk    r% |d[|                    d\d"           d|           S | d]k    r |d^|           S | d_k    r |d`|           S | dak    r |db|           S | dck    ry|                    dd          }|                    dedf          }| |dg|           S |r |dht          |           di|           S  |djt          |           di|           S | dkk    r/ |dl ||                    dd          d           dM|           S | dmk    r|                    d!d"          }|                    d9d          }|dnk    r2 |do| dp ||                    d:d          dL           dM|           S |dqk    r2 |dr| dp ||                    dsd          dt           dM|           S |duk    r2 |dv| dp ||                    dsd          dt           dM|           S  |dw| d|           S | dxk    r% |dy|                    dzd{           d|           S | d|k    r/ |d} ||                    d~d          dL           d|           S | dk    r/ |d ||                    dd          d           d|           S | dk    r/ |d ||                    dKd          dL           d|           S | dk    r/ |d ||                    dd          dL           d|           S | dk    r/ |d ||                    dd          dL           d|           S | dk    rF |d|                    d9d"           dp ||                    dd          d           dM|           S | dk    r|                    d!d"          }|dk    r|                    d          p,|                    d          sg n|                    d          g}|                    d~          p!|r|d         nd$p|                    dd          } |d ||d           d|           S |dk    r |d|           S  |d| d/|                    dd           d|           S | 	                    d          rdd|                    d~d           dd|                    dd"           dd|                    dd"          d$d%          d|                    dd"          d$d%          d|                    dd"          d$d%          ddd
} |d|                    | |                     dd                     d|           S | dk    rt|                    dd          }|
                                r-|
                                                    d          d         nd} |d ||d           d|           S | dk    ry|                    d          }|r3t	          |t
                    r |dt          |           d|           S  |d ||                    dd          d           d|           S t          | |          pd} |d| d$d         d?d/ ||d           d|           S )a
  Generate a formatted tool completion line for CLI quiet mode.

    Format: ``| {emoji} {verb:9} {detail}  {duration}``

    When *result* is provided the line is checked for failure indicators.
    Failed tool calls get a red prefix and an informational suffix.
    r  rz   r  c                     t          |           } t          dk    r| S t          |           |k    r| d |dz
           dz   n| S )Nr   r   r   r   r   r   )rz   r   s     r   _truncz%get_cute_tool_message.<locals>._trunc5  sE    FF A%%H$'FFQJJ$1Q3$%A5r   #   c                     t          |           } t          dk    r| S t          |           |k    rd| |dz
   d          z   n| S )Nr   r   r   r  )pr   s     r   _pathz$get_cute_tool_message.<locals>._path;  sI    FF A%%H'*1vvzzAaC&''
""q8r   r   r   c                 R    dk    r|                      dd          } s| S |   S )z*Apply skin tool prefix and failure suffix.r6   r  )r   )r   failure_suffix
is_failureskin_prefixs    r   _wrapz$get_cute_tool_message.<locals>._wrapA  sA    %<<{A66D 	K((((r   rP   u   ┊ 🔍 search    rQ   r=   *   r  rR   rS   r   zhttps://zhttp:///r  z +u   ┊ 📄 fetch     u   ┊ 📄 fetch     pages  	web_crawlr[   u   ┊ 🕸️  crawl     rN   u   ┊ 💻 $         rO   rr   rk   r   rs   N   zls processeszpoll zlog zwait zkill zwrite zsubmit )r   polllogry   killrr  submitu   ┊ ⚙️  proc      rG   rT   u   ┊ 📖 read      rU   rV   u   ┊ ✍️  write     rW   u   ┊ 🔧 patch     rX   rY   r   r   r   findgrepu	   ┊ 🔎 9rZ   u   ┊ 🌐 navigate  browser_snapshotfullcompactu   ┊ 📸 snapshot  r\   u   ┊ 👆 click     r]   r^   u   ┊ ⌨️  type      "rE      z"  browser_scroll	directiondownr4  r2  r3  r1  )r  upr  r  u   ┊ z  scroll    browser_backu   ┊ ◀️  back      browser_pressu   ┊ ⌨️  press     r(   browser_closeu   ┊ 🚪 close     browser  browser_get_imagesu#   ┊ 🖼️  images    extracting  browser_visionu'   ┊ 👁️  vision    analyzing page  r{   r|   r}   Fu"   ┊ 📋 plan      reading tasks  u   ┊ 📋 plan      update z
 task(s)  u   ┊ 📋 plan      r~   u   ┊ 🔍 recall    "r   r   u   ┊ 🧠 memory    +r   r   u   ┊ 🧠 memory    ~r   rx   r   u   ┊ 🧠 memory    -u   ┊ 🧠 memory    rh   u   ┊ 📚 skills    list ri   allrf   u   ┊ 📚 skill     rg   r_   u   ┊ 🎨 create    r`   ra   u   ┊ 🔊 speak     rb   u   ┊ 👁️  vision    rc   rd   u   ┊ 🧠 reason    re   r   u   ┊ 📨 send      r   r   rj   r   skillsskilltasku   ┊ ⏰ cron      create    r   u   ┊ ⏰ cron      listing  u   ┊ ⏰ cron      job_idr   z	list envszselect z
get configzset r   zstart trainingzstatus r   zstop zresults z	list runsztest inferencer   u   ┊ 🧪 rl        rn   rl   r   u   ┊ 🐍 exec      ro   tasksu   ┊ 🔀 delegate  z parallel tasks  rm   u   ┊ ⚡ 	   )r  )r  )r  r8   r   r?   r   r   r   rI   r   r   r   r   )!r:   rK   r  r   durr  r  r  rS   r[   domainextrark   r   labelsrY   r   verbmodedarrowr   r}   r  labelrlrl   
first_liner  r   r  r  r  s!                                 @@@r   get_cute_tool_messager  '  s#    



C!5i!H!HJ&((K6 6 6 69 9 9 9)C )C ) ) ) ) ) ) ) ) L  uU66$((7B2G2G+L+LUUPSUUVVVM!!xx## 	S'd33B$q''TC[[R0088BGGMMcRRSTUF*-d))a--&T1&&&RE5Qvvfb/A/AQ5QQCQQRRRu7#77888Khhub!!Z,,44YCCII#NNqQuJvvfb/A/AJJSJJKKKJuW66$((9b2I2I2+N+NWWRUWWXXXI(C((hh|R(("-(-#--s'#--RUcrmpcrcrt tu\fjjFARARSARAR.S.S\\WZ\\]]]KuO55&"1E1E+F+FOO#OOPPPL  uReeDHHVR4H4H.I.IRRSRRSSSGuO55&"1E1E+F+FOO#OOPPPN""&)R00"55(I..7**vvu::::'::S::;;;&&&hhub!!Z,,44YCCII#NNqQuF66&"+=+=FFFFGGG&&&&))8vvyu8488388999O##uH488E3+?+?HH3HHIIIN""u[txx7K7KR0P0P[[VY[[\\\$$$HH[&))eeUKKOOPQSXYYu9E99q99C99:::N""u3c33444O##uKdhhuc.B.BKKcKKLLLO##u9C99:::(((u@3@@AAA$$$uDsDDEEEFHHW%%	%((5CcCCDDD 	P5Uc)nnUUPSUUVVV5Ns9~~NNNNOOO$$$uYVVDHHWb4I4I2-N-NYYTWYYZZZH(C(((B''U??5jjjFF488IWYCZCZ\^<_<_jjehjjkkky  5kkkFF488JXZC[C[]_<`<`kkfikklllx5kkkFF488JXZC[C[]_<`<`kkfikklllu:6::S::;;;M!!uTU0K0KTTsTTUUUL  uT66$((622F2F+K+KTTsTTUUU$$$uV66$((8R2H2H"+M+MVVQTVVWWW$$$uT66$((622F2F+K+KTTsTTUUU$$$u\vvdhhz26N6NPR/S/S\\WZ\\]]]'''u[66$((="2M2Mr+R+R[[VY[[\\\N""uv488Hc+B+BvvtxxXaceOfOfhjHkHkvvqtvvwwwI(C((XXXh''adhhw6G6G,`BBdhhW^N_N_M`FHHV$$ef)F$e488T\^dKeKeE5OVVE25F5FOO#OOPPPV5<s<<===uR&RR488Hb3I3IRRSRRSSSE"" e$/JjTXT\T\]cegThThJjJj%1EdDHHU\^aLbLbEdEd!1FnPTPXPXYacfPgPghkikhkPlFnFn F3(?(?(D F F  [Deiememnvx{e|e|  ~A  A  ~A  fB  [D  [D'>N
 
 uc266)Y=N=NuVX=Y=Y+Z+Zcc^accdddN""xx##48JJLLHTZZ\\''--a00b
uJ66*b+A+AJJSJJKKKO##!! 	SZt,, 	S5Qs5zzQQCQQRRRuT66$((622F2F+K+KTTsTTUUU D117RG5JIbqbMJJJffWb.A.AJJSJJKKKr   z[2mz[38;5;117m	workspacesession_namec                 J    ddl m} d || d           d ||d           S )z%Build a Honcho app URL for a session.r   )quotez)https://app.honcho.dev/explore?workspace=r=   )safez&view=sessions&session=)urllib.parser  )r  r  r  s      r   honcho_session_urlr     sX    """"""	3eIB///	3 	3 E,R000	3 	3r   r[   c                     d|  d| dS )zGOSC 8 terminal hyperlink (clickable in iTerm2, Ghostty, WezTerm, etc.).z]8;;z\z]8;;\r   )r[   rE   s     r   
_osc8_linkr    s    5c555555r   c                     t          | |          }t          |t           | t                     }t           dt           d| S )z?One-line session indicator: `Honcho session: <clickable name>`.zHoncho session:rG   )r   r  	_SKY_BLUEr  _DIM)r  r  r[   linked_names       r   honcho_session_liner    sL    
Y
5
5CSY"K"Kk"K"KLLK>>;>>>>>r   c                 Z   	 t          j        dt           j                  }t          j        ||                     d                     t          j        |           dS # t          $ rA t          j                            |            t          j        	                                 Y dS w xY w)z5Write directly to /dev/tty, bypassing stdout capture.z/dev/ttyr   N)
r   openO_WRONLYrr  encodecloser   rj  rk  rp  )rE   fds     r   	write_ttyr    s    WZ--
T[[))***
   

s   AA AB*)B*z[36mz[33mz[1mu   ▰u   ▱rx   Tcompaction_progressthreshold_tokensthreshold_percentcompression_enabledc                    t          t          | dz            d          }t          t          | t          z            t                    }t          |z  t          t          |z
  z  z   }|dk    r|dz   dnt          |          }t          |dz            }t           t           }	d}
|rd}nd}d|	 |
 d| d	| d
t           dt           | d| d| t           S )u  Build a formatted context pressure line for CLI display.

    The bar and percentage show progress toward the compaction threshold,
    NOT the raw context window.  100% = compaction fires.

    Args:
        compaction_progress: How close to compaction (0.0–1.0, 1.0 = fires).
        threshold_tokens: Compaction threshold in tokens.
        threshold_percent: Compaction threshold as a fraction of context window.
        compression_enabled: Whether auto-compression is active.
    d   i  ku   ⚠zcompaction approachingzno auto-compactionr  z	 context rG   z% to compactionz threshold (u   %) · )
minr   
_BAR_WIDTH_BAR_FILLED
_BAR_EMPTYr   _BOLD_YELLOWr  	_DIM_ANSI)r  r  r  r  pct_intfilledbarthreshold_kthreshold_pct_intcoloriconhints               r   format_context_pressurer%    sK   " #)C/00#66G(:566
CCF

zF/B!C
CC4D4L4L%-0000RUVfRgRgK-344gED $'#	^U 	^D 	^ 	^3 	^ 	^ 	^ 	^ 	^ 	^	^#	^ 	^1B	^ 	^JN	^P[	^ 	^r   c                 (   t          t          | dz            d          }t          t          | t          z            t                    }t          |z  t          t          |z
  z  z   }t          |dz            }d}|rd| d}nd}| d| d| d| S )	u   Build a plain-text context pressure notification for messaging platforms.

    No ANSI — just Unicode and plain text suitable for Telegram/Discord/etc.
    The percentage shows progress toward the compaction threshold.
    r  u   ⚠️z+Context compaction approaching (threshold: z% of window).u9   Auto-compaction is disabled — context may be truncated.z
 Context: rG   z% to compaction
)r  r   r  r  r  )	r  r  r  r  r  r  r!  r#  r$  s	            r   format_context_pressure_gatewayr'  &  s     #)C/00#66G(:566
CCF

zF/B!C
CC-344D K]=N]]]JDDcDDGDDdDDDr   )r9   r  )T)Vr   r   loggingr   rj  r  r  dataclassesr   r   difflibr   pathlibr   _RED_RESET	getLoggerr   r%  r  r
  r  r  r  r	  _MAX_INLINE_DIFF_FILES_MAX_INLINE_DIFF_LINESr
   r   r   r   r   r!   r'   r   r   r.   r4   r8   rD   rJ   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r#  r)  r1   KAWAII_SEARCHKAWAII_READKAWAII_TERMINALKAWAII_BROWSERKAWAII_CREATEKAWAII_SKILLKAWAII_THINKKAWAII_GENERICtupler  floatr  r  r  r   r  r  r  _CYANr  r  r  r  r  r  r%  r'  r   r   r   <module>r<     s       				 



      ( ( ( ( ( ( ( (                   			8	$	$$	%
%
53
   @ @ @ @ @ @ @ @  s   7 7 7 7 7 7!# ! ! ! !   d t    ( ( ( ( (c     c C C    <"3 "3 " " " "
h h# hT hC$J hRUX\R\ h h h h^" " " " " " #*    T c    d tDz    < TD[ TRVZ    &	3 	td{ 	O`cgOg 	 	 	 	cDj T    "X"3d": XsTz X X X XB "&)-) ) ))$J) $;	)
  $&) 	4Z) ) ) )2
 
4 
 
 
 
c d3i    BCs CtCy C C C C* ,+	* * *
* * 	*
 
#Y* * * *b "&)-B B BB$JB $;	B
  $&B 
B B B B:y y y y y y y y@                "C "t "dCi@P " " " "L GK\L \L\L\L*/\L9<t\L\L \L \L \LF 	# S S    6C 6s 6s 6 6 6 6
?3 ?c ?c ? ? ? ?C D      	
	 

 !%	" """ " 	"
 	" " " "P !%E EEE E 		E E E E E Er   