
    Gj 4                    F   S r SSKJr  SSKrSSKJrJr  SSKJr  SSK	J
r
Jr  SSKJr  SSKJr  SS	KJr  SS
KJr  SSKJr  SSKJrJr  SSKJr  SSKJrJrJrJrJ r J!r!J"r"J#r#J$r$J%r%J&r&J'r'J(r(J)r)J*r*J+r+J,r,J-r-J.r.  \(       a  SSK/J0r0  \Rb                  " \25      r3 " S S5      r4g)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                      \ rS rSrSr      SS jr\SS j5       rSS jr  S     SS jjr	SS jr
SS	 jrSS
 jr  SS jr  SS jr  SS jr  SS jrSrg)ExperimentalHandlers0   zqExperimental request/notification handlers.

WARNING: These APIs are experimental and may change without notice.
c                6    Xl         X l        X0l        S U l        g N)_server_request_handlers_notification_handlers_task_support)selfserverrequest_handlersnotification_handlerss       b/Users/admin/workspace/tools/venv/lib/python3.13/site-packages/mcp/server/lowlevel/experimental.py__init__ExperimentalHandlers.__init__6   s     !1&;#15    c                    U R                   $ )z/Get the task support configuration, if enabled.)r-   )r.   s    r2   task_support!ExperimentalHandlers.task_supportA   s     !!!r5   c                  ^  [        U 4S j[        [        [        [        4 5       5      (       d  g [        5       Ul        [        T R                  ;   a  [        5       UR                  l	        [        T R                  ;   a  [        5       UR                  l        [        [        [        5       S9S9UR                  l        g )Nc              3  B   >#    U  H  nUTR                   ;   v   M     g 7fr)   )r+   ).0req_typer.   s     r2   	<genexpr>;ExperimentalHandlers.update_capabilities.<locals>.<genexpr>H   s#      
h ...hs   )call)tools)anyr   r   r   r   r   tasksr+   r"   listr!   cancelr   r#   r    requests)r.   capabilitiess   ` r2   update_capabilities(ExperimentalHandlers.update_capabilitiesF   s     
+-=?PRgh
 
 
 24t555&9&;L# 6 66(=(?L%&C&,?,AB'
