
    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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+dJdededefdZ,d edefd!Z-d ed"e'dz  defd#Z.d$ed%e'de/e'e0e   f   fd&Z1dKded'ed"e'dz  dedz  fd(Z2d)edefd*Z3d)ededz  fd+Z4d)edefd,Z5d'ede0e   fd-Z6ded.edz  de0e   fd/Z7ded.edz  de%dz  fd0Z8d1edz  de9fd2Z:d3e%dz  dedz  fd4Z;ddd5ded1edz  d.edz  d3e%dz  dedz  f
d6Z<d7ede9fd8Z=d9ede0e   fd:Z>d9ede0e   fd;Z?e#e$d<d9ed=e'd>e'de0e   fd?Z@dddd@ded1edz  d.edz  d3e%dz  de9f
dAZA G dB dC      ZBdDZCdEedefdFZDded1edz  de/e9ef   fdGZE	 dKded'edHeFd1edz  def
dIZGy)LzCLI 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)Any)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      }j                  dd      }j                  dd      }|rnt        |      dk(  r`t        |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!}|rnt        |      dk(  r`t        |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!}| ||||d"a t         S # t        $ r Y w xY w)#zDReturn ANSI escapes for diff display, resolved from the active skin.z[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                     j                  | d      }|rOt        |      dk(  rA|d   dk(  r9t        |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         /home/cube/projects/richard/traning coach/.omo/evidence/nutricoach-v150-combined/st_01a0560c-r63-installed-wheel-first-claim-qa/venv/lib/python3.12/site-packages/agent/display.py_hex_fgz_diff_ansi.<locals>._hex_fg3   s    sB'ASVq[QqTS[a!fb/3q1vr?C!AOa1#A3as!A3a00"GAq!s!A3as!,,    
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)r5   file_cr7   r8   r9   r   r$   err_hok_heregebor_ogobr"   s                  @r#   
_diff_ansirH   "   s    &"" #C%F#D3E1D: 	- 	-E#sC-,@ 	-S 	- lO4/:'9z95~~gy1SZ1_U1QZ,c%!*b.A3uQqzSUCVBB1#b!eB-#b!eB-PQRUVXZ[V[\^R_Q``abECINd1Qi,c$q)R.@#d1QiQSBTRC0S!VB0@#b!eB-PQRUVXZ[V[\^R_Q``abD
 FD   s   EE= =	F	F	c                      t               d   S )Nr5   rH    r%   r#   	_diff_dimrL   S   s    *,u--r%   c                      t               d   S )Nr6   rJ   rK   r%   r#   
