o
    i'*                  	   @   s  d Z ddlmZmZ ddlmZmZmZ ddlm	Z	 ddl
mZ ddlmZ ddlmZ er4ddlmZ G d	d
 d
eZG dd deZG dd deZG dd deZG dd deZG dd deZdedef dejdejejB fddZdedef dejdejejB fddZdedef dejdB dej ejB fddZ!dedef dej"dej#ejB fdd Z$dedef dej%d!ej&dej'ejB fd"d#Z(dedef dej)d!ej&dej'ejB fd$d%Z*eG d&d' d'Z+e(Z,e*Z-dS )(a  
Experimental task handler protocols for server -> client requests.

This module provides Protocol types and default handlers for when servers
send task-related requests to clients (the reverse of normal client -> server flow).

WARNING: These APIs are experimental and may change without notice.

Use cases:
- Server sends task-augmented sampling/elicitation request to client
- Client creates a local task, spawns background work, returns CreateTaskResult
- Server polls client's task status via tasks/get, tasks/result, etc.
    )	dataclassfield)TYPE_CHECKINGAnyProtocol)TypeAdapterN)RequestContext)RequestResponder)ClientSessionc                   @   8   e Zd ZdZdedef dejdejej	B fddZ
dS )	GetTaskHandlerFnTzrHandler for tasks/get requests from server.

    WARNING: This is experimental and may change without notice.
    contextr
   paramsreturnc                       d S N selfr   r   r   r   Y/home/ubuntu/.local/lib/python3.10/site-packages/mcp/client/experimental/task_handlers.py__call__"      zGetTaskHandlerFnT.__call__N)__name__
__module____qualname____doc__r   r   typesGetTaskRequestParamsGetTaskResult	ErrorDatar   r   r   r   r   r          

r   c                   @   r   )	GetTaskResultHandlerFnTzuHandler for tasks/result requests from server.

    WARNING: This is experimental and may change without notice.
    r   r
   r   r   c                    r   r   r   r   r   r   r   r   /   r   z GetTaskResultHandlerFnT.__call__N)r   r   r   r   r   r   r   GetTaskPayloadRequestParamsGetTaskPayloadResultr   r   r   r   r   r   r!   )   r    r!   c                   @   s<   e Zd ZdZdedef dejdB dejej	B fddZ
dS )	ListTasksHandlerFnTzsHandler for tasks/list requests from server.

    WARNING: This is experimental and may change without notice.
    r   r
   r   Nr   c                    r   r   r   r   r   r   r   r   <   r   zListTasksHandlerFnT.__call__)r   r   r   r   r   r   r   PaginatedRequestParamsListTasksResultr   r   r   r   r   r   r$   6   s    

r$   c                   @   r   )	CancelTaskHandlerFnTzuHandler for tasks/cancel requests from server.

    WARNING: This is experimental and may change without notice.
    r   r
   r   r   c                    r   r   r   r   r   r   r   r   I   r   zCancelTaskHandlerFnT.__call__N)r   r   r   r   r   r   r   CancelTaskRequestParamsCancelTaskResultr   r   r   r   r   r   r'   C   r    r'   c                	   @   >   e Zd ZdZdedef dejdejdej	ej
B fddZd	S )
TaskAugmentedSamplingFnTaR  Handler for task-augmented sampling/createMessage requests from server.

    When server sends a CreateMessageRequest with task field, this callback
    is invoked. The callback should create a task, spawn background work,
    and return CreateTaskResult immediately.

    WARNING: This is experimental and may change without notice.
    r   r
   r   task_metadatar   c                    r   r   r   r   r   r   r,   r   r   r   r   Z      z!TaskAugmentedSamplingFnT.__call__N)r   r   r   r   r   r   r   CreateMessageRequestParamsTaskMetadataCreateTaskResultr   r   r   r   r   r   r+   P       	

