+
    lHàjÛV  ã                  óÎ  a € 0 t $ R t^ RIHt ^ RIt^ RIt^ RIt^ RIHtH	t	 ^ RI
Ht ]P                  ! ]4      t]P                  ! R4      t]P                  ! R4      tR@tRAtR R	 ltR
 R ltR R ltR R lt]P                  ! R4      t]P                  ! R4      tRBR R lltRBR R lltR R ltR R lt]! R04      tR R lt RCt!RR/R R llt"R  R! lt#R" R# lt$R$R%/R& R' llt%]&R(]'R)](R*])R+/t*R,]+R-&   R. R/ lt,R0 R1 lt-]! 0 RDm4      t.]! 0 REm4      t/]! 0 RFm4      t0]! 0 RGm4      t1R2 R3 lt2R4 R5 lt3]! R6R704      t4]! 0 RHm4      t5R8 R9 lt6R: R; lt7R< R= lt8R> R? lt9R# )Ia4  Sanitize tool JSON schemas for strict LLM backends. llama.cpp's grammar converter fails on
``{"type": "object"}`` without ``properties``, bare-string schemas and ``type`` arrays; Anthropic
rejects nullable ``anyOf`` at the top of ``input_schema``; Fireworks rejects ``default`` beside
``$ref``; Codex rejects top-level combinators. Walks a deep copy and fixes only those shapes.
Legacy boolean ``required`` flags are removed from schema positions, lifting property-level
``true`` flags into the parent's required-name list; literal defaults/consts are not schemas.)ÚannotationsN)ÚAnyÚCallable)Úunquotez^[a-zA-Z0-9_.-]{1,64}$z[^a-zA-Z0-9_.-]Údefaultc               ó   € V ^8„  d   QhRR/# )é   ÚreturnÚdict© )Úformats   "Ú;/home/ubuntu/.hermes/hermes-agent/tools/schema_sanitizer.pyÚ__annotate__r      s   € ÷ @ñ @�tñ @ó    c                 ó   € R RR/ R. /# )ÚtypeÚobjectÚ
propertiesÚrequiredr   r   r   r   Ú_empty_objectr      s   € Ø�H˜l¨B°
¸BÐ?Ð?r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úschemar   ÚfnzCallable[[dict], Any]r	   r   )r   s   "r   r   r      s"   € ÷ ?ñ ?�Sð ?Ð3ð ?¸ñ ?r   c                ó  € \        V \        4      '       d   V  Uu. uF  p\        W!4      NK  	  up# \        V \        4      '       g   V # T! V P	                  4        UUu/ uF  w  r4V\        WA4      bK  	  upp4      # u upi u uppi )zPBottom-up map over a schema tree: lists/dicts recurse, then *fn* sees each dict.)Ú
isinstanceÚlistÚ_rewriter
   Úitems)r   r   ÚitemÚkÚvs   &&   r   r   r      sp   € ä�&œ$×ÒÙ/5Ó6©v t”˜Ö"©vÑ6Ð6Ü�fœd×#Ò#ØˆÙ¨f¯l©l¬nÔ=©n¡d aˆq”(˜1“/Ò!©nÒ=Ó>Ð>ùò 7ùó >s   ›A>ÁB
c               ó    € V ^8„  d   QhRRRR/# )r   ÚkeyÚstrr	   r   )r   s   "r   r   r   '   s   € ÷ =ñ =˜sð = sñ =r   c                óP   € \         P                  RV 4      R,          ;'       g    R# )zDDeterministically map an arbitrary property key to a conforming one.Ú_:Né@   NÚparam)Ú_PROP_KEY_BAD_CHARSÚsub)r"   s   &r   Úsanitize_property_keyr*   '   s"   € ä×"Ñ" 3¨Ó,¨SÕ1×<Ð<°WÐ<r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úpropsr
   Úpathr#   r	   zdict[str, str]r   )r   s   "r   r   r   ,   s!   € ÷ ñ  ð ¨Sð °^ñ r   c                óh  € / pV  Uu0 uF"  p\         P                  V4      '       g   K   VkK$  	  ppR V  4        Fo  p\        V4      pT^r‡Wt9   d-   VR^@\        RV 24      ,
           RV 2,           V^,           r‡K2  VP	                  V4       WrV&   \
        P                  RWV4       Kq  	  V# u upi )zú{original_key: conforming_key} for one properties dict (identity entries omitted).