_diff_filerN   T       *,v..r%   c                      t               d   S )Nr7   rJ   rK   r%   r#   
_diff_hunkrQ   U   rO   r%   c                      t               d   S )Nr8   rJ   rK   r%   r#   _diff_minusrS   V   s    *,w//r%   c                      t               d   S )Nr9   rJ   rK   r%   r#   
_diff_plusrU   W   rO   r%      P   c                   `    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<   y)LocalEditSnapshotzGPre-tool filesystem snapshot used to render diffs locally after writes.)default_factorypathsNbefore)__name__
__module____qualname____doc__r   listr[   r   __annotations__dictr\   r;   rK   r%   r#   rY   rY   \   s4    Qd3E4:3$)$$?FDcDj!?r%   rY   _tool_preview_max_lennc                 8    | rt        t        |       d      ayday)z?Set the global max length for tool call previews. 0 = no limit.r   N)r=   r   rd   )re   s    r#   set_tool_preview_max_lenrg   i   s     /0CANQr%   c                      t         S )z9Return the configured max preview length (0 = unlimited).)rd   rK   r%   r#   get_tool_preview_max_lenri   o   s      r%   c                  <    	 ddl m}   |        S # t        $ r Y yw xY w)z5Get the active skin config, or None if not available.r   r   N)r:   r   r>   r   s    r#   	_get_skinrk   x   s%    :   s    	c                  4    t               } | r| j                  S y)z2Get tool output prefix character from active skin.   ┊)rk   tool_prefix)r"   s    r#   get_skin_tool_prefixro      s    ;Dr%   	tool_namedefaultc                     t               }|r+|j                  r|j                  j                  |       }|r|S 	 ddlm} |j                  | d      }|r|S 	 |S # t        $ r Y |S w xY w)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   )rk   tool_emojisgettools.registryrs   	get_emojir>   )rp   rq   r"   overriders   emojis         r#   get_tool_emojirz      s~     ;D  ##''	2O+""9b"9L 
 N  Ns   A 	A&%A&textc                 @    dj                  | j                               S )z:Collapse whitespace (including newlines) to single spaces. )joinsplit)r{   s    r#   _oneliner      s    88DJJL!!r%   max_lenc                 Z    |r(|dkD  r#t        |       |kD  r|dk  rd|z  S | d |dz
   dz   S | S )Nr   r   ....)r   )r{   r   s     r#   _truncate_previewr      sB    7Q;3t9w#6a<= LWq[!E))Kr%   tasksper_goal_lenc                   t        | t              sdg fS g }| D ][  }t        |t              s|j                  d      }|dnt	        t        |            }|j                  t        |xs d|             ] t        |      |fS )Nr   goal?)	
isinstancera   rc   ru   r   r;   appendr   r   )r   r   goalstaskraw_goalr   s         r#   _delegate_task_goal_partsr      s}    eT""uE$%88F#&sHS],C&t{sLAB  u:ur%   argsc                    |t         }|sy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|j                  d%      }|rSt        |t              rCt	        |d&'      \  }}|r| d(d)j                  |      z   nt        |       d*}t        ||      S |j                  d"d+      }|yt        t        |            }|rt        ||      S dS | d,k(  r|j                  d d+      }	|j                  d-d+      }
|j                  d.d+      }|j                  d/      }|	g}|
r|j                  |
dd0        |r!|j                  d1t        |dd2        d1       |r|	d3k(  r|j                  | d4       |rd5j                  |      S dS | d6k(  rF|j                  d7      }|j                  d8d9      }|y:|rd;t        |       d<S d=t        |       d<S | d>k(  r9t        |j                  dd+            }d?|dd@  t        |      d@kD  rdA d1S d+ d1S | dBk(  r|j                  d d+      }	|j                  dCd+      }|	dDk(  r<t        |j                  dEd+            }dF| dG|dd@  t        |      d@kD  rdA d1S d+ d1S |	dHk(  r.t        |j                  dI      xs d+      xs dJ}dK| dG|dd2  d1S |	dLk(  r.t        |j                  dI      xs d+      xs dJ}dM| dG|dd2  d1S |	S | dNk(  rL|j                  dCdO      }t        |j                  dPd+            }t        |      d2kD  r|ddQ dAz   }dR| dG| d1S |j                  |       }|sdSD ]
  }||v s|} n |r||vry||   }t        |t              r	|r|dT   nd+}t        t        |            }|sy|dTkD  rt        |      |kD  r|d|dUz
   dAz   }|S )VzBuild 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coder   )execute_codedelegate_taskclarifyskill_manager   r   (   r   z tasks:  | z parallel tasksr   process
session_iddatatimeoutr   "r2   waitsr}   todotodosmergeFzreading task listz	updating z task(s)z	planning session_searchz	recall: "   r   memorytargetaddcontent+: "replaceold_text<missing old_text>~remove-send_messager   message   zto )r   r{   r   r   r   r   r   r   r   r   )rd   ru   r   ra   r   r~   r   r   r   r;   r   )rp   r   r   primary_argsr   
task_countr   previewr   r   sidr   timeout_valparts	todos_argr   r   r   r   oldmsgr   fallback_keyvalues                           r#   build_tool_previewr      s    'I+W6CVV)63:F 		 $6u 		 !/	
 	(
 %5f 	* ':= 	f ,Z 	8 vL O#!Zt, 9%b QJ  ,h'%**U*;;!$UO<  %Wg66xx#<3t9%6= '2G4GI(B'hh|R(xx#hhy)LLSb"LL1Xd3Bi01346V+LLK=*+"'sxx1T1FHHW%	%(&s9~.h77s9~.h77$$'2./E#2J<Ub'ILLb'ILLH(B'(B'U?txx	267Gvhd73B<.#g,:K0TTVWWQS0TTVWWy 488J/526N:NCvhd3s8*B//x488J/526N:NCvhd3s8*B//N"(C(txx	2./s8b=cr(U"CVHDR((


9
%CbLt#" c
 #T/IE%!ars5z"G{s7|g-,7Q;'%/Nr%   r   c                     t        t        j                  j                  |             }|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   3  s>    RWW''-.I88:	!!r%   c                 f    	 | j                  d      S # t        t        t        t        f$ r Y y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   ;  s5    ~~w~//02DgN s    00c                     	 t        | j                         j                  t        j                         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   C  sK    4<<>--dhhj.@.@.BCDD 4ys   AA
 
A! A!c                    | j                  d      }| j                  d      }|r|sg S ddlm}m} |dk(  r ||| j                  d            }|dz  gS  ||      }|sg S t	        |d         }|d	v r| j                  d
      }|r||z  gS |dz  gS |dv r| j                  d
      }|r||z  gS g S |dk(  r:t        |j                  d            D cg c]  }|j                         s| }	}|	S g S c c}w )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delete*)ru   tools.skill_manager_toolr   r   r   sortedrglobis_file)
r   r   r   r   r   	skill_direxistingr   r   filess
             r#   _resolve_skill_manage_pathsr  K  s   XXhF88FD	H&tTXXj-AB	J&''4 H	Xf%&I""HH[)	*3	I%&Q)j:P9QQ..HH[)	*3	I%&;;"()=">Q">$$,,.">QI Rs   C1'C1function_argsc                     t        |t              sg S | dk(  r!|j                  d      }|rt        |      gS g S | dk(  r!|j                  d      }|rt        |      gS g S | dk(  rt	        |      S g S )z9Resolve local filesystem targets for write-capable tools.r   r   r   r   )r   rc   ru   r   r  )rp   r  r   s      r#   _resolve_local_edit_pathsr  i  s    mT*	L   ()-t$%525G  ()-t$%525N"*=99Ir%   c                     t        | |      }|syt        |      }|D ]#  }t        |      |j                  t	        |      <   % |S )z.Capture before-state for local write previews.N)r[   )r  rY   r   r\   r;   )rp   r  r[   snapshotr   s        r#   capture_local_edit_snapshotr
  |  sD    %i?E u-H%3D%9D	" Or%   resultc                     | syt        |       }|yt        |t              sy|j                  d      ryd|v rt	        |j                  d            S y)z?Conservatively detect whether a tool result represents success.FerrorsuccessT)r   r   rc   ru   bool)r  r   s     r#   _result_succeededr    sU    6"D|dD!xxDDHHY'((r%   r	  c           
         | syg }| j                   D ]  }| j                  j                  t        |            }t	        |      }||k(  r8t        |      }dj                  t        |g n|j                  d      |g n|j                  d      d| d|             }|s|j                  |        |sydj                  d |D              S )	zHGenerate unified diff text from a stored before-state and current files.Nr   T)keependsza/zb/)fromfiletofilec              3   L   K   | ]  }|j                  d       r|n|d z     yw)
N)endswith).0chunks     r#   	<genexpr>z&_diff_from_snapshot.<locals>.<genexpr>  s'     WPVuENN405edlBPVs   "$)
r[   r\   ru   r;   r   r   r~   r   
splitlinesr   )r	  chunksr   r\   afterdisplay_pathdiffs          r#   _diff_from_snapshotr     s    F$$SY/t$U?)$/wwn&*;*;T*;*Jm)9)94)9)Hl^,L>*	
 MM$! $ 77WPVWWWr%   r  r	  c                    | dk(  rP|rNt        |      }t        |t              r3|j                  d      }t        |t              r|j                         r|S | dvryt        |      syt        |      S )z4Extract a unified diff from a file-edit tool result.r   r  >   r   r   r   N)r   r   rc   ru   r;   stripr  r   )rp   r  r  r	  r   r  s         r#   extract_edit_diffr$    si     Gv&dD!88F#D$$??V$x((r%   	diff_textc                     || sy	  |d       | j                  d      j                         D ]
  } ||        y# t        $ r Y yw xY w)zFEmit rendered diff text through the CLI's prompt_toolkit-safe printer.Fu     ┊ review diffr  T)rstripr  r>   )r%  print_fnlines      r#   _emit_inline_diffr*    sU    y$%$$T*557DTN 8 s   4< 	AAr  c                    g }d}d}| j                         D ]j  }|j                  d      r|dd j                         })|j                  d      rF|dd j                         }|s|r.|j                  t	                |xs d d|xs d t
                |j                  d      r$|j                  t                | t
                |j                  d	      r$|j                  t                | t
                |j                  d
      r%|j                  t                | t
                 |j                  d      r%|j                  t                | t
                V|sZ|j                  |       m |S )z=Render unified diff lines in Hermes' inline transcript style.N--- r3   z+++ za/?u    → zb/?z@@r   r   r}   )
r  
startswithr#  r   rN   _ANSI_RESETrQ   rS   rU   rL   )r  rendered	from_fileto_fileraw_lines        r#   _render_inline_unified_diffr3    sg   HIGOO%v& **,Iv&qrl((*GG:<.1Ce0DE'JZUZI[\g[h ijt$OOz|nXJ{mDEs#OO{}ohZ}EFs#OOz|nXJ{mDEs#OOy{mH:k]CDOOH%- &0 Or%   c                    g }g }| j                         D ];  }|j                  d      r|r|j                  |       |g}+|j                  |       = |r|j                  |       |D cg c]  }|sdj                  |       c}S c c}w )z,Split a unified diff into per-file sections.r,  r  )r  r-  r   r~   )r  sectionscurrentr)  sections        r#   _split_unified_diff_sectionsr8    s     "HG!??6"wOOG$fGt "  .6Bh7'DIIghBBBs   *B2B)	max_files	max_linesr9  r:  c          	      |   t        |       }g }d}d}t        |      D ]  \  }}||k\  r|dz  }|t        t        |            z  }(t        |      }	|t        |      z
  }
|
dk  r|t        |	      z  }|dz  }Zt        |	      |
k  r|j	                  |	       z|j	                  |	d|
        |t        |	      |
z
  z  }|dt        dt        |      |z
  dz
        z   z  }||dz   d D ]  }|t        t        |            z  }  n |s|r4d| d}|r	|d| dz  }|j                  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))	r8  	enumerater   r3  extendr=   r   rQ   r.  )r  r9  r:  r5  r/  omitted_filesomitted_linesidxr7  section_linesremaining_budgetleftoversummarys                r#   !_summarize_rendered_diff_sectionsrE    s{    ,D1HHMM!(+W)QMS!<W!EFFM3G<$s8}4q S//MQM}!11OOM*&7'789]+.>>>SCMC$7!$;<<< q*HS!<X!FGGM +- ,0  }=-0NOOG:<.	+?@Or%   )r  r	  r(  c                    t        | |||      }|sy	 t        |      }t        dj                  |      |      S # t        $ r }t        j	                  d|       Y d}~yd}~ww xY w)z?Render an edit diff inline without taking over the terminal UI.r!  Fz Could not render inline diff: %sNr  )r$  rE  r>   loggerdebugr*  r~   )rp   r  r  r	  r(  r  rendered_linesexcs           r#   render_edit_diff_with_deltarK  8  sm     #	D :4@ TYY~6AA  7=s   : 	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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y))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   █rS  rR  rQ  rP  rO  rN  )   ←u   ↖   ↑u   ↗   →u   ↘   ↓u   ↙)u   ✶   ✷   ✸   ✹u   ✺rZ  rY  rX  )u   🌑u   🌒u   🌓u   🌔u   🌕u   🌖u   🌗u   🌘)u   ◜u   ◠u   ◝u   ◞u   ◡u   ◟)u   🧠   💭   💡u   ✨u   💫u   🌟r\  r[  )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	   (¬‿¬)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                  j                  dg       }|r|S | j                  S # t        $ r Y | j                  S w xY w)zJReturn waiting faces from the active skin, falling back to KAWAII_WAITING.waiting_faces)rk   spinnerru   r>   KAWAII_WAITINGclsr"   facess      r#   get_waiting_faceszKawaiiSpinner.get_waiting_facesu  s]    	;D(("= L !!!  	!!!	   +: 	AAc                     	 t               }|r |j                  j                  dg       }|r|S | j                  S # t        $ r Y | j                  S w xY w)zLReturn thinking faces from the active skin, falling back to KAWAII_THINKING.thinking_faces)rk   ry  ru   r>   KAWAII_THINKINGr{  s      r#   get_thinking_facesz KawaiiSpinner.get_thinking_faces  s^    	;D(()92> L """  	"""	r  c                     	 t               }|r |j                  j                  dg       }|r|S | j                  S # t        $ r Y | j                  S w xY w)zKReturn thinking verbs from the active skin, falling back to THINKING_VERBS.thinking_verbs)rk   ry  ru   r>   THINKING_VERBS)r|  r"   verbss      r#   get_thinking_verbsz KawaiiSpinner.get_thinking_verbs  s^    	;D(()92> L !!!  	!!!	r  Nr   spinner_typec                     || _         | j                  j                  || j                  d         | _        d| _        d | _        d| _        d | _        d| _        || _	        t        j                  | _        y )Nr_  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__  se    "mm//dmmF>ST " JJ	r%   r{   endflushc                    | j                   	 | j                  |       y	 | j                  j                  ||z          |r| j                  j	                          yy# t        $ r Y yw xY w# t
        t        f$ r Y y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$ 	IIOOD3J'		!    G$ 		s"   A :A, 	A)(A),A>=A>c                     	 t        | j                  d      xr | j                  j                         S # t        t        f$ r Y y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  sA    	499h/FDII4D4D4FFG$ 		s   14 AAc                 Z    	 ddl m} t        | j                  |      S # t        $ r Y y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  s-    	?dii55 		s    	**c                 <   | j                   sO| j                  d| j                   d       | j                  r"t	        j
                  d       | j                  r"y | j                         r/| j                  r"t	        j
                  d       | j                  r"y t               }|r|j                         ng }| j                  rWt        j                  d      rt	        j
                  d       8| j                  | j                  t        | j                        z     }t	        j                         | j                  z
  }|r<|| j                  t        |      z     \  }}d| d| d| j                   d| d	|d
d}nd| d| j                   d	|d
d}t        | j                   t        |      z
  d      }| j                  d| d|z   dd       t        |      | _        | xj                  dz  c_        t	        j
                  d       | j                  rVy y )Nz	  [tool] Tr        ?g?HERMES_SPINNER_PAUSE  r}    (.1fs)r   r   r  r  r   gQ?)r  r  r   r  timesleepr  rk   get_spinner_wingsr   getenvr  r  r   r  r=   r  )	r  r"   wingsframeelapsedleftrightr)  pads	            r#   _animatezKawaiiSpinner._animate  s    ||KK)DLL>2$K?,,

3 ,, &&(,,

3 ,, {,0&&(bllyy/0

3''T=P=P9Q(QREiikDOO3G#DNNSZ$?@eD65'4<<.%73-rRE7!DLL>GC=Cd((3t94a8CKK"TF39+.BdKC!$TDNNaNJJt llr%   c                     | j                   ry d| _         t        j                         | _        t        j                  | j
                  d      | _        | j                  j                          y )NT)r   daemon)r  r  r  	threadingThreadr  r  startr  s    r#   r  zKawaiiSpinner.start   sH    <<))+&&dmmDIr%   new_messagec                     || _         y N)r   )r  r  s     r#   update_textzKawaiiSpinner.update_text  s	    "r%   c                     | j                   s| j                  d| d       ydt        | j                  dz   d      z  }| j                  d| d	| d       y)
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   r  z  )r  r  r=   r  )r  r{   blankss      r#   print_abovezKawaiiSpinner.print_above  s_     ||KK"TF4K0 s4--1266bTF+48r%   final_messagec                    d| _         | j                  r| j                  j                  d       | j                  }|r4dt	        | j
                  dz   d      z  }| j                  d| ddd	
       |rf| j                  r&dt        j                         | j                  z
  ddnd}|r| j                  d| d	       y | j                  d| | d	       y y )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    ;;KKS) 3t11A5r::FKK"VHBRtK<DHOO499;8=R@Y[Gb0=iwi@M r%   c                 &    | j                          | S r  )r  r  s    r#   	__enter__zKawaiiSpinner.__enter__/  s    

r%   c                 $    | j                          y)NF)r  )r  exc_typeexc_valexc_tbs       r#   __exit__zKawaiiSpinner.__exit__3  s    		r%   )r   r_  N)r  Fr  )r]   r^   r_   r`   r  rz  r  r  classmethodra   r~  r  r  r;   r  r  r  propertyr  r  r  r  r  r  r  r  r  rK   r%   r#   rM  rM  U  s   T WJrJHP;PE
HN
ON 
"$ 
" 
" 
#4 
# 
# 
"4 
" 
"   3 S  &     'R#s #9 9$N# N$r%   rM  0   r   c                     | j                         } d| v rA| j                  d      \  }}}|j                         }d|v rd|j                  dd      d    } t        |       t        kD  r| dt        dz
   dz   } | S )	zShrink an error message for inline display in a tool status line.

    Strips overly long absolute paths down to just the filename so the
    suffix stays readable on narrow terminals.
    zFile not found:/zFile not found: r   Nr   r   )r#  	partitionrsplitr   _ERROR_SUFFIX_MAX_LEN)r   _tails      r#   _trim_errorr  ?  s     ))+CC]]#45
