
    툘iC              	          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 ddlm	Z	 ddl
mZmZmZ ddlmZ  ej                   e      Z e	d      Zedz  Zed	z  Zed
z  Zedz  Zedz  Zdadadad ZdefdZdefdZde de defdZ!d Z"d Z#d Z$dee    fdZ%d,de de de fdZ&de de fdZ'd-de d e d!e(de fd"Z)de de fd#Z*de fd$Z+de fd%Z,d&e de fd'Z-d(e de fd)Z.d*e de fd+Z/y).u  
Antigravity Tools — Genesis V2 MCP
====================================
Cross-agent sync tools: Claude <-> Antigravity (Gemini) coordination.
File-locked state, JSONL event log, workflow dispatch, memory bridge.

Tools:
- antigravity_plan: Create workflow plan via Gemini
- antigravity_execute: Execute a plan
- gemini_query: Direct Gemini query
- sync_push / sync_pull / sync_status: Shared state sync
- memory_query / memory_store: Memory bridge
- antigravity_browser: Superior browser delegation
    N)datetimetimezone)Path)AnyDictOptional)check_rate_limitz+/mnt/e/genesis-system/data/antigravity-syncz
state.jsonzevents.jsonlplans
executionscontextc                     t         t        t        t        fD ]  } | j	                  dd        t
        j                         st
        j                          t        j                         s\t        j                  t        j                  t        j                  t        j                        j!                         ddd             yy)z-Create sync directory structure on first use.Tparentsexist_okr   N
created_at
sync_countactive_plan)SYNC_DIR	PLANS_DIREXECUTIONS_DIRCONTEXT_DIRmkdirEVENTS_FILEexiststouch
STATE_FILE
write_textjsondumpsr   nowr   utc	isoformat)ds    9/mnt/e/genesis-system/genesis_v2/mcp/antigravity_tools.py_ensure_sync_dirsr&   /   s    	>;? -	t,- djj",,x||4>>@*
  	     returnc                     t                	 t        t        d      5 } t        j                  | t        j
                         	 t        j                  |       }t        j                  |        	 ddd       |S # t        j                  |        w xY w# 1 sw Y   S xY w# t        j                  t        f$ r8 t        j                  t        j                        j                         dddcY S w xY w)z5Read current shared state with advisory file locking.rNr   r   )r&   openr   portalockerlockLOCK_SHr   loadunlockJSONDecodeErrorFileNotFoundErrorr   r!   r   r"   r#   )fdatas     r%   _read_stater5   ?   s    
*c" 	&aQ 3 34&yy|""1%	&  ""1%	&   "34 
",,x||4>>@
 	

sG   B %BA7B-	B 7BBBB B AC/.C/statec                    t                t        j                  t        j                        j                         | d<   t        t        d      5 }t        j                  |t        j                         	 t        j                  | |dt               t        j                  |       	 ddd       y# t        j                  |       w xY w# 1 sw Y   yxY w)z@Write state with advisory file locking (read-modify-write safe).last_updatedw   indentdefaultN)r&   r   r!   r   r"   r#   r+   r   r,   r-   LOCK_EXr   dumpstrr0   )r6   r3   s     r%   _write_staterA   R   s    $LL6@@BE.	j#	 "!K//0	"IIeQq#6q!" "
 q!" "s$   %C5B1C1CCCsource
event_typer4   c                    t                t        j                  t        j                        j                         | ||d}t        t        d      5 }t        j                  |t        j                         	 |j                  t        j                  |      dz          t        j                  |       	 ddd       y# t        j                  |       w xY w# 1 sw Y   yxY w)z7Append event to JSONL log (safe for concurrent writes).)	timestamprB   typer4   a
N)r&   r   r!   r   r"   r#   r+   r   r,   r-   r>   writer   r    r0   )rB   rC   r4   eventr3   s        r%   _append_eventrK   ^   s    \\(,,/99;	E 
k3	 "1K//0	"GGDJJu%,-q!" "
 q!" "s$   %C7'B=C=CCC c                      t         4	 t        j                  j                  dd       ddlm}   |        a t         S t         S # t        $ r'}t        j                  d|        Y d}~t         S d}~ww xY w)z Lazy import AntigravityWorkflow.Nr   /mnt/e/genesis-system)AntigravityWorkflowz#AntigravityWorkflow not available: )		_workflowsyspathinsertcore.antigravity_workflowrN   ImportErrorloggerwarning)rN   es     r%   _get_workflowrX   o   sl     	FHHOOA67E+-I 9  	FNN@DEE	F   -A 	A1
