
    (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dAdZdBdZdCdZdDd Zd! Zdd"d#dEd%ZdFd)ZdGd+ZdHd/ZdFd0ZdFd1ZdFd2ZdId5ZdJd9ZdFd:Zed;k    rU ej         d<=          Z! ee!           e!"                                Z# ej$        e#%                    e#                     dS dS )Ku  ``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#E8C463returndict[str, Any]c                 "    ddl m}   |             S )Nr   build_learning_graph)agent.learning_graphr   r
   s    8/home/rurouni/.hermes/hermes-agent/hermes_cli/journey.py_build_payloadr      s#    999999!!!       )maxsizestrc                     	 ddl m}   |             }|                    dd          p|                    dd          S # t          $ r Y dS 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      sp    ::::::  ~~lB//\4>>.R[3\3\\   yys   ;> 
AAdict[str, str]c                 @    ddl m}   | t                      d          S )Nr   derive_paletteT)dark)agent.learning_graph_renderr    r   r   s    r   _paletter#   )   s-    ::::::>,..t4444r   baseOptional[str]alphafloatc                    ddl m}m}m} | sd S |dk    r| S  | | |t	                      d                    ||           |                    S )Nr   )
hex_to_rgbmix_rgb
rgb_to_hexg+?bg)r"   r)   r*   r+   r#   )r$   r&   r)   r*   r+   s        r   _fader-   0   sv    KKKKKKKKKK t~~:ggjjD)9::JJt<L<LeTTUUUr   stylec                `    t          t                                          |           |          S )zLFade the style's base ink toward the background by ``alpha`` (rgba-over-bg).)r-   r#   get)r.   r&   s     r   _resolver1   :   s"    &&...r   rowlistcolorboolc                   ddl m}  |            }| D ]}|d         }|d         }t          |          dk    r|d         nd}t          |          dk    r|d         nd }|s|                    |           d|r&|                    |t	          ||                     |                    |t          ||                     |S )Nr   Textr            ?   r.   )	rich.textr8   lenappendr-   r1   )	r2   r4   r8   textrunchunkr.   r&   overrides	            r   _row_to_textrD   ?   s    466D 
= 
=AAc((Q,,AC XX\\3q66t 	=KK 	=KKU8U%;%;K<<<<KKXeU%;%;K<<<<Kr   widthOptional[int]heighttuple[int, int]c                    t          j        d          }t          d| p|j                  t          d|p|j                  fS )N)Z      (   
   )shutilget_terminal_sizemaxcolumnslines)rE   rG   sizes      r   
_term_sizerT   Q   s?    #H--Dr5(DL))3r63GTZ+H+HHHr   c          	     4
    ddl m} ddlm  ddlm} |                    |           }|                    |           }|                    |           }	|	                    |           }
t          d|dz
            }t          d|dz
  t          |	          z
            }|                    | |||	          }t          |                     d
g                     }g }              }|                    dr
dt           nd            |                    drdnd            |                    |             d          }t!          |          D ]u\  }}|r|                    d           |                    |d         dz   rt#          |d         d          nd            |                    |d         rdnd            v|                    |           |r  d          }t!          |          D ]\  }}|r|                    d           |                    |d         dz   r#t%          |                    d          d          nd            |                    |d         rdnd            |                    |           |                      d                     |d         D ]<}t'          |          }|                    d           |                    |           =  d          }|                    |
d         rdnd            t          d|t          |
d                   z
  t          |
d                   z
            }|                    d|z             |                    |
