
    i"                        d Z ddlmZ ddlZddlZddlmZ ddlmZm	Z	m
Z
 ddlmZmZ ddlmZ ddlZddlmZ erdd	lmZ dd
lmZ  ee      Z G d d      Zy)z;Lifespan and Docket task infrastructure for FastMCP Server.    )annotationsN)AsyncIterator)AsyncExitStackasynccontextmanagersuppress)TYPE_CHECKINGAny)SharedContext)
get_logger)Docket)FastMCPc                  N    e Zd ZdZedd       Zedd       Zedd       Zd	dZ	y)
LifespanMixinzDMixin providing lifespan and Docket task infrastructure for FastMCP.c                    | j                   S )zGet the Docket instance if Docket support is enabled.

        Returns None if Docket is not enabled or server hasn't been started yet.
        )_docket)selfs    n/Users/bowang/.openclaw/workspace/ChatDev/.venv/lib/python3.12/site-packages/fastmcp/server/mixins/lifespan.pydocketzLifespanMixin.docket   s     ||    c           
    F  K   ddl m}m} |j                  t	        j
                  |             }	  |       s;t               4 d{    d ddd      d{    	 |j                  |       y	 t        | j                          d{         }|s;t               4 d{    d ddd      d{    	 |j                  |       yddlm}m} ddlm} ddl m}	m}
  ||j                   j*                  |j                   j,                        4 d{   }|| _        |D ]  }|j1                  |        |	j                  |      }	 |j                   j2                  |j                   j4                  |j                   j6                  d	}|j                   j8                  r|j                   j8                  |d
<    ||fi |4 d{   }|| _        |
j                  |      }	 t=        j>                  |jA                               }	 d |jC                          tE        t<        jF                        5  | d{    ddd       |
j                  |       d| _        ddd      d{    |	j                  |       d| _        ddd      d{    |j                  |       y7 q7 _# 1 d{  7  sw Y   pxY w7 G# t        $ r@}t        j                  d|        t        j                  j                  r g }Y d}~d}~ww xY w7 }7 k# 1 d{  7  sw Y   |xY w7  7 o7 # 1 sw Y   xY w# |jC                          tE        t<        jF                        5  | d{  	7   ddd       w # 1 sw Y   w xY wxY w# |
j                  |       d| _        w xY w7 E# 1 d{  7  sw Y   VxY w# |	j                  |       d| _        w xY w7 S# 1 d{  7  sw Y   dxY w# |j                  |       w xY ww)a  Manage Docket instance and Worker for background task execution.

        Docket infrastructure is only initialized if:
        1. pydocket is installed (fastmcp[tasks] extra)
        2. There are task-enabled components (task_config.mode != 'forbidden')

        This means users with pydocket installed but no task-enabled components
        won't spin up Docket/Worker infrastructure.
        r   )_current_serveris_docket_availableNzFailed to get tasks: )r   Worker)settings)_current_docket_current_worker)nameurl)concurrencyredelivery_timeoutreconnection_delayr   )$fastmcp.server.dependenciesr   r   setweakrefrefr
   resetlist	get_tasks	Exceptionloggerwarningfastmcpr   &mounted_components_raise_on_load_errorr   r   r   r   r   r   r   r   register_with_docketr   r    r!   worker_name_workerasynciocreate_taskrun_forevercancelr   CancelledError)r   r   r   server_tokentask_componentser   r   r   r   r   r   	componentdocket_tokenworker_kwargsworkerworker_tokenworker_tasks                     r   _docket_lifespanzLifespanMixin._docket_lifespan#   sH     	U '**7;;t+<=S	0 '((?? +?Z !!,/Q%"&T^^-='="> #(?? +?v !!,/q .( __))OO''  % "1I226: "1  /226:( (0'B'B.6oo.P.P.6oo.P.P5M
  22080K0Kf-  &f>>>&'-'6':':6'B
