
    PL
j                        U d Z ddlZddlZddlZddlZddlZddlmZmZ ddl	m
Z
 ddlmZ ddlmZ ddlmZ dZd	Z ej        e          Zd	Zdaeeef         dz  ed
<   deeef         f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fdZ)dCdededefdZ*d edefd!Z+dDd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e0e         fd)Z1ded*edz  de0e         fd+Z2ded*edz  de#dz  fd,Z3d-edz  de4fd.Z5d/e#dz  dedz  fd0Z6ddd1ded-edz  d*edz  d/e#dz  dedz  f
d2Z7d3ede4fd4Z8d5ede0e         fd6Z9d5ede0e         fd7Z:e!e"d8d5ed9e%d:e%de0e         fd;Z;dddd<ded-edz  d*edz  d/e#dz  de4f
d=Z< G d> d?          Z=ded-edz  de>e4ef         fd@Z?	 dDded"edAe@d-edz  def
dBZAdS )EzCLI 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)Path)safe_json_loads)file_mutation_result_landedz[31mz[0m_diff_colors_cachedreturnc            	         t           t           S d} d}d}d}d}	 ddlm}  |            d	t          d
t          t
          t
          t
          f         dt          ffd} |dd          }  |dd          } |dd          }                    dd          }                    dd          }|rt          |          dk    rt          |dd         d          t          |dd         d          t          |dd         d          }}
}	dt          |	dz  d           dt          |
d z  d!           dt          |d z  d!           d"}|rt          |          dk    rt          |dd         d          t          |dd         d          t          |dd         d          }}}dt          |d z  d!           dt          |dz  d           dt          |d z  d!           d"}n# t          $ r Y nw xY w| ||||d#a t           S )$zDReturn ANSI escapes for diff display, resolved from the active skin.Nz[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;20mr   get_active_skinkeyfallback_rgbr
   c                 >                        | d          }|rst          |          dk    r`|d         dk    rTt          |dd         d          t          |dd         d          t          |dd         d          }}}d	| d
| d
| dS |\  }}}d	| d
| d
| dS )N    r   #            z[38;2;;m)	get_colorlenint)r   r   hrgbskins         1/home/kuhnn/.hermes/hermes-agent/agent/display.py_hex_fgz_diff_ansi.<locals>._hex_fg2   s    sB''A 1SVVq[[QqTS[[a!fb//3q1vr??C!A#OOa10A0000A0000"GAq!,,,A,,,,,,    
banner_dim)   r&   r&   session_label)         session_border)x   r,      ui_errorz#ef5350ui_okz#4caf50r   r   r   r   r   z[38;2;255;255;255;48;2;      r      
   r   )dimfilehunkminusplus)
r	   hermes_cli.skin_enginer   strtupler   r   r   max	Exception)r4   file_cr6   r7   r8   r   r#   err_hok_heregebor_ogobr!   s                  @r"   
_diff_ansirG   !   sz    &"" #C%F#D3E1D::::::  	- 	-E#sC-,@ 	-S 	- 	- 	- 	- 	- 	- glO44/::w'99z955~~gy11 	cSZZ1__U1Q3Z,,c%!*b.A.A3uQqSzSUCVCVBBb#b!eB--bb#b!eB--bbRUVXZ[V[\^R_R_bbbE 	cCIINNd1Q3i,,c$qs)R.@.@#d1Q3iQSBTBTRCbS!VBbb#b!eB--bbRUVXZ[V[\^R_R_bbbD    FD  s   GG' '
G43G4c                  *    t                      d         S )Nr4   rG    r$   r"   	_diff_dimrK   R   s    *,,u--r$   c                  *    t                      d         S )Nr5   rI   rJ   r$   r"   
_diff_filerM   S       *,,v..r$   c                  *    t                      d         S )Nr6   rI   rJ   r$   r"   
_diff_hunkrP   T   rN   r$   c                  *    t                      d         S )Nr7   rI   rJ   r$   r"   _diff_minusrR   U   s    *,,w//r$   c                  *    t                      d         S )Nr8   rI   rJ   r$   r"   
_diff_plusrT   V   rN   r$      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   listrZ   r   __annotations__dictr[   r:   rJ   r$   r"   rX   rX   [   sc         QQd333E4:333$)E$$?$?$?FDcDj!?????r$   rX   _tool_preview_max_lennc                 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)r<   r   rc   )rd   s    r"   set_tool_preview_max_lenrf   h   s'     /06CANNNQr$   c                      t           S )z9Return the configured max preview length (0 = unlimited).)rc   rJ   r$   r"   get_tool_preview_max_lenrh   n   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   r   N)r9   r   r=   r   s    r"   	_get_skinrj   w   sI    ::::::      tts    
  c                  4    t                      } | r| j        S dS )z2Get tool output prefix character from active skin.   ┊)rj   tool_prefix)r!   s    r"   get_skin_tool_prefixrn      s!    ;;D  5r$      ⚡	tool_namedefaultc                     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   )registryr   )rq   )rj   tool_emojisgettools.registryrs   	get_emojir=   )rp   rq   r!   overriders   emojis         r"   get_tool_emojirz      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)r{   s    r"   _oneliner      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    r7t          |                    dB          pd%          pdC}dD| d@|dd+          d*S |dEk    r7t          |                    dB          pd%          pdC}dF| d@|dd+          d*S |S | dGk    rb|                    d<dH          }t          |                    dId%                    }t          |          d+k    r|ddJ         d:z   }dK| d@| d*S |                    |           }|sdLD ]
}||v r|} n|r||vrdS ||         }t          |t                    r|r|dM         nd%}t          t          |                    }|sdS |dMk    r#t          |          |k    r|d|dNz
           d:z   }|S )OzBuild 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_typer{   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timeoutr   "r1   waitsr}   todotodosmergeFzreading task listz	updating z task(s)z	planning session_searchz	recall: "   ...memorytargetaddcontent+: "replaceold_text<missing old_text>~remove-send_message?message   zto )r   r{   r   r   r   r   r   r   r   r   )	rc   ru   appendr   r~   r   
isinstancer`   r:   )rp   r   r   primary_argsr   sidr   timeout_valparts	todos_argr   r   r   r   oldmsgr   fallback_keyvaluepreviews                       r"   build_tool_previewr      sF    ' 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  488J//5266N:NC/v//3ss8////x488J//5266N:NC/v//3ss8////N""(C((txx	2..//s88b==crc(U"C(V((((((


9
%
%C b 	 	Lt##" $  #T//tIE% *!)ars5zz""G t{{s7||g--,7Q;,'%/Nr$   r   c                     t          t          j                            |                     }|                                r|S t          j                    |z  S )zDResolve a possibly-relative filesystem path against the current cwd.)r   osr   
expanduseris_absolutecwd)r   	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.zutf-8)encodingN)	read_textFileNotFoundErrorIsADirectoryErrorUnicodeDecodeErrorOSErrorr   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.r   r   r   )_find_skill_resolve_skill_dircreater   zSKILL.mdr   >   editr   	file_path>   r   remove_filedeletec                 :    g | ]}|                                 |S rJ   )is_file).0r   s     r"   
<listcomp>z/_resolve_skill_manage_paths.<locals>.<listcomp>>  s%    QQQ$$,,..QQQQr$   *)ru   tools.skill_manager_toolr   r   r   sortedrglob)	r   r   r   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.r   r   r   r   )r   rb   ru   r   r   )rp   r   r   s      r"   _resolve_local_edit_pathsr   C  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)rZ   )r   rX   r   r[   r:   )rp   r   rZ   snapshotr   s        r"   capture_local_edit_snapshotr   V  s_    %i??E t u---H : :%3D%9%9D		""Or$   resultc                     | sdS t          |           }|dS 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.FNerrorsuccessT)r   r   rb   ru   bool)r   r   s     r"   _result_succeededr  b  s     u6""D|udD!! uxx uDDHHY''(((4r$   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>  s;      WWuENN400B55edlWWWWWWr$   )
rZ   r[   ru   r:   r   r   r~   r   
splitlinesr   )r   chunksr   r[   afterdisplay_pathdiffs          r"   _diff_from_snapshotr  r  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                &   | dk    rf|rdt          |          }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.r   r  >   r   r   r   N)r   r   rb   ru   r:   stripr  r  )rp   r   r   r   r   r  s         r"   extract_edit_diffr    s     Gv&&dD!! 	88F##D$$$  ???tV$$ tx(((r$   	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                    g }d}d}|                                  D ]}|                    d          r|dd                                         }5|                    d          rT|dd                                         }|s|r3|                    t	                       |pd d|pd t
                      |                    d          r-|                    t                       | t
                      |                    d	          r.|                    t                       | t
                      #|                    d
          r.|                    t                       | t
                      f|                    d          r.|                    t                       | t
                      |r|                    |           |S )z=Render unified diff lines in Hermes' inline transcript style.N--- r2   z+++ za/?u    → zb/?z@@r   r   r}   )
