Ë
    ãß²j„'  ã                   ó®  — 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m	Z	m
Z
 ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ  eh d	£«      Zd
efd„Zd
e
eef   fd„Zdededeeef   d
e	e   fd„Zdededeeef   d
efd„Zdeeef   ded
eeef   fd„Zdeeef   deeef   d
eeef   fd„Z dededee   de!d
eeef   f
d„Z"dedee   de!d
eeef   fd„Z#y)u  Lightpanda engine status and the automatic Chrome fallback for browser commands
that Lightpanda cannot serve (screenshots, empty snapshots, failed commands).

Facade-owned state is read through ``_bt`` (``tools.browser_tool``, resolved per call) â€” no import cycle.
é    N)ÚAnyÚDictÚListÚOptionalÚTuple)Úorigin_module)Úbrowser_tool_cdp)Úbrowser_tool_cloud)Úbrowser_tool_install)Úbrowser_tool_session>   ÚbackÚevalÚfillÚopenÚclickÚpressÚerrorsÚscrollÚconsoleÚsnapshotÚ
screenshotÚreturnc                  ó0   — t        j                  «       dk(  S )zFReturn True when local browser commands are configured for Lightpanda.Ú
lightpanda)Ú_cloudÚ_get_browser_engine© ó    úK/home/ubuntu/.hermes/hermes-agent/tools/browser_tool_lightpanda_fallback.pyÚ_using_lightpanda_enginer       s   € ä×%Ñ%Ó'¨<Ñ7Ð7r   c                  ó  — t        «       } t        «       syt        j                  «       ry| j	                  «       ryt        j                  «       ry	 t        j                  «       }|�	 |j                  }dd|› d�fS | j                  «       sy		 d
dlm}m}  | |«       «      ry	 y# t        $ r d}Y ŒNw xY w# t        $ r t        |«      j                  }Y Œcw xY w# t        $ r&}| j                   j#                  d|«       Y d}~yd}~ww xY w)ap  Whether ``browser.engine: lightpanda`` is actually in effect, and why.

    ``(False, "")`` when the engine isn't lightpanda; else the reason names the setting shadowing
    it or the driver running it. Mirrors ``_should_inject_engine`` / ``_resolve_backend_cdp``
    precedence with config-only gates (no network I/O) for ``/browser status`` / ``hermes doctor``.
    )FÚ )Fz>a CDP override is active (/browser connect or browser.cdp_url))Fz-Camofox is the selected browser (CAMOFOX_URL))FzJbrowser.use_real_profile is on (Lightpanda cannot load a Chromium profile)NFzcloud provider zH is selected (browser.cloud_provider, or auto-detected from credentials))Tz9built-in browser tools: agent-browser --engine lightpandar   )Ú_read_browser_cfgÚ"is_legacy_browser_use_cloud_config)Fz3Browser Use cloud (BROWSER_USE_API_KEY) is selectedz)legacy Browser Use cloud check failed: %s)Tz>Browser Use mode: Hermes spawns `lightpanda serve` per session)Ú_originr    Ú_cdpÚ_get_cdp_override_rawÚ_is_camofox_moder   Ú_use_real_profileÚ_get_cloud_providerÚ	ExceptionÚdisplay_nameÚtypeÚ__name__Ú_is_browser_use_cli_modeÚtools.browser_use_clir#   r$   ÚloggerÚdebug)Ú_btÚproviderÚnamer#   r$   Úes         r   Úlightpanda_engine_statusr7      s  € ô ‹)€CÜ#Ô%ØÜ×!Ñ!Ô#ØVØ