Deterministic (insertion order, numeric suffixes on collision) so the model-visible schema
and the dispatch-time reverse map from the registry's original schema agree.c              3  ó`   "  € T F$  p\         P                  V4      '       d   K   Vx € K&  	  R # 5i©N)Ú_PROP_KEY_REÚmatch)Ú.0r   s   & r   Ú	<genexpr>Ú(_rename_property_keys.<locals>.<genexpr>2   s   é € Ð>™5�a¬×(:Ñ(:¸1×(=—’›5ùs   ‚.¤
.Nr%   zQschema_sanitizer[%s]: renamed property key %r -> %r (provider key-pattern compat))r1   r2   r*   ÚlenÚaddÚloggerÚdebug)	r,   r-   Úrenamesr   Útakenr"   ÚbaseÚ	candidateÚis	   &&       r   Ú_rename_property_keysr?   ,   sµ   € ð !€GÙÓ7™�1¤×!3Ñ!3°A×!6�QˆQ™€EÐ7Ù>™5Ö>ˆÜ$ SÓ)ˆØ˜Q�1ØÔ ØÐ 3 "¤s¨Q¨q¨c¨7£|Õ"3Ð4¸¸1¸#°wÕ>ÀÀAÅ’qØ�	‰	�)ÔØ �‰Ü�‰ð 5Ø6:Àö	Lñ ?ð €Nùò 8s
   ‡B/©B/z0|[1-9][0-9]*z	~(?![01])c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   r   r   Úroot_schemaÚ	seen_refszset[str] | Noner	   r   )r   s   "r   r   r   C   s)   € ÷ (ñ ( Sð (°sð (Àð (Ðbeñ (r   c                ó´  € \        V \        4      '       d   \        V\        4      '       g   V # V P                  R4      p\        V\        4      '       d   VP	                  R4      '       g   V # \        VR,          4      pV'       d   VP	                  R4      '       g   V # T;'       g    \        4       pW59   d   V # TpVP                  R4      R,           FÊ  p\        P                  V4      '       d   V u # VP                  RR4      P                  RR4      p\        V\        4      '       d   W†9   d   Wh,          pKj  \        V\        4      '       dI   \        P                  V4      '       d.   \        V4      \        V4      8  d   V\        V4      ,          pKÈ  V u # 	  \        V\        4      '       g   V # \!        WaWS0,          4      p	V P#                  4        U
Uu/ uF  w  r«V
R8w  g   K  W«bK  	  pp
pV'       d   \        V	\        4      '       g   V	# \        V	4      pVP#                  4        F  w  r«VP%                  W«4       K  	  V# u upp
i )a  Follow a document-local ``$ref`` in *schema* against *root_schema*, for dispatch-time
decisions (argument coercion, key unrenaming). Remote, malformed or dangling refs come back
unchanged; sibling keywords are kept, and the referenced schema wins where they conflict.ú$refÚ#:é   NNÚ/z~1z~0Ú~)r   r
   Úgetr#   Ú
