o
    
jd)                     @  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)m*Z* ervddl+m,Z, e-e.Z/G dd dZ0d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TasksCallCapability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_handlers_notification_handlers_task_support)selfr"   r#   r%    r-   S/home/kuhnn/.local/lib/python3.10/site-packages/mcp/server/lowlevel/experimental.py__init__4   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                   sl   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t dd|j_d S )Nc                 3  s    | ]}| j v V  qd S r'   )r)   ).0req_typer2   r-   r.   	<genexpr>F   s
    
z;ExperimentalHandlers.update_capabilities.<locals>.<genexpr>)call)tools)anyr   r   r   r   r   tasksr)   r   listr   cancelr   r   r   requests)r,   r4   r-   r2   r.   update_capabilitiesD   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)rA   rC   )r
   r   r   r+   _register_default_task_handlers)r,   rA   rC   r-   r-   r.   enable_tasksV   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   r0   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)rA   get_taskparamsrJ   r   r   r   r   r   rK   rL   rM   rN   rO   rP   )rG   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session
request_idr   )rG   ctxresultr,   rU   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)r<   
nextCursor)rR   cursorrA   
list_tasksr   r   )rG   ra   r<   next_cursorrT   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	   rA   rR   rJ   r   rG   r]   rT   r-   r.   _default_cancel_task   s   zRExperimentalHandlers._register_default_task_handlers.<locals>._default_cancel_taskrG   r   r0   r   rG   r   r0   r   rG   r   r0   r   rG   r   r0   r   )r+   r   r)   r   r   r   )r,   rV   r_   rd   rf   r-   r^   r.   rE      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]]r0   c                   0   t d t| t d fdd}|jt< | S )	Nz(Registering handler for ListTasksRequestrG   r   r0   r   c                       | I d H }t |S r'   r   re   wrapperr-   r.   rX         zCExperimentalHandlers.list_tasks.<locals>.decorator.<locals>.handlerri   )loggerdebugr   r   r)   rm   rX   r2   rr   r.   	decorator   
   


z2ExperimentalHandlers.list_tasks.<locals>.decoratorN)rm   rn   r0   rn   r-   r,   rx   r-   r2   r.   rb         zExperimentalHandlers.list_tasksvCallable[[Callable[[GetTaskRequest], Awaitable[GetTaskResult]]], Callable[[GetTaskRequest], Awaitable[GetTaskResult]]]c                   rl   )z~Register a handler for getting task status.

        WARNING: This API is experimental and may change without notice.
        rm   4Callable[[GetTaskRequest], Awaitable[GetTaskResult]]r0   c                   ro   )	Nz&Registering handler for GetTaskRequestrG   r   r0   r   c                   rp   r'   rq   re   rr   r-   r.   rX      rt   zAExperimentalHandlers.get_task.<locals>.decorator.<locals>.handlerrg   )ru   rv   r   r   r)   rw   r2   rr   r.   rx      ry   z0ExperimentalHandlers.get_task.<locals>.decoratorN)rm   r}   r0   r}   r-   rz   r-   r2   r.   rQ      s   
zExperimentalHandlers.get_taskCallable[[Callable[[GetTaskPayloadRequest], Awaitable[GetTaskPayloadResult]]], Callable[[GetTaskPayloadRequest], Awaitable[GetTaskPayloadResult]]]c                   rl   )zRegister a handler for getting task results/payload.

        WARNING: This API is experimental and may change without notice.
        rm   BCallable[[GetTaskPayloadRequest], Awaitable[GetTaskPayloadResult]]r0   c                   ro   )	Nz-Registering handler for GetTaskPayloadRequestrG   r   r0   r   c                   rp   r'   rq   re   rr   r-   r.   rX      rt   zHExperimentalHandlers.get_task_result.<locals>.decorator.<locals>.handlerrh   )ru   rv   r   r   r)   rw   r2   rr   r.   rx      ry   z7ExperimentalHandlers.get_task_result.<locals>.decoratorN)rm   r   r0   r   r-   rz   r-   r2   r.   get_task_result   r{   z$ExperimentalHandlers.get_task_resultCallable[[Callable[[CancelTaskRequest], Awaitable[CancelTaskResult]]], Callable[[CancelTaskRequest], Awaitable[CancelTaskResult]]]c                   rl   )z{Register a handler for cancelling tasks.

        WARNING: This API is experimental and may change without notice.
        rm   :Callable[[CancelTaskRequest], Awaitable[CancelTaskResult]]r0   c                   ro   )	Nz)Registering handler for CancelTaskRequestrG   r   r0   r   c                   rp   r'   rq   re   rr   r-   r.   rX     rt   zDExperimentalHandlers.cancel_task.<locals>.decorator.<locals>.handlerrj   )ru   rv   r   r   r)   rw   r2   rr   r.   rx     ry   z3ExperimentalHandlers.cancel_task.<locals>.decoratorN)rm   r   r0   r   r-   rz   r-   r2   r.   r	   	  r{   z ExperimentalHandlers.cancel_task)r"   r    r#   r$   r%   r&   )r0   r1   )r4   r   r0   r5   )NN)rA   rB   rC   rD   r0   r   )r0   r5   )r0   rk   )r0   r|   )r0   r~   )r0   r   )__name__
__module____qualname____doc__r/   propertyr3   r@   rF   rE   rb   rQ   r   r	   r-   r-   r-   r.   r!   .   s    


*
<

r!   )1r   
__future__r   loggingcollections.abcr   r   typingr   $mcp.server.experimental.task_supportr   #mcp.server.lowlevel.func_inspectionr   mcp.shared.exceptionsr   %mcp.shared.experimental.tasks.helpersr	   2mcp.shared.experimental.tasks.in_memory_task_storer
   +mcp.shared.experimental.tasks.message_queuer   r   #mcp.shared.experimental.tasks.storer   	mcp.typesr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   mcp.server.lowlevel.serverr    	getLoggerr   ru   r!   r-   r-   r-   r.   <module>   s"    P
