o
    c۷ik                     @   s   d Z ddlmZ ddlmZ ddlmZmZ ddl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 eG dd dZdS )z
TaskSupport - Configuration for experimental task support.

This module provides the TaskSupport class which encapsulates all the
infrastructure needed for task-augmented requests: store, queue, and handler.
    )AsyncIterator)asynccontextmanager)	dataclassfieldN)	TaskGroup)TaskResultHandler)ServerSession)InMemoryTaskStore)InMemoryTaskMessageQueueTaskMessageQueue)	TaskStorec                   @   s   e Zd ZU dZeed< eed< eddZe	ed< edddZ
edB ed	< dddZed
efddZed
ed fddZded
dfddZedddZdS )TaskSupporta  
    Configuration for experimental task support.

    Encapsulates the task store, message queue, result handler, and task group
    for spawning background work.

    When enabled on a server, this automatically:
    - Configures response routing for each session
    - Provides default handlers for task operations
    - Manages a task group for background task execution

    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),
        )
    storequeueF)inithandlerN)r   default_task_groupreturnc                 C   s   t | j| j| _dS )z/Create the result handler from store and queue.N)r   r   r   r   self r   Z/home/ubuntu/vllm_env/lib/python3.10/site-packages/mcp/server/experimental/task_support.py__post_init__3   s   zTaskSupport.__post_init__c                 C   s   | j du r	td| j S )zGet the task group for spawning background work.

        Raises:
            RuntimeError: If not within a run() context
        Nz7TaskSupport not running. Ensure Server.run() is active.)r   RuntimeErrorr   r   r   r   
task_group7   s   
zTaskSupport.task_groupc              	   C  sd   t  4 I dH }|| _zdV  W d| _nd| _w W d  I dH  dS 1 I dH s+w   Y  dS )a"  
        Run the task support lifecycle.

        This creates a task group for spawning background task work.
        Called automatically by Server.run().

        Usage:
            async with task_support.run():
                # Task group is now available
                ...
        N)anyiocreate_task_groupr   )r   tgr   r   r   runB   s   .zTaskSupport.runsessionc                 C   s   | | j dS )ao  
        Configure a session for task support.

        This registers the result handler as a response router so that
        responses to queued requests (elicitation, sampling) are routed
        back to the waiting resolvers.

        Called automatically by Server.run() for each new session.

        Args:
            session: The session to configure
        N)add_response_routerr   )r   r    r   r   r   configure_sessionV   s   zTaskSupport.configure_sessionc                 C   s   | t  t dS )a  
        Create in-memory task support.

        Suitable for development, testing, and single-process servers.
        For distributed systems, provide custom store and queue implementations.

        Returns:
            TaskSupport configured with in-memory store and queue
        )r   r   )r	   r
   )clsr   r   r   	in_memorye   s   zTaskSupport.in_memory)r   N)r   r   )__name__
__module____qualname____doc__r   __annotations__r   r   r   r   r   r   r   propertyr   r   r   r   r   r"   classmethodr$   r   r   r   r   r      s   
 

r   )r(   collections.abcr   
contextlibr   dataclassesr   r   r   	anyio.abcr   +mcp.server.experimental.task_result_handlerr   mcp.server.sessionr   2mcp.shared.experimental.tasks.in_memory_task_storer	   +mcp.shared.experimental.tasks.message_queuer
   r   #mcp.shared.experimental.tasks.storer   r   r   r   r   r   <module>   s    