Ë
    ãß²jl#  ã                   ó  — d Z ddlZddlZddlmZmZ ddlmZ  ej                  d«      Z	de
dee
ef   dee
ef   fd	„Zd
ede
defd„Zded
edefd„Zdde
d
edz  fd„Zd
edz  defd„Zde
defd„Zdde
defd„Zde
fd„Zd„ eed„ d„ dœZy)a˜  Tool-argument type coercion: repair string-typed values the model emitted against a tool's JSON Schema.

Models emit "42" for integers, "true" for booleans, JSON-encoded strings for
arrays/objects (also nested inside containers), and bare scalars where an array
is expected (wrapped in a one-element list). Coercion is schema-guided and
conservative: originals are kept whenever a repair is not unambiguous.
é    N)ÚAnyÚDict)ÚregistryÚmodel_toolsÚ	tool_nameÚargsÚreturnc                 óZ  — |rt        |t        «      s|S t        j                  | «      }|xs i j	                  d«      xs i j	                  d«      }|s|S 	 ddlm}  ||j	                  d«      |«      }t        |j                  «       «      D �]‰  \  }}|j	                  |«      }|sŒ|j	                  d«      }t        |t        t        f«      }	|dk(  r²|�°|	s®t        |t        «      rlt        |||¬«      }
|
|ur|
||<   Œs|j                  «       j                  d«      rt        j!                  d	| |«       |g||<   t        j#                  d
| |«       ŒÇ|g||<   t        j#                  dt%        |«      j&                  | |«       Œùt        |t        «      s-|dk(  r|	s|dk(  rt        |t        «      rt)        ||«      ||<   �Œ6|st+        |«      s�ŒEt        |||¬«      }
|
|us�ŒY|
||<   t        |
t        t        t        f«      s�Œ{t)        |
|«      ||<   �ŒŒ |S # t        $ r Y �Œ´w xY w)zOCoerce string-typed args to their JSON-Schema types; originals kept on failure.Ú
parametersÚ
propertiesr   )Úunrename_tool_argsÚtypeÚarray©Úschemaú[u¿   coerce_tool_args: %s.%s looks like a JSON array string but could not be parsed â€” model may have emitted a JSON-encoded string instead of a native array. Falling back to single-element list.z7coerce_tool_args: wrapped bare string in list for %s.%sz3coerce_tool_args: wrapped bare %s in list for %s.%sÚobject)Ú
isinstanceÚdictr   Ú
get_schemaÚgetÚtools.schema_sanitizerr   Ú	ExceptionÚlistÚitemsÚtupleÚstrÚ_coerce_valueÚstripÚ
startswithÚloggerÚwarningÚinfor   Ú__name__Ú"_normalize_json_strings_for_schemaÚ_schema_allows_null)r   r   r   r   r   ÚkeyÚvalueÚprop_schemaÚexpectedÚis_containerÚcoerceds              ú7/home/ubuntu/.hermes/hermes-agent/tools/arg_coercion.pyÚcoerce_tool_argsr.      s%  € á”z $¬Ô-Øˆä× Ñ  Ó+€FØ’<˜R×$Ñ$ \Ó2Ò8°b×=Ñ=¸lÓK€JÙØˆðÝ=Ù! &§*¡*¨\Ó":¸DÓAˆô ˜4Ÿ:™:›<Ó(ó (U‰
ˆˆUØ —n‘n SÓ)ˆÙØØ—?‘? 6Ó*ˆÜ! %¬$´¨Ó7ˆð �wÒ 5Ð#4¹\Ü˜%¤Ô%Ü'¨¨xÀÔL�Ø %Ñ'Ø '�D˜‘IØØ—;‘;“=×+Ñ+¨CÔ0Ü—N‘Nð $Jð LUÐVYô[ð #˜G��S‘	Ü—‘ÐUÐW`ÐbeÔfØØ˜ˆD�‰IÜ�K‰KÐMÌtÐTYË{×OcÑOcÐenÐpsÔtØä˜%¤Ô%à˜GÒ#©¸(ÀhÒ:NÔS]Ð^cÔeiÔSjÜ>¸uÀkÓR��S‘	ÙÙÔ 3°KÔ @ÙÜ  x¸ÔDˆØ˜%ÓØˆD�‰IÜ˜'¤D¬%´Ð#6Ö7Ü>¸wÈÓT��S“	ðQ(UðT €Køô[ ò Úðús   ÁH È	H*È)H*r   Úkindc                 ó¬   ‡ ‡‡— t        ‰ t        «      sy‰ j                  d«      }|‰k(  st        |t        «      r‰|v ryt	        ˆˆˆ fd„dD «       «      S )zYTrue when *schema* permits JSON type *kind* via ``type`` or any anyOf/oneOf/allOf branch.Fr   Tc              3   óŒ   •K  — | ];  }t        ‰j                  |«      xŠt        «      xr t        ˆfd „‰D «       «      –— Œ= y­w)c              3   ó6   •K  — | ]  }t        |‰«      –— Œ y ­w©N)Ú_schema_accepts_kind)Ú.0Úbr/   s     €r-   ú	<genexpr>z1_schema_accepts_kind.<locals>.<genexpr>.<genexpr>Z   s   øè ø€ ÒJ{ÐmnÔK_Ð`aÐcg×KhÑJ{ùs   ƒN©r   r   r   Úany)r5   Ú	union_keyÚbranchesr/   r   s     €€€r-   r7   z'_schema_accepts_kind.<locals>.<genexpr>Z   sB   øè ø€ ò =Øô  f§j¡j°Ó&;Ð;˜(¼TÓBÒ{ÄsÓJ{ÐrzÔJ{ÓG{Ó{ñ =ùs   ƒAA)ÚanyOfÚoneOfÚallOf©r   r   r   r   r9   )r   r/   Útr;   s   `` @r-   r4   r4   S   sQ   ú€ ä�fœdÔ#ØØ�
‰
�6Ó€AØˆD‚y”Z ¤4Ô(¨T°Q©YØÜõ =Ø ;ô=ó =ð =ó    r(   c                 óÂ  ‡— t        |t        «      s| S t        | t        «      rŽ| j                  «       }t	        |d«      }t	        |d«      }|r|j                  d«      s|r|j                  d«      s| S 	 t        j                  |«      }t        |t        «      r|st        |t        «      r|s| S |} t        | t        «      r]|j                  d«      }t        |t        «      s| S | D �cg c]  }t        ||«      ‘Œ c}Št        d„ t        ‰| «      D «       «      r‰S | S t        | t        «      r”|j                  d«      }t        |t        «      s| S t        | «      Š|j                  «       D ]-  \  }	}
|	| v sŒt        |
t        «      sŒt        | |	   |
«      ‰|	<   Œ/ t        ˆfd„| j                  «       D «       «      r‰S | S | S # t        t        f$ r | cY S w xY wc c}w )	a‹  Recursively parse JSON-encoded strings where the schema expects array/object.

    Schema-guided: a string is only parsed when its schema position expects a
    container, so legitimate JSON-looking ``type: string`` fields survive.
    Returns the same object when nothing changed (identity = cheap no-op check).

    Ported from cline/cline#11803, adapted to hermes-agent's coercion layer.
    r   r   r   ú{r   c              3   ó*   K  — | ]  \  }}||u–— Œ y ­wr3   © )r5   ÚnÚos      r-   r7   z5_normalize_json_strings_for_schema.<locals>.<genexpr>}   s   è ø€ ÒA©¨¨A˜! 1œ*ÑAùs   ‚r   c              3   ó2   •K  — | ]  \  }}‰|   |u–— Œ y ­wr3   rE   )r5   ÚkÚvÚouts      €r-   r7   z5_normalize_json_strings_for_schema.<locals>.<genexpr>‡   s   øè ø€ ÒD©d¨a°˜#˜a™&¨œ/ÑDùs   ƒ)r   r   r   r   r4   r    ÚjsonÚloadsÚ
