
    id)                    ,   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rddl+m,Z,  ej-        e.          Z/ G 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                  p    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S )*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       g/home/ubuntu/.hermes/hermes-agent/venv/lib/python3.11/site-packages/mcp/server/lowlevel/experimental.py__init__zExperimentalHandlers.__init__4   s)     !1&;#15    returnTaskSupport | Nonec                    | j         S )z/Get the task support configuration, if enabled.)r.   )r/   s    r0   task_supportz!ExperimentalHandlers.task_support?   s     !!r2   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_typer/   s     r0   	<genexpr>z;ExperimentalHandlers.update_capabilities.<locals>.<genexpr>F   s?       
 
 ..
 
 
 
 
 
r2   )call)tools)anyr   r   r   r   r   tasksr,   r   listr   cancelr   r    r   requests)r/   r7   s   ` r0   update_capabilitiesz(ExperimentalHandlers.update_capabilitiesD   s     
 
 
 
+-=?PRgh
 
 
 
 
 	 F244t555&9&;&;L# 666(=(?(?L%&C&,?,A,ABBB'
 '
 '
###r2   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)rF   rH   )r   r   r   r.   _register_default_task_handlers)r/   rF   rH   s      r0   enable_tasksz!ExperimentalHandlers.enable_tasksV   sV    < =%''E=,..E(uEBBB 	,,...!!r2   c                H     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 )z.Register default handlers for task operations.Nreqr   r3   r   c                L  K   j                             | j        j                   d {V }|0t	          t          t          d| j        j                             t          t          |j        |j	        |j
        |j        |j        |j        |j                            S )NzTask not found: )codemessage)taskIdstatusstatusMessage	createdAtlastUpdatedAtttlpollInterval)rF   get_taskparamsrR   r	   r   r   r   r   rS   rT   rU   rV   rW   rX   )rN   tasksupports     r0   _default_get_taskzOExperimentalHandlers._register_default_task_handlers.<locals>._default_get_task   s      $]33CJ4EFFFFFFFF<"!!/$Jsz7H$J$J     $!#{#{&*&8"&.&*&8 H%)%6  
 
 
r2   r   c                   K   j         j        }j                            | |j        |j                   d {V }t          |          S r*   )r+   request_contexthandlerhandlesession
request_idr   )rN   ctxresultr/   r\   s      r0   _default_get_task_resultzVExperimentalHandlers._register_default_task_handlers.<locals>._default_get_task_result   sN      l2&55c3;WWWWWWWW#F+++r2   r   c                   K   | j         r| j         j        nd }j                            |           d {V \  }}t	          t          ||                    S )N)rA   
nextCursor)rZ   cursorrF   
list_tasksr   r   )rN   ri   rA   next_cursorr\   s       r0   _default_list_taskszQExperimentalHandlers._register_default_task_handlers.<locals>._default_list_tasks   sd      .1jB**d+2=+C+CF+K+K%K%K%K%K%K%K"{#O%K$X$X$XYYYr2   r   c                p   K   t          j        | j        j                   d {V }t	          |          S r*   )r
   rF   rZ   rR   r   )rN   re   r\   s     r0   _default_cancel_taskzRExperimentalHandlers._register_default_task_handlers.<locals>._default_cancel_task   s=      *7=#*:KLLLLLLLL#F+++r2   rN   r   r3   r   rN   r   r3   r   rN   r   r3   r   rN   r   r3   r   )r.   r   r,   r   r   r   )r/   r]   rf   rl   rn   r\   s   `    @r0   rK   z4ExperimentalHandlers._register_default_task_handlers   s/   !---$ !777     * 6GD">2 !(>>>, , , , , , ,
 =UD"#89 4#999Z Z Z Z Z Z
 8KD"#34 D$:::, , , , , , 9MD"#4555 ;:r2   ~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]]r3   c                    t                               d           t          | t                    dfd}|j        t          <   | S )Nz(Registering handler for ListTasksRequestrN   r   r3   r   c                H   K    |            d {V }t          |          S r*   r   rN   re   wrappers     r0   r`   zCExperimentalHandlers.list_tasks.<locals>.decorator.<locals>.handler   4      &ws||++++++#F+++r2   rq   )loggerdebugr   r   r,   ru   r`   r{   r/   s     @r0   	decoratorz2ExperimentalHandlers.list_tasks.<locals>.decorator   s\     LLCDDD)$0@AAG, , , , , , 8?D"#34Kr2   )ru   rv   r3   rv    r/   r   s   ` r0   rj   zExperimentalHandlers.list_tasks   )    	 	 	 	 	 	 r2   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.
        ru   4Callable[[GetTaskRequest], Awaitable[GetTaskResult]]r3   c                    t                               d           t          | t                    dfd}|j        t          <   | S )Nz&Registering handler for GetTaskRequestrN   r   r3   r   c                H   K    |            d {V }t          |          S r*   ry   rz   s     r0   r`   zAExperimentalHandlers.get_task.<locals>.decorator.<locals>.handler   r|   r2   ro   )r}   r~   r   r   r,   r   s     @r0   r   z0ExperimentalHandlers.get_task.<locals>.decorator   sZ     LLABBB)$??G, , , , , , 6=D">2Kr2   )ru   r   r3   r   r   r   s   ` r0   rY   zExperimentalHandlers.get_task   s)    	 	 	 	 	 	 r2   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.
        ru   BCallable[[GetTaskPayloadRequest], Awaitable[GetTaskPayloadResult]]r3   c                    t                               d           t          | t                    dfd}|j        t          <   | S )Nz-Registering handler for GetTaskPayloadRequestrN   r   r3   r   c                H   K    |            d {V }t          |          S r*   ry   rz   s     r0   r`   zHExperimentalHandlers.get_task_result.<locals>.decorator.<locals>.handler   r|   r2   rp   )r}   r~   r   r   r,   r   s     @r0   r   z7ExperimentalHandlers.get_task_result.<locals>.decorator   s]     LLHIII)$0EFFG, , , , , , =DD"#89Kr2   )ru   r   r3   r   r   r   s   ` r0   get_task_resultz$ExperimentalHandlers.get_task_result   r   r2   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.
        ru   :Callable[[CancelTaskRequest], Awaitable[CancelTaskResult]]r3   c                    t                               d           t          | t                    dfd}|j        t          <   | S )Nz)Registering handler for CancelTaskRequestrN   r   r3   r   c                H   K    |            d {V }t          |          S r*   ry   rz   s     r0   r`   zDExperimentalHandlers.cancel_task.<locals>.decorator.<locals>.handler  r|   r2   rr   )r}   r~   r   r   r,   r   s     @r0   r   z3ExperimentalHandlers.cancel_task.<locals>.decorator  s]     LLDEEE)$0ABBG, , , , , , 9@D"#45Kr2   )ru   r   r3   r   r   r   s   ` r0   r
   z ExperimentalHandlers.cancel_task	  r   r2   )r$   r!   r%   r&   r'   r(   )r3   r4   )r7   r   r3   r8   )NN)rF   rG   rH   rI   r3   r   )r3   r8   )r3   rs   )r3   r   )r3   r   )r3   r   )__name__
__module____qualname____doc__r1   propertyr6   rE   rL   rK   rj   rY   r   r
   r   r2   r0   r#   r#   .   s         
	6 	6 	6 	6 " " " X"
 
 
 
( #')-(" (" (" (" ("T:M :M :M :Mx   4   2   4     r2   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   r}   r#   r   r2   r0   <module>r      s   
 # " " " " "  / / / / / / / /             < < < < < < 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	$	$s s s s s s s s s sr2   