
    ՘i4?                        U d 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 ddlmZmZ ddlmZ ddlmZ dd	lmZmZmZmZmZ dd
lmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%  ejL                  e'      Z( G d d      Z) G d d      Z*e G d d             Z+da,ee+   e-d<   de+fdZ.d.de/de0de/fdZ1de/de/fdZ2de/de/fdZ3de/fdZ4de/fdZ5de/de/fdZ6de/de/fd Z7de/fd!Z8de/fd"Z9de/fd#Z:d$ Z;	 	 d/d%ee/   d&ee/   fd'Z<de=fd(Z>e'd)k(  rs ej~                  ej                  *        eAej                        d+kD  r@ej                  d+   d,k(  r- e>       ZCeCj                         D ]  \  ZEZF eGeE d-eF         yyyy)0a   
Genesis V2 Native MCP Server
==============================
Core tool implementations for the Genesis MCP server.
Provides: KG tools, browser tools, identity, health check, configure.

Reconstructed from compiled bytecode (native_server.cpython-312.pyc).
    N)	dataclassfield)Path)DictListAnyOptional)create_adapter	KGAdapter)Identity)get_browser_controller)validate_urlsanitize_selectorvalidate_kg_search_inputvalidate_entity_jsoncheck_rate_limit)	antigravity_planantigravity_executegemini_query	sync_push	sync_pullsync_statusmemory_querymemory_storeantigravity_browserc                   t    e Zd ZdZdefdZedefd       Zedefd       Z	defdZ
ededd fd       Zd	 Zy
)Entityz6Wraps a KG entity dict to provide object-style access.datac                     || _         y N_data)selfr   s     5/mnt/e/genesis-system/genesis_v2/mcp/native_server.py__init__zEntity.__init__2   	    
    returnc                 :    | j                   j                  dd      S )Nid r"   getr#   s    r$   r*   z	Entity.id5   s    zz~~dB''r'   c                 :    | j                   j                  dd      S )Ntyper+   r,   r.   s    r$   r0   zEntity.type9   s    zz~~fb))r'   c                     | j                   S r    r!   r.   s    r$   to_dictzEntity.to_dict=   s    zzr'   c                      | |      S r     )clsr   s     r$   	from_dictzEntity.from_dict@   s    4yr'   c                 <    d| j                   d| j                  dS )Nz
Entity(id=z, type=))r*   r0   r.   s    r$   __repr__zEntity.__repr__D   s    DGG;gdii]!<<r'   N)__name__
__module____qualname____doc__dictr%   propertystrr*   r0   r2   classmethodr6   r9   r4   r'   r$   r   r   /   sz    @T  (C ( ( *c * *  T h  =r'   r   c                       e Zd ZdZdefdZd ZdefdZde	e
   fdZdde
d	ede	e   fd
Zde
dee   fdZdedefdZddede
fdZy)ExtendedKGAdapterz
    Extends the base KGAdapter with the richer API expected by native_server:
    connect(), count(), list_types(), get(), ingest(), get_context()
    basec                     || _         y r    )_base)r#   rD   s     r$   r%   zExtendedKGAdapter.__init__R   r&   r'   c                 f    | j                   j                  s| j                   j                          yy)z/Ensure KG data is loaded (connection analogue).N)rF   _loadedloadr.   s    r$   connectzExtendedKGAdapter.connectU   s"    zz!!JJOO "r'   r(   c                     | j                   j                  s| j                   j                          t        | j                   j                        S )zReturn total entity count.)rF   rH   rI   lenentitiesr.   s    r$   countzExtendedKGAdapter.countZ   s2    zz!!JJOO4::&&''r'   c           	          | j                   j                  s| j                   j                          t        | j                   j                  D ch c]  }|j                  dd       c}      S c c}w )z%Return list of distinct entity types.r0   unknown)rF   rH   rI   sortedrM   r-   )r#   es     r$   
