
    #/i%                        d Z ddlZddlZddlZddlZddlmZ ddlmZ ddlm	Z	  ej                  e      Z e	d      Zedz  Zedz  Zdad	 Zd
edefdZded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fdZdefdZy)a  
Execution Bridge MCP Tools
============================
Live execution bridge: Claude decomposes tasks, dispatches to Gemini swarm,
gets results back. Bridges MCP protocol to GenesisExecutionLayer.

Tools:
- exec_decompose: Break task into RWL stories
- exec_story: Execute single story via Gemini
- exec_swarm: Parallel execution of multiple stories
- exec_status: Rate maximizer utilization + execution stats
    N)asdict)datetime)Pathz+/mnt/e/genesis-system/data/antigravity-synczevents.jsonl
executionsc                      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 load GenesisExecutionLayer.Nr   z/mnt/e/genesis-system)get_execution_layerz#GenesisExecutionLayer unavailable: )	_execution_layersyspathinsertcore.genesis_execution_layerr   	Exceptionloggererror)r   es     >/mnt/e/genesis-system/genesis_v2/mcp/execution_bridge_tools.py_get_execution_layerr   !   sn     	DHHOOA67H24   	DLL>qcBCC	Ds   -A 	A1
A,,A1
event_typedatac                    	 t        j                         j                         d| |d}t        j                  j                  dd       t        t        d      5 }|j                  t        j                  |      dz          ddd       y# 1 sw Y   yxY w# t        $ r"}t        j                  d|        Y d}~yd}~ww xY w)	zAppend event to events.jsonl.execution_bridge)	timestampsourcetyper   Tparentsexist_oka
NzFailed to log event: )r   utcnow	isoformatEVENTS_FILEparentmkdiropenwritejsondumpsr   r   r   )r   r   eventfr   s        r   
_log_eventr+   .   s    2!*446(	
 	   =+s# 	.qGGDJJu%,-	. 	. 	. 2,QC0112s6   AB (BB BB B 	C B==Cexecution_idc                 $   	 t         j                  dd       t         |  dz  }t        |d      5 }t        j                  ||dt
               ddd       y# 1 sw Y   yxY w# t        $ r"}t        j                  d|        Y d}~yd}~ww xY w)	zSave execution result to file.Tr   z.jsonw   )indentdefaultNzFailed to save execution: )	EXECUTIONS_DIRr$   r%   r'   dumpstrr   r   r   )r,   r   filepathr*   r   s        r   _save_executionr6   >   s    7TD9!|nE$::(C  	6AIIdAa5	6 	6 	6 71!5667s4   /A$ AA$ A!A$ !A$ $	B-B

Btaskcontextreturnc           	      L   t               }|s&t        j                  dd| dd | dddgdd	gd
      S 	 |j                  | |      }g }|D ]K  }|j	                  |j
                  |j                  |j                  |j                  |j                  d	       M t        d| dd t        |      d       t        j                  |t        |      | dd d      S # t        $ rB}t        j                  d|        t        j                  dt        |      i      cY d}~S d}~ww xY w)a  
    Break a task into RWL stories using Gemini.

    Args:
        task: Task description to decompose
        context: Optional context for the decomposition

    Returns:
        JSON array of stories with id, title, description, acceptance_criteria, priority
    #GenesisExecutionLayer not available	STORY-001Nd   zTask completedmanual)descriptionverification   idtitler?   acceptance_criteriapriority)r   fallbackdecomposition   )r7   stories_count)storiescountr7   zDecomposition failed: r   )r   r'   r(   decompose_to_storiesappendrC   rD   r?   rE   rF   r+   lenr   r   r   r4   )r7   r8   layerrK   stories_datasr   s          r   exec_decomposerS   I   s?    !"Ezz:!ds#8HZb(c'd 	
 	 		-,,T7; 	Add }}'('<'<JJ! 	 	?#J .%
 	
 zz#&#J
  	  --aS12zz7CF+,,-s   B#C 	D#!7DD#D#
story_jsonc           
         	 t        j                  |       }t	               }|st        j                  ddi      S 	 ddlm}  ||j                  dd      |j                  d	d
      |j                  dd
      |j                  dg       |j                  dd            }|j                  |      }|j                  |j                  |j                  |j                  |j                  |j                  |j                  d}d|j                   dt!        j"                         j%                  d       }t'        ||       t)        d|j                  |j                  |j                  d       t        j                  |      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)a  
    Execute a single RWL story via Gemini.

    Args:
        story_json: JSON with story fields: id, title, description,
                    acceptance_criteria, priority

    Returns:
        JSON with execution result including passes, result, iterations
    r   Invalid JSON: Nr;   r   StoryrC   r<   rD    r?   rE   rF      rB   )rC   rD   passes
