Ë
    áß²j_  ã                  óð   — U d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	m
Z
  ej                  e«      Z e	dee¬«      Zd	ed
<   ej!                   e«       «       dZdd„ZddlmZ ddlmZ ddlZddiZd„ Zy)u§  Browser provider registry: cloud browser backends registered by plugins via
:meth:`PluginContext.register_browser_provider`, consumed by ``tools.browser_tool_cloud._get_cloud_provider``.

Active-provider precedence (see :func:`_resolve`): ``browser.cloud_provider`` in config.yaml wins
regardless of ``is_available()`` (so the dispatcher surfaces a typed "X_API_KEY is not set" error
instead of silently switching); else the legacy auto-detect walk ``browser-use`` â†’ ``browserbase``
filtered by availability; else ``None`` (local browser mode). There is no capability split here â€”
every provider implements the full :class:`agent.browser_provider.BrowserProvider` lifecycle.
é    )ÚannotationsN)ÚOptional)ÚBrowserProvider)ÚProviderRegistryÚis_available_safeÚBrowser)ÚlabelÚprovider_clsÚloggerz!ProviderRegistry[BrowserProvider]Ú	_registry)zbrowser-useÚbrowserbasec                ó  — t         j                  «       }| dk(  ry| r+|j                  | «      }|�|S t        j	                  d| «       t
        D ]<  }|j                  |«      }|€Œt        |t        dt        j                  d¬«      sŒ:|c S  y)aå  Resolve the active browser provider (rules in the module docstring).

    Intentionally NO "single-eligible shortcut" (unlike ``agent.web_search_registry._resolve``): only
    ``_LEGACY_PREFERENCE`` names are auto-eligible. Firecrawl shares its API key with the *web* extract
    plugin, so a user with ``FIRECRAWL_API_KEY`` must never be routed to a paid cloud browser without
    setting ``browser.cloud_provider``; the same gate applies to third-party browser-provider plugins.
    ÚlocalNzVbrowser cloud_provider '%s' configured but not registered; falling back to auto-detectuH   Browser provider %s.is_available() raised %s â€” treating as unavailableT)ÚlevelÚexc_info)	r   ÚmergedÚgetr   ÚdebugÚ_LEGACY_PREFERENCEr   ÚloggingÚWARNING)Ú
configuredÚsnapshotÚproviderÚlegacys       ú;/home/ubuntu/.hermes/hermes-agent/agent/browser_registry.pyÚ_resolver   "   s•   € ô ×ÑÓ!€HØ�WÒØÙØ—<‘< 
Ó+ˆØÐØˆOÜ�‰ØdØô	
ô %ò ˆØ—<‘< Ó'ˆØÑÔ$5Ø”fØVÜ—/‘/¨Dö%
ð
 ŠOðð ó    )ÚDict)ÚListÚhermes_home_key)Úhermes_constantsr!   c                óÌ   — t         j                  | «      }|€t        dt        ›d| ›�«      ‚dd l}ddlm}  |t        | g|¢­Ž  t        |j                  |d   «      |d   «      S )Nzmodule z has no attribute r   )Ú	warn_onceé   )	Ú_PLUGIN_COMPAT_LAZYr   ÚAttributeErrorÚ__name__Ú	importlibÚhermes_cli.plugin_compatr$   ÚgetattrÚimport_module)ÚnameÚtargetr)   r$   s       r   Ú__getattr__r/   N   se   € Ü ×$Ñ$ TÓ*€FØ€~Ü˜w¤x lÐ2DÀTÀHÐMÓNÐNÛÝ2ÙŒh˜Ð&˜vÓ&Ü�9×*Ñ*¨6°!©9Ó5°v¸a±yÓAÐAr   )r   zOptional[str]ÚreturnzOptional[BrowserProvider])Ú__doc__Ú
__future__r   r   Útypingr   Úagent.browser_providerr   Úagent.provider_registryr   r   Ú	getLoggerr(   r   r   Ú__annotations__ÚexportÚglobalsr   r   r   r    Ú	threadingr&   r/   © r   r   ú<module>r<      sŠ   ðòõ #ã Ý å 2ß Gà	ˆ×	Ñ	˜8Ó	$€ñ 0@Ø
 /¸&ô0€	Ð,ó ð 
× Ñ ‘“Ô ð 4Ð óõD Ý Û ð Ð>ðÐ ó
Br   