+
    i3                     
  a  RY tO0 t R t^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIH	t	H
t
 ^ RIHt ^ RIHt RtRt]P"                  ! ]4      tRtRtRtR	tR
tRt^t^Pt]	 ! R R4      4       t^ s] ^ k R R ltR R ltR t R R lt!R R lt"R R lt#RZR R llt$R R lt%R[R R llt&R R  lt'R! R" lt(R# R$ lt)R% R& lt*R' R( lt+R) R* lt,R+ R, lt-R- R. lt.R/RR0R/R1 R2 llt/R3 R4 lt0R5 R6 lt1R7 R8 lt2R9]R:]/R; R< llt3R/RR0RR=R/R> R? llt4 ! R@ RA4      t5. R\Ot6. R]Ot7. R^Ot8. R_Ot9. R`Ot:. RaOt;. RbOt<. RcOt=RB RC lt>R[RD RE llt?RFt@RGtARtRH RI ltBRJ RK ltCRL RM ltDRN RO ltERPtFRQtGRRtHRFtIRStJRTtK^tLRdRU RV lltMRdRW RX lltNR# )ezCLI presentation -- spinner, kawaii faces, tool preview formatting.

Pure display functions and classes with no AIAgent dependency.
Used by AIAgent._execute_tool_calls for CLI feedback.
N)	dataclassfield)unified_diff)Pathz[31mz[0mz[38;2;150;150;150mz[38;2;180;160;255mz[38;2;120;120;140mz"[38;2;255;255;255;48;2;120;20;20mz![38;2;255;255;255;48;2;20;90;20mc                   T   a  ] tR t^!t o Rt]! ]R7      t]! ]R7      t	V 3R lt
RtV tR# )LocalEditSnapshotzGPre-tool filesystem snapshot used to render diffs locally after writes.)default_factoryc                f   < V ^8  d   Qh/ S[ S[,          ;R&   S[S[S[R,          3,          ;R&   # )   pathsNbefore)listr   dictstr)format__classdict__s   "*/home/ubuntu/hermes-agent/agent/display.py__annotate__LocalEditSnapshot.__annotate__!   s0      :3  cDj!?	      N)__name__
__module____qualname____firstlineno____doc__r   r   r   r   r   __annotate_func____static_attributes____classdictcell__r   s   @r   r   r   !   s#     Qd3E$)$$?F	  r   r   c                (    V ^8  d   QhR\         RR/# )r
   nreturnNint)r   s   "r   r   r   .   s     7 7 7 7r   c                H    V '       d   \        \        V 4      ^ 4      sR# ^ sR# )z?Set the global max length for tool call previews. 0 = no limit.N)maxr$   _tool_preview_max_len)r!   s   &r   set_tool_preview_max_lenr(   .   s     /0CANQr   c                $    V ^8  d   QhR\         /# r
   r"   r#   )r   s   "r   r   r   4   s     ! !# !r   c                     \         # )z9Return the configured max preview length (0 = unlimited).)r'   r   r   r   get_tool_preview_max_lenr,   4   s      r   c                 B     ^ RI Hp  V ! 4       #   \         d     R# i ; i)z5Get the active skin config, or None if not available.get_active_skinN)hermes_cli.skin_enginer/   	Exceptionr.   s    r   	_get_skinr2   =   s%    :   s    c                <    V ^8  d   QhR\         R\        R\        /# )r
   keydefaultr"   r   r   )r   s   "r   r   r   F   s!       d t r   c                `    \        4       pV'       d   VP                  V 4      pV'       d   V# V# )z@Get spinner face list from active skin, falling back to default.)r2   get_spinner_list)r4   r5   skinfacess   &&  r   get_skin_facesr;   F   s)    ;D%%c*LNr   c                $    V ^8  d   QhR\         /# r*   )r   )r   s   "r   r   r   P   s     ( ( (r   c                 |    \        4       p V '       d   V P                  R4      pV'       d   V# \        P                  # )z$Get thinking verbs from active skin.thinking_verbs)r2   r8   KawaiiSpinnerTHINKING_VERBS)r9   verbss     r   get_skin_verbsrB   P   s1    ;D%%&67L'''r   c                $    V ^8  d   QhR\         /# r*   r   )r   s   "r   r   r   Z   s      c r   c                 B    \        4       p V '       d   V P                  # R# )z2Get tool output prefix character from active skin.   ┊)r2   tool_prefix)r9   s    r   get_skin_tool_prefixrH   Z   s    ;Dr   c                <    V ^8  d   QhR\         R\         R\         /# )r
   	tool_namer5   r"   rD   )r   s   "r   r   r   b   s!      c C C r   c                   \        4       pV'       d8   VP                  '       d&   VP                  P                  V 4      pV'       d   V#  ^ RIHp VP                  V RR7      pV'       d   V#  V#   \         d     T# i ; i)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
)registry )r5   )r2   tool_emojisgettools.registryrL   	get_emojir1   )rJ   r5   r9   overriderL   emojis   &&    r   get_tool_emojirT   b   s     ;D   ##''	2O+""9b"9L 
 N  Ns    A1 ,A1 1B ?B c                0    V ^8  d   QhR\         R\         /# )r
   textr"   rD   )r   s   "r   r   r      s     " "3 "3 "r   c                @    RP                  V P                  4       4      # )z:Collapse whitespace (including newlines) to single spaces. )joinsplit)rV   s   &r   _oneliner[      s    88DJJL!!r   c          	      d    V ^8  d   QhR\         R\        R\        R,          R\         R,          /# )r
   rJ   argsmax_lenNr"   )r   r   r$   )r   s   "r   r   r      s9     h h# hT hC$J hRUX\R\ hr   c                	   Vf   \         pV'       g   R# / RRbRRbRRbRR	bR
R	bRR	bRRbRRbRRbRRbRRbRRbRRbRRbRRbRRbRR bR!R"R#R$R%RR&R/CpV R'8X  d   VP                  R R(4      pVP                  R)R(4      pVP                  R*R(4      pVP                  R+4      pV.pV'       d   VP                  VR,,          4       V'       d&   VP                  R-\        VR.,          4       R-24       V'       d   VR/8X  d   VP                  V R024       V'       d   R1P	                  V4      # R# V R28X  dP   VP                  R34      p	VP                  R4R54      p
V	f   R6# V
'       d   R7\        V	4       R82# R9\        V	4       R82# V R:8X  d@   \        VP                  RR(4      4      pR;VR<,           \        V4      ^8  d   R= R-2# R( R-2# V R>8X  d   VP                  R R(4      pVP                  R?R(4      pVR@8X  dC   \        VP                  RAR(4      4      pRBT RCVR<,           \        V4      ^8  d   R= R-2# R( R-2# VRD8X  d*   REV RC\        VP                  RFR(4      R.,          4       R-2# VRG8X  d*   RHV RC\        VP                  RFR(4      R.,          4       R-2# V# V RI8X  dW   VP                  R?RJ4      p\        VP                  RKR(4      4      p\        V4      ^8  d   VRL,          R=,           pRMV RCV R-2# V P                  RN4      '       d   RORPRQVP                  RR(4      RRRSRTVP                  RUR(4       RVVP                  RWR(4       2RXRYRZVP                  R[R(4      R,,          R\R]VP                  R[R(4      R,,           2R^VP                  R[R(4      R,,          R_R`RaVP                  Rb^4       Rc2/
pVP                  V 4      # VP                  V 4      pV'       g   Rd F  pVV9   g   K  Tp M	  V'       d   VV9  d   R# VV,          p\        V\        4      '       d   V'       d
   V^ ,          MR(p\        \        V4      4      pV'       g   R# V^ 8  d$   \        V4      V8  d   VRV^,
           R=,           pV# )ezBuild 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_typerV   image_generateprompttext_to_speechvision_analyzequestionmixture_of_agentsuser_prompt
skill_viewnameskills_listcategorycronjobactionexecute_codecodedelegate_taskgoalclarifyskill_manageprocessrM   
session_iddatatimeout:N   N":N   NwaitsrX   todotodosmergeFzreading task listz	updating z task(s)z	planning session_searchz	recall: ":N   N...memorytargetaddcontent+: "replace~old_textremove-send_message?message:N   Nzto rl_rl_list_environmentszlisting envsrl_select_environmentrl_get_current_configzreading configrl_edit_configr   =valuerl_start_trainingstartingrl_check_statusrun_idrl_stop_trainingz	stopping rl_get_resultsrl_list_runszlisting runsrl_test_inference	num_stepsz steps)rc   rV   ra   rg   ry   rr   r   r   )
r'   rO   appendr[   rY   len
startswith
isinstancer   r   )rJ   r]   r^   primary_argsr}   sidr   timeout_valparts	todos_argr   rc   r   r   msgrl_previewsr4   fallback_keyr   previews   &&&                 r   build_tool_previewr      s    'I+W6CVV)63:F 		 $6u 		 !/	
 	(
 %5f 	* ':= 	f ,Z 	8 	:~vL I(B'hh|R(xx#hhy)LLS"LL1Xd3i01346V+LLK=*+"'sxx1T1FHHW%	%(&s9~.h77s9~.h77$$'2./E#J<Ub'ILLb'ILLH(B'(B'U?txx	267Gvhd73<.#g,:K0TTVWWQS0TTVWWy vhd8DHHZ,DS,I#J"K2NNxvhd8DHHZ,DS,I#J"K2NNN"(C(txx	2./s8b=c(U"CVHDR((E"""N#TXXfb%9#%5'2!6 7q'29N8OPtxx"5c:)DHHXr,B3,G+H Idhhx4S9NDHH[!$<#=V!D
 y))


9
%CbLt#" c
 #T/IE%!ars5z"G{s7|g-,7Q;'%/Nr   c                0    V ^8  d   QhR\         R\        /# r
   rg   r"   )r   r   )r   s   "r   r   r      s     " " " "r   c                    \        \        P                  P                  V 4      4      pVP	                  4       '       d   V# \         P
                  ! 4       V,          # )zDResolve a possibly-relative filesystem path against the current cwd.)r   osrg   
expanduseris_absolutecwd)rg   	candidates   & r   _resolved_pathr      sA    RWW''-.I88:	!!r   c                >    V ^8  d   QhR\         R\        R,          /# )r
   rg   r"   Nr   r   )r   s   "r   r   r      s       #* r   c                l     V P                  RR7      #   \        \        \        \        3 d     R# i ; i)z@Return UTF-8 file content, or None for missing/unreadable files.utf-8)encodingN)	read_textFileNotFoundErrorIsADirectoryErrorUnicodeDecodeErrorOSErrorrg   s   &r   _snapshot_textr      s5    ~~w~//02DgN s    33c                0    V ^8  d   QhR\         R\        /# r   r   )r   s   "r   r   r     s      T c r   c                     \        V P                  4       P                  \        P                  ! 4       P                  4       4      4      #   \
         d    \        T 4      u # i ; i)z2Prefer cwd-relative paths in diffs when available.)r   resolverelative_tor   r   r1   r   s   &r   _display_diff_pathr     sK    4<<>--dhhj.@.@.BCDD 4ys   AA A$#A$c                F    V ^8  d   QhR\         R\        \        ,          /# )r
   r]   r"   )r   r   r   )r   s   "r   r   r     s      d tDz r   c                n   V P                  R4      pV P                  R4      pV'       d	   V'       g   . # ^ RIHpHp VR8X  d"   V! W P                  R4      4      pVR,          .# V! V4      pV'       g   . # \	        VR,          4      pVR9   d-   V P                  R4      pV'       d
   WW,          .# VR,          .# VR9   d%   V P                  R4      pV'       d
   WW,          .# . # VR	8X  dC   \        VP                  R