iterationsresultr   completed_atstory__%Y%m%d_%H%M%Sstory_executed)story_idr[   r\   zStory execution failed: )r'   loadsJSONDecodeErrorr(   r   r   rX   getexecute_storyrC   rD   r[   r\   r]   r   r^   r   r    strftimer6   r+   r   r   r4   )	rT   
story_datar   rP   rX   storyexecutedr]   r,   s	            r   
exec_storyrl   ~   s   ;ZZ
+
 !"Ezz7$IJKK#-6~~dK0.."-"}b9 */Db I^^J2
 &&u- ++^^oo"--oo^^$11
  }Ahoo.?.H.H.Y-Z[f-# oo"--&
 	 zz&!!M  ;zz7nQC$89::;P  -/s34zz7CF+,,-s;   F EF; F8F3-F83F8;	H7H;HHstories_jsonmax_parallelc                 l   	 t        j                  |       }t        |t              st        j                  ddi      S 	 t               }|st        j                  ddi      S 	 ddlm} t        |      D cg c]i  \  }} ||j                  dd	|d
z   d      |j                  dd      |j                  dd      |j                  dg       |j                  dd            k }}}t        j                         }		 |	j                  |j                  ||            }
|	j                          |
j                   |
j"                  j$                  |
j&                  |
j(                  |
j*                  |
j,                  |
j.                  |
j0                  d}dt3        j4                         j7                  d       }t9        ||       t;        dt=        |      |
j&                  |
j(                  |
j.                  d       t        j                  |      S # t         j
                  $ r$}t        j                  dd| i      cY d}~S d}~ww xY wc c}}w # |	j                          w xY w# t>        $ rB}t@        jC                  d|        t        j                  dtE        |      i      cY d}~S d}~ww xY w)aD  
    Execute multiple stories in parallel via Gemini swarm.

    Args:
        stories_json: JSON array of story objects
        max_parallel: Max concurrent Gemini agents (default 3)

    Returns:
        JSON with aggregate results: stories_completed, stories_failed,
        total_tokens, total_cost, elapsed_seconds
    r   z!stories_json must be a JSON arrayrV   Nr;   r   rW   rC   zSTORY-rA   03drD   rY   r?   rE   rF   rZ   rB   )rn   )successmodestories_completedstories_failedtotal_tokens
total_costelapsed_secondserrorsswarm_ra   swarm_executed)rJ   	completedfailedelapsedzSwarm execution failed: )#r'   rd   
isinstancelistr(   re   r   r   rX   	enumeraterf   asyncionew_event_looprun_until_completeexecute_rwl_swarmcloserq   rr   valuers   rt   ru   rv   rw   rx   r   r    rh   r6   r+   rO   r   r   r   r4   )rm   rn   rQ   r   rP   rX   irR   rK   loopr]   result_datar,   s                r   
exec_swarmr      sj   ;zz,/,-::w(KLMM .
 !"Ezz7$IJKK/-6 ",/	
 1 55!Cy12eeGR(EE-4$%EE*?$Dz1-	
 	
 %%'	,,''l'KF JJL ~~KK%%!'!9!9$33"// ++%55mm	
   1 : :? KLMk2# \11++--	&
 	 zz+&&e  ;zz7nQC$89::;	
$ JJL0  -/s34zz7CF+,,-sg   ;H #I( 7A.I%I( ="I C3I( I
&I?I
I
I( I%%I( (	J317J.(J3.J3c            
         t               } | st        j                  ddd      S 	 | j                         }|j	                  dd      |j	                  dd      |j	                  dd      |j	                  d	d
      t        |j	                  dd            |j	                  dg       d}	 |j	                  d      }|t        |      |d<   t        j                  |t
              S # t        t        f$ r d|d<   Y 1w xY w# t        $ rC}t        j                  d|        t        j                  t        |      dd      cY d}~S d}~ww xY w)z
    Get execution layer status including rate maximizer utilization.

    Returns:
        JSON with execution stats, rate limit utilization, best model,
        and recommendations
    r;   offline)r   statusinitializedFtotal_executionsr   ru   rv   g        
best_modelunknownrecommendations)r   r   ru   rv   r   r   rate_limit_utilizationN)r1   zStatus check failed: r   )r   r'   r(   
get_statusrf   r4   float	TypeError
ValueErrorr   r   r   )rP   r   r]   utilizationr   s        r   exec_statusr     s@    !"Ezz:
  	
@!!# "::mU; &

+=q A"JJ~q9 **\37fjjyAB%zz*;R@
	4 **%=>K&383E/0 zz&#.. :& 	4/3F+,	4
  @,QC01zzCFg>??@sB   BC? )!C% 
C? %C<9C? ;C<<C? ?	E8E EE)rY   )   )__doc__r   r'   r
   loggingdataclassesr   r   pathlibr   	getLogger__name__r   SYNC_DIRr"   r2   r	   r   r4   dictr+   r6   rS   rl   intr   r        r   <module>r      s      
    			8	$ =>'L(  
23 2d 2 7# 7T 72- 2-s 2-C 2-j7-3 7-3 7-tF-S F- F-C F-R(@S (@r   