+
    lHàj:  ã                  óP  € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIHtHtHtH	t	 ^ RI
HtHtHtHtHt ^ RIt^ RIHtHt ^ RIHtHtHt ]P0                  ! ]4      tRt^´t^tRJt^
tR R	 lt R
 R lt!R R lt"R R lt#R R lt$R R lt%R R lt&R R lt'R R lt(R R lt)R R lt*R R lt+R  R! lt,R" R# lt-R$ R% lt.RKR' R( llt/R)R*R+R,R-R.R/R0R1R.R2R+R3/R4R.R5R6R.R2/R+R7/R8R.R5R6R.R2/R+R9/R:R.R2R+R;/R<R.R2R+R=/R>R.R?R+R@RAR&/RBR.R?R+RCRAR&//RDR1.//t0RE t1]Pd                  ! R*R*]0]1]$RF.RGRHRI7       R# )Law  X Search tool backed by xAI's built-in ``x_search`` Responses API tool.

Registers when either xAI credential path is available (``XAI_API_KEY`` or ``hermes auth add
xai-oauth``). At call time an explicit ``XAI_API_KEY`` wins (``prefer_api_key=True``): x_search
is API-metered and the subscription OAuth bearer answers ``/v1/responses`` without citations.
Date filters are validated client-side so malformed windows fail fast instead of burning a
billable call. Results carry ``degraded``: True when a narrowing filter was active AND xAI
returned no citations in either channel (answer came from model knowledge, not the X index).
)ÚannotationsN)ÚdateÚdatetimeÚtimezoneÚUTC)ÚAnyÚDictÚListÚOptionalÚTuple)ÚregistryÚ
tool_error)ÚDEFAULT_XAI_BASE_URLÚhermes_xai_user_agentÚresolve_xai_http_credentialszgrok-4.5c               ó   € V ^8„  d   QhRR/# )é   Úreturnúdict[str, Any]© )Úformats   "Ú8/home/ubuntu/.hermes/hermes-agent/tools/x_search_tool.pyÚ__annotate__r   "   s   € ÷ ñ ˜~ñ ó    c                 óx   €  ^ RI Hp  V ! 4       P                  R/ 4      ;'       g    / #   \         d    / u # i ; i)é    ©Úload_configÚx_search)Úhermes_cli.configr   ÚgetÚ	Exceptionr   s    r   Ú_load_x_search_configr"   "   s;   € ðÝ1Ù‹}× Ñ  ¨RÓ0×6Ð6°BÐ6øÜô ØŠ	ðús   ‚#) ¦) ©9¸9c               ó   € V ^8„  d   QhRR/# )r   r   zOptional[str]r   )r   s   "r   r   r   *   s   € ÷ ñ ¨ñ r   c                 ó  € \        4       P                  R 4      p V e(   \        V 4      P                  4       P	                  4       MRpV'       d4   V\
        9  d)   RP                  \
        4      p\        RV RV : R24      hT;'       g    R# )Úreasoning_effortNÚ ú, z*x_search.reasoning_effort must be one of: z (got Ú))r"   r    ÚstrÚstripÚlowerÚX_SEARCH_REASONING_EFFORTSÚjoinÚ
ValueError)Ú	raw_valueÚeffortÚalloweds      r   Ú_get_x_search_reasoning_effortr2   *   s|   € Ü%Ó'×+Ñ+Ð,>Ó?€IØ/8Ò/DŒS�‹^×!Ñ!Ó#×)Ñ)Ô+È"€Fß�&Ô :Ô:Ø—)‘)Ô6Ó7ˆÜÐEÀgÀYÈfÐU^ÑTaÐabÐcÓdÐdØ�>ˆ>�TÐr   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   Úkeyr)   ÚdefaultÚintÚfloorr   r   )r   s   "r   r   r   3   s(   € ÷ ñ ˜3ð ¨ð °Sð ¸Sñ r   c           	     ó‚   €  \        V\        \        4       P                  W4      4      4      #   \         d    Tu # i ; i©N)Úmaxr6   r"   r    r!   )r4   r5   r7   s   &&&r   Ú_get_x_search_intr;   3   s<   € ðÜ�5œ#Ô3Ó5×9Ñ9¸#ÓGÓHÓIÐIøÜô ØŠðús   ‚+. ®>½>c               ó   € V ^8„  d   QhRR/# )r   r   ztuple[str, str, str]r   )r   s   "r   r   r   :   s   € ÷ Bñ BÐ1ñ Br   c                 óz  € \        RR7      p \        V P                  R4      ;'       g    R4      P                  4       pV'       g   \	        R4      h\        V P                  R4      ;'       g    \
        4      P                  4       P                  R4      pY\        V P                  R4      ;'       g    R	4      3# )
