
    i                        d Z ddlmZ ddlmZmZ ddlZddlmZ er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 ddlmZ  ee      Z G d	 d
      Zy)z+Task management methods for FastMCP Client.    )annotations)TYPE_CHECKINGAnyN)McpError)Client)
CancelTaskRequestCancelTaskRequestParamsGetTaskPayloadRequestGetTaskPayloadRequestParamsGetTaskPayloadResultGetTaskRequestGetTaskRequestParamsGetTaskResultListTasksRequestPaginatedRequestParams)
get_loggerc                  D    e Zd ZdZddZddZ	 	 d		 	 	 	 	 	 	 d
dZddZy)ClientTaskManagementMixinz3Mixin providing task management methods for Client.c                   K   t        t        |            }| j                  | j                  j	                  |t
                     d{   S 7 w)a  Query the status of a background task.

        Sends a 'tasks/get' MCP protocol request over the existing transport.

        Args:
            task_id: The task ID returned from call_tool_as_task

        Returns:
            GetTaskResult: Status information including taskId, status, pollInterval, etc.

        Raises:
            RuntimeError: If client not connected
            McpError: If the request results in a TimeoutError | JSONRPCError
        taskIdparamsrequestresult_typeN)r   r   _await_with_session_monitoringsessionsend_requestr   selftask_idr   s      u/Users/bowang/.openclaw/workspace/ChatDev/.venv/lib/python3.12/site-packages/fastmcp/client/mixins/task_management.pyget_task_statusz)ClientTaskManagementMixin.get_task_status!   sR      !(<G(LM88LL%%) & 
 
 	
 
s   A
AAAc                   K   t        t        |            }| j                  | j                  j	                  |t
                     d{   }|j                  dd      S 7 w)a9  Retrieve the raw result of a completed background task.

        Sends a 'tasks/result' MCP protocol request over the existing transport.
        Returns the raw result - callers should parse it appropriately.

        Args:
            task_id: The task ID returned from call_tool_as_task

        Returns:
            Any: The raw result (could be tool, prompt, or resource result)

        Raises:
            RuntimeError: If client not connected, task not found, or task failed
            McpError: If the request results in a TimeoutError | JSONRPCError
        r   r   r   NT)exclude_noneby_alias)r
   r   r   r   r   r   
model_dump)r!   r"   r   results       r#   get_task_resultz)ClientTaskManagementMixin.get_task_result8   sk       (.g>
 ::LL%%0 & 
 
   dT BB
s   A
A&A$A&Nc                  K   t        ||      }t        |      }| j                  | j                  j	                  |t
        j                  j                               d{   }|j                  r|j                  d      S g }t        | j                        d| D ]=  }	 | j                  |       d{   }|j                  |j                  d             ? |ddS 7 7 .# t        $ r Y Tw xY ww)a  List background tasks.

        Sends a 'tasks/list' MCP protocol request to the server. If the server
        returns an empty list (indicating client-side tracking), falls back to
        querying status for locally tracked task IDs.

        Args:
            cursor: Optional pagination cursor
            limit: Maximum number of tasks to return (default 50)

        Returns:
            dict: Response with structure:
                - tasks: List of task status dicts with taskId, status, etc.
                - nextCursor: Optional cursor for next page

        Raises:
            RuntimeError: If client not connected
            McpError: If the request results in a TimeoutError | JSONRPCError
        )cursorlimitr   r   NT)r'   )tasks
nextCursor)r   r   r   r   r   mcptypesListTasksResultr.   r(   list_submitted_task_idsr$   appendr   )	r!   r,   r-   r   r   server_responser.   r"   statuss	            r#   
list_tasksz$ClientTaskManagementMixin.list_tasksU   s     2 (vUC"&1 $ C CLL%%II55 & !
 
   "--t-<< D445fu=G#33G<<V...=> > d33+
 = sH   A!C8#C%$?C8$C)8C'9%C)C8'C))	C52C84C55C8c                   K   t        t        |            }| j                  | j                  j	                  |t
        j                  j                               d{   S 7 w)a  Cancel a task, transitioning it to cancelled state.

        Sends a 'tasks/cancel' MCP protocol request. Task will halt execution
        and transition to cancelled state.

        Args:
            task_id: The task ID to cancel

        Returns:
            CancelTaskResult: The task status showing cancelled state

        Raises:
            RuntimeError: If task doesn't exist
            McpError: If the request results in a TimeoutError | JSONRPCError
        r   r   r   N)r   r	   r   r   r   r0   r1   CancelTaskResultr    s      r#   cancel_taskz%ClientTaskManagementMixin.cancel_task   s\       $+B'+RS88LL%%II66 & 
 
 	
 
s   AA' A%!A')r!   r   r"   strreturnr   )r!   r   r"   r<   r=   r   )N2   )r!   r   r,   z
str | Noner-   intr=   zdict[str, Any])r!   r   r"   r<   r=   zmcp.types.CancelTaskResult)__name__
__module____qualname____doc__r$   r*   r8   r;        r#   r   r      sG    =
.C> "040404 04 
	04d
rE   r   )rC   
__future__r   typingr   r   	mcp.typesr0   r   fastmcp.client.clientr   r   r	   r
   r   r   r   r   r   r   r   fastmcp.utilities.loggingr   r@   loggerr   rD   rE   r#   <module>rL      sD    1 " %  ,   1	H	
 
rE   