Ë
    ìj¿4  ã                  ó¸  — U d Z ddlmZ ddlZddlZddlmZmZ ddlmZ ddl	m
Z
 	 ddlZdZ G d
„ d«      Zdaded<   d)d„Zd*d„Zd+d,d„Zd-d„Z	 	 	 d.	 	 	 	 	 	 	 	 	 d/d„Zd0d1d„Zedk(  rÛ ed«        e«       Z ed«       ej'                  ddd¬«      Z eded   › �«        ed«       ej)                  «       Z ed ee«      › d �«        ed!«       ej/                  «       Z ed" ee«      › d#�«        ed$«       ej=                  ed   «       ej?                  ed   «      Z  ed%e re d&   d   nd'› �«        ed(«       yy# e$ r dZ ed	«       Y �Œ+w xY w)2a˜  
memory_core.py - CyberBrain26 Memory Layer v2

Memory types:
- rule: permanent agent rules (active in prompt)
- preference: user preferences (active in prompt)
- project_decision: valid project decisions (active in prompt)
- fact: verified technical facts (active if valid)
- conversation: audit history (NOT in prompt)
- test: test data (NOT in prompt)
- error: diagnostics (NOT in prompt unless explicit)
é    )ÚannotationsN)ÚUTCÚdatetime)ÚPath)ÚAnyTFzWARNING: ChromaDB not availablec                  ó>  — e Zd ZdZh d£Zh d£Zddd„Zdd„Z	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Z	 	 	 	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Z		 	 d	 	 	 	 	 dd	„Z
dd
„Z	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 dd„Zdd„Zdd„Z	 	 d	 	 	 	 	 dd„Zd d„Zd!d„Zy)"Ú
MemoryCorezÇ
    Core memory management with ChromaDB backend.
    
    Active kinds (included in prompt): rule, preference, project_decision, fact
    Inactive kinds (audit only): conversation, test, error
    >   ÚfactÚruleÚ
