
    PL
j+                        U d Z ddlmZ ddlZddlZddlZddlZddlmZm	Z	m
Z
 ddlZddlmZ  ej        e          Zi Zded<    ej                    ZdZd	Zd
ZddZddZddZ G d de          ZdS )u  Browser Use cloud browser provider — plugin form.

Subclasses :class:`agent.browser_provider.BrowserProvider` (the plugin-facing
ABC introduced in PR #25214). The legacy in-tree module
``tools.browser_providers.browser_use`` was removed in the same PR; this file
is now the canonical implementation.

Browser Use is the only browser backend with dual auth: a direct
``BROWSER_USE_API_KEY`` for self-billed users, or the managed Nous tool
gateway (which Hermes uses to bill Browser Use sessions to a Nous
subscription). The dispatch order — direct API key first, managed gateway
second — preserves the pre-migration behaviour in
``tools.browser_providers.browser_use.BrowserUseProvider._get_config_or_none``.

Config keys this provider responds to::

    browser:
      cloud_provider: "browser-use"   # explicit selection
    tool_gateway:
      browser: "gateway"              # optional: prefer managed gateway
                                      #   even when BROWSER_USE_API_KEY is set

Auth env vars (one of)::

    BROWSER_USE_API_KEY=...           # https://browser-use.com
    # OR a managed Nous gateway entry (configured via 'hermes setup')
    )annotationsN)AnyDictOptional)BrowserProviderDict[str, str]_pending_create_keysz"https://api.browser-use.com/api/v3   ustask_idstrreturnc                    t           5  t                              |           }|r|cd d d            S dt          j                    j         }|t          | <   |cd d d            S # 1 swxY w Y   d S )Nzbrowser-use-session-create:)_pending_create_keys_lockr	   getuuiduuid4hex)r   existingcreateds      H/home/kuhnn/.hermes/hermes-agent/plugins/browser/browser_use/provider.py!_get_or_create_pending_create_keyr   7   s    	"  '++G44 	       
 C
0@BB(/W%                 s   A&&A&&A*-A*Nonec                |    t           5  t                              | d            d d d            d S # 1 swxY w Y   d S N)r   r	   pop)r   s    r   _clear_pending_create_keyr   B   s    	" 0 0  $///0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0s   155responserequests.Responseboolc                ~   | j         dk    rdS | j         dk    rdS 	 |                                 }n# t          $ r Y dS w xY wt          |t                    sdS |                    d          }t          |t                    sdS t          |                    d          pd                                          }d|v S )	u  Decide whether to keep the idempotency key after a failed create.

    Preserve the key when the failure looks retryable (5xx) OR when the
    gateway reports the original request is still in flight (409 "already
    in progress") — in either case, retrying with the same key lets the
    gateway deduplicate.

    Drop the key on any other 4xx (auth failure, bad request, etc.) — those
    won't succeed by being retried.
    i  Ti  Ferrormessage zalready in progress)status_codejson	Exception
isinstancedictr   r   lower)r   payloadr"   r#   s       r   #_should_preserve_pending_create_keyr,   G   s     s""ts""u--//   uu gt$$ uKK  EeT"" u%))I&&,"--3355G G++s   1 
??c                      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Z
ddZddZddZddZdS ) BrowserUseBrowserProvideran  Browser Use (https://browser-use.com) cloud browser backend.

    Dual auth: prefers a direct BROWSER_USE_API_KEY when set, falling back
    to the managed Nous tool gateway when ``tool_gateway.browser`` config
    routes through it. Setting ``tool_gateway.browser: gateway`` flips the
    order so managed billing wins even when BROWSER_USE_API_KEY is present.
    r   r   c                    dS )Nbrowser-use selfs    r   namezBrowserUseBrowserProvider.nameq       }    c                    dS )NBrowser User1   r2   s    r   display_namez&BrowserUseBrowserProvider.display_nameu   r5   r6   r    c                .    |                                  d uS r   )_get_config_or_noner2   s    r   is_availablez&BrowserUseBrowserProvider.is_availabley   s    ''))55r6   Optional[Dict[str, Any]]c                    ddl m} ddlm} t          j                            d          }|r |d          s|t          ddS  |d          }|d S |j        |j	        
                    d	          d
dS )Nr   )resolve_managed_tool_gateway)prefers_gatewayBROWSER_USE_API_KEYbrowserF)api_keybase_urlmanaged_moder0   /T)tools.managed_tool_gatewayr?   tools.tool_backend_helpersr@   osenvironr   	_BASE_URLnous_user_tokengateway_originrstrip)r3   r?   r@   rC   manageds        r   r;   z-BrowserUseBrowserProvider._get_config_or_none   s     	LKKKKK>>>>>> *..!677 	??955 	"% %   /.}==?4 ..55c:: 
 
 	
r6   Dict[str, Any]c                x    ddl m} |                                 }|d} |            rd}t          |          |S )Nr   )managed_nous_tools_enabledz=Browser Use requires a direct BROWSER_USE_API_KEY credential.zsBrowser Use requires either a direct BROWSER_USE_API_KEY credential or a managed Browser Use gateway configuration.)rH   rR   r;   
ValueError)r3   rR   configr#   s       r   _get_configz%BrowserUseBrowserProvider._get_config   se    IIIIII))++>O  *)++ Q  W%%%r6   rT   r   c                    d|d         dS )Nzapplication/jsonrC   )zContent-TypezX-Browser-Use-API-Keyr1   )r3   rT   s     r   _headersz"BrowserUseBrowserProvider._headers   s    .%+I%6
 
 	
r6   r   Dict[str, object]c                   |                                  }t          |                    d                    }|                     |          }|rt	          |          |d<   |rt
          t          dni }	 t          j        |d          d||d          }n-# t          j	        $ r}|r t          d|           |d }~ww xY w|j        s?|rt          |          st          |           t          d	|j         d