list_typeszExtendedKGAdapter.list_types`   sK    zz!!JJOO9L9LMAquuVY/MNNMs   A.querylimitc                 v    | j                   j                  ||      }|D cg c]  }t        |       c}S c c}w )z!Search and return Entity objects.)rF   searchr   )r#   rT   rU   resultsrs        r$   rW   zExtendedKGAdapter.searchf   s0    **##E51#*+aq	+++s   6	entity_idc                     | j                   j                  s| j                   j                          | j                   j                  D ]#  }|j	                  d      |k(  st        |      c S  y)zGet entity by ID.r*   N)rF   rH   rI   rM   r-   r   )r#   rZ   rR   s      r$   r-   zExtendedKGAdapter.getk   sU    zz!!JJOO$$ 	!AuuT{i'ay 	! r'   entityc                    | j                   j                  s| j                   j                          t        | j                   j                        D ]L  \  }}|j                  d      |j                  k(  s%|j                         | j                   j                  |<    y | j                   j                  j                  |j                                y)z8Add entity to the in-memory KG (and optionally persist).r*   T)	rF   rH   rI   	enumeraterM   r-   r*   r2   append)r#   r\   irR   s       r$   ingestzExtendedKGAdapter.ingestt   s    zz!!JJOOdjj112 	DAquuT{fii')/)9

##A&	 	

""6>>#34r'   	max_charsc           
         | j                   j                  s| j                   j                          | j                         }| j	                         }d| dt        |       ddj                  |dd        }t        |      |kD  r|d| }|S )z5Return a summary string suitable for agent injection.zKnowledge Graph: z entities across z types.
Types: z, N   )rF   rH   rI   rN   rS   rL   join)r#   rb   totaltypessummarys        r$   get_contextzExtendedKGAdapter.get_context   s    zz!!JJOO

!%eW,=c%j\IYZ^ZcZcdijmkmdnZoYpqw<)#jy)Gr'   N
   )  )r:   r;   r<   r=   r   r%   rJ   intrN   r   r@   rS   r   rW   r	   r-   boolra   ri   r4   r'   r$   rC   rC   L   s    
Y 
(s (ODI O,C , ,T&\ ,
S Xf%5 
V 
 
	S 	C 	r'   rC   c                   j    e Zd ZU dZdZee   ed<   dZee	   ed<   e
	 	 d	dee   dee   dd fd       Zy)
ServerContextzn
    Immutable server context with all dependencies.
    Replaces global mutable state for thread safety.
    N
kg_adapteridentitykg_pathidentity_rules_pathr(   c                 d   d}|rNt        |      }t        |      }|j                          t        j	                  d|j                          d       nt        t              j                  j                  j                  dz  dz  }|j                         rVt        t        |            }t        |      }|j                          t        j	                  d|j                          d       t               }|j                          t        j	                  d|j                           | ||      S )	z,Factory method to create configured context.NzKG connected: z	 entitiesKNOWLEDGE_GRAPHzentities.jsonlzKG connected (default): zIdentity loaded: )rq   rr   )r
   rC   rJ   loggerinforN   r   __file__parentexistsr@   r   rI   name)r5   rs   rt   rq   rD   
default_kgrr   s          r$   createzServerContext.create   s     
!'*D*40J KK.)9)9);(<IFG h..55<<?PPSccJ  "%c*o6.t4
""$6z7G7G7I6J)TU:'78j8<<r'   NN)r:   r;   r<   r=   rq   r	   rC   __annotations__rr   r   rA   r@   r~   r4   r'   r$   rp   rp      sf     /3J*+2#'Hhx ' "&-1=#= &c]= 
	= =r'   rp   _contextr(   c                  B    t         t        j                         a t         S )z!Get or create the server context.)r   rp   r~   r4   r'   r$   _get_contextr      s      '')Or'   rT   rU   c           	         t        d      \  }}|st        j                  d|i      S t        | |      \  }}|st        j                  d|i      S t	               }|j
                  t        j                  ddi      S |j
                  j                  | |      }t        j                  | t        |      |D cg c]  }|j                          c}dd      S c c}w )z
    Search the knowledge graph for entities matching query.

    Args:
        query: Search query string
        limit: Maximum results to return (1-100)

    Returns:
        JSON string with matching entities
    	kg_searcherrorKnowledge graph not connected)rT   rN   rM      indent)	r   jsondumpsr   r   rq   rW   rL   r2   )rT   rU   allowedr   validctxrX   rR   s           r$   r   r      s     &k2NGUzz7E*+++E59LE5zz7E*++
.C
~~zz7$CDEEnn##E51G::#g,RY<ZQQYY[<Z[ <Zs   7CrZ   c                    t               }|j                  t        j                  ddi      S | rt	        | t
              st        j                  ddi      S |j                  j                  | j                               }|r%t        j                  |j                         d      S t        j                  dd|  i      S )z
    Get a specific entity by ID.

    Args:
        entity_id: The entity ID to retrieve

    Returns:
        JSON string with entity data or error
    r   r   z$entity_id must be a non-empty stringr   r   zEntity not found: )	r   rq   r   r   
isinstancer@   r-   stripr2   )rZ   r   r\   s      r$   kg_getr      s     .C
~~zz7$CDEEJy#6zz7$JKLL^^	 12Fzz&..*155::w"4YK @ABBr'   entity_jsonc                    t               }|j                  t        j                  ddi      S t	        |       \  }}}|st        j                  d|i      S 	 t
        j                  |      }|j                  j                  |      }t        j                  ||j                  d      S # t        $ r*}t        j                  dt        |      i      cY d}~S d}~ww xY w)z
    Add new entity to knowledge graph.

    Args:
        entity_json: JSON string with entity data (must have 'id' and 'type')

    Returns:
        Success/failure message
    Nr   r   )successrZ   )r   rq   r   r   r   r   r6   ra   r*   	Exceptionr@   )r   r   r   r   r   r\   r   rR   s           r$   	kg_ingestr      s     .C
~~zz7$CDEE-k:E5$zz7E*++-!!$'..''/zzgFIIFGG -zz7CF+,,-s   AB) )	C2CCCc                  f    t               } | j                  y| j                  j                  d      S )z
    Get knowledge graph context summary for agent injection.

    Returns:
        Summary string suitable for system instruction
    r   rl   )r   rq   ri   r   s    r$   
kg_contextr     s-     .C
~~.>>%%d++r'   c                      t               } | j                  t        j                  ddi      S t        j                  d| j                  j	                         | j                  j                         dd      S )z`
    Get knowledge graph statistics.

    Returns:
        JSON with entity count and types
    r   r   T)	connectedentity_countentity_typesr   r   )r   rq   r   r   rN   rS   r   s    r$   kg_statsr   #  sh     .C
