
    Rmj 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j1        e2          Z3 G d d          Z4dS )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d0d$ZdS )1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                >    || _         || _        || _        d | _        d S N)_server_request_handlers_notification_handlers_task_support)selfr'   r(   r*   s       h/home/thesage/.hermes/hermes-agent/venv/lib/python3.11/site-packages/mcp/server/lowlevel/experimental.py__init__zExperimentalHandlers.__init__6   s)     !1&;#15    returnTaskSupport | Nonec                    | j         S )z/Get the task support configuration, if enabled.)r1   )r2   s    r3   task_supportz!ExperimentalHandlers.task_supportA   s     !!r5   capabilitiesr   Nonec                    t           f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                                          |j        _        d S )Nc              3  *   K   | ]}|j         v V  d S r-   )r/   ).0req_typer2   s     r3   	<genexpr>z;ExperimentalHandlers.update_capabilities.<locals>.<genexpr>H   s?       
 
 ..
 
 
 
 
 
r5   )call)tools)anyr   r   r   r   r   tasksr/   r"   listr!   cancelr   r#   r    requests)r2   r:   s   ` r3   update_capabilitiesz(ExperimentalHandlers.update_capabilitiesF   s     
 
 
 
+-=?PRgh
 
 
 
 
 	 F244t555&9&;&;L# 666(=(?(?L%&C&,?,A,ABBB'
 '
 '
###r5   NstoreTaskStore | NonequeueTaskMessageQueue | Noner	   c                    |t                      }|t                      }t          ||          | _        |                                  | 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)rI   rK   )r   r   r	   r1   _register_default_task_handlers)r2   rI   rK   s      r3   enable_tasksz!ExperimentalHandlers.enable_tasksX   sV    < =%''E=,..E(uEBBB 	,,...!!r5   
str | Nonec                <    | 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)r2   rS   s     r3   _requestor_session_scopez-ExperimentalHandlers._requestor_session_scope   s    ,.6$77r5   task_idstrc                    t          ||                                           s&t          t          t          d|                     dS )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   rV   r   r   r   )r2   rW   s     r3    _require_task_in_requestor_scopez5ExperimentalHandlers._require_task_in_requestor_scope   s^     %Wd.K.K.M.MNN 	'8w88    	 	r5   c                N     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
          <   dS dS )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`).
        Nreqr   r6   r   c                  K                        | j        j                   j                            | j        j                   d {V }|0t          t          t          d| j        j                             t          t          |j        |j
        |j        |j        |j        |j        |j                            S )NrZ   r[   )taskIdstatusstatusMessage	createdAtlastUpdatedAtttlpollInterval)r^   paramsrb   rI   get_taskr   r   r   r   r   rc   rd   re   rf   rg   rh   )r`   taskr2   supports     r3   _default_get_taskzOExperimentalHandlers._register_default_task_handlers.<locals>._default_get_task   s      55cj6GHHH$]33CJ4EFFFFFFFF<"!!/$Jsz7H$J$J     $!#{#{&*&8"&.&*&8 H%)%6  
 
 
