Ë
    âß²j¼  ã                  ó  — U d Z ddlm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  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dlZddiZd„ Zy)uE  Browser Use cloud browser provider â€” the only backend with dual auth: direct
``BROWSER_USE_API_KEY`` (https://browser-use.com) or the managed Nous tool gateway (bills to a
Nous subscription). Direct first, managed second, unless ``tool_gateway.browser: gateway`` flips
it. Config: ``browser.cloud_provider: "browser-use"``.é    )ÚannotationsN)ÚAnyÚDictÚOptional)Ú
get_secret)ÚCloudBrowserProviderúDict[str, str]Ú_pending_create_keysz"https://api.browser-use.com/api/v3é   Úusc                óÖ   — t         5  t        j                  | «      }|r|cd d d «       S dt        j                  «       j
                  › �}|t        | <   |cd d d «       S # 1 sw Y   y xY w)Nzbrowser-use-session-create:)Ú_pending_create_keys_lockr
   ÚgetÚuuidÚuuid4Úhex)Útask_idÚexistingÚcreateds      úI/home/ubuntu/.hermes/hermes-agent/plugins/browser/browser_use/provider.pyÚ!_get_or_create_pending_create_keyr      sc   € Ü	"ñ Ü'×+Ñ+¨GÓ4ˆÙØ÷ñ ð 0´·