×ÑÔØEô ×ÑÔ!ØbðÜ×-Ñ-Ó/ˆð Ðð	+Ø×(Ñ(ˆDð ˜¨ vÐ-uÐvÐvÐvØ×'Ñ'Ô)ØPðIß_Ù-Ñ.?Ó.AÔBØOð Cð Røô! ò ØŠðûô
 ò 	+Ü˜“>×*Ñ*ŠDð	+ûô ò IØ�
‰
×ÑÐDÀa×HÐHØQûðIús<   ÁB' Á)B8 ÂC Â'B5Â4B5Â8CÃCÃ	DÃ%DÄDÚengineÚcommandÚresultc                 ó(  — | dk7  s|t         vry|j                  d«      s3d|›dt        |j                  d«      xs d«      j                  «       › d�S |j                  d	i «      }|d
k(  r1t	        |j                  d
d«      xs dj                  «       «      dk  ry|dk(  rd|j                  dd«      rR	 t
        j                  j                  |d   «      }|dk  r*t        «       j                  j                  d|«       d|› d�S y# t        $ r Y yw xY w)zdUser-visible reason a Lightpanda result needs the Chrome fallback (copied into the result), or None.r   NÚsuccesszLightpanda z	 failed (Úerrorzcommand failedz); retried with Chrome.Údatar   r"   é   zELightpanda returned an empty/too-short snapshot; retried with Chrome.r   ÚpathzGLightpanda screenshot file was missing/unreadable; retried with Chrome.i P  zRLightpanda screenshot is suspiciously small (%d bytes), triggering Chrome fallbackz.Lightpanda screenshot was suspiciously small (z bytes); retried with Chrome.)Ú_FALLBACK_ELIGIBLEÚgetÚstrÚstripÚlenÚosr@   ÚgetsizeÚOSErrorr%   r1   r2   )r8   r9   r:   r>   Úsizes        r   Ú_lightpanda_fallback_reasonrJ   D   s  € à�Ò Ô0BÑ!BØØ�:‰:�iÔ Ø˜W˜K y´°V·Z±ZÀÓ5HÒ5\ÐL\Ó1]×1cÑ1cÓ1eÐ0fÐf}Ð~Ð~Ø�:‰:�f˜bÓ!€DØ�*Ò¤ d§h¡h¨z¸2Ó&>Ò&DÀ"×%KÑ%KÓ%MÓ!NÐQSÒ!SØVØ�,Ò 4§8¡8¨F°BÔ#7ð	]Ü—7‘7—?‘? 4¨¡<Ó0ˆDð �%Š<Ü‹I×Ñ×"Ñ"ð $@ØAEôGàCÀDÀ6ÐIjÐjÐjØøô ò 	]Ù\ð	]ús   Â3"D Ä	DÄDc                 ó    — t        | ||«      duS )zICheck if a Lightpanda result should trigger an automatic Chrome fallback.N)rJ   )r8   r9   r:   s      r   Ú_needs_lightpanda_fallbackrL   Z   s   € ä& v¨w¸Ó?ÀtÐKÐKr   Úreasonc                 ó  — d|› �}|ddd|dœdœ}i | ¥|¥}|j                  d«      }t        |t        «      rUt        |«      x|d<   }|j                  «       D ]2  \  }}|j	                  |t        |t        «      rt        |«      n|«       Œ4 |S )zGAdd a user-visible Chrome fallback warning to a browser command result.uB   âš  Lightpanda fallback: Chrome was used for this browser action. Úchromer   )ÚfromÚtorM   )Úfallback_warningÚbrowser_engineÚbrowser_engine_fallbackr>   )rB   Ú
isinstanceÚdictÚitemsÚ
setdefault)r:   rM   ÚwarningÚfieldsÚ	annotatedr>   ÚkeyÚvalues           r   Ú_annotate_lightpanda_fallbackr^   _   s    € àRÐV\ÐU]Ð^€GØ")¸XØ2>ÀhÐZ`Ñ)añc€Fà$�6Ð$˜VÐ$€IØ�=‰=˜Ó €DÜ�$œÔÜ#'¨£:Ð-ˆ	�&Ñ˜DØ Ÿ,™,›.ò 	T‰JˆC�Ø�O‰O˜C´
¸5Ä$Ô0G¤ e¤ÈUÕSð	TàÐr   Útargetc                 óˆ   — |j                  d«      r0|d   | d<   |j                  d«      | d<   |j                  d«      | d<   | S )zLCopy browser fallback metadata from an internal result into a tool response.rR   rS   rT   )rB   )r_   r:   s     r   Ú_copy_fallback_warningra   m   sO   € à‡z�zÐ$Ô%Ø%+Ð,>Ñ%?ˆÐ!Ñ"Ø#)§:¡:Ð.>Ó#?ˆÐÑ Ø,2¯J©JÐ7PÓ,QˆÐ(Ñ)Ø€Mr   Útask_idÚargsÚtimeoutc                 ób  ‡‡‡‡‡— t        «       Šddl}t        j                  | ddgdd¬«      }|j	                  d«      r9t        |j	                  d	i «      j	                  dd
«      «      j                  «       nd}|s ‰j                  j                  d«       dddœS d|j                  «       j                  dd › �}	 t        j                  «       }t        j                  «       st        j                  «       rd}
nd}
d|
dœS t        j                   |«      ddd|dgz   Št        j"                  |«      Št        j$                  ‰«      Št        j&                  ‰«       dt
        dt(        t
           dt*        t
        t,        f   fˆˆˆˆˆfd„}	  |d|g«      }|j	                  d«      sc‰j                  j                  d|j	                  d«      «       dd|j	                  d«      › �dœ	  |dg «       t1        j2                  ‰d ¬!«       S  |||«      	  |dg «       t1        j2                  ‰d ¬!«       S # t        $ r}	dt        |	«      dœcY d}	~	S d}	~	ww xY w# t.        $ r Y Œqw xY w# t.        $ r Y ŒVw xY w# 	  |dg «       n# t.        $ r Y nw xY wt1        j2                  ‰d ¬!«       w xY w)"a  Run a browser command in a temporary Chrome session at the current URL.

    agent-browser locks the engine when a named daemon starts, so ``--engine chrome`` on the
    Lightpanda session is ignored: fresh temp Chrome session -> same URL -> ``command`` -> tear down.
    r   NrB   Úurlé
   r   )rd   Ú_engine_overrider<   r>   r"   z@Chrome fallback: could not determine current URL from LP sessionFz7Chrome fallback failed: could not determine current URL©r<   r=   Úh_cfb_é   už   Chrome fallback requires Chromium, but it is missing. You're running in Docker â€” pull the latest image: docker pull ghcr.io/nousresearch/hermes-agent:latestzžChrome fallback requires Chromium, but it is missing. Install it with: npx agent-browser install --with-deps (or: npx playwright install --with-deps chromium)z--enginerO   z	--sessionz--jsonÚcmdÚcmd_argsr   c                 óT  •— t        j                  ‰	| gz   |z   ‰
