
    ia                        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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'dBdeded
efdZ(ded
efd Z)dCded!ed"e#dz  d
edz  fd#Z*d$ed
efd%Z+d$ed
edz  fd&Z,d$ed
efd'Z-d!ed
e.e         fd(Z/ded)edz  d
e.e         fd*Z0ded)edz  d
e!dz  fd+Z1d,edz  d
e2fd-Z3d.e!dz  d
edz  fd/Z4ddd0ded,edz  d)edz  d.e!dz  d
edz  f
d1Z5d2ed
e2fd3Z6d4ed
e.e         fd5Z7d4ed
e.e         fd6Z8ee d7d4ed8e#d9e#d
e.e         fd:Z9dddd;ded,edz  d)edz  d.e!dz  d
e2f
d<Z: G d= d>          Z;ded,edz  d
e<e2ef         fd?Z=	 dCded!ed@e>d,edz  d
ef
dAZ?dS )DzCLI presentation -- spinner, kawaii faces, tool preview formatting.

Pure display functions and classes with no AIAgent dependency.
Used by AIAgent._execute_tool_calls for CLI feedback.
    N)	dataclassfield)unified_diff)Path)safe_json_loadsz[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         2/home/ubuntu/.hermes/hermes-agent/agent/display.py_hex_fgz_diff_ansi.<locals>._hex_fg1   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)r3   file_cr5   r6   r7   r   r"   err_hok_heregebor_ogobr    s                  @r!   
_diff_ansirF       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 )Nr3   rF    r#   r!   	_diff_dimrJ   Q   s    *,,u--r#   c                  *    t                      d         S )Nr4   rH   rI   r#   r!   
_diff_filerL   R       *,,v..r#   c                  *    t                      d         S )Nr5   rH   rI   r#   r!   
_diff_hunkrO   S   rM   r#   c                  *    t                      d         S )Nr6   rH   rI   r#   r!   _diff_minusrQ   T   s    *,,w//r#   c                  *    t                      d         S )Nr7   rH   rI   r#   r!   
_diff_plusrS   U   rM   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   listrY   r   __annotations__dictrZ   r9   rI   r#   r!   rW   rW   Z   sc         QQd333E4:333$)E$$?$?$?FDcDj!?????r#   rW   _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   rb   )rc   s    r!   set_tool_preview_max_lenre   g   s'     /06CANNNQr#   c                      t           S )z9Return the configured max preview length (0 = unlimited).)rb   rI   r#   r!   get_tool_preview_max_lenrg   m   s      r#   c                  F    	 ddl m}   |             S # t          $ r Y dS w xY w)z5Get the active skin config, or None if not available.r   r   N)r8   r   r<   r   s    r!   	_get_skinri   v   sI    ::::::      tts    
  c                  4    t                      } | r| j        S dS )z2Get tool output prefix character from active skin.   ┊)ri   tool_prefix)r    s    r!   get_skin_tool_prefixrm      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   )rp   )ri   tool_emojisgettools.registryrr   	get_emojir<   )ro   rp   r    overriderr   emojis         r!   get_tool_emojiry      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)rz   s    r!   _oneliner      s    88DJJLL!!!r#   argsmax_lenc                 	   |t           }|sdS i dddddddd	d
d	dd	dddddddddddddddddddddd d!d"ddd#}| d$k    r|                    d d%          }|                    d&d%          }|                    d'd%          }|                    d(          }|g}|r|                    |dd)                    |r.|                    d*t          |dd+                    d*           |r|d,k    r|                    | d-           |rd.                    |          ndS | d/k    rW|                    d0          }	|                    d1d2          }
|	d3S |
rd4t          |	           d5S d6t          |	           d5S | d7k    rHt          |                    dd%                    }d8|dd9          t          |          d9k    rd:nd% d*S | d;k    r|                    d d%          }|                    d<d%          }|d=k    rKt          |                    d>d%                    }d?| d@|dd9          t          |          d9k    rd:nd% d*S |dAk    r7t          |                    dB          pd%          pdC}dD| d@|dd+          d*S |dEk    r7t          |                    dB          pd%          pdC}dF| d@|dd+          d*S |S | dGk    rb|                    d<dH          }t          |                    dId%                    }t          |          d+k    r|ddJ         d:z   }dK| d@| d*S |                     dL          rdM|                    dd%          dN|                    dOd%           dP|                    dQd%           dR|                    dSd%          dd)         dT|                    dSd%          dd)          |                    dSd%          dd)         dU|                    dVdW           dXdY
}|                    |           S |                    |           }|sdZD ]
}||v r|} n|r||vrdS ||         }t          |t                    r|r|d[         nd%}t          t          |                    }|sdS |d[k    r#t          |          |k    r|d|dWz
           d:z   }|S )\zBuild a short preview of a tool call's primary argument for display.

    *max_len* controls truncation.  ``None`` (default) defers to the global
    ``_tool_preview_max_len`` set via config; ``0`` means unlimited.
    Nterminalcommand