4      4       Uu. uF  qP                  4       '       g   K  VNK  	  p	pV	# . # u upi )z7Resolve skill_manage write targets to filesystem paths.r}   ry   )_find_skill_resolve_skill_dircreater{   zSKILL.mdrg   	file_pathdelete*>   editri   >   rh   remove_file)rO   tools.skill_manager_toolr   r   r   sortedrglobis_file)
r]   r}   ry   r   r   	skill_direxistingr   rg   filess
   &         r   _resolve_skill_manage_pathsr     s   XXhF88FD	H&tXXj-AB	J&''4 H	Xf%&I""HH[)	*3	%&Q)j:P9QQ..HH[)	*3	%&;;"()=">Q">$,,.">QI Rs   
D2&D2c                `    V ^8  d   QhR\         R\        R,          R\        \        ,          /# r
   rJ   function_argsNr"   )r   r   r   r   )r   s   "r   r   r   *  s*       TD[ TRVZ r   c                   \        V\        4      '       g   . # V R8X  d(   VP                  R4      pV'       d   \        V4      .# . # V R8X  d(   VP                  R4      pV'       d   \        V4      .# . # V R8X  d   \	        V4      # . # )z9Resolve local filesystem targets for write-capable tools.rh   rg   ri   r   )r   r   rO   r   r   )rJ   r   rg   s   && r   _resolve_local_edit_pathsr   *  s    mT**	L   ()-t$%525G  ()-t$%525N"*=99Ir   c                X    V ^8  d   QhR\         R\        R,          R\        R,          /# r   r   r   r   )r   s   "r   r   r   =  s,     	 	3 	td{ 	O`cgOg 	r   c                    \        W4      pV'       g   R# \        VR7      pV F$  p\        V4      VP                  \	        V4      &   K&  	  V# )z.Capture before-state for local write previews.N)r   )r   r   r   r   r   )rJ   r   r   snapshotrg   s   &&   r   capture_local_edit_snapshotr   =  sB    %i?E u-H%3D%9D	" Or   c                >    V ^8  d   QhR\         R,          R\        /# )r
   resultNr"   r   bool)r   s   "r   r   r   I  s      cDj T r   c                0   V '       g   R#  \         P                  ! V 4      p\	        T\
        4      '       g   R# TP                  R4      '       d   R# RT9   d   \        TP                  R4      4      # R#   \         P                  \        3 d     R# i ; i)z?Conservatively detect whether a tool result represents success.FerrorsuccessT)jsonloadsJSONDecodeError	TypeErrorr   r   rO   r   )r   r   s   & r   _result_succeededr  I  s}    zz&! dD!!xxDDHHY'((   ), s   A6 6BBc                L    V ^8  d   QhR\         R,          R\        R,          /# )r
   r   Nr"   )r   r   )r   s   "r   r   r   Z  s(     X X"3d": XsTz Xr   c           
        V '       g   R# . pV P                    F  pV P                  P                  \        V4      4      p\	        V4      pW48X  d   K:  \        V4      pRP                  \        Vf   . MVP                  RR7      Vf   . MVP                  RR7      RV 2RV 2R7      4      pV'       g   K  VP                  V4       K  	  V'       g   R# RP                  R V 4       4      # )	zHGenerate unified diff text from a stored before-state and current files.NrM   T)keependsza/zb/)fromfiletofilec              3   d   "   T F&  qP                  R 4      '       d   TMVR ,           x  K(  	  R# 5i)
N)endswith).0chunks   & r   	<genexpr>&_diff_from_snapshot.<locals>.<genexpr>t  s'     WPVuNN4005edlBPVs   .0)
r   r   rO   r   r   r   rY   r   
splitlinesr   )r   chunksrg   r   afterdisplay_pathdiffs   &      r   _diff_from_snapshotr  Z  s    F$$SY/t$?)$/wwn&*;*;T*;*Jm)9)94)9)Hl^,L>*	
 4MM$! $ 77WPVWWWr   r   r   c                    V ^8  d   QhR\         R\         R,          R\        R,          R\        R,          R\         R,          /# r
   rJ   r   Nr   r   r"   r   )r   s   "r   r   r   w  sK     ) ))$J) $;	)
  $&) 	4Z)r   c                  V R8X  du   V'       dm    \         P                  ! V4      p\	        V\
        4      '       d@   VP                  R4      p\	        V\        4      '       d   VP                  4       '       d   V# V R9  d   R# \        V4      '       g   R# \        V4      #   \         P                  \        3 d    Rp Li ; i)z4Extract a unified diff from a file-edit tool result.ri   Nr  >   ri   rh   r   )r   r   r   r   r   r   rO   r   stripr  r  )rJ   r   r   r   r   r  s   &&$$  r   extract_edit_diffr  w  s     G	::f%D dD!!88F#D$$$??V$$x(( $$i0 	D	s   B# #CCc                0    V ^8  d   QhR\         R\        /# )r
   	diff_textr"   r   )r   s   "r   r   r     s     
 
 