~~zz7$CDEE::NN002NN557	

  r'   urlc                    t        |       \  }}|st        j                  d|d      S t               }t	        j
                         }t	        j                  |       	 |j                  |j                  |             }t        j                  |j                  | |j                  d      |j                          S # |j                          w xY w)z
    Navigate browser to URL.

    Args:
        url: Target URL (must be http/https)

    Returns:
        Navigation result
    Fr   r   )r   r   r   )r   r   r   r   asyncionew_event_loopset_event_looprun_until_completenavigater   r   close)r   r   r   
controllerloopresults         r$   browser_navigater   ;  s      $LE5zzee<==')J!!#D4 (()<)<S)ABzzfnnS&++VW



   AB: :Cselectorc                    t        |       \  }}|rt        j                  d|d      S t               }t	        j
                         }t	        j                  |       	 |j                  |j                  |            }t        j                  |j                  ||j                  d      |j                          S # |j                          w xY w)z
    Click element by CSS selector.

    Args:
        selector: CSS selector (sanitized)

    Returns:
        Click result
    Fr   )r   r   r   )r   r   r   r   r   r   r   r   clickr   r   r   )r   clean_selectorr   r   r   r   s         r$   browser_clickr   S  s     .h7NEzzee<==')J!!#D4 (()9)9.)IJzzfnn.Z`ZeZefg



r   c                  J   t               } t        j                         }t        j                  |       	 |j	                  | j                               }t        j                  |j                  |j                  d      |j                          S # |j                          w xY w)zj
    Capture browser screenshot.

    Returns:
        Screenshot metadata (base64 data if available)
    )r   r   )r   r   r   r   r   
screenshotr   r   r   r   r   )r   r   r   s      r$   browser_screenshotr   k  sr     ()J!!#D4 (()>)>)@AzzfnnfkkJK