1dzz|$;$T[[a%8%<$=>C
3x''-)A-.6Jr%   c                    |yt        | |      ryt        |      }| dk(  r^t        |t              rM|j	                  d      }|:|dk7  r5|j	                  d      }|rddt        t        |             d	fS dd
| d	fS y| dk(  r8t        |t              r(|j	                  d      du rd|j	                  dd      v ryt        |t              rW|j	                  d      xs |j	                  d      }|r1|j	                  d      du sd|v rddt        t        |             d	fS t        |t              sy|dd j                         }d|v sd|v s|j                  d      ryy)aF  Inspect a tool result string for signs of failure.

    Returns ``(is_failure, suffix)`` where *suffix* is a short informational
    tag like ``" [exit 1]"`` for terminal failures, ``" [full]"`` for memory
    overflow, or a trimmed error message (``" [File not found: foo.py]"``).
    On success returns ``(False, "")``.
    N)Fr   r   	exit_coder   r  Tz []z [exit r   r  Fzexceed the limitr   )Tz [full]r   i  z"error"z"failed"Error)Tz [error])	r	   r   r   rc   ru   r  r;   lowerr-  )rp   r  r   r  err_msgerrr  s          r#   _detect_tool_failurer  Q  sw    ~"9f56"D JdD!-I$a((7+2k#g,&?%@!BBBwyk333 HdD!xx	"e+0BdhhwXZF[0[& $hhw6488I#6DHHY'50GtO2k#c(34A666
 fc"4CL EEZ50F4E4Eg4Nr%   durationc                 
  &'( |dd}t        | |      \  '&t               (dd}dd}dt        dt        f&'(fd}| d	k(  r% |d
 ||j                  dd      d       d|       S | dk(  r|j                  dg       }|rt	        |t
              r|d   n