web_searchqueryweb_extracturls	read_filepath
write_filepatchsearch_filespatternbrowser_navigateurlbrowser_clickrefbrowser_typerz   image_generateprompttext_to_speechvision_analyzequestionmixture_of_agentsuser_prompt
skill_viewnameskills_listcategorycronjobactioncodegoal)execute_codedelegate_taskclarifyskill_manageprocessr   
session_iddatatimeoutr   "r0   waitsr|   todotodosmergeFzreading task listz	updating z task(s)z	planning session_searchz	recall: "   ...memorytargetaddcontent+: "replaceold_text<missing old_text>~remove-send_message?message   zto rl_zlisting envszreading configr   =valuestartingrun_idz	stopping zlisting runs	num_stepsr   z steps
rl_list_environmentsrl_select_environmentrl_get_current_configrl_edit_configrl_start_trainingrl_check_statusrl_stop_trainingrl_get_resultsrl_list_runsrl_test_inference)r   rz   r   r   r   r   r   r   r   )
rb   rt   appendr   r}   r   
startswith
isinstancer_   r9   )ro   r   r   primary_argsr   sidr   timeout_valparts	todos_argr   r   r   r   oldmsgrl_previewsr   fallback_keyr   previews                        r!   build_tool_previewr      s6    ' tI+W6CVV)63:F 		 $6u 		 !/	
 	(
 %5f 	* ':= 	f ,Z 	8 v  L I(B''hh|R((xx##hhy)) 	#LLSbS""" 	5LL3Xd3B3i00333444 	,6V++LLK***+++"'1sxxT1FHHW%%	%((&& 	87s9~~77777s9~~7777$$$'2..//LE#2#JLUbbLLLLH(B''(B''U??txx	26677GWvWW73B3<W#g,,:K:KQSWWWWy  488J//5266N:NC/v//3ss8////x488J//5266N:NC/v//3ss8////N""(C((txx	2..//s88b==crc(U"C(V((((((E"" *$2%)XXfb%9%9%5!%'2!6!6PP'29N9NPP!+#xx"55crc: IDHHXr,B,B3B3,G I I"hhx44SbS9*$(HH[!$<$<!D!D!D
 
 y)))


9
%
%C b 	 	Lt##" $  #T//tIE% *!)ars5zz""G t{{s7||g--,7Q;,'%/Nr#   r   c                     t          t          j                            |                     }|                                r|S t          j                    |z  S )zDResolve a possibly-relative filesystem path against the current cwd.)r   osr   
expanduseris_absolutecwd)r   	candidates     r!   _resolved_pathr     sJ    RW''--..I 8::	!!r#   c                 x    	 |                      d          S # t          t          t          t          f$ r Y dS w xY w)z@Return UTF-8 file content, or None for missing/unreadable files.zutf-8)encodingN)	read_textFileNotFoundErrorIsADirectoryErrorUnicodeDecodeErrorOSErrorr   s    r!   _snapshot_textr   #  sH    ~~w~///02DgN   tts    99c                     	 t          |                                                     t          j                                                                        S # t
          $ r t          |           cY S w xY w)z2Prefer cwd-relative paths in diffs when available.)r9   resolverelative_tor   r   r<   r   s    r!   _display_diff_pathr   +  sj    4<<>>--dhjj.@.@.B.BCCDDD   4yys   AA A54A5c                    |                      d          }|                      d          }|r|sg S ddlm}m} |dk    r% |||                      d                    }|dz  gS  ||          }|sg S t	          |d                   }|d	v r#|                      d
          }|r||z  gn|dz  gS |dv r|                      d
          }|r||z  gng S |dk    r.d t          |                    d                    D             }|S g S )z7Resolve skill_manage write targets to filesystem paths.r   r   r   )_find_skill_resolve_skill_dircreater   zSKILL.mdr   >   editr   	file_path>   r   remove_filedeletec                 :    g | ]}|                                 |S rI   )is_file).0r   s     r!   
