
    Äi                         S r SSKrSSKrSSKrSSKrSSKrSSKJrJ	r	J
r
Jr  \R                  " \5      rSrSSS.rSr " S	 S
5      r\" 5       rg)ur  
Genesis Memory Bridge — MCP Client for Sovereign Memory
=========================================================
Connects to the Graphiti MCP endpoint at 152.53.201.221:8001/mcp.
Used by both Claude Code and Gemini CLI to read/write shared memory.

Usage:
    from core.memory_bridge import MemoryBridge

    bridge = MemoryBridge()
    bridge.save("My learning", "genesis-kinan", name="Learning Title")
    results = bridge.search("Sunaiva pricing", "genesis-kinan")
    facts = bridge.search_facts("product architecture", "genesis-kinan")
    episodes = bridge.get_episodes("genesis-kinan")
    status = bridge.health()
    N)OptionalListDictAnyzhttp://152.53.201.221:8001/mcpzgenesis-memory-bridgez1.0.0)nameversionz
2025-03-26c                   <   \ rS rSrSr\4S\4S jjrS\4S jrS\S\	\\
4   S\	\\
4   4S	 jr  SS\S\S\\   S\S\S\	\\
4   4S jjrSS\S\S\S\\	\\
4      4S jjrSS\S\S\S\\	\\
4      4S jjrSS\S\S\\	\\
4      4S jjrS\	\\
4   4S jrSrg
)MemoryBridge    z6MCP client for the sovereign Graphiti memory endpoint.endpointc                     Xl         S U l        g )N)r   _session_id)selfr   s     2e:\genesis-system\genesis_v2\core\memory_bridge.py__init__MemoryBridge.__init__#   s     *.    returnc           	      L   [         R                  " SS[        0 [        S.S[        R
                  " 5       R                  SS  3S.5      R                  S5      n[        R                  R                  U R                  US	S