u¬  Return ``(api_key, base_url, source)``; ``source`` is ``"xai-oauth"`` or ``"xai"``. Raises RuntimeError
when no credential is usable (expiry between registration and call -> clean tool error, not a 401).

x_search is API-index access: when a subscription OAuth credential is configured alongside a paid
``XAI_API_KEY``, the OAuth path authorizes but answers ``/v1/responses`` in a degraded Grok explanatory
mode with no citations, while the API key returns real posts (#88040). Pass ``prefer_api_key=True`` so
the shared resolver checks the explicit API key first â€” same root cause as the TTS fix for #87045
(#87081) â€” keeping OAuth as the fallback when no API key is configured.
T)Úprefer_api_keyÚapi_keyr&   z~No xAI credentials available. Run `hermes auth add xai-oauth` to sign in with your SuperGrok subscription, or set XAI_API_KEY.Úbase_urlÚ/ÚproviderÚxai)r   r)   r    r*   ÚRuntimeErrorr   Úrstrip)Úcredsr?   r@   s      r   Ú_resolve_xai_bearerrG   :   sœ   € ô )¸Ô=€EÜ�%—)‘)˜IÓ&×,Ð,¨"Ó-×3Ñ3Ó5€GßÜðOó
ð 	
ô �5—9‘9˜ZÓ(×@Ð@Ô,@ÓA×GÑGÓI×PÑPÐQTÓU€HØœc %§)¡)¨JÓ"7×"@Ð"@¸5ÓAÐAÐAr   c               ó   € V ^8„  d   QhRR/# )r   r   Úboolr   )r   s   "r   r   r   O   s   € ÷ Rñ R Tñ Rr   c                 óˆ   € \        \        \        4       P                  R4      ;'       g    R4      P	                  4       4      # )zOTrue when xAI credentials resolve to a non-empty bearer (OAuth auto-refreshed).r?   r&   )rI   r)   r   r    r*   r   r   r   Úcheck_x_search_requirementsrK   O   s2   € ä”Ô0Ó2×6Ñ6°yÓA×GÐGÀRÓH×NÑNÓPÓQÐQr   c               ó$   € V ^8„  d   QhRRRRRR/# )r   ÚhandlesúOptional[list[str]]Ú
field_namer)   r   z	list[str]r   )r   s   "r   r   r   T   s"   € ÷ ñ Ð 3ð Àð Èñ r   c                ó¸   € R  T ;'       g    .  4        Uu. uF  q"'       g   K  VNK  	  pp\        V4      \        8”  d   \        V R\         R24      hV# u upi )c              3  ó†   "  € T F7  p\        T;'       g    R 4      P                  4       P                  R4      x € K9  	  R# 5i)r&   Ú@N)r)   r*   Úlstrip)Ú.0Úhandles   & r   Ú	<genexpr>Ú%_normalize_handles.<locals>.<genexpr>U   s2   é € Ð]É}ÀVœ3˜vŸ|˜|¨Ó,×2Ñ2Ó4×;Ñ;¸C×@Ð@Ë}ùs
   ‚A•,Az supports at most z handles)ÚlenÚMAX_HANDLESr.   )rM   rO   ÚhÚcleaneds   &&  r   Ú_normalize_handlesr\   T   s[   € Ù]ÈwÏ}È}ÐZ\È}Ô]ÓcÑ]�QÓab�qˆqÑ]€GÐcÜ
ˆ7ƒ|”kÔ!Ü˜J˜<Ð'9¼+¸ÀhÐOÓPÐPØ€Nùò ds
   –	A¤Ac               ó$   € V ^8„  d   QhRRRRRR/# )r   Úvaluer)   rO   r   zOptional[date]r   )r   s   "r   r   r   [   s&   € ÷ Tñ T˜3ð T¨Cð T°Nñ Tr   c                óÎ   € V P                  4       pV'       g   R#  \        P                  ! VR4      P                  4       #   \         d   p\	        T RT: R24      ThRp?ii ; i)zdStrict YYYY-MM-DD or None for blank (xAI silently accepts malformed dates and returns no citations).Nz%Y-%m-%dz must be YYYY-MM-DD (got r(   )r*   r   Ústrptimer   r.   )r^   rO   ÚrawÚexcs   &&  r   Ú_parse_iso_daterc   [   sc   € à
