
    #/i3                     X   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ad	 Zd
 Z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	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defdZdededefdZ ded edefd!Z!y)#a  
Task Board MCP Tools
====================
Shared task board accessible by both Claude and Antigravity agents.
Dual-writes to Redis (real-time) + file snapshot (offline fallback).

Tools:
- task_board_create: Create task in Redis + file snapshot
- task_board_list: List tasks from Redis (file fallback)
- task_board_update: Update task status/priority
- task_board_claim: Claim task ownership (atomic)
- task_board_complete: Mark complete, log result
    N)datetime)Path)Optionalz+/mnt/e/genesis-system/data/antigravity-syncztaskboard.jsonzevents.jsonlc                  (   t         T	 t        j                  j                  dd       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 TaskQueue.Nr   /mnt/e/genesis-system)/mnt/e/genesis-system/data/genesis-memory)	TaskQueuezTaskQueue unavailable: )	_task_queuesyspathinsertAIVA.tasks.task_queuer	   	Exceptionloggerwarning)r	   es     8/mnt/e/genesis-system/genesis_v2/mcp/task_board_tools.py_get_task_queuer   #   s{     	:HHOOA67HHOOAJK7#+K ;  	:NN4QC899	:s   AA! !	B*BBc                  v   t         {	 t        j                  j                  dd       t        j                  j                  dd       ddlm}  ddlm}  | |j                  d      a t         j                          t         S t         S # t        $ r'}t        j                  d	|        Y d}~t         S d}~ww xY w)
zLazy load AgentBus.Nr   r   r   )AgentBus)	AgentTypeF)
agent_typeenable_auditzAgentBus unavailable: )
_agent_busr   r   r   AIVA.agents.agent_busr   AIVA.agents.message_schemasr   CLAUDEconnectr   r   r   )r   r   r   s      r   _get_agent_busr   1   s     	9HHOOA67HHOOAJK6=!Y-=-=ERJ  :  	9NN3A3788	9s   A4B 	B8B33B8source
event_typedatac                    	 t        j                         j                         | ||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.)	timestampr    typer"   Tparentsexist_oka
NzFailed to log event: )r   utcnow	isoformatEVENTS_FILEparentmkdiropenwritejsondumpsr   r   error)r    r!   r"   eventfr   s         r   
_log_eventr7   A   s    2!*446	
 	   =+s# 	.qGGDJJu%,-	. 	. 	. 2,QC0112s6   AB (BB BB B 	C B==Cpayloadc                     t               }|r3	 ddlm}m}  ||j                  d| |d      }|j                  d|       yy# t        $ r"}t        j                  d|        Y d}~yd}~ww xY w)z(Publish event via AgentBus if available.r   )EventMessager   zaiva:eventsinfo)senderchannelr!   r8   severityz3Redis event publish failed (file fallback active): N)	r   r   r:   r   r   publishr   r   debug)r!   r8   busr:   r   msgr   s          r   _publish_eventrC   Q   su    

C
	TK ''%%C KKs+   	TLLNqcRSS	Ts   1A 	A,
A''A,tasksc                 j   	 | t        j                         j                         dd}t        j                  j                  dd       t        t        d      5 }t        j                  ||d       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'Write full task board snapshot to file.task_board_tools)rD   last_updatedsnapshot_sourceTr&   w   )indentNzFailed to snapshot board: )r   r+   r,   TASKBOARD_FILEr.   r/   r0   r2   dumpr   r   r4   )rD   snapshotr6   r   s       r   _snapshot_boardrO   c   s    
7$OO-7791

 	##D4#@.#& 	-!IIh!,	- 	- 	- 71!5667s6   AB A;2B ;B B B 	B2B--B2returnc                  ,   	 t         j                         rAt        t         d      5 } t        j                  |       }|j                  dg       cddd       S 	 g S # 1 sw Y   g S xY w# t        $ r#}t        j                  d|        Y d}~g S d}~ww xY w)z#Read task board from file fallback.rrD   Nz Failed to read board from file: )	rL   existsr0   r2   loadgetr   r   r4   )r6   r"   r   s      r   _read_board_from_filerV   r   s    =  "nc* -ayy|xx,- - # I-
 I  =7s;<<I=s4   $A' 'A	A' A$A' $A' '	B0BBc                      t               } | sy	 | j                  d      }|D cg c]  }|j                          c}S c c}w # t        $ r"}t        j                  d|        Y d}~yd}~ww xY w)z$Read all tasks from Redis TaskQueue.N2   )nzRedis board read failed: )r   peekto_dictr   r   r@   )queuerD   tr   s       r   _read_board_from_redisr^   ~   sf    E