<listcomp>z/_resolve_skill_manage_paths.<locals>.<listcomp>L  s%    QQQ$$,,..QQQQr#   *)rt   tools.skill_manager_toolr   r   r   sortedrglob)	r   r   r   r   r   	skill_direxistingr   filess	            r!   _resolve_skill_manage_pathsr
  3  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   ra   rt   r   r
  )ro   r  r   s      r!   _resolve_local_edit_pathsr  Q  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)rY   )r  rW   r   rZ   r9   )ro   r  rY   snapshotr   s        r!   capture_local_edit_snapshotr  d  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   ra   rt   bool)r  r   s     r!   _result_succeededr  p  s     u6""D|udD!! uxx uDDHHY''(((4r#   r  c           
         | sdS g }| j         D ]}| j                            t          |                    }t	          |          }||k    r?t          |          }d                    t          |g n|                    d          |g n|                    d          d| d|                     }|r|	                    |           |sdS d                    d |D                       S )	zHGenerate unified diff text from a stored before-state and current files.Nr   T)keependsza/zb/)fromfiletofilec              3   N   K   | ] }|                     d           r|n|d z   V  !dS )
N)endswith)r  chunks     r!   	<genexpr>z&_diff_from_snapshot.<locals>.<genexpr>  s;      WWuENN400B55edlWWWWWWr#   )
rY   rZ   rt   r9   r   r   r}   r   
splitlinesr   )r  chunksr   rZ   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   ra   rt   r9   stripr  r%  )ro   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--- r1   z+++ za/?u    → zb/?z@@r   r   r|   )
r   r   r(  r   rL   _ANSI_RESETrO   rQ   rS   rJ   )r$  rendered	from_fileto_fileraw_lines        r!   _render_inline_unified_diffr7    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.r1  c                 <    g | ]}|d                      |          S )r  )r}   )r  sections     r!   r  z0_split_unified_diff_sections.<locals>.<listcomp>  s)    BBB7'BDIIgBBBr#   )r   r   r   )r$  sectionscurrentr.  s       r!   _split_unified_diff_sectionsr=    s     "HG!!  ??6"" 	w 	OOG$$$fGt !   BBhBBBBr#   )	max_files	max_linesr>  r?  c          	         t          |           }g }d}d}t          |          D ]"\  }}||k    r%|dz  }|t          t          |                    z  }1t          |          }	|t          |          z
  }
|
dk    r|t          |	          z  }|dz  }pt          |	          |
k    r|                    |	           |                    |	d|
                    |t          |	          |
z
  z  }|dt          dt          |          |z
  dz
            z   z  }||dz   d         D ]!}|t          t          |                    z  }" |s|r=d| d}|r	|d| dz  }|                    t                       | t                      |S )zCRender diff sections while capping file count and total line count.r   r   Nu   … omitted z diff line(s)z across z additional file(s)/section(s))	r=  	enumerater   r7  extendr;   r   rO   r2  )r$  r>  r?  r;  r3  omitted_filesomitted_linesidxr:  section_linesremaining_budgetleftoversummarys                r!   !_summarize_rendered_diff_sectionsrJ    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)  rJ  r<   loggerdebugr/  r}   )ro   r  r  r  r-  r$  rendered_linesexcs           r!   render_edit_diff_with_deltarP     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   █rX  rW  rV  rU  rT  rS  )   ←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   🌟ra  r`  )u   ⁺   ˚r     ✧u   ✦rc  r  rb  )	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)ri   spinnerrt   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)ri   r~  rt   r<   KAWAII_THINKINGr  s      r!   get_thinking_facesz KawaiiSpinner.get_thinking_facesj  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)ri   r~  rt   r<   THINKING_VERBS)r  r    verbss      r!   get_thinking_verbsz KawaiiSpinner.get_thinking_verbsw  sg    	;;D !(()92>> ! L 	 	 	D	!!r  r   rd  Nr   spinner_typec                     || _         | j                            || j        d                   | _        d| _        d | _        d| _        d | _        d| _        || _	        t          j        | _        d S )Nrd  Fr   )r   SPINNERSrt   spinner_framesrunningthread	frame_idx