r+   c                	   @   r*   )
TaskAugmentedElicitationFnTaH  Handler for task-augmented elicitation/create requests from server.

    When server sends an ElicitRequest with task field, this callback
    is invoked. The callback should create a task, spawn background work,
    and return CreateTaskResult immediately.

    WARNING: This is experimental and may change without notice.
    r   r
   r   r,   r   c                    r   r   r   r-   r   r   r   r   l   r.   z$TaskAugmentedElicitationFnT.__call__N)r   r   r   r   r   r   r   ElicitRequestParamsr0   r1   r   r   r   r   r   r   r3   b   r2   r3   r   r
   r   r   c                       t jt jddS )Nztasks/get not supportedcodemessager   r   METHOD_NOT_FOUNDr   r   r   r   r   default_get_task_handlert   
   r<   c                    r5   )Nztasks/result not supportedr6   r9   r;   r   r   r   default_get_task_result_handler~   r=   r>   c                    r5   )Nztasks/list not supportedr6   r9   r;   r   r   r   default_list_tasks_handler   r=   r?   c                    r5   )Nztasks/cancel not supportedr6   r9   r;   r   r   r   default_cancel_task_handler   r=   r@   r,   c                    r5   )Nz%Task-augmented sampling not supportedr6   r   r   INVALID_REQUESTr   r   r,   r   r   r   default_task_augmented_sampling   
   rD   c                    r5   )Nz(Task-augmented elicitation not supportedr6   rA   rC   r   r   r   "default_task_augmented_elicitation   rE   rF   c                   @   s   e Zd ZU dZeedZeed< ee	dZ
eed< eedZeed< eedZeed< eedZeed< eedZeed< d	ejd
B fddZedejd	efddZdede f de!ejej"f d	d
fddZ#d
S )ExperimentalTaskHandlersaB  Container for experimental task handlers.

    Groups all task-related handlers that handle server -> client requests.
    This includes both pure task requests (get, list, cancel, result) and
    task-augmented request handlers (sampling, elicitation with task field).

    WARNING: These APIs are experimental and may change without notice.

    Example:
        handlers = ExperimentalTaskHandlers(
            get_task=my_get_task_handler,
            list_tasks=my_list_tasks_handler,
        )
        session = ClientSession(..., experimental_task_handlers=handlers)
    )defaultget_taskget_task_result
list_taskscancel_taskaugmented_samplingaugmented_elicitationr   Nc                 C   s   | j tu}| jtu}| jtu}| jtu}t||||gsdS d}|s$|r?t	j
|r0t	jt	 dnd|r;t	jt	 dndd}t	j|rGt	 nd|rQt	 |dS d|dS )a4  Build ClientTasksCapability from the configured handlers.

        Returns a capability object that reflects which handlers are configured
        (i.e., not using the default "not supported" handlers).

        Returns:
            ClientTasksCapability if any handlers are provided, None otherwise
        N)createMessage)create)samplingelicitation)listcancelrequests)rK   r?   rL   r@   rM   rD   rN   rF   anyr   ClientTasksRequestsCapabilityTasksSamplingCapabilityTasksCreateMessageCapabilityTasksElicitationCapability TasksCreateElicitationCapabilityClientTasksCapabilityTasksListCapabilityTasksCancelCapability)r   has_list
has_cancelhas_samplinghas_elicitationrequests_capabilityr   r   r   build_capability   s0   
	


	
z)ExperimentalTaskHandlers.build_capabilityrequestc                 C   s    t | jtjtjB tjB tjB S )z5Check if this handler handles the given request type.)
isinstancerootr   GetTaskRequestGetTaskPayloadRequestListTasksRequestCancelTaskRequest)re   r   r   r   handles_request   s   z(ExperimentalTaskHandlers.handles_requestctxr
   	responderc                    s\  t tjtjB }|jj tjd r1 d  } | ||I dH }||}|	|I dH  dS   tj
d rW d  } | ||I dH }||}|	|I dH  dS   tjd r} d  } | ||I dH }||}|	|I dH  dS  tjd r d  }| ||I dH }||}|	|I dH  dS  	 tdt|jj )zHandle a task-related request from the server.

        Call handles_request() first to check if this handler can handle the request.
        )r   r   NzUnhandled request type: )r   r   ClientResultr   re   rg   rh   rI   validate_pythonrespondri   rJ   rj   rK   rk   rL   
ValueErrortype)r   rm   rn   client_response_typer   responseclient_responser   r   r   handle_request   s6   	




z'ExperimentalTaskHandlers.handle_request)$r   r   r   r   r   r<   rI   r   __annotations__r>   rJ   r!   r?   rK   r$   r@   rL   r'   rD   rM   r+   rF   rN   r3   r   r\   rd   staticmethodServerRequestboolrl   r   r   r	   ro   rw   r   r   r   r   rG      s$   
 $
rG   ).r   dataclassesr   r   typingr   r   r   pydanticr   	mcp.typesr   mcp.shared.contextr   mcp.shared.sessionr	   mcp.client.sessionr
   r   r!   r$   r'   r+   r3   r   r   r   r<   r"   r#   r>   r%   r&   r?   r(   r)   r@   r/   r0   r1   rD   r4   rF   rG   (default_task_augmented_sampling_callback+default_task_augmented_elicitation_callbackr   r   r   r   <module>   s    





















n