�+‰+‹-€CßÙðTÜ× Ò   jÓ1×6Ñ6Ó8Ð8øÜô TÜ˜J˜<Ð'@ÀÁÀqÐIÓJÐPSÐSûðTús   œ$A ÁA$ÁAÁA$c               ó$   € V ^8„  d   QhRRRRRR/# )r   Ú	from_dater)   Úto_dater   ÚNoner   )r   s   "r   r   r   f   s!   € ÷ 
ñ 
 Cð 
°#ð 
¸$ñ 
r   c                ó€  € \        V R4      \        VR4      r2V'       d=   V'       d5   W#8”  d/   \        RVP                  4        RVP                  4        R24      h\        P                  ! \
        4      P                  4       pVe7   W$8”  d/   \        RVP                  4        RVP                  4        R24      hR# R# )zYBoth parse as YYYY-MM-DD; from <= to; from not after today UTC (to may be in the future).re   rf   zfrom_date (z ) must be on or before to_date (r(   NzC) is in the future; X Search only indexes past posts (today UTC is )rc   r.   Ú	isoformatr   Únowr   r   )re   rf   Úparsed_fromÚ	parsed_toÚ	today_utcs   &&   r   Ú_validate_date_rangern   f   sÀ   € ä,¨Y¸ÓDÄoÐV]Ð_hÓFi�ß—y [Ô%<ÜØ˜+×/Ñ/Ó1Ð2Ð2RÐS\×SfÑSfÓShÐRiÐijÐkó