startswithr   ÚsetÚsplitÚ_BAD_POINTER_ESCAPEÚsearchÚreplacer   Ú_POINTER_INDEXÚ	fullmatchÚintr6   Úresolve_local_schema_refr   Ú
setdefault)r   rA   rB   ÚrefÚpointerÚseenÚtargetÚ	raw_tokenÚtokenÚresolvedr"   ÚvalueÚsiblingsÚcombineds   &&&           r   rS   rS   C   sÒ  € ô �fœd×#Ò#¬:°kÄ4×+HÒ+HØˆà
�*‰*�VÓ
€CÜ�cœ3×Ò s§~¡~°c×':Ò':Øˆä�c˜"•gÓ€Gß�w×)Ñ)¨#×.Ò.ØˆØ×Ðœ›€DØ
„{Øˆà€FØ—]‘] 3Ó'¨×+Ð+ˆ	Ü×%Ñ% i×0Ò0ØŠMØ×!Ñ! $¨Ó,×4Ñ4°T¸3Ó?ˆÜ�fœd×#Ò#¨¬Ø•]ŠFÜ˜¤×%Ò%¬.×*BÑ*BÀ5×*IÒ*IÌcÐRWËjÔ[^Ð_eÓ[fÔNfàœC ›JÕ'ŠFàŠMñ ,ô �fœd×#Ò#Øˆä'¨¸TÀE½\ÓJ€HØ-3¯\©\¬^ÔM©^™z˜s¸sÀf¹}”
�’
©^€HÑMßœ: h´×5Ò5ØˆÜ�H‹~€HØ—n‘nÖ&‰
ˆØ×Ñ˜CÖ'ñ 'à€Oùó Ns   Ç$IÇ4Ic               ó(   € V ^8„  d   QhRRRRRRRR/# )r   Úparams_schemar   ÚargsrA   r	   r   )r   s   "r   r   r   n   s)   € ÷ ñ  cð °ð À3ð ÐRUñ r   c           	     ó\  € Vf   T MTp\        W4      p \        V \        4      '       d   V P                  R4      MRp\        V\        4      '       d   \        V\        4      '       g   V# \	        VR4      P                  4        UUu/ uF  w  rVWebK	  	  ppp/ pVP                  4        Fó  w  ršVP                  W™4      p\        VP                  V4      \        4      '       d   \        WK,          V4      M/ p\        V
\        4      '       d   V'       d   \        WÊV4      p
Mu\        V
\        4      '       d`   \        VP                  R4      \        4      '       d;   V
 Uu. uF.  p\        V\        4      '       d   \        VR,          WÓ4      MTNK0  	  p
pW¨V&   Kõ  	  V# u uppi u upi )zúMap sanitized keys in model-emitted args back to wire names. ``params_schema`` is the
ORIGINAL registry schema; recurses into objects/array items, following local ``$ref``s
(the sanitizer renames keys inside ``$defs`` too); unknown keys pass through.Nr   z
<unrename>r   )rS   r   r
   rI   r?   r   Úunrename_tool_argsr   )r`   ra   rA   Úrootr,   r   r    ÚreverseÚoutr"   r\   Úorigr)   r   s   &&&           r   rc   rc   n   sf  € ð (Ò/‰=°[€DÜ,¨]ÓA€MÜ/9¸-Ì×/NÒ/NˆM×Ñ˜lÔ+ÐTX€EÜ�eœT×"Ò"¬*°T¼4×*@Ò*@ØˆÜ 5°e¸\Ó J× PÑ PÔ RÔSÑ R™˜ˆqŠtÑ R€GÑSØ
€CØ—j‘j–l‰
ˆØ�{‰{˜3Ó$ˆÜ=GÈÏ	É	ÐRVËÔY]×=^Ò=^Ô& u¥{°DÔ9ÐdfˆÜ�eœT×"Ò"§sÜ& s°4Ó8‰EÜ˜œt×$Ò$¬°C·G±G¸GÓ4DÄd×)KÒ)Ká!&ó(Ù!&˜ô FPÐPTÔVZ×E[ÒE[Ô'¨¨G­°dÔAÐaeÒeÙ!&ð ð (àˆD‹	ñ #ð €Jùó Tùò(s   ÂF#Å#4F)c               ó    € V ^8„  d   QhRRRR/# )r   Útoolsú
list[dict]r	   r   )r   s   "r   r   r   …   s   € ÷ Oñ O ð O°
ñ Or   c                óV   € V '       d   V  Uu. uF  p\        V4      NK  	  up# T # u upi )zWDeep-copied ``tools`` (OpenAI format) with sanitized parameter schemas; safe to mutate.)Ú_sanitize_single_tool)ri   Útools   & r   Úsanitize_tool_schemasrn   …   s'   € ç>C±EÓ:±E¨DÔ! $Ö'±EÑ:ÐNÈÐNùÒ:s   �&c               ó    € V ^8„  d   QhRRRR/# )r   rm   r
   r	   r   )r   s   "r   r   r   Š   s   € ÷ ñ  ð ¨ñ r   c                ó�  € \         P                  ! V 4      p\        V\        4      '       d   VP	                  R 4      MRp\        V\        4      '       g   V# VP	                  R4      p\        V\        4      '       g   \        4       VR&   V# VP	                  RR4      p\        W4R7      p\        V\        4      '       d   TM/ pRVR&   \        VP	                  R4      \        4      '       g   / VR&   \        VP	                  R	4      \        4      '       g   . VR	&   \        VR
R7      p\        WTR7      p\        V4      VR&   V# )ÚfunctionNÚ
parametersÚnameú<tool>)r-   r   r   r   r   T)Úkeep_nullable_hint)ÚcopyÚdeepcopyr   r
   rI   r   Ú_sanitize_noder   Ústrip_nullable_unionsÚ_strip_top_level_combinatorsÚ_strip_ref_siblings)rm   rf   r   Úparamsrs   Útops   &     r   rl   rl   Š   s  € Ü
�-Š-˜Ó
€CÜ *¨3´× 5Ò 5ˆ�‰�Ô	¸4€BÜ�bœ$×ÒØˆ
Ø�V‰V�LÓ!€FÜ�fœd×#Ò#Ü(›?ˆˆ<ÑØˆ
Ø�6‰6�&˜(Ó#€DÜ
˜Ô
+€CÜ˜C¤×&Ò&‰#¨B€CØ€Cˆ�KÜ�c—g‘g˜lÓ+¬T×2Ò2ØˆˆLÑÜ�c—g‘g˜jÓ)¬4×0Ò0ØˆˆJ‰ô   ¸Ô
=€CÜ
& sÔ
6€CÜ*¨3Ó/€B€|ÑØ€Jr   c               ó    € V ^8„  d   QhRRRR/# )r   Únoder   r	   r   )r   s   "r   r   r   ¦   s   € ÷ !ñ !˜cð ! cñ !r   c                ó$   € R R lp\        W4      # )zVRecursively drop forbidden siblings of ``$ref`` (Fireworks rejects ``default`` there).c               ó    € V ^8„  d   QhRRRR/# )r   rf   r
   r	   r   )r   s   "r   r   Ú)_strip_ref_siblings.<locals>.__annotate__¨   s   € ÷ ñ �4ð ˜Dñ r   c                óV   € R V 9   d   \         MR F  pV P                  VR4       K  	  V # )rD   Nr   )Ú_REF_FORBIDDEN_SIBLINGSÚpop)rf   r"   s   & r   ÚstripÚ"_strip_ref_siblings.<locals>.strip¨   s,   € Ø.4¸¬mÕ*ÀÒCˆCØ�G‰G�C˜Öñ Dàˆ
r   ©r   )r   r†   s   & r   r{   r{   ¦   s   € õô �DÓ Ð r   r-   rt   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r|   r
   r-   r#   r	   r   )r   s   "r   r   r   ²   s!   € ÷ ñ ¨ð ¸ð È4ñ r   c               óÐ   € \        V \        4      '       g   V # \        V 4      p\         Uu. uF  q3V9   g   K  VNK  	  up F  p\        P	                  RW4       W$ K  	  V# u upi )z´Drop combinators from the TOP level only (Codex rejects them there). They are usually
conditional-required hints, so validity is unchanged (handlers re-validate); nested ones
stay.zcschema_sanitizer[%s]: stripped top-level %r combinator from tool parameters (strict-backend compat))r   r
   Ú_TOP_LEVEL_FORBIDDEN_KEYSr8   r9   )r|   r-   rf   r   r"   s   &$   r   rz   rz   ²   si   € ô �fœd×#Ò#ØˆÜ
ˆv‹,€CÝ4ÓAÑ4�a¸S¹—�Ñ4ÔAˆÜ�‰ð DØEIô	PàŠHñ Bð €Jùò	 Bs
   ¬A#¹A#c               ó    € V ^8„  d   QhRRRR/# )r   r   r   r	   Úboolr   )r   s   "r   r   r   À   s   € ÷ Añ A˜#ð A $ñ Ar   c                óZ   € \        V \        4      ;'       d    V P                  R 4      R8H  # )r   Únull)r   r
   rI   )r   s   &r   Ú_is_null_branchr�   À   s%   € Ü�dœDÓ!×@Ð@ d§h¡h¨vÓ&6¸&Ñ&@Ð@r   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   Úouterr
   ÚreplacementÚskip_default_on_refr�   r	   ÚNoner   )r   s   "r   r   r   Ä   s)   € ÷ 4ñ 4˜Tð 4°ð 4Èdð 4ÐW[ñ 4r   c               ó„   € \          F5  pW09   g   K  W19  g   K  V'       d   VR8X  d
   RV9   d   K+  W,          W&   K7  	  R# )z•Copy outer-union metadata onto *replacement* where absent (``default`` is illegal beside
``$ref`` on strict backends, hence ``skip_default_on_ref``).r   rD   N)Ú_UNION_META_KEYS)r’   r“   r”   Úmeta_keys   &&$ r   Ú_carry_union_metar™   Ä   s4   € ÷ %ˆØÖ Ö!<ß#¨°IÔ(=À&ÈKÖBWØ$)¥OˆKÓ!ó %r   ru   Tc               ó$   € V ^8„  d   QhRRRRRR/# )r   r   r   ru   r�   r	   r   )r   s   "r   r   r   Í   s!   € ÷ &ñ & #ð &¸dð &Ècñ &r   c               ó2   aa€ R VV3R llo\        V S4      # )us  Collapse ``anyOf``/``oneOf`` nullable unions (MCP/Pydantic optional fields) to the single
non-null branch: Anthropic rejects the null branch and optionality already lives in the parent's
``required``. Only when a null branch was dropped AND exactly one non-null branch survives.
``keep_nullable_hint`` sets ``nullable: true`` for runtime ``"null"`` â†’ ``None`` coercion.c               ó    € V ^8„  d   QhRRRR/# )r   Ústrippedr
   r	   r   r   )r   s   "r   r   Ú+strip_nullable_unions.<locals>.__annotate__Ò   s   € ÷ ñ ˜4ð  Cñ r   c                óè  <€ \          Fá  pV P                  V4      p\        V\        4      '       g   K,  V Uu. uF  p\	        V4      '       d   K  VNK  	  pp\        V4      ^8X  g   Kb  \        V4      \        V4      8w  g   K}  \        V^ ,          \        4      '       d   \        V^ ,          4      M/ pS'       d   VP                  RR4       \        WRR7       \        VS4      u # 	  V # u upi )rF   ÚnullableT©r”   )
Ú_UNION_KEYSrI   r   r   r�   r6   r
   rT   r™   r   )r�   r"   Úvariantsr   Únon_nullr“   Úcollapseru   s   &     €€r   r¥   Ú'strip_nullable_unions.<locals>.collapseÒ   s»   ø€ ßˆCØ—|‘| CÓ(ˆHÜ˜h¬×-Ò-ÙÙ)1ÓO© ¼È×9NŸ˜©ˆHÐOÜ�8‹} Ö!¤c¨(£m´s¸8³}Ö&DÜ3=¸hÀq½kÌ4×3PÒ3Pœd 8¨A¥;Ô/ÐVX�ß%Ø×*Ñ*¨:°tÔ<Ü! (ÈTÕRÜ ¨XÓ6Ò6ñ ð ˆùò Ps   ¸C/ÁC/rˆ   )r   ru   r¥   s   &d@r   ry   ry   Í   s   ù€ ÷
ñ ô �F˜HÓ%Ð%r   ÚbooleanÚintegerÚnumberÚstringzdict[type, str]Ú_CONST_PRIMITIVE_TYPESc               ó    € V ^8„  d   QhRRRR/# )r   Úbranchr   r	   z
str | Noner   )r   s   "r   r   r   æ   s   € ÷ Jñ J˜sð J zñ Jr   c                óö   € \        V \        4      '       d"   RV 9  g   \        V 4      0 Rm,
          '       d   R# \        P	                  \        V R,          4      4      pV P	                  R4      RV39   d   V# R# )zšPrimitive JSON-Schema type of a pure ``const`` branch (declared ``type``, if any, must match;
only ``title``/``description`` may accompany it), else None.Úconstr   N>   r   r¯   ÚtitleÚdescription)r   r
   rK   r«   rI   r   )r­   Ú	json_types   & r   Ú_const_branch_typer³   æ   sd   € ô �fœd×#Ò# w°fÔ'<Ü�6‹{ÒF×FÔFÙä&×*Ñ*¬4°°wµÓ+@ÓA€IØŸ
™
 6Ó*¨t°YÐ.?Ô?ˆ9ÐIÀTÐIr   c               ó    € V ^8„  d   QhRRRR/# )r   r   r   r	   r   )r   s   "r   r   r   ñ   s   € ÷ &ñ & #ð &¨#ñ &r   c                ó$   € R R lp\        W4      # )aÑ  Collapse ``anyOf``/``oneOf`` unions of same-typed consts (Rust/TS MCP servers emit
``{"anyOf": [{"const": "red"}, {"const": "green"}]}``) to ``enum``; ported from block/goose
``tool_schema_normalize.rs`` (Apache-2.0). Only when EVERY non-null branch is a pure ``const``
of one primitive type (``bool`` never merges with ``integer``); one ``{"type": "null"}`` branch
is tolerated as ``nullable: true``. Branch order kept; outer metadata carried; input never
mutated.c               ó    € V ^8„  d   QhRRRR/# )r   rf   r
   r	   r   r   )r   s   "r   r   Ú+collapse_const_unions.<locals>.__annotate__ø   s   € ÷ ñ �dð ˜sñ r   c           	     ó^  € \          EF  pV P                  V4      p\        V\        4      '       d	   V'       g   K5  V Uu. uF!  p\	        V4      '       g   K  R V9  g   K  VNK#  	  ppV Uu. uF  qUV9  g   K  VNK  	  pp\        V4      ^8”  g	   V'       g   K•  V Uu0 uF  p\        V4      kK  	  pp\        V4      ^8w  g   RV9   d   KÈ  RVP                  4       RV Uu. uF  qUR ,          NK  	  up/pV'       d   RVR&   \        WRR7       Vu # 	  V # u upi u upi u upi u upi )r¯   Nr   ÚenumTr    Fr¡   )	r¢   rI   r   r   r�   r6   r³   r…   r™   )	rf   r"   r£   r>   Únull_branchesr   Úconst_branchesÚbranch_typesr“   s	   &        r   r¥   Ú'collapse_const_unions.<locals>.collapseø   s  € ß�;ˆCØ—w‘w˜s“|ˆHÜ˜h¬×-Ò-·XÙÙ(0Ó\© 1´OÀA×4FœQÈ7ÐZ[ÑK[ŸQ˜Q©ˆMÐ\Ù/7ÓU©x tÀ}Ñ;TŸd˜d©xˆNÐUÜ�=Ó! AÔ%¯^ÙÙAOÓPÁ¸Ô.¨tÖ4ÁˆLÐPÜ�<Ó  AÔ%¨°Ô)=Ùà˜×(Ñ(Ó*¨FÉ~Ó4^É~Àt¸'·]°]É~Ñ4^ð!`ˆKçØ*.�˜JÑ'Ü˜cÀEÕJØÒñ! ð" ˆ
