
    Ki                       d Z ddlmZ ddl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 ddlmZ dd	lmZ erdd
lmZ ddl	mZ ddlmZ  ee      Z	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 	 	 	 	 ddZy)zTask subscription helpers for sending MCP notifications (SEP-1686).

Subscribes to Docket execution state changes and sends notifications/tasks/status
to clients when their tasks change state.
    )annotations)suppress)datetimetimezone)TYPE_CHECKING)ExecutionState)TaskStatusNotificationTaskStatusNotificationParams)DOCKET_TO_MCP_STATE)
get_logger)Docket)	Execution)ServerSessionc           	       K   	 |j                  |       d{   }|t        j                  d|         y|j                         2 3 d{   }|d   dk(  rt	        || |||d          d{    -|d   dk(  s6t        || |||       d{    O7 ~7 L7 +7 6 y# t        $ r%}t        j                  d|  d	|        Y d}~yd}~ww xY ww)
a  Subscribe to Docket execution events and send MCP notifications.

    Per SEP-1686 lines 436-444, servers MAY send notifications/tasks/status
    when task state changes. This is an optional optimization that reduces
    client polling frequency.

    Args:
        task_id: Client-visible task ID (server-generated UUID)
        task_key: Internal Docket execution key (includes session, type, component)
        session: MCP ServerSession for sending notifications
        docket: Docket instance for subscribing to execution events
    NzNo execution found for task typestate)sessiontask_idtask_keydocketr   progress)r   r   r   r   	executionz%subscribe_to_task_updates failed for z: )get_executionloggerwarning	subscribe_send_status_notification_send_progress_notification	Exceptionerror)r   r   r   r   r   eventes          n/home/jay/workspace/scripts/.codegraph-venv/lib/python3.12/site-packages/fastmcp/server/tasks/subscriptions.pysubscribe_to_task_updatesr$      s    $M ..x88	NN9'CD %..0 	 	%V}'/##%!.   v*,1##%!'  % 9	 1(  M<WIRsKLLMs   CB! BB! CB! BBBB! /B0B! >B! BB! BB! B! B!  C!	C*C
C
CCc                  K   t        j                  |d      }ddlm}  ||      }|d   }|j	                  d| d| d      }	|j                         4 d{   }
|
j                  |	       d{   }ddd      d{    r|j                  d	      n0t        j                  t        j                        j                         }d}|t        j                  k(  rd
}n+|t        j                  k(  rd}n|t        j                  k(  rd}|||t        j                  t        j                        j                         ddd}|r||d<   t!        t#        j$                  |            }t'        t(              5  | j+                  |       d{    ddd       y7 E7 /7 "# 1 d{  7  sw Y   3xY w7 ,# 1 sw Y   yxY ww)a  Send notifications/tasks/status to client.

    Per SEP-1686 line 454: notification SHOULD NOT include related-task metadata
    (taskId is already in params).

    Args:
        session: MCP ServerSession
        task_id: Client-visible task ID
        task_key: Internal task key (for metadata lookup)
        docket: Docket instance
        state: Docket execution state (enum)
    failedr   parse_task_key
session_idfastmcp:task:::created_atNutf-8zTask completed successfullyzTask failedzTask cancelled`    )taskIdstatus	createdAtlastUpdatedAtttlpollIntervalstatusMessageparams)r   getfastmcp.server.tasks.keysr(   keyredisdecoder   nowr   utc	isoformatr   	COMPLETEDFAILED	CANCELLEDr	   r
   model_validater   r   send_notification)r   r   r   r   r   
mcp_statusr(   	key_partsr)   created_at_keyr<   created_at_bytes
created_atstatus_messageparams_dictnotifications                   r#   r   r   L   s    ( %((9J 9x(I<(JZZ-
|1WI[ QRN||~ ; ;!&>!::; ;
  	(\\(,,'113  N(((6	.''	'&	.**	*) !hll3==?K '5O$ *+::;GL
 
)	 6''5556 6I;:; ; ; ;J 	66 6s   AG
FG
F&1F 2F&6G
F#C8G
:F>F<F>
G
 F&#G
&F9,F/-F94G
<F>>GG
c                  K   |j                          d{    |j                  r|j                  j                  syt        j                  |j
                  d      }ddlm}  ||      }|d   }|j                  d| d| d      }	|j                         4 d{   }
|
j	                  |	       d{   }ddd      d{    r|j                  d	      n0t        j                  t        j                        j                         }|||t        j                  t        j                        j                         d
d|j                  j                  d}t!        t#        j$                  |            }t'        t(              5  | j+                  |       d{    ddd       y7 7 7 7 # 1 d{  7  sw Y   xY w7 ,# 1 sw Y   yxY ww)a  Send notifications/tasks/status when progress updates.

    Args:
        session: MCP ServerSession
        task_id: Client-visible task ID
        task_key: Internal task key
        docket: Docket instance
        execution: Execution object with current progress
    Nr&   r   r'   r)   r*   r+   r,   r-   r.   r/   )r0   r1   r2   r3   r4   r5   r6   r7   )syncr   messager   r9   r   r:   r(   r;   r<   r=   r   r>   r   r?   r@   r	   r
   rD   r   r   rE   )r   r   r   r   r   rF   r(   rG   r)   rH   r<   rI   rJ   rL   rM   s                  r#   r   r      s    " ..
 Y%7%7%?%? %(((CJ 9x(I<(JZZ-
|1WI[ QRN||~ ; ;!&>!::; ;
  	(\\(,,'113  !hll3==?"++33K *+::;GL 
)	 6''5556 6Q  ;:; ; ; ;2 	66 6s   GF-BGF0G!F76F37F7;GF5CG
GG G$
G0G3F75G7G	=G >G	GGGGN)
r   strr   rQ   r   r   r   r   returnNone)r   r   r   rQ   r   rQ   r   r   r   r   rR   rS   )r   r   r   rQ   r   rQ   r   r   r   r   rR   rS   )__doc__
__future__r   
contextlibr   r   r   typingr   docket.executionr   	mcp.typesr	   r
   fastmcp.server.tasks.protocolr   fastmcp.utilities.loggingr   r   r   r   mcp.server.sessionr   __name__r   r$   r   r        r#   <module>r`      s    #  '   + J = 0*0	H	.M.M.M .M 	.M
 
.MbB6B6B6 B6 	B6
 B6 
B6J:6:6:6 :6 	:6
 :6 
:6r_   