ð 	
ô —’œSÓ!×&Ñ&Ó(€IØÒ ;Ô#:ÜØ˜+×/Ñ/Ó1Ð2ð 3>Ø>G×>QÑ>QÓ>SÐ=TÐTUðWó
ð 	
ñ $;Ñr   c               ó   € V ^8„  d   QhRR/# )r   Úpayloadr   r   )r   s   "r   r   r   u   s   € ÷ 5ñ 5˜~ñ 5r   c              #  óÐ   "  € V P                  R . 4      ;'       g    .  F?  pVP                  R4      R8X  g   K  VP                  R. 4      ;'       g    .  Rj  x€L
  KA  	  R#  L
5i)ÚoutputÚtypeÚmessageÚcontentN©r    )rp   Úitems   & r   Ú_message_contentsrx   u   sU   é € Ø—‘˜H bÓ)×/Ð/¨RÒ/ˆØ�8‰8�FÓ˜yÖ(Ø—x‘x 	¨2Ó.×4Ð4°"×4Ò4ó 0á4ùs   ‚3A&ºA&ÁA&ÁA$ÁA&c               ó    € V ^8„  d   QhRRRR/# )r   rp   r   r   r)   r   )r   s   "r   r   r   {   s   € ÷ 6ñ 6 Nð 6°sñ 6r   c                óü   € \        V P                  R 4      ;'       g    R4      P                  4       pV'       d   V# R \        V 4       4       pR V 4       pRP	                  R V 4       4      P                  4       # )Úoutput_textr&   c              3  óT   "  € T F  qP                  R 4      R9   g   K  Vx € K   	  R# 5i)rs   N>   Útextr{   rv   ©rT   Úcs   & r   rV   Ú)_extract_response_text.<locals>.<genexpr>   s"   é € ÐbÑ5�a¿¹¸v»ÐJaÑ9a—’Ó5ùs   ‚(ž
(c              3  ó†   "  € T F7  p\        VP                  R 4      ;'       g    R4      P                  4       x € K9  	  R# 5i)r}   r&   N)r)   r    r*   r~   s   & r   rV   r€   €   s1   é € Ð@±x°!ŒS�—‘�v“×$Ð$ "Ó%×+Ñ+×-Ð-³xùs
   ‚!A¤Az

c              3  ó8   "  € T F  q'       g   K  Vx € K  	  R # 5ir9   r   )rT   Úps   & r   rV   r€   �   s   é € Ð-¡%˜Q«1—q’q£%ùs   ‚	�
)r)   r    r*   rx   r-   )rp   r{   ÚcontentsÚpartss   &   r   Ú_extract_response_textr†   {   sg   € Ü�g—k‘k -Ó0×6Ð6°BÓ7×=Ñ=Ó?€KßØÐÙbÔ,¨WÔ5Ób€HÙ@±xÓ@€EØ�;‰;Ñ-¡%Ó-Ó-×3Ñ3Ó5Ð5r   c               ó    € V ^8„  d   QhRRRR/# )r   rp   r   r   zlist[dict[str, Any]]r   )r   s   "r   r   r   „   s   € ÷ 	ñ 	 ~ð 	Ð:Nñ 	r   c                óJ  € \        V 4       UUu. uF†  pVP                  R . 4      ;'       g    .  Fc  pVP                  R4      R8X  g   K  RVP                  RR4      RVP                  RR4      RVP                  R4      RVP                  R4      /NKe  	  Kˆ  	  upp# u uppi )r   rs   Úurl_citationÚurlr&   ÚtitleÚstart_indexÚ	end_index)rx   r    )rp   ru   Úas   &  r   Ú_extract_inline_citationsr�   „   s¦   € ô )¨Ô1ôñ
 2ˆGØ—‘˜]¨BÓ/×5Ð5°2Ò5ˆAØ�5‰5�‹=˜NÑ*ô	
Ø�1—5‘5˜ Ó# W¨a¯e©e°G¸RÓ.@Ø˜1Ÿ5™5 Ó/°¸a¿e¹eÀKÓ>Pó	
ñ
 6ñ	
ñ 2òð ùó s   �B­BÁABc               ó    € V ^8„  d   QhRRRR/# )r   rb   zrequests.HTTPErrorr   r)   r   )r   s   "r   r   r   �   s   € ÷ [ñ [Ð/ð [°Cñ [r   c                ó†  € \        V R R4      pVf   \        V 4      #  VP                  4       p\	        V\
        4      '       gK   \        \        VRR4      ;'       g    R4      P                  4       pV'       d
   VR,          # \        V 4      # \        VP                  R4      ;'       g    R4      P                  4       p\        VP                  R4      ;'       g    R4      P                  4       ;'       g    \        V4      pV'       d   WE9  d   V RV 2MT;'       g    \        V 4      #   \         d    Rp ELi ; i)ÚresponseNr}   r&   :Niô  NÚcodeÚerrorz: )Úgetattrr)   Újsonr!   Ú
isinstanceÚdictr*   r    )rb   r’   rp   r}   r“   rt   s   &     r   Ú_http_error_messager™   �   s
  € Ü�s˜J¨Ó-€HØÒÜ�3‹xˆðØ—-‘-“/ˆô �gœt×$Ò$Ü”7˜8 V¨RÓ0×6Ð6°BÓ7×=Ñ=Ó?ˆß!ˆt�D�zÐ/¤s¨3£xÐ/Üˆw�{‰{˜6Ó"×(Ð( bÓ)×/Ñ/Ó1€DÜ�'—+‘+˜gÓ&×,Ð,¨"Ó-×3Ñ3Ó5×EÐE¼¸W»€Gß$(¨TÔ-@ˆtˆf�B�w�iÑ Àg×ZÐZÔRUÐVYÓRZÐZøô ô Ø‹ðús   žD/ Ä/E Ä?E c               ó$   € V ^8„  d   QhRRRRRR/# )r   r”   r)   rb   ÚBaseExceptionr   r   )r   s   "r   r   r       s&   € ÷ Vñ V�sð V ð V°3ñ Vr   c                óx   € R RRRRRRV /p\         P                  ! / VCR\        V4      P                  /CRR7      # )	ÚsuccessFrB   rC   Útoolr   r”   Ú
error_type©Úensure_ascii)r–   Údumpsrs   Ú__name__)r”   rb   Úbodys   && r   Ú_error_jsonr¥       s@   € Ø�u˜j¨%°¸ÀWÈeÐT€DÜ�:Š:Ð@˜Ð@˜|¬T°#«Y×-?Ñ-?Ñ@ÈuÔUÐUr   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   rŠ   r)   Úheaderszdict[str, str]rp   r   r   zrequests.Responser   )r   s   "r   r   r   ¥   s/   € ÷ Eñ E˜Cð E¨.ð EÀ>ð EÐVgñ Er   c           	     ó°  € \        R\        ^4      p\        R\        ^ 4      p\        V^,           4       F.  p \        P
                  ! WW#R7      pVP                  4        Vu # 	  \#        R4      h  \        P                   dA   p\        \        TRR4      RR4      pTe   TR8  g   YT8¼  d   h R\        T4      r© Rp?M?Rp?i\        P                  \        P                  3 d   pYT8¼  d   h R	Tr© Rp?MRp?ii ; i\        P                  R
Y•^,           T^,           T
4       \        P                  ! \!        RRT^,           ,          4      4       EK#  )zSPOST with retries on 5xx / timeout / connection errors; re-raises the last failure.Útimeout_secondsÚretries)r§   r–   Útimeoutr’   NÚstatus_codeiô  ÚupstreamÚ	transientz(x_search %s failure on attempt %s/%s: %sg      @g      ø?z*x_search request did not return a response)r;   Ú DEFAULT_X_SEARCH_TIMEOUT_SECONDSÚDEFAULT_X_SEARCH_RETRIESÚrangeÚrequestsÚpostÚraise_for_statusÚ	HTTPErrorr•   r™   ÚReadTimeoutÚConnectionErrorÚloggerÚwarningÚtimeÚsleepÚminrD   )rŠ   r§   rp   r©   Úmax_retriesÚattemptr’   Úer¬   ÚkindÚdetails   &&&        r   Ú_post_with_retriesrÂ   ¥   s"  € ä'Ð(9Ô;[Ð]_Ó`€OÜ# IÔ/GÈÓK€KÜ˜ q�Ö)ˆð	*Ü—}’} SÀÔaˆHØ×%Ñ%Ô'ØŠOñ	 *ô  ÐCÓ
DÐDøô ×!Ñ!ô 	>Ü!¤'¨!¨Z¸Ó">ÀÈtÓTˆKØÒ" k°CÔ&7¸7Ô;QØØ%Ô':¸1Ó'=•&ûÜ×$Ñ$¤h×&>Ñ&>Ð?ô 	*ØÔ%ØØ&¨•&ûð	*úô 	�‰ÐAÀ4ÐSTÍÐVaÐdeÕVeÐgmÔnÜ�
Š
”3�s˜C 7¨Q¥;Õ/Ó0×1s)   ¹)A2Á2C>Â6CÃ&C>Ã)C>Ã*
C9Ã9C>c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r   re   r)   rf   Úenable_image_understandingrI   Úenable_video_understandingr   z tuple[dict[str, Any], list[str]]r   )r   s   "r   r   r   ¼   s6   € ÷ $ñ $Ø69ð$ØDGð$à $ð$àBFð$ð &ñ$r   c                ól  € \        V R4      p\        VR4      pV'       d   V'       d   \        R4      h\        W#4       RR/p. p	RV3RV3RVP                  4       3RVP                  4       33p
V
 F$  w  r¼V'       g   K  WÈV&   V	P	                  V4       K&  	  V'       d   RVR	&   V'       d   RVR
