
    Äi                         d 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	m
Z
mZ  ej                  e      ZdZdddZdZ G d	 d
      Z e       Zy)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                      e Zd ZdZefdefdZdefdZdedeee	f   deee	f   fdZ
	 	 dd
ededee   dededeee	f   fdZddedededeeee	f      fdZddedededeeee	f      fdZddededeeee	f      fdZdeee	f   fdZy	)MemoryBridgez6MCP client for the sovereign Graphiti memory endpoint.endpointc                      || _         d | _        y )N)r   _session_id)selfr   s     6/mnt/e/genesis-system/genesis_v2/core/memory_bridge.py__init__zMemoryBridge.__init__#   s     *.    returnc           	      >   t        j                  ddt        i t        ddt	        j
                         j                  dd  d      j                  d      }t        j                  j                  | j                  |d	d
dd      }t        j                  j                  |d      5 }|j                  j                  dd      }|s9|j                  j                         D ]  \  }}|j!                         dk(  s|} n || _        |cddd       S # 1 sw Y   yxY w)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_sessionzMemoryBridge._init_session'   s   **"#3 ")
 $**,**2A./0	
 	 6'? 	 nn$$MM 2?  % 
 ^^##C#4 		))*:B?J%)\\%7%7%9 MFE||~)99%*

  *D		 		 		s   )AD<DD	tool_name	argumentsc           
         | j                         }|sddiS t        j                  dd||d| dt        j                         j
                  dd  d	      j                  d
      }t        j                  j                  | j                  |dd|dd      }	 t        j                  j                  |d      5 }|j                         j                  d
      }|j                  d      r|j                  d      D ]  }|j                  d      st        j                   |dd       }	|	j#                  di       }
|
j#                  d      r=d}|
j#                  dg       D ]  }||j#                  dd      z  } d|ic cddd       S |
j#                  d      }|r|c cddd       S |
j#                  dg       D ]6  }|j#                  dd      }	 t        j                   |      c c cddd       S  |
c cddd       S  nt        j                   |      cddd       S 	 ddd       y# t        j$                  $ r d|icY c c cddd       S w xY w# 1 sw Y   yxY w# t        j&                  j(                  $ r/}t*        j'                  d|        dt-        |      icY d}~S d}~wt.        $ r/}t*        j'                  d|        dt-        |      icY d}~S d}~ww xY w)z.Call an MCP tool with proper session handling.errorz Failed to initialize MCP sessionr   z
tools/call)r   rC   -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: )rA   r,   r-   r0   r1   r2   r3   r4   r5   r6   r   r7   readdecode
startswithsplitloadsr8   JSONDecodeErrorrE   URLErrorloggerstr	Exception)r   rB   rC   r>   r;   r<   r=   bodyliner&   rJ   
error_textrL   
structuredrM   es                   r   
_call_toolzMemoryBridge._call_toolI   s   '')
?@@**"!& Kq!1!1"1!5 67
  6'? 	 nn$$MM 2?",
  % 	
	%''S'9 ,Tyy{))'2??8, $

4 0 *??84#'::d12h#7D%)XXh%;F%zz)4-/
/5zz)R/H !JG$.'++fb2I$IJ!J(/'< <, , *04G)HJ)'1 1, , ,2::i+D ='.{{62'>!=+/::d+;$;%, ,= $*M+, ,*(  ::d+/, ,*, ,& (,';'; !=,5t+<$<), ,&!=', ,0 ||$$ 	%LL,QC01SV$$ 	%LL+A3/0SV$$	%s   !I# :AIA.I	I# I!	I# +'IH-'I+	I# 5I9	I# I	I# $I# -I	I		I# I	II I#  I# #K% $J*$K%*K%6$K K% K%NrL   group_idr   sourcesource_descriptionc                     |s$dt        j                         j                  d d  }||||d}|r||d<   | j                  d|      }t        j                  d| d|        |S )NzMemory-r   )r   episode_bodyr`   ra   rb   
add_memoryzMemory saved: z -> )r0   r1   r2   r_   rW   info)r   rL   r`   r   ra   rb   argsrJ   s           r   savezMemoryBridge.save   sq    TZZ\--bq123D(,gS[gmn);D%&t4nTF$vh78r   query	max_nodesc                     ||g|d}| j                  d|      }d|v rt        j                  d|d           g S |j                  dg       S )N)ri   	group_idsrj   search_nodesrE   zSearch failed: nodesr_   rW   warningr8   )r   ri   r`   rj   rg   rJ   s         r   searchzMemoryBridge.search   sW    ).hZV_`6fNN_VG_,=>?Izz'2&&r   	max_factsc                     ||g|d}| j                  d|      }d|v rt        j                  d|d           g S |j                  dg       S )N)ri   rl   rr   search_memory_factsrE   zFact search failed: factsro   )r   ri   r`   rr   rg   rJ   s         r   search_factszMemoryBridge.search_facts   sY    ).hZV_`!6=fNN1&/1BCDIzz'2&&r   max_episodesc                     |g|d}| j                  d|      }d|v rt        j                  d|d           g S |j                  dg       S )N)rl   rw   get_episodesrE   zGet episodes failed: episodesro   )r   r`   rw   rg   rJ   s        r   ry   zMemoryBridge.get_episodes   sU    .6ZV6fNN26'?2CDEIzz*b))r   c                 &    | j                  di       S )N
get_status)r_   )r   s    r   healthzMemoryBridge.health   s    |R00r   )genesis-kinanNrM   r+   )r~   
   )__name__
__module____qualname____doc__MCP_ENDPOINTrX   r   rA   r   r   r_   r   rh   intr   rq   rv   ry   r}    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.requestr4   urllib.errorr0   loggingtypingr   r   r   r   	getLoggerr   rW   r   r/   r.   r
   memoryr   r   r   <module>r      s^   "      , ,			8	$/.7C M1 M1b 
r   