
    iS                    (   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ZddlmZm	Z	 ddl
mZ ddlmZmZmZmZ  ed      Zedz  Zed	z  Zed
z  Zedz  dz  Zej,                  j/                  d eedz  dz               ej,                  j/                  d ee              ej2                  ej4                  dd        ej6                  d      ZdZdddddddZd Z	 	 d9	 	 	 d:dZ 	 d;	 	 	 d<dZ!d=d>dZ"d=d?d Z#d@d!Z$	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dAd"Z%d# Z&edfdBd$Z'eddf	 	 	 dCd%Z(e)d&k(  r ejT                  d'(      Z+e+jY                  d)ed*+       e+jY                  d,e-dd-.       e+jY                  d/d0d12       e+jY                  d3e-dd4.       e+j]                         Z/e/j`                  r* e(e/jb                  e/jd                  e/jf                  5      Z4n e'e/jb                  e/jd                  6      Z4 e5 ejl                  e4d7e8             yy)Du  
RLM Bloodstream — Session Context Injector
==========================================
On session start:
1. Queries Qdrant for top-20 most relevant memories based on current task
2. Queries PostgreSQL for recent session state (last 48h entities)
3. Formats injected context as structured markdown
4. Writes to E:\genesis-system\data\context_state\injected_context.md

Usage:
    python E:\genesis-system\core\session_context_injector.py
    python E:\genesis-system\core\session_context_injector.py --task "Build voice widget for Telnyx"
    python E:\genesis-system\core\session_context_injector.py --top-k 20 --task "GHL modules"

Author: Genesis Systems Builder
Created: 2026-02-23
    )annotationsN)datetime	timedelta)Path)AnyDictListOptionalz/mnt/e/genesis-systemdatacontext_statezinjected_context.mdKNOWLEDGE_GRAPHentitieszgenesis-memoryu4   %(asctime)s [%(levelname)s] %(name)s — %(message)sz%Y-%m-%d %H:%M:%S)levelformatdatefmtContextInjectoru:   Genesis session start — load relevant operational memoryzError ResolutionDecisionzTool PatternLearningzTitan MemoryAxiom)	error_fixdecisiontool_uselearningtitan_memoryaxiomc                    	 ddl m}  dd l} |j                  di | j	                         S # t
        $ r dd l}|j                  t        j                  j                  dd      t        t        j                  j                  dd            t        j                  j                  dd      t        j                  j                  d	d      t        j                  j                  d
d            cY S w xY w)Nr   )PostgresConfigPG_HOST	localhostPG_PORTi8  	PG_DBNAMEgenesisPG_USERPG_PASSWORD )hostportdbnameuserpassword )
elestio_configr   psycopg2connectget_connection_paramsImportErrorosenvirongetint)r   r-   s     6/mnt/e/genesis-system/core/session_context_injector.pyget_pg_connectionr6   @   s    
1xI."F"F"HII 
	;7RZZ^^It45::>>+y9	95ZZ^^M26   
 	

s   ), CC10C10   c                   t        j                         t        |      z
  j                         }	 | j	                         }|j                  d||f       |j                         }|j                          |D cg c]'  }|d   |d   |d   |d   |d   t        |d         d	d
) c}S c c}w # t        $ r$}t        j                  d|        g cY d}~S d}~ww xY w)zEPull recent high-confidence entities from PostgreSQL digestion table.hoursa  
            SELECT entity_id, pattern_type, content, confidence, source_file, created_at
            FROM digestion_kg_entities
            WHERE confidence >= 0.75 AND created_at >= %s
            ORDER BY confidence DESC, created_at DESC
            LIMIT %s
            r                  postgresql_recent	entity_idpattern_typecontent
confidencesource_file
created_atsourcez'PostgreSQL recent entity query failed: N)r   utcnowr   	isoformatcursorexecutefetchallclosestr	Exceptionloggerwarning)connr:   limitcutoffcurrowsres           r5   query_recent_pg_entitiesrZ   P   s     oo)%"88CCEFkkm UO		
 ||~		 
  qT !!Q4d t!!A$i-
 	
 
  @DE	s0   AB- 9,B(%B- (B- -	C6CCCc                x   	 | j                         }|j                         D cg c]!  }t        |      dkD  s|j                         # c}dd }|sdg}dj	                  |D cg c]  }d c}      }|D cg c]  }d| d
 c}|gz   }	|j                  d| d	|	       |j                         }