ùò ]ùÚUùò Qùò 5_s*   Á DÁDÁ!DÁ-D Á:D Â D%Ã$D*rˆ   )r   r¥   s   & r   Úcollapse_const_unionsr¾   ñ   s   € õô& �FÓ%Ð%r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r\   r   rf   r
   r	   r•   r   )r   s   "r   r   r     s!   € ÷ )ñ ) ð )¨Dð )°Tñ )r   c                óZ  € RV 9   pV  Uu. uF&  p\        V\        4      '       g   K  VR8w  g   K$  VNK(  	  ppV'       g   V'       d   RMRVR&   R# \        V4      ^8X  d   V^ ,          VR&   MV Uu. uF  pRV/NK	  	  upVR&   V'       d   VP                  RR4       R# R# u upi u upi )u  Normalize a ``type: [...]`` array into *out* (llama.cpp and Gemini-via-OpenAI reject arrays).
Per AI-SDK: one non-null type â†’ ``type: X`` (+ ``nullable`` if ``null`` present); several â†’
``anyOf`` of single-type schemas so EVERY branch survives; none â†’ ``null``/object fallback.r�   r   r   NÚanyOfr    T)r   r#   r6   rT   )r\   rf   Úhas_nullÚtr¤   s   &&   r   Ú_normalize_type_arrayrÄ     s�   € ð ˜‰€HÙ ÓG™5�a¤J¨q´#×$6”¸1À¹;—�™5€HÐGßß (‘f¨hˆˆF‰ÙÜ
ˆ8ƒ}˜ÔØ˜q•kˆˆFŠá-5Ó6©X¨˜ ›©XÑ6ˆˆG‰ßØ�‰�z 4Ö(ñ ùò Hùò 7s   ŠB#§B#°B#Á2B(c               ó$   € V ^8„  d   QhRRRRRR/# )r   r   r   r-   r#   r	   r   )r   s   "r   r   r   )  s&   € ÷ Oñ O˜ð O Cð O¨Cñ Or   c                ó>
  € \        V \        4      '       dX   V \        9   d-   \        P	                  RWV 4       V R8X  d   \        4       # RV /# \        P	                  RW4       \        4       # \        V \        4      '       d/   \        V 4       UUu. uF  w  r#\        W1 RV R24      NK  	  upp# \        V \        4      '       g   V # V P                  R4      p\        V\        4      '       d   \        WA R24      M/ p/ pV P                  4        EFk  w  rxVR8X  d$   \        V\        4      '       d   \        W†4       K0  V\        9   dz   \        V\        4      '       dd   VR8X  d   TM/ p	VP                  4        U
Uu/ uF7  w  r«V	P                  Wª4      \        W± R	V R	V	P                  Wª4       24      bK9  	  upp
Wg&   K´  VR
8X  d~   \        V\        4      '       dh   VP                  4        U
Uu/ uFE  w  r«T
\        V\        4      '       d   \        W± R	V R	V
 24      M\        P                   ! V4      bKG  	  upp
Wg&   EK8  VR9   d.   \        V\"        4      '       d   TM\        W� R	V 24      Wg&   EKl  V\$        9   d½   VR8X  d   \        V\"        4      '       d   EK—  VR8X  d]   V'       dU   \        V\        4      '       d?   V Uu. uF,  p\        V\        4      '       d   VP                  WÌ4      MTNK.  	  upWg&   EKú  \        V\        \        34      '       d   \        P                   ! V4      MTWg&   EK3  V\&        9   d   \        W� R	V 24      Wg&   EKS  \        P                   ! V4      Wg&   EKn  	  \        V\        4      '       d¹   VP                  4        U
Uu. uFE  w  r«\        V\        4      '       g   K  VP                  R4      RJ g   K4  VP                  Wª4      NKG  	  pp
pV'       dP   VP                  R. 4      p\        V\        4      '       d   TM. pYí Uu. uF  qwV9  g   K  VNK  	  up,           VR&   VP                  R4      R8X  d�   \        VP                  R4      \        4      '       g   / VR&   VP                  R4      p\        V\        4      '       d:   V Uu. uF,  p\        V\        4      '       g   K  WÆR,          9   g   K*  VNK.  	  upM. VR&   V# u uppi u upp
i u upp
i u upi u upp
i u upi u upi )u×  Recursively sanitize a JSON-Schema fragment: bare-string schemas â†’ ``{"type": <value>}``
(unknown strings â†’ permissive object); object nodes gain ``properties: {}``; ``type`` arrays
are normalized; property keys are renamed to the provider-safe pattern and ``required``
follows, with entries missing from ``properties`` pruned.