A,,A1c                      t         4	 t        j                  j                  dd       ddlm}   |        a t         S t         S # t        $ r'}t        j                  d|        Y d}~t         S d}~ww xY w)zLazy import MemoryBridge.Nr   rM   )MemoryBridgezMemoryBridge not available: )	_memory_bridgerP   rQ   rR   core.memory_bridger[   rT   rU   rV   )r[   rW   s     r%   _get_memory_bridger^   |   sh     	?HHOOA677)^N >  	?NN9!=>>	?rY   c                      t         4	 t        j                  j                  dd       ddlm}   |        a t         S t         S # t        $ r'}t        j                  d|        Y d}~t         S d}~ww xY w)zLazy import GeminiClient.Nr   rM   )GeminiExecutorzGeminiClient not available: )	_gemini_clientrP   rQ   rR   core.gemini_executorr`   rT   rU   rV   )GeminiClientrW   s     r%   _get_gemini_clientrd      sh     	?HHOOA67K)^N >  	?NN9!=>>	?rY   c                      t         j                  j                  d      xs t         j                  j                  d      } | syy)zCCheck if GEMINI_API_KEY is available. Returns error string or None.GEMINI_API_KEYGOOGLE_API_KEYz;GEMINI_API_KEY not set. Configure it in config/secrets.env.N)osenvironget)keys    r%   _check_gemini_api_keyrl      s1    
**..)
*
Nbjjnn=M.NCLr'   goalcontext_jsonc                    t        d      \  }}|st        j                  d|i      S | rt        | t              st        j                  ddi      S t               }|rt        j                  d|i      S t               }|t        j                  ddi      S 	 t        j                  |      }	 |j                  | |      }t        |d      r|j                  nt	        t        |             }t        |d      r|j                  n"t        |d	      r|j                  n
t	        |      }	t        |	t        t         f      st	        |	      }	|| |	t#        j$                  t&        j(                        j+                         d
d}
t-                t.        | dz  }|j1                  t        j                  |
dt                     t3               }||d<   t5        |       t7        dd|| dd d       t        j                  |
dt              S # t        j                  $ r t        j                  ddi      cY S w xY w# t8        $ rB}t:        j=                  d|        t        j                  dt	        |      i      cY d}~S d}~ww xY w)z
    Create a workflow plan via Gemini Antigravity system.

    Args:
        goal: The goal to plan for
        context_json: Optional JSON context for planning

    Returns:
        JSON string with plan details or error
    antigravity_planerrorzgoal must be a non-empty stringN1AntigravityWorkflow not available. Check imports.zInvalid context_jsonplan_idsteps__dict__planned)rs   rm   rt   r   status.jsonr:   r;   r   claude_codeplan_created   )rs   rm   zantigravity_plan error: )r	   r   r    
isinstancer@   rl   rX   loadsr1   create_planhasattrrs   hashrt   ru   listdictr   r!   r   r"   r#   r&   r   r   r5   rA   rK   	ExceptionrU   rq   )rm   rn   allowedrq   	api_errorworkflowr   planrs   rt   	plan_data	plan_filer6   rW   s                 r%   rp   rp      s*    &&89NGUzz7E*++z$,zz7$EFGG%'Izz7I.//Hzz7$WXYY=**\* -##D'2")$	":$,,DJ%dG4

