
    [ǻi1)                    $   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rddl*m+Z+  ejX                  e-      Z. G d d      Z/y)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                      e Zd ZdZ	 	 	 	 	 	 ddZedd       ZddZ	 	 d	 	 	 	 	 ddZddZ		 	 ddZ
	 	 dd	Z	 	 dd
Z	 	 ddZy)ExperimentalHandlerszyExperimental request/notification handlers.

    WARNING: These APIs are experimental and may change without notice.
    c                <    || _         || _        || _        d | _        y N)_server_request_handlers_notification_handlers_task_support)selfserverrequest_handlersnotification_handlerss       ^/opt/lhia/marcimex/agent/venv/lib/python3.12/site-packages/mcp/server/lowlevel/experimental.py__init__zExperimentalHandlers.__init__3   s#     !1&;#15    c                    | j                   S )z/Get the task support configuration, if enabled.)r(   )r)   s    r-   task_supportz!ExperimentalHandlers.task_support>   s     !!!r/   c                h    t         fdt        t        t        t        fD              sy t               |_        t         j                  v rt               |j                  _	        t         j                  v rt               |j                  _        t        t                     |j                  _        y )Nc              3  :   K   | ]  }|j                   v   y wr$   )r&   ).0req_typer)   s     r-   	<genexpr>z;ExperimentalHandlers.update_capabilities.<locals>.<genexpr>E   s$      
 ...
