§
    ÷žyj¸+  ã                  ó²   — d Z ddlmZ ddlZddlmZmZmZ  eh d£¦  «        Z	 eh d£¦  «        Z
 eh d£¦  «        Zddd„Zdd„Zdd„Zdd„Zdd„Zdd„ZdS ) uœ  Helpers for translating OpenAI-style tool schemas to Moonshot's schema subset.

Moonshot (Kimi) accepts a stricter subset of JSON Schema than standard OpenAI
tool calling.  Requests that violate it fail with HTTP 400:

    tools.function.parameters is not a valid moonshot flavored json schema,
    details: <...>

Known rejection modes documented at
https://forum.moonshot.ai/t/tool-calling-specification-violation-on-moonshot-api/102
and MoonshotAI/kimi-cli#1595:

1. Every property schema must carry a ``type``.  Standard JSON Schema allows
   type to be omitted (the value is then unconstrained); Moonshot refuses.
2. When ``anyOf`` is used, ``type`` must be on the ``anyOf`` children, not
   the parent.  Presence of both causes "type should be defined in anyOf
   items instead of the parent schema".
3. Every object schema must carry a ``required`` array, even an empty one.
   Standard JSON Schema allows omitting it; Moonshot 400s with
   "required must be an array".

The ``#/definitions/...`` â†’ ``#/$defs/...`` rewrite for draft-07 refs is
handled separately in ``tools/mcp_tool._normalize_mcp_input_schema`` so it
applies at MCP registration time for all providers.
é    )ÚannotationsN)ÚAnyÚDictÚList>   ú$defsÚ
propertiesÚdefinitionsÚpatternProperties>   ÚallOfÚanyOfÚoneOfÚprefixItems>   ÚnotÚitemsÚcontainsÚpropertyNamesÚadditionalPropertiesTÚnoder   Ú	is_schemaÚboolÚreturnc                ó  — t          | t          ¦  «        rd„ | D ¦   «         S t          | t          ¦  «        s| S i }|                      ¦   «         D ]±\  }}|t          v r7t          |t          ¦  «        r"d„ |                     ¦   «         D ¦   «         ||<   ŒE|t
          v r%t          |t          ¦  «        rd„ |D ¦   «         ||<   Œs|t          v r0t          |t          ¦  «        rt          |d¬¦  «        ||<   Œ¦|||<   Œ¬|||<   Œ²|s|S d|v rÃt          |d         t          ¦  «        r¨|                     dd¦  «         d	„ |d         D ¦   «         }|r|t          |¦  «        t          |d         ¦  «        k     rVt          |¦  «        d
k    r<d„ |                     ¦   «         D ¦   «         }| 
                    |d         ¦  «         |}n	||d<   |S |S |                     dd¦  «         d|vrt          |¦  «        }d|v rct          |d         t          ¦  «        rH|                     d¦  «        }|dv r/d„ |d         D ¦   «         }|r||d<   n|                     d¦  «         |                     d¦  «        dk    rt          |¦  «        }|S )a5  Recursively apply Moonshot repairs to a schema node.

    ``is_schema=True`` means this dict is a JSON Schema node and gets the
    missing-type + anyOf-parent repairs applied.  ``is_schema=False`` means
    it's a container map (e.g. the value of ``properties``) and we only
    recurse into its values.
    c                ó0   — g | ]}t          |d ¬¦  «        ‘ŒS ©T©r   ©Ú_repair_schema)Ú.0Úitems     ú;/home/ragecks/.hermes/hermes-agent/agent/moonshot_schema.pyú