GTXZdLe4==knoskt%$.JE ",,x||4>>@
	 	7)5 11	TZZ	!SIJ &mUm^RVW[X[R\5]^zz)As;;?  =zz7$:;<<=B  -/s34zz7CF+,,-s1   H	 .EH9 	*H65H69	J7I?9J?Jrs   c                 R   t        d      \  }}|st        j                  d|i      S | rt        | t              st        j                  ddi      S t               }|rt        j                  d|i      S t               }|t        j                  ddi      S t                t        |  dz  }|j                         st        j                  dd|  i      S 	 t        j                  |j                               }|j                  |      }t        j                  t        j                         }t        |t"        t$        f      r|n
t	        |      }	| |	|j'                         dd	}
t(        |  d
|j+                  d       dz  }|j-                  t        j                  |
dt                     t/        ddd| i       t        j                  |
dt              S # t0        $ rB}t2        j5                  d|        t        j                  dt	        |      i      cY d}~S d}~ww xY w)z
    Execute a previously created workflow plan.

    Args:
        plan_id: ID of the plan to execute

    Returns:
        JSON string with execution results or error
    antigravity_executerq   z"plan_id must be a non-empty stringNrr   rx   zPlan not found: 	completed)rs   resultexecuted_atrw   _z%Y%m%d_%H%M%Sr:   r;   ry   plan_executedrs   zantigravity_execute error: )r	   r   r    r|   r@   rl   rX   r&   r   r   r}   	read_textexecute_planr   r!   r   r"   r   r   r#   r   strftimer   rK   r   rU   rq   )rs   r   rq   r   r   r   r   r   exec_tsresult_value	exec_data	exec_filerW   s                r%   r   r      s    &&;<NGUzz7E*++*Wc2zz7$HIJJ%'Izz7I.//Hzz7$WXYYwiu--Izz7&6wi$@ABB-JJy2245	&&y1,,x||,!+FT4L!Avs6{ "",,.!	
	 #y'2B2B?2S1TTY%ZZ	TZZ	!SIJm_y'6JKzz)As;; -21#67zz7CF+,,-s   DG 	H&$7H!H&!H&prompt	task_typetemperaturec                    t        d      \  }}|st        j                  d|i      S | rt        | t              st        j                  ddi      S t               }|rt        j                  d|i      S t               }|t        j                  ddi      S 	 |j                  | ||      }t        |t        t        f      r|ndt	        |      i}t        dd|t        |       d	       t        j                  |d
t              S # t        $ rB}	t        j                  d|	        t        j                  dt	        |	      i      cY d}	~	S d}	~	ww xY w)a?  
    Direct Gemini execution for analysis, planning, or generation.

    Args:
        prompt: The prompt to send to Gemini
        task_type: Type of task (general, analysis, planning, code_review)
        temperature: Sampling temperature (0.0-1.0)

    Returns:
        JSON string with Gemini response or error
    gemini_queryrq   z!prompt must be a non-empty stringNz*GeminiClient not available. Check imports.)r   r   responsery   )r   
prompt_lenr:   r;   zgemini_query error: )r	   r   r    r|   r@   rl   rd   queryr   r   rK   lenr   rU   rq   )
r   r   r   r   rq   r   clientr   r   rW   s
             r%   r   r     s+    &n5NGUzz7E*++FC0zz7$GHII%'Izz7I.//!F~zz7$PQRR-<<)<U'4,?jRUV^R_E`m^9\_`f\g5hizz&C88 -+A3/0zz7CF+,,-s   A-D 	E7EEEc           	         t        d      \  }}|st        j                  d|i      S | rt        | t              st        j                  ddi      S 	 t        j
                  |       }	 t               }|j                  di        |d   j                  |       |j                  dd      d	z   |d<   t        |       t        d
