
    ϣi[&              	          d Z ddlZddlZddlmZmZ ddlZddlZddddddd	d
dZh dZd Z	d Z
	 	 	 	 	 ddZddZddZd Z	 	 	 	 	 	 ddZd dZd Zd!dZd Zedk(  r- e         e       Z ed ej.                  ede              yy)"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CiBjh6LM7Yuqkq-jo2r7eQDw
         )hostportuserpassworddatabaseconnect_timeout
keepaliveskeepalives_idle>   TASKOTHERCLIENTLESSONBLOCKERFEATUREGENERICPATTERNSESSIONDECISIONRESOURCESOLUTIONINTEGRATIONc                  4    t        j                  di t        S )N )psycopg2connect
_DB_CONFIGr       )/mnt/e/genesis-system/core/rlm_adapter.py_connectr%   %   s    )j))r#   c                  H    t        j                  t        j                        S )N)r   nowr   utcr   r#   r$   _nowr)   )   s    <<%%r#   c                    |i }|g }| j                         } | t        vrd} t        t        j                               }t               }t               }		 |	j                         }
|
j                  d|| |dd |xs dt        j                  |      ||||||dd f       |
j                         }|rt        |d         n|}|	j                          ||	j                          S # |	j                          w xY w)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,,
djjl
C
&C:Dkkm  +tDSz;+<"ZZ
#TS#sF4CL:#	
* lln%(c#a&kc



s   A=C# #C5c                    |i }t        t        j                               }t               }	 |j	                         }|j                  d|| ||j                         |t        j                  |      t               f       |j                         }|j                          |rt        |d         n|	 |j                          S # |j                          w xY w)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    

djjl
C:Dkkm '5(.."2tzz*-tv7	
 lln!s3q6{s*



s   BC Cc                 H   g }g }| r0|j                  d       |j                  | j                                |r&|j                  d       |j                  d| d       |rddj                  |      z   nd}|j                  |       t               }	 |j	                  t
        j                  j                        }|j                  d| d	|       |j                         D cg c]  }t        |       c}|j                          S c c}w # |j                          w xY w)
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0RE
MM%:Dkk)G)GkH
 G  	
 "%0AQ0

 1

s   AD %D
7D 
D D!c                    t               }	 |j                  t        j                  j                        }|j                  d| f       |j                         }|rt        |      nd	 |j                          S # |j                          w xY w)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kk)G)GkH G	
 llntCyT)



s   AA9 9Bc                    t        t        j                               }t               }t	               }		 |	j                         }
|
j                  d|| dd ||r|nd|||||xs df	       |
j                         }|	j                          |rt        |d         n|	 |	j                          S # |	j                          w xY w)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     djjl
C
&C:Dkkm *Tc"CSt&|)r+	
( lln!s3q6{s*



s   A'B, ,B>c           
         |i }t        t        j                               }t               }	 |j	                         }|j                  d|| dd ||r|dd ndt        j                  |      t               f       |j                         }|j                          |rt        |d         n|	 |j                          S # |j                          w xY w)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kkm j#&!+ZZZ $&*	
 lln!s3q6{w.



s   A>B= =Cc                  &   t               } 	 | j                         }|j                  d       |j                         D ci c]  }|d   |d    }}|j                  d       |j	                         d   }|j                  d       |j	                         d   }|j                  d       |j	                         d   }|j                  d       |j	                         d   }|||||d| j                          S c c}w # | j                          w xY w)	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kkm	
 (+||~6!1Q41:66CD*HI!llnQ/CD*AB||~a(,#6,(
 	

# 7" 	

s   3C> C9BC> 9C> >Dc                     t        |       S )z%Return N most recently seen entities.rX   )r]   rx   s    r$   get_recent_entitiesry     s    &&r#   c                      	 t               } | j                         }|j                  d       | j                          t	        d       y# t
        $ r}t	        d|        Y d}~yd}~ww xY w)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kkm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KE	!*$**U1c"J!K
LM r#   