
    (Gj                        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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.dded edefd!Z/d"edefd#Z0d"ed$e*dz  defd%Z1h d&Z2h d'Z3d(edefd)Z4d*ede5e         fd+Z6d*edefd,Z7d-ede5e         fd.Z8d*edefd/Z9d*edefd0Z:d*ede;fd1Z<d-edefd2Z=d3edefd4Z>d5ed6edefd7Z?ded3edz  dedz  fd8Z@d9ed:e*deAe*e5e         f         fd;ZBdded3ed$e*dz  dedz  fd<ZCi d=d>d?d@dAdBdCdDdEdFdGd@dHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddeZDeeef         edf<    eEdgdZh          ZFeEe         edh<    eEd=dLh          ZGeEe         edi<   djaHe;edk<   dle;ddfdmZIde;fdnZJdededz  fdoZKdedefdpZLdede;fdqZMdded3ed$e*dz  dedz  fdrZNdsedefdtZOdsededz  fduZPdsedefdvZQd3ede5e         fdwZRdedxedz  de5e         fdyZSdedxedz  de(dz  fdzZTd{edz  de;fd|ZUd}e(dz  dedz  fd~ZVdddded{edz  dxedz  d}e(dz  dedz  f
dZWdede;fdZXdede5e         fdZYdede5e         fdZZe&e'ddede*de*de5e         fdZ[ddddded{edz  dxedz  d}e(dz  de;f
dZ\ G d d          Z]dZ^dedefdZ_ded{edz  deAe;ef         fdZ`	 dded3edead{edz  def
dZbdS )zCLI 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)redact_sensitive_text)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         3/home/rurouni/.hermes/hermes-agent/agent/display.py_hex_fgz_diff_ansi.<locals>._hex_fg5   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)r6   file_cr8   r9   r:   r   r%   err_hok_heregebor_ogobr#   s                  @r$   
_diff_ansirI   $   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 )Nr6   rI    r&   r$   	_diff_dimrM   U   s    *,,u--r&   c                  *    t                      d         S )Nr7   rK   rL   r&   r$   
_diff_filerO   V       *,,v..r&   c                  *    t                      d         S )Nr8   rK   rL   r&   r$   
_diff_hunkrR   W   rP   r&   c                  *    t                      d         S )Nr9   rK   rL   r&   r$   _diff_minusrT   X   s    *,,w//r&   c                  *    t                      d         S )Nr:   rK   rL   r&   r$   
_diff_plusrV   Y   rP   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   listr\   r   __annotations__dictr]   r<   rL   r&   r$   rZ   rZ   ^   sc         QQd333E4:333$)E$$?$?$?FDcDj!?????r&   rZ   _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   re   )rf   s    r$   set_tool_preview_max_lenrh   k   s'     /06CANNNQr&   c                      t           S )z9Return the configured max preview length (0 = unlimited).)re   rL   r&   r$   get_tool_preview_max_lenrj   q         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)r;   r   r?   r   s    r$   	_get_skinrm   z   sI    ::::::      tts    
  c                  4    t                      } | r| j        S dS )z2Get tool output prefix character from active skin.   ┊)rm   tool_prefix)r#   s    r$   get_skin_tool_prefixrq      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   )rt   )rm   tool_emojisgettools.registryrv   	get_emojir?   )rs   rt   r#   overriderv   emojis         r$   get_tool_emojir}      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&   max_lenc                 r    |r4|dk    r.t          |           |k    r|dk    rd|z  S | d |dz
           dz   S | S )Nr   r   ....)r   )r~   r   s     r$   _truncate_previewr      sR     *7Q;;3t99w#6#6a<<= LWq[L!E))Kr&   >   cdsetpopdtruefalsepushdunsetexportsourcer   :>   wcheadsorttailuniqr   c                 B    | r|                      dd          d         ndS )N/r   r   )rsplit)r   s    r$   _shell_basenamer      s%    &*24;;sAr""2r&   segmentc                    g }g }d }t          |           D ]\  }}|r3|                    |           ||k    r|dk    s| |dz
           dk    rd }:|dv r|}|                    |           V|                                r-|r*|                    d                    |                     g }|                    |           |r(|                    d                    |                     |S )Nr   r   \   '"r   )	enumerateappendisspacer   )r   wordsbufquoteichs         r$   _split_shell_wordsr      s   ECE7##  2 	JJrNNNU{{Q'!a%.D*@*@EJJrNNN::<< 	 RWWS\\***

2
 #RWWS\\"""Lr&   c                 D   t          |           }g }t          |          D ]Y\  }}|dk    r9t          |dz   t          |          k     r||dz            nd          t          v r n|                    |           Zd                    |                                          S )N|r   r   r   )r   r   r   r   _SHELL_PIPE_TAIL_HEADSr   r   stripr   r   outr   words        r$   _strip_shell_pipe_tailr      s    w''ECU##  43;;?1q53u::;M;M5Q<<SUVVZpppE

488C==   r&   commandc                    g }g }d }d}|t          |           k     r| |         }|r8|                    |           ||k    r|dk    s| |dz
           dk    rd }|dz  }V|dv r|}|                    |           |dz  }w|                     d|          s|                     d|          rdn|dv rdnd}|rTt          d	                    |                                                    }|r|                    |           g }||z  }|                    |           |dz  }|t          |           k     t          d	                    |                                                    }|r|                    |           |S )
Nr   r   r   r   z&&z||r2   >   
r   r   )r   r   
startswithr   r   r   )r   segmentsr   r   r   r   op_lenr   s           r$   _split_shell_compoundr      s   HCE	A
c'll

QZ 	JJrNNNU{{Q'!a%.D*@*@FAEJJrNNNFA((q11sW5G5Ga5P5Ps[]al[l[lVWVWrs 	,RWWS\\-?-?-A-ABBG )(((CKA

2	Q5 c'll

8 %RWWS\\%7%7%9%9::G !   Or&   c                 :   t          |           }d}|t          |          k     rNt          j        d||                   r3|dz  }|t          |          k     rt          j        d||                   3t	          |t          |          k     r||         nd          S )Nr   z^[A-Za-z_]\w*=r   r   )r   r   rematchr   )r   r   indexs      r$   _shell_head_wordr     s    w''EE
#e**

*;U5\!J!J

 #e**

*;U5\!J!J
53u::+=+=5<<2FFFr&   c                    t          |           }g }d}|t          |          k     r||         }t          j        d|          r|dz  }6t          j        d|          st          j        d|          r|dz  }f|                    |           |dz  }|t          |          k     d                    |                                          S )Nr   z^\d*(?:>>?|<)$r2   z^\d*(?:>&|<&)\d+$z
^\d*>&\d+$r   r   )r   r   r   r   r   r   r   r   s        r$   _clean_shell_segmentr     s    w''EC	A
c%jj..Qx8%t,, 	FA8($// 	28M43P3P 	FA

4	Q c%jj.. 88C==   r&   c                     t          |           }t          |r|d         nd          dk    rdS d                    |dd                    }t          t	          j        d|                    S )Nr   r   echoFr   r   z(-{2,}|_exit=|(?:^|\s|=)\$[?{]|PIPESTATUS)r   r   r   boolr   search)r   r   rests      r$   _is_shell_boundary_echor   +  sh    w''E50uQxxb11V;;u88E!""ID	EtLLMMMr&   c                    t          |           }|sdS t          |          }t          |          dk    rt          |r|d         n|          p|S g }|D ]O}t          |          }t	          |          }|r-|t
          vr$t          |          s|                    |           P|s|S t          |          dk    r|d         S t          |          dz
  }|d          d| d|dk    rdnd S )zRCompact shell wrapper/plumbing for display while preserving raw command elsewhere.r   r   r   z + r   r   commands)r   r   r   r   r   _SHELL_SILENT_HEADSr   r   )r   originalr   corer   cleanedr   counts           r$   summarize_shell_commandr   3  s     H r$X..H
8}}#8$IHQKKJJVhVD ! !&w//(( 	!t#666?VW^?_?_6KK    
4yyA~~AwIIME1gKK%KKuzz))zKKKr&   argsc                     |                      d          }|                      d          }t          |t                    r|dk    rdS t          |t                    r|dk    rd| S d| d||z   dz
   S )Noffsetlimitr   r   r   L-)rx   
isinstancer   )r   r   r   s      r$   _read_file_line_labelr   M  s    XXhFHHWEfc"" fkkreS!! UaZZ6||,v,,*,,,r&   value
typed_textc                    | S t                    }|dk    r| S t          |d          }||k    r| S t          | t                     r|                     ||          S t          | t                    r fd|                                 D             S t          | t                    rfd| D             S t          | t                    rt          fd| D                       S | S )a$  Apply secret redaction to browser_type text in display-facing payloads.

    Backends sometimes echo the attempted input in error strings or fallback
    metadata.  When the raw typed value contains a recognizable secret (API
    key, token, JWT, etc.) the redacted form differs from the raw value, so we
    replace every occurrence of the raw value with its redacted form before a
    browser_type result reaches logs, callbacks, the model, or chat history.

    Normal typed text (search queries, addresses, form fields) matches no
    secret pattern, so it passes through unchanged and stays readable.

    Redaction is forced here regardless of the global ``security.redact_secrets``
    preference: a typed credential leaking into chat history is a security
    boundary, not mere log hygiene.
    Nr   Tforcec                 8    i | ]\  }}|t          |          S rL   %redact_browser_typed_text_for_display).0r   itemr   s      r$   
<dictcomp>z9redact_browser_typed_text_for_display.<locals>.<dictcomp>s  s:     
 
 
T 6tZHH
 
 
r&   c                 0    g | ]}t          |          S rL   r   r   r   r   s     r$   
<listcomp>z9redact_browser_typed_text_for_display.<locals>.<listcomp>x  s$    ZZZD5dJGGZZZr&   c              3   8   K   | ]}t          |          V  d S Nr   r   s     r$   	<genexpr>z8redact_browser_typed_text_for_display.<locals>.<genexpr>z  s/      __QU:4LL______r&   )r<   r	   r   replacerd   itemsrb   r=   )r   r   needleredacteds    `  r$   r   r   W  s"     __F||$V4888H6% /}}VX...% 

 
 
 
"[[]]
 
 
 	
 % [ZZZZTYZZZZ% `____Y^______Lr&   c                     t          |t                    s|S | dk    rSt          |                    d          t                    r+t          |          }t	          |d         d          |d<   |S |S )aW  Return a copy of tool args safe for logs/progress UI.

    For ``browser_type`` the ``text`` argument is run through the same
    secret-pattern redactor used for logs.  Recognizable credentials (API
    keys, tokens) are masked before the value reaches tool progress
    notifications; normal typed text is left intact for debuggability.
    browser_typer~   Tr   )r   rd   rx   r<   r	   )rs   r   	safe_argss      r$   redact_tool_args_for_displayr   ~  sr     dD!! N""z$((62B2BC'H'H"JJ	1$v,dKKK	&Kr&   tasksper_goal_lenc                D   t          | t                    sdg fS g }| D ]r}t          |t                    s|                    d          }|dnt	          t          |                    }|                    t          |pd|                     st          |          |fS )Nr   goal?)	r   rb   rd   rx   r   r<   r   r   r   )r   r   goalstaskraw_goalr   s         r$   _delegate_task_goal_partsr     s    eT"" "uE C C$%% 	88F##&ssHS]],C,C&t{sLAABBBBu::ur&   c                    |t           }|sdS t          | |          p|}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#k    r|                    d$          }|rht          |t                    rSt          |d%&          \  }}|r| d'd(                    |          z   nt          |           d)}t          ||          S |                    d!d*          }|dS t          t          |                    }|rt          ||          ndS | d+k    r|                    dd*          }	|                    d,d*          }
|                    d-d*          }|                    d.          }|	g}|
r|                    |
dd/                    |r.|                    d0t          |dd1                    d0           |r|	d2k    r|                    | d3           |rd4                    |          ndS | d5k    rW|                    d6          }|                    d7d8          }|d9S |rd:t          |           d;S d<t          |           d;S | d=v rS| dk    rd nd}|                    |          }|dS t          t          |                    }|rt          ||          ndS | dk    r|                    d	          p)|                    d>          p|                    d?          }|dS t          t          |                              d@dA                    j        pt          |          }t!          |          }| d4|                                 }|rt          ||          ndS | dBk    rHt          |                    dd*                    }dC|ddD          t          |          dDk    rdEnd* d0S | dFk    r|                    dd*          }	|                    dGd*          }|	dHk    rKt          |                    dId*                    }dJ| dK|ddD          t          |          dDk    rdEnd* d0S |	dLk    r7t          |                    dM          pd*          pdN}dO| dK|dd1          d0S |	dPk    r7t          |                    dM          pd*          pdN}dQ| dK|dd1          d0S |	S | dRk    rb|                    dGdS          }t          |                    dTd*                    }t          |          d1k    r|ddU         dEz   }dV| dK| d0S |                    |           }|sdWD ]
}||v r|} n|r||vrdS ||         }t          |t                    r|r|dX         nd*}t          t          |                    }|sdS |dXk    r#t          |          |k    r|d|dYz
           dEz   }|S )ZzBuild 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terminalr   
web_searchqueryweb_extracturls	read_filepath
write_filepatchsearch_filespatternbrowser_navigateurlbrowser_clickrefr   r~   image_generateprompttext_to_speechvision_analyzequestion
skill_viewnameskills_listcategorycronjobactionexecute_codecoder   )delegate_taskclarifyskill_manager  r   (   r   z tasks:  | z parallel tasksr   process
session_iddatatimeoutr   r   r3   waitsr   todotodosmergeFzreading task listz	updating z task(s)z	planning >   r   r  r7   filepathr   r   session_searchz	recall: "   r   memorytargetaddcontent+: "r   old_text<missing old_text>~remover   send_messager   message   zto )r   r~   r   r  r  r  r  r   r   r   )re   r   rx   r   rb   r   r   r   r   r   r<   r   r   r   r   r  r   r   )rs   r   r   primary_argsr   
task_countr   previewr   r  sidr  timeout_valparts	todos_argr%  r   r   r  label
line_labelr   r*  r,  oldmsgfallback_keyr   s                               r$   build_tool_previewrB    sg    ' t'	488@DDI+W6CVV)63:F 		 $6u 		 !/	
 	(
 %5f 	* 	f ,Z 	8 	 28v  L O##!! 	7Zt,, 	7 9%b Q Q QJ =:'''%**U*;*;;;!$U<<<  %Wg666xx##<43t99%%6=G '2224G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000!^33ff((3--?4)#g,,776=G '2224GKxxK488F#3#3Ktxx
7K7K<4SYY&&tS11227D3t99*400
))Z))//116=G '2224G$$$'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   zSearching the webr   Readingr  Browsingr  Clickingr   Typingr   r  Writingr  Editingr  zSearching filesr   Runningr  zRunning coder
  zGenerating imagevideo_generatezGenerating videor  zGenerating speechr  zLooking at the imager'  zSearching past sessionsr  zReading skillzListing skillszUpdating skill
Delegating
SchedulingAskingzUpdating memoryzUpdating tasks)r  r  r  r  r  r)  r#  _TOOL_VERBSr  _TOOL_VERBS_NO_PREVIEW_TOOL_VERBS_FOR_CONNECTORT_friendly_tool_labelsenabledc                 $    t          |           adS )zIToggle friendly human-phrased tool labels (display.friendly_tool_labels).N)r   rQ  )rR  s    r$   set_friendly_tool_labelsrT  S  s     !MMr&   c                      t           S )z0Return whether friendly tool labels are enabled.)rQ  rL   r&   r$   get_friendly_tool_labelsrV  Y  rk   r&   c                 H    t           sdS t                              |           S )aW  Return the friendly verb for a built-in tool, or None.

    Returns None when friendly labels are disabled or the tool has no curated
    verb (custom/plugin/MCP tools).  Callers that already hold a computed
    argument preview can compose ``f"{verb} {preview}"`` themselves; use
    :func:`tool_verb_connector` to pick the right joiner.
    N)rQ  rN  rx   rs   s    r$   get_tool_verbrY  ^  s#     ! t??9%%%r&   c                     | t           v rdndS )zEReturn the connector between a verb and its preview (" for " or " "). for r   )rP  rX  s    r$   tool_verb_connectorr\  k  s    #<<<77#Er&   c                     | t           v S )zCWhether the verb should render alone, without the argument preview.)rO  rX  s    r$   verb_drops_previewr^  p  s    ...r&   c                     t           st          | ||          S t                              |           }|st          | ||          S | t          v r|S t          | ||          }|s|S | t
          v r| d| S | d| S )a  Build a human-phrased status label for a tool call.

    For built-in tools with a known verb (``web_search`` -> "Searching the
    web for ..."), returns the verb optionally followed by the argument
    preview.  For everything else (custom/plugin/MCP tools, or when friendly
    labels are disabled) returns the raw preview, so callers can use this as a
    drop-in replacement for :func:`build_tool_preview`.
    )r   r[  r   )rQ  rB  rN  rx   rO  rP  )rs   r   r   verbr8  s        r$   build_tool_labelra  u  s     ! D!)T7CCCC??9%%D D!)T7CCCC*** D'BBBG ---&&W&&&Wr&   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_pathrh    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_textrq    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   rf  r?   rp  s    r$   _display_diff_pathru    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 rL   )is_file)r   r  s     r$   r   z/_resolve_skill_manage_paths.<locals>.<listcomp>  s%    QQQ$$,,..QQQQr&   *)rx   tools.skill_manager_toolrw  rx  r   sortedrglob)	r   r  r  rw  rx  	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   rd   rx   rh  r  )rs   r  r  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  rZ   rq  r]   r<   )rs   r  r\   snapshotr  s        r$   capture_local_edit_snapshotr    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   rd   rx   r   )r  r  s     r$   _result_succeededr    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 )r   N)endswith)r   chunks     r$   r   z&_diff_from_snapshot.<locals>.<genexpr>  s;      WWuENN400B55edlWWWWWWr&   )
r\   r]   rx   r<   rq  ru  r   r   
splitlinesr   )r  chunksr  r]   afterdisplay_pathdiffs          r$   _diff_from_snapshotr    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   rd   rx   r<   r   r  r  )rs   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--- r4   z+++ za/?u    → zb/?z@@r   r-  r   )
r  r   r   r   rO   _ANSI_RESETrR   rT   rV   rM   )r  rendered	from_fileto_fileraw_lines        r$   _render_inline_unified_diffr  9  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>i  s)    BBB7'BDIIgBBBr&   )r  r   r   )r  sectionscurrentr  s       r$   _split_unified_diff_sectionsr  Z  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  r   r   r  extendr>   r   rR   r  )r  r  r  r  r  omitted_filesomitted_linesidxr  section_linesremaining_budgetleftoversummarys                r$   !_summarize_rendered_diff_sectionsr  l  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   )rs   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   █r  r  r  r  r  r  )   ←u   ↖   ↑u   ↗   →u   ↘   ↓u   ↙)u   ✶   ✷   ✸   ✹u   ✺r  r  r  )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                            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)rm   spinnerrx   r?   KAWAII_WAITINGclsr#   facess      r$   get_waiting_faceszKawaiiSpinner.get_waiting_faces  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)rm   r  rx   r?   KAWAII_THINKINGr  s      r$   get_thinking_facesz KawaiiSpinner.get_thinking_faces  sg    	;;D !(()92>> ! L 	 	 	D	""r  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)rm   r  rx   r?   THINKING_VERBS)r  r#   verbss      r$   get_thinking_verbsz KawaiiSpinner.get_thinking_verbs  sg    	;;D !(()92>> ! L 	 	 	D	!!r  r   r  Nr4  spinner_typec                     || _         | j                            || j        d                   | _        d| _        d | _        d| _        d | _        d| _        || _	        t          j        | _        d S )Nr  Fr   )r4  SPINNERSrx   spinner_framesrunningthread	frame_idx
start_timelast_line_len	_print_fnsysstdout_out)selfr4  r  r  s       r$   __init__zKawaiiSpinner.__init__  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  
ValueErrorro  )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  ro  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  r4  r
  timesleepr$  rm   get_spinner_wingsrc  getenvr	  r  r   r  r>   r  )	r  r#   wingsframeelapsedleftrightr  pads	            r$   _animatezKawaiiSpinner._animate8  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Threadr9  r  startr  s    r$   r>  zKawaiiSpinner.starta  sX    < 	F)++&dmDIIIr&   new_messagec                     || _         d S r   )r4  )r  r?  s     r$   update_textzKawaiiSpinner.update_texti  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  r-  z  )r
  r  r>   r  )r  r~   blankss      r$   print_abovezKawaiiSpinner.print_abovel  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  rE  is_ttyrC  r5  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)rH  )r  exc_typeexc_valexc_tbs       r$   __exit__zKawaiiSpinner.__exit__  s    		ur&   )r   r  N)r   Fr   )r^   r_   r`   ra   r  r  r  r  classmethodrb   r  r   r  r<   r  r   r  propertyr  r$  r9  r>  rA  rD  rH  rJ  rO  rL   r&   r$   r  r    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&   r  0   r@  c                 0   |                                  } d| v rP|                     d          \  }}}|                                 }d|v rd|                    dd          d          } t          |           t          k    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:r   zFile not found: r   r   Nr   r   )r   	partitionr   r   _ERROR_SUFFIX_MAX_LEN)r@  _r   s      r$   _trim_errorrW    s     ))++CC]]#455