4 
r   c                    Ve	   V '       g   R#  V! R4       V P                  R4      P                  4        F  pV! V4       K  	  R#   \         d     R# i ; i)zFEmit rendered diff text through the CLI's prompt_toolkit-safe printer.Fu     ┊ review diffr  T)rstripr  r1   )r  print_fnlines   && r   _emit_inline_diffr    sU    y$%$$T*557DTN 8 s   6A AAc                F    V ^8  d   QhR\         R\        \         ,          /# r
   r  r"   r6   )r   s   "r   r   r     s      c d3i r   c                   . pRpRpV P                  4        EF  pVP                  R4      '       d   VR,          P                  4       pK4  VP                  R4      '       d`   VR,          P                  4       pV'       g	   V'       d7   TP                  \         T;'       g    R RT;'       g    R \
         24       K  VP                  R4      '       d"   VP                  \         V \
         24       K  VP                  R	4      '       d#   VP                  \         V \
         24       EK  VP                  R
4      '       d#   VP                  \         V \
         24       EKT  VP                  R4      '       d#   VP                  \         V \
         24       EK  V'       g   EK  VP                  V4       EK  	  V# )z=Render unified diff lines in Hermes' inline transcript style.N--- :   NNz+++ za/?u    → zb/?z@@r   r   rX   )
r  r   r  r   
_ANSI_FILE_ANSI_RESET
_ANSI_HUNK_ANSI_MINUS
_ANSI_PLUS	_ANSI_DIM)r  rendered	from_fileto_fileraw_lines   &    r   _render_inline_unified_diffr/    ss   HIGOO%v&& **,Iv&&rl((*GG:,y/A/AE.B%HXHXSXGYZeYf ght$$OOzl8*[MBCs##OO{mH:k]CDs##OOzl8*[MBCs##OOyk(K=AB8OOH%- &0 Or   c                F    V ^8  d   QhR\         R\        \         ,          /# r!  r6   )r   s   "r   r   r     s"     C Cs CtCy Cr   c                T   . p. pV P                  4        FI  pVP                  R4      '       d   V'       d   VP                  V4       V.pK8  VP                  V4       KK  	  V'       d   VP                  V4       V Uu. uF  qD'       g   K  RP                  V4      NK  	  up# u upi )z,Split a unified diff into per-file sections.r#  r  )r  r   r   rY   )r  sectionscurrentr  sections   &    r   _split_unified_diff_sectionsr5    s     "HG!??6""wOOG$fGt "  .6Bh7'DIIghBBBs   ?	B%B%	max_files	max_linesc          	      ^    V ^8  d   QhR\         R\        R\        R\        \         ,          /# )r
   r  r6  r7  r"   )r   r$   r   )r   s   "r   r   r     s6     * *
* * 	*
 
#Y*r   c          	        \        V 4      p. p^ p^ p\        V4       EF   w  rxWq8  d'   V^,          pV\        \        V4      4      ,          pK2  \        V4      p	V\        V4      ,
          p
V
^ 8:  d   V\        V	4      ,          pV^,          pKs  \        V	4      V
8:  d   VP	                  V	4       K  VP	                  V	RV
 4       V\        V	4      V
,
          ,          pV^\        ^ \        V4      V,
          ^,
          4      ,           ,          pW7^,           R  F  pV\        \        V4      4      ,          pK   	   M	  V'       g	   V'       d;   RV R2pV'       d   VRV R2,          pVP                  \         V \         24       V# )zCRender diff sections while capping file count and total line count.Nu   … omitted z diff line(s)z across z additional file(s)/section(s))	r5  	enumerater   r/  extendr&   r   r'  r&  )r  r6  r7  r2  r+  omitted_filesomitted_linesidxr4  section_linesremaining_budgetleftoversummarys   &$$          r   !_summarize_rendered_diff_sectionsrC    ss    ,D1HHMM!(+QMS!<W!EFFM3G<$s8}4q S//MQM}!11OOM*&7'789]+.>>>SCMC$7!$;<<< q*HS!<X!FGGM +- ,0  }=-0NOOG:,wi}=>Or   r  c          
      ~    V ^8  d   QhR\         R\         R,          R\        R,          R\        R,          R\        /# r  )r   r   r   r   )r   s   "r   r   r     sN     B BB$JB $;	B
  $&B 
Br   c                   \        V VVVR7      pV'       g   R#  \        V4      p\        RP                  T4      T4      #   \         d"   p\        P	                  RT4        Rp?R# Rp?ii ; i)z?Render an edit diff inline without taking over the terminal UI.)r   r   Fz Could not render inline diff: %sNr  )r  rC  r1   loggerdebugr  rY   )rJ   r   r   r   r  r  rendered_linesexcs   &&$$$   r   render_edit_diff_with_deltarJ    sm     #	D :4@ TYY~6AA  7=s   A A-A((A-c                   4  a  ] tR tRt o RtR. R OR. R!OR. R"OR. R#OR. R$OR. R%OR	. R&OR
. R'OR. R(O/	t. R)Ot. R*Ot. R+OtR,V 3R lR llt	R-V 3R lR llt
]V 3R lR l4       tV 3R lR ltR tR tV 3R lR ltV 3R lR ltR.V 3R lR lltR tR tRtV tR# )/r?   i  zJAnimated spinner with kawaii faces for CLI feedback during tool execution.dotsbouncegrowarrowsstarmoonpulsebrainsparkleNc                &   < V ^8  d   QhRS[ RS[ /# )r
   r   spinner_typerD   )r   r   s   "r   r   KawaiiSpinner.__annotate__:  s        r   c                    Wn         V P                  P                  W P                  R ,          4      V n        RV n        RV n        ^ V n        RV n        ^ V n        W0n	        \        P                  V n        R# )rL  FN)r   SPINNERSrO   spinner_framesrunningthread	frame_idx
start_timelast_line_len	_print_fnsysstdout_out)selfr   rV  r  s   &&&&r   __init__KawaiiSpinner.__init__:  s_    "mm//mmF>ST " JJ	r   c                ,   < V ^8  d   QhRS[ RS[ RS[/# )r
   rV   endflushr   )r   r   s   "r   r   rW  J  s"      3 S  r   c                *   V P                   e    V P                  V4       R#  V P                  P                  W,           4       V'       d   V P                  P	                  4        R# R#   \         d     R# i ; i  \
        \        3 d     R# i ; i)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`  r1   rc  writeri  
