o
    i1)                     @  s  d Z ddlmZ ddlZddlmZmZ ddlmZ ddl	m
Z
 ddlmZ ddl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mZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z) ertddl*m+Z+ e,e-Z.G dd dZ/dS )zyExperimental handlers for the low-level MCP server.

WARNING: These APIs are experimental and may change without notice.
    )annotationsN)	AwaitableCallable)TYPE_CHECKING)TaskSupport)create_call_wrapper)McpError)cancel_task)InMemoryTaskStore)InMemoryTaskMessageQueueTaskMessageQueue)	TaskStore)INVALID_PARAMSCancelTaskRequestCancelTaskResult	ErrorDataGetTaskPayloadRequestGetTaskPayloadResultGetTaskRequestGetTaskResultListTasksRequestListTasksResultServerCapabilitiesServerResultServerTasksCapabilityServerTasksRequestsCapabilityTasksCancelCapabilityTasksListCapabilityTasksToolsCapability)Serverc                   @  st   e Zd ZdZd)dd	Zed*ddZd+ddZ		d,d-ddZd.ddZ	d/ddZ
d0d!d"Zd1d$d%Zd2d'd(ZdS )3ExperimentalHandlerszyExperimental request/notification handlers.

    WARNING: These APIs are experimental and may change without notice.
    serverr   request_handlers2dict[type, Callable[..., Awaitable[ServerResult]]]notification_handlers*dict[type, Callable[..., Awaitable[None]]]c                 C  s   || _ || _|| _d | _d S N)_server_request_handlersZ_notification_handlers_task_support)selfr!   r"   r$    r+   W/home/app/Keep/.python/lib/python3.10/site-packages/mcp/server/lowlevel/experimental.py__init__3   s   
zExperimentalHandlers.__init__returnTaskSupport | Nonec                 C  s   | j S )z/Get the task support configuration, if enabled.)r)   r*   r+   r+   r,   task_support>   s   z!ExperimentalHandlers.task_supportcapabilitiesr   Nonec                   sf   t  fddttttfD sd S t |_t jv rt |j_	t jv r)t
 |j_tt d|j_d S )Nc                 3  s    | ]}| j v V  qd S r&   )r(   ).0Zreq_typer0   r+   r,   	<genexpr>E   s
    
z;ExperimentalHandlers.update_capabilities.<locals>.<genexpr>)Ztools)anyr   r   r   r   r   tasksr(   r   listr   cancelr   r   requests)r*   r2   r+   r0   r,   update_capabilitiesC   s   




z(ExperimentalHandlers.update_capabilitiesNstoreTaskStore | NonequeueTaskMessageQueue | Noner   c                 C  s8   |du rt  }|du rt }t||d| _|   | jS )a]  
        Enable experimental task support.

        This sets up the task infrastructure and auto-registers default handlers
        for tasks/get, tasks/result, tasks/list, and tasks/cancel.

        Args:
            store: Custom TaskStore implementation (defaults to InMemoryTaskStore)
            queue: Custom TaskMessageQueue implementation (defaults to InMemoryTaskMessageQueue)

        Returns:
            The TaskSupport configuration object

        Example:
            # Simple in-memory setup
            server.experimental.enable_tasks()

            # Custom store/queue for distributed systems
            server.experimental.enable_tasks(
                store=RedisTaskStore(redis_url),
                queue=RedisTaskMessageQueue(redis_url),
            )

        WARNING: This API is experimental and may change without notice.
        N)r<   r>   )r
   r   r   r)   _register_default_task_handlers)r*   r<   r>   r+   r+   r,   enable_tasksU   s   z!ExperimentalHandlers.enable_tasksc                   s    j dusJ  j t jvrdfdd}| jt< t jvr-d fd	d
}| jt< t jvr>dfdd}| jt< t jvrQdfdd}| jt< dS dS )z.Register default handlers for task operations.Nreqr   r.   r   c              
     sb    j | jjI d H }|d u rtttd| jj dtt|j|j	|j
|j|j|j|jdS )NzTask not found: )codemessage)taskIdstatusstatusMessage	createdAtlastUpdatedAtttlpollInterval)r<   get_taskparamsrE   r   r   r   r   r   rF   rG   rH   rI   rJ   rK   )rB   tasksupportr+   r,   _default_get_task   s(   zOExperimentalHandlers._register_default_task_handlers.<locals>._default_get_taskr   c                   s,    j j}j| |j|jI d H }t|S r&   )r'   request_contexthandlerhandlesessionZ
request_idr   )rB   ctxresultr*   rP   r+   r,   _default_get_task_result   s   zVExperimentalHandlers._register_default_task_handlers.<locals>._default_get_task_resultr   c                   s:   | j r| j jnd } j|I d H \}}tt||dS )N)r7   Z
nextCursor)rM   cursorr<   
list_tasksr   r   )rB   rZ   r7   Znext_cursorrO   r+   r,   _default_list_tasks   s   zQExperimentalHandlers._register_default_task_handlers.<locals>._default_list_tasksr   c                   s    t  j| jjI d H }t|S r&   )r	   r<   rM   rE   r   rB   rW   rO   r+   r,   _default_cancel_task   s   zRExperimentalHandlers._register_default_task_handlers.<locals>._default_cancel_taskrB   r   r.   r   rB   r   r.   r   rB   r   r.   r   rB   r   r.   r   )r)   r   r(   r   r   r   )r*   rQ   rY   r\   r^   r+   rX   r,   r@      s   