t        |      }	|	j                  dd      j                  dd      j                  d      d   }
t        |      dkD  rdt        |      dz
   nd} |d ||
d       | d|       S  |d|       S | dk(  r% |d ||j                  dd      d       d|       S | dk(  rf|j                  dd      }|j                  dd      d d! }d"d#| d$| d%| d&| d'| d(| d)} |d*|j                  || d+|        d|       S | d,k(  r$ |d- ||j                  d.d             d|       S | d/k(  r$ |d0 ||j                  d.d             d|       S | d1k(  r$ |d2 ||j                  d.d             d|       S | d3k(  rF ||j                  d4d      d      }|j                  d5d6      }|d7k(  rd8nd9} |d:|d;d+| d|       S | d<k(  r[|j                  d=d      }	|	j                  dd      j                  dd      j                  d      d   }
 |d> ||
d       d|       S | d?k(  r#|j                  d@      rd@ndA} |dB| d|       S | dCk(  r |dD|j                  dEd       d|       S | dFk(  r% |dG ||j                  dHd      dI       dJ|       S | dKk(  r:|j                  dLdM      }dNdOdPdQdRj                  |dN      } |dS| dT| d|       S | dUk(  r |dV|       S | dWk(  r |dX|j                  dYd       d|       S | dZk(  r |d[|       S | d\k(  r |d]|       S | d^k(  r|j                  d_      }|j                  d`da      }d}d}|rD	 t        |      }|r6|j                  dbi       }|j                  dcd      }|j                  ddd      }|!|dkD  r |de| d| df|       S  |dg|       S |r2|dkD  r|dkD  r |dh| d| di|       S  |dht        |       df|       S |dkD  r|dkD  r |de| d| df|       S  |det        |       df|       S | djk(  r% |dk ||j                  dd      d       dJ|       S | dlk(  r|j                  dd      }|j                  d5d      }|dmk(  r( |dn| do ||j                  d6d      dI       dJ|       S |dpk(  r3|j                  dq      xs d}|r|ndr} |ds| do ||dt       dJ|       S |duk(  r3|j                  dq      xs d}|r|ndr} |dv| do ||dt       dJ|       S  |dw| d|       S | dxk(  r |dy|j                  dzd{       d|       S | d|k(  r% |d} ||j                  d~d      dI       d|       S | dk(  r% |d ||j                  dd      d       d|       S | dk(  r% |d ||j                  dHd      dI       d|       S | dk(  r% |d ||j                  dd      dI       d|       S | dk(  r% |d ||j                  dd      dI       d|       S | dk(  r8 |d|j                  d5d       do ||j                  dd      d       dJ|       S | dk(  r|j                  dd      }|dk(  r}|j                  d      xs% |j                  d      sg n|j                  d      g}|j                  d~      xs |r|d   nd xs |j                  dd      } |d ||d       d|       S |dk(  r |d|       S  |d| d+|j                  dd       d|       S | dk(  r[|j                  dd      }|j                         r"|j                         j                  d      d   nd} |d ||d       d|       S | dk(  r|j                  d      } | r\t	        | t
              rLt        | dI      \  }!}"|"rdj                  |"      nd}#|!xs t        |       }$ |d|$ d ||#d       d|       S  |d ||j                  dd      d       d|       S t        | |      xs d}% |d| d d d;d+ ||%d       d|       S # t        $ r Y w xY w)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   c                 p    t        |       } t        dk(  r| S t        }t        |       |kD  r| d |dz
   dz   S | S )Nr   r   r   r;   rd   r   )r   re   limits      r#   _truncz%get_cute_tool_message.<locals>._trunc  sA    F A%H%(+A(57e#=A=r%   #   c                 r    t        |       } t        dk(  r| S t        }t        |       |kD  rd| |dz
   d  z   S | S )Nr   r   r   r  )pre   r  s      r#   _pathz$get_cute_tool_message.<locals>._path  sC    F A%H%+.q6E>E!G*+&@q@r%   r)  r   c                 H    dk7  r| j                  dd      } s| S |   S )z*Apply skin tool prefix and failure suffix.rm   r   )r   )r)  failure_suffix
