§
    ­eî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_handlersú2dict[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       úd/home/div/.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Ï   ø€ åð 
ð 
ð 
ð 
å+Õ-=Õ?PÕRgÐ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å(¨u¸EÐ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Ò3°C´JÔ4EÑFÔFÐFÐFÐFÐFÐFÐF�Ø�<Ý"Ý!Ý!/Ø$J°s´zÔ7HÐ$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Ò5°c¸3¼;ÈÌÑ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   øè è € Ø.1¬jÐB˜œÔ*Ð*¸d�Ø+2¬=×+CÒ+CÀFÑ+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.
        Úfuncú8Callable[[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   øè è € Ø&˜w s™|œ|Ð+Ð+Ð+Ð+Ð+Ð+�Ý# FÑ+Ô+Ð+r2   rq   )ÚloggerÚdebugr   r   r,   ©ru   r`   r{   r/   s     @€r0   Ú	decoratorz2ExperimentalHandlers.list_tasks.<locals>.decoratorÇ   s\   øø€ õ �LŠLÐCÑDÔDÐDÝ)¨$Õ0@ÑAÔAˆGð,ð ,ð ,ð ,ð ,ð ,ð 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   øø€ õ �LŠLÐ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 )z‡Register 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]   øø€ õ �LŠLÐHÑIÔIÐIÝ)¨$Õ0EÑFÔFˆGð,ð ,ð ,ð ,ð ,ð ,ð =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]   øø€ õ �LŠLÐDÑEÔEÐEÝ)¨$Õ0AÑBÔBˆGð,ð ,ð ,ð ,ð ,ð ,ð 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   