ValueErrorr   )rd  rV   rh  ri  s   &&&&r   _writeKawaiiSpinner._writeJ  s     >>%t$ 	IIOODJ'		!    G$ 		s#   A+ AA= +A:9A:=BBc                    < V ^8  d   QhRS[ /# r*   r   )r   r   s   "r   r   rW  ^  s       r   c                     \        V P                  R4      ;'       d    V P                  P                  4       #   \        \        3 d     R# i ; i)z@Check if output is a real terminal, safe against closed streams.isattyF)hasattrrc  rr  rl  r   rd  s   &r   _is_ttyKawaiiSpinner._is_tty]  sD    	499h/FFDII4D4D4FFG$ 		s   : : AAc                    < V ^8  d   QhRS[ /# r*   rp  )r   r   s   "r   r   rW  e  s       r   c                `     ^ RI Hp \        V P                  V4      #   \         d     R# i ; i)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.
)StdoutProxyF)prompt_toolkit.patch_stdoutry  r   rc  ImportError)rd  ry  s   & r   _is_patch_stdout_proxy$KawaiiSpinner._is_patch_stdout_proxye  s-    	?dii55 		s    --c                   V P                   '       gM   V P                  R V P                   2RR7       V P                  '       d   \        P
                  ! R4       K*  R# V P                  4       '       d-   V P                  '       d   \        P
                  ! R4       K*  R# \        4       pV'       d   VP                  4       M. pV P                  '       Ed{   \        P                  ! R4      '       d   \        P
                  ! R4       KG  V P                  V P                  \        V P                  4      ,          ,          p\        P                  ! 4       V P                  ,
          pV'       dC   W P                  \        V4      ,          ,          w  rVRV RV RV P                   RV R	VR
 R2pMRV RV P                   R	VR
 R2p\        V P                   \        V4      ,
          ^ 4      pV P                  RV RV,           2RRR7       \        V4      V n        V ;P                  ^,          un        \        P
                  ! R4       EK  R# )z	  [tool] Tri        ?Ng?HERMES_SPINNER_PAUSE  rX    (.1fs)rM   rh  ri  gQ?)ru  rm  r   r[  timesleepr|  r2   get_spinner_wingsr   getenvrZ  r]  r   r^  r&   r_  )	rd  r9   wingsframeelapsedleftrightr  pads	   &        r   _animateKawaiiSpinner._animateu  s    |||KK)DLL>2$K?,,,