&   W‰3# )zLReturn ``(tool_def, active_filters)``; raises ValueError on invalid filters.Úallowed_x_handlesÚexcluded_x_handlesz@allowed_x_handles and excluded_x_handles cannot be used togetherrs   r   re   rf   TrÄ   rÅ   )r\   r.   rn   r*   Úappend)rÇ   rÈ   re   rf   rÄ   rÅ   r1   ÚexcludedÚtool_defÚactive_filtersÚfiltersr4   r^   s   &&&&&&       r   Ú_build_x_search_tool_defrÎ   ¼   sÉ   € ô
 !Ð!2Ð4GÓH€GÜ!Ð"4Ð6JÓK€Hß—8ÜÐ[Ó\Ð\Ü˜Ô,à &¨
Ð3€HØ "€NØ# WÐ-Ð0DÀhÐ/OØ˜YŸ_™_Ó.Ð/°)¸W¿]¹]»_Ð1MðO€Gã‰
ˆß‰5Ø!�S‰MØ×!Ñ! #Ö&ñ ÷ "Ø15ˆÐ-Ñ.ß!Ø15ˆÐ-Ñ.ØÐ#Ð#r   Fc               ó8   € V ^8„  d   QhRRRRRRRRRRRR	R
R	RR/# )r   Úqueryr)   rÇ   rN   rÈ   re   rf   rÄ   rI   rÅ   r   r   )r   s   "r   r   r   Ö   sX   € ÷ =&ñ =&Øð=&à*ð=&ð ,ð=&ð ð	=&ð
 ð=&ð !%ð=&ð !%ð=&ð 	ñ=&r   c                óê  € V '       d   V P                  4       '       g   \        R 4      #  \        4       w  rxp	 \        YY4YV4      w  r¼\        4       p R\	        \        4       P                  R4      ;'       g    R4      P                  4       ;'       g    \        RRRRT P                  4       /.RT.R	R