start_timelast_line_len	_print_fnsysstdout_out)selfr   r  r-  s       r!   __init__zKawaiiSpinner.__init__  sf    "m//dmF>STT " J			r#   r  Frz   endflushc                    | j         )	 |                      |           n# t          $ r Y nw xY wdS 	 | j                            ||z              |r| j                                         dS dS # t
          t          f$ r Y dS w xY w)u   Write to the stdout captured at spinner creation time.

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

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

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

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

r#   c                 .    |                                   dS )NF)r  )r  exc_typeexc_valexc_tbs       r!   __exit__zKawaiiSpinner.__exit__  s    		ur#   )r   rd  N)r  Fr  )r[   r\   r]   r^   r  r  r  r  classmethodr_   r  r  r  r9   r  r  r  propertyr  r  r  r  r  r  r  r  r  rI   r#   r!   rR  rR  =  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#   rR  c                    |dS | dk    rKt          |          }t          |t                    r%|                    d          }||dk    rdd| dfS dS | d	k    rUt          |          }t          |t                    r1|                    d
          du rd|                    dd          v rdS |dd                                         }d|v sd|v s|                    d          rdS dS )a  Inspect a tool result string for signs of failure.

    Returns ``(is_failure, suffix)`` where *suffix* is an informational tag
    like ``" [exit 1]"`` for terminal failures, or ``" [error]"`` for generic
    failures.  On success, returns ``(False, "")``.
    N)Fr   r   	exit_coder   Tz [exit ]r   r  Fzexceed the limitr  r   )Tz [full]i  z"error"z"failed"Error)Tz [error])r   r   ra   rt   lowerr   )ro   r  r   r  r  s        r!   _detect_tool_failurer  $  s#    ~yJv&&dD!! 	4--I$a3y33333y Hv&&dD!! 	'xx	""e++0BdhhwXZF[F[0[0[& 4C4L  EEZ500F4E4Eg4N4N09r#   durationc                    ! |dd}t          | |          \   t                      !dd}dd}dt          dt          f !fd	}| d
k    r/ |d ||                    dd          d           d|           S | dk    r|                    dg           }|rt	          |t
                    r|d         nt          |          }	|	                    dd                              dd                              d          d         }
t          |          dk    rdt          |          dz
   nd} |d ||
d           | d|           S  |d|           S | dk    rt|                    dd          }	|	                    dd                              dd                              d          d         }
 |d ||
d           d|           S | dk    r/ |d ||                    dd          d           d|           S | d k    rz|                    d!d"          }|                    d#d          d$d%         }d&d'| d(| d)| d*| d+| d,| d-} |d.|                    || d/|            d|           S | d0k    r. |d1 ||                    d2d                     d|           S | d3k    r. |d4 ||                    d2d                     d|           S | d5k    r. |d6 ||                    d2d                     d|           S | d7k    rU ||                    d8d          d          }|                    d9d:          }|d;k    rd<nd=} |d>|d?d/| d|           S | d@k    rt|                    dd          }	|	                    dd                              dd                              d          d         }
 |dA ||