d         rdnd            |                    |           t+          t-          |dz                      }  d          }|                    drdnd            |                    |d          pd!rt          nd            |                    d|d"          d#| d$| d%rdnd            |                    |           |                    d&g           }|rx|                      d                       d'rdnd           }|                    |           d+ fd*}|d d         D ]"} ||          }|                    |           #|	D ])}|                      d|z   rdnd                      * || S ),Nr   )Groupr7   )learning_graph_render   r9      rM   )colsrowsrevealnodesu   ✦ Journey zbold r<   u&   · learned skills & memories over timegrey62  z   glyph r.   r:   labelr4   grey54r   gridstartr   endd   u   ◷ dateu   —visible/u    revealed · %labelsz  charted signalsr   r8   c                    d          }|                     | d          drdnd            |                     | d          dr7t          | d         t          |                     dd	                              nd            |                     t	          | d
                   r7t          | d         t          |                     dd	                              nd            t	          | d                   }|                     dt          |          dk    r|n|d d         dz    rdnd            |S )Nr_   keyra   grey70r<   r`   r.   r&   r:   rb   meta       u   …rc   )r?   r1   r'   r0   r   r>   )itemr2   rp   r8   r4   s      r   	label_rowz$_frame_renderable.<locals>.label_row   sI   $t**CJJ$u+(((E0KtJLLLJJ$w-***lq2{(4=%PTPXPXY`bePfPfJgJg2h2h2hw{J|||JJs4=))kp1z$w-txxX_adOeOeIfIf1g1g1gvzJ{{{tF|$$DJJLCIIOODDcrcU9JLL`eToT\T\koJpppJr   )r   r8   )rich.consolerV   r=   r8   agentrW   build_legendcategory_legendbuild_summaryaxis_labelsrP   r>   render_graphr0   r?   _TITLE_COLOR	enumerater1   r-   rD   pad_leftintround)!payloadrZ   r[   r\   r4   rV   renderlegend
categoriessummaryaxisinner
field_rowsframecountpartstitlelegend_lineirs   cat_linegrowline	axis_linegappctfootrl   headingrt   r2   	line_textr8   s!       `                           @r   _frame_renderabler   V   s   """"""555555  ))F''00J""7++Gg&&DD1HEQr	CLL011Je*VTTEGR(())EEDFFE	LL'P'=|'='='=DLQQQ	LL9UA\X\L]]]	LL$t**KV$$ M M4 	&u%%%4=3.V[6ehtG}c6R6R6Raefff4=E0KtLLLL	LL 4:: ,, 	N 	NGAt &%%%OODMC/X]7guTXXg=N=NPS7T7T7TcgOhhhOODMU1LOMMMMX	LLbf  D%((aT T

IT']e*E((FFF
aT']+++c$u+.>.>>
?
?CS3YT%[E(CtDDD	LL
eFSL!!
"
"C4::DKK%9hhTK:::KKf&e.MllKNNNKKCeI&CCCCSCCCW\Kf88bfKggg	LLYYx$$F TT"XX$*e2M((NNNW	 	 	 	 	 	 	 2A2J 	 	D)D//CLL P P	TT$*e2M((NNNOOOO5%=r   F)rE   forcer   c                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_colorrE    )ru   r   )r4   rE   r   r   extras        r   _consoler      sM    
 %$$$$$EJRt[AAAPRE7<IU<<e<<<r   argsargparse.Namespacer   c                z   ddl m} t          | dd          r`dd l} |t	          t          | dd                                                  |                    t                                           dS t                      }t	          t          | dd                     }t          t          | dd           t          | dd                     \  }}t          ||t	          t          | d	d                    
          }|
                    d          s|                    d           dS t          | dd          r$t          |||||t          | dd                    S t          t          t          | dd          pd          dd          }|                    t          |||||                     dS )Nr   r   jsonFr   )r   rE   rG   force_color)r4   rE   r   r]   uy   [grey62]No learning yet — use Hermes a while and your learned skills and memories will start mapping out here.[/grey62]playfps   )rZ   r[   r4   r   r\   r:   g        rZ   r[   r\   r4   )ru   r   getattrr   r5   
print_jsondumpsr   rT   r   r0   print_play_clampr'   r   )	r   r   r   r   r4   rZ   r[   consoler\   s	            r   	_cmd_showr      s   $$$$$$tVU## gdJ>>??@@@KKDJJWeWgWgLhLhiiiqGWT:u55666EGD'488'$RV:W:WXXJD$U$d74X];^;^6_6_```G;;w =	
 	
 	
 qtVU## hWgDt5gVZ\aceNfNfggggE'$#66=#>>SIIFMM#G$T&X]^^^___1r   r   c                  ddl m} d}dt          dt          d|                    z  }	  || t          d|          d          5 }	t	          |          D ]E}
|
|dz
  z  }|	                    t          |||||	                     t          j        |           F|	                    t          |||d|	                     d d d            n# 1 swxY w Y   n&# t          $ r | 
                    d
           Y dS w xY wdS )Nr   )Live*   r:   r   <   F)r   refresh_per_secondscreenr   z[grey54]interrupted[/grey54]   )	rich.liver   rP   minrangeupdater   timesleepKeyboardInterruptr   )r   r   rZ   r[   r4   r   r   framesdelayliver   r\   s               r   r   r      s   F#aR&&&E	T'c!Skk%PPP 	cTX6]] " "fqj)-gDtTZbghhhiii
5!!!!KK)'4PS[`aaabbb	c 	c 	c 	c 	c 	c 	c 	c 	c 	c 	c 	c 	c 	c 	c    4555ss 1s6   C A=CC CC CC C?>C?vlohic                &    | |k     r|n	| |k    r|n| S Nr   )r   r   r   s      r   r   r      s     R221r66RRq0r   c                4   ddl m} t          t          t	          | dd                     t          t	          | dd                              }t          t                                          dg           d 	          }|s|                    d
           dS |D ]y}|                    d          dk    rdnd} ||                    d                    }|                    d|d          d| d|                    dd           d| d	           zdS )Nr   )format_dater   Fr   )r4   r   r]   c                0    |                      d          pdS )N	timestampr   )r0   )ns    r   <lambda>z_cmd_list.<locals>.<lambda>   s    AEE+DVDVD[Z[ r   )rn   z![grey62]No learning yet.[/grey62]kindmemoryu   ◆u   ●r   z[grey54]idz[/grey54]  ra   rb   r   z
  [grey54]z	[/grey54])	r"   r   r   r5   r   sortedr   r0   r   )r   r   r   r]   noder`   rh   s          r   	_cmd_listr      s>   777777gdJ&F&F!G!GGtT[\`boqvTwTwOxOxyyyG>##''44:[:[\\\E 9:::q r r&))X555{488K0011pdppppRT@U@Uppaepppqqqq1r   c                B   ddl m}m}  || j                  }|                    d          s(t          d|                    dd                      dS t          | dd	          sy	 t          d