‰| «      }t        j                  j	                  ‰d| › �«      }t        j                  j	                  ‰d| › �«      }	 |j                  ‰¬«       	 t        |d¬	«      5 }|j                  «       j                  «       }d d d «       r=t        j                  |j                  d
«      d   «      t        j                  ||«       S 	 t        j                  ||«       dd| › d�dœS # t        j                  $ r, |j                  «        |j                  «        dd| › d�dœcY S w xY w# 1 sw Y   ŒªxY w# t         $ r'}‰j"                  j%                  d| |«       Y d }~Œ˜d }~ww xY w# t        j                  ||«       w xY w)NÚ_stdout_Ú_stderr_)rd   FzChrome fallback 'z' timed outri   zutf-8)ÚencodingÚ
éÿÿÿÿz&Chrome fallback tmp cmd '%s' error: %sz' failed)Ú_sessionÚ_popen_agent_browserrF   r@   ÚjoinÚwaitÚ
subprocessÚTimeoutExpiredÚkillr   ÚreadrD   ÚjsonÚloadsÚsplitÚ_unlink_command_output_filesr+   r1   r2   )rl   rm   ÚprocÚstdout_pathÚstderr_pathÚfÚstdoutÚexcr3   Ú	base_argsÚbrowser_envÚtask_socket_dirrd   s           €€€€€r   Ú_run_tmpz._run_chrome_fallback_command.<locals>._run_tmpœ   s…  ø€ Ü×,Ñ,¨Y¸#¸Ñ->ÀÑ-IÈ;ÐXgÐilÓmˆÜ—g‘g—l‘l ?°h¸s¸eÐ4DÓEˆÜ—g‘g—l‘l ?°h¸s¸eÐ4DÓEˆð	UØ�I‰I˜gˆIÔ&ð
	LÜ�k¨GÔ4ð *¸ØŸ™›Ÿ™Ó)�÷*áÜ—z‘z &§,¡,¨tÓ"4°RÑ"8Ó9ô ×1Ñ1°+¸{ÕKð ô
 ×1Ñ1°+¸{ÔKØ Ð->¸s¸eÀ8Ð+LÑMÐMøô ×(Ñ(ò 	UØ�I‰IŒKØ�I‰IŒKØ$Ð1BÀ3À%À{Ð/SÑTÒTð	Uú÷
*ð *ûô ò 	QØ�J‰J×ÑÐEÀsÈC×PÑPûð	Qûô ×1Ñ1°+¸{ÕKúsZ   Á(D Á;E ÂEÂ'0E Ã.F Ä<EÅEÅEÅE Å	FÅ%FÆF ÆFÆF ÆF'r   z$Chrome fallback: navigate failed: %sr=   z!Chrome fallback navigate failed: ÚcloseT)Úignore_errors)r%   Úuuidrt   Ú_run_browser_commandrB   rC   rD   r1   rY   Úuuid4ÚhexÚ_installÚ_find_agent_browserÚFileNotFoundErrorÚ_chromium_installedÚ_running_in_dockerÚ_agent_browser_argvÚ_prepare_session_socket_dirÚ_agent_browser_command_envÚ_apply_chromium_sandbox_argsr   r   r   r+   ÚshutilÚrmtree)rb   r9   rc   rd   rŒ   Ú
url_resultÚcurrent_urlÚtmp_sessionÚbrowser_cmdr6   Úhintr‰   Únavr3   r†   r‡   rˆ   s      `         @@@@r   Ú_run_chrome_fallback_commandr¡   v   s�  ü€ ô ‹)€CÛô ×.Ñ.¨w¸À¸wÐPRÐeqÔr€JØLVÏNÉNÐ[dÔLe”#�j—n‘n V¨RÓ0×4Ñ4°U¸BÓ?Ó@×FÑFÔHÐko€KÙØ�
‰
×ÑÐ]Ô^Ø Ð+dÑeÐeð ˜4Ÿ:™:›<×+Ñ+¨B¨QÐ/Ð0Ð1€Kð3Ü×2Ñ2Ó4ˆô ×'Ñ'Ô)Ü×&Ñ&Ô(ðb‰DðnˆDà ¨4Ñ0Ð0ä×,Ñ,¨[Ó9¸ZÈÐS^Ð`kÐmuÐ<vÑv€IÜ×:Ñ:¸;ÓG€Oä×5Ñ5°oÓF€KÜ×)Ñ)¨+Ô6ðN”cð N¤T¬#¡Yð N´4¼¼S¸±>÷ Nñ Nð*;á�v ˜}Ó-ˆØ�w‰w�yÔ!Ø�J‰J×ÑÐEÀsÇwÁwÈwÓGWÔXØ$Ð1RÐSV×SZÑSZÐ[bÓScÐRdÐ/eÑfð	Ù�W˜bÔ!ô 	�‰�o°TÖ:ñ ˜ Ó&ð	Ù�W˜bÔ!ô 	�‰�o°TÖ:øôi ò 3Ø ¬3¨q«6Ñ2Õ2ûð3ûôd ò 	Ùð	ûŒyò 	Ùð	ûð	Ù�W˜bÕ!øÜò 	Ùð	úä�‰�o°TÖ:úsy   Â>H9 ÆAI; Ç.	IÈI; È	I,È9	IÉIÉIÉIÉ	I)É(I)É,	I8É7I8É;J.É=	JÊJ.Ê	JÊJ.ÊJÊJ.c                 ó   — t        | d||«      S )z3Take a screenshot using a temporary Chrome session.r   )r¡   )rb   rc   rd   s      r   Ú_chrome_fallback_screenshotr£   Á   s   € ä'¨°¸tÀWÓMÐMr   )$Ú__doc__r|   rF   r™   rx   Útypingr   r   r   r   r   Útools.browser_tool_originr   r%   Útoolsr	   r&   r
   r   r   r�   r   rt   Ú	frozensetrA   Úboolr    rC   r7   rJ   rL   r^   ra   Úintr¡   r£   r   r   r   ú<module>r«      sœ  ðñó Û 	Û Û ß 3Õ 3Ý >Ý *Ý .Ý 2Ý 2ñ ò  Xó YÐ ð8 $ó 8ð
$R %¨¨c¨	Ñ"2ó $RðN¨ð °cð À4ÈÈSÈÁ>ð ÐV^Ð_bÑVcó ð,L sð L°Sð LÀ$ÀsÈCÀxÁ.ð LÐUYó Lð
¨$¨s°C¨x©.ð À#ð È$ÈsÐTWÈxÉ.ó ð 4¨¨S¨¡>ð ¸4ÀÀSÀ¹>ð ÈdÐSVÐX[ÐS[Énó ðH;¨#ð H;¸ð H;À4ÈÁ9ð H;ÐWZð H;Ð_cÐdgÐilÐdlÑ_mó H;ðVN¨ð N°D¸±Ið NÈð NÐPTÐUXÐZ]ÐU]ÑP^ô Nr   