
    Gj                         S r SSKJr  SSKJrJrJr  SSKJr  SSK	J
r
  \(       a  SSKJr  \" S\R                  S9r " S	 S
5      rg)a  
Experimental client-side task support.

This module provides client methods for interacting with MCP tasks.

WARNING: These APIs are experimental and may change without notice.

Example:
    # Call a tool as a task
    result = await session.experimental.call_tool_as_task("tool_name", {"arg": "value"})
    task_id = result.task.taskId

    # Get task status
    status = await session.experimental.get_task(task_id)

    # Get task result when complete
    if status.status == "completed":
        result = await session.experimental.get_task_result(task_id, CallToolResult)

    # List all tasks
    tasks = await session.experimental.list_tasks()

    # Cancel a task
    await session.experimental.cancel_task(task_id)
    )AsyncIterator)TYPE_CHECKINGAnyTypeVarN)poll_until_terminal)ClientSessionResultT)boundc                   J   \ rS rSrSrSS jr SSSS.S\S	\\\4   S-  S
\	S\\\4   S-  S\
R                  4
S jjjrS\S\
R                  4S jrS\S\\   S\4S jr SS\S-  S\
R$                  4S jjrS\S\
R(                  4S jrS\S\\
R                     4S jrSrg)ExperimentalClientFeatures'   z
Experimental client features for tasks and other experimental APIs.

WARNING: These APIs are experimental and may change without notice.

Access via session.experimental:
    status = await session.experimental.get_task(task_id)
returnNc                     Xl         g N_session)selfsessions     _/Users/admin/workspace/tools/venv/lib/python3.13/site-packages/mcp/client/experimental/tasks.py__init__#ExperimentalClientFeatures.__init__1   s        i`  )ttlmetaname	argumentsr   r   c                V  #    SnUb   [         R                  R                  " S0 UD6nU R                  R	                  [         R
                  " [         R                  " [         R                  " UU[         R                  " US9US9S95      [         R                  5      I Sh  vN $  N7f)a  Call a tool as a task, returning a CreateTaskResult for polling.

This is a convenience method for calling tools that support task execution.
The server will return a task reference instead of the immediate result,
which can then be polled via `get_task()` and retrieved via `get_task_result()`.

Args:
    name: The tool name
    arguments: Tool arguments
    ttl: Task time-to-live in milliseconds (default: 60000 = 1 minute)
    meta: Optional metadata to include in the request

Returns:
    CreateTaskResult containing the task reference

Example:
    # Create task
    result = await session.experimental.call_tool_as_task(
        "long_running_tool", {"input": "data"}
    )
    task_id = result.task.taskId

    # Poll for completion
    while True:
        status = await session.experimental.get_task(task_id)
        if status.status == "completed":
            break
        await asyncio.sleep(0.5)

    # Get result
    final = await session.experimental.get_task_result(task_id, CallToolResult)
N)r   )r   r   task_metaparams )
typesRequestParamsMetar   send_requestClientRequestCallToolRequestCallToolRequestParamsTaskMetadataCreateTaskResult)r   r   r   r   r   r   s         r   call_tool_as_task,ExperimentalClientFeatures.call_tool_as_task4   s     P 26'',,4t4E]]//%% 66!"+"//C8#		 ""
 
 	
 
s   B B)"B'#B)task_idc           
         #    U R                   R                  [        R                  " [        R                  " [        R
                  " US9S95      [        R                  5      I Sh  vN $  N7f)z
Get the current status of a task.

Args:
    task_id: The task identifier

Returns:
    GetTaskResult containing the task status and metadata
taskIdr    N)r   r&   r#   r'   GetTaskRequestGetTaskRequestParamsGetTaskResultr   r.   s     r   get_task#ExperimentalClientFeatures.get_taskn   s]      ]]//$$ 55WE
 
 
 	
 
   A&A/(A-)A/result_typec           
         #    U R                   R                  [        R                  " [        R                  " [        R
                  " US9S95      U5      I Sh  vN $  N7f)ah  
Get the result of a completed task.

The result type depends on the original request type:
- tools/call tasks return CallToolResult
- Other request types return their corresponding result type

Args:
    task_id: The task identifier
    result_type: The expected result type (e.g., CallToolResult)

Returns:
    The task result, validated against result_type
r0   r    N)r   r&   r#   r'   GetTaskPayloadRequestGetTaskPayloadRequestParams)r   r.   r9   s      r   get_task_result*ExperimentalClientFeatures.get_task_result   sW     & ]]//++ <<GL
 
 
 	
 
s   AA!AA!cursorc                    #    U(       a  [         R                  " US9OSnU R                  R                  [         R                  " [         R
                  " US95      [         R                  5      I Sh  vN $  N7f)z
List all tasks.

Args:
    cursor: Optional pagination cursor

Returns:
    ListTasksResult containing tasks and optional next cursor
)r?   Nr    )r#   PaginatedRequestParamsr   r&   r'   ListTasksRequestListTasksResult)r   r?   r!   s      r   
list_tasks%ExperimentalClientFeatures.list_tasks   se      AG--V<D]]//&&f5 !!	
 
 	
 
s   A1A:3A84A:c           
         #    U R                   R                  [        R                  " [        R                  " [        R
                  " US9S95      [        R                  5      I Sh  vN $  N7f)z{
Cancel a running task.

Args:
    task_id: The task identifier

Returns:
    CancelTaskResult with the updated task state
r0   r    N)r   r&   r#   r'   CancelTaskRequestCancelTaskRequestParamsCancelTaskResultr5   s     r   cancel_task&ExperimentalClientFeatures.cancel_task   s]      ]]//'' 88H
 ""
 
 	
 
r8   c                ^   #    [        U R                  U5        Sh  vN nU7v   M   N
 g7f)a  
Poll a task until it reaches a terminal status.

Yields GetTaskResult for each poll, allowing the caller to react to
status changes (e.g., handle input_required). Exits when task reaches
a terminal status (completed, failed, cancelled).

Respects the pollInterval hint from the server.

Args:
    task_id: The task identifier

Yields:
    GetTaskResult for each poll

Example:
    async for status in session.experimental.poll_task(task_id):
        print(f"Status: {status.status}")
        if status.status == "input_required":
            # Handle elicitation request via tasks/result
            pass

    # Task is now terminal, get the result
    result = await session.experimental.get_task_result(task_id, CallToolResult)
N)r   r6   )r   r.   statuss      r   	poll_task$ExperimentalClientFeatures.poll_task   s)     4 0wG 	&L	Gs   -+)+-+-r   )r   r   r   Nr   )__name__
__module____qualname____firstlineno____doc__r   strdictr   intr#   r+   r,   r4   r6   typer	   r=   rC   rD   rI   rJ   r   rN   __static_attributes__r"   r   r   r   r   '   s     ,08

 &*8
8
 S>D(8

 8
 38nt#8
 
		8
t
c 
e.A.A 
&

 ']
 
	
< "
d

 
		
*
 
1G1G 
&s }U=P=P/Q r   r   )rT   collections.abcr   typingr   r   r   	mcp.typesr#   %mcp.shared.experimental.tasks.pollingr   mcp.client.sessionr   Resultr	   r   r"   r   r   <module>r`      s=   4 * . .  E0
)5<<
0y yr   