d           d|           S | dBk    r*|                    dC          rdCndD} |dE| d|           S | dFk    r% |dG|                    dHd"           d|           S | dIk    r/ |dJ ||                    dKd          dL           dM|           S | dNk    rE|                    dOdP          }dQdRdSdTdU                    |dQ          } |dV| dW| d|           S | dXk    r |dY|           S | dZk    r% |d[|                    d\d"           d|           S | d]k    r |d^|           S | d_k    r |d`|           S | dak    ry|                    db          }|                    dcdd          }| |de|           S |r |dft          |           dg|           S  |dht          |           dg|           S | dik    r/ |dj ||                    dd          d           dM|           S | dkk    r|                    d!d"          }|                    d9d          }|dlk    r2 |dm| dn ||                    d:d          dL           dM|           S |dok    r;|                    dp          pd}|r|ndq} |dr| dn ||ds           dM|           S |dtk    r;|                    dp          pd}|r|ndq} |du| dn ||ds           dM|           S  |dv| d|           S | dwk    r% |dx|                    dydz           d|           S | d{k    r/ |d| ||                    d}d          dL           d|           S | d~k    r/ |d ||                    dd          d           d|           S | dk    r/ |d ||                    dKd          dL           d|           S | dk    r/ |d ||                    dd          dL           d|           S | dk    r/ |d ||                    dd          dL           d|           S | dk    rF |d|                    d9d"           dn ||                    dd          d           dM|           S | dk    r|                    d!d"          }|dk    r|                    d          p,|                    d          sg n|                    d          g}|                    d}          p!|r|d         nd$p|                    dd          } |d ||d           d|           S |dk    r |d|           S  |d| d/|                    dd           d|           S | 	                    d          rdd|                    d}d           dd|                    dd"           dd|                    dd"          d$d%          d|                    dd"          d$d%          d|                    dd"          d$d%          ddd
} |d|                    | |                     dd                     d|           S | dk    rt|                    dd          }|
                                r-|
                                                    d          d         nd} |d ||d           d|           S | dk    ry|                    d          }|r3t	          |t
                    r |dt          |           d|           S  |d ||                    dd          d           d|           S t          | |          pd} |d| d$d         d?d/ ||d           d|           S )a
  Generate a formatted tool completion line for CLI quiet mode.

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

    When *result* is provided the line is checked for failure indicators.
    Failed tool calls get a red prefix and an informational suffix.
    r  r   r  c                     t          |           } t          dk    r| S t          |           |k    r| d |dz
           dz   n| S )Nr   r   r   r9   rb   r   )r   rc   s     r!   _truncz%get_cute_tool_message.<locals>._truncS  sE    FF A%%H$'FFQJJ$1Q3$%A5r#   #   c                     t          |           } t          dk    r| S t          |           |k    rd| |dz
   d          z   n| S )Nr   r   r   r  )prc   s     r!   _pathz$get_cute_tool_message.<locals>._pathY  sI    FF A%%H'*1vvzzAaC&''
""q8r#   r.  r	   c                 R    dk    r|                      dd          } s| S |   S )z*Apply skin tool prefix and failure suffix.rk   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   z +u   ┊ 📄 fetch     u   ┊ 📄 fetch     pages  	web_crawlr   u   ┊ 🕸️  crawl     r   u   ┊ 💻 $         r   r   r   r   r   N   zls processeszpoll zlog zwait zkill zwrite zsubmit )r_   polllogr   killr  submitu   ┊ ⚙️  proc      r|   r   u   ┊ 📖 read      r   r   u   ┊ ✍️  write     r   u   ┊ 🔧 patch     r   r   r   r   r	  findgrepu	   ┊ 🔎 9r   u   ┊ 🌐 navigate  browser_snapshotfullcompactu   ┊ 📸 snapshot  r   u   ┊ 👆 click     r   r   u   ┊ ⌨️  type      "rz      z"  browser_scroll	directiondownr\  rZ  r[  rY  )r  upr  r  u   ┊ z  scroll    browser_backu   ┊ ◀️  back      browser_pressu   ┊ ⌨️  press     r   browser_get_imagesu#   ┊ 🖼️  images    extracting  browser_visionu'   ┊ 👁️  vision    analyzing page  r   r   r   Fu"   ┊ 📋 plan      reading tasks  u   ┊ 📋 plan      update z
 task(s)  u   ┊ 📋 plan      r   u   ┊ 🔍 recall    "r   r   u   ┊ 🧠 memory    +r   r   r   r   u   ┊ 🧠 memory    ~r0   r   u   ┊ 🧠 memory    -u   ┊ 🧠 memory    r   u   ┊ 📚 skills    list r   allr   u   ┊ 📚 skill     r   r   u   ┊ 🎨 create    r   r   u   ┊ 🔊 speak     r   u   ┊ 👁️  vision    r   r   u   ┊ 🧠 reason    r   r   u   ┊ 📨 send      r   r   r   r   skillsskilltasku   ┊ ⏰ cron      create    r_   u   ┊ ⏰ cron      listing  u   ┊ ⏰ cron      job_idr   z	list envszselect z
get configzset r   zstart trainingzstatus r   zstop zresults z	list runsztest inferencer   u   ┊ 🧪 rl        r   r   r  u   ┊ 🐍 exec      r   tasksu   ┊ 🔀 delegate  z parallel tasks  r   u   ┊ ⚡ 	   )r  )r  )r  rm   r9   rt   r   r_   r   r~   r   r   r(  r   )"ro   r   r  r  durr  r  r  r   r   domainextrar   r   labelsr   r   verbmodedarrowr   r   r   r  labelrlr   
first_liner  r   r  r  r  s"                                  @@@r!   get_cute_tool_messager  E  s%    



C!5i!H!HJ&((K6 6 6 69 9 9 9)C )C ) ) ) ) ) ) ) ) L  uU66$((7B2G2G+L+LUUPSUUVVVM!!xx## 	S'd33B$q''TC[[R0088BGGMMcRRSTUF*-d))a--&T1&&&RE5Qvvfb/A/AQ5QQCQQRRRu7#77888Khhub!!Z,,44YCCII#NNqQuJvvfb/A/AJJSJJKKKJuW66$((9b2I2I2+N+NWWRUWWXXXI(C((hh|R(("-(-#--s'#--RUcrmpcrcrt tu\fjjFARARSARAR.S.S\\WZ\\]]]KuO55&"1E1E+F+FOO#OOPPPL  uReeDHHVR4H4H.I.IRRSRRSSSGuO55&"1E1E+F+FOO#OOPPPN""&)R00"55(I..7**vvu::::'::S::;;;&&&hhub!!Z,,44YCCII#NNqQuF66&"+=+=FFFFGGG&&&&))8vvyu8488388999O##uH488E3+?+?HH3HHIIIN""u[txx7K7KR0P0P[[VY[[\\\$$$HH[&))eeUKKOOPQSXYYu9E99q99C99:::N""u3c33444O##uKdhhuc.B.BKKcKKLLL(((u@3@@AAA$$$uDsDDEEEFHHW%%	%((5CcCCDDD 	P5Uc)nnUUPSUUVVV5Ns9~~NNNNOOO$$$uYVVDHHWb4I4I2-N-NYYTWYYZZZH(C(((B''U??5jjjFF488IWYCZCZ\^<_<_jjehjjkkky  ((:&&,"C6##"6C5VVVFF3OOVVQTVVWWWx((:&&,"C6##"6C5VVVFF3OOVVQTVVWWWu:6::S::;;;M!!uTU0K0KTTsTTUUUL  uT66$((622F2F+K+KTTsTTUUU$$$uV66$((8R2H2H"+M+MVVQTVVWWW$$$uT66$((622F2F+K+KTTsTTUUU$$$u\vvdhhz26N6NPR/S/S\\WZ\\]]]'''u[66$((="2M2Mr+R+R[[VY[[\\\N""uv488Hc+B+BvvtxxXaceOfOfhjHkHkvvqtvvwwwI(C((XXXh''adhhw6G6G,`BBdhhW^N_N_M`FHHV$$ef)F$e488T\^dKeKeE5OVVE25F5FOO#OOPPPV5<s<<===uR&RR488Hb3I3IRRSRRSSSE"" e$/JjTXT\T\]cegThThJjJj%1EdDHHU\^aLbLbEdEd!1FnPTPXPXYacfPgPghkikhkPlFnFn F3(?(?(D F F  [Deiememnvx{e|e|  ~A  A  ~A  fB  [D  [D'>N
 
 uc266)Y=N=NuVX=Y=Y+Z+Zcc^accdddN""xx##48JJLLHTZZ\\''--a00b
uJ66*b+A+AJJSJJKKKO##!! 	SZt,, 	S5Qs5zzQQCQQRRRuT66$((622F2F+K+KTTsTTUUU D117RG5JIbqbMJJJffWb.A.AJJSJJKKKr#   )rn   r  )@r^   loggingr   r  r  r  dataclassesr   r   difflibr   pathlibr   utilsr   _RED_RESET	getLoggerr[   rL  r2  r   ra   r9   r`   rF   rJ   rL   rO   rQ   rS   _MAX_INLINE_DIFF_FILES_MAX_INLINE_DIFF_LINESrW   rb   r   re   rg   ri   rm   ry   r   r   r   r   r   r_   r
  r  r  r  r  r%  r)  r/  r7  r=  rJ  rP  rR  r:   r  floatr  rI   r#   r!   <module>r&     sE      				 



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