
    "<i              
       f    d Z ddlmZmZ dededededef
dZd	edeeef         fd
Zd	edefdZdS )a  Task key management for SEP-1686 background tasks.

Task keys encode security scoping and metadata in the Docket key format:
    {session_id}:{client_task_id}:{task_type}:{component_identifier}

This format provides:
- Session-based security scoping (prevents cross-session access)
- Task type identification (tool/prompt/resource)
- Component identification (name or URI for result conversion)
    )quoteunquote
session_idclient_task_id	task_typecomponent_identifierreturnc                 >    t          |d          }|  d| d| d| S )a  Build Docket task key with embedded metadata.

    Format: {session_id}:{client_task_id}:{task_type}:{component_identifier}

    The component_identifier is URI-encoded to handle special characters (colons, slashes, etc.).

    Args:
        session_id: Session ID for security scoping
        client_task_id: Client-provided task ID
        task_type: Type of task ("tool", "prompt", "resource")
        component_identifier: Tool name, prompt name, or resource URI

    Returns:
        Encoded task key for Docket

    Examples:
        >>> build_task_key("session123", "task456", "tool", "my_tool")
        'session123:task456:tool:my_tool'

        >>> build_task_key("session123", "task456", "resource", "file://data.txt")
        'session123:task456:resource:file%3A%2F%2Fdata.txt'
     )safe:)r   )r   r   r   r   encoded_identifiers        /Users/kimhansen/Desktop/03 Workspace/ceo-agents/chl-effectiveness/mcp-servers/whoop/.venv/lib/python3.11/site-packages/fastmcp/server/tasks/keys.pybuild_task_keyr      s=    8 3"===LL>LLILL8JLLL    task_keyc                     |                      dd          }t          |          dk    rt          d|  d          |d         |d         |d         t          |d                   d	S )
a{  Parse Docket task key to extract metadata.

    Args:
        task_key: Encoded task key from Docket

    Returns:
        Dict with keys: session_id, client_task_id, task_type, component_identifier

    Examples:
        >>> parse_task_key("session123:task456:tool:my_tool")
        {'session_id': 'session123', 'client_task_id': 'task456',
         'task_type': 'tool', 'component_identifier': 'my_tool'}

        >>> parse_task_key("session123:task456:resource:file%3A%2F%2Fdata.txt")
        {'session_id': 'session123', 'client_task_id': 'task456',
         'task_type': 'resource', 'component_identifier': 'file://data.txt'}
    r         zInvalid task key format: zL. Expected: {session_id}:{client_task_id}:{task_type}:{component_identifier}r         )r   r   r   r   )splitlen
ValueErrorr   )r   partss     r   parse_task_keyr   /   s    $ NN3""E
5zzQb b b b
 
 	
 Ah(1X 'a 1 1	  r   c                 :    |                      dd          d         S )a  Extract just the client task ID from a task key.

    Args:
        task_key: Full encoded task key

    Returns:
        Client-provided task ID (second segment)

    Example:
        >>> get_client_task_id_from_key("session123:task456:tool:my_tool")
        'task456'
    r   r   r   )r   )r   s    r   get_client_task_id_from_keyr   P   s     >>#q!!!$$r   N)	__doc__urllib.parser   r   strr   dictr   r    r   r   <module>r$      s   	 	 ( ' ' ' ' ' ' 'MMM M 	M
 	M M M M@S T#s(^    B%# %# % % % % % %r   