§
    öŽ’jV5  ã                  ó@  — 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_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       úNC:\Projects\DSCons\.venv\Lib\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Ï   ø€ åð 
ð 
ð 
ð 
å+Õ-=Õ?PÕRgÐ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å(¨u¸EÐ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^   € õ % W¨d×.KÒ.KÑ.MÔ.MÑNÔNð 	ÝÝÝ'Ø8¨wÐ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Ò5°c´jÔ6GÑHÔHÐHØ$œ]×3Ò3°C´JÔ4EÑFÔFÐFÐFÐFÐFÐFÐF�Ø�<Ý"Ý!Ý!/Ø$J°s´zÔ7HÐ$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Ò5°c´jÔ6GÑHÔHÐHØ”lÔ2�Ø&œ×5Ò5°c¸3¼;ÈÌÑ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   øè è € ð %ð %Ø!%Õ1OÐPTÔP[Ð]lÑ1mÔ1mð%Øð%ð %ð %ð %ð %ð %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Ð#I‘L�D˜&Ø×$Ò$ð %ð %ð %ð %Ø)-ð%ñ %ô %ñ ô ð ð �~Ý+­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Ò5°c´jÔ6GÑ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.
        Úfuncú8Callable[[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   øè è € Ø&˜w s™|œ|Ð+Ð+Ð+Ð+Ð+Ð+�Ý# FÑ+Ô+Ð+r5   r‚   )ÚloggerÚdebugr
   r   r/   ©r†   ro   rŒ   r2   s     @€r3   Ú	decoratorz2ExperimentalHandlers.list_tasks.<locals>.decoratorü   s\   øø€ õ �LŠLÐCÑDÔDÐDÝ)¨$Õ0@ÑAÔAˆGð,ð ,ð ,ð ,ð ,ð ,ð 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   øø€ õ �LŠLÐ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 )z‡Register 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]   øø€ õ �LŠLÐHÑIÔIÐIÝ)¨$Õ0EÑFÔFˆGð,ð ,ð ,ð ,ð ,ð ,ð =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]   øø€ õ �LŠLÐDÑEÔEÐEÝ)¨$Õ0AÑBÔBˆGð,ð ,ð ,ð ,ð ,ð ,ð 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   