§
    øžyjH  ã                  ó‚   — d Z ddlmZ ddlZddlZddlmZmZ ddlm	Z	  ej
        e¦  «        ZdZ G d„ de	¦  «        ZdS )	uB  Brave Search (free tier) â€” plugin form.

Subclasses :class:`agent.web_search_provider.WebSearchProvider` (the
plugin-facing ABC). The legacy in-tree module
``tools.web_providers.brave_free`` was removed in the same commit that
moved this code under ``plugins/``; this file is now the canonical
implementation.

Config keys this provider responds to::

    web:
      search_backend: "brave-free"     # explicit per-capability
      backend: "brave-free"            # shared fallback

Auth env var::

    BRAVE_SEARCH_API_KEY=...    # https://brave.com/search/api/ (free tier)
é    )ÚannotationsN)ÚAnyÚDict)ÚWebSearchProviderz.https://api.search.brave.com/res/v1/web/searchc                  ól   — e Zd ZdZedd„¦   «         Zedd„¦   «         Zdd„Zdd„Zdd	„Z	ddd„Z
dd„ZdS )ÚBraveFreeWebSearchProvideruß   Search-only Brave provider using the free-tier Data-for-Search API.

    Free tier is 2,000 queries/month (1 qps). No content-extraction capability â€”
    users pair this with Firecrawl/Tavily/Exa for ``web_extract``.
    ÚreturnÚstrc                ó   — dS )Nz
brave-free© ©Úselfs    úE/home/ragecks/.hermes/hermes-agent/plugins/web/brave_free/provider.pyÚnamezBraveFreeWebSearchProvider.name(   s	   € ð ˆ|ó    c                ó   — dS )NúBrave Search (Free)r   r   s    r   Údisplay_namez'BraveFreeWebSearchProvider.display_name.   s   € à$Ð$r   Úboolc                ó>   — ddl m} t           |d¦  «        ¦  «        S )zFReturn True when ``BRAVE_SEARCH_API_KEY`` is set to a non-empty value.r   ©Úget_provider_envÚBRAVE_SEARCH_API_KEY)Úagent.web_search_providerr   r   )r   r   s     r   Úis_availablez'BraveFreeWebSearchProvider.is_available2   s/   € à>Ð>Ð>Ð>Ð>Ð>åÐ$Ð$Ð%;Ñ<Ô<Ñ=Ô=Ð=r   c                ó   — dS )NTr   r   s    r   Úsupports_searchz*BraveFreeWebSearchProvider.supports_search8   s   € Øˆtr   c                ó   — dS )NFr   r   s    r   Úsupports_extractz+BraveFreeWebSearchProvider.supports_extract;   s   € Øˆur   é   ÚqueryÚlimitÚintúDict[str, Any]c                ó®  — ddl }ddlm}  |d¦  «        }|sdddœS t          dt	          t          |¦  «        d	¦  «        ¦  «        }	 |                     t          ||d
œ|ddœd¬¦  «        }|                     ¦   «          ny# |j	        $ r7}t                               d|¦  «         dd|j        j        › �dœcY d}~S d}~w|j        $ r-}t                               d|¦  «         dd|› �dœcY d}~S d}~ww xY w	 |                     ¦   «         }	n7# t           $ r*}t                               d|¦  «         dddœcY d}~S d}~ww xY w|	                     d¦  «        pi                      dg ¦  «        pg }
|
d|…         }d„ t#          |¦  «        D ¦   «         }t                               d|t'          |¦  «        t'          |
¦  «        |¦  «         dd|idœS )zæExecute a search against the Brave Search API.

        Returns ``{"success": True, "data": {"web": [{"title", "url", "description", "position"}]}}``
        on success, or ``{"success": False, "error": str}`` on failure.
        r   Nr   r   FzBRAVE_SEARCH_API_KEY is not set)ÚsuccessÚerroré   é   )ÚqÚcountzapplication/json)zX-Subscription-TokenÚAccepté   )ÚparamsÚheadersÚtimeoutzBrave Search HTTP error: %szBrave Search returned HTTP zBrave Search request error: %szCould not reach Brave Search: z%Brave Search response parse error: %sz-Could not parse Brave Search response as JSONÚwebÚresultsc           
     óî   — g | ]r\  }}t          |                     d d¦  «        ¦  «        t          |                     dd¦  «        ¦  «        t          |                     dd¦  «        ¦  «        |dz   dœ‘ŒsS )ÚtitleÚ ÚurlÚdescriptionr(   )r4   r6   r7   Úposition)r
   Úget)Ú.0ÚiÚrs      r   ú