3 &&((,,,

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

3''T=P=P9Q(QREiikDOO3G#NNSZ$?@D65'4<<.%73-rRE7!DLL>GC=Cd((3t94a8CKK"TF39+.BdKC!$TDNNaNJJt r   c                    V P                   '       d   R # RV n         \        P                  ! 4       V n        \        P                  ! V P
                  RR7      V n        V P                  P                  4        R # )NT)r   daemon)r[  r  r^  	threadingThreadr  r\  startrt  s   &r   r  KawaiiSpinner.start  sJ    <<<))+&&dmmDIr   c                    < V ^8  d   QhRS[ /# )r
   new_messagerD   )r   r   s   "r   r   rW    s     # #s #r   c                    Wn         R # N)r   )rd  r  s   &&r   update_textKawaiiSpinner.update_text  s    "r   c                    < V ^8  d   QhRS[ /# )r
   rV   rD   )r   r   s   "r   r   rW    s     9 9 9r   c                    V P                   '       g   V P                  RV 2RR7       R# R\        V P                  ^,           ^(4      ,          pV P                  RV RV 2RR7       R# )at  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  NrX   r  z  )r[  rm  r&   r_  )rd  rV   blankss   && r   print_aboveKawaiiSpinner.print_above  sa     |||KK"TF4K0 s4--1266bTF+48r   c                    < V ^8  d   QhRS[ /# )r
   final_messagerD   )r   r   s   "r   r   rW    s     N N# Nr   c                   R V n         V P                  '       d   V P                  P                  RR7       V P                  pV'       d=   R\	        V P
                  ^,           ^(4      ,          pV P                  RV R2RRR7       V'       dz   V P                  '       d,   R\        P                  ! 4       V P                  ,
          R	 R
2MRpV'       d   V P                  RV 2RR7       R# V P                  RV V 2RR7       R# R# )Fr  )r   rX   r  rM   Tr  r  r  r  r  r  z	  [done] N)	r[  r\  rY   ru  r&   r_  rm  r^  r  )rd  r  is_ttyr  r  s   &&   r   stopKawaiiSpinner.stop  s    ;;;KKS) 3t11A5r::FKK"VHBRtK<DHOOO499;8=R@Y[Gb0=iwi@M r   c                &    V P                  4        V # r  )r  rt  s   &r   	__enter__KawaiiSpinner.__enter__  s    

r   c                &    V P                  4        R # )F)r  )rd  exc_typeexc_valexc_tbs   &&&&r   __exit__KawaiiSpinner.__exit__  s    		r   )	rc  r`  r]  r_  r   r[  rZ  r^  r\  )
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  )
   (｡◕‿◕｡)   (◕‿◕✿)   ٩(◕‿◕｡)۶   (✿◠‿◠)   ( ˘▽˘)っ   ♪(´ε` )   (◕ᴗ◕✿)   ヾ(＾∇＾)   (≧◡≦)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brainstorming)rM   rL  N)r  Fr  )r   r   r   r   r   rY  KAWAII_WAITINGKAWAII_THINKINGr@   re  rm  propertyru  r|  r  r  r  r  r  r  r  r   r   r   s   @r   r?   r?     s     T 	VJrJHP;PE
HN
ON   &    'R# #9 9$N N$ r   r?   c                l    V ^8  d   QhR\         R\         R,          R\        \        \         3,          /# )r
   rJ   r   Nr"   )r   tupler   )r   s   "r   r   r     s.     " "C "t "dCi@P "r   c                   Vf   R# V R8X  d>    \         P                  ! V4      pVP                  R4      pVe   V^ 8w  d	   RRV R23# R# V R	8X  dF    \         P                  ! V4      pVP                  R
4      RJ d   RVP                  RR4      9   d   R# VR,          P                  4       pRV9   g   RV9   g   VP                  R4      '       d   R# R#   \         P                  \        \
        3 d    \        P                  R4        R# i ; i  \         P                  \        \
        3 d    \        P                  R4        Li ; i)zInspect 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, "")``.
FrM   r`   	exit_codeTz [exit ]z;Could not parse terminal result as JSON for exit code checkr   r   zexceed the limitr   z8Could not parse memory result as JSON for capacity check:Ni  Nz"error"z"failed"Error)FrM   )Tz [full])Tz [error])
r   r   rO   r   r   AttributeErrorrF  rG  lowerr   )rJ   r   r   r  r  s   &&   r   _detect_tool_failurer    sH    ~J	X::f%D-I$awyk333  H	U::f%Dxx	"e+0BdhhwXZF[0[&&
 4L EEZ50F4E4Eg4N4N% $$i@ 	XLLVW	X $$i@ 	ULLST	Us$   9C AD 5DD5E
Ec          
      b    V ^8  d   QhR\         R\        R\        R\         R,          R\         /# )r
   rJ   r]   durationr   Nr"   )r   r   float)r   s   "r   r   r   '  sF     \L \L\L\L*/\L9<t\L\Lr   c                &  aaa  VR R2p\        W4      w  oo\        4       o RR lpRR lpR VVV 3R llpV R8X  d&   V! RV! VP                  R	R
4      ^*4       RV 24      # V R8X  d   VP                  R. 4      pV'       d   \        V\        4      '       d
   V^ ,          M
\        V4      p	V	P                  RR
4      P                  RR
4      P                  R4      ^ ,          p
\        V4      ^8  d   R\        V4      ^,
           2MR