1dzz||$;;>T[[a%8%8%<>>C
3xx'''-)A--.6Jr&   c                 ~   |dS t          | |          rdS t          |          }| dk    rut          |t                    r^|                    d          }|G|dk    rA|                    d          }|r"ddt          t          |                     d	fS dd
| d	fS dS | dk    rFt          |t                    r1|                    d          du rd|                    dd          v rdS t          |t                    ri|                    d          p|                    d          }|r=|                    d          du sd|v r"ddt          t          |                     d	fS t          |t                    sdS |dd                                         }d|v sd|v s|                    d          rdS dS )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]r4  i  z"error"z"failed"Error)Tz [error])	r
   r   r   rd   rx   rW  r<   lowerr   )rs   r  r  rY  err_msgerrr\  s          r$   _detect_tool_failurer_    s    ~y"9f55 y6""D JdD!! 	4--I$a((7++ C!Bk#g,,&?&?!B!B!BBB3y33333y HdD!! 	'xx	""e++0BdhhwXZF[F[0[0[& $ 7hhw6488I#6#6 	7DHHY''500GtOO6k#c((3366666
 fc"" y4C4L  EEZ500F4E4Eg4N4N09r&   durationc                 >  &'( t          | |          p|}|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    r? |d |t          | |          p|                    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 | d-k    r? |d. |t          | |          p|                    d/d          d           d|           S | d0k    r. |d1 ||                    d/d                     d|           S | d2k    r. |d3 ||                    d/d                     d|           S | d4k    rU ||                    d5d          d          }|                    d6d7          }|d8k    rd9nd:} |d;|d<d,| d|           S | d=k    rt|                    d>d          }	|	                    dd                              dd                              d          d         }
 |d? ||
d           d|           S | d@k    r*|                    dA          rdAndB} |dC| d|           S | dDk    r% |dE|                    dFd           d|           S | dGk    r/ |dH ||                    dId          dJ           dK|           S | dLk    rE|                    dMdN          }dOdPdQdRdS                    |dO          } |dT| dU| d|           S | dVk    r |dW|           S | dXk    r% |dY|                    dZd           d|           S | d[k    r |d\|           S | d]k    r |d^|           S | d_k    r>|                    d`          }|                    dadb          }d}d}|re	 t          |          }|rB|                    dci           }|                    ddd          }|                    ded          }n# t          $ r Y nw xY w|(|dk    r |df| d| dg|           S  |dh|           S |r>|dk    r|dk    r |di| d| dj|           S  |dit          |           dg|           S |dk    r|dk    r |df| d| dg|           S  |dft          |           dg|           S | dkk    r/ |dl ||                    dd          d           dK|           S | dmk    r|                    dd          }|                    d6d          }|dnk    r2 |do| dp ||                    d7d          dJ           dK|           S |dqk    r;|                    dr          pd}|r|nds} |dt| dp ||du           dK|           S |dvk    r;|                    dr          pd}|r|nds} |dw| dp ||du           dK|           S  |dx| d|           S | dyk    r% |dz|                    d{d|           d|           S | d}k    r/ |d~ ||                    dd          dJ           d|           S | dk    r/ |d ||                    dd          d           d|           S | dk    r/ |d ||                    dId          dJ           d|           S | dk    r/ |d ||                    dd          dJ           d|           S | dk    rF |d|                    d6d           dp ||                    dd          d           dK|           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    r|                    d          } | rqt          | t                    r\t          | dJ          \  }!}"|"rd                    |"          nd}#|!pt          |           }$ |d|$ d ||#d           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<   re   r   )r"  rf   r   s      r$   _truncz%get_cute_tool_message.<locals>._trunc  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   rc  )prf   r   s      r$   _pathz$get_cute_tool_message.<locals>._path  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.ro   r   )r   )r  failure_suffix
is_failureskin_prefixs    r$   _wrapz$get_cute_tool_message.<locals>._wrap  sA    %<<{A6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 )rb   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downr  r  r  r  )r}  upr7  r6  u   ┊ z  scroll    browser_backu   ┊ ◀️  back      browser_pressu   ┊ ⌨️  press     r   browser_get_imagesu#   ┊ 🖼️  images    extracting  browser_visionu'   ┊ 👁️  vision    analyzing page  r#  r$  r%  Fr  total	completedu   ┊ 📋 plan      z
 task(s)  u"   ┊ 📋 plan      reading tasks  u   ┊ 📋 plan      update u    ✓  r'  u   ┊ 🔍 recall    "r)  r+  u   ┊ 🧠 memory    +r.  r   r/  r0  u   ┊ 🧠 memory    ~r3   r2  u   ┊ 🧠 memory    -u   ┊ 🧠 memory    r  u   ┊ 📚 skills    list r  allr  u   ┊ 📚 skill     r  r
  u   ┊ 🎨 create    r  r  u   ┊ 🔊 speak     r  u   ┊ 👁️  vision    r  r3  u   ┊ 📨 send      r4  r(  r  ry  skillsskillr   u   ┊ ⏰ cron      create    rb   u   ┊ ⏰ cron      listing  u   ┊ ⏰ cron      job_idr  r  r   u   ┊ 🐍 exec      r  r   r  r  parallelu   ┊ 🔀 delegate  zx: r   u   ┊ ⚡ 	   )r  )re  )r   r_  rq   r<   rx   r   rb   r   r   r   rB  r   r?   r   r   r   ))rs   r   r`  r  durrd  rh  rm  r   r  domainextrar  r9  labelsr  r*  r`  modedarrowr<  r%  r  doner  r"  r?  r  r=  r  
first_liner   r7  r   detailcount_labelr8  rj  rk  rl  s)                                         @@@r$   get_cute_tool_messager    s    (	488@DD



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Ju~662DYPT2U2U2pY]YaYabkmoYpYprt+u+u~~y|~~I(C((hh|R(("-(-#--s'#--RUcrmpcrcrt tu\fjjFARARSARAR.S.S\\WZ\\]]]Ku{662DYPT2U2U2mY]YaYabhjlYmYmoq+r+r{{vy{{|||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%%	%(( 	&v.. 1B//AEE'1--E55a00D   qyyuP4PP%PP3PPQQQ5CcCCDDD 	PqyyTAXXuS$SSSScSSTTT5Uc)nnUUPSUUVVVqyyTAXXuP4PP%PP3PPQQQ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\\]]]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##!! 	\Zt,, 	\ 9%b Q Q QJ*/?UZZ&&&ZF$2E

K5Z{ZZvvfb?Q?QZZUXZZ[[[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Ks   4AV 
VV)rr   r   )cra   loggingrc  r   r  r<  r/  dataclassesr   r   difflibr   pathlibr   typingr   utilsr   agent.redactr	    agent.tool_result_classificationr
   _RED_RESET	getLoggerr^   r  r  r   rd   r<   rc   rI   rM   rO   rR   rT   rV   _MAX_INLINE_DIFF_FILES_MAX_INLINE_DIFF_LINESrZ   re   r   rh   rj   rm   rq   r}   r   r   r   r   r   rb   r   r   r   r   r   r   r   r   r   r   r   r=   r   rB  rN  	frozensetrO  rP  rQ  rT  rV  rY  r\  r^  ra  rh  rq  ru  r  r  r  r  r  r  r  r  r  r  r  r  rU  rW  r_  floatr  rL   r&   r$   <module>r     sR      				 				 



      ( ( ( ( ( ( ( (                         ! ! ! ! ! ! . . . . . . 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 " " " "
C #*      mll ??? 3# 3# 3 3 3 3 S	    >	!C 	!C 	! 	! 	! 	!&3 &49 & & & &RGc Gc G G G G!# !# ! ! ! !"NS NT N N N NLS LS L L L L4- - - - - -$ $# $# $ $ $ $NC td{ td{    "
S 
3 
5dSViCX 
 
 
 
} }# }T }C$J }RUX\R\ } } } }X%9 
 Z	
 H  ) Y % 	 N ( ( ) ,  /!" /#$ $$!1  T#s(^   8 *34 * * 	#    -6I7 - - 9S>   
 # t " " "*d *t * * * *!$ ! ! ! !

&S 
&S4Z 
& 
& 
& 
&F3 F3 F F F F
/# /$ / / / /
  4 #* PSVZPZ    >" " " " " " #*    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  S S    $/C /t /dCi@P / / / /f GKgL gLgLgL*/gL9<tgLgL gL gL gL gL gLr&   