ddt        |j                               i       t        j                  d|d   d      S # t        j                  $ r$}t        j                  dd| i      cY d}~S d}~ww xY w# t        $ rB}t         j#                  d|        t        j                  dt	        |      i      cY d}~S d}~ww xY w)z
    Push context to shared state for cross-agent sync.

    Args:
        context_json: JSON string with context data to push

    Returns:
        JSON string with sync result
    	sync_pushrq   z'context_json must be a non-empty stringInvalid JSON: Nclaude_contextr   r      ry   keysT)successr   zsync_push error: )r	   r   r    r|   r@   r}   r1   r5   
setdefaultupdaterj   rA   rK   r   r   r   rU   rq   )rn   r   rq   r   rW   r6   s         r%   r   r   A  sU    &k2NGUzz7E*++z,<zz7$MNOO;**\*
-)2.&&w/#iia81<lUm[64;O2PQzzd%:MNOO  ;zz7nQC$89::;  -(,-zz7CF+,,-s=   C< (BD6 <D3D.(D3.D36	F?7E<6F<Fc                  \   t        d      \  } }| st        j                  d|i      S 	 t               }g }t        j                         r_t        j                         j                         j                         }|dd D ]'  }	 |j                  t        j                  |             ) t        j                  ||ddt              S # t        j                  $ r Y ^w xY w# t        $ rB}t        j                  d|        t        j                  dt        |      i      cY d}~S d}~ww xY w)	zt
    Pull latest shared state for cross-agent sync.

    Returns:
        JSON string with current shared state
    	sync_pullrq   iN)r6   recent_eventsr:   r;   zsync_pull error: )r	   r   r    r5   r   r   r   strip
splitlinesappendr}   r1   r@   r   rU   rq   )r   rq   r6   r   lineslinerW   s          r%   r   r   d  s    &k2NGUzz7E*++- ))+113>>@Ecd !((D)9: zz*
 S" 	" ++   -(,-zz7CF+,,-sB   AC  $C& C  CC  CC   	D+)7D& D+&D+c                  j   t        d      \  } }| st        j                  d|i      S 	 t                t	               }d}t
        j                         r@t        d t
        j                         j                         j                         D              }t        j                         r't        t        t        j                  d                  nd}t        j                         r't        t        t        j                  d                  nd}t        j                  |j!                  dd      |j!                  d      ||||j!                  d      t#        t$              d	d
      S # t&        $ rB}t(        j+                  d|        t        j                  dt#        |      i      cY d}~S d}~ww xY w)zn
    Get sync health and component status.

    Returns:
        JSON string with sync health information
    sync_statusrq   r   c              3   B   K   | ]  }|j                         sd   yw)r   N)r   ).0r   s     r%   	<genexpr>zsync_status.<locals>.<genexpr>  s     cAYZY`Y`Ybacs   z*.jsonr   r   r8   )r   r   event_count
plan_countexecution_countr8   sync_dirr:   r<   zsync_status error: N)r	   r   r    r&   r5   r   r   sumr   r   r   r   r   r   globr   rj   r@   r   r   rU   rq   )r   rq   r6   r   r   
exec_countrW   s          r%   r   r     sT    &m4NGUzz7E*++-c)>)>)@)F)F)H)S)S)UccK<E<L<L<NSinnX678TU
AOAVAVAXSn11(;<=^_
zz))L!4 99]3&$)!IIn5H
  	  -*1#./zz7CF+,,-s   D=E' '	F207F-'F2-F2r   c                 *   t        d      \  }}|st        j                  d|i      S | rt        | t              st        j                  ddi      S t               }|t        j                  ddi      S 	 |j                  |       }t        |t        t        f      r|ndt	        |      i}t        j                  |dt              S # t        $ rB}t        j                  d	|        t        j                  dt	        |      i      cY d}~S d}~ww xY w)
z
    Query memory bridge with Gemini context for enriched responses.

    Args:
        query: The query to search memory for

    Returns:
        JSON string with memory-enriched response or error
    memory_queryrq   z query must be a non-empty stringN*MemoryBridge not available. Check imports.r   r:   r;   zmemory_query error: )r	   r   r    r|   r@   r^   r   r   r   r   rU   rq   )r   r   rq   bridger   r   rW   s          r%   r   r     s     &n5NGUzz7E*++