ValueErrorÚ	TypeErrorr   r   r%   r9   Úzipr   )r(   r   ÚtrimmedÚexpects_arrayÚexpects_objectÚparsedÚitems_schemaÚitemÚpropsrI   r)   rK   s              @r-   r%   r%   ^   s°  ø€ ô �fœdÔ#Øˆä�%œÔØ—+‘+“-ˆÜ,¨V°WÓ=ˆÜ-¨f°hÓ?ˆÙ 7×#5Ñ#5°cÔ#:ÁÐSZ×SeÑSeÐfiÔSjØˆLð	Ü—Z‘Z Ó(ˆFô ˜F¤DÔ)©mÄÈFÔTXÔAYÑ^lØˆLØˆä�%œÔØ—z‘z 'Ó*ˆÜ˜,¬Ô-ØˆLØRWÖXÈ$Ô1°$¸ÕEÒXˆÜÑA´°S¸%³ÔAÔAˆsÐLÀuÐLä�%œÔØ—
‘
˜<Ó(ˆÜ˜%¤Ô&ØˆLÜ�5‹kˆØ#Ÿk™k›mò 	S‰NˆAˆ{Ø�EŠzœj¨´dÕ;Ü;¸EÀ!¹HÀkÓR��A’ð	Sô ÓD°e·k±k³mÔDÔDˆsÐOÈ%ÐOà€Løô/ œIÐ&ò 	ØŠLð	üò Ys   Á5G Ã)GÇGÇGc                 óB  ‡ ‡‡— t        ‰«      r"‰ j                  «       j                  «       dk(  ryt        |t        «      rt        ˆˆˆ fd„|D «       ‰ «      S t        j                  |«      }|� |‰ «      S |dk(  r#‰ j                  «       j                  «       dk(  rdS ‰ S )zRCoerce string *value* to *expected_type* (str or union list); original on failure.ÚnullNc              3   óH   •K  — | ]  }t        ‰|‰¬ «      xŠ‰usŒ‰–— Œ y­w)r   N)r   )r5   r@   Úrr   r(   s     €€€r-   r7   z _coerce_value.<locals>.<genexpr>’   s(   øè ø€ Òl˜1´}ÀUÈAÐV\Ô7]Ð2]°!ÐfkÒ1k”QÑlùs   ƒ"›")r&   r   Úlowerr   r   ÚnextÚ_SCALAR_COERCERSr   )r(   Úexpected_typer   Úcoercerr[   s   ` ` @r-   r   r   Œ   s‹   ú€ ä˜6Ô" u§{¡{£}×':Ñ':Ó'<ÀÒ'FØä�-¤Ô&ÜÕl ÔlÐnsÓtÐtä×"Ñ" =Ó1€GØÐÙ�u‹~ÐØ  FÒ*¨u¯{©{«}×/BÑ/BÓ/DÈÒ/Nˆ4ÐYÐTYÐYrA   c                 óÐ   ‡ ‡— t        ‰ t        «      sy‰ j                  d«      }|dk(  st        |t        «      rd|v ry‰ j                  d«      du ryt	        ˆ ˆfd„dD «       «      S )z9True when a JSON Schema fragment explicitly permits null.Fr   rY   TÚnullablec              3   óˆ   •K  — | ]9  }t        ‰j                  |«      xŠt        «      xr t        d „ ‰D «       «      –— Œ; y­w)c              3   óh   K  — | ]*  }t        |t        «      xr |j                  d «      dk(  –— Œ, y­w)r   rY   N)r   r   r   )r5   rJ   s     r-   r7   z0_schema_allows_null.<locals>.<genexpr>.<genexpr>¤   s,   è ø€ ÒYÈ1”z !¤TÓ*ÒF¨q¯u©u°V«}ÀÑ/FÓFÑYùs   ‚02Nr8   )r5   r:   r   Úvariantss     €€r-   r7   z&_schema_allows_null.<locals>.<genexpr>£   sI   øè ø€ ò 4àô  f§j¡j°Ó&;Ð;˜(¼TÓBò ZÜÑYÐPXÔYÓYóZñ 4ùs   ƒ?A)r<   r=   r?   )r   Úschema_typere   s   ` @r-   r&   r&   š   sg   ù€ ä�fœdÔ#ØØ—*‘*˜VÓ$€KØ�fÒ¤¨K¼Ô!>À6È[ÑCXØØ‡z�z�*Ó Ñ%ØÜô 4à 2ô4ó 4ð 4rA   Úexpected_python_typec                 óP  — |j                   }	 t        j                  | «      }t        ||«      rt
        j                  d|«       |S t
        j                  dt        |«      j                   |«       | S # t        t        f$ r#}t
        j                  d||«       | cY d}~S d}~ww xY w)zUjson.loads *value* when the schema expects array/object; original string on mismatch.zIcoerce_tool_args: failed to parse string as JSON for expected type %s: %sNz5coerce_tool_args: coerced string to %s via json.loadsuL   coerce_tool_args: JSON-parsed value is %s, expected %s â€” skipping coercion)