|j                          |
D cg c]*  }|d
   |d   |d   |d   dd |d   t        |d         dd, c}S c c}w c c}w c c}w c c}w # t        $ r$}t        j                  d|        g cY d}~S d}~ww xY w)zGPull from bloodstream_knowledge table (KG entities loaded by pipeline).r=   Nr?   r"   z OR zLOWER(content) LIKE %s%z
            SELECT source, type, title, content, confidence, created_at
            FROM bloodstream_knowledge
            WHERE (zY)
            ORDER BY confidence DESC, created_at DESC
            LIMIT %s
            r   r;   r<   i  r>   bloodstream_knowledge)rH   rC   titlerD   rE   rG   source_tablez$bloodstream_knowledge query failed: )rK   splitlenlowerjoinrL   rM   rN   rO   rP   rQ   rR   )rS   taskrT   rV   wkeywords_like_clauseskparamsrW   rX   rY   s                r5   query_bloodstream_knowledgerk   s   s]   &kkm'+zz|B!s1vzAGGIB2AF!{H{{0891%&9
 %--qAaS(-7 !> " 		
 ||~		 
  A$ !!1Q4:d!!A$i 7
 	
+ C
 :-
  =aSAB	sX   "D C8C8
D $	C=-D 8DAD /D5D 8D 	D9D4.D94D9   c                   	 ddl m} ddlm} |j	                         } |di |}d}|j                         j                  D cg c]  }|j                   }}||vrt        j                  d| d       g S 	 ddl
m}	  |	| dd	       }
|j                  ||
|d      }t        |d      r|j                   n|}|D cg c]  }|j"                  j%                  dd      |j"                  j%                  dd      |j"                  j%                  dd      t'        |j(                  d      |j"                  j%                  dd      |j"                  j%                  dd      dd c}S c c}w # t        $ r$}t        j                  d
|        g cY d}~S d}~ww xY wc c}w # t        $ r$}t        j                  d|        g cY d}~S d}~ww xY w)z;Semantic search over genesis_memories collection in Qdrant.r   )QdrantConfig)QdrantClientgenesis_memorieszQdrant collection 'z' not yet populated)
embed_textNi   u3   Gemini embedding failed — skipping Qdrant query: T)collection_namequeryrT   with_payloadpointsrB   r%   rC   semanticrD   r=   rF   rG   qdrant_semanticrA   zQdrant semantic search failed: r+   )r,   rn   qdrant_clientro   get_client_paramsget_collectionscollectionsnamerQ   infocore.kb.embedderrq   rP   rR   query_pointshasattrru   payloadr3   roundscore)rd   top_krn   ro   cfgclient
COLLECTIONcr{   rq   	query_vecexcresponseresultsrX   rY   s                   r5   query_qdrant_semanticr      s   ./.,,.$$'
 (.'='='?'K'KL!qvvLL[(KK-j\9LMNI	3"4:.I
 &&&	 ' 
 &-Xx%@(//h 
  YY]];; !		nj I99==B7#AGGQ/ yy}}]B?iimmL"=+
 	
+ M  	NNPQTPUVWI	
  8<=	sm   AF! E' F! 9E, 
3F! =B'F$F! 'F! ,	F5FFF! FF! !	G*G	G	Gc                0   t         j                         sg S t        t         j                  d      d d      dd }g }|D ]r  }	 |j	                  d      j                         D ]L  }|j                         s	 t        j                  |      }d	|j                   |d
<   |j                  |       N t |j                  d d       |d|  S # t        j                  $ r Y w xY w# t        $ r%}t        j                  d| d|        Y d}~d}~ww xY w)z;Fallback: read recent JSONL entity files from KG directory.*.jsonlc                6    | j                         j                  S Nstatst_mtimefs    r5   <lambda>z&load_kg_entity_files.<locals>.<lambda>       affh''     TkeyreverseNr?   utf-8encodingzkg_file:rH   zCould not read : c                &    | j                  dd      S )NrE   g      ?r3   rY   s    r5   r   z&load_kg_entity_files.<locals>.<lambda>   s    lC 8 r   )KG_ENTITIES_DIRexistssortedglob	read_text
splitlinesstripjsonloadsr|   appendJSONDecodeErrorrP   rQ   debugsort)rT   entity_filesr   eflineobjrY   s          r5   load_kg_entity_filesr      s   !!#	Y'' 	q	
L H 6	6g6AAC zz|**T*C&.rwwi$8CMOOC(6 MM8$MGFU ++  	6LL?2$b455	6s<   4C'98C1C'C$!C'#C$$C''	D0DDc                 B   t         dz  dz  } | j                         sg S t        | j                  d      d d      dd }g }|D ]w  }	 |j	                  d	
      j                         D ]Q  }|j                         s	 t        j                  |      }d|j                   |d<   d|d<   |j                  |       S y |j                  d d       |dd S # t        j                  $ r Y w xY w# t        $ r%}t        j                  d| d|        Y d}~d}~ww xY w)z5Load recent Titan Memory learnings from axioms JSONL.r   axiomsr   c                6    | j                         j                  S r   r   r   s    r5   r   z#load_titan_memory.<locals>.<lambda>   r   r   Tr   Nr=   r   r   zaxiom:rH   r   rC   zCould not read axiom file r   c                &    | j                  dd      S )NrE   皙?r   r   s    r5   r   z#load_titan_memory.<locals>.<lambda>  s    aeeL#6 r   
   )GENESIS_ROOTr   r   r   r   r   r   r   r   r|   r   r   rP   rQ   r   r   )
