§
    ÜŽ’jØ  ã                  ó  — d Z ddlmZ ddlZddlmZmZmZmZ ddl	m
Z
 ddlmZmZ dd	lmZ dd
lmZ ddlmZmZ ddlmZ g d¢Z G d„ de
¦  «        Z G d„ de
¦  «        Z ede¬¦  «        Zd2d„Zd3d„Zd4d#„Zd5d%„Zd6d)„Z d7d-„Z!d8d1„Z"dS )9a=  Shared tool-dispatch helpers for the tool runners.

Both ``client.beta.messages.tool_runner`` (the Messages tool runner) and
``client.beta.sessions.events.tool_runner`` (the sessions-side
:class:`~anthropic.lib.tools._beta_session_runner.SessionToolRunner`) do the
same three small things: index the supplied tools by name, run a runnable tool
over a JSON input, and turn an exception raised by a tool into tool-result
content. Those steps are factored out here so the two runners stay consistent
instead of each carrying its own copy. Consumed by the runner helpers only.
é    )ÚannotationsN)ÚUnionÚTypeVarÚIterableÚ	Awaitable)ÚProtocolé   )Ú	ToolErrorÚBetaFunctionToolResultTypeé   )ÚBetaMessageParam)ÚBetaContentBlockParam)ÚToolÚ BetaRequestToolRemovalBlockParam)Ú!BetaRequestToolAdditionBlockParam)Útool_registryÚtool_error_contentÚrun_runnable_toolÚavailable_tool_namesc                  ó*   — e Zd ZdZedd„¦   «         ZdS )Ú
_NamedTooluH   Anything with a ``name`` â€” the shape :func:`tool_registry` indexes on.ÚreturnÚstrc                ó   — d S ©N© )Úselfs    úPC:\Projects\DSCons\.venv\Lib\site-packages\anthropic\lib\tools\_tool_dispatch.pyÚnamez_NamedTool.name!   s   € Ø˜3ó    N)r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úpropertyr   r   r    r   r   r      s,   € € € € € ØRÐRàØÐÐñ „XØÐÐr    r   c                  ó   — e Zd ZdZdd„ZdS )	Ú_CallableToolzhA runnable tool: ``call`` may be sync or async (it returns either the
    result or an awaitable of it).ÚinputÚobjectr   úHUnion[BetaFunctionToolResultType, Awaitable[BetaFunctionToolResultType]]c                ó   — d S r   r   )r   r(   s     r   Úcallz_CallableTool.call)   s   € € € r    N)r(   r)   r   r*   )r!   r"   r#   r$   r,   r   r    r   r'   r'   %   s)   € € € € € ð&ð &ð sÐrÐrÐrÐrÐrr    r'   Ú
NamedToolT)ÚboundÚtoolsúIterable[NamedToolT]r   údict[str, NamedToolT]c                ó   — d„ | D ¦   «         S )z“Index ``tools`` by their ``name`` for O(1) dispatch lookup.

    On a duplicate name the later tool wins, matching a plain dict comprehension.
    c                ó   — i | ]
}|j         |“ŒS r   )r   )Ú.0Útools     r   ú
<dictcomp>z!tool_registry.<locals>.<dictcomp>4   s   € Ð.Ð.Ð. ˆDŒI�tÐ.Ð.Ð.r    r   )r/   s    r   r   r   /   s   € ð
 /Ð.¨Ð.Ñ.Ô.Ð.r    ÚmessagesúIterable[BetaMessageParam]Ú
tool_namesúIterable[str]úset[str]c                ó¬   — t          |¦  «        }| D ]A}|d         }|d         dk    st          |t          ¦  «        rŒ,|D ]}t          ||¦  «         ŒŒB|S )uv  Fold mid-conversation ``tool_removal`` / ``tool_addition`` blocks over
    the locally runnable ``tool_names``.

    Only ``role: "system"`` messages carry these blocks, and only a
    ``tool_reference`` can name a locally runnable tool â€” MCP references are
    executed server-side, so they (and any unknown block/reference type) are
    ignored rather than raising.
    ÚcontentÚroleÚsystem)ÚsetÚ