S.SS9n[        R                  R                  USS9 nUR                  R                  SS5      nU(       d;  UR                  R                  5        H  u  pVUR!                  5       S:X  d  M  Un  O   X@l        UsSSS5        $ ! , (       d  f       g= f)z4Initialize an MCP session and return the session ID.2.0
initialize)protocolVersioncapabilities
clientInfozinit-N   jsonrpcmethodparamsidutf-8application/json#application/json, text/event-stream)Content-TypeAcceptPOSTdataheadersr      timeoutzmcp-session-id )jsondumpsPROTOCOL_VERSIONCLIENT_INFOuuiduuid4hexencodeurllibrequestRequestr   urlopenr)   getitemslowerr   )r   payloadreqresp
session_idheadervalues          r   _init_sessionMemoryBridge._init_session'   s   **"#3 ")
 $**,**2A./0	
 	 6'? 	 nn$$MM 2?  % 
 ^^##C#4))*:B?J%)\\%7%7%9MF||~)99%*
 &:
  * 544s   %AD>D
D#	tool_name	argumentsc           
         U R                  5       nU(       d  SS0$ [        R                  " SSUUS.U S[        R                  " 5       R
                  SS  3S	.5      R                  S
5      n[        R                  R                  U R                  USSUS.SS9n [        R                  R                  USS9 nUR                  5       R                  S
5      nUR                  S5      (       Ga.  UR                  S5       GH  nUR                  S5      (       d  M  [        R                   " USS 5      n	U	R#                  S0 5      n
U
R#                  S5      (       a>  SnU
R#                  S/ 5       H  nXR#                  SS5      -  nM     SU0s  sSSS5        $ U
R#                  S5      nU(       a  Us  sSSS5        $ U
R#                  S/ 5       H7  nUR#                  SS5      n [        R                   " U5      s  s  sSSS5        $    U
s  sSSS5        $    O[        R                   " U5      sSSS5        $  SSS5        g! [        R$                   a    SU0s s  s  sSSS5        $ f = f! , (       d  f       g= f! [        R&                  R(                   a/  n[*        R'                  SU 35        S[-        U5      0s SnA$ SnAf[.         a/  n[*        R'                  SU 35        S[-        U5      0s SnA$ SnAff = f)z.Call an MCP tool with proper session handling.errorz Failed to initialize MCP sessionr   z
tools/call)r   rF   -Nr   r   r!   r"   r#   )r$   r%   zMcp-Session-Idr&   r'   x   r+   zevent:
zdata:    resultisErrorr-   contenttextstructuredContentmessagezMCP call failed: zMCP call error: )rC   r.   r/   r2   r3   r4   r5   r6   r7   r8   r   r9   readdecode
startswithsplitloadsr:   JSONDecodeErrorrH   URLErrorloggerstr	Exception)r   rE   rF   r@   r=   r>   r?   bodyliner(   rM   
error_textrO   
structuredrP   es                   r   
_call_toolMemoryBridge._call_toolI   s   '')
?@@**"!& Kq!1!1"1!5 67
  6'? 	 nn$$MM 2?",
  % 	
	%''S'9Tyy{))'2??8,, $

4 0??844#'::d12h#7D%)XXh%;F%zz)44-/
/5zz)R/HG$.++fb2I$IJ 0I(/'< < :9 *04G)HJ)'1 1 :9 ,2::i+D'.{{62'>!=+/::d+;$;% :9 ,E $*M+ :9 !1(  ::d+/ :9 !1 :9& (,';'; !=,5t+<$<) :9&!=' :90 ||$$ 	%LL,QC01SV$$ 	%LL+A3/0SV$$	%s   J ;A I4A5I4	J I49	J 'I4+I	 I4	J I4	J I45	J  J 	I1	!I4&	J 0I1	1I44
J>J J L	#$KL	L	$L>L	L	NrO   group_idr   sourcesource_descriptionc                     U(       d%  S[         R                  " 5       R                  S S  3nX1X$S.nU(       a  XVS'   U R                  SU5      n[        R                  SU SU 35        U$ )NzMemory-r   )r   episode_bodyrd   re   rf   
add_memoryzMemory saved: z -> )r2   r3   r4   rb   rZ   info)r   rO   rd   r   re   rf   argsrM   s           r   saveMemoryBridge.save   sj    TZZ\--bq123D(,S[n);%&t4nTF$vh78r   query	max_nodesc                     X/US.nU R                  SU5      nSU;   a  [        R                  SUS    35        / $ UR                  S/ 5      $ )N)rn   	group_idsro   search_nodesrH   zSearch failed: nodesrb   rZ   warningr:   )r   rn   rd   ro   rk   rM   s         r   searchMemoryBridge.search   sU    ).ZV_`6fNN_VG_,=>?Izz'2&&r   	max_factsc                     X/US.nU R                  SU5      nSU;   a  [        R                  SUS    35        / $ UR                  S/ 5      $ )N)rn   rq   rx   search_memory_factsrH   zFact search failed: factsrt   )r   rn   rd   rx   rk   rM   s         r   search_factsMemoryBridge.search_facts   sW    ).ZV_`!6=fNN1&/1BCDIzz'2&&r   max_episodesc                     U/US.nU R                  SU5      nSU;   a  [        R                  SUS    35        / $ UR                  S/ 5      $ )N)rq   r~   get_episodesrH   zGet episodes failed: episodesrt   )r   rd   r~   rk   rM   s        r   r   MemoryBridge.get_episodes   sU    .6ZV6fNN26'?2CDEIzz*b))r   c                 &    U R                  S0 5      $ )N
get_status)rb   )r   s    r   healthMemoryBridge.health   s    |R00r   )r   r   )genesis-kinanNrP   r-   )r   
   )__name__
__module____qualname____firstlineno____doc__MCP_ENDPOINTr[   r   rC   r   r   rb   r   rl   intr   rv   r|   r   r   __static_attributes__ r   r   r
   r
       s@   @'3 / / s  D:%C :%DcN :%tCQTH~ :%@ Y]=?	C 	3 	QT 		7:	DHcN	'C '3 'S 'Z^_cdgildl_mZn ''# ' 'SV '`deijmorjres`t '*S *# *W[\`adfiai\jWk *1S#X 1r   r
   )r   r.   urllib.requestr6   urllib.errorr2   loggingtypingr   r   r   r   	getLoggerr   rZ   r   r1   r0   r
   memoryr   r   r   <module>r      s\   "      , ,			8	$/.7C M1 M1b 
r   