is_failureskin_prefixs    r#   _wrapz$get_cute_tool_message.<locals>._wrap  s5    %<<{A6DK'((r%   r   u   ┊ 🔍 search    r   r   *   r  r   r   r   zhttps://zhttp://r  r   z +u   ┊ 📄 fetch     u   ┊ 📄 fetch     pages  r   u   ┊ 💻 $         r   r   r   r   r   N   zls processeszpoll zlog zwait zkill zwrite zsubmit )ra   polllogr   killr  submitu   ┊ ⚙️  proc      r}   r   u   ┊ 📖 read      r   r   u   ┊ ✍️  write     r   u   ┊ 🔧 patch     r   r   r   r   r  findgrepu	   ┊ 🔎 9r   r   u   ┊ 🌐 navigate  browser_snapshotfullcompactu   ┊ 📸 snapshot  r   u   ┊ 👆 click     r   r   u   ┊ ⌨️  type      "r{      z"  browser_scroll	directiondownrW  rU  rV  rT  )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   FrD  total	completedu   ┊ 📋 plan      z
 task(s)  u"   ┊ 📋 plan      reading tasks  u   ┊ 📋 plan      update u    ✓  r   u   ┊ 🔍 recall    "r   r   u   ┊ 🧠 memory    +r   r   r   r   u   ┊ 🧠 memory    ~r2   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skillr   u   ┊ ⏰ cron      create    ra   u   ┊ ⏰ cron      listing  u   ┊ ⏰ cron      job_idr   r   r  u   ┊ 🐍 exec      r   r   r   r   parallelu   ┊ 🔀 delegate  zx: r   u   ┊ ⚡ 	   )r   )r  )r  ro   r;   ru   r   ra   r   r   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  doner   r   r   r  labelr   