<listcomp>z"_repair_schema.<locals>.<listcomp>7   s%   € ÐFÐFÐF¸•˜t¨tÐ4Ñ4Ô4ÐFÐFÐFó    c                ó8   — i | ]\  }}|t          |d ¬¦  «        “ŒS r   r   )r   Úsub_keyÚsub_vals      r    ú
<dictcomp>z"_repair_schema.<locals>.<dictcomp>B   s;   € ð ð ð á$�G˜Wð �¨¸4Ð@Ñ@Ô@ðð ð r"   c                ó0   — g | ]}t          |d ¬¦  «        ‘ŒS r   r   ©r   Úvs     r    r!   z"_repair_schema.<locals>.<listcomp>G   s%   € ÐNÐNÐNÀ1�^¨A¸Ð>Ñ>Ô>ÐNÐNÐNr"   Tr   r   ÚtypeNc                ón   — g | ]2}t          |t          ¦  «        r|                     d ¦  «        dk    ¯0|‘Œ3S )r*   Únull)Ú
isinstanceÚdictÚget)r   Úbs     r    r!   z"_repair_schema.<locals>.<listcomp>\   sL   € ð Hð Hð H˜!Ý! !¥TÑ*Ô*ðHØ/0¯uªu°V©}¬}ÀÒ/FÐ/Fð Ø/FÐ/FÐ/Fr"   é   c                ó&   — i | ]\  }}|d k    ¯||“ŒS )r   © )r   Úkr)   s      r    r&   z"_repair_schema.<locals>.<dictcomp>d   s#   € ÐKÐKÐK¡$ ! Q¸aÀ7ºl¸l˜˜A¸l¸l¸lr"   r   Únullablez$refÚenum>   ÚnumberÚstringÚbooleanÚintegerc                ó"   — g | ]}|®|dk    ¯
|‘ŒS )NÚ r3   r(   s     r    r!   z"_repair_schema.<locals>.<listcomp>�   s,   € ð 5ð 5ð 5˜QØ˜-¨A°ªG¨Gð Ø,3¨G¨Gr"   Úobject)r-   Úlistr.   r   Ú_SCHEMA_MAP_KEYSÚ_SCHEMA_LIST_KEYSÚ_SCHEMA_NODE_KEYSr   ÚpopÚlenÚupdateÚ_fill_missing_typer/   Ú_ensure_required_array)	r   r   ÚrepairedÚkeyÚvalueÚnon_nullÚmergeÚ	node_typeÚcleaneds	            r    r   r   ,   s  € õ �$�ÑÔð Gð GÐFÀÐFÑFÔFÐFÝ�d�DÑ!Ô!ð Øˆð  "€HØ—j’j‘l”lð "ð "‰
ˆˆUØÕ"Ð"Ð"¥z°%½Ñ'>Ô'>Ð"ðð à(-¯ª©¬ðñ ô ˆH�S‰MˆMð Õ%Ð%Ð%­*°U½DÑ*AÔ*AÐ%ØNÐNÈÐNÑNÔNˆH�S‰MˆMØÕ%Ð%Ð%õ ˜%¥Ñ&Ô&ð &Ý .¨uÀÐ EÑ EÔ E�˜‘�à %�˜‘�ð "ˆH�S‰MˆMàð Øˆð �(ÐÐ�z¨(°7Ô*;½TÑBÔBÐØ�Š�V˜TÑ"Ô"Ð"ðHð H˜x¨Ô0ð Hñ Hô Hˆàð 	�˜H™œ­¨H°WÔ,=Ñ(>Ô(>Ò>Ð>õ
 �8‰}Œ} Ò!Ð!ØKÐK¨(¯.ª.Ñ*:Ô*:ÐKÑKÔK�Ø—’˜X aœ[Ñ)Ô)Ð)Ø ��à$,�˜Ñ!Ø�ð ˆOð ‡L‚L�˜TÑ"Ô"Ð"ð
 �XÐÐÝ% hÑ/Ô/ˆð �ÐÐ�j¨°&Ô)9½4Ñ@Ô@ÐØ—L’L Ñ(Ô(ˆ	ØÐBÐBÐBð5ð 5 (¨6Ô"2ð 5ñ 5ô 5ˆGàð %Ø#*�˜Ñ Ð à—’˜VÑ$Ô$Ð$ð ‡|‚|�FÑÔ˜xÒ'Ð'Ý)¨(Ñ3Ô3ˆà€Or"   úDict[str, Any]c                óÞ   ‡— |                       d¦  «        Š|                       d¦  «        }t          |t          ¦  «        r't          ‰t          ¦  «        rˆfd„|D ¦   «         | d<   ng | d<   | S )u¸  Guarantee an object schema carries a ``required`` array (Moonshot rule).

    Standard JSON Schema lets you omit ``required`` when nothing is required;
    Moonshot 400s on that ("required must be an array").  Ensure the key is a
    list.  When ``properties`` is known, prune ``required`` entries that don't
    name a real property â€” defensive against dangling names, which Moonshot
    also rejects.  Mutates and returns ``node``.
    r   Úrequiredc                ó   •— g | ]}|‰v ¯|‘Œ	S r3   r3   )r   ÚrÚpropss     €r    r!   z*_ensure_required_array.<locals>.<listcomp>œ   s   ø€ Ð=Ð=Ð= a°!°u°*°* °*°*°*r"   )r/   r-   r>   r.   )r   ÚreqrS   s     @r    rF   rF   �   sy   ø€ ð �HŠH�\Ñ"Ô"€EØ