axioms_diraxiom_filesr   afr   r   rY   s          r5   load_titan_memoryr      s<    11H<J		"' 	q	
K F A	Ag6AAC 	zz|**T*C&,RWWI$6CM*1C'MM#&	A KK6KE#2; ++  	ALL5bTA3?@@	As<   4C0==C:C0C-*C0,C--C00	D9DDc           
     
   dd| d|  dddg}|r|j                  d       |j                  d       t        |dd d	      D ]  \  }}	|	j                  d
      xs% |	j                  d      xs |	j                  dd      }
|	j                  d      xs |	j                  d      xs d| }|	j                  dd      }|j                  d| d|dd       |j                  d|
dd         |j                  d        |j                  d       |j                  d       |r|j                  d       |j                  d| dd  d       |j                  d       t        |dd d	      D ]  \  }}	t        j                  |	j                  dd      |	j                  dd            }|	j                  dd      }|	j                  d
d      dd }
|j                  d| d | d!|d"d       |j                  d|
        |j                  d        |j                  d       |j                  d       |r|j                  d#       |j                  d       i }|dd$ D ]5  }	|	j                  dd%      }|j	                  |g       j                  |	       7 |j                         D ]  \  }}t        j                  ||j                               }|j                  d&|        |dd' D ]+  }	|	j                  d
d      dd( }
|j                  d)|
        - |j                  d        |j                  d       |j                  d       |r|j                  d*       |j                  d       |dd D ]  }	|	j                  d      xs |	j                  dd+      }|	j                  d
d      dd }
|	j                  dd,      }|j                  d| d|dd       |j                  d|
        |j                  d        |j                  d       |j                  d       |r|s|s|j                  d-       |j                  d       |dd D ]o  }	|	j                  d
      xs |	j                  dd      }
|	j                  d.      xs |	j                  dd/      }|j                  d0| d1t        |
      dd(         q |j                  d       |j                  d       |j                  d       t        |      t        |      z   t        |      z   t        |      z   }|j                  d2| d3       |j                  d       d4j                  |      S )5zCRender all memory sources into a structured markdown context block.z# Injected Session Contextz> Generated: z> Task Signal: r%   z---u.   ## Titan Memory — Core Operational LearningsN   r;   rD   r   r   idr^   axiom_rE   r   z**z
** (conf: .2f)z> i,  z!## Top Semantic Memories (Qdrant)z*Relevance-ranked to task: "P   z"*r   rC   Memoryg        z. [z]** (relevance: z.3fz&## Recent Session Learnings (Last 48h)   otherz### r>      z- z&## Task-Relevant Bloodstream Knowledgeentrygffffff?z"## KG Entity Fallback (File-Based)typeentityz- **[z]** z*Total memories injected: z0 | Sources: Qdrant, PostgreSQL, KG files, Titan*
)
r   	enumerater3   TYPE_LABELS
setdefaultitemsr^   rO   ra   rc   )rd   qdrant_results	pg_recentbloodstreamkg_fallbacktitangenerated_atlinesirY   rD   labelconfby_typeptr   r^   totals                     r5   format_injected_contextr     s    	%
~&
$ 

