
    Oj                    H   d Z ddlmZ ddlZddlZddlZddlZddlm	Z	 ej                  j                  dd      j                  d      Zej                  j                  dd      Zej                  j                  d	d
      ZddZddZdddZdddZddZddZddZd Zy)u  Tasks & reminders — thin client to the shared Railway brain, with HUD cards.

Jarvis can add/list/complete tasks and reminders; they live in the SAME Railway
service as long-term memory (:Task nodes), so they SYNC across every device.
Adding one also pops a card on the HUD (like the email/calendar confirm cards),
and Ahmed can tick a task off there — the HUD writes control/card_action.json,
the ControlWatcher marks it done on Railway and tells Jarvis.

  Jarvis (voice) -> task_add / task_list / task_done
  Ahmed  (HUD)   -> ticks a checkbox -> card_action.json {kind:"task", ...}

Reuses MEMORY_API_URL / MEMORY_API_KEY (same service). MCP_TASKS=0 disables.

Engine → HUD events (voice.events.emit):
  task_added {id, text, due}          — one new task/reminder
  tasks      {tasks:[{id,text,due,done}]} — full current list (panel refresh)
  task_done_evt {id}                  — a task was completed (remove from panel)
    )annotationsN)emitMEMORY_API_URL /MEMORY_API_KEYMEMORY_GROUPahmedc                 h    t         j                  j                  dd      dk(  ryt        t              S )N	MCP_TASKS10F)osenvirongetbool_URL     A/Users/ahmed/devFolder/Ultron/claude-voice/voice/tasks_control.pyenabledr   !   s&    	zz~~k3'3.:r   c                    dd| dgiS )Ncontenttext)typer   r   )msgs    r   _textr   '   s    5677r   c                   |#t        j                  |      j                         nd }t        j                  j                  t        |z   ||       }t        r|j                  ddt                |j                  dd       t        j                  j                  ||      5 }|j                         }|rt        j                  |      ni cd d d        S # 1 sw Y   y xY w)N)datamethodAuthorizationzBearer zContent-Typezapplication/json)timeout)jsondumpsencodeurllibrequestRequestr   _KEY
add_headerurlopenreadloads)r    pathbodyr"   r   reqrraws           r   _reqr3   +   s    (,(84::d""$dD
..
 
 4
 
GC'$(89NN>#56			W		5ffh"%tzz#2 
6	5	5s   #)CCc                    t         j                  j                  t        t	        |       j                         d      }t        dd|       j                  dg       S )N)groupinclude_doneGETz/tasks?tasks)r&   parse	urlencode_GROUPstrlowerr3   r   )r6   qss     r   fetch_tasksr?   6   sP    			&14\1B1H1H1J!L 
MB~&**7B77r   c                     t         j                  j                  dt        i      } t	        dd|        j                  dg       S )z}Reminders whose time has passed and haven't been announced yet. The
    server marks each 'fired' so it's returned only once.r5   r7   z/reminders/due?due)r&   r9   r:   r;   r3   r   )r>   s    r   	fetch_duerB   <   s>     
		& 1	2B-.225"==r   c                     	 t        dt                      y# t        $ r$} t        dt	        |       dd         Y d} ~ yd} ~ ww xY w)z1Push the current open task list to the HUD panel.r8   r8   z   [tasks] panel refresh failed: Nd   )r   r?   	Exceptionprintr<   )es    r   refresh_panelrI   C   sC    AWKM* A0Q?@@As    	AA  Ac                F    t        dd| t        d       t        d|        y)zEComplete a task on Railway; used by the ControlWatcher on a HUD tick.POSTz