isinstancer   Ú_apply_tool_change)r7   r9   Ú	availableÚmessager=   Úblocks         r   r   r   7   sv   € õ �J‘”€IØð 1ð 1ˆØ˜)Ô$ˆØ�6Œ?˜hÒ&Ð&­*°W½cÑ*BÔ*BÐ&ØØð 	1ð 	1ˆEÝ˜u iÑ0Ô0Ð0Ð0ð	1àÐr    rE   r   rC   ÚNonec                ó
  — t          | t          ¦  «        sdS | d         dk    s| d         dk    rt          | |¦  «         dS | d         dk    r5| d         D ]*}|d         dk    s|d         dk    rt          ||¦  «         Œ+dS dS )a6  Apply a single ``tool_removal`` / ``tool_addition`` block to ``available``.

    A ``mid_conv_system`` block's ``content`` is limited by the API schema to
    ``text`` / ``tool_addition`` / ``tool_removal``, so exactly one level is
    walked (no deeper nesting exists); every other block type is a no-op.
    NÚtypeÚtool_removalÚtool_additionÚmid_conv_systemr=   )rA   ÚdictÚ_apply_tool_reference_change)rE   rC   Úinners      r   rB   rB   J   s³   € õ �e�TÑ"Ô"ð ð 	ˆØˆV„}˜Ò&Ð&¨%°¬-¸?Ò*JÐ*JÝ$ U¨IÑ6Ô6Ð6Ð6Ð6Ø	ˆvŒÐ+Ò	+Ð	+Ø˜9Ô%ð 	?ð 	?ˆEà�VŒ} Ò.Ð.°%¸´-À?Ò2RÐ2RÝ,¨U°IÑ>Ô>Ð>øð	?ð 	?ð
 	ˆr    úJUnion[BetaRequestToolRemovalBlockParam, BetaRequestToolAdditionBlockParam]c                ó¨   — t          | d         ¦  «        }|€dS | d         dk    r|                     |¦  «         dS |                     |¦  «         dS )zGFold one ``tool_removal`` / ``tool_addition`` block into ``available``.r5   NrH   rI   )Ú_referenced_tool_nameÚdiscardÚadd)rE   rC   r   s      r   rM   rM   a   s`   € õ !  v¤Ñ/Ô/€DØ€|ØˆØˆV„}˜Ò&Ð&Ø×Ò˜$ÑÔÐÐÐà�Š�dÑÔÐÐÐr    ÚrefÚ_ToolChangeReferenceú
str | Nonec                ó.   — | d         dk    r| d         S dS )a1  The locally runnable tool name a tool-change reference resolves to.

    Only ``tool_reference`` names a runnable tool; ``mcp_tool_reference`` /
    ``mcp_toolset_reference`` execute server-side and unknown reference types
    are ignored (forward compatibility), so all of those resolve to ``None``.
    rH   Útool_referencer   Nr   )rT   s    r   rQ   rQ   n   s#   € ð ˆ6„{Ð&Ò&Ð&Ø�6Œ{ÐØˆ4r    ÚexcÚBaseExceptionr   c                óX   — t          | t          ¦  «        r| j        S t          | ¦  «        S )a  Render an exception raised by a tool as tool-result content.

    A :class:`ToolError` carries its own structured content; anything else is
    rendered with ``repr`` (which, unlike ``str``, keeps the exception type).
    The caller owns the ``is_error`` flag and any logging.
    )rA   r
   r=   Úrepr)rY   s    r   r   r   z   s*   € õ �#•yÑ!Ô!ð ØŒ{ÐÝ�‰9Œ9Ðr    r5   r(   údict[str, object]c              ƒ  ól   K  — |                       |¦  «        }t          j        |¦  «        r|ƒ d{V —†S |S )a  Call ``tool`` with ``input``, awaiting the result if the tool is async.

    Bridges the sync (:class:`~anthropic.lib.tools.BetaFunctionTool`) and async
    (:class:`~anthropic.lib.tools.BetaAsyncFunctionTool`) runnable-tool shapes
    behind a single ``await``.
    N)r,   ÚinspectÚisawaitable)r5   r(   Úresults      r   r   r   †   sC   è è € ð �YŠY�uÑÔ€FÝÔ˜6Ñ"Ô"ð Øˆ|ˆ|ˆ|ˆ|ˆ|ˆ|ÐØ€Mr    )r/   r0   r   r1   )r7   r8   r9   r:   r   r;   )rE   r   rC   r;   r   rF   )rE   rO   rC   r;   r   rF   )rT   rU   r   rV   )rY   rZ   r   r   )r5   r'   r(   r]   r   r   )#r$   Ú
__future__r   r_   Útypingr   r   r   r   Útyping_extensionsr   Ú_beta_functionsr
   r   Útypes.beta.beta_message_paramr   Ú#types.beta.beta_content_block_paramr   Ú0types.beta.beta_request_tool_removal_block_paramr   rU   r   Ú1types.beta.beta_request_tool_addition_block_paramr   Ú__all__r   r'   r-   r   r   rB   rM   rQ   r   r   r   r    r   ú<module>rk      sî  ðð	ð 	ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø &Ð &Ð &Ð &Ð &Ð &à BÐ BÐ BÐ BÐ BÐ BÐ BÐ BØ =Ð =Ð =Ð =Ð =Ð =Ø HÐ HÐ HÐ HÐ HÐ Hðð ð ð ð ð ð ð ð cÐ bÐ bÐ bÐ bÐ bà
^Ð
^Ð
^€ðð ð ð ð �ñ ô ð ðsð sð sð sð s�Hñ sô sð sð ˆW�\¨Ð4Ñ4Ô4€
ð/ð /ð /ð /ðð ð ð ð&ð ð ð ð.
ð 
ð 
ð 
ð	ð 	ð 	ð 	ð	ð 	ð 	ð 	ð
ð 
ð 
ð 
ð 
ð 
r    