
    "<i$                        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dS )!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)ServerSessiontask_idstrtask_keysessionr   docketr   returnNonec           	       K   	 |                     |           d{V }|t                              d|             dS |                                2 3 d{V }|d         dk    r!t	          || |||d                    d{V  4|d         dk    rt          || |||           d{V  [6 dS # t          $ r-}t                              d|  d	| d
           Y d}~dS d}~ww xY 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)r   r   r   r   r   progress)r   r   r   r   	executionzSubscription task failed for z: T)exc_info)get_executionloggerwarning	subscribe_send_status_notification_send_progress_notification	Exception)r   r   r   r   r   eventes          /Users/kimhansen/Desktop/03 Workspace/ceo-agents/chl-effectiveness/mcp-servers/whoop/.venv/lib/python3.11/site-packages/fastmcp/server/tasks/subscriptions.pysubscribe_to_task_updatesr'      s     $V ..x88888888	NNC'CCDDDF %..00 	 	 	 	 	 	 	%V}''/##%!.           v*,,1##%!'          100(  V V VEwEE!EEPTUUUUUUUUUVs*   :B2  B2 B/AB2 2
C)<"C$$C)r   r   c                |  K   t          j        |d          }ddlm}  ||          }|d         }d| d| d}	|                                4 d{V }
|
                    |	           d{V }ddd          d{V  n# 1 d{V swxY w Y   |r|                    d	          n/t          j        t          j	                  
                                }d}|t          j        k    rd
}n%|t          j        k    rd}n|t          j        k    rd}|||t          j        t          j	                  
                                ddd}|r||d<   t          t!          j        |                    }t%          t&                    5  |                     |           d{V  ddd           dS # 1 swxY w Y   dS )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+   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     ( %(99J 988888x((I<(J GZFF'FFFN||~~ ; ; ; ; ; ; ;!&>!:!:::::::; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
 	4(((\(,''1133  N(((6	.'	'	'&	.*	*	*) !hl33==?? K  6'5O$ *+:;GG  L
 
)		 6 6''5555555556 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6s$   B
BBF11F58F5r   r   c                x  K   |                                  d{V  |j        r|j        j        sdS t          j        |j        d          }ddlm}  ||          }|d         }d| d| d}	|                                4 d{V }
|
                    |	           d{V }ddd          d{V  n# 1 d{V swxY w Y   |r|	                    d	          n/t          j        t          j                                                  }|||t          j        t          j                                                  d
d|j        j        d}t          t!          j        |                    }t%          t&                    5  |                     |           d{V  ddd           dS # 1 swxY w Y   dS )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/   r0   r1   r2   )r3   r4   r5   r6   r7   r8   r9   r:   )syncr   messager   r<   r   r=   r+   r>   r?   r   r@   r   rA   rB   r	   r
   rF   r   r#   rG   )r   r   r   r   r   rH   r+   rI   r,   rJ   r>   rK   rL   rN   rO   s                  r&   r"   r"      s     " ..

  Y%7%?  %((CCJ 988888x((I<(J GZFF'FFFN||~~ ; ; ; ; ; ; ;!&>!:!:::::::; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
 	4(((\(,''1133  !hl33==??"+3 K *+:;GG  L 
)		 6 6''5555555556 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6s$   B66
C C F//F36F3N)
r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   )__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_      sJ    # " " " " "       ' ' ' ' ' ' ' '             + + + + + + J J J J J J J J = = = = = = 0 0 0 0 0 0 1******000000	H		.V .V .V .VbC6 C6 C6 C6L;6 ;6 ;6 ;6 ;6 ;6r^   