- Normalizes ``type: [X, "null"]`` arrays to single ``type: X`` (keeping ``nullable: true`` as a hint),
and multi-type arrays like ``["number", "string"]`` to an ``anyOf`` of single-type schemas so no branch
is dropped (ported from anomalyco/opencode#31877). - Recurses into ``properties``, ``items``,
``additionalProperties``, ``anyOf``, ``oneOf``, ``allOf``, and ``$defs`` / ``definitions``.
zGschema_sanitizer[%s]: replacing bare-string schema %r with {'type': %r}r   r   zMschema_sanitizer[%s]: replacing non-schema string %r with empty object schemaÚ[Ú]r   z.propertiesÚ.Údependenciesr   T>   r   ÚadditionalProperties)r   r#   Ú_BARE_TYPE_NAMESr8   r9   r   r   Ú	enumeraterx   r
   rI   r?   r   rÄ   Ú_SCHEMA_MAP_KEYSrv   rw   r�   Ú_NON_SCHEMA_LIST_KEYSÚ_SCHEMA_CHILD_KEYS)r   r-   r>   r   Úprops_inÚprop_renamesrf   r"   r\   r:   r   r    ÚrÚliftedr   s   &&             r   rx   rx   )  s[  € ô �$œ×ÒØÔ#Ô#Ü�L‰LÐbØ Tô+à&*¨hÔ&6”=“?ÐJ¸VÀT¸NÐJÜ�‰ð 0Ø15ô	=ä‹ÐÜ�$œ×ÒÜDMÈdÄOÔTÁO¹¸”˜t v¨Q¨q¨c° ^Ö4ÁOÒTÐTÜ�dœD×!Ò!Øˆà�x‰x˜Ó%€Hä! (¬D×1Ò1ô *¨(°f¸KÐ4HÔIØ79ð à€CØ—j‘j—l‰
