§
    öŽ’j™  ã                   óž   — d Z ddlmZ ddlmZmZmZmZmZm	Z	 dedz  de
fd„Zdedz  dee         dz  d	e	dz  ddfd
„Zdee         ddfd„ZdS )z»
Shared validation functions for server requests.

This module provides validation logic for sampling and elicitation requests
that is shared across normal and task-augmented code paths.
é    )ÚMcpError)ÚINVALID_PARAMSÚClientCapabilitiesÚ	ErrorDataÚSamplingMessageÚToolÚ
ToolChoiceÚclient_capsNÚreturnc                 ó<   — | €dS | j         €dS | j         j        €dS dS )zÒ
    Check if the client supports sampling tools capability.

    Args:
        client_caps: The client's declared capabilities

    Returns:
        True if client supports sampling.tools, False otherwise
    NFT)ÚsamplingÚtools)r
   s    úCC:\Projects\DSCons\.venv\Lib\site-packages\mcp\server\validation.pyÚcheck_sampling_tools_capabilityr      s3   € ð ÐØˆuØÔÐ#ØˆuØÔÔ!Ð)ØˆuØˆ4ó    r   Útool_choicec                 óv   — |€|�4t          | ¦  «        s#t          t          t          d¬¦  «        ¦  «        ‚dS dS )a\  
    Validate that the client supports sampling tools if tools are being used.

    Args:
        client_caps: The client's declared capabilities
        tools: The tools list, if provided
        tool_choice: The tool choice setting, if provided

    Raises:
        McpError: If tools/tool_choice are provided but client doesn't support them
    Nz1Client does not support sampling tools capability)ÚcodeÚmessage)r   r   r   r   )r
   r   r   s      r   Úvalidate_sampling_toolsr   &   s[   € ð  Ð˜KÐ3Ý.¨{Ñ;Ô;ð 	ÝÝÝ'ØOðñ ô ñô ð ð	ð 	ð 4Ð3r   Úmessagesc                 óÖ  — | sdS | d         j         }t          d„ |D ¦   «         ¦  «        }t          | ¦  «        dk    r| d         j         nd}|ot          d„ |D ¦   «         ¦  «        }|rJt          d„ |D ¦   «         ¦  «        rt          d¦  «        ‚|€t          d	¦  «        ‚|st          d
¦  «        ‚|r/|r/d„ |D ¦   «         }d„ |D ¦   «         }||k    rt          d¦  «        ‚dS dS dS )a  
    Validate tool_use/tool_result message structure per SEP-1577.

    This validation ensures:
    1. Messages with tool_result content contain ONLY tool_result content
    2. tool_result messages are preceded by a message with tool_use
    3. tool_result IDs match the tool_use IDs from the previous message

    See: https://github.com/modelcontextprotocol/modelcontextprotocol/issues/1577

    Args:
        messages: The list of sampling messages to validate

    Raises:
        ValueError: If the message structure is invalid
    Néÿÿÿÿc              3   ó,   K  — | ]}|j         d k    V — ŒdS ©Útool_resultN©Útype©Ú.0Úcs     r   ú	<genexpr>z4validate_tool_use_result_messages.<locals>.<genexpr>U   s)   è è € ÐIÐI°q˜1œ6 ]Ò2ÐIÐIÐIÐIÐIÐIr   é   éþÿÿÿc              3   ó,   K  — | ]}|j         d k    V — ŒdS )Útool_useNr   r   s     r   r"   z4validate_tool_use_result_messages.<locals>.<genexpr>X   s)   è è € Ð4dÐ4dÈa°Q´V¸zÒ5IÐ4dÐ4dÐ4dÐ4dÐ4dÐ4dr   c              3   ó,   K  — | ]}|j         d k    V — ŒdS r   r   r   s     r   r"   z4validate_tool_use_result_messages.<locals>.<genexpr>]   s)   è è € Ð=Ð=¨1ˆqŒv˜Ò&Ð=Ð=Ð=Ð=Ð=Ð=r   zHThe last message must contain only tool_result content if any is presentz;tool_result requires a previous message containing tool_usezDtool_result blocks do not match any tool_use in the previous messagec                 ó2   — h | ]}|j         d k    ¯|j        ’ŒS )r&   )r   Úidr   s     r   ú	<setcomp>z4validate_tool_use_result_messages.<locals>.<setcomp>e   s&   € ÐOÐOÐO ¸!¼&ÀJÒ:NÐ:N˜œÐ:NÐ:NÐ:Nr   c                 ó2   — h | ]}|j         d k    ¯|j        ’ŒS )r   )r   Ú	toolUseIdr   s     r   r*   z4validate_tool_use_result_messages.<locals>.<setcomp>f   s&   € ÐXÐXÐX¨1ÀÄÈ-Ò@WÐ@W˜1œ;Ð@WÐ@WÐ@Wr   zPids of tool_result blocks and tool_use blocks from previous message do not match)Úcontent_as_listÚanyÚlenÚ
ValueError)r   Úlast_contentÚhas_tool_resultsÚprevious_contentÚhas_previous_tool_useÚtool_use_idsÚtool_result_idss          r   Ú!validate_tool_use_result_messagesr7   @   sY  € ð" ð Øˆà˜B”<Ô/€LÝÐIÐI¸LÐIÑIÔIÑIÔIÐå7:¸8±}´}ÈÒ7IÐ7I�x ”|Ô3Ð3ÈtÐØ,ÐdµÐ4dÐ4dÐScÐ4dÑ4dÔ4dÑ1dÔ1dÐàð eõ Ð=Ð=°Ð=Ñ=Ô=Ñ=Ô=ð 	iÝÐgÑhÔhÐhØÐ#ÝÐZÑ[Ô[Ð[Ø$ð 	eÝÐcÑdÔdÐdàð qÐ!1ð qØOÐOÐ&6ÐOÑOÔOˆØXÐX°ÐXÑXÔXˆØ˜?Ò*Ð*ÝÐoÑpÔpÐpð	qð qð qð qð +Ð*r   )Ú__doc__Úmcp.shared.exceptionsr   Ú	mcp.typesr   r   r   r   r   r	   Úboolr   Úlistr   r7   © r   r   ú<module>r>      s  ððð ð +Ð *Ð *Ð *Ð *Ð *ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ðÐ1CÀdÑ1Jð Ètð ð ð ð ð&Ø# dÑ*ðà�Œ:˜Ñðð ˜dÑ"ðð 
ð	ð ð ð ð4(q°°_Ô0Eð (qÈ$ð (qð (qð (qð (qð (qð (qr   