E EFReBQi+ 	DAqeeI&Q!%%.QAEE*b<QGEE$KA155>AvaS\E55s+DLL2eWJtCj:;LL2gdsm_-.LL	 	UR 894T#2YKsCDRnSb115 	DAqOOAEE."$=quu^U]?^_E55s+DeeIr*4C0GLL2aSE7*:4*AFGLL2gY(LL	 	UR =>R#%3B 	1A~w/Br2&--a0	1 ! 	IBOOB
3ELL4w(2AY -%%	2.t4r'^,- LL	 	UR =>RRa 	AEE'NDaeeNG&DEeeIr*4C0G55s+DLL2eWJtCj:;LL2gY(LL	 	UR Ni9:RSb! 	?AeeI&?!%%
B*?GvA!%%"ABLL5DWds);(<=>	? 	RUR #i.03{3CCc%jPE	LL-eW4def	LL99Ur   c                     ddl m}  ddlm} ddlm} ddlm}  | d      }|j                   |              |j                   |              |j                   |              |S )z;Build the unified RetrieverOrchestrator with all 3 sources.r   )RetrieverOrchestrator)QdrantRetriever)PGRetriever)KGFileRetrieveri@  )
timeout_ms)	 core.nervous_system.orchestratorr   $core.nervous_system.qdrant_retrieverr    core.nervous_system.pg_retrieverr   %core.nervous_system.kg_file_retrieverr   register_retriever)r   r   r   r   orchs        r5   build_retrieverr   }  sO    FD<E D1DO-.KM*O-.Kr   c                F   ddl m} t        j                         j	                  d      }t
        j                  d| dd  d       t               }|j                   || |            }t               }d	d
| d| dd  ddg}|rv|j                  d       |dd D ]L  }|j                  d|j                  dd       d|j                  d|j                  dd            dd         N |j                  d       i }	|j                  D ]A  }
|
j                  j                  d      d   }|	j                  |g       j                  |
       C d|	v r^|j                  d       |	d   dd D ]1  }|j                  d|j                   dd|j"                  dd         3 |j                  d       d|	v r]|j                  d       |	d   dd D ]0  }|j                  d |j                   d|j"                  dd         2 |j                  d       d!|	v r]|j                  d"       |	d!   dd D ]0  }|j                  d |j                   d|j"                  dd         2 |j                  d       |j$                  t'        |      z   }|j                  d#| d$d%j)                  |j*                         d&|j,                  d'd(       d)j)                  |      }t.        j1                  d*d*+       t2        j5                  |d,-       t
        j                  d.t2                || |j$                  t'        |      |j*                  |j6                  |j,                  t9        t2              d/}t.        d0z  }|j5                  t;        j<                  |d1t8        2      d,-       |S )3z?Run context injection via the unified Nervous System retriever.r   )RetrievalRequest%Y-%m-%d %H:%M:%S UTCz1=== Session Context Injector (Unified) === task='N<   ...')rs   r   z$# Genesis Session Context (Injected)z*Generated: z	 | Task: r   *r%   z%## Titan Memory (Hardwired Learnings)r   z- **r   unknownz**: rD   r      :qdrantz## Semantic Memory (Qdrant)z	- [score=r   z] pgz## Recent Entities (PostgreSQL)z- [kgz## Knowledge Graph (Files)z*Total: z | Sources: z, z | Latency: z.0fzms*r   Tparentsexist_okr   r   Context written to )r   rd   total_chunksr   sources_queriedsources_failed