r5   r   c                   K                        | j        j                   j        j        }j                            | |j        |j                   d {V }t          |          S r-   )
r^   ri   rb   r.   rR   handlerhandlerS   
request_idr   )r`   ctxresultr2   rl   s      r3   _default_get_task_resultzVExperimentalHandlers._register_default_task_handlers.<locals>._default_get_task_result   sg      55cj6GHHHl2&55c3;WWWWWWWW#F+++r5   r   c                B  K                                    t          t          g                     S g }d }	 j                            |           d {V \  }}|                    fd|D                        |t          t          |                    S d)N)rD   Tc              3  F   K   | ]}t          |j                  |V  d S r-   )r   rb   )r>   rk   requestor_scopes     r3   r@   zdExperimentalHandlers._register_default_task_handlers.<locals>._default_list_tasks.<locals>.<genexpr>   sL       % %!%1OPTP[]l1m1m%% % % % % %r5   )rV   r   r   rI   
list_tasksextend)r`   	own_taskscursorpagerw   r2   rl   s       @r3   _default_list_taskszQExperimentalHandlers._register_default_task_handlers.<locals>._default_list_tasks   s      "&"?"?"A"A"* (b(A(A(ABBB )+	%)N)0)A)A&)I)I#I#I#I#I#I#ILD&$$ % % % %)-% % %    ~+O),L,L,LMMMNr5   r   c                   K                        | j        j                   t          j        | j        j                   d {V }t          |          S r-   )r^   ri   rb   r   rI   r   )r`   rs   r2   rl   s     r3   _default_cancel_taskzRExperimentalHandlers._register_default_task_handlers.<locals>._default_cancel_task   sV      55cj6GHHH*7=#*:KLLLLLLLL#F+++r5   r`   r   r6   r   r`   r   r6   r   r`   r   r6   r   r`   r   r6   r   )r1   r   r/   r   r   r   )r2   rm   rt   r}   r   rl   s   `    @r3   rN   z4ExperimentalHandlers._register_default_task_handlers   sA    !---$ !777      , 6GD">2 !(>>>, , , , , , , =UD"#89 4#999N N N N N N N, 8KD"#34 D$:::, , , , , , ,
 9MD"#4555 ;:r5   ~Callable[[Callable[[ListTasksRequest], Awaitable[ListTasksResult]]], Callable[[ListTasksRequest], Awaitable[ListTasksResult]]]c                     d fd}|S )zxRegister a handler for listing tasks.

        WARNING: This API is experimental and may change without notice.
        func8Callable[[ListTasksRequest], Awaitable[ListTasksResult]]r6   c                    t                               d           t          | t                    dfd}|j        t          <   | S )Nz(Registering handler for ListTasksRequestr`   r   r6   r   c                H   K    |            d {V }t          |          S r-   r   r`   rs   wrappers     r3   ro   zCExperimentalHandlers.list_tasks.<locals>.decorator.<locals>.handler  4      &ws||++++++#F+++r5   r   )loggerdebugr
   r   r/   r   ro   r   r2   s     @r3   	decoratorz2ExperimentalHandlers.list_tasks.<locals>.decorator   s\     LLCDDD)$0@AAG, , , , , , 8?D"#34Kr5   )r   r   r6   r    r2   r   s   ` r3   rx   zExperimentalHandlers.list_tasks   )    	 	 	 	 	 	 r5   vCallable[[Callable[[GetTaskRequest], Awaitable[GetTaskResult]]], Callable[[GetTaskRequest], Awaitable[GetTaskResult]]]c                     d fd}|S )z~Register a handler for getting task status.

        WARNING: This API is experimental and may change without notice.
        r   4Callable[[GetTaskRequest], Awaitable[GetTaskResult]]r6   c                    t                               d           t          | t                    dfd}|j        t          <   | S )Nz&Registering handler for GetTaskRequestr`   r   r6   r   c                H   K    |            d {V }t          |          S r-   r   r   s     r3   ro   zAExperimentalHandlers.get_task.<locals>.decorator.<locals>.handler  r   r5   r   )r   r   r
   r   r/   r   s     @r3   r   z0ExperimentalHandlers.get_task.<locals>.decorator  sZ     LLABBB)$??G, , , , , , 6=D">2Kr5   )r   r   r6   r   r   r   s   ` r3   rj   zExperimentalHandlers.get_task  s)    	 	 	 	 	 	 r5   Callable[[Callable[[GetTaskPayloadRequest], Awaitable[GetTaskPayloadResult]]], Callable[[GetTaskPayloadRequest], Awaitable[GetTaskPayloadResult]]]c                     d fd}|S )zRegister a handler for getting task results/payload.

        WARNING: This API is experimental and may change without notice.
        r   BCallable[[GetTaskPayloadRequest], Awaitable[GetTaskPayloadResult]]r6   c                    t                               d           t          | t                    dfd}|j        t          <   | S )Nz-Registering handler for GetTaskPayloadRequestr`   r   r6   r   c                H   K    |            d {V }t          |          S r-   r   r   s     r3   ro   zHExperimentalHandlers.get_task_result.<locals>.decorator.<locals>.handler5  r   r5   r   )r   r   r
   r   r/   r   s     @r3   r   z7ExperimentalHandlers.get_task_result.<locals>.decorator/  s]     LLHIII)$0EFFG, , , , , , =DD"#89Kr5   )r   r   r6   r   r   r   s   ` r3   get_task_resultz$ExperimentalHandlers.get_task_result$  r   r5   Callable[[Callable[[CancelTaskRequest], Awaitable[CancelTaskResult]]], Callable[[CancelTaskRequest], Awaitable[CancelTaskResult]]]c                     d fd}|S )z{Register a handler for cancelling tasks.

        WARNING: This API is experimental and may change without notice.
        r   :Callable[[CancelTaskRequest], Awaitable[CancelTaskResult]]r6   c                    t                               d           t          | t                    dfd}|j        t          <   | S )Nz)Registering handler for CancelTaskRequestr`   r   r6   r   c                H   K    |            d {V }t          |          S r-   r   r   s     r3   ro   zDExperimentalHandlers.cancel_task.<locals>.decorator.<locals>.handlerO  r   r5   r   )r   r   r
   r   r/   r   s     @r3   r   z3ExperimentalHandlers.cancel_task.<locals>.decoratorI  s]     LLDEEE)$0ABBG, , , , , , 9@D"#45Kr5   )r   r   r6   r   r   r   s   ` r3   r   z ExperimentalHandlers.cancel_task>  r   r5   )r'   r$   r(   r)   r*   r+   )r6   r7   )r:   r   r6   r;   )NN)rI   rJ   rK   rL   r6   r	   )r6   rP   )rW   rX   r6   r;   )r6   r;   )r6   r   )r6   r   )r6   r   )r6   r   )__name__
__module____qualname____doc__r4   propertyr9   rH   rO   rV   r^   rN   rx   rj   r   r   r   r5   r3   r&   r&   0   s        
	6 	6 	6 	6 " " " X"
 
 
 
( #')-(" (" (" (" ("T8 8 8 8
   (TM TM TM TMl   4   2   4     r5   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   r5   r3   <module>r      s.   
 # " " " " "  / / / / / / / /             d d d d d d d d < < < < < < C C C C C C * * * * * * = = = = = = P P P P P P b b b b b b b b 9 9 9 9 9 9                                         ,  2111111		8	$	$f f f f f f f f f fr5   