
    i                     .   U d 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 ddlmZ ddlmZmZ  ej        e          Zi Zeeef         ed<    ej                    ZdZd	Zd
ZdedefdZdeddfdZde	j        defdZ  G d de          Z!dS )z#Browser Use cloud browser provider.    N)AnyDictOptional)CloudBrowserProvider)resolve_managed_tool_gateway)managed_nous_tools_enabledprefers_gateway_pending_create_keysz"https://api.browser-use.com/api/v3   ustask_id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/ubuntu/.hermes/hermes-agent/tools/browser_providers/browser_use.py!_get_or_create_pending_create_keyr      s    	"  '++G44 	       
 C
0@BB(/W%                 s   A&&A&&A*-A*c                 |    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   #   s    	" 0 0  $///0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0s   155responsec                 ~   | 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 )	Ni  Ti  Ferrormessage zalready in progress)status_codejson	Exception
isinstancedictr   strlower)r   payloadr   r    s       r   #_should_preserve_pending_create_keyr*   (   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defdZdefdZdee	ee
f                  fdZde	ee
f         fdZde	ee
f         de	eef         fdZd	ede	eef         fd
ZdedefdZdeddfdZdS )BrowserUseProviderz<Browser Use (https://browser-use.com) cloud browser backend.r   c                     dS )NzBrowser Use selfs    r   provider_namez BrowserUseProvider.provider_nameB   s    }    c                 .    |                                  d uS r   )_get_config_or_noner/   s    r   is_configuredz BrowserUseProvider.is_configuredE   s    ''))55r2   c                     t           j                            d          }|rt          d          s|t          ddS t          d          }|d S |j        |j                            d          ddS )NBROWSER_USE_API_KEYbrowserF)api_keybase_urlmanaged_modezbrowser-use/T)	osenvironr   r	   	_BASE_URLr   nous_user_tokengateway_originrstrip)r0   r9   manageds      r   r4   z&BrowserUseProvider._get_config_or_noneL   s    *..!677 	?955 	"% %   /}==?4 ..55c:: 
 
 	
r2   c                 t    |                                  }|!d}t                      rd}t          |          |S )Nz=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.)r4   r   
ValueError)r0   configr    s      r   _get_configzBrowserUseProvider._get_config_   sP    ))++>O  *++ Q  W%%%r2   rF   c                     d|d         d}|S )Nzapplication/jsonr9   )zContent-TypezX-Browser-Use-API-Keyr.   )r0   rF   headerss      r   _headerszBrowserUseProvider._headersq   s     .%+I%6
 
 r2   r   c                 4   |                                  }t          |                    d                    }|                     |          }|rt	          |          |d<   |rt
          t          dni }t          j        |d          d||d          }|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 )Nr;   zX-Idempotency-Key)timeoutproxyCountryCoder:   z	/browsers   rI   r#   rL   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)rG   boolr   rJ   r    _DEFAULT_MANAGED_TIMEOUT_MINUTES#_DEFAULT_MANAGED_PROXY_COUNTRY_CODErequestspostokr*   r   RuntimeErrorr"   textr#   r   r   r   rI   loggerinfo)r0   r   rF   r;   rI   r)   r   session_datarX   r\   rZ   s              r   create_sessionz!BrowserUseProvider.create_sessionx   s   !!##FJJ~6677--'' 	V+LW+U+UG'( 	;$G  
  	 =j!,,,	
 
 
 { 	 3$G$Q$Q 3)'222:': :*2-: :  
  }} 	/%g...AAA4:<<+;BQB+?AAIU_8+//0DEEE[_4lCCC""8,,T0@0@0N0NTRT ))$/&- 0
 
 	
r2   
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 credentialsFr:   
/browsers/actionstop
   rO   )         z*Successfully closed Browser Use session %sTz4Failed to close Browser Use session %s: HTTP %s - %sro   z,Exception closing Browser Use session %s: %s)rG   rE   re   warningr`   patchrJ   r"   debugrd   r$   r   )r0   ri   rF   r   es        r   close_sessionz BrowserUseProvider.close_session   sB   	%%''FF 	 	 	NNXZdeee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Nc                 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 credentialsr:   rk   rl   rm   r   rO   z7Emergency cleanup failed for Browser Use session %s: %s)r4   re   rr   r`   rs   rJ   r$   rt   )r0   ri   rF   ru   s       r   emergency_cleanupz$BrowserUseProvider.emergency_cleanup   s    ))++>NNdfpqqqF	cN*%====f--'	       	c 	c 	cLLRT^`abbbbbbbbb	cs   8A/ /
B 9BB )__name__
__module____qualname____doc__r'   r1   r]   r5   r   r   r   r4   rG   rJ   objectrh   rv   rx   r.   r2   r   r,   r,   ?   sE       FFs    6t 6 6 6 6
Xd38n%= 
 
 
 
&T#s(^    $tCH~ $sCx.    3
c 3
d3;.? 3
 3
 3
 3
j     :cC cD c c c c c cr2   r,   )"r|   loggingr=   	threadingr   typingr   r   r   r`   tools.browser_providers.baser   tools.managed_tool_gatewayr   tools.tool_backend_helpersr   r	   	getLoggerry   re   r
   r'   __annotations__Lockr   r?   r^   r_   r   r   Responser]   r*   r,   r.   r2   r   <module>r      s   ) ) )  				      & & & & & & & & & &  = = = = = = C C C C C C R R R R R R R R		8	$	$') d38n ) ) )*IN,, 0	#$  &* #s s    0s 0t 0 0 0 0
,(2C , , , , ,.Xc Xc Xc Xc Xc- Xc Xc Xc Xc Xcr2   