preferenceÚproject_decision>   ÚtestÚerrorÚconversationNc                ó”  — |€ t         j                  j                  dd«      }t        |«      | _        | j                  j                  dd¬«       d | _        d | _        i | _        t        rSt        j                  t        | j                  «      ¬«      | _        | j                  j                  dddi¬	«      | _        y t        d
«       y )NÚCB26_DB_PATHzworkspace/chroma_dbT)ÚparentsÚexist_ok)ÚpathÚcyberbrain_memoryÚdescriptionzCyberBrain26 long-term memory)ÚnameÚmetadataz.WARNING: Running in mock mode without ChromaDB)ÚosÚenvironÚgetr   Údb_pathÚmkdirÚclientÚ
collectionÚ_mock_storageÚCHROMADB_AVAILABLEÚchromadbÚPersistentClientÚstrÚget_or_create_collectionÚprint)Úselfr   s     ú>/home/oem/CyberBrain26-unified/src/cyberbrain26/memory/core.pyÚ__init__zMemoryCore.__init__)   s¥   € Øˆ?Ü—j‘j—n‘n ^Ð5JÓKˆGä˜G“}ˆŒØ�‰×Ñ 4°$ÐÔ7à"&ˆŒØ&*ˆŒØ.0ˆÔåÜ"×3Ñ3¼¸T¿\¹\Ó9JÔKˆDŒKØ"Ÿk™k×BÑBØ(Ø'Ð)HÐIð Có ˆD�Oô
 ÐBÕCó    c                ó`   — t        j                  t        «      j                  d«      }|› d|› �S )zGenerate unique memory IDz%Y%m%d%H%M%S%fú-)r   Únowr   Ústrftime)r(   ÚkindÚ	timestamps      r)   Ú_generate_idzMemoryCore._generate_id=   s-   € ä—L‘L¤Ó%×.Ñ.Ð/?Ó@ˆ	Ø��q˜˜Ð$Ð$r+   c                óN   — ||||||r|nd|r|nd|xs d|	xs d|
xs d|xs ddœS )z>Convert metadata to flat dict for ChromaDB (no nested objects)Ú ÚdefaultÚUnsorted©r0   ÚstatusÚsourceÚ
confidenceÚ
created_atÚ
supersedesÚ
expires_atÚworkspace_idÚtopicÚparent_topicÚconversation_id© )r(   r0   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   s               r)   Ú_metadata_to_dictzMemoryCore._metadata_to_dictB   sK   € ð ØØØ$Ø$Ù(2™*¸Ù(2™*¸Ø(Ò5¨IØÒ(˜jØ(Ò.¨BØ.Ò4°"ñ
ð 	
r+   c                ó^  — | j                  |«      }t        j                  t        «      j	                  «       }| j                  |||||||||	|
|¬«      }|||dœ}| j                  r"| j                  j                  |g|g|g¬«       n|| j                  |<   |r| j                  |d¬«       |S )zw
        Save a new memory record.
        
        Returns:
            Dict with 'id', 'content', 'metadata'
        r7   ©ÚidÚcontentr   ©Ú	documentsÚ	metadatasÚidsÚ
superseded©r8   )
r2   r   r.   r   Ú	isoformatrC   r    Úaddr!   Úupdate_memory)r(   rG   r0   r8   r9   r:   r<   r=   r>   r?   r@   rA   Ú	record_idr;   r   Úrecords                   r)   Úsave_memoryzMemoryCore.save_memoryZ   sË   € ð( ×%Ñ% dÓ+ˆ	Ü—\‘\¤#Ó&×0Ñ0Ó2ˆ
à×)Ñ)ØØØØ!Ø!Ø!Ø!Ø%ØØ%Ø+ð *ó 
ˆð "¨gÀ8ÑLˆà�?Š?à�O‰O×ÑØ"˜)Ø#˜*Ø�Kð  õ ð -3ˆD×Ñ˜yÑ)ñ Ø×Ñ˜z°,ÐÔ?àˆr+   c                ó~  — | j                   �Éd}|s|ri }|r||d<   |r||d<   | j                   j                  |¬«      xs i }g }|j                  d«      xs g }|j                  d«      xs g }|j                  d«      xs g }t        |«      D ]B  \  }	}
|
|	t        |«      k  r||	   nd|	t        |«      k  r||	   ni d	œ}|j	                  |«       ŒD |S t        | j                  j                  «       «      }|r|D �cg c]  }|d
   d   |k(  sŒ|‘Œ }}|r|D �cg c]  }|d
   d   |k(  sŒ|‘Œ }}|S c c}w c c}w )z)List memory records with optional filtersNr0   r8   )ÚwhererK   rI   rJ   r4   rE   r   )r    r   Ú	enumerateÚlenÚappendÚlistr!   Úvalues)r(   r0   r8   rU   ÚresultsÚrecordsrK   rI   rJ   ÚiÚdoc_idrR   Úrs                r)   Úlist_memoryzMemoryCore.list_memory’   sb  € ð �?‰?Ð&ØˆEÙ‘vØ�ÙØ$(�E˜&‘MÙØ&,�E˜(‘Oà—o‘o×)Ñ)°Ð)Ó6Ò<¸"ˆGàˆGØ—+‘+˜eÓ$Ò*¨ˆCØŸ™ KÓ0Ò6°BˆIØŸ™ KÓ0Ò6°BˆIÜ& s›^ò '‘	��6à Ø/0´3°y³>Ò/A˜y¨š|ÀrØ01´C¸	³NÒ0B 	¨!¢Èñ�ð
 —‘˜vÕ&ð'ð ˆNô ˜4×-Ñ-×4Ñ4Ó6Ó7ˆGÙØ&-ÖO °°:±¸vÑ1FÈ$Ó1Nš1ÐO�ÐOÙØ&-ÖS °°:±¸xÑ1HÈFÓ1Rš1ÐS�ÐSØˆNùò PùâSs   Ã?D5ÄD5ÄD:Ä-D:c                óx  — | j                   �”| j                   j                  |g¬«      xs i }|j                  d«      xs g }|sy|j                  d«      xs g }|j                  d«      xs g }|d   t        |«      dkD  r|d   ndt        |«      dkD  r|d   dœS i dœS | j                  j                  |«      S )	z"Get a specific memory record by IDN©rK   rK   rI   rJ   r   r4   rE   )r    r   rW   r!   )r(   rQ   r[   rK   rI   rJ   s         r)   Ú
get_memoryzMemoryCore.get_memory¸   sÊ   € à�?‰?Ð&Ø—o‘o×)Ñ)¨y¨kÐ)Ó:Ò@¸bˆGØ—+‘+˜eÓ$Ò*¨ˆCÙØàŸ™ KÓ0Ò6°BˆIØŸ™ KÓ0Ò6°BˆIà˜!‘fÜ+.¨y«>¸AÒ+=˜9 Qš<À2Ü,/°	«N¸QÒ,>˜I a™Lñð ð EGñð ð ×%Ñ%×)Ñ)¨)Ó4Ð4r+   c                ó   — | j                  |«      }|sy|r||d   d<   |r||d   d<   |r||d   d<   |r||d<   | j                  r)| j                  j                  |g|d   g|d   g¬«       |S || j                  |<   |S )z Update an existing memory recordNr   r8   r:   r=   rG   )rK   rI   rJ   )rc   r    Úupdater!   )r(   rQ   r8   rG   r:   r=   Úexistings          r)   rP   zMemoryCore.update_memoryÊ   s¶   € ð —?‘? 9Ó-ˆÙØñ Ø-3ˆH�ZÑ  Ñ*ÙØ1;ˆH�ZÑ  Ñ.ÙØ1;ˆH�ZÑ  Ñ.ÙØ")ˆH�YÑð �?Š?Ø�O‰O×"Ñ"Ø�KØ# IÑ.Ð/Ø# JÑ/Ð0ð #ô ð ˆð -5ˆD×Ñ˜yÑ)àˆr+   c                ó(   — | j                  |d¬«      S )zArchive a memory recordÚarchivedrM   )rP   )r(   rQ   s     r)   Úarchive_memoryzMemoryCore.archive_memoryí   s   € à×!Ñ! )°JÐ!Ó?Ð?r+   c                óV  — | j                  |«      }|sy| j                  d|› d�z  }t        |d«      5 }t        j                  ||d¬«       ddd«       | j
                  r| j
                  j                  |g¬«       n| j                  |= t        d	|› d
|› d�«       y# 1 sw Y   ŒSxY w)z"Delete a memory record with backupFÚdeleted_z.jsonÚwé   ©ÚindentNrb   zDeleted z
 (backup: ú)T)	rc   r   ÚopenÚjsonÚdumpr    Údeleter!   r'   )r(   rQ   rf   Úbackup_fileÚfs        r)   Údelete_memoryzMemoryCore.delete_memoryñ   s¨   € à—?‘? 9Ó-ˆÙØð —l‘l x°	¨{¸%Ð%@Ñ@ˆÜ�+˜sÓ#ð 	- qÜ�I‰I�h ¨!Õ,÷	-ð �?Š?Ø�O‰O×"Ñ"¨	 {Ð"Õ3à×"Ñ" 9Ð-ä�˜˜ :¨k¨]¸!Ð<Ô=Ø÷	-ð 	-ús   ´BÂB(c                óî  — | j                  d¬«      }|D �cg c]  }|d   d   | j                  v r|‘Œ }}|D �ch c]  }|d   j                  d«      r|d   d   ’Œ  }}|D �cg c]  }|d   |vr|‘Œ }}t        j                  t
        «      j                  «       }|D �cg c]#  }|d   j                  d«      r|d   d   |kD  r|‘Œ% }}|j                  d„ d	¬
«       |d| S c c}w c c}w c c}w c c}w )zî
        Retrieve active memory context for prompt.
        
        Filters:
        - Only ACTIVE_KINDS (rule, preference, project_decision, fact)
        - Only status='active'
        - Excludes superseded and expired records
        ÚactiverM   r   r0   r<   rF   r=   c                ó,   — | d   j                  dd«      S )Nr   r;   r4   )r   )r_   s    r)   ú<lambda>z4MemoryCore.retrieve_active_context.<locals>.<lambda>.  s   € ˜!˜J™-×+Ñ+¨L¸"Ó=€ r+   T)ÚkeyÚreverseN)r`   ÚACTIVE_KINDSr   r   r.   r   rN   Úsort)r(   ÚqueryÚlimitÚall_recordsr_   Úactive_recordsÚsuperseded_idsr.   s           r)   Úretrieve_active_contextz"MemoryCore.retrieve_active_context  sI  € ð ×&Ñ&¨hÐ&Ó7ˆð #ö