±
³×0@Ñ0@Ð/AÐBˆØ(/Ô˜WÑ%Ø÷÷ ò ús   ‡Aª+AÁA(c                óf   — t         5  t        j                  | d «       d d d «       y # 1 sw Y   y xY w)N)r   r
   Úpop)r   s    r   Ú_clear_pending_create_keyr   (   s*   € Ü	"ñ 0Ü× Ñ  ¨$Ô/÷0÷ 0ñ 0ús   ‡'§0c                óH  — | j                   dk\  ry| j                   dk7  ry	 | j                  «       }t        |t        «      r|j                  d«      nd}t        |t        «      xr. dt        |j                  d«      xs d	«      j                  «       v S # t        $ r Y yw xY w)
z¯Keep the key when retryable: any 5xx, or a 409 saying the original request is still in
    flight. Other 4xx (auth, bad request) won't succeed on retry, so the key is dropped.iô  Ti™  FÚerrorNzalready in progressÚmessageÚ )Ústatus_codeÚjsonÚ	ExceptionÚ
isinstanceÚdictr   ÚstrÚlower)ÚresponseÚpayloadr   s      r   Ú#_should_preserve_pending_create_keyr(   -   sš   € ð ×Ñ˜sÒ"ØØ×Ñ˜sÒ"ØðØ—-‘-“/ˆô %/¨w¼Ô$=ˆG�K‰K˜Ô À4€EÜ�eœTÓ"ÒgÐ'<ÄÀEÇIÁIÈiÓDXÒD^Ð\^Ó@_×@eÑ@eÓ@gÐ'gÐgøô ò Ùðús   ¢B Â	B!Â B!c                  óZ   — e Zd ZdZdZdZdZdZdZdd„Z	dd	œdd
„Z
dd„Zdd„Zdd„Zdd„Zy)ÚBrowserUseBrowserProviderz<Browser Use (https://browser-use.com) cloud browser backend.úbrowser-usezBrowser UseÚpatchz/browsers/{session_id}Nc                ó*   — | j                  d¬«      d uS )NF©Úrefresh_token)Ú_get_config_or_none)Úselfs    r   Úis_availablez&BrowserUseBrowserProvider.is_availableG   s   € Ø×'Ñ'°eÐ'Ó<ÀDÐHÐHó    Tr.   c               ó°   ‡‡‡	— ddl mŠmŠ	 ddlm}m} d	ˆˆˆ	fd„}t        d«      } |d«      }|t        ddœ}||k(  r |«       S |�|r|S d S |r|S  |«       S )
Nr   )Úpeek_nous_access_tokenÚresolve_managed_tool_gateway)ÚNOUS_MANAGED_PROVIDERÚread_selectionc                 óx   •—  ‰d‰rd n‰¬«      } | €y | j                   | j                  j                  d«      ddœS )Nr+   )Útoken_readerú/T©Úapi_keyÚbase_urlÚmanaged_mode)Únous_user_tokenÚgateway_originÚrstrip)Úmanagedr5   r/   r6   s    €€€r   Ú_managed_configzFBrowserUseBrowserProvider._get_config_or_none.<locals>._managed_configO   sJ   ø€ á2Ø±M©DÐG]ô_ˆGàˆØà"×2Ñ2Ø#×2Ñ2×9Ñ9¸#Ó>Ø $ñð r3   ÚBROWSER_USE_API_KEYÚbrowserFr<   )ÚreturnúOptional[Dict[str, Any]])Útools.managed_tool_gatewayr5   r6   Útools.tool_backend_helpersr7   r8   r   Ú	_BASE_URL)
r1   r/   r7   r8   rD   r=   ÚselectedÚdirectr5   r6   s
    `      @@r   r0   z-BrowserUseBrowserProvider._get_config_or_noneJ   sh   ú€ çcßT÷
	ô Ð2Ó3ˆÙ! )Ó,ˆØ$´)ÈUÑSˆð Ð,Ò,Ù"Ó$Ð$ØÐÙ$�6Ð.¨$Ð.Ù ˆvÐ7¡oÓ&7Ð7r3   c                óæ   — ddl m}m}m}m} | j                  «       }|�|S  |d«      }||k(  rt         |d|d«      «      ‚|�t         |d|d«      «      ‚ |«       rt        d«      ‚t        d«      ‚)Nr   )r7   Úmanaged_nous_tools_enabledr8   Úselection_errorrF   zDthe Nous Tool Gateway is not available (not entitled or unreachable)zBROWSER_USE_API_KEY is not setzsBrowser Use requires either a direct BROWSER_USE_API_KEY credential or a managed Browser Use gateway configuration.z=Browser Use requires a direct BROWSER_USE_API_KEY credential.)rJ   r7   rO   r8   rP   r0   Ú
ValueError)r1   r7   rO   r8   rP   ÚconfigrL   s          r   Ú_get_configz%BrowserUseBrowserProvider._get_configg   s¢   € ÷	`ó 	`ð ×)Ñ)Ó+ˆØÐØˆMÙ! )Ó,ˆØÐ,Ò,Ü™_ØÐ0ØVóXó Yð Yð ÐÜ™_¨Y¸ÐBbÓcÓdÐdÙ%Ô'ÜðMóNð Nô ÐXÓYÐYr3   c                ó   — d|d   dœS )Nzapplication/jsonr=   )zContent-TypezX-Browser-Use-API-Key© ©r1   rR   s     r   Ú_headersz"BrowserUseBrowserProvider._headers{   s   € Ø 2ÈVÐT]ÑM^Ñ_Ð_r3   c                ó
   — ddiS )NÚactionÚstoprU   rV   s     r   Ú_release_bodyz'BrowserUseBrowserProvider._release_body~   s   € Ø˜&Ð!Ð!r3   c                ó¨  — | j                  «       }t        |j                  d«      «      }| j                  |«      }|rt	        |«      |d<   |rt
        t        dœni }| j                  |d   › d�||| ¬«      }|j                  s|rt        |«      st        |«       | j                  |«       |j                  «       }|rt        |«       | j                  |«      }t        j                  d|«       ||d   |j                  d	«      xs |j                  d
«      xs d|j                  d«      ddi|r|j                   j                  d«      dœS d dœS )Nr?   zX-Idempotency-Key)ÚtimeoutÚproxyCountryCoder>   z	/browsers)Úwrap_errorszCreated Browser Use session %sÚidÚcdpUrlÚ
connectUrlr   Ú	timeoutAtÚbrowser_useTzx-external-call-id)Úsession_nameÚbb_session_idÚcdp_urlÚ
expires_atÚfeaturesÚexternal_call_id)rS   Úboolr   rW   r   Ú _DEFAULT_MANAGED_TIMEOUT_MINUTESÚ#_DEFAULT_MANAGED_PROXY_COUNTRY_CODEÚ_post_createÚokr(   r   Ú_check_createdr    Ú_session_nameÚloggerÚinfoÚheaders)	r1   r   rR   r?   rt   r'   r&   Úsession_datare   s	            r   Úcreate_sessionz(BrowserUseBrowserProvider.create_session�   sb  € Ø×!Ñ!Ó#ˆÜ˜FŸJ™J ~Ó6Ó7ˆà—-‘- Ó'ˆÙÜ+LÈWÓ+UˆGÐ'Ñ(ñ ô 9ÔNqÒrØ!#ð 	ð ×$Ñ$Ø�jÑ!Ð" )Ð,¨g°wÐP\ÐL\ð %ó ^ˆà�{Š{™|Ô4WÐX`Ô4aÜ% gÔ.Ø×Ñ˜HÔ%à—}‘}“ˆÙÜ% gÔ.Ø×)Ñ)¨'Ó2ˆÜ�‰Ð4°lÔCà(Ø)¨$Ñ/Ø#×'Ñ'¨Ó1ÒY°\×5EÑ5EÀlÓ5SÒYÐWYà&×*Ñ*¨;Ó7Ø&¨Ð-ÙNZ × 0Ñ 0× 4Ñ 4Ð5IÓ Jñ
ð 	
ð aeñ
ð 	
r3   )rG   rk   )r/   rk   rG   rH   )rG   úDict[str, Any])rR   rw   rG   r	   )rR   rw   rG   úDict[str, object])r   r$   rG   rx   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úprovider_idÚlabelÚrelease_methodÚrelease_pathÚ	setup_tagr2   r0   rS   rW   r[   rv   rU   r3   r   r*   r*   <   sG   „ ÙFà€KØ€EØ€NØ+€Lð €IóIð <@õ 8ó:Zó(`ó"ô
r3   r*   ÚBrowserProvider)zagent.browser_providerr‚   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   ÚAttributeErrorry   Ú	importlibÚhermes_cli.plugin_compatr„   ÚgetattrÚimport_module)ÚnameÚtargetrˆ   r„   s       r   Ú__getattr__rŽ   ¯   se   € Ü ×$Ñ$ TÓ*€FØ€~Ü˜w¤x lÐ2DÀTÀHÐMÓNÐNÛÝ2ÙŒh˜Ð&˜vÓ&Ü�9×*Ñ*¨6°!©9Ó5°v¸a±yÓAÐAr3   )r   r$   rG   r$   )r   r$   rG   ÚNone)r&   zrequests.ResponserG   rk   ) r|   Ú
__future__r   ÚloggingÚ	threadingr   Útypingr   r   r   ÚrequestsÚagent.secret_scoper   Úplugins.browser._commonr   Ú	getLoggerry   rr   r
   Ú__annotations__ÚLockr   rK   rl   rm   r   r   r(   r*   Úosr†   rŽ   rU   r3   r   ú<module>r›      s¡   ðò:õ
 #ã Û Û ß &Ñ &ã å )Ý 8à	ˆ×	Ñ	˜8Ó	$€ð (*Ð �nÓ )Ø*˜IŸN™NÓ,Ð à0€	Ø#$Ð  Ø&*Ð #óó0ó
hôd
Ð 4ô d
óV 
ð ÐDðÐ ó
Br3   