ˆð �&Œ=œZ¨¬t×4Ò4Ü! %Ö-ØÔ$Ô$¬°E¼4×)@Ò)@Ø&)¨\Ô&9‘l¸rˆGð "ŸK™KœMô+á)‘D�Að —‘˜AÓ!¤>°!°v¸Q¸s¸eÀ1ÀWÇ[Á[ÐQRÓEVÐDWÐ5XÓ#YÒYÙ)ò+ˆC‹Hð �NÔ"¤z°%¼×'>Ò'>à:?¿+¹+¼-ôIÙ:G±$°!ð ÄZÐPQÔSW×EXÒEXœ>¨!¨v°Q°s°e¸1¸Q¸CÐ-@ÔAÜ!Ÿ]š]¨1Ó-ò.Ù:GòIˆCŒHàÐ5Ô5ä *¨5´$× 7Ò 7‘u¼^ÈEÐU[Ð[\Ð]`Ð\aÐSbÓ=cˆCŒHØÔ)Ô)Ø�jÔ ¤Z°´t×%<Ò%<ÚØ�jÔ §\´jÀÌ×6MÒ6MÙY^Ó_ÑY^ÐTU´jÀÄC×6HÒ6H˜L×,Ñ,¨QÔ2ÈaÒOÑY^Ñ_�”ä3=¸eÄdÌDÀ\×3RÒ3Rœ4Ÿ=š=¨Ô/ÐX]�”ØÔ&Ô&Ü% e¨v°Q°s°e¨_Ó=ˆCŒHô —}’} UÓ+ˆCŒHñG #ôH �(œD×!Ò!Ø5=·^±^Ô5Eô HÑ5E©T¨QÜ ¤4×(ô )Ø-.¯U©U°:Ó->À$Ð-Fô )�,×"Ñ" 1Ö(Ñ5Eˆñ HçØ—w‘w˜z¨2Ó.ˆHÜ#-¨h¼×#=Ò#=‘xÀ2ˆHØ&¸Ó)W¹°#ÈhÑCV¯#¨#¹Ñ)WÕWˆC�
‰OØ
‡w�wˆvƒ˜(Ô"Ü˜#Ÿ'™' ,Ó/´×6Ò6Ø "ˆC�Ñð —7‘7˜:Ó&ˆä(¨´4×8Ò8ñ (0Óa¡x !´:¸aÄ×3EœAÈ!ÐS_ÕO`ÑJ`ŸA˜A¡xÒaØ>@ð 	ˆJ‰à€Jùów Uùó.+ùóIùò `ùóHùò
 *Xùò bsI   ÂS8Æ=S>Ç7ATË2T
Î,TÏTÏ"TÐ2TÐ?TÒ<TÓ
TÓ(TÚpatternr   c               ó   € V ^8„  d   QhRR/# )r   r   r   r   )r   s   "r   r   r   €  s   € ÷ &ñ &�cñ &r   c              #  óþ   "  € \        V \        4      '       d   V x € \        V \        4      '       d   V P                  4       M\        V \        4      '       d   T MRpV F  p\	        V4       Rj  x€L
  K  	  R#  L
5i)zVPre-order walk over every dict node (yielded before its values, so it may be mutated).Nr   )r   r
   Úvaluesr   Ú_dict_nodes)r   ÚchildrenÚchilds   &  r   rÙ   rÙ   €  s[   é € ä�$œ×ÒØŠ
Ü *¨4´× 6Ò 6ˆt�{‰{Œ}ÄJÈtÔUY×DZÒDZ¹DÐ`b€HÛˆÜ˜uÓ%×%Ò%ó Ù%ùs   ‚A.A=Á0A;Á1A=c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   ri   rj   Ú
strip_nodezCallable[[dict], int]Úlog_msgr#   r	   útuple[list[dict], int]r   )r   s   "r   r   r   ‰  s,   € ÷ ñ ØðØ#8ðØCFðØKañr   c                óÞ  a€ ^ pT ;'       g    R F»  p\        V\        4      '       g   K  VP                  R4      p\        V\        4      '       d   VP                  R4      MRp\        V\        4      '       d   TMVP                  R4      p\        V\        4      '       g   K–  V\        V3R l\	        V4       4       4      ,          pK½  	  V'       d   \
        P                  W#4       W3# )z¶Apply *strip_node* (-> keywords removed) to every dict node of each tool's parameters, in
place; OpenAI (``{"function": {"parameters"}}``) and Responses (``{"parameters"}``) formats.rq   rr   Nc              3  ó4   <"  € T F  pS! V4      x € K  	  R # 5ir0   r   )r3   r   rÝ   s   & €r   r4   Ú"_reactive_strip.<locals>.<genexpr>•  s   øé € ÐMÑ9L°™J t×,Ð,Ó9Lùs   ƒr   )r   r
   rI   ÚsumrÙ   r8   Úinfo)ri   rÝ   rÞ   r�   rm   r   r|   s   &f&    r   Ú_reactive_striprå   ‰  s²   ø€ ð €HØ—�˜’ˆÜ˜$¤×%Ò%ÙØ�X‰X�jÓ!ˆÜ)3°B¼×)=Ò)=�—‘˜Ô%À4ˆÜ% f¬d×3Ò3‘¸¿¹À,Ó9OˆÜ�fœd×#Ô#ØœÔM¼ÀVÔ9LÓMÓMÕMŠHñ ÷ Ü�‰�GÔ&Øˆ?Ðr   c               ó    € V ^8„  d   QhRRRR/# ©r   ri   rj   r	   rß   r   )r   s   "r   r   r   ›  s   € ÷ ;ñ ; Jð ;Ð3Iñ ;r   c                ó&   € R R lp\        WR4      # )u  Strip ``pattern``/``format`` in place â€” reactive, only after llama.cpp's grammar converter
rejected a schema (its regex engine is a small ECMAScript subset); cloud providers use these as
prompting hints. Only beside ``type``/combinators, so a property *named* ``pattern`` stays.c               ó    € V ^8„  d   QhRRRR/# ©r   r   r
   r	   rR   r   )r   s   "r   r   Ú.strip_pattern_and_format.<locals>.__annotate__Ÿ  s   € ÷ ñ �Tð ˜cñ r   c                óÐ   € \        V P                  4       \        ,          4      pV'       d   V  Uu. uF  q"\        9   g   K  VNK  	  upM. pV F  pW K  	  \	        V4      # u upi r0   )r�   ÚkeysÚ_SCHEMA_MARKERSÚ_STRIP_ON_RECOVERY_KEYSr6   )r   Ú	is_schemar   Úhitss   &   r   Ú_stripÚ(strip_pattern_and_format.<locals>._stripŸ  sW   € Ü˜Ÿ™›¤Õ6Ó7ˆ	ßDM™4Ó@™4�aÔ(?Ñ#?—�™4Ò@ÐSUˆÛˆAØ’ñ ä�4‹yÐùò As   ±A#ÁA#zlschema_sanitizer: stripped %d pattern/format keyword(s) from tool schemas (llama.cpp grammar-parse recovery)©rå   ©ri   rò   s   & r   Ústrip_pattern_and_formatrö   ›  s   € õô Øð	:ó;ð ;r   c               ó    € V ^8„  d   QhRRRR/# rç   r   )r   s   "r   r   r   «  s   € ÷ Fñ F˜Jð FÐ+Añ Fr   c                ó&   € R R lp\        WR4      # )u¶   Strip ``enum`` keywords whose string values contain ``/``, in place: xAI's grammar compiler
rejects them (HTTP 400 before any token) â€” typically MCP enums of HuggingFace model IDs.c               ó    € V ^8„  d   QhRRRR/# rê   r   )r   s   "r   r   Ú&strip_slash_enum.<locals>.__annotate__®  s   € ÷ ñ �Tð ˜cñ r   c                óÒ   € V P                  R 4      p\        V\        4      '       d@   \        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       d   V R  ^# ^ # )r¹   c              3  ó\   "  € T F"  p\        V\        4      ;'       d    R V9   x € K$  	  R# 5i)rG   N)r   r#   )r3   r    s   & r   r4   Ú3strip_slash_enum.<locals>._strip.<locals>.<genexpr>°  s)   é € Ð-`ÑW_ÐRS¬j¸¼CÓ.@×.MÐ.MÀSÈAÁXÔ.MÓW_ùs   ‚,ž,TF)rI   r   r   Úany)r   Úenum_vals   & r   rò   Ú strip_slash_enum.<locals>._strip®  sL   € Ø—8‘8˜FÓ#ˆÜ�h¤×%Ò%¯#«#Ñ-`ÑW_Ó-`¯#¯#ª#Ñ-`ÑW_Ó-`×*`Ò*`Ø�V�ÙÙr   zwschema_sanitizer: stripped %d enum keyword(s) containing '/' from tool schemas (xAI Responses grammar-compile recovery)rô   rõ   s   & r   Ústrip_slash_enumr  «  s!   € õô Øð	EóFð Fr   )rÁ   ÚoneOf)r°   r±   r   Úexamplesr0   )ÚallOfrÁ   r  r¹   Únot>   r�   Úarrayr©   r   rª   r§   r¨   >   r¹   r  r   ÚdependentRequired>   r   ÚdefinitionsÚdependentSchemasÚpatternPropertiesú$defs>   Úifr  ÚelseÚthenr  rÁ   r   r  ÚcontainsÚprefixItemsÚpropertyNamesÚadditionalItemsÚunevaluatedItemsrË   ÚunevaluatedProperties>   r   r  rÁ   r  ):Ú__conditional_annotations__Ú__doc__Ú
__future__r   rv   ÚloggingÚreÚtypingr   r   Úurllib.parser   Ú	getLoggerÚ__name__r8   Úcompiler1   r(   r¢   r—   r   r   r*   r?   rP   rM   rS   rc   rn   rl   Ú	frozensetr„   r{   r‹   rz   r�   r™   ry   r�   rR   Úfloatr#   r«   Ú__annotations__r³   r¾   rÌ   rÏ   rÎ   rÐ   rÄ   rx   rï   rî   rÙ   rå   rö   r  )r  s   @r   Ú<module>r"     sŠ  øðôaõ #ã Û Û 	ß  Ý  à	×	Ò	˜8Ó	$€ð �zŠzÐ3Ó4€Ø—j’jÐ!3Ó4Ð Ø €ØBÐ õ@õ?õ=õ
ð& —’Ð,Ó-€Ø—j’j Ó.Ð ÷(÷Võ.Oõ
ñ2 $ Y KÓ0Ð õ!ð GÐ ð¸h÷ õAõ4ð&ÀT÷ &ð, 	ˆ)�S˜) U¨H°c¸8ð+EÐ ˜ó EõJõ&ñ: ÒbÓcÐ á!Ò"WÓXÐ ÙÒlÓmÐ Ùò  ó Ð õ)õ"Oñf $ Y°Ð$9Ó:Ð ÙÒ?Ó@€õ&õõ$;÷ Fr   