�(Š(�:Ñ
Ô
€CÝ�#•tÑÔð Ý�e�TÑ"Ô"ð 	>Ø=Ð=Ð=Ð=¨3Ð=Ñ=Ô=ˆD�ÑøàˆˆZÑØ€Kr"   c                óö  — |                       d¦  «        }t          |t          ¦  «        r"t          d„ |D ¦   «         d¦  «        }i | ¥d|i¥S d| v r|dvr| S d| v sd| v sd| v rd}n�d	| v sd
| v rd}n‚d| v r|t          | d         t          ¦  «        ra| d         rY| d         d         }t          |t          ¦  «        rd}n5t          |t
          ¦  «        rd}nt          |t          ¦  «        rd}nd}nd}i | ¥d|i¥S )z9Infer a reasonable ``type`` if this schema node has none.r*   c              3  óL   K  — | ]}t          |t          ¦  «        ¯|d v¯|V — Œ dS )>   r<   r,   N)r-   Ústr)r   Úts     r    ú	<genexpr>z%_fill_missing_type.<locals>.<genexpr>§   s;   è è € ÐRÐR�1¥Z°µ3Ñ%7Ô%7ÐR¸AÀ\Ð<QÐ<QˆQÐ<QÐ<QÐ<QÐ<QÐRÐRr"   r8   >   Nr<   r   rP   r   r=   r   r   Úarrayr6   r   r9   r:   r7   )r/   r-   r>   Únextr   ÚintÚfloat)r   rL   ÚconcreteÚinferredÚsamples        r    rE   rE   ¢   sV  € à—’˜Ñ Ô €IÝ�)�TÑ"Ô"ð *ÝØRÐR˜	ÐRÑRÔRØñ
ô 
ˆð *�$Ð)˜ Ð)Ð)Ð)Ø�€~€~˜)¨:Ð5Ð5Øˆð �tÐÐ˜z¨TÐ1Ð1Ð5KÈtÐ5SÐ5SØˆˆØ	�Dˆˆ˜M¨TÐ1Ð1ØˆˆØ	�4ˆˆ�J t¨F¤|µTÑ:Ô:ˆ¸tÀF¼|ˆØ�f”˜a”ˆÝ�f�dÑ#Ô#ð 	 Ø ˆHˆHÝ˜¥Ñ$Ô$ð 	 Ø ˆHˆHÝ˜¥Ñ&Ô&ð 	 ØˆHˆHàˆHˆHàˆà%ˆdÐ%�F˜HÐ%Ð%Ð%r"   Ú
parametersc                ó$  — t          | t          ¦  «        sdi g dœS t          t          j        | ¦  «        d¬¦  «        }t          |t          ¦  «        sdi g dœS |                     d¦  «        dk    rd|d<   d|vri |d<   t          |¦  «         |S )z¶Normalize tool parameters to a Moonshot-compatible object schema.

    Returns a deep-copied schema with the two flavored-JSON-Schema repairs
    applied.  Input is not mutated.
    r=   )r*   r   rP   Tr   r*   r   )r-   r.   r   ÚcopyÚdeepcopyr/   rF   )ra   rG   s     r    Ú!sanitize_moonshot_tool_parametersre   Ä   s±   € õ �j¥$Ñ'Ô'ð DØ °ÀÐCÐCÐCå�dœm¨JÑ7Ô7À4ÐHÑHÔH€HÝ�h¥Ñ%Ô%ð DØ °ÀÐCÐCÐCð ‡|‚|�FÑÔ˜xÒ'Ð'Ø#ˆ�ÑØ˜8Ð#Ð#Ø!#ˆ�ÑÝ˜8Ñ$Ô$Ð$à€Or"   ÚtoolsúList[Dict[str, Any]]c                óÄ  — | s| S g }d}| D ]Ð}t          |t          ¦  «        s|                     |¦  «         Œ-|                     d¦  «        }t          |t          ¦  «        s|                     |¦  «         Œm|                     d¦  «        }t	          |¦  «        }||ur&d}i |¥d|i¥}|                     i |¥d|i¥¦  «         Œ»|                     |¦  «         ŒÑ|r|n| S )zGApply ``sanitize_moonshot_tool_parameters`` to every tool's parameters.FÚfunctionra   T)r-   r.   Úappendr/   re   )rf   Ú	sanitizedÚ