ØØ�‰}˜VÑ$¨×(9Ñ(9Ñ9ò ð
ˆð 
ð $ö
àØ�‰}× Ñ  Ô.ð ˆj‰M˜,Ó'ð
ˆð 
ð &ö
ØØ�‰w˜nÑ,ò ð
ˆð 
ô �l‰lœ3Ó×)Ñ)Ó+ˆà%ö
ØØ�Z‘=×$Ñ$ \Ô2°a¸
±mÀLÑ6QÐTWÒ6Wò ð
ˆð 
ð 	×ÑÙ=Øð 	ô 	
ð
 ˜f˜uÐ%Ð%ùò;
ùò
ùò

ùò
s   —C#º#C(Á#C-Â (C2c                ó¾   — | j                  «       }t        |d«      5 }t        j                  ||d¬«       ddd«       t	        |«      S # 1 sw Y   t	        |«      S xY w)z&Export all memory records to JSON filerl   rm   rn   N)r`   rq   rr   rs   rW   )r(   Úoutput_pathr‚   rv   s       r)   Úexport_memoryzMemoryCore.export_memory4  sV   € à×&Ñ&Ó(ˆä�+˜sÓ#ð 	0 qÜ�I‰I�k 1¨QÕ/÷	0ô �;ÓÐ÷	0ô �;ÓÐús   �A	Á	Ac                ót  — t        |«      5 }t        j                  |«      }ddd«       d}D ]Q  }	 | j                  r+| j                  j	                  |d   g|d   g|d   g¬«       n|| j
                  |d   <   |dz  }ŒS |S # 1 sw Y   ŒcxY w# t        $ r}t        d|d   › d	|› �«       Y d}~Œ„d}~ww xY w)