s   A
B B"c                  6   t               } | j                  }|t               }|j                          d}|j                  r6t        |j                        dkD  r|j                  dd dz   n|j                  }t        j                  |j                  |dd      S )zu
    Get agent identity and persona information.

    Returns:
        Identity JSON with persona name and rules
    Ni  z...)personarules_previewr   r   )	r   rr   r   rI   r   rL   r   r   r|   )r   rr   r   s      r$   get_identityr     s     .C||H:M:=h>N>N:ORU:U((#.6[c[k[k::}}*	
  r'   c                     t               } di d}	 | j                  r&| j                  j                         }d|d|d   d<   n
ddi|d   d<   	 | j
                  rL| j
                  j                  s| j
                  j                  r d| j
                  j                  d|d   d<   n
ddi|d   d<   	 t               }ddd|d   d<   t        j                  |d      S # t        $ r#}dt	        |      d	|d   d<   d
|d<   Y d}~d}~ww xY w# t        $ r#}dt	        |      d	|d   d<   d
|d<   Y d}~d}~ww xY w# t        $ r#}dt	        |      d	|d   d<   d
|d<   Y d}~d}~ww xY w)ze
    Check server health status.

    Returns:
        JSON with health status of all components
    healthy)status
components)r   r   r   knowledge_graphr   not_configured	unhealthy)r   r   degradedN)r   r   rr   stub)r   modebrowserr   r   )r   rq   rN   r   r@   rr   r   r|   r   r   r   )r   checksrN   rR   r   s        r$   health_checkr     s    .C!4F&>>NN((*EAJ\a6bF< !237?AQ6RF< !23&<<S\\11S\\5F5F:CPSP\P\PaPa/bF< ,08:J/KF< ,&+-
5>*O|Y'
 ::fQ''-  &=HSVWXSY2Z|./%x&  &6ACPQF+S|Z(%x&  &5@3q6*R|Y'%x&sH   <C A"D 1D; 	D	&DD		D8D33D8;	E'E""E'c                  X   	 ddl m}  ddlm}m}  | t
               | t               | t               | t               | t               | t               | t               | t               | t               | t               | t               | t                | t"               | t$               | t&               | t(               | t*               | t,               | t.               | |       | |      gS # t0        $ r t2        j5                  d       g cY S w xY w)z#Get all tools as ADK FunctionTools.r   )FunctionTool)adk_execute_browser_actionadk_extract_page_content)funcuA   google.adk not available — get_mcp_tools() returning empty list)google.adk.toolsr    genesis_v2.core.adk_orchestratorr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ImportErrorrw   warning)r   r   r   s      r$   get_mcp_toolsr     s    1ii(f%i(j)h'./m,01l+l+./12l+i(i(k*l+l+128967+
 	
.  Z[	s   DD  D)(D)rs   rt   c                 0    t         j                  | |      ay)z
    Configure the MCP server with knowledge graph and identity.

    Args:
        kg_path: Path to knowledge graph (JSONL file)
        identity_rules_path: Path to identity rules file
    N)rp   r~   r   )rs   rt   s     r$   	configurer     s     ##G-@AHr'   c                  X   t                t               } t               }d| j                  du| j                  r| j                  j	                         nd| j
                  r| j
                  j                  nd|D cg c]  }|j                  j                   c}t        |      dS c c}w )z Test server without starting it.readyNr   )r   kg_connectedkg_entitiesrr   tools
tool_count)
r   r   r   rq   rN   rr   r|   r   r:   rL   )r   r   ts      r$   test_serverr     s}    K
.COEd214s~~++-Q),CLL%%4+01a!&&//1%j 
 2s   ;B'__main__)level   testz: rj   r   )Hr=   r   r   loggingsysdataclassesr   r   pathlibr   typingr   r   r   r	   genesis_v2.core.kg_adapterr
   r   genesis_v2.core.identityr   genesis_v2.core.browserr   genesis_v2.mcp.validationr   r   r   r   r    genesis_v2.mcp.antigravity_toolsr   r   r   r   r   r   r   r   r   	getLoggerr:   rw   r   rC   rp   r   r   r   r@   rm   r   r   r   r   r   r   r   r   r   r   r   r   r>   r   basicConfigINFOrL   argvr   itemskeyvalueprintr4   r'   r$   <module>r      s      
 (  , , @ - : 
 
 
 
		8	$= =:= =H #= #= #=N %)(=
! (m S  c <Cc Cc C.-3 -3 -4
,C 
,# 0# # 0C C 0C *c 4'(c '(\D ")-Bc]B!#BT & zGgll+
388}qSXXa[F2 ,,. 	%JCSEE7#$	% 3 r'   