first_liner   r   r   detailcount_labelr   r  r  r  s)                                         @@@r#   get_cute_tool_messager"    s?    cN!
C!5i!HJ&(K>A)C )C ) L *6$((7B2G+L*MRPSuUVVM!xx#'d3$q'TC[[R088BGMMcRSTUF*-d)a-bT1&RE.vfb/A.B5'C5QRR1#788J*6$((9b2I2+N*OrRUQVWXXI(C(hh|R("-(E#-$se!#-56RUQVelmplqcrt-fjjF81SEAR.S-TTVWZV[\]]K*5&"1E+F*Gr#OPPL -eDHHVR4H.I-J"SERSSG*5&"1E+F*Gr#OPPN")R0"5(I.7*vya'"SE:;;&&hhub!Z,44YCII#NqQ*6&"+=*>bFGG&&&)vy*4&3%899O#*488E3+?*@3%HIIN"/txx7KR0P/QQUVYUZ[\\$$HH[&)eeUKOOPQSXYtE7,qcC59::N"-cU344O#-dhhuc.B-C2cUKLL((:3%@AA$$>seDEEFHHW%	%(&v.B/AEE'1-E55a0D qy24&%
3%PQQ=cUCDDqyTAX9$qvcUSTT5c)n5EZPSuUVVqyTAX24&%
3%PQQ.s9~.>jNOO$$,VDHHWb4I2-N,OtTWSXYZZH(C((B'U?/xtF488IWYCZ\^<_;``dehdijkky ((:&,"C#"6C/xtF3O;LDQTPUVWWx((:&,"C#"6C/xtF3O;LDQTPUVWW*6("SE:;;M!/U0K/LBseTUUL *6$((622F+K*LBseTUU$$*6$((8R2H"+M*NbQTPUVWW$$*6$((622F+K*LBseTUU$$.vdhhz26NPR/S.TTVWZV[\]]''*6$((="2Mr+R*SSUVYUZ[\\N"*488Hc+B*C4txxXaceOfhjHkGllpqtpuvwwI(C(XXXh'adhhw6GBdhhW^N_M`FHHV$ef$e488T\^dKeE4VE25F4Gr#OPPV6se<==)&488Hb3I2J"SERSSN"xx#48JJLTZZ\''-a0b
*6*b+A*B"SEJKKO#!Zt, 9%b QJ*/UZZ&ZF$2E
K.{m3vfb?Q>RRTUXTYZ[[*6$((622F+K*LBseTUU D17RG8IbqM!,AfWb.A-B"SEJKKG  s   
Ac5 5	dd)u   ⚡r  )Hr`   loggingr   r  r  r  dataclassesr   r   difflibr   pathlibr   typingr   utilsr    agent.tool_result_classificationr	   _RED_RESET	getLoggerr]   rG  r.  r
   rc   r;   rb   rH   rL   rN   rQ   rS   rU   _MAX_INLINE_DIFF_FILES_MAX_INLINE_DIFF_LINESrY   rd   r   rg   ri   rk   ro   rz   r   r   r<   ra   r   r   r   r   r   r  r  r
  r  r  r   r$  r*  r3  r8  rE  rK  rM  r  r  r  floatr"  rK   r%   r#   <module>r0     s    	 
   (     ! H 				8	$
 .2 T#s(^d* 1-DcN -b . . . / .   @ @ @  s 7 7 7!# !c c C C <"3 "3 "
C #*  
S 
3 
5dSViCX 
k# kT kC$J kRUX\R\ kd" " " #* T c d tDz < TD[ TRVZ &	3 	td{ 	O`cgOg 	cDj T  X"3d": XsTz XB "&)-))$J) $;	)
  $&) 	4Z),
 
4 
c d3i BCs CtCy C* ,+	*
* * 	*
 
#Y*b "&)-BB$JB $;	B
  $&B 
B:` `N  S S $/C /t /dCi@P /f GKhLhLhL*/hL9<thLhLr%   