s   )tools)anyr   r   r   r   r   tasksr&   r   listr   cancelr   r   requests)r)   capabilitiess   ` r-   update_capabilitiesz(ExperimentalHandlers.update_capabilitiesC   s     
+-=?PRgh
 
 24t555&9&;L# 6 66(=(?L%&C&('
#r/   Nc                    |
t               }|
t               }t        ||      | _        | j	                          | 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.
        )storequeue)r   r   r   r(   _register_default_task_handlers)r)   r@   rA   s      r-   enable_tasksz!ExperimentalHandlers.enable_tasksU   sG    < =%'E=,.E(uEB 	,,.!!!r/   c                     j                   J  j                   t         j                  vrdfd}| j                  t        <   t         j                  vrd fd}| j                  t        <   t         j                  vrdfd}| j                  t        <   t
         j                  vrd	fd}| j                  t
        <   yy)
z.Register default handlers for task operations.Nc                  K   j                   j                  | j                  j                         d {   }|1t	        t        t        d| j                  j                               t        t        |j                  |j                  |j                  |j                  |j                  |j                  |j                              S 7 w)NzTask not found: )codemessage)taskIdstatusstatusMessage	createdAtlastUpdatedAtttlpollInterval)r@   get_taskparamsrH   r	   r   r   r   r   rI   rJ   rK   rL   rM   rN   )reqtasksupports     r-   _default_get_taskzOExperimentalHandlers._register_default_task_handlers.<locals>._default_get_task   s     $]]33CJJ4E4EFF<"!!/&6szz7H7H6I$J  $!#{{#{{&*&8&8"&..&*&8&8 HH%)%6%6
 
 Gs   3CCBCc                   K   j                   j                  }j                  j                  | |j                  |j
                         d {   }t        |      S 7 wr$   )r%   request_contexthandlerhandlesession
request_idr   )rQ   ctxresultr)   rS   s      r-   _default_get_task_resultzVExperimentalHandlers._register_default_task_handlers.<locals>._default_get_task_result   sJ     ll22&55c3;;WW#F++ Xs   AA AA c                   K   | j                   r| j                   j                  nd }j                  j                  |       d {   \  }}t	        t        ||            S 7 w)N)r9   
nextCursor)rP   cursorr@   
list_tasksr   r   )rQ   r`   r9   next_cursorrS   s       r-   _default_list_taskszQExperimentalHandlers._register_default_task_handlers.<locals>._default_list_tasks   sR     .1jj**d+2==+C+CF+K%K"{#O%K$XYY &Ls   AA&A$A&c                   K   t        j                  | j                  j                         d {   }t	        |      S 7 wr$   )r
   r@   rP   rH   r   )rQ   r\   rS   s     r-   _default_cancel_taskzRExperimentalHandlers._register_default_task_handlers.<locals>._default_cancel_task   s5     *7==#**:K:KLL#F++ Ms   .AAArQ   r   returnr   rQ   r   rg   r   rQ   r   rg   r   rQ   r   rg   r   )r(   r   r&   r   r   r   )r)   rT   r]   rc   re   rS   s   `    @r-   rB   z4ExperimentalHandlers._register_default_task_handlers   s    !!---$$ !7!77* 6GD"">2 !(>(>>,
 =UD""#89 4#9#99Z
 8KD""#34 D$:$::, 9MD""#45 ;r/   c                     	 	 	 	 d fd}|S )zxRegister a handler for listing tasks.

        WARNING: This API is experimental and may change without notice.
        c                    t         j                  d       t        | t              dfd}|j                  t        <   | S )Nz(Registering handler for ListTasksRequestc                F   K    |        d {   }t        |      S 7 wr$   r   rQ   r\   wrappers     r-   rW   zCExperimentalHandlers.list_tasks.<locals>.decorator.<locals>.handler   #     &s|+#F++ ,   !!ri   )loggerdebugr   r   r&   funcrW   rp   r)   s     @r-   	decoratorz2ExperimentalHandlers.list_tasks.<locals>.decorator   s<     LLCD)$0@AG, 8?D""#34Kr/   )rv   8Callable[[ListTasksRequest], Awaitable[ListTasksResult]]rg   rx    r)   rw   s   ` r-   ra   zExperimentalHandlers.list_tasks   s     	J	E	 r/   c                     	 	 	 	 d fd}|S )z~Register a handler for getting task status.

        WARNING: This API is experimental and may change without notice.
        c                    t         j                  d       t        | t              dfd}|j                  t        <   | S )Nz&Registering handler for GetTaskRequestc                F   K    |        d {   }t        |      S 7 wr$   rn   ro   s     r-   rW   zAExperimentalHandlers.get_task.<locals>.decorator.<locals>.handler   rq   rr   rf   )rs   rt   r   r   r&   ru   s     @r-   rw   z0ExperimentalHandlers.get_task.<locals>.decorator   s:     LLAB)$?G, 6=D"">2Kr/   )rv   4Callable[[GetTaskRequest], Awaitable[GetTaskResult]]rg   r~   ry   rz   s   ` r-   rO   zExperimentalHandlers.get_task   s     	F	A	 r/   c                     	 	 	 	 d fd}|S )zRegister a handler for getting task results/payload.

        WARNING: This API is experimental and may change without notice.
        c                    t         j                  d       t        | t              dfd}|j                  t        <   | S )Nz-Registering handler for GetTaskPayloadRequestc                F   K    |        d {   }t        |      S 7 wr$   rn   ro   s     r-   rW   zHExperimentalHandlers.get_task_result.<locals>.decorator.<locals>.handler   rq   rr   rh   )rs   rt   r   r   r&   ru   s     @r-   rw   z7ExperimentalHandlers.get_task_result.<locals>.decorator   s=     LLHI)$0EFG, =DD""#89Kr/   )rv   BCallable[[GetTaskPayloadRequest], Awaitable[GetTaskPayloadResult]]rg   r   ry   rz   s   ` r-   get_task_resultz$ExperimentalHandlers.get_task_result   s     	T	O	 r/   c                     	 	 	 	 d fd}|S )z{Register a handler for cancelling tasks.

        WARNING: This API is experimental and may change without notice.
        c                    t         j                  d       t        | t              dfd}|j                  t        <   | S )Nz)Registering handler for CancelTaskRequestc                F   K    |        d {   }t        |      S 7 wr$   rn   ro   s     r-   rW   zDExperimentalHandlers.cancel_task.<locals>.decorator.<locals>.handler  rq   rr   rj   )rs   rt   r   r   r&   ru   s     @r-   rw   z3ExperimentalHandlers.cancel_task.<locals>.decorator  s=     LLDE)$0ABG, 9@D""#45Kr/   )rv   :Callable[[CancelTaskRequest], Awaitable[CancelTaskResult]]rg   r   ry   rz   s   ` r-   r
   z ExperimentalHandlers.cancel_task  s     	L	G	 r/   )r*   r    r+   z2dict[type, Callable[..., Awaitable[ServerResult]]]r,   z*dict[type, Callable[..., Awaitable[None]]])rg   zTaskSupport | None)r=   r   rg   None)NN)r@   zTaskStore | NonerA   zTaskMessageQueue | Nonerg   r   )rg   r   )rg   z~Callable[[Callable[[ListTasksRequest], Awaitable[ListTasksResult]]], Callable[[ListTasksRequest], Awaitable[ListTasksResult]]])rg   zvCallable[[Callable[[GetTaskRequest], Awaitable[GetTaskResult]]], Callable[[GetTaskRequest], Awaitable[GetTaskResult]]])rg   zCallable[[Callable[[GetTaskPayloadRequest], Awaitable[GetTaskPayloadResult]]], Callable[[GetTaskPayloadRequest], Awaitable[GetTaskPayloadResult]]])rg   zCallable[[Callable[[CancelTaskRequest], Awaitable[CancelTaskResult]]], Callable[[CancelTaskRequest], Awaitable[CancelTaskResult]]])__name__
__module____qualname____doc__r.   propertyr1   r>   rC   rB   ra   rO   r   r
   ry   r/   r-   r"   r"   -   s    
	6	6 M	6  J		6 " "
( #')-("(" '(" 
	("T:Mx
4
2
4
r/   r"   )0r   
__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   mcp.server.lowlevel.serverr    	getLoggerr   rs   r"   ry   r/   r-   <module>r      sl   
 #  /   < C * = P b 9    ( 1			8	$s sr/   