|d         d                                          	                                dvrt          d           dS n'# t          t          f$ r t          d           Y dS w xY w || j                  }t          d|d                     |                    d          rdndS )Nr   )delete_nodenode_detailokr_   message	not foundr   yesFz	  Delete rb   z? [y/N] )yr   z	  abortedz

  aborted)agent.learning_mutationsr   r   r   r0   r   r   inputstriplowerEOFErrorr   )r   r   r   detailress        r   _cmd_deleter      sV   AAAAAAAA[##F::d 76::i5577888q4&& 	<<<<==CCEEKKMMUaaak"""q b +, 	 	 	-   11	 +di
 
 C	
s9~

   $111$s   (AB9 9 CCc                   ddl m}m}  || j                  }|                    d          s(t          d|                    dd                      dS |d         d	k    rd
nd}t          |d         |          }|0|                                |d                                         k    rt          d           dS  || j        |          }t          d|d                     |                    d          rdndS )Nr   )	edit_noder   r   r_   r   r   r   r   skillz.mdz.txtcontent)suffixz  no changes)r   r   r   r   r0   r   _open_in_editorr   )r   r   r   r   r   editedr   s          r   	_cmd_editr     s   ????????[##F::d 76::i5577888qVn//UUVFVI.v>>>F~6)+<+B+B+D+DDDnq
)DIv
&
&C	
s9~

   $111$r   initialr   c                  dd l }dd l}dd l}|j                            d          p|j                            d          pd}|                    d|dd          5 }|                    |            |j        }d d d            n# 1 swxY w Y   	 |                    g |	                                |           t          |d	          5 }|                                cd d d            	 |                    |           S # t          $ r Y S w xY w# 1 swxY w Y   nQ# t          $ rD}t          d
|            Y d }~	 |                    |           d S # t          $ r Y d S w xY wd }~ww xY w	 	 |                    |           d S # t          $ r Y d S w xY w# 	 |                    |           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environr0   NamedTemporaryFilewritenamecallsplitopenreadunlinkOSErrorr   )	r   r   r   r   r   editorfhpathexcs	            r   r   r   #  s   IIIOOOZ^^H%%I)A)AITF		$	$SPW	$	X	X \^
w              /&,,../$/000$))) 	R7799	 	 	 	 	 	 		IIdOOOO 	 	 	D		 	 	 	 	 	 	 	 	   '#''(((ttt	IIdOOOOO 	 	 	DD			IIdOOOOO 	 	 	DD		IIdOOOO 	 	 	D	s   BB	B	<D  D!D  .D
DDDD  DD  F  
E.*E)<F E 
E&%E&)E..F 3F
 

FFGF32G3
G =G?G  Gparentargparse.ArgumentParserNonec                Z   |                      dt          ddd           |                      ddd	           |                      d
t          dd           |                      dt          d d           |                      dt          d d           |                      ddd	           |                      ddt          j        	           |                      ddd	           |                     t                     |                     d          }|                    dd          }|                     dd           |                     ddt          j        	           |                    t                     |                    dd          }|                     d d!           |                     d"d#dd$	           |                    t                     |                    d%d&          }|                     d d!           |                    t                     d S )'Nz--revealr:   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)destr3   z 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_argumentr'   r   argparseSUPPRESSset_defaultsr   add_subparsers
add_parserr   r   r   )r  subp_listp_delp_edits        r   register_clir   :  s@   
L     <nooo
c2<rsss
	T@cddd

dAbccc
\@WXXX
8CTUUU
<klll
Y'''


%5

6
6C^^F)K^LLF
\:::
8CTUUU
Y'''NN8*cNddE	v$jkkk	tW\@_```	K(((^^F)`^aaF
%klll
Y'''''r   c                     t          |           S r   )r   )r   s    r   cmd_journeyr"  ]  s    T??r   __main__zhermes journey)prog)r   r   )r   r   )r   r   )r$   r%   r&   r'   r   r%   )r.   r   r&   r'   r   r%   )r2   r3   r4   r5   )rE   rF   rG   rF   r   rH   )r4   r5   rE   rF   r   r5   )r   r   r   r   )r   r   r   r   )r   r'   r   r'   r   r'   r   r'   )r   r   r   r   r   r%   )r  r	  r   r
  )&__doc__
__future__r   r  rN   sysr   	functoolsr   typingr   r   r|   r   r   r#   r-   r1   rD   rT   r   r   r   r   r   r   r   r   r   r   r"  __name__ArgumentParser_p
parse_args_aexitr  r   r   r   <module>r0     s    # " " " " "   



                       " " " " 1    15 5 5 5V V V V/ / / /
   $I I I I
U U Up 59 = = = = = =   :   $1 1 1 1   % % % %(% % % %"   . (  (  (  (F    z	 	 &6	7	7	7BL	BCHRWWR[[	 r   