r  
startswithr  r   rM   _ANSI_RESETrP   rR   rT   rK   )r  rendered	from_fileto_fileraw_lines        r"   _render_inline_unified_diffr'    s   HIGOO%% & &v&& 	 **,,Iv&& 	qrrl((**G kG k:<< i1Ce i i'JZUZ i\g i ijjjt$$ 	OOz||DXD{DDEEEs## 	OO{}}EhEEEFFFs## 	OOz||DXD{DDEEEs## 	OOy{{CHCkCCDDD 	&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  )r~   )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|r=d| d}|r	|d| dz  }|                    t                       | t                      |S )zCRender diff sections while capping file count and total line count.r   r   Nu   … omitted z diff line(s)z across z additional file(s)/section(s))	r-  	enumerater   r'  extendr<   r   rP   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 A A==== 	PO-OOOOG:<<??+??@@@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  r~   )rp   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            
       H   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ede	fd            Z
ede	fd            Zede	f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 )-KawaiiSpinnerzJAnimated 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   █rH  rG  rF  rE  rD  rC  )   ←u   ↖   ↑u   ↗   →u   ↘   ↓u   ↙)u   ✶   ✷   ✸   ✹u   ✺rO  rN  rM  )u   🌑u   🌒u   🌓u   🌔u   🌕u   🌖u   🌗u   🌘)u   ◜u   ◠u   ◝u   ◞u   ◡u   ◟)u   🧠   💭   💡u   ✨u   💫u   🌟rQ  rP  )u   ⁺   ˚r      ✧u   ✦rS  r   rR  )	dotsbouncegrowarrowsstarmoonpulsebrainsparkle)
u   (｡◕‿◕｡)u   (◕‿◕✿)u   ٩(◕‿◕｡)۶u   (✿◠‿◠)u   ( ˘▽˘)っu   ♪(´ε` )u   (◕ᴗ◕✿)u   ヾ(＾∇＾)u   (≧◡≦)u
   (★ω★))u   (｡•́︿•̀｡)u	   (◔_◔)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
   c                     	 t                      }|r|j                            dg           }|r|S n# t          $ r Y nw xY w| j        S )zJReturn waiting faces from the active skin, falling back to KAWAII_WAITING.waiting_faces)rj   spinnerru   r=   KAWAII_WAITINGclsr!   facess      r"   get_waiting_faceszKawaiiSpinner.get_waiting_facesO  sf    	;;D !(("== ! L 	 	 	D	!!   .2 
??c                     	 t                      }|r|j                            dg           }|r|S n# t          $ r Y nw xY w| j        S )zLReturn thinking faces from the active skin, falling back to KAWAII_THINKING.thinking_faces)rj   rn  ru   r=   KAWAII_THINKINGrp  s      r"   get_thinking_facesz KawaiiSpinner.get_thinking_faces\  sg    	;;D !(()92>> ! L 	 	 	D	""rt  c                     	 t                      }|r|j                            dg           }|r|S n# t          $ r Y nw xY w| j        S )zKReturn thinking verbs from the active skin, falling back to THINKING_VERBS.thinking_verbs)rj   rn  ru   r=   THINKING_VERBS)rq  r!   verbss      r"   get_thinking_verbsz KawaiiSpinner.get_thinking_verbsi  sg    	;;D !(()92>> ! L 	 	 	D	!!rt  r   rT  Nr   spinner_typec                     || _         | j                            || j        d                   | _        d| _        d | _        d| _        d | _        d| _        || _	        t          j        | _        d S )NrT  Fr   )r   SPINNERSru   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__v  sf    "m//dmF>STT " J			r$   r  Fr{   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)r  r=   r  writer  
ValueErrorr   )r  r{   r  r  s       r"   _writezKawaiiSpinner._write  s     >%t$$$$   F	IOOD3J''' "	!!!!!" "G$ 	 	 	DD	s    
,,8A. .BB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)hasattrr  r  r  r   r  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   r  ImportError)r  r  s     r"   _is_patch_stdout_proxyz$KawaiiSpinner._is_patch_stdout_proxy  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r        ?g?HERMES_SPINNER_PAUSE  r}    (.1fs)r   r   r  r  r   gQ?)r  r  r   r  timesleepr  rj   get_spinner_wingsr   getenvr  r  r   r  r<   r  )	r  r!   wingsframeelapsedleftrightr  pads	            r"   _animatezKawaiiSpinner._animate  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)r  r  r  	threadingThreadr  r  startr  s    r"   r  zKawaiiSpinner.start  sX    < 	F)++&dmDIIIr$   new_messagec                     || _         d S N)r   )r  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  Nr}   r   (   r  z  )r  r  r<   r  )r  r{   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  )r   r}   r   r  r  r   Tr  r  r  r  r  r  z	  [done] )	r  r  r~   r  r<   r  r  r  r  )r  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  r  s    r"   	__enter__zKawaiiSpinner.__enter__	  s    

r$   c                 .    |                                   dS )NF)r  )r  exc_typeexc_valexc_tbs       r"   __exit__zKawaiiSpinner.__exit__  s    		ur$   )r   rT  N)r  Fr  )r\   r]   r^   r_   r  ro  rw  r{  classmethodr`   rs  rx  r}  r:   r  r  r  propertyr  r  r  r  r  r  r  r  r  rJ   r$   r"   rB  rB  /  sR       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 
"$ 
" 
" 
" [
" 
#4 
# 
# 
# [
# 
"4 
" 
" 
" [
"        3 S     &     X     ' ' 'R  #s # # # #9 9 9 9 9$N N# N N N N$      r$   rB  c                 .   |dS t          | |          rdS | dk    rKt          |          }t          |t                    r%|                    d          }||dk    rdd| dfS dS | d	k    rUt          |          }t          |t                    r1|                    d
          du rd|                    dd          v rdS t          |t
                    sdS |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   r   	exit_coder   Tz [exit ]r   r  Fzexceed the limitr  r   )Tz [full]i  z"error"z"failed"Error)Tz [error])r   r   r   rb   ru   r:   lowerr!  )rp   r   r   r  r  s        r"   _detect_tool_failurer    sQ    ~y"9f55 yJv&&dD!! 	4--I$a3y33333y Hv&&dD!! 	'xx	""e++0BdhhwXZF[F[0[0[&
 fc"" y4C4L  EEZ500F4E4Eg4N4N09r$   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    ry|                    db          }|                    dcdd          }| |de|           S |r |dft          |           dg|           S  |dht          |           dg|           S | dik    r/ |dj ||                    dd          d           dM|           S | dkk    r|                    d!d"          }|                    d9d          }|dlk    r2 |dm| dn ||                    d:d          dL           dM|           S |dok    r;|                    dp          pd}|r|ndq} |dr| dn ||ds           dM|           S |dtk    r;|                    dp          pd}|r|ndq} |du| dn ||ds           dM|           S  |dv| d|           S | dwk    r% |dx|                    dydz           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"           dn ||                    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 | 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  r   r  c                     t          |           } t          dk    r| S t          }t          |           |k    r| d |dz
           dz   n| S )Nr   r   r   r:   rc   r   )r   rd   limits      r"   _truncz%get_cute_tool_message.<locals>._truncK  sL    FF A%%H%(+A(57(e##A=r$   #   c                     t          |           } t          dk    r| S t          }t          |           |k    rd| |dz
   d          z   n| S )Nr   r   r   r  )prd   r  s      r"   _pathz$get_cute_tool_message.<locals>._pathR  sN    FF A%%H%+.q66E>>E!G*++&&q@r$   r  r
   c                 R    dk    r|                      dd          } s| S |   S )z*Apply skin tool prefix and failure suffix.rl   r   )r   )r  failure_suffix