z$Import memory records from JSON fileNr   rG   r   rF   rH   é   zImport error for z: )rq   rr   Úloadr    rO   r!   Ú	Exceptionr'   )r(   Ú
input_pathrv   ÚdataÚcountÚitemÚes          r)   Úimport_memoryzMemoryCore.import_memory=  sÙ   € ä�*Óð 	  Ü—9‘9˜Q“<ˆD÷	 ð ˆØò 	=ˆDð=Ø—?’?Ø—O‘O×'Ñ'Ø#'¨	¡?Ð"3Ø#'¨
Ñ#3Ð"4Ø! $™Z˜Lð (õ ð 6:�D×&Ñ& t¨D¡zÑ2Ø˜‘
‘ð	=ð ˆ÷%	 ð 	 ûô ò =ÜÐ)¨$¨t©*¨°R¸°sÐ;×<Ñ<ûð=ús#   ŒB²ABÂBÂ	B7ÂB2Â2B7)N)r   ú
str | None)r0   r%   Úreturnr%   )r5   r6   r4   r4   )r0   r%   r8   r%   r9   r%   r:   r%   r;   r%   r<   r“   r=   r“   r>   r%   r?   r%   r@   r%   rA   r%   r”   údict[str, Any])
r
   ry   ÚuserÚverifiedNNr5   r6   r4   r4   )rG   r%   r0   r%   r8   r%   r9   r%   r:   r%   r<   r“   r=   r“   r>   r%   r?   r%   r@   r%   rA   r%   r”   r•   ©NN©r0   r“   r8   r“   r”   úlist[dict[str, Any]])rQ   r%   r”   údict[str, Any] | None)NNNN)rQ   r%   r8   r“   rG   r“   r:   r“   r=   r“   r”   r›   ©rQ   r%   r”   Úbool©Né   ©r€   r“   r�   Úintr”   rš   )r‡   r%   r”   r¡   )r�   r%   r”   r¡   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r~   ÚINACTIVE_KINDSr*   r2   rC   rS   r`   rc   rP   ri   rw   r…   rˆ   r’   rB   r+   r)   r	   r	      sø  „ ñò F€LÚ6€NôDó(%ð &ØØØ!ð
Øð
Ø!$ð
Ø.1ð
àð
à%(ð
ð ð
ð -7ð
ð ð	
ð
 ð
ð ð
ð ð
ð 
ó
ð6 ØØØ$Ø!%Ø!%Ø%ØØØ!ð6àð6ð ð6ð ð	6ð
 ð6ð ð6ð ð6ð ð6ð ð6ð ð6ð ð6ð ð6ð 
ó6ðt  Ø!ð$àð$ð ð$ð 
ó	$óL5ð* "Ø"Ø!%Ø!%ð!àð!ð ð!ð ð	!ð
 ð!ð ð!ð 
ó!óF@óð* !Øð.&àð.&ð ð.&ð 
ó	.&ó` ôr+   r	   zMemoryCore | NoneÚ_memory_instancec                 ó.   — t         €
t        «       a t         S )z"Get or create MemoryCore singleton)r§   r	   rB   r+   r)   Úget_memory_corer©   W  s   € ô ÐÜ%›<ÐÜÐr+   c                ó8   —  t        «       j                  | fi |¤ŽS )zSave a memory record)r©   rS   )rG   Úkwargss     r)   rS   rS   _  s   € à(Œ?Ó×(Ñ(¨Ñ;°FÑ;Ð;r+   r8   c                ó8   — t        «       j                  | |¬«      S )zList memory records©r0   r8   )r©   r`   r­   s     r)   r`   r`   d  s   € äÓ×(Ñ(¨d¸6Ð(ÓBÐBr+   c                ó4   — t        «       j                  | «      S )zDelete one memory record by ID.)r©   rw   )rQ   s    r)   rw   rw   j  s   € äÓ×*Ñ*¨9Ó5Ð5r+   c                óx   — | j                  «       } | st        d«      ‚t        «       j                  | |d||¬«      S )z+Explicitly save a persistent memory record.z!Memory content must not be empty.ry   )rG   r0   r8   r9   r:   )ÚstripÚ
ValueErrorr©   rS   )rG   r0   r9   r:   s       r)   Úrememberr²   o  sH   € ð �m‰m‹o€GÙÜÐ<Ó=Ð=ÜÓ×(Ñ(ØØØØØð )ó ð r+   c                ó8   — t        «       j                  | |¬«      S )z)Retrieve active memory context for prompt©r€   r�   )r©   r…   r´   s     r)   r…   r…   ‚  s   € äÓ×4Ñ4¸5ÈÐ4ÓNÐNr+   Ú__main__z=== MemoryCore v2 Test ===z
1. Saving test record...zTest memory for CyberBrain26r   ry   )rG   r0   r8   z
   Saved: rF   z