0*1*=*=f>P>P>R*SK6 % + 2 2 4%-g.D.D%E*5$5$5 &F ,11,?+/DL  ?>$ $)),7#'DLY ^ !!,/_ +???? (> %!6qc:;##JJ"$	% +????0  ? %6 &F%E !, 2 2 4%-g.D.D%E*5$5$5 &F%E%E ,11,?+/DL  ?>>>$ $)),7#'DLY   ^ !!,/s  -P!P J6P 	J<P J9P  P!3K KK P $L!%P (L'.P 9L$:P ?P!AP L=P !1O5A>OM ON?/#NM)NMM
MNN?,O7N<8O<O5P O2 P $P!6P 9P <KKK
P K 	L5LP LP $P 'L:-L0.L:5	P  OMM
N*N;NNN	NNNNN99N?<O?O	OO	OO//O52P 5P;O><PP PP!c           	    $  K   | j                   rd  y | j                  |       4 d {   }| j                         4 d {    || _        d| _         t	        t
        d z            4 d {   }| j                  D ])  }|j                  |j                                d {    + | j                  j                          	 d  | j                  j                          d d d       d {    d d d       d {    d d d       d {    d| _         d | _        y 7 7 7 7 # | j                  j                          w xY w7 Z# 1 d {  7  sw Y   jxY w7 a# 1 d {  7  sw Y   qxY w7 h# 1 d {  7  sw Y   xxY ww)NTF)_lifespan_result_set	_lifespanr?   _lifespan_resultr   bool	providersenter_async_contextlifespan_startedr#   clear)r   user_lifespan_resultstackproviders       r   _lifespan_managerzLifespanMixin._lifespan_manager   s4    $$ NN4  $8!!##$8D!(,D%%dTk244 $H33H4E4E4GHHH !/ !!#*MM'') 54 $# ! " %*! $% !#
 5 I MM'') 5444 $### !   s   (FD$FE;D&E;'E$.D(
/E$22E$D*% ED,E%E$0E1E$5E; E"E;FE9F&E;(E$*E,E	EE$EEEE$"E;$E6	*E-+E6	2E;9F;FFF	Fc                h   
 ddl m}  |       syddlm}m}m}m}m
 ddlm	m
mm d

 fd}d
 fd}d
 fd}d
 fd	}	| j                  j                  |<   | j                  j                  |<   | j                  j                  |<   |	 j                  j                  |<   y)zRegister SEP-1686 task protocol handlers with SDK.

        Only registers handlers if docket is installed. Without docket,
        task protocol requests will return "method not found" errors.
        r   )r   N)CancelTaskRequestGetTaskPayloadRequestGetTaskRequestListTasksRequestServerResult)tasks_cancel_handlertasks_get_handlertasks_list_handlertasks_result_handlerc                |   K   | j                   j                  dd      } |       d {   } |      S 7 wNT)by_aliasexclude_noneparams
model_dump)reqr]   resultrS   r   rU   s      r   handle_get_taskzDLifespanMixin._setup_task_protocol_handlers.<locals>.handle_get_task   s?     ZZ**Dt*LF,T6::F'' ;   *<:<c                |   K   | j                   j                  dd      } |       d {   } |      S 7 wrY   r\   )r_   r]   r`   rS   r   rW   s      r   handle_get_task_resultzKLifespanMixin._setup_task_protocol_handlers.<locals>.handle_get_task_result   ?     ZZ**Dt*LF/f==F'' >rb   c                   K   | j                   r| j                   j                  dd      ni } |       d {   } |      S 7 wrY   r\   )r_   r]   r`   rS   r   rV   s      r   handle_list_taskszFLifespanMixin._setup_task_protocol_handlers.<locals>.handle_list_tasks   sR      :: 

%%t$%G 
 .dF;;F'' <s   8A
AA
c                |   K   | j                   j                  dd      } |       d {   } |      S 7 wrY   r\   )r_   r]   r`   rS   r   rT   s      r   handle_cancel_taskzGLifespanMixin._setup_task_protocol_handlers.<locals>.handle_cancel_task   re   rb   )r_   rQ   returnrS   )r_   rP   rj   rS   )r_   rR   rj   rS   )r_   rO   rj   rS   )r"   r   	mcp.typesrO   rP   rQ   rR   rS   fastmcp.server.tasks.requestsrT   rU   rV   rW   _mcp_serverrequest_handlers)r   r   rO   rP   rQ   rR   ra   rd   rg   ri   rS   rT   rU   rV   rW   s   `         @@@@@r   _setup_task_protocol_handlersz+LifespanMixin._setup_task_protocol_handlers   s     	D"$	
 	
	
 	
	(
	(
	(	( =L)).9" 	))*?@ ?P))*:;?Q))*;<r   N)r   r   rj   zDocket | None)r   r   rj   zAsyncIterator[None])r   r   rj   None)
__name__
__module____qualname____doc__propertyr   r   r?   rM   ro    r   r   r   r      sH    N  c0 c0J % %4;Rr   r   )rt   
__future__r   r1   r$   collections.abcr   
contextlibr   r   r   typingr   r	   uncalled_forr
   r,   fastmcp.utilities.loggingr   r   r   fastmcp.server.serverr   rq   r*   r   rv   r   r   <module>r~      sG    A "   ) D D % &  0-	H	GR GRr   