pV! RV! V
^#4       V RV 24      # V! RV 24      # V R8X  d`   VP                  RR
4      p	V	P                  RR
4      P                  RR
4      P                  R4      ^ ,          p
V! RV! V
^#4       RV 24      # V R8X  d&   V! RV! VP                  RR
4      ^*4       RV 24      # V R8X  dp   VP                  RR4      pVP                  RR
4      R,          pRR R!R"V 2R#R$V 2R%R&V 2R'R(V 2R)R*V 2R+R,V 2/pV! R-VP                  W R.V 24       RV 24      # V R/8X  d%   V! R0V! VP                  R1R
4      4       RV 24      # V R28X  d%   V! R3V! VP                  R1R
4      4       RV 24      # V R48X  d%   V! R5V! VP                  R1R
4      4       RV 24      # V R68X  dI   V! VP                  R7R
4      ^#4      pVP                  R8R94      pVR:8X  d   R;MR<pV! R=VR> R.V RV 24      # V R?8X  d`   VP                  RR
4      p	V	P                  RR
4      P                  RR
4      P                  R4      ^ ,          p
V! R@V! V
^#4       RV 24      # V RA8X  d*   VP                  RB4      '       d   RBMRCpV! RDV RV 24      # V RE8X  d   V! RFVP                  RGR4       RV 24      # V RH8X  d&   V! RIV! VP                  RJR
4      ^4       RKV 24      # V RL8X  d>   VP                  RMRN4      pRNRORPRQRRRSRTRU/P                  VRO4      pV! RVV RWV RV 24      # V RX8X  d   V! RYV 24      # V RZ8X  d   V! R[VP                  R\R4       RV 24      # V R]8X  d   V! R^V 24      # V R_8X  d   V! R`V 24      # V Ra8X  d   V! RbV 24      # V Rc8X  di   VP                  Rd4      pVP                  ReRf4      pVf   V! RhV 24      # V'       d   V! Ri\        V4       RjV 24      # V! Rk\        V4       RjV 24      # V Rl8X  d&   V! RmV! VP                  R	R
4      ^#4       RKV 24      # V Rn8X  d   VP                  RR4      pVP                  R8R
4      pVRo8X  d)   V! RpV RqV! VP                  R9R
4      ^4       RKV 24      # VRr8X  d)   V! RsV RqV! VP                  RtR
4      ^4       RKV 24      # VRu8X  d)   V! RvV RqV! VP                  RtR
4      ^4       RKV 24      # V! RwV RV 24      # V Rx8X  d   V! RyVP                  RzR{4       RV 24      # V R|8X  d&   V! R}V! VP                  R~R
4      ^4       RV 24      # V R8X  d&   V! RV! VP                  RR
4      ^#4       RV 24      # V R8X  d&   V! RV! VP                  RJR
4      ^4       RV 24      # V R8X  d&   V! RV! VP                  RR
4      ^4       RV 24      # V R8X  d&   V! RV! VP                  RR
4      ^4       RV 24      # V R8X  d9   V! RVP                  R8R4       RqV! VP                  RR
4      ^4       RKV 24      # V R8X  d   VP                  RR4      pVR8X  d   VP                  R4      ;'       g,    VP                  R4      '       g   . MVP                  R4      .pVP                  R~4      ;'       g.    V'       d
   V^ ,          MRg;'       g    VP                  RR4      pV! RV! V^4       RV 24      # VR8X  d   V! RV 24      # V! RV R.VP                  RR
4       RV 24      # V P                  R4      '       d   RRRRVP                  R~R
4       2RRRRVP                  RR4       2RRRRVP                  RR4      R,           2RRVP                  RR4      R,           2RRVP                  RR4      R,           2RRRR/
pV! RVP                  W P                  RR
4      4       RV 24      # V R8X  df   VP                  RR
4      pVP                  4       '       d'   VP                  4       P                  R4      ^ ,          MR
pV! RV! V^#4       RV 24      # V R8X  dl   VP                  R4      pV'       d.   \        V\        4      '       d   V! R\        V4       RV 24      # V! RV! VP                  RR
4      ^#4       RV 24      # \        W4      ;'       g    R
pV! RV R,          R> R.V! V^#4       RV 24      # )zGenerate a formatted tool completion line for CLI quiet mode.

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

When *result* is provided the line is checked for failure indicators.
Failed tool calls get a red prefix and an informational suffix.
r  r   c                 |    \        V 4      p \        ^ 8X  d   V # \        V 4      V8  d   V RV^,
           R,           # T # )    Nr   r   r'   r   )r   r!   s   &&r   _trunc%get_cute_tool_message.<locals>._trunc5  s;    F A%H$'FQJ$1Q3%5A5r   c                 |    \        V 4      p \        ^ 8X  d   V # \        V 4      V8  d   RW^,
          ) R ,           # T # )r  r   Nr  )pr!   s   &&r   _path$get_cute_tool_message.<locals>._path;  s<    F A%H'*1vzaC&'
"8q8r   c                0    V ^8  d   QhR\         R\         /# )r
   r  r"   rD   )r   s   "r   r   +get_cute_tool_message.<locals>.__annotate__A  s     ) )C )C )r   c                X   < SR8w  d   V P                  RS^4      p S'       g   V # V  S 2# )z*Apply skin tool prefix and failure suffix.rF   )r   )r  failure_suffix