2. Listing all records...z
   Total: z recordsz 
3. Retrieving active context...z   Active: z% records (should exclude 'test' kind)z
4. Archiving test record...z   Status: r   zN/Az
=== Test complete ===)r”   r	   )rG   r%   r”   r•   r˜   r™   rœ   )r
   ÚmanualÚuser_confirmed)
rG   r%   r0   r%   r9   r%   r:   r%   r”   r•   rž   r    )!r¥   Ú
__future__r   rr   r   r   r   Úpathlibr   Útypingr   r#   r"   ÚImportErrorr'   r	   r§   Ú__annotations__r©   rS   r`   rw   r²   r…   r¢   ÚcorerR   r‚   rW   ry   ri   rc   rh   rB   r+   r)   ú<module>r¾      sË  ðòõ #ã Û 	ß "Ý Ý ð-ÛØÐ÷sñ sðn	 '+Ð Ð#Ó *óó<ô
Có6ð ØØ&ð	Øðà
ðð ðð ð	ð
 óô&Oð
 ˆzÒá	Ð
&Ô'Ù‹<€Dá	Ð
&Ô'Ø×ÑØ.ØØð ó €Fñ
 
ˆJ�v˜d‘|�nÐ
%Ô&á	Ð
'Ô(Ø×"Ñ"Ó$€KÙ	ˆJ‘s˜;Ó'Ð(¨Ð
1Ô2á	Ð
-Ô.Ø×)Ñ)Ó+€FÙ	ˆK™˜F›�}Ð$IÐ
JÔKá	Ð
)Ô*Ø×Ñ˜˜t™Ô%Ø�‰˜v d™|Ó,€HÙ	ˆK¹(˜ Ñ,¨XÒ6ÈÐNÐ
OÔPá	Ð
#Õ$ð5 øð] ò -ØÐÙ	Ð
+×,ð-ús   §E ÅEÅE