z4ExperimentalHandlers._register_default_task_handlers~Callable[[Callable[[ListTasksRequest], Awaitable[ListTasksResult]]], Callable[[ListTasksRequest], Awaitable[ListTasksResult]]]c                      d fdd}|S )zxRegister a handler for listing tasks.

        WARNING: This API is experimental and may change without notice.
        func8Callable[[ListTasksRequest], Awaitable[ListTasksResult]]r.   c                   0   t d t| t d fdd}|jt< | S )	Nz(Registering handler for ListTasksRequestrB   r   r.   r   c                       | I d H }t |S r&   r   r]   wrapperr+   r,   rS         zCExperimentalHandlers.list_tasks.<locals>.decorator.<locals>.handlerra   )loggerdebugr   r   r(   re   rS   r0   rj   r,   	decorator   
   


z2ExperimentalHandlers.list_tasks.<locals>.decoratorN)re   rf   r.   rf   r+   r*   rp   r+   r0   r,   r[         zExperimentalHandlers.list_tasksvCallable[[Callable[[GetTaskRequest], Awaitable[GetTaskResult]]], Callable[[GetTaskRequest], Awaitable[GetTaskResult]]]c                   rd   )z~Register a handler for getting task status.

        WARNING: This API is experimental and may change without notice.
        re   4Callable[[GetTaskRequest], Awaitable[GetTaskResult]]r.   c                   rg   )	Nz&Registering handler for GetTaskRequestrB   r   r.   r   c                   rh   r&   ri   r]   rj   r+   r,   rS      rl   zAExperimentalHandlers.get_task.<locals>.decorator.<locals>.handlerr_   )rm   rn   r   r   r(   ro   r0   rj   r,   rp      rq   z0ExperimentalHandlers.get_task.<locals>.decoratorN)re   ru   r.   ru   r+   rr   r+   r0   r,   rL      s   
zExperimentalHandlers.get_taskCallable[[Callable[[GetTaskPayloadRequest], Awaitable[GetTaskPayloadResult]]], Callable[[GetTaskPayloadRequest], Awaitable[GetTaskPayloadResult]]]c                   rd   )zRegister a handler for getting task results/payload.

        WARNING: This API is experimental and may change without notice.
        re   BCallable[[GetTaskPayloadRequest], Awaitable[GetTaskPayloadResult]]r.   c                   rg   )	Nz-Registering handler for GetTaskPayloadRequestrB   r   r.   r   c                   rh   r&   ri   r]   rj   r+   r,   rS      rl   zHExperimentalHandlers.get_task_result.<locals>.decorator.<locals>.handlerr`   )rm   rn   r   r   r(   ro   r0   rj   r,   rp      rq   z7ExperimentalHandlers.get_task_result.<locals>.decoratorN)re   rw   r.   rw   r+   rr   r+   r0   r,   get_task_result   rs   z$ExperimentalHandlers.get_task_resultCallable[[Callable[[CancelTaskRequest], Awaitable[CancelTaskResult]]], Callable[[CancelTaskRequest], Awaitable[CancelTaskResult]]]c                   rd   )z{Register a handler for cancelling tasks.

        WARNING: This API is experimental and may change without notice.
        re   :Callable[[CancelTaskRequest], Awaitable[CancelTaskResult]]r.   c                   rg   )	Nz)Registering handler for CancelTaskRequestrB   r   r.   r   c                   rh   r&   ri   r]   rj   r+   r,   rS     rl   zDExperimentalHandlers.cancel_task.<locals>.decorator.<locals>.handlerrb   )rm   rn   r   r   r(   ro   r0   rj   r,   rp     rq   z3ExperimentalHandlers.cancel_task.<locals>.decoratorN)re   rz   r.   rz   r+   rr   r+   r0   r,   r	     rs   z ExperimentalHandlers.cancel_task)r!   r   r"   r#   r$   r%   )r.   r/   )r2   r   r.   r3   )NN)r<   r=   r>   r?   r.   r   )r.   r3   )r.   rc   )r.   rt   )r.   rv   )r.   ry   )__name__
__module____qualname____doc__r-   propertyr1   r;   rA   r@   r[   rL   rx   r	   r+   r+   r+   r,   r    -   s    


*
<

r    )0r~   
__future__r   loggingcollections.abcr   r   typingr   Z$mcp.server.experimental.task_supportr   Z#mcp.server.lowlevel.func_inspectionr   Zmcp.shared.exceptionsr   Z%mcp.shared.experimental.tasks.helpersr	   Z2mcp.shared.experimental.tasks.in_memory_task_storer
   Z+mcp.shared.experimental.tasks.message_queuer   r   Z#mcp.shared.experimental.tasks.storer   Z	mcp.typesr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zmcp.server.lowlevel.serverr   	getLoggerr{   rm   r    r+   r+   r+   r,   <module>   s"    L
