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   \/home/app/Keep/.python/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   ZINVALID_REQUESTr   r   r,   r   r   r   default_task_augmented_sampling   
   rC   c                    r5   )Nz(Task-augmented elicitation not supportedr6   rA   rB   r   r   r   "default_task_augmented_elicitation   rD   rE   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)ZcreateMessage)create)ZsamplingZelicitation)listcancelrequests)rJ   r?   rK   r@   rL   rC   rM   rE   anyr   ZClientTasksRequestsCapabilityZTasksSamplingCapabilityZTasksCreateMessageCapabilityZTasksElicitationCapabilityZ TasksCreateElicitationCapabilityClientTasksCapabilityZTasksListCapabilityZTasksCancelCapability)r   Zhas_listZ
has_cancelZhas_samplingZhas_elicitationZ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)rU   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   rU   rW   rX   rH   Zvalidate_pythonZrespondrY   rI   rZ   rJ   r[   rK   
ValueErrortype)r   r]   r^   Zclient_response_typer   responseZclient_responser   r   r   handle_request   s6   	




z'ExperimentalTaskHandlers.handle_request)$r   r   r   r   r   r<   rH   r   __annotations__r>   rI   r!   r?   rJ   r$   r@   rK   r'   rC   rL   r+   rE   rM   r3   r   rS   rT   staticmethodZServerRequestboolr\   r   r   r	   r_   rc   r   r   r   r   rF      s$   
 $
rF   ).r   dataclassesr   r   typingr   r   r   Zpydanticr   Z	mcp.typesr   Zmcp.shared.contextr   Zmcp.shared.sessionr	   Z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   rC   r4   rE   rF   Z(default_task_augmented_sampling_callbackZ+default_task_augmented_elicitation_callbackr   r   r   r   <module>   s    
















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