5#.zz7$FGHH!F~zz7$PQRR-e$!+FT4L!Av
TWX^T_G`zz,q#>> -+A3/0zz7CF+,,-s   5AC 	D7DDDinsight_jsonc                    t        d      \  }}|st        j                  d|i      S | rt        | t              st        j                  ddi      S 	 t        j
                  |       }d|vrt        j                  ddi      S t               }|t        j                  ddi      S 	 |j                  |      }t        |t        t        f      r|nd	t	        |      d
}t        j                  |dt              S # t        j                  $ r$}t        j                  dd| i      cY d}~S d}~ww xY w# t        $ rB}t        j                  d|        t        j                  dt	        |      i      cY d}~S d}~ww xY w)z
    Store an insight in the memory bridge for persistent context.

    Args:
        insight_json: JSON string with insight data (needs 'content' and 'category')

    Returns:
        JSON string with store result or error
    memory_storerq   z'insight_json must be a non-empty stringr   Ncontentz&insight_json must have 'content' fieldr   T)r   r   r:   r;   zmemory_store error: )r	   r   r    r|   r@   r}   r1   r^   storer   r   r   rU   rq   )r   r   rq   insightrW   r   r   r   s           r%   r   r     sU    &n5NGUzz7E*++z,<zz7$MNOO;**\* zz7$LMNN!F~zz7$PQRR-g&!+FT4L!AvSWcfgmcnGozz,q#>>  ;zz7nQC$89::;  -+A3/0zz7CF+,,-s=   C9 &AD3 9D0D+%D0+D03	E><7E93E>9E>taskc                 (   t        d      \  }}|st        j                  d|i      S | rt        | t              st        j                  ddi      S 	 t                dt        t        j                  t        j                        j                                }t        dz  }|j                  dd       || dz  }|| t        j                  t        j                        j                         d	d
d}|j                  t        j                  |d             t!        d
d|| dd d       t        j                  d|dd      S # t"        $ rB}t$        j'                  d|        t        j                  dt	        |      i      cY d}~S d}~ww xY w)z
    Execute a browser task via the Antigravity Master Browser Engine (High Stealth).
    
    Args:
        task: Description of the browser task to perform.
        
    Returns:
        JSON string with task status and delegation ID.
    antigravity_browserrq   ztask must be a non-empty stringbrw_browser_requestsTr   rx   pendinggenesis_agent)idr   rE   rw   rB   r:   r   browser_delegatedNd   )
request_idr   	delegatedzDTask sent to Antigravity Master Browser. Check status in 30 seconds.)rw   r   messagezantigravity_browser error: )r	   r   r    r|   r@   r&   intr   r!   r   r"   rE   r   r   r#   r   rK   r   rU   rq   )r   r   rq   r   req_dirreq_filereq_datarW   s           r%   r   r     sj    &&;<NGUzz7E*++z$,zz7$EFGG-CX\\ : D D FGHI
//dT2
|511!hll3==?%
 	DJJx:;o'::_cdheh_i<jkzz!$]
  	
  -21#67zz7CF+,,-s   C3E 	F7FFF)z{})generalgffffff?)0__doc__r   loggingrh   rP   r,   r   r   pathlibr   typingr   r   r   genesis_v2.mcp.validationr	   	getLogger__name__rU   r   r   r   r   r   r   rO   r\   ra   r&   r   r5   rA   r@   rK   rX   r^   rd   rl   rp   r   floatr   r   r   r   r   r   r    r'   r%   <module>r      s     	 
  '  & & 6			8	$ =>$
'w	L(" 	 
T 
&	" 	""# "3 "d ""


x} ?-3 ?-c ?-S ?-D5- 5- 5-p"- "- "-u "-WZ "-J -C  -C  -F-3 -B!-S !-H- - -<#-s #-s #-L+-c +-c +-r'   