R
 %*+		+++ 045s%   A ?A A 	A/A**A/	task_jsonc                 Z   	 t        j                  |       }t	        t        j                               }t        j                         j                         }||j                  dd      |j                  dd      |j                  dd	      t        d
t        d|j                  dd                  t        d
t        d|j                  dd                  |j                  d      ddd||d}d}t               }|rf	 ddlm}  |||d   |d   |d   |d   |d   dd      }	|j                  d      rt        j                   |d         |	_        |j%                  |	      }t-        d||d   d       t/               }
|
j1                  |       t3        |
       t5        dd||d   d       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&        $ r"}t(        j+                  d|        Y d}~d}~ww xY w)a  
    Create a new task on the shared board.

    Args:
        task_json: JSON with fields: title, description, type, urgency (1-10),
                   impact (1-10), deadline (ISO-8601 optional)

    Returns:
        JSON with created task_id and status
    r4   Invalid JSON: NtitleUntitleddescription r%   general
      urgency   impactdeadlinepending)idrb   rd   r%   ri   rk   rl   status
claimed_byresult
created_at
updated_atFr   )Task)rb   rd   rp   )rn   r%   ri   rk   r8   zRedis enqueue failed: task_created)task_idrb   claudecreatedT)rv   ro   redisfile_snapshot)r2   loadsJSONDecodeErrorr3   struuiduuid4r   r+   r,   rU   minmaxr   AIVA.tasks.task_schemart   fromisoformatrl   enqueuer   r   r   rC   rV   appendrO   r7   )r_   	task_datar   rv   nowtask_recordredis_okr\   rt   
redis_taskexistings              r   task_board_creater      s   ;JJy)	 $**,G
//

%
%
'C w
3 }}]B7fi0r3q)--	1"=>?b#ax!;<=MM*-K  HE	93 (#I."8,(1#.}#="&
J z*&.&<&<[=T&U
#}}Z0H
 >wWAU#VW %&HOOK H xW{SZG[)\]::	  o  ;zz7nQC$89::;R  	9NN3A3788	9s6   G ;A%G? G<G71G<7G<?	H*H%%H*ro   limitc                     t               }|
t               }| r$|D cg c]  }|j                  d      | k(  s| }}|d| }t        j                  |t        |      t               dd      S dd      S c c}w )z
    List tasks from the shared board.

    Args:
        status: Filter by status (pending, in_progress, completed, failed). Empty = all.
        limit: Max tasks to return (default 20)

    Returns:
        JSON array of tasks
    Nro   ry   file)rD   countr    )r^   rV   rU   r2   r3   len)ro   r   rD   r]   s       r   task_board_listr      s     #$E}%' !?qQUU8_%>?? &5ME::U35A'   HN   @s
   A6A6rv   updates_jsonc                 z   	 t        j                  |      }t	        j
                         j                         }d}t               }|r	 |j                  |       }|rod|v rt        dt        d|d               |_        d|v rt        dt        d|d               |_        d	|v rd
dlm}  ||d	         |_        |j!                  |      }t)               }	d}
|	D ]0  }|j+                  d      | k(  s|j-                  |       ||d<   d}
 n |
rt/        |	       t1        d| |d       t3        dd| |d       t        j                  | |
xs |||
d      S # t         j                  $ r$}t        j                  dd| i      cY d}~S d}~ww xY w# t"        $ r"}t$        j'                  d|        Y d}~d}~ww xY w)z
    Update a task on the shared board.

    Args:
        task_id: ID of task to update
        updates_json: JSON with fields to update (status, priority, description, etc.)

    Returns:
        JSON with update result
    r4   ra   NFri   rg   rh   rk   ro   r   