latency_msoutput_fileinjected_context_manifest.jsonr<   indentdefault)core.nervous_system.contractsr   r   rI   strftimerQ   r}   r   rs   r   r   r3   chunksrH   r`   r   relevance_scorerD   r   ra   rc   r   r  CONTEXT_STATE_DIRmkdirOUTPUT_FILE
write_textr  rO   r   dumps)rd   r   r   r   r   resultr   r   tsource_groupschunkprefixr   r   
context_mdstatsmanifest_files                    r5   run_unifiedr    s   >??$--.EFL
KKCD"I;dSTDZZ(t5ABF E 	/
|nId3Bi[:
E <=s 	jALL4dI 67tAEE)QUUSZ\^M_<`aebe<f;ghi	jR &(M ;##C(+  ,33E:; = 23x("- 	QALL9Q%6%6s$;2aiio=NOP	QR}67t$Sb) 	>ALL3qxxj199Tc?*;<=	>R}12t$Sb) 	>ALL3qxxj199Tc?*;<=	>R#e*,E	LL8E7,tyy9O9O/P.QQ]^d^o^ops]ttwxy5!JD48:8
KK%k]34 %++U!11 //'';'	E &(HHMTZZaEPWXLr   c           
        t        j                         j                  d      }t        j	                  d| dd  d       || dddddt        t              d}t               }t        |      |d<   t        j	                  d	t        |       d
       t        | |      }t        |      |d<   t        j	                  dt        |       d       d}g }g }		 t               }t        ||      }t        ||       }	t        |      |d<   t        |	      |d<   t        j	                  dt        |       dt        |	       d       |r|j                          	 g }|s<|s:t!               }t        |      |d<   t        j	                  dt        |       d       t#        | |||	|||      }t$        j'                  dd       t        j)                  |d       t        j	                  dt                t$        dz  }|j)                  t+        j,                  |d t
        !      d       |S # t        $ r#}
t        j                  d|
        Y d}
~
d}
~
ww xY w# |r|j                          w w xY w)"z#Run the context injection pipeline.r   z'=== Session Context Injector === task='Nr   r   r   )r   rd   r   r   r   r   r   r  r   zTitan Memory: z axioms)r   r   zQdrant: z semantic resultsr9   r   r   zPostgreSQL: z	 recent, z bloodstreamzPostgreSQL unavailable: r   zKG fallback: z	 entities)rd   r   r   r   r   r   r   Tr   r   r   r   r  r<   r  )r   rI   r	  rQ   r}   rO   r  r   ra   r   r6   rZ   rk   rP   rR   rN   r   r   r  r  r  r   r  )rd   r   pg_hoursr   r  r   r   rS   r   r   rY   r   r  r  s                 r5   runr    sb    ??$--.EFL
KK9$s)DIJ %;'	E EZE'N
KK.UG45 +4u=N!.1E

KK(3~.//@AB DIK ",TB	1$= ^k";/ml3y>"2)C<L;M\Z[ JJL K)*,";/mmC$4#5Y?@ )%!J D48:8
KK%k]34 &(HHM

5C0  
 LG  71!5667 JJL s+   A-H* *	I3II II I.__main__zRLM Session Context Injector)descriptionz--taskz.Current task description for relevance ranking)r  helpz--top-kzNumber of results to retrieve)r   r  r  z--legacy
store_truez5Use legacy pipeline instead of unified nervous system)actionr  z
--pg-hoursz-(Legacy only) Hours back for PostgreSQL query)rd   r   r  )rd   r   r<   r  )r7      )r:   r4   rT   r4   returnList[Dict[str, Any]])r   )rd   rO   rT   r4   r#  r$  )rl   )rd   rO   r   r4   r#  r$  )rT   r4   r#  r$  )r#  r$  )rd   rO   r   r$  r   r$  r   r$  r   r$  r   r$  r   rO   r#  rO   )rd   rO   r   r4   r#  Dict[str, Any])rd   rO   r   r4   r  r4   r#  r%  )7__doc__
__future__r   argparser   loggingr1   sysr   r   pathlibr   typingr   r   r	   r
   r   DATA_DIRr  r  r   pathinsertrO   basicConfigINFO	getLoggerrQ   DEFAULT_TASKr   r6   rZ   rk   r   r   r   r   r   r  r  __name__ArgumentParserparseradd_argumentr4   
parse_argsargslegacyrd   r   r  r  printr  r+   r   r5   <module>r<     s  $ #    	 
 (  , , +,& . "77!22Z? 3|f,/??@ A 3|$ %   
,,A
 
		,	- L $"
  13+- %( 2F H /1)(+)5I)Z0h@Bc
c(c $c &	c
 &c  c c 	cP )r IZ !rII-IZ z$X$$1OPF
,M  O
	R<  >

<T  V
3L  ND{{$))4::N$))4::>	*$**VAs
34! r   