ó
    çqšiX&  ã            	       ó&  • S r SSKrSSKrSSKJrJr  SSKrSSKrSSSSSSS	S
S.r1 SkrS r	S r
     SS jrSS jrSS jrS r      SS jrS S jrS rS!S jrS r\S:X  a*  \" 5         \" 5       r\" S\R.                  " \S\S9 35        gg)"al  
rlm_adapter.py -- Genesis RLM (Recursive Language Models) PostgreSQL Adapter
Phase 1 Foundation: Relational Semantic Memory for Genesis

Connects to Elestio PostgreSQL genesis_rlm schema.
Provides upsert, query, session, and event operations.

Entity types: CLIENT, INTEGRATION, FEATURE, TASK, BLOCKER,
              SOLUTION, PATTERN, DECISION, LESSON, RESOURCE
é    N)ÚdatetimeÚtimezonez(postgresql-genesis-u50607.vm.elestio.appiXc  ÚpostgreszetY0eog17tD-dDuj--IRHé
   é   é   )ÚhostÚportÚuserÚpasswordÚdatabaseÚconnect_timeoutÚ
keepalivesÚkeepalives_idle>   ÚTASKÚOTHERÚCLIENTÚLESSONÚBLOCKERÚFEATUREÚGENERICÚPATTERNÚSESSIONÚDECISIONÚRESOURCEÚSOLUTIONÚINTEGRATIONc                  ó6   • [         R                  " S0 [        D6$ )N© )Úpsycopg2ÚconnectÚ
_DB_CONFIGr   ó    Ú%E:\genesis-system/core\rlm_adapter.pyÚ_connectr%   %   s   € Ü×ÒÑ)œjÑ)Ð)r#   c                  óJ   • [         R                  " [        R                  5      $ )N)r   Únowr   Úutcr   r#   r$   Ú_nowr)   )   s   € Ü<Š<œŸ™Ó%Ð%r#   c                 ó
  • Uc  0 nUc  / nU R                  5       n U [        ;  a  Sn [        [        R                  " 5       5      n[        5       n[        5       n	 U	R                  5       n
U
R                  SXpUSS U=(       d    S[        R                  " U5      UXXXˆUSS 45        U
R                  5       nU(       a  [        US   5      OUnU	R                  5         UU	R                  5         $ ! U	R                  5         f = f)z-Insert or update entity. Returns UUID string.Nr   aJ  
            INSERT INTO genesis_rlm.rlm_entities
                (id, entity_type, name, description, properties, tags,
                 surprise_score, created_at, updated_at, last_seen,
                 mention_count, source)
            VALUES (%s, %s, %s, %s, %s::jsonb, %s, %s, %s, %s, %s, 1, %s)
            ON CONFLICT (entity_type, name) DO UPDATE SET
                description     = EXCLUDED.description,
                properties      = genesis_rlm.rlm_entities.properties || EXCLUDED.properties,
                tags            = EXCLUDED.tags,
                surprise_score  = EXCLUDED.surprise_score,
                updated_at      = EXCLUDED.updated_at,
                last_seen       = EXCLUDED.last_seen,
                mention_count   = genesis_rlm.rlm_entities.mention_count + 1
            RETURNING id
            iô  Ú éd   r   )ÚupperÚVALID_ENTITY_TYPESÚstrÚuuidÚuuid4r)   r%   ÚcursorÚexecuteÚjsonÚdumpsÚfetchoneÚcommitÚclose)Úentity_typeÚnameÚdescriptionÚ
propertiesÚtagsÚsurprise_scoreÚsourceÚeidr'   ÚconnÚcurÚrowÚreturned_ids                r$   Úupsert_entityrE   -   så   € ð ÑØˆ
Ø|ØˆØ×#Ñ#Ó%€KØÔ,Ó,ØˆÜ
ŒdjŠj‹lÓ
€CÜ
‹&€CÜ‹:€DðØk‰k‹mˆØ‰ðð  ˜t D S˜z¨;×+<¸"ÜZŠZ˜
Ó# TØ #¨F°4°C¨Lð:ô#	
ð* l‰l‹nˆÞ%(”c˜#˜a™&”k¨cˆØ‰ŒØà
‰
øˆ
‰
ús   ÁBC0 Ã0Dc                 óº  • Uc  0 n[        [        R                  " 5       5      n[        5       n UR	                  5       nUR                  SXPXR                  5       U[        R                  " U5      [        5       45        UR                  5       nUR                  5         U(       a  [        US   5      OU UR                  5         $ ! UR                  5         f = f)z>Create typed edge between entities. Returns relationship UUID.ay  
            INSERT INTO genesis_rlm.rlm_relationships
                (id, from_entity_id, to_entity_id, relationship_type,
                 strength, properties, created_at)
            VALUES (%s, %s::uuid, %s::uuid, %s, %s, %s::jsonb, %s)
            ON CONFLICT (from_entity_id, to_entity_id, relationship_type)
            DO NOTHING
            RETURNING id
            r   )r/   r0   r1   r%   r2   r3   r-   r4   r5   r)   r6   r7   r8   )	Úfrom_idÚto_idÚrel_typeÚstrengthr<   ÚridrA   rB   rC   s	            r$   Úadd_relationshiprL   _   s¥   € àÑØˆ
Ü
ŒdjŠj‹lÓ
€CÜ‹:€DðØk‰k‹mˆØ‰ðð ˜5§.¡.Ó"2Ø”t—z’z *Ó-¬t«vð7ô	
ð l‰l‹nˆØ‰ŒÞ!Œs3q‘6Œ{ sÐ*à
‰
øˆ
‰
ús   ¯BC ÃCc                 óf  • / n/ nU (       a0  UR                  S5        UR                  U R                  5       5        U(       a&  UR                  S5        UR                  SU S35        U(       a  SSR                  U5      -   OSnUR                  U5        [        5       n UR	                  [
        R                  R                  S9nUR                  SU S	3U5        UR                  5        Vs/ s H  n[        U5      PM     snUR                  5         $ s  snf ! UR                  5         f = f)
z<Query entities with optional filters. Returns list of dicts.zentity_type = %szname ILIKE %sÚ%zWHERE z AND r+   ©Úcursor_factoryzï
            SELECT id, entity_type, name, description, properties, tags,
                   surprise_score, created_at, updated_at, last_seen,
                   mention_count, source
            FROM genesis_rlm.rlm_entities
            zF
            ORDER BY last_seen DESC
            LIMIT %s
            )Úappendr-   Újoinr%   r2   r    ÚextrasÚRealDictCursorr3   ÚfetchallÚdictr8   )	r9   Ú	name_likeÚlimitÚ
conditionsÚparamsÚwhererA   rB   Úrs	            r$   Úquery_entitiesr]   {   s   € à€JØ€FÞØ×ÑÐ,Ô-Ø‰k×'Ñ'Ó)Ô*ÞØ×Ñ˜/Ô*Ø‰˜˜)˜ AÐ&Ô'Þ5?ˆX˜Ÿ™ ZÓ0Ò0ÀR€EØ
‡MM%ÔÜ‹:€DðØk‰k¬¯©×)GÑ)GˆkÐHˆØ‰ðð
 ˆGð ðð ô	
ð "%§¡¤Ó0¢˜A”Q–¡Ñ0à
‰
ùò 1øà
‰
ús   Â"AD Ã1DÄD ÄD ÄD0c                 ó   • [        5       n UR                  [        R                  R                  S9nUR                  SU 45        UR                  5       nU(       a  [        U5      OS UR                  5         $ ! UR                  5         f = f)zHReturn first entity matching name (case-insensitive). None if not found.rO   aK  
            SELECT id, entity_type, name, description, properties, tags,
                   surprise_score, created_at, updated_at, last_seen,
                   mention_count, source
            FROM genesis_rlm.rlm_entities
            WHERE name ILIKE %s
            ORDER BY mention_count DESC
            LIMIT 1
            N)	r%   r2   r    rS   rT   r3   r6   rV   r8   )r:   rA   rB   rC   s       r$   Úget_entity_by_namer_   ›   sn   € ä‹:€DðØk‰k¬¯©×)GÑ)GˆkÐHˆØ‰ðð ˆGô	
ð l‰l‹nˆÞŒtCŒy TÐ)à
‰
øˆ
‰
ús   ŒAA; Á;Bc                 óœ  • [        [        R                  " 5       5      n[        5       n[	        5       n	 U	R                  5       n
U
R                  SXpSS UU(       a  UOSXUXE=(       d    S4	5        U
R                  5       nU	R                  5         U(       a  [        US   5      OU U	R                  5         $ ! U	R                  5         f = f)z,Upsert session record. Returns session UUID.a¡  
            INSERT INTO genesis_rlm.rlm_sessions
                (id, session_id, started_at, ended_at, summary,
                 entities_touched, decisions_made, cost_usd, handoff_file)
            VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)
            ON CONFLICT (session_id) DO UPDATE SET
                ended_at         = EXCLUDED.ended_at,
                summary          = EXCLUDED.summary,
                entities_touched = EXCLUDED.entities_touched,
                decisions_made   = EXCLUDED.decisions_made,
                cost_usd         = EXCLUDED.cost_usd,
                handoff_file     = EXCLUDED.handoff_file
            RETURNING id
            Nr,   r+   r   )
r/   r0   r1   r)   r%   r2   r3   r6   r7   r8   )Ú
session_idÚsummaryÚentities_touchedÚdecisions_madeÚcost_usdÚhandoff_fileÚendedÚsidr'   rA   rB   rC   s               r$   Úrecord_sessionri   ±   s¥   € ô ŒdjŠj‹lÓ
€CÜ
‹&€CÜ‹:€DðØk‰k‹mˆØ‰ðð ˜T˜cÐ" CÞ‰S˜tØ¨Ø×) rð+ô	
ð( l‰l‹nˆØ‰ŒÞ!Œs3q‘6Œ{ sÐ*à
‰
øˆ
‰
ús   ´A3B9 Â9Cc           
      ó¼  • Uc  0 n[        [        R                  " 5       5      n[        5       n UR	                  5       nUR                  SX@SS UU(       a  USS OS[        R                  " U5      [        5       45        UR                  5       nUR                  5         U(       a  [        US   5      OU UR                  5         $ ! UR                  5         f = f)z:Append raw event to rlm_events stream. Returns event UUID.NzÛ
            INSERT INTO genesis_rlm.rlm_events
                (id, event_type, entity_id, session_id, payload, created_at)
            VALUES (%s, %s, %s::uuid, %s, %s::jsonb, %s)
            RETURNING id
            r,   r   )r/   r0   r1   r%   r2   r3   r4   r5   r)   r6   r7   r8   )Ú
event_typeÚ	entity_idra   ÚpayloadÚeid_valrA   rB   rC   s           r$   Ú	add_eventro   Û   s±   € àØˆÜ”$—*’*“,Ó€GÜ‹:€DðØk‰k‹mˆØ‰ðð   #Ð&ØÞ!+ˆZ˜˜Ñ°ÜZŠZ˜Ó ¤$£&ð*ô	
ð l‰l‹nˆØ‰ŒÞ!Œs3q‘6Œ{ wÐ.à
‰
øˆ
‰
ús   ¯BC	 Ã	Cc                  ó*  • [        5       n  U R                  5       nUR                  S5        UR                  5        Vs0 s H  o"S   US   _M     nnUR                  S5        UR	                  5       S   nUR                  S5        UR	                  5       S   nUR                  S5        UR	                  5       S   nUR                  S5        UR	                  5       S   nUUUUUS.U R                  5         $ s  snf ! U R                  5         f = f)	z(Return entity counts by type and totals.zš
            SELECT entity_type, COUNT(*) AS cnt
            FROM genesis_rlm.rlm_entities
            GROUP BY entity_type ORDER BY cnt DESC
            r   r   z-SELECT COUNT(*) FROM genesis_rlm.rlm_entitiesz2SELECT COUNT(*) FROM genesis_rlm.rlm_relationshipsz-SELECT COUNT(*) FROM genesis_rlm.rlm_sessionsz+SELECT COUNT(*) FROM genesis_rlm.rlm_events)Útotal_entitiesÚtotal_relationshipsÚtotal_sessionsÚtotal_eventsÚby_type)r%   r2   r3   rU   r6   r8   )rA   rB   r\   ru   rq   rr   rs   rt   s           r$   Ú	get_statsrv   ö   sö   € ä‹:€DðØk‰k‹mˆØ‰ðô	
ð (+§|¡|¤~Ó6¢~ !Q‘4˜˜1™’:¡~ˆÐ6Ø‰ÐCÔDØŸ™›¨Ñ*ˆØ‰ÐHÔIØ!Ÿl™l›n¨QÑ/ÐØ‰ÐCÔDØŸ™›¨Ñ*ˆØ‰ÐAÔBØ—|‘|“~ aÑ(ˆà,Ø#6Ø,Ø(Øñ
ð 	
‰
ùò# 7øð" 	
‰
ús   Œ3D  ¿C;ÁBD  Ã;D  Ä Dc                 ó   • [        U S9$ )z%Return N most recently seen entities.©rX   )r]   rx   s    r$   Úget_recent_entitiesry     s   € ä Ñ&Ð&r#   c                  óÜ   •  [        5       n U R                  5       nUR                  S5        U R                  5         [	        S5        g! [
         a  n[	        SU 35         SnAgSnAff = f)z.Test DB connectivity. Returns True on success.zSELECT 1z7[rlm_adapter] Connection OK -- genesis_rlm schema readyTz![rlm_adapter] Connection FAILED: NF)r%   r2   r3   r8   ÚprintÚ	Exception)rA   rB   Úes      r$   Útest_connectionr~     s]   € ð	Ü‹zˆØk‰k‹mˆØ‰JÔØ
‰
ŒÜÐGÔHØøÜó ÜÐ1°!°Ð5Ô6Üûðús   ‚AA	 Á	
A+ÁA&Á&A+Ú__main__z[rlm_adapter] Stats: é   )ÚindentÚdefault)r+   NNç      à?Úrlm_adapter)rƒ   N)NNé   )r+   r   r   g        r+   T)NNN)r   )Ú__doc__r4   r0   r   r   r    Úpsycopg2.extrasr"   r.   r%   r)   rE   rL   r]   r_   ri   ro   rv   ry   r~   Ú__name__Ústatsr{   r5   r/   r   r#   r$   Ú<module>rŠ      sÞ   ðñ	ó Û ß 'ã Û ð 7ØØØ'ØØØØñ	€
òÐ ò*ò&ð ØØ	ØØô0ôdô8ò@ð0 ØØØØØ
ô'ôTò6ô@'ò
ð ˆzÓÙÔÙ‹K€EÙ	Ð! $§*¢*¨U¸1ÀcÑ"JÐ!KÐ
LÕMð r#   