TaskStatuszRedis update failed: rn   rs   Ttask_updated)rv   updatesrw   )rv   updatedry   r   )r2   r{   r|   r3   r   r+   r,   r   get_taskr   r   ri   rk   r   r   ro   update_taskr   r   r@   rV   rU   updaterO   rC   r7   )rv   r   r   r   r   r   r\   taskr   rD   r   r]   s               r   task_board_updater      s   ;**\* //

%
%
'C HE	6>>'*D'#&r3q')2D+E#FDLw&"%b#a1B*C"DDKw&A",WX->"?DK ,,T2
 "#EG 55;'!HHW!AlOG  >w7#KLxW)QR::&h	  Q  ;zz7nQC$89::;(  	6LL0455	6s6   E BF F(FFF	F:F55F:agentc                 H   t        j                         j                         }d}t               }|r	 |j	                  |       }|rt|j
                  j                  d      }|r ||k7  rt        j                  dd| d      S ||j
                  d<   ddl	m
} |j                  |_        |j                  |      }t#               }	d}
|	D ]d  }|j                  d	      | k(  s|j                  d      r*|d   |k7  r"|s t        j                  dd|d    d      c S ||d<   d
|d<   ||d<   d}
 n |
rt%        |	       t'        d| |d       t)        |dd| i       t        j                  | |xs |
|d      S # t        $ r"}t        j!                  d|        Y d}~d}~ww xY w)z
    Claim task ownership atomically.

    Args:
        task_id: ID of task to claim
        agent: Agent name claiming the task (e.g., "claude", "antigravity")

    Returns:
        JSON with claim result
    Frp   zTask already claimed by )claimedr4   r   r   zRedis claim failed: Nrn   in_progressro   rs   Ttask_claimed)rv   r   rv   )rv   r   rp   )r   r+   r,   r   r   r8   rU   r2   r3   r   r   IN_PROGRESSro   r   r   r   r@   rV   rO   rC   r7   )rv   r   r   redis_claimedr\   r   current_ownerr   r   rD   file_claimedr]   s               r   task_board_claimr   4  s    //

%
%
'C ME	5>>'*D $ 0 0 > ]e%;::#(#;M?!K'   .3\*=(44 % 1 1$ 7
 "#EL 55;'!uu\"q%'?$::#(#;AlO;L!M'   $AlO'AhK!AlOL >w#GHuny'&:;:: 0L  5  	5LL/s344	5s   AE6 7E6 6	F!?FF!result_jsonc                    	 t        j                  |      }t	        j
                         j                         }d}t               }|rC	 |j                  |       }|r/ddl	m
} |j                  |_        ||_        |j                  |      }t%               }	d}
|	D ].  }|j'                  d      | k(  sd	|d
<   ||d<   ||d<   ||d<   d}
 n |
rt)        |	       t+        d| |d       t-        ddd| i       t        j                  | |xs |
||
d      S # t         j                  $ r$}t        j                  dd| i      cY d}~S d}~ww xY w# t        $ r"}t         j#                  d|        Y d}~d}~ww xY w)z
    Mark task as complete with result.

    Args:
        task_id: ID of task to complete
        result_json: JSON with result data (summary, files_changed, etc.)

    Returns:
        JSON with completion status
    r4   ra   NFr   r   zRedis complete failed: rn   	completedro   rq   rs   completed_atTtask_completed)rv   rq   rw   rv   )rv   r   ry   r   )r2   r{   r|   r3   r   r+   r,   r   r   r   r   	COMPLETEDro   rq   r   r   r   r@   rV   rU   rO   rC   r7   )rv   r   result_datar   r   r   r\   r   r   rD   file_okr]   s               r   task_board_completer   s  s   ;jj- //

%
%
'C HE	8>>'*D=(22) ,,T2
 "#EG 55;'!%AhK%AhK!AlO #AnG #K%PQx)Iw+?@::(	  K  ;zz7nQC$89::;   	8LL21#677	8s6   D AE E	%E>E	E		E7E22E7)re      )"__doc__r2   r   loggingr~   r   pathlibr   typingr   	getLogger__name__r   SYNC_DIRrL   r-   r
   r   r   r   r}   dictr7   rC   listrO   rV   r^   r   intr   r   r   r        r   <module>r      sE    
     			8	$ =>,,' 
 2s 2 24 2 Ts TT T$74 7	t 	
 
I I IXC S # @:s :# :# :z<c <# <# <~7 73 73 7r   