r$   rL   rM   rN   rO   r!   r"   r   Údebugr   )r(   rg   ÚnamerT   Úexcs        r-   Ú_coerce_jsonrl   ¨   s“   € à×(Ñ(€DðÜ—‘˜EÓ"ˆô �&Ð.Ô/Ü�‰ÐLÈdÔSØˆÜ
‡N�NÐaÜ˜“<×(Ñ(¨$ô0à€Løô œ	Ð"ò Ü�‰ÐbÐdhÐjmÔnØ�ûðús   ŽA3 Á3B%ÂB ÂB%Â B%Úinteger_onlyc                 óÄ   — 	 t        | «      }||k7  s|t        d«      t        d«      fv r| S |t        |«      k(  rt        |«      S |r| S |S # t        t        f$ r | cY S w xY w)z^Parse *value* as a number; original string on failure, inf/nan, or decimals when integer_only.Úinfz-inf)ÚfloatrN   ÚOverflowErrorÚint)r(   rm   Úfs      r-   Ú_coerce_numberrt   ¸   sm   € ðÜ�%‹Lˆð 	ˆA‚v�”u˜U“|¤U¨6£]Ð3Ñ3ØˆØœ#˜a›&’[Œ3ˆq‹6ÐB©| eÐBÀÐBøô	 œÐ&ò ØŠðús   ‚A ÁAÁAc                 ód   — dddœj                  | j                  «       j                  «       | «      S )zCParse "true"/"false" (case-insensitive); original string otherwise.TF)ÚtrueÚfalse)r   r   r\   )r(   s    r-   Ú_coerce_booleanrx   Ã   s)   € à 5Ñ)×-Ñ-¨e¯k©k«m×.AÑ.AÓ.CÀUÓKÐKrA   c                 ó   — t        | d¬«      S )NT)rm   )rt   ©rJ   s    r-   ú<lambda>r{   Ê   s   € œ¨¸Ô=€ rA   c                 ó"   — t        | t        «      S r3   )rl   r   rz   s    r-   r{   r{   Í   s   € ”| A¤tÓ,€ rA   c                 ó"   — t        | t        «      S r3   )rl   r   rz   s    r-   r{   r{   Î   s   € œ Q¬Ó-€ rA   )ÚintegerÚnumberÚbooleanr   r   r3   )F)Ú__doc__rL   ÚloggingÚtypingr   r   Útools.registryr   Ú	getLoggerr!   r   r.   Úboolr4   r%   r   r   r&   r   rl   rt   rx   r^   rE   rA   r-   ú<module>r‡      s  ðñó Û ß å #ð 
ˆ×	Ñ	˜=Ó	)€ð< ð <¨4°°S°©>ð <¸dÀ3ÈÀ8¹nó <ð~= ð =¨Cð =°Dó =ð+¨cð +¸3ð +À3ó +ñ\Z˜ð Z°T¸D±[ó Zð4  t¡ð 4°ó 4ð˜ð °4ó ñ C˜#ð C¨Tó CðL˜3ó Lñ >ØØÙ,Ù-ñÑ rA   