is_failureskin_prefixs   &r   _wrap$get_cute_tool_message.<locals>._wrapA  s5    %<<{A6DK'((r   rb   u   ┊ 🔍 search    rc   rM   r  rd   re   zhttps://zhttp:///z +u   ┊ 📄 fetch     u   ┊ 📄 fetch     pages  	web_crawlrm   u   ┊ 🕸️  crawl     r`   u   ┊ 💻 $         ra   r   r}   r   r   :N   Nr   zls processespollzpoll logzlog r   zwait killzkill rk  zwrite submitzsubmit u   ┊ ⚙️  proc      rX   rf   u   ┊ 📖 read      rg   rh   u   ┊ ✍️  write     ri   u   ┊ 🔧 patch     rj   rk   r   r   r   findgrepu	   ┊ 🔎 9rl   u   ┊ 🌐 navigate  browser_snapshotfullcompactu   ┊ 📸 snapshot  rn   u   ┊ 👆 click     ro   rp   u   ┊ ⌨️  type      "rV   z"  browser_scroll	directiondownr  upr  r  r  r  r  u   ┊ z  scroll    browser_backu   ┊ ◀️  back      browser_pressu   ┊ ⌨️  press     r4   browser_closeu   ┊ 🚪 close     browser  browser_get_imagesu#   ┊ 🖼️  images    extracting  browser_visionu'   ┊ 👁️  vision    analyzing page  r   r   r   FNu"   ┊ 📋 plan      reading tasks  u   ┊ 📋 plan      update z
 task(s)  u   ┊ 📋 plan      r   u   ┊ 🔍 recall    "r   r   u   ┊ 🧠 memory    +r   r   u   ┊ 🧠 memory    ~r   r   u   ┊ 🧠 memory    -u   ┊ 🧠 memory    rz   u   ┊ 📚 skills    list r{   allrx   u   ┊ 📚 skill     ry   rq   u   ┊ 🎨 create    rr   rs   u   ┊ 🔊 speak     rt   u   ┊ 👁️  vision    ru   rv   u   ┊ 🧠 reason    rw   r   u   ┊ 📨 send      r   r|   r   skillsskilltasku   ┊ ⏰ cron      create u   ┊ ⏰ cron      listing  u   ┊ ⏰ cron      job_idr   r   z	list envsr   zselect r   z
get configr   zset r   r   zstart trainingr   zstatus r   r   zstop r   zresults r   z	list runsr   ztest inferenceu   ┊ 🧪 rl        r~   r   r  u   ┊ 🐍 exec      r   tasksu   ┊ 🔀 delegate  z parallel tasks  r   u   ┊ ⚡ :N	   N)(   )#   )r  rH   rO   r   r   r   r   rZ   r   r   r  r   )!rJ   r]   r  r   durr  r  r  re   rm   domainextrar}   r   labelsrk   r   verbmodedarrowr   r   r  labelrlr   
first_liner  r   r  r  r  s!   &&&&                          @@@r   get_cute_tool_messager+  '  s    cN!
C!5i!HJ&(K69) ) L *6$((7B2G+L*MRPSuUVVM!xx#'d33$q'TC[[R088BGMMcRSTUF*-d)a-bT1&RE.vfb/A.B5'C5QRR1#788Khhub!Z,44YCII#NqQ.vfb/A.B"SEJKKJ*6$((9b2I2+N*OrRUQVWXXI(C(hh|R(-.&E#-$seE#-56RUQVYaelmplqcrt-fjj81SEAR.S-TTVWZV[\]]K*5&"1E+F*Gr#OPPL -eDHHVR4H.I-J"SERSSG*5&"1E+F*Gr#OPPN")R0"5(I.7*vya'"SE:;;&&hhub!Z,44YCII#NqQ*6&"+=*>bFGG&&&))vy*4&3%899O#*488E3+?*@3%HIIN"/txx7KR0P/QQUVYUZ[\\$$HH[&)eWeVUKOOPQSXYtE7,qcC59::N"-cU344O#-dhhuc.B-C2cUKLLO#3C59::((:3%@AA$$>seDEEFHHW%	%(=cUCDD5c)n5EZPSuUVV.s9~.>jNOO$$,VDHHWb4I2-N,OtTWSXYZZH(C((B'U?/xtF488IWYCZ\^<_;``dehdijkky /xtF488JXZC[]_<`;aaefiejkllx/xtF488JXZC[]_<`;aaefiejkll*6("SE:;;M!/U0K/LBseTUUL *6$((622F+K*LBseTUU$$*6$((8R2H"+M*NbQTPUVWW$$*6$((622F+K*LBseTUU$$.vdhhz26NPR/S.TTVWZV[\]]''*6$((="2Mr+R*SSUVYUZ[\\N"*488Hc+B*C4txxXaceOfhjHkGllpqtpuvwwI(C(XXXh'aadhhw6G6GBdhhW^N_M`FHHV$eef$ee488T\^dKeE4VE25F4Gr#OPPV6se<==)&488Hb3I2J"SERSSE"""K1HGTXT\T\]cegThSiJj#\3CtDHHU\^aLbKcEd!13DPTPXPXYacfPghkPlOmFn%3(?(D'E FHX\deiememnvx{e|  ~A  fB  eC  [DK)<>N
 *266)=N=NuVX=Y+Z*[[]^a]bcddN"xx#48JJLLTZZ\''-a0b
*6*b+A*B"SEJKKO#!Zt,,.s5zl:KC5QRR*6$((622F+K*LBseTUU 177RG8IbM!,AfWb.A-B"SEJKKr   z[2mz[38;5;117mc                <    V ^8  d   QhR\         R\         R\         /# r
   	workspacesession_namer"   rD   )r   s   "r   r   r     s!      # S S r   c                >    ^ RI Hp RV! V RR7       RV! VRR7       2# )z%Build a Honcho app URL for a session.)quotez)https://app.honcho.dev/explore?workspace=rM   )safez&view=sessions&session=)urllib.parser1  )r.  r/  r1  s   && r   honcho_session_urlr4    s3    "IB/0,R01	3r   c                <    V ^8  d   QhR\         R\         R\         /# )r
   rm   rV   r"   rD   )r   s   "r   r   r     s!     6 6C 6s 6s 6r   c                    RV  RV R2# )zGOSC 8 terminal hyperlink (clickable in iTerm2, Ghostty, WezTerm, etc.).z]8;;z\z]8;;\r   )rm   rV   s   &&r   
_osc8_linkr7    s    cU&n55r   c                <    V ^8  d   QhR\         R\         R\         /# r-  rD   )r   s   "r   r   r     s!     ? ?3 ?c ?c ?r   c                p    \        W4      p\        V\         V \         24      p\         R\         RV 2# )z?One-line session indicator: `Honcho session: <clickable name>`.zHoncho session:rX   )r4  r7  	_SKY_BLUEr&  _DIM)r.  r/  rm   linked_names   &&  r   honcho_session_liner=    s<    
Y
5CSYK~k]"KLKV?;-q>>r   c                (    V ^8  d   QhR\         RR/# )r
   rV   r"   NrD   )r   s   "r   r   r     s      C D r   c                f    \         P                  ! R\         P                  4      p\         P                  ! WP	                  R4      4       \         P
                  ! V4       R#   \         dB    \        P                  P                  T 4       \        P                  P                  4         R# i ; i)z5Write directly to /dev/tty, bypassing stdout capture.z/dev/ttyr   N)
r   openO_WRONLYrk  encodecloser   ra  rb  ri  )rV   fds   & r   	write_ttyrE    sl    WWZ-
[[)*
 



s   A A$ $AB0/B0z[36mz[33mz[1mu   ▰u   ▱c          
      T    V ^8  d   QhR\         R\        R\         R\        R\        /# )r
   compaction_progressthreshold_tokensthreshold_percentcompression_enabledr"   )r  r$   r   r   )r   s   "r   r   r     s:     " """ " 	"
 	"r   c                   \        \        V ^d,          4      ^d4      p\        \        V \        ,          4      \        4      p\        V,          \        \        V,
          ,          ,           pVR8  d   VR,           R2M
\        V4      p\        V^d,          4      p\         \         2p	Rp
V'       d   RpMRpRV	 V
 RV RV R	\         R\         V R
V RV \         2# )u  Build a formatted context pressure line for CLI display.

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

Args:
    compaction_progress: How close to compaction (0.0–1.0, 1.0 = fires).
    threshold_tokens: Compaction threshold in tokens.
    threshold_percent: Compaction threshold as a fraction of context window.
    compression_enabled: Whether auto-compression is active.
i  ku   ⚠zcompaction approachingzno auto-compactionr  z	 context rX   z% to compactionz threshold (u   %) · )
minr$   
_BAR_WIDTH_BAR_FILLED
_BAR_EMPTYr   _BOLD_YELLOWr&  	_DIM_ANSI)rG  rH  rI  rJ  pct_intfilledbarthreshold_kthreshold_pct_intcoloriconhints   &&&&        r   format_context_pressurer\    s    " #)C/0#6G(:56
CF

zF/B!C
CC4D4L%-.a0RUVfRgK-34ggYED'# UGD63%q	
YK}L1B0C6$P[}	^r   c                H    V ^8  d   QhR\         R\         R\        R\        /# )r
   rG  rI  rJ  r"   )r  r   r   )r   s   "r   r   r   &  s6     E EEE E 		Er   c                :   \        \        V ^d,          4      ^d4      p\        \        V \        ,          4      \        4      p\        V,          \        \        V,
          ,          ,           p\        V^d,          4      pRpV'       d   RV R2pMRpV RV RV RV 2# )u   Build a plain-text context pressure notification for messaging platforms.

No ANSI — just Unicode and plain text suitable for Telegram/Discord/etc.
The percentage shows progress toward the compaction threshold.
u   ⚠️z+Context compaction approaching (threshold: z% of window).u9   Auto-compaction is disabled — context may be truncated.z
 Context: rX   z% to compaction
)rM  r$   rN  rO  rP  )	rG  rI  rJ  rT  rU  rV  rX  rZ  r[  s	   &&&      r   format_context_pressure_gatewayr_  &  s     #)C/0#6G(:56
CF

zF/B!C
CC-34D<=N<O}]JV:cU!G9,=dVDDr   c                @    V ^8  d   Qh/ ^ \         9   d
   \        ;R&   # )r
   r'   )__conditional_annotations__r$   )r   s   "r   r   r      s       T  s Ur   )u   ⚡r  )