|j                   |                                }|rt          |           d| dt#          j                    j        d d          }	|r|j                            d          nd }
t*                              d|	           |                    d          p|                    d          pd}|	|d         |ddi|
dS )NrE   zX-Idempotency-Key)timeoutproxyCountryCoderD   z	/browsers   headersr&   rZ   z#Browser Use API connection failed: z&Failed to create Browser Use session:  hermes__   zx-external-call-idzCreated Browser Use session %scdpUrl
connectUrlr$   idbrowser_useT)session_namebb_session_idcdp_urlfeaturesexternal_call_id)rU   r    r   rW   r    _DEFAULT_MANAGED_TIMEOUT_MINUTES#_DEFAULT_MANAGED_PROXY_COUNTRY_CODErequestspostRequestExceptionRuntimeErrorokr,   r   r%   textr&   r   r   r   r^   loggerinfo)r3   r   rT   rE   r^   r+   r   excsession_datarg   rk   ri   s               r   create_sessionz(BrowserUseBrowserProvider.create_session   sO   !!##FJJ~6677--'' 	V+LW+U+UG'( 	;$G  
  		}*%000	  HH ( 	 	 	  ;c;; 	 { 	 3$G$Q$Q 3)'222:': :*2-: :  
  }} 	/%g...AAA4:<<+;BQB+?AA:FPH  !5666D 	 	4lCCC""8,,T0@0@0N0NTRT ))$/&- 0
 
 	
s   4!B C %B;;C 
session_idc                   	 |                                  }n,# t          $ r t                              d|           Y dS w xY w	 t	          j        |d          d| |                     |          ddid          }|j        d	v rt                              d
|           dS t                              d||j        |j	        d d                    dS # t          $ r'}t                              d||           Y d }~dS d }~ww xY w)Nu;   Cannot close Browser Use session %s — missing credentialsFrD   
/browsers/actionstop
   r]   >            z*Successfully closed Browser Use session %sTz4Failed to close Browser Use session %s: HTTP %s - %sr   z,Exception closing Browser Use session %s: %s)rU   rS   rt   warningrn   patchrW   r%   debugrs   r'   r"   )r3   ry   rT   r   es        r   close_sessionz'BrowserUseBrowserProvider.close_session   sI   	%%''FF 	 	 	NNMz   55			~*%====f--'	  H #66I:VVVtJ(M$3$'	   u 	 	 	LLGUVWWW55555	s-    %A A AC "/C 
DC??Dr   c                F   |                                  }|t                              d|           d S 	 t          j        |d          d| |                     |          ddid           d S # t          $ r'}t                              d||           Y d }~d S d }~ww xY w)	NuG   Cannot emergency-cleanup Browser Use session %s — missing credentialsrD   r{   r|   r}   r
   r]   z7Emergency cleanup failed for Browser Use session %s: %s)r;   rt   r   rn   r   rW   r'   r   )r3   ry   rT   r   s       r   emergency_cleanupz+BrowserUseBrowserProvider.emergency_cleanup  s    ))++>NNY   F
	N*%====f--'	       	 	 	LLI:WX        	s   8A/ /
B 9BB c                    dddddddgdd	S )
Nr8   paidz#Cloud browser with remote executionrA   zBrowser Use API keyzhttps://browser-use.com)keyprompturlagent_browser)r4   badgetagenv_vars
post_setupr1   r2   s    r   get_setup_schemaz*BrowserUseBrowserProvider.get_setup_schema)  s9    !8 134  *
 
 	
r6   N)r   r   )r   r    )r   r=   )r   rP   )rT   rP   r   r   )r   r   r   rX   )ry   r   r   r    )ry   r   r   r   )__name__
__module____qualname____doc__propertyr4   r9   r<   r;   rU   rW   rx   r   r   r   r1   r6   r   r.   r.   h   s             X    X6 6 6 6
 
 
 
6   (
 
 
 
?
 ?
 ?
 ?
B   >   (
 
 
 
 
 
r6   r.   )r   r   r   r   )r   r   r   r   )r   r   r   r    )r   
__future__r   loggingrI   	threadingr   typingr   r   r   rn   agent.browser_providerr   	getLoggerr   rt   r	   __annotations__Lockr   rK   rl   rm   r   r   r,   r.   r1   r6   r   <module>r      sJ    8 # " " " " "  				      & & & & & & & & & &  2 2 2 2 2 2		8	$	$ (*  ) ) ) )*IN,, 0	#$  &* #   0 0 0 0
, , , ,BN
 N
 N
 N
 N
 N
 N
 N
 N
 N
r6   