/task/done)idr5   task_done_evt)rL   done)r3   r;   r   )task_ids    r   	mark_donerP   K   s     g?@W%r   c                     dd l ddlm} m}  | ddt        t        d      dfd       } | ddi       dfd	       } | d
ddt        i      dfd       } |dd|||g      S )Nr   )toolcreate_sdk_mcp_servertask_adduK  Add a task or reminder to Ahmed's shared list (syncs to all his devices) and pop it on his HUD. Use for 'remind me to…', 'add a task', 'I need to…'. `due` = ISO local time (2026-07-08T17:00:00) for a timed reminder — he'll be told when it's due; omit for a plain to-do. Keep `text` short and imperative ('Call the supplier').)r   rA   c           	     t  K   t        | j                  dd            j                         }|st        d      S 	 |t        dd}| j                  d      rt        | d         |d<   j                  t        dd|       d {   }t        d	|j                  d
d      ||j                  dd             j                  t               d {    t        d| |j                  d      rd|d    dz         S dz         S 7 7 7# t        $ r$}t        dt        |      d d        cY d }~S d }~ww xY ww)Nr   r   ztask_add failed: no task text.jarvis)r   r5   sourcerA   rK   z/task
task_addedrL   )rL   r   rA   zAdded: z (reminder set for )ztask_add failed:    )
r<   r   stripr   r;   	to_threadr3   r   rI   rF   )argsr   r/   outrH   asyncios        r   rT   zbuild_server.<locals>.task_addV   s<     488FB'(..09::	= 6XFDxx!$u+.U))$FFC#''$"3$XXeR(*##M22274&)#xx 2$u+a@8 9 9468 9 9	 G 3  	=,SVDS\N;<<	=sf   7D8AD DAD D,D ;D8<D D8D D 	D5D0*D5+D80D55D8	task_listzzList Ahmed's open tasks and reminders (also refreshes the HUD panel). Use for 'what are my tasks', 'what do I have to do'.c           	       K   	 j                  t               d {   }t        d|       |st        d      S g }|D ]Q  }|j	                  d      rd|d   d d j                  dd       d	nd
}|j                  d|d    | d|d    d       S t        dj                  |            S 7 # t        $ r$}t        dt        |      d d        cY d }~S d }~ww xY ww)Nr8   rD   zNo open tasks.rA   z  (due    T rY   r   z- r   z  [id rL   ]
ztask_list failed: rZ   )
r\   r?   r   r   r   replaceappendjoinrF   r<   )r]   r8   linestrA   rH   r_   s         r   r`   zbuild_server.<locals>.task_listo   s     	>!++K88E&-..EuuU|  %" 5 5c# >?qA)+ r!F)SE$yBC  5)** 9  	>-c!fTcl^<==	>sO   C B0 B.B0 C A1B0 -C .B0 0	C9CCC CC 	task_donezdMark a task/reminder complete by its id (from task_list). Ahmed can also tick it on the HUD himself.rL   c                0  K   t        | j                  dd            j                         }|st        d      S 	 j	                  t
        |       d {    t        d      S 7 # t        $ r$}t        dt        |      d d        cY d }~S d }~ww xY ww)NrL   r   ztask_done failed: no task id.zMarked done.ztask_done failed: rZ   )r<   r   r[   r   r\   rP   rF   )r]   tidrH   r_   s      r   rl   zbuild_server.<locals>.task_done   s      $((4$%++-899	>##Is333(( 4 	>-c!fTcl^<==	>sF   7BA& A$A& #B$A& &	B/BB	BBBr8   z1.0.0)nameversiontools)r]   dictreturnrr   )r_   claude_agent_sdkrR   rS   r<   )rR   rS   rT   r`   rl   r_   s        @r   build_serverru   R   s    <	*K
 s
#%=%=$ 
+IJLN>N> 
+-/3Sk;>;> !gI. r   )rs   r   )r   r<   rs   rr   )N   )r    r<   r.   r<   r/   zdict | Noner"   int)F)r6   r   rs   
list[dict])rs   rx   )rs   None)rO   r<   rs   r<   )__doc__
__future__r   r#   r   urllib.parser&   urllib.requestvoice.eventsr   r   r   rstripr   r)   r;   r   r   r3   r?   rB   rI   rP   ru   r   r   r   <module>r      s   $ #  	   	zz~~&+2237	zz~~&+		08.8>A?r   