r  r  r  r  r  r  r  u   ♪～(´ε｀ )u   (ノ´ヮ`)ノ*:・゚✧   ＼(◎o◎)／)
u   φ(゜▽゜*)♪r  r     ٩(｡•́‿•̀｡)۶r     ヾ(＠⌒ー⌒＠)ノ
   (✧ω✧)   ♪(๑ᴖ◡ᴖ๑)♪r  u   ( ´ ▽ ` )ノ)
   ヽ(>∀<☆)ノ   (ノ°∀°)ノu   ٩(^ᴗ^)۶u   ヾ(⌐■_■)ノ♪u   (•̀ᴗ•́)وu   ┗(＾0＾)┓u   (｀・ω・´)u   ＼(￣▽￣)／u   (ง •̀_•́)งu   ヽ(´▽`)/)
rh  u   (☞゚ヮ゚)☞r  u   ┌( ಠ_ಠ)┘u   (⊙_⊙)？u   ヾ(•ω•`)ou
   (￣ω￣)u
   ( ˇωˇ )u   (ᵔᴥᵔ)rb  )
u   ✧*。٩(ˊᗜˋ*)و✧u   (ﾉ◕ヮ◕)ﾉ*:・ﾟ✧rg  u   ٩(♡ε♡)۶u   (◕‿◕)♡u   ✿◕ ‿ ◕✿u   (*≧▽≦)u   ヾ(＾-＾)ノ   (☆▽☆)u   °˖✧◝(⁰▿⁰)◜✧˖°)rd  u   (๑˃ᴗ˂)ﻭr  u   (✿╹◡╹)u   ヽ(・∀・)ノ   (ノ´ヮ`)ノ*:・ﾟ✧rf  u   (◠‿◠)u   ٩(ˊᗜˋ*)وu   (＾▽＾)r  u   (★ω★)/rc  r  rb  re  rg  r  u   (≧◡≦) ♡u   ヾ(￣▽￣))
u   (っ°Д°;)っu   (；′⌒`)u   (・_・ヾu
   ( ´_ゝ`)u   (￣ヘ￣)u   (。-`ω´-)u   ( ˘︹˘ )r  u   ヽ(ー_ー )ノu   (；一_一))
r  r  r  r  r  rj  rg  ri  r  r  )T)Pra  r   r   loggingr   ra  r  r  dataclassesr   r   difflibr   pathlibr   _RED_RESET	getLoggerr   rF  r&  r*  r%  r'  r(  r)  _MAX_INLINE_DIFF_FILES_MAX_INLINE_DIFF_LINESr   r'   r(   r,   r2   r;   rB   rH   rT   r[   r   r   r   r   r   r   r   r  r  r  r  r/  r5  rC  rJ  r?   KAWAII_SEARCHKAWAII_READKAWAII_TERMINALKAWAII_BROWSERKAWAII_CREATEKAWAII_SKILLKAWAII_THINKKAWAII_GENERICr  r+  r;  r:  r4  r7  r=  rE  _CYANrR  rQ  rS  rO  rP  rN  r\  r_  r   )ra  s   @r   <module>r}     s	     	 
   (    				8	$$	%
%
53
   @ @ @   7!(<"
h^"<&	"X:) "&	)
 *.)2
BC$* ,* ,	*ZB "&	B
 *.B B:y y@"J\LF 	6
?  	
	 

"JE Er   