#r5   Nc                    Uc
  [        5       nUc
  [        5       n[        XS9U l        U R	                  5         U R                  $ )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.   rJ   rK   s      r2   enable_tasks!ExperimentalHandlers.enable_tasksX   sE    < =%'E=,.E(uB 	,,.!!!r5   c                n    U R                   R                  R                  nUR                  R                  $ )zHReturn the task session scope of the session making the current request.)r*   request_contextsession_experimentaltask_session_scope)r.   rQ   s     r2   _requestor_session_scope-ExperimentalHandlers._requestor_session_scope   s)    ,,..66$$777r5   c                t    [        XR                  5       5      (       d  [        [        [        SU 3S95      eg)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   rT   r   r   r   )r.   task_ids     r2    _require_task_in_requestor_scope5ExperimentalHandlers._require_task_in_requestor_scope   s@     %W.K.K.MNN'.wi8  Or5   c                  ^ ^ T R                   c   eT R                   m[        T R                  ;  a  SU U4S jjnUT R                  [        '   [        T R                  ;  a  SU U4S jjnUT R                  [        '   [        T R                  ;  a  SU U4S jjnUT R                  [        '   [
        T R                  ;  a  S	U U4S jjnUT R                  [
        '   gg)
a  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                  >#    TR                  U R                  R                  5        TR                  R	                  U R                  R                  5      I S h  vN nUc.  [        [        [        SU R                  R                   3S95      e[        [        UR                  UR                  UR                  UR                  UR                  UR                  UR                  S95      $  N7f)NrW   rX   )taskIdstatusstatusMessage	createdAtlastUpdatedAtttlpollInterval)r\   paramsr`   rJ   get_taskr   r   r   r   r   ra   rb   rc   rd   re   rf   )reqtaskr.   supports     r2   _default_get_taskOExperimentalHandlers._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C1C/BC1c                  >#    TR                  U R                  R                  5        TR                  R                  nTR
                  R                  XR                  UR                  5      I S h  vN n[        U5      $  N7fr)   )
r\   rg   r`   r*   rP   handlerhandlerQ   
request_idr   )ri   ctxresultr.   rk   s      r2   _default_get_task_resultVExperimentalHandlers._register_default_task_handlers.<locals>._default_get_task_result   s_     55cjj6G6GHll22&55c;;WW#F++ Xs   A/B2B3Bc                  >^#    TR                  5       mTc  [        [        / S95      $ / nS n TR                  R	                  U5      I S h  vN u  p2UR                  U4S jU 5       5        Uc  [        [        US95      $ MW   N87f)N)rB   c              3  b   >#    U  H$  n[        UR                  T5      (       d  M   Uv   M&     g 7fr)   )r   r`   )r;   rj   requestor_scopes     r2   r=   dExperimentalHandlers._register_default_task_handlers.<locals>._default_list_tasks.<locals>.<genexpr>   s(      %)-1OPTP[P[]l1ms   /	/)rT   r   r   rJ   
list_tasksextend)ri   	own_taskscursorpagerx   r.   rk   s       @r2   _default_list_tasksQExperimentalHandlers._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9Bc                   >#    TR                  U R                  R                  5        [        TR                  U R                  R                  5      I S h  vN n[        U5      $  N7fr)   )r\   rg   r`   r   rJ   r   )ri   rs   r.   rk   s     r2   _default_cancel_taskRExperimentalHandlers._register_default_task_handlers.<locals>._default_cancel_task   sL     55cjj6G6GH*7==#**:K:KLL#F++ Ms   AA(A&A(ri   r   returnr   ri   r   r   r   ri   r   r   r   ri   r   r   r   )r-   r   r+   r   r   r   )r.   rl   rt   r   r   rk   s   `    @r2   rL   4ExperimentalHandlers._register_default_task_handlers   s     !!---$$ !7!77 , 6GD"">2 !(>(>>, , =UD""#89 4#9#99N N, 8KD""#34 D$:$::, ,
 9MD""#45 ;r5   c                    ^      SU 4S jjnU$ )zhRegister a handler for listing tasks.

WARNING: This API is experimental and may change without notice.
c                   >^ [         R                  S5        [        U [        5      mSU4S jjnUTR                  [        '   U $ )Nz(Registering handler for ListTasksRequestc                F   >#    T" U 5      I S h  vN n[        U5      $  N7fr)   r   ri   rs   wrappers     r2   ro   CExperimentalHandlers.list_tasks.<locals>.decorator.<locals>.handler  "     &s|+#F++ ,   !!r   )loggerdebugr
   r   r+   funcro   r   r.   s     @r2   	decorator2ExperimentalHandlers.list_tasks.<locals>.decorator   s<     LLCD)$0@AG, 8?D""#34Kr5   )r   8Callable[[ListTasksRequest], Awaitable[ListTasksResult]]r   r    r.   r   s   ` r2   rz   ExperimentalHandlers.list_tasks   s     	J	E	 r5   c                    ^      SU 4S jjnU$ )znRegister a handler for getting task status.

WARNING: This API is experimental and may change without notice.
c                   >^ [         R                  S5        [        U [        5      mSU4S jjnUTR                  [        '   U $ )Nz&Registering handler for GetTaskRequestc                F   >#    T" U 5      I S h  vN n[        U5      $  N7fr)   r   r   s     r2   ro   AExperimentalHandlers.get_task.<locals>.decorator.<locals>.handler  r   r   r   )r   r   r
   r   r+   r   s     @r2   r   0ExperimentalHandlers.get_task.<locals>.decorator  s:     LLAB)$?G, 6=D"">2Kr5   )r   4Callable[[GetTaskRequest], Awaitable[GetTaskResult]]r   r   r   r   s   ` r2   rh   ExperimentalHandlers.get_task  s     	F	A	 r5   c                    ^      SU 4S jjnU$ )zwRegister a handler for getting task results/payload.

WARNING: This API is experimental and may change without notice.
c                   >^ [         R                  S5        [        U [        5      mSU4S jjnUTR                  [        '   U $ )Nz-Registering handler for GetTaskPayloadRequestc                F   >#    T" U 5      I S h  vN n[        U5      $  N7fr)   r   r   s     r2   ro   HExperimentalHandlers.get_task_result.<locals>.decorator.<locals>.handler5  r   r   r   )r   r   r
   r   r+   r   s     @r2   r   7ExperimentalHandlers.get_task_result.<locals>.decorator/  s=     LLHI)$0EFG, =DD""#89Kr5   )r   BCallable[[GetTaskPayloadRequest], Awaitable[GetTaskPayloadResult]]r   r   r   r   s   ` r2   get_task_result$ExperimentalHandlers.get_task_result$  s     	T	O	 r5   c                    ^      SU 4S jjnU$ )zkRegister a handler for cancelling tasks.

WARNING: This API is experimental and may change without notice.
c                   >^ [         R                  S5        [        U [        5      mSU4S jjnUTR                  [        '   U $ )Nz)Registering handler for CancelTaskRequestc                F   >#    T" U 5      I S h  vN n[        U5      $  N7fr)   r   r   s     r2   ro   DExperimentalHandlers.cancel_task.<locals>.decorator.<locals>.handlerO  r   r   r   )r   r   r
   r   r+   r   s     @r2   r   3ExperimentalHandlers.cancel_task.<locals>.decoratorI  s=     LLDE)$0ABG, 9@D""#45Kr5   )r   :Callable[[CancelTaskRequest], Awaitable[CancelTaskResult]]r   r   r   r   s   ` r2   r    ExperimentalHandlers.cancel_task>  s     	L	G	 r5   )r,   r+   r*   r-   )r/   r$   r0   z2dict[type, Callable[..., Awaitable[ServerResult]]]r1   z*dict[type, Callable[..., Awaitable[None]]])r   zTaskSupport | None)rF   r   r   None)NN)rJ   zTaskStore | NonerK   zTaskMessageQueue | Noner   r	   )r   z
str | None)r[   strr   r   )r   r   )r   z~Callable[[Callable[[ListTasksRequest], Awaitable[ListTasksResult]]], Callable[[ListTasksRequest], Awaitable[ListTasksResult]]])r   zvCallable[[Callable[[GetTaskRequest], Awaitable[GetTaskResult]]], Callable[[GetTaskRequest], Awaitable[GetTaskResult]]])r   zCallable[[Callable[[GetTaskPayloadRequest], Awaitable[GetTaskPayloadResult]]], Callable[[GetTaskPayloadRequest], Awaitable[GetTaskPayloadResult]]])r   zCallable[[Callable[[CancelTaskRequest], Awaitable[CancelTaskResult]]], Callable[[CancelTaskRequest], Awaitable[CancelTaskResult]]])__name__
__module____qualname____firstlineno____doc__r3   propertyr7   rG   rM   rT   r\   rL   rz   rh   r   r   __static_attributes__r   r5   r2   r&   r&   0   s    
	6	6 M	6  J		6 " "
( #')-("(" '(" 
	("T8
(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   r2   <module>r      sr   
 #  /   d < C * = P b 9     , 1			8	$f fr5   