any_changeÚtoolÚfnÚparamsrG   Únew_fns           r    Úsanitize_moonshot_toolsrq   Û   s  € àð Øˆà&(€IØ€JØð #ð #ˆÝ˜$¥Ñ%Ô%ð 	Ø×Ò˜TÑ"Ô"Ð"ØØ�XŠX�jÑ!Ô!ˆÝ˜"�dÑ#Ô#ð 	Ø×Ò˜TÑ"Ô"Ð"ØØ—’˜Ñ%Ô%ˆÝ4°VÑ<Ô<ˆØ˜6Ð!Ð!ØˆJØ3˜Ð3˜L¨(Ð3Ð3ˆFØ×ÒÐ9 Ð9 j°&Ð9Ð9Ñ:Ô:Ð:Ð:à×Ò˜TÑ"Ô"Ð"Ð"à"Ð-ˆ9ˆ9¨Ð-r"   Úmodelú
str | Nonec                óD  — | sdS |                       ¦   «                              ¦   «         }|                     dd¦  «        d         }|                     d¦  «        s|dk    rdS |dk    s|                     d	¦  «        rdS d
|v sd|v s|                     d¦  «        rdS dS )a©  True for any Kimi / Moonshot model slug, regardless of aggregator prefix.

    Matches bare names (``kimi-k2.6``, ``moonshotai/Kimi-K2.6``) and aggregator-
    prefixed slugs (``nous/moonshotai/kimi-k2.6``, ``openrouter/moonshotai/...``).
    Detection by model name covers Nous / OpenRouter / other aggregators that
    route to Moonshot's inference, where the base URL is the aggregator's, not
    ``api.moonshot.ai``.
    Fú/r1   éÿÿÿÿzkimi-ÚkimiTÚk3)zk3.zk3-Úmoonshotz/kimi)ÚstripÚlowerÚrsplitÚ
startswith)rr   ÚbareÚtails      r    Úis_moonshot_modelr€   ö   s°   € ð ð ØˆuØ�;Š;‰=Œ=×ÒÑ Ô €Dà�;Š;�s˜AÑÔ˜rÔ"€DØ‡‚�wÑÔð  4¨6¢> >Øˆtð ˆt‚|€|�t—’ ~Ñ6Ô6€|Øˆtà�TÐÐ˜W¨˜_˜_°·²ÀÑ0GÔ0G˜_ØˆtØˆ5r"   )T)r   r   r   r   r   r   )r   rN   r   rN   )ra   r   r   rN   )rf   rg   r   rg   )rr   rs   r   r   )Ú__doc__Ú
__future__r   rc   Útypingr   r   r   Ú	frozensetr?   r@   rA   r   rF   rE   re   rq   r€   r3   r"   r    ú<module>r…      s#  ððð ð4 #Ð "Ð "Ð "Ð "Ð "à €€€Ø "Ð "Ð "Ð "Ð "Ð "Ð "Ð "Ð "Ð "ð
 �9ÐXÐXÐXÑYÔYÐ ð �IÐHÐHÐHÑIÔIÐ ð �IÐcÐcÐcÑdÔdÐ ð`ð `ð `ð `ð `ðFð ð ð ð&&ð &ð &ð &ðDð ð ð ð..ð .ð .ð .ð6ð ð ð ð ð r"   