<listcomp>z5BraveFreeWebSearchProvider.search.<locals>.<listcomp>m   s‡   € ð 
ð 
ð 
ñ ��1õ ˜QŸUšU 7¨BÑ/Ô/Ñ0Ô0Ý˜1Ÿ5š5 ¨Ñ+Ô+Ñ,Ô,Ý" 1§5¢5¨¸Ñ#;Ô#;Ñ<Ô<Ø ™Eð	ð ð
ð 
ð 
r   z5Brave Search '%s': %d results (from %d raw, limit %d)T)r&   Údata)Úhttpxr   r   ÚmaxÚminr#   r9   Ú_BRAVE_ENDPOINTÚraise_for_statusÚHTTPStatusErrorÚloggerÚwarningÚresponseÚstatus_codeÚRequestErrorÚjsonÚ	ExceptionÚ	enumerateÚinfoÚlen)r   r!   r"   r?   r   Úapi_keyr+   ÚrespÚexcr>   Úraw_resultsÚ	truncatedÚweb_resultss                r   Úsearchz!BraveFreeWebSearchProvider.search>   s¦  € ð 	ˆˆˆà>Ð>Ð>Ð>Ð>Ð>à"Ð"Ð#9Ñ:Ô:ˆØð 	RØ$Ð/PÐQÐQÐQõ �A•s�3˜u™:œ: rÑ*Ô*Ñ+Ô+ˆð	WØ—9’9ÝØ"¨UÐ3Ð3à,3Ø0ðð ð ð ñ ô ˆDð ×!Ò!Ñ#Ô#Ð#Ð#øØÔ$ð 	ð 	ð 	Ý�NŠNÐ8¸#Ñ>Ô>Ð>à ØQ°s´|Ô7OÐQÐQðð ð ð ð ð ð ð øøøøð Ô!ð 	Wð 	Wð 	WÝ�NŠNÐ;¸SÑAÔAÐAØ$Ð/UÐPSÐ/UÐ/UÐVÐVÐVÐVÐVÐVÐVÐVøøøøð	Wøøøð	`Ø—9’9‘;”;ˆDˆDøÝð 	`ð 	`ð 	`Ý�NŠNÐBÀCÑHÔHÐHØ$Ð/^Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_øøøøð	`øøøð —x’x ‘”Ð,¨"×1Ò1°)¸RÑ@Ô@ÐFÀBˆØ   Ô'ˆ	ð
ð 
õ " )Ñ,Ô,ð
ñ 
ô 
ˆõ 	�ŠØCØÝ�ÑÔÝ�ÑÔØñ	
ô 	
ð 	
ð  ¨%°Ð)=Ð>Ð>Ð>sN   Á	8B Â
C8Â,B>Â8C8Â>C8Ã"C3Ã-C8Ã3C8Ã<D Ä
EÄE Ä:EÅ Ec                ó   — dddddddœgdœS )	Nr   Úfreeu1   Free-tier API key â€” 2k queries/mo, search only.r   z Brave Search API key (free tier)zhttps://brave.com/search/api/)ÚkeyÚpromptr6   )r   ÚbadgeÚtagÚenv_varsr   r   s    r   Úget_setup_schemaz+BraveFreeWebSearchProvider.get_setup_schema�   s4   € à)ØØFð 2Ø@Ø:ðð ðð	
ð 
ð 	
r   N)r	   r
   )r	   r   )r    )r!   r
   r"   r#   r	   r$   )r	   r$   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úpropertyr   r   r   r   r   rU   r]   r   r   r   r   r   !   sÍ   € € € € € ðð ð ðð ð ñ „Xðð
 ð%ð %ð %ñ „Xð%ð>ð >ð >ð >ðð ð ð ðð ð ð ðA?ð A?ð A?ð A?ð A?ðF
ð 
ð 
ð 
ð 
ð 
r   r   )ra   Ú
__future__r   ÚloggingÚosÚtypingr   r   r   r   Ú	getLoggerr^   rE   rB   r   r   r   r   ú<module>rh      sµ   ððð ð& #Ð "Ð "Ð "Ð "Ð "à €€€Ø 	€	€	€	Ø Ð Ð Ð Ð Ð Ð Ð à 7Ð 7Ð 7Ð 7Ð 7Ð 7à	ˆÔ	˜8Ñ	$Ô	$€àB€ðl
ð l
ð l
ð l
ð l
Ð!2ñ l
ô l
ð l
ð l
ð l
r   