
    3h                     P   S r SSKrSSKJr  SSKJr   " S S5      r\S:X  Ga  \" S5        \" S	5        \" S5        \" 5       r\" S
5        \R                  SSSS05        \R                  SSSS05        \R                  SSSS05        \" S\
" \R                  5       S35        \" S5        \R                  S5      r\" S\S    35        \" S\S    35        \" S\S    35        \" S5        \R                  5       r\ H  r\" S \S!    S"\S#    S35        M     \" S$5        \R#                  S5      r\S   (       a!  \S%   r\" S&\S'    35        \" S(\S)    35        \" S*5        \R)                  S+5      r\" S,\
" \5       S-35        \" S.5        \" S/5        \" S5        gg)0z9
Episode Memory: Store and retrieve conversation history
    N)datetime)Pathc                   D    \ rS rSrS
S jrSS jrSS jrS rS rS r	S	r
g)EpisodeMemory	   c                     [        U5      U l        U R                  R                  SSS9  / U l        [        R
                  " 5       R                  5       / / S.U l        g )NT)parentsexist_ok
start_timeemotionstopics)r   storage_dirmkdircurrent_sessionr   now	isoformatsession_metadata)selfr   s     ;/home/james-whalen/eden-agi-project/core/memory/episodes.py__init__EpisodeMemory.__init__
   sR    ,td;!",,.224!
    Nc                     [         R                  " 5       R                  5       UUU=(       d    0 S.nU R                  R	                  U5        U(       a'  SU;   a!  U R
                  S   R	                  US   5        U$ )zStore a conversation exchange)	timestampuseredenmetadataemotionr   )r   r   r   r   appendr   )r   
user_inputeden_responser   exchanges        r   add_exchangeEpisodeMemory.add_exchange   sm     "113! B	
 	##H-	X-!!*-44Xi5HIr   c                    U R                   (       d  SSS.$ U(       d'  S[        R                  " 5       R                  S5       3nU R                  U S3-  nUU R
                  S   [        R                  " 5       R                  5       [        U R                   5      U R
                  S   U R
                  S	   U R                   S
.n[        US5       n[        R                  " X4SS9  SSS5        [        U R                   5      n/ U l         [        R                  " 5       R                  5       / / S.U l        S[        U5      US.$ ! , (       d  f       Ne= f)zSave current session to diskFzNo exchanges to savesuccesserrorsession_z%Y%m%d_%H%M%S.jsonr   r   r   )session_namer   end_timeexchange_countr   r   	exchangesw   )indentNr   T)r(   filepathexchanges_saved)r   r   r   strftimer   r   r   lenopenjsondumpstr)r   r,   r3   session_datafsaved_counts         r   save_sessionEpisodeMemory.save_session$   s-   ##$/EFF%hlln&=&=o&N%OPL##e&<< )//= 002!$"6"67--j9++H5--
 (C AIIla0 ! $../!",,.224!
 H*
 	
 ! s   E
Ec                     U R                   U S3-  nUR                  5       (       d	  SSU S3S.$ [        US5       n[        R                  " U5      nSSS5        SWS	.$ ! , (       d  f       N= f)
zLoad a previous sessionr+   Fz	Session 'z' not foundr'   rNT)r(   session)r   existsr7   r8   load)r   r,   r3   r<   r;   s        r   load_sessionEpisodeMemory.load_sessionI   sn    ##e&<<  $<./TUU(C A99Q<L !  L99 ! s   A!!
A/c           
         / nU R                   R                  S5       H^  n [        US5       n[        R                  " U5      nUR                  US   US   UR                  SS5      US   S.5        S	S	S	5        M`     [        US SS9$ ! , (       d  f       M}  = f! [         a  n[        S
U SU 35         S	nAM  S	nAff = f)zList all saved sessions*.jsonrA   r,   r   r-   unknownr.   )namestartendr/   NzError reading : c                     U S   $ )NrK    )xs    r   <lambda>-EpisodeMemory.list_sessions.<locals>.<lambda>e   s    ajr   T)keyreverse)
r   globr7   r8   rD   r    get	Exceptionprintsorted)r   sessionsr3   r<   dataes         r   list_sessionsEpisodeMemory.list_sessionsU   s    ((--h7H
8(C(A99Q<DOO $^ 4!%l!3#xx
I>%)*:%;	%  )( 8 h$8$GG )(  8xj1#6778s5   BAB4B
B	BB
C(B??Cc                    / nU R                   R                  S5       H  n [        US5       n[        R                  " U5      nUS    Hw  nUR                  5       US   R                  5       ;   d'  UR                  5       US   R                  5       ;   d  MO  UR                  US   US   US   SS	 US   SS	 S
.5        My     SSS5        M     U$ ! , (       d  f       M  = f! [         a  n[        SU SU 35         SnAM  SnAff = f)z&Search for keyword across all sessionsrH   rA   r/   r   r   r,   r   Nd   )rB   r   r   r   zError searching rM   )	r   rU   r7   r8   rD   lowerr    rW   rX   )r   keywordresultsr3   r<   r[   r#   r\   s           r   search_sessionsEpisodeMemory.search_sessionsg   s   ((--h7H:(C(A99Q<D$($5"==?hv.>.D.D.FF"==?hv.>.D.D.FF#NN+/+?-5k-B(0(8#(>(0(8#(>	,  %6 )( 8   )(  :(
"QC899:s;   C%A'C,CC%
C"	C%"C%%
D/DD)r   r   r   )zdata/episodes)N)__name__
__module____qualname____firstlineno__r   r$   r>   rE   r]   rd   __static_attributes__rO   r   r   r   r   	   s"    
 #
J
:H$r   r   __main__z<============================================================zEDEN EPISODE MEMORY TESTz"
1. Adding conversation exchanges:z%Hello Eden, let's build AGI together!z?Hello Jamey! I'm excited to begin this journey toward true AGI.r   excitedzWhat should we focus on first?z0Safety constraints and tool access are critical.
thoughtfulzHow are you feeling?z=I feel excitement and responsibility. This is important work.
determinedz	   Added z
 exchangesz
2. Saving session:week1_kickoffz   Success: r(   z   Saved to: r3   z   Exchanges: r4   z
3. Listing all sessions:z   - rJ   rM   r/   z
4. Loading session:rB   z   Session: r,   z   Emotions: r   z
5. Searching for 'safety':safetyz	   Found z matchesz=
============================================================zTEST COMPLETE)__doc__r8   r   pathlibr   r   rf   rX   memoryr$   r6   r   r>   resultr]   rZ   srE   loadedrB   rd   rc   rO   r   r   <module>rw      s     q qf z	(O	
$%	(O_F	
/0
/I	I
 (:	L!
 G	L!
 
Ic&0012*
=>	
 !  1F	L	*+
,-	M&,-
./	N6"345
67	
&'##%Hai[1[>"2*=>  

!"  1Fi#W^4567gj1234	
()$$X.G	Ic'l^8
,-	/	/	(Oc r   