
    `gj4                       d Z ddlmZ ddlZddlZddlZddlZddlmZ ddl	m
Z
mZ dZd dZ ed	      d!d
       Z ed	      d"d       Zd#dZd$dZd%dZd&dZd Zdddd'dZd(dZd)dZd*dZd(dZd(dZd(dZd+dZd,dZd(dZedk(  rM ej@                  d      Z! ee!       e!jE                         Z# ejH                  e#jK                  e#             yy)-u  ``hermes journey`` — what Hermes has learned, on a timeline.

A terminal-native rendition of the desktop Star Map / Memory Graph: a horizontal
timeline bar chart of learned skills and memories over time (oldest at top,
newest at bottom) plus the playable constellation scrubber. Graph assembly,
layout, and the (ported-from-desktop) palette all live in
``agent.learning_graph`` / ``agent.learning_graph_render`` so the CLI, the TUI
``/journey`` overlay, and the desktop panel draw the same data.
    )annotationsN)	lru_cache)AnyOptionalz#E8C463c                     ddl m}   |        S )Nr   build_learning_graph)agent.learning_graphr	   r   s    E/root/.hermes/venv/lib/python3.12/site-packages/hermes_cli/journey.py_build_payloadr      s    9!!       )maxsizec                     	 ddl m}   |        }|j                  dd      xs |j                  dd      S # t        $ r Y yw xY w)z@The active skin's primary color (mirrors the TUI theme primary).r   )get_active_skin
ui_primary banner_titlez#FFD700)hermes_cli.skin_enginer   	get_color	Exception)r   skins     r   _primary_hexr      sF    : ~~lB/\4>>.R[3\\ s   25 	A Ac                 2    ddl m}   | t               d      S )Nr   derive_paletteT)dark)agent.learning_graph_renderr   r   r   s    r   _paletter   )   s    :,.t44r   c                x    ddl m}m}m} | sy |dk\  r| S  | | |t	               d          ||       |            S )Nr   )
hex_to_rgbmix_rgb
rgb_to_hexg+?bg)r   r!   r"   r#   r   )basealphar!   r"   r#   s        r   _fader'   0   s?    KK~gjD)9:Jt<LeTUUr   c                H    t        t               j                  |       |      S )zLFade the style's base ink toward the background by ``alpha`` (rgba-over-bg).)r'   r   get)styler&   s     r   _resolver+   :   s    &..r   c                8   ddl m}  |       }| D ]  }|d   }|d   }t        |      dkD  r|d   nd}t        |      dkD  r|d   nd }|s|j                  |       K|r|j                  |t	        ||             k|j                  |t        ||              |S )Nr   Textr            ?   r*   )	rich.textr.   lenappendr'   r+   )	rowcolorr.   textrunchunkr*   r&   overrides	            r   _row_to_textr<   ?   s    6D 
=AAc(Q,AC X\3q6tKKKKU8U%;K<KKXeU%;K<
= Kr   c                    t        j                  d      }t        d| xs |j                        t        d|xs |j                        fS )N)Z      (   
   )shutilget_terminal_sizemaxcolumnslines)widthheightsizes      r   
_term_sizerJ   Q   s=    ##H-Dr5(DLL)3r63GTZZ+HHHr   c          	     :    ddl m} ddlm  ddlm} |j                  |       }|j                  |       }|j                  |       }	|j                  |       }
t        d|dz
        }t        d|dz
  t        |	      z
        }|j                  | |||	      }t        | j                  d
g             }g }         }|j                  dr	dt         nd        |j                  drdnd        |j                  |         d      }t!        |      D ]\  \  }}|r|j                  d       |j                  |d   dz   rt#        |d   d      nd        |j                  |d   rdnd        ^ |j                  |       |r  d      }t!        |      D ]h  \  }}|r|j                  d       |j                  |d   dz   rt%        |j                  d      d      nd        |j                  |d   rdnd        j |j                  |       |j                    d             |d   D ]0  }t'        |      }|j)                  d       |j                  |       2   d      }|j                  |
d   rdnd        t        d|t        |
d         z
  t        |
d         z
        }|j                  d|z         |j                  |
d   rdnd        |j                  |       t+        t-        |dz              }  d      }|j                  drdnd        |j                  |d    xs d!rt        nd        |j                  d|d"    d#| d$| d%rdnd        |j                  |       |j                  d&g       }|r`|j                    d               d'rdnd       }|j                  |       d) fd(}|d d D ]  } ||      }|j                  |        |	D ]"  }|j                    d|z   rdnd              $  || S )*Nr   )Groupr-   )learning_graph_render   r/      rA   )colsrowsrevealnodesu   ✦ Journey zbold r2   u&   · learned skills & memories over timegrey62  z   glyph r*   r0   labelr7   grey54r   gridstartr   endd   u   ◷ dateu   —visible/u    revealed · %labelsz  charted signalsc                    d      }|j                  | d    drdnd        |j                  | d    dr(t        | d   t        | j                  dd	                  nd        |j                  t	        | d
         r(t        | d   t        | j                  dd	                  nd        t	        | d         }|j                  dt        |      dk  r|n|d d dz    rdnd        |S )NrU   keyrW   grey70r2   rV   r*   r&   r0   rX   meta       u   …rY   )r5   r+   floatr)   strr4   )itemr6   rf   r.   r7   s      r   	label_rowz$_frame_renderable.<locals>.label_row   s    t*CJJ$u+a(EtJLJJ$w-*lq(4=%PTPXPXY`bePfJg2hw{J|JJs4=)kp$w-txxX_adOeIf1gvzJ{tF|$DJJCIODcrU9JKL`eT\koJpJr   )returnr.   )rich.consolerL   r3   r.   agentrM   build_legendcategory_legendbuild_summaryaxis_labelsrD   r4   render_graphr)   r5   _TITLE_COLOR	enumerater+   r'   r<   pad_leftintround)!payloadrP   rQ   rR   r7   rL   renderlegend
