
    AHj 4                    <   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
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-m.Z. erddl/m0Z0  ejb                  e2      Z3 G d d      Z4y)zyExperimental handlers for the low-level MCP server.

WARNING: These APIs are experimental and may change without notice.
    )annotationsN)	AwaitableCallable)TYPE_CHECKING)task_in_session_scopetask_listable_in_session_scope)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TaskTasksCallCapability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	 	 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       X/root/tools/cai/cai_env/lib/python3.12/site-packages/mcp/server/lowlevel/experimental.py__init__zExperimentalHandlers.__init__6   s#     !1&;#15    c                    | j                   S )z/Get the task support configuration, if enabled.)r,   )r-   s    r1   task_supportz!ExperimentalHandlers.task_supportA   s     !!!r3   c                |    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        t                           |j                  _        y )Nc              3  :   K   | ]  }|j                   v   y wr(   )r*   ).0req_typer-   s     r1   	<genexpr>z;ExperimentalHandlers.update_capabilities.<locals>.<genexpr>H   s$      
 ...
s   )call)tools)anyr   r   r   r   r   tasksr*   r"   listr!   cancelr   r#   r    requests)r-   capabilitiess   ` r1   update_capabilitiesz(ExperimentalHandlers.update_capabilitiesF   s     
+-=?PRgh
 
 24t555&9&;L# 6 66(=(?L%&C&,?,AB'
#r3   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-   rE   rF   s      r1   enable_tasksz!ExperimentalHandlers.enable_tasksX   sG    < =%'E=,.E(uEB 	,,.!!!r3   c                n    | j                   j                  j                  }|j                  j                  S )zHReturn the task session scope of the session making the current request.)r)   request_contextsession_experimentaltask_session_scope)r-   rK   s     r1   _requestor_session_scopez-ExperimentalHandlers._requestor_session_scope   s)    ,,..66$$777r3   c                r    t        || j                               st        t        t        d|             y)a  Reject task IDs that belong to a different session.

        Task IDs generated by `run_task()` embed the creating session's
        scope. The default handlers treat a task created by another session
        exactly like a task that does not exist, so a requestor cannot tell
        whether such a task exists. Task IDs without an embedded scope are
        accepted from any session.

        Raises:
            McpError: With INVALID_PARAMS if the task belongs to another session.
        Task not found: codemessageN)r   rN   r   r   r   )r-   task_ids     r1    _require_task_in_requestor_scopez5ExperimentalHandlers._require_task_in_requestor_scope   s?     %Wd.K.K.MN'.wi8  Or3   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)
a7  Register default handlers for task operations.

        Each default handler only operates on tasks created by the requesting
        session (see `_require_task_in_requestor_scope`), and tasks/list only
        returns the requesting session's own tasks (see
        `task_listable_in_session_scope`).
        Nc                  K   j                  | j                  j                         j                  j	                  | j                  j                         d {   }|1t        t        t        d| j                  j                               t        t        |j                  |j                  |j                  |j                  |j                  |j                  |j                              S 7 w)NrP   rQ   )taskIdstatusstatusMessage	createdAtlastUpdatedAtttlpollInterval)rU   paramsrX   rE   get_taskr   r   r   r   r   rY   rZ   r[   r\   r]   r^   )reqtaskr-   supports     r1   _default_get_taskzOExperimentalHandlers._register_default_task_handlers.<locals>._default_get_task   s     55cjj6G6GH$]]33CJJ4E4EFF<"!!/&6szz7H7H6I$J  $!#{{#{{&*&8&8"&..&*&8&8 HH%)%6%6
 
 Gs   AC6C4BC6c                  K   j                  | j                  j                         j                  j                  }j
                  j                  | |j                  |j                         d {   }t        |      S 7 wr(   )