/pT'       d   RT/TR&   RRT 2RRR\        4       /p\        T R2Yþ4      P                  4       p\        TP                  R4      ;'       g    . 4      p\        T4      p\!        T4      ;'       d    T'       * ;'       d    T'       * pRRRRRT	RRRTR,          RT P                  4       R\#        T4      RTRTRTRT'       d   R R!P%                  T4       2MR/p\        P&                  ! TR
R"7      #   \         d   p
\        \	        T
4      4      u Rp
?
# Rp
?
ii ; i  \         d   p
\        \	        T
4      4      u Rp
?
# Rp
?
ii ; i  \(        P*                   d8   p\,        P/                  R#TRR$7       \1        \3        T4      T4      u Rp?# Rp?i\(        P4                   dD   p\,        P/                  R%TRR$7       \7        R&\8        ^4      p\1        R'T R(2T4      u Rp?# Rp?i\:         d8   p\,        P/                  R#TRR$7       \1        \	        T4      T4      u Rp?# Rp?ii ; i))zquery is required for x_searchNÚmodelr&   ÚinputÚroleÚuserru   ÚtoolsÚstoreFr0   Ú	reasoningÚAuthorizationzBearer zContent-Typezapplication/jsonz
User-Agentz
/responsesÚ	citationsr�   TrB   rC   Úcredential_sourcerž   r   rÐ   ÚanswerÚinline_citationsÚdegradedÚdegraded_reasonz'no citations returned despite filters: r'   r    zx_search failed: %s)Úexc_infozx_search timed out: %sr©   zxAI x_search timed out after z seconds)r*   r   rG   rD   r)   rÎ   r2   r.   r"   r    ÚDEFAULT_X_SEARCH_MODELr   rÂ   r–   Úlistr�   rI   r†   r-   r¢   r²   rµ   r¸   r”   r¥   r™   r¶   r;   r¯   r!   )rÐ   rÇ   rÈ   re   rf   rÄ   rÅ   r?   r@   Úsourcerb   rË   rÌ   r%   rp   r§   ÚdatarÚ   rÝ   rÞ   Úresultr¿   r«   s   &&&&&&&                r   Úx_search_toolræ   Ö   sÂ  € ÷ ˜Ÿ™ŸšÜÐ:Ó;Ð;ð$Ü$7Ó$9Ñ!ˆ˜6ð$Ü#;Ø°9Ø&ó$
Ñ ˆô :Ó;Ðð%&à”SÔ.Ó0×4Ñ4°WÓ=×CÐCÀÓD×JÑJÓL×fÐfÔPfØ�v˜v y°%·+±+³-Ð@ÐAØ�h�ZØ�Uð	
ˆ÷ Ø$,Ð.>Ð#?ˆG�KÑ à˜w w iÐ0°.ÐBTØÔ/Ó1ð
ˆô " X J¨jÐ"9¸7ÓL×QÑQÓSˆÜ˜Ÿ™ +Ó.×4Ð4°"Ó5ˆ	Ü4°TÓ:Ðô ˜Ó'×RÐR°	¬M×RÐRÐBRÔ>Rˆà�t˜Z¨Ð0CÀVÈVÐU_Ø�W˜WÕ% w°·±³¸xÔI_Ð`dÓIeØ˜Ð$6Ð8HÈ*ÐV^ØßYaÐ9¸$¿)¹)ÀNÓ:SÐ9TÑUÐgkð
ˆô �zŠz˜&¨uÔ5Ð5øôM ô $Üœ#˜c›(Ó#Õ#ûð$ûô ô $Üœ#˜c›(Ó#Õ#ûð$ûô> ×Ñô 6Ü�‰Ð*¨A¸ˆÔ=ÜÔ.¨qÓ1°1Ó5Õ5ûÜ×Ñô QÜ�‰Ð-¨q¸4ˆÔ@Ü#Ð$5Ô7WÐY[Ó\ˆÜÐ:¸7¸)À8ÐLÈaÓPÕPûÜô &Ü�‰Ð*¨A¸ˆÔ=Üœ3˜q›6 1Ó%Õ%ûð&ús¨   «F8 ¹G$ Á%H Á9H Â)H Â?A7H Ä7H ÅA1H Æ8G!ÇGÇG!ÇG!Ç$HÇ/HÈHÈHÈK2È%,IÉK2ÉK2É.K2É/8J-Ê'K2Ê-K2Ê:K2Ê;,K-Ë'K2Ë-K2Únamer   ÚdescriptionuÖ  Search X (Twitter) posts, profiles, and threads using xAI's built-in X Search tool. Read-only discovery only: use this for current discussion, reactions, or claims on public X rather than general web pages. Do not use it to post, reply, like, DM, upload media, delete, or inspect the user's authenticated X account â€” those require a separate authenticated X API surface outside this tool. Available when xAI credentials are configured (SuperGrok OAuth or XAI_API_KEY).Ú
parametersrs   ÚobjectÚ
propertiesrÐ   ÚstringzWhat to look up on X.rÇ   ÚarrayÚitemsz;Optional list of X handles to include exclusively (max 10).rÈ   z/Optional list of X handles to exclude (max 10).re   z)Optional start date in YYYY-MM-DD format.rf   z'Optional end date in YYYY-MM-DD format.rÄ   Úbooleanz?Whether xAI should analyze images attached to matching X posts.r5   rÅ   z?Whether xAI should analyze videos attached to matching X posts.Úrequiredc                ó$  € \        V P                  R R4      V P                  R4      V P                  R4      V P                  RR4      V P                  RR4      \        V P                  RR4      4      \        V P                  RR4      4      4      # )	rÐ   r&   rÇ   rÈ   re   rf   rÄ   FrÅ   )ræ   r    rI   )ÚargsÚkws   &,r   Ú_handle_x_searchrô   J  sx   € ÜØ�‰�˜"Ó˜tŸx™xÐ(;Ó<¸d¿h¹hÐG[Ó>\Ø�‰�˜bÓ! 4§8¡8¨I°rÓ#:ÜˆT�X‰XÐ2°EÓ:Ó;ÜˆT�X‰XÐ2°EÓ:Ó;ó	ð r   ÚXAI_API_KEYu   ðŸ�¦i † )rç   ÚtoolsetÚschemaÚhandlerÚcheck_fnÚrequires_envÚemojiÚmax_result_size_chars)ÚlowÚmediumÚhighÚxhigh)NNr&   r&   FF)3Ú__doc__Ú
__future__r   r–   Úloggingrº   r   r   r   r   Útypingr   r   r	   r
   r   r²   Útools.registryr   r   Útools.xai_httpr   r   r   Ú	getLoggerr£   r¸   rá   r¯   r°   r,   rY   r"   r2   r;   rG   rK   r\   rc   rn   rx   r†   r�   r™   r¥   rÂ   rÎ   ræ   ÚX_SEARCH_SCHEMArô   Úregisterr   r   r   Ú<module>r
     sÈ  ðñõ #ã Û Û ß 2Ó 2ß 3Õ 3ã ç /ß dÑ dà	×	Ò	˜8Ó	$€à#Ð Ø#&Ð  ØÐ Ø?Ð Ø€õõõõBõ*Rõ
õTõ
õ5õ6õ	õ[õ Võ
Eõ.$÷4=&ðB ˆJØð	Pð Ø�ØØØ˜ØÐ6ðð  Ø˜Ø˜& (Ð+ØÐ\ð"ð
 !Ø˜Ø˜& (Ð+ØÐPð#ð
 Ø˜ØÐJðð Ø˜ØÐHðð )Ø˜	ØÐ`Ø˜5ð+ð
 )Ø˜	ØÐ`Ø˜5ð+ð9!
ðD 	�W�IðI%ð1€òhð 	× Ò Ø	˜Z°ÐIYØ(¸°ÈfØ!÷r   