categoriessummaryaxisinner
field_rowsframecountpartstitlelegend_lineirk   cat_linegrowline	axis_linegappctfootrb   headingrl   r6   	line_textr.   s!       `                           @r   _frame_renderabler   V   s   "5  )F''0J""7+Gg&DD1HEQr	CL01Je*VTEGR()EEFE	LL|n'=DLQ	LL9UX\L]	LLt*KV$ M4u%4=3.V[htG}c6Raef4=EtL	M
 
LL: , 	NGAt%OODMC/X]uTXXg=NPS7TcgOhOODMUOM		N
 	X	LLbf D%(aT T
IT']e(F
aT']++c$u+.>>
?CS3YT%[EtD	LL
eFSL!
"C:DKK%hTK:KKf&elKNKK#eI&'q}SECW\8bfKg	LLYYx$FT"X*e(NW	 2AJ 	DD/CLL	  P	T$*e(NOP %=r   F)rG   forcec                8    ddl m} |rdddni } |d|  |d|S )u  A Rich console. ``force`` emits truecolor ANSI even into a captured
    stream — the interactive CLI grabs that output and re-renders it through
    prompt_toolkit (raw escapes to a real terminal would otherwise be
    swallowed). Mirrors the ``ChatConsole`` idiom in ``cli.py``.r   ConsoleT	truecolor)force_terminalcolor_system)no_colorrG    )rn   r   )r7   rG   r   r   extras        r   _consoler      s-    
 %EJt[APRE<IU<e<<r   c                   ddl m} t        | dd      rHdd l} |t	        t        | dd                  j                  |j                  t                            yt               }t	        t        | dd             }t        t        | dd       t        | dd             \  }}t        ||t	        t        | d	d            
      }|j                  d      s|j                  d       yt        | dd      rt        |||||t        | dd            S t        t        t        | dd      xs d      dd      }|j                  t        |||||             y)Nr   r   jsonFr   )r   rG   rH   force_color)r7   rG   r   rS   uy   [grey62]No learning yet — use Hermes a while and your learned skills and memories will start mapping out here.[/grey62]playfps   )rP   rQ   r7   r   rR   r0   g        rP   rQ   rR   r7   )rn   r   getattrr   bool
print_jsondumpsr   rJ   r   r)   print_play_clampri   r   )	argsr   r   rz   r7   rP   rQ   consolerR   s	            r   	_cmd_showr      s1   $tVU#gdJ>?@KKDJJWeWgLhiGWT:u566EGD'48'$RV:WXJD$U$d74X];^6_`G;;w=	
 tVU#WgDt5gVZ\aceNfggE'$#6=#>SIFMM#G$T&X]^_r   c                  ddl m} d}dt        dt        d|            z  }	  || t        d|      d      5 }	t	        |      D ]>  }