rU   r_   rX   r)   rJ   handlerhandlerK   
request_idr   )ra   ctxresultr-   rc   s      r1   _default_get_task_resultzVExperimentalHandlers._register_default_task_handlers.<locals>._default_get_task_result   sb     55cjj6G6GHll22&55c3;;WW#F++ Xs   A0B3B4Bc                  K   j                         t        t        g             S g }d }	 j                  j	                  |       d {   \  }}|j                  fd|D               |t        t        |            S X7 9w)N)r>   c              3  P   K   | ]  }t        |j                        s|  y wr(   )r   rX   )r8   rb   requestor_scopes     r1   r:   zdExperimentalHandlers._register_default_task_handlers.<locals>._default_list_tasks.<locals>.<genexpr>   s(      %!%1OPTP[P[]l1m%s   &&)rN   r   r   rE   
list_tasksextend)ra   	own_taskscursorpagern   r-   rc   s       @r1   _default_list_taskszQExperimentalHandlers._register_default_task_handlers.<locals>._default_list_tasks   s     "&"?"?"A"* (b(ABB )+	%))0)A)A&)I#ILD&$$ %)-%  ~+O),LMM #Is   ABB	:Bc                   K   j                  | j                  j                         t        j                  | j                  j                         d {   }t        |      S 7 wr(   )rU   r_   rX   r   rE   r   )ra   rj   r-   rc   s     r1   _default_cancel_taskzRExperimentalHandlers._register_default_task_handlers.<locals>._default_cancel_task   sM     55cjj6G6GH*7==#**:K:KLL#F++ Ms   AA(A&A(ra   r   returnr   ra   r   rx   r   ra   r   rx   r   ra   r   rx   r   )r,   r   r*   r   r   r   )r-   rd   rk   rt   rv   rc   s   `    @r1   rG   z4ExperimentalHandlers._register_default_task_handlers   s     !!---$$ !7!77, 6GD"">2 !(>(>>, =UD""#89 4#9#99N, 8KD""#34 D$:$::,
 9MD""#45 ;r3   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   ra   rj   wrappers     r1   rf   zCExperimentalHandlers.list_tasks.<locals>.decorator.<locals>.handler  #     &s|+#F++ ,   !!rz   )loggerdebugr
   r   r*   funcrf   r   r-   s     @r1   	decoratorz2ExperimentalHandlers.list_tasks.<locals>.decorator   s<     LLCD)$0@AG, 8?D""#34Kr3   )r   8Callable[[ListTasksRequest], Awaitable[ListTasksResult]]rx   r    r-   r   s   ` r1   ro   zExperimentalHandlers.list_tasks   s     	J	E	 r3   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(   r   r   s     r1   rf   zAExperimentalHandlers.get_task.<locals>.decorator.<locals>.handler  r   r   rw   )r   r   r
   r   r*   r   s     @r1   r   z0ExperimentalHandlers.get_task.<locals>.decorator  s:     LLAB)$?G, 6=D"">2Kr3   )r   4Callable[[GetTaskRequest], Awaitable[GetTaskResult]]rx   r   r   r   s   ` r1   r`   zExperimentalHandlers.get_task  s     	F	A	 r3   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(   r   r   s     r1   rf   zHExperimentalHandlers.get_task_result.<locals>.decorator.<locals>.handler5  r   r   ry   )r   r   r
   r   r*   r   s     @r1   r   z7ExperimentalHandlers.get_task_result.<locals>.decorator/  s=     LLHI)$0EFG, =DD""#89Kr3   )r   BCallable[[GetTaskPayloadRequest], Awaitable[GetTaskPayloadResult]]rx   r   r   r   s   ` r1   get_task_resultz$ExperimentalHandlers.get_task_result$  s     	T	O	 r3   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(   r   r   s     r1   rf   zDExperimentalHandlers.cancel_task.<locals>.decorator.<locals>.handlerO  r   r   r{   )r   r   r
   r   r*   r   s     @r1   r   z3ExperimentalHandlers.cancel_task.<locals>.decoratorI  s=     LLDE)$0ABG, 9@D""#45Kr3   )r   :Callable[[CancelTaskRequest], Awaitable[CancelTaskResult]]rx   r   r   r   s   ` r1   r   z ExperimentalHandlers.cancel_task>  s     	L	G	 r3   )r.   r$   r/   z2dict[type, Callable[..., Awaitable[ServerResult]]]r0   z*dict[type, Callable[..., Awaitable[None]]])rx   zTaskSupport | None)rB   r   rx   None)NN)rE   zTaskStore | NonerF   zTaskMessageQueue | Nonerx   r	   )rx   z
str | None)rT   strrx   r   )rx   r   )rx   z~Callable[[Callable[[ListTasksRequest], Awaitable[ListTasksResult]]], Callable[[ListTasksRequest], Awaitable[ListTasksResult]]])rx   zvCallable[[Callable[[GetTaskRequest], Awaitable[GetTaskResult]]], Callable[[GetTaskRequest], Awaitable[GetTaskResult]]])rx   zCallable[[Callable[[GetTaskPayloadRequest], Awaitable[GetTaskPayloadResult]]], Callable[[GetTaskPayloadRequest], Awaitable[GetTaskPayloadResult]]])rx   zCallable[[Callable[[CancelTaskRequest], Awaitable[CancelTaskResult]]], Callable[[CancelTaskRequest], Awaitable[CancelTaskResult]]])__name__
__module____qualname____doc__r2   propertyr5   rC   rH   rN   rU   rG   ro   r`   r   r   r   r3   r1   r&   r&   0   s    
	6	6 M	6  J		6 " "
( #')-("(" '(" 
	("T8
(TMl
4
2
4
r3   r&   )5r   
__future__r   loggingcollections.abcr   r   typingr   "mcp.server.experimental.task_scoper   r   $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"   r#   mcp.server.lowlevel.serverr$   	getLoggerr   r   r&   r   r3   r1   <module>r      st   
 #  /   d < C * = P b 9     , 1			8	$f fr3   