is_failureskin_prefixs    r"   _wrapz$get_cute_tool_message.<locals>._wrapY  sA    %<<{A66D 	K((((r$   r   u   ┊ 🔍 search    r   r   *   r  r   r   r   zhttps://zhttp:///r   z +u   ┊ 📄 fetch     u   ┊ 📄 fetch     pages  	web_crawlr   u   ┊ 🕸️  crawl     r   u   ┊ 💻 $         r   r   r   r   r   N   zls processeszpoll zlog zwait zkill zwrite zsubmit )r`   polllogr   killr  submitu   ┊ ⚙️  proc      r}   r   u   ┊ 📖 read      r   r   u   ┊ ✍️  write     r   u   ┊ 🔧 patch     r   r   r   r   r   findgrepu	   ┊ 🔎 9r   u   ┊ 🌐 navigate  browser_snapshotfullcompactu   ┊ 📸 snapshot  r   u   ┊ 👆 click     r   r   u   ┊ ⌨️  type      "r{      z"  browser_scroll	directiondownrL  rJ  rK  rI  )r  upr  r  u   ┊ z  scroll    browser_backu   ┊ ◀️  back      browser_pressu   ┊ ⌨️  press     r   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   r   r   u   ┊ 🧠 memory    ~r1   r   u   ┊ 🧠 memory    -u   ┊ 🧠 memory    r   u   ┊ 📚 skills    list r   allr   u   ┊ 📚 skill     r   r   u   ┊ 🎨 create    r   r   u   ┊ 🔊 speak     r   u   ┊ 👁️  vision    r   r   u   ┊ 🧠 reason    r   r   u   ┊ 📨 send      r   r   r   r   skillsskilltasku   ┊ ⏰ cron      create    r`   u   ┊ ⏰ cron      listing  u   ┊ ⏰ cron      job_idr   r   r  u   ┊ 🐍 exec      r   tasksu   ┊ 🔀 delegate  z parallel tasks  r   u   ┊ ⚡ 	   )r  )r  )r  rn   r:   ru   r   r`   r   r   r   r  r   )!rp   r   r  r   durr  r  r  r   r   domainextrar   r   labelsr   r   verbmodedarrowr   r   r   r  labelr   
first_liner  r   r  r  r  s!                                 @@@r"   get_cute_tool_messager
  =  s    



C!5i!H!HJ&((K> > > >A A A A)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(((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  ((:&&,"C6##"6C5VVVFF3OOVVQTVVWWWx((:&&,"C6##"6C5VVVFF3OOVVQTVVWWW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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$   )ro   r  )Br_   loggingr   r  r  r  dataclassesr   r   difflibr   pathlibr   utilsr    agent.tool_result_classificationr   _RED_RESET	getLoggerr\   r<  r"  r	   rb   r:   ra   rG   rK   rM   rP   rR   rT   _MAX_INLINE_DIFF_FILES_MAX_INLINE_DIFF_LINESrX   rc   r   rf   rh   rj   rn   rz   r   r   r   r   r   r`   r   r   r   r  r  r  r  r  r'  r-  r:  r@  rB  r;   r  floatr
  rJ   r$   r"   <module>r     sW      				 



      ( ( ( ( ( ( ( (                   ! ! ! ! ! ! H H H H H H 			8	$	$
 .2 T#s(^d* 1 1 1-DcN - - - -b . - - . . . . . . / / / . . .   @ @ @ @ @ @ @ @  s   7 7 7 7 7 7!# ! ! ! !  c     c C C    <"3 "3 " " " "
[ [# [T [C$J [RUX\R\ [ [ [ [D" " " " " " #*    T c    d tDz    < TD[ TRVZ    &	3 	td{ 	O`cgOg 	 	 	 	cDj T     X"3d": XsTz X X X XB "&)-) ) ))$J) $;	)
  $&) 	4Z) ) ) ),
 
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:` ` ` ` ` ` ` `N$C $t $dCi@P $ $ $ $P GKWL WLWLWL*/WL9<tWLWL WL WL WL WL WLr$   