|
|dz
  z  }|	j                  t        |||||	             t        j                  |       @ |	j                  t        |||d|	             d d d        y# 1 sw Y   yxY w# t        $ r | j                  d
       Y yw xY w)Nr   )Live*   r0   r   <   F)r   refresh_per_secondscreenr   z[grey54]interrupted[/grey54]   )	rich.liver   rD   minrangeupdater   timesleepKeyboardInterruptr   )r   rz   rP   rQ   r7   r   r   framesdelayliver   rR   s               r   r   r      s    F#aR&&E	'c!Sk%P 	cTX6] "fqj)-gDtTZbghi

5!" KK)'4PS[`ab	c 	c   45s/   B9 A,B-$B9 -B62B9 6B9 9CCc                "    | |k  r|S | |kD  r|S | S Nr   )vlohis      r   r   r      s    R201r6R0q0r   c                   ddl m} t        t        t	        | dd             t        t	        | dd                  }t        t               j                  dg       d 	      }|s|j                  d
       y|D ]b  }|j                  d      dk(  rdnd} ||j                  d            }|j                  d|d    d| d|j                  dd       d| d	       d y)Nr   )format_dater   Fr   )r7   r   rS   c                ,    | j                  d      xs dS )N	timestampr   )r)   )ns    r   <lambda>z_cmd_list.<locals>.<lambda>   s    AEE+DVD[Z[ r   )rd   z![grey62]No learning yet.[/grey62]kindmemoryu   ◆u   ●r   z[grey54]idz[/grey54]  rW   rX   r   z
  [grey54]z	[/grey54])	r   r   r   r   r   sortedr   r)   r   )r   r   r   rS   noderV   r^   s          r   	_cmd_listr      s    7gdJ&F!GGtT[\`boqvTwOxyG>#''4:[\E9: r&)X55488K01dKwaRT@U?VV`ae`ffopqr r   c                   ddl m}m}  || j                        }|j	                  d      st        d|j	                  dd              yt        | dd	      s>	 t        d
|d   d      j                         j                         dvrt        d       y	  || j                        }t        d|d           |j	                  d      rdS dS # t        t        f$ r t        d       Y yw xY w)Nr   )delete_nodenode_detailokrU   message	not foundr   yesFz	  Delete rX   z? [y/N] )yr   z	  abortedz

  aborted)agent.learning_mutationsr   r   r   r)   r   r   inputstriplowerEOFErrorr   )r   r   r   detailress        r   _cmd_deleter      s    A#F::d6::i56784&	y 38<=CCEKKMUaak" b dii
 C	Bs9~
 1$1$ +, 	- 	s   ;C C+*C+c                   ddl m}m}  || j                        }|j	                  d      st        d|j	                  dd              y|d   d	k(  rd
nd}t        |d   |      }|$|j                         |d   j                         k(  rt        d       y || j                  |      }t        d|d           |j	                  d      rdS dS )Nr   )	edit_noder   r   rU   r   r   r   r   skillz.mdz.txtcontent)suffixz  no changes)r   r   r   r   r)   r   _open_in_editorr   )r   r   r   r   r   editedr   s          r   	_cmd_editr     s    ?#F::d6::i5678Vn/UVFVI.v>F~6)+<+B+B+DDn
DIIv
&C	Bs9~
 1$1$r   c               .   dd l }dd l}dd l}|j                  j	                  d      xs |j                  j	                  d      xs d}|j                  d|dd      5 }|j                  |        |j                  }d d d        	 |j                  g |j                                t        |d	      5 }|j                         cd d d        	 |j                  |       S # 1 sw Y   fxY w# t        $ r Y S w xY w# 1 sw Y   nxY wnE# t        $ r9}t        d
|        Y d }~	 |j                         y # t        $ r Y y w xY wd }~ww xY w	 	 |j                  |       y # t        $ r Y y w xY w# 	 |j                         w # t        $ r Y w w xY wxY w)Nr   EDITORVISUALviwFzutf-8)r   deleteencoding)r   z  editor failed: )os
subprocesstempfileenvironr)   NamedTemporaryFilewritenamecallsplitopenreadunlinkOSErrorr   )	initialr   r   r   r   editorfhpathexcs	            r   r   r   #  s   ZZ^^H%I)AITF		$	$SPW	$	X \^
ww/&,,./$/0$) 	R779	 		IIdO   			 	 	 !#'(	IIdO 				IIdO 			IIdO 		s   C!0D	 5C<	D	 C-!C*-	C98C9<DD	 E1 		EE E1 %D7 7	EEEE1 E" "	E.-E.1F3FF	FFFFc                   | j                  dt        ddd       | j                  ddd	       | j                  d
t        dd       | j                  dt        d d       | j                  dt        d d       | j                  ddd	       | j                  ddt        j                  	       | j                  ddd	       | j                  t               | j                  d      }|j                  dd      }|j                  dd       |j                  ddt        j                  	       |j                  t               |j                  dd      }|j                  d d!       |j                  d"d#dd$	       |j                  t               |j                  d%d&      }|j                  d d!       |j                  t               y )'Nz--revealr0   z0..1z=Render the timeline built up to this point (0=oldest, 1=now).)typedefaultmetavarhelpz--play
store_truez0Animate the build-up over time (Ctrl-C to stop).)actionr  z--fpsr   z4Animation frames per second for --play (default 12).)r  r  r  z--widthz!Override render width in columns.z--heightzOverride render height in rows.z
--no-colorzDisable color output.z--force-colorz--jsonz-Print the raw graph payload as JSON and exit.)funcjourney_action)destlistz List node ids (for delete/edit).)r  )r  r   z7Delete a learned skill (archived) or memory by node id.r   zDNode id (skill name or memory:<source>:<index>; see `journey list`).z-yz--yeszSkip the confirmation prompt.editz5Edit a learned skill or memory by node id in $EDITOR.)add_argumentri   rx   argparseSUPPRESSset_defaultsr   add_subparsers
add_parserr   r   r   )parentsubp_listp_delp_edits        r   register_clir  :  s   
L   <no
c2<rs
	T@cd

dAbc
\@WX
8CTCTU
<kl
Y'


%5

6C^^F)K^LF
\:
8CTCTU
Y'NN8*cNdE	v$jk	tW\@_`	K(^^F)`^aF
%kl
Y'r   c                    t        |       S r   )r   )r   s    r   cmd_journeyr  ]  s    T?r   __main__zhermes journey)prog)rm   zdict[str, Any])rm   rj   )rm   zdict[str, str])r%   Optional[str]r&   ri   rm   r  )r*   rj   r&   ri   rm   r  )r6   r  r7   r   )rG   Optional[int]rH   r  rm   ztuple[int, int])r7   r   rG   r  r   r   )r   zargparse.Namespacerm   rx   )r   rx   rm   rx   )r   ri   r   ri   r   ri   rm   ri   )r   rj   r   rj   rm   r  )r  zargparse.ArgumentParserrm   None)&__doc__
__future__r   r  rB   sysr   	functoolsr   typingr   r   ru   r   r   r   r'   r+   r<   rJ   r   r   r   r   r   r   r   r   r   r  r  __name__ArgumentParser_p
parse_args_aexitr  r   r   r   <module>r+     s    #   
    " 1  15 5V/
$I
Up 59 =:$1%(%". (F z	 	 	 &6	7B	BCHHRWWR[	 r   