+
    lHàj±(  ã                   óö   € R t ^ RIt^ RIt^ RIt^ RIt^ RIHtHtHtH	t	H
t
 ^ RIHt ^ RIHt ^ RIHt ^ RIHt ^ RIHt ]! 0 Rm4      tR R	 ltR
 R ltR R ltR R ltR R ltR R ltR R ltR R lt R# )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_sessionc                ó$   € V ^8„  d   QhR\         /# ©é   Úreturn)Úbool)Úformats   "ÚK/home/ubuntu/.hermes/hermes-agent/tools/browser_tool_lightpanda_fallback.pyÚ__annotate__r      s   € ÷ 8ñ 8¤$ñ 8ó    c                 ó2   € \         P                  ! 4       R8H  # )zFReturn True when local browser commands are configured for Lightpanda.Ú
lightpanda)Ú_cloudÚ_get_browser_engine© r   r   Ú_using_lightpanda_enginer      s   € ä×%Ò%Ó'¨<Ñ7Ð7r   c                óF   € V ^8„  d   QhR\         \        \        3,          /# r   )Útupler   Ústr)r   s   "r   r   r      s   € ÷ $Rñ $R¤%¬¬c¨	Õ"2ñ $Rr   c                 óŠ  € \        4       p \        4       '       g   R# \        P                  ! 4       '       d   R# V P	                  4       '       d   R	# \
        P                  ! 4       '       d   R
#  \
        P                  ! 4       pVe    VP                  pRRV R23# V P                  4       '       g   R#  ^ RIHpHp V! V! 4       4      '       d   R#  R#   \         d    Rp Lai ; i  \         d    \        T4      P                  p Lvi ; i  \         d(   pT P                   P#                  RT4        Rp?R# Rp?ii ; i)a`  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``.
FNzcloud provider zH is selected (browser.cloud_provider, or auto-detected from credentials))Ú_read_browser_cfgÚ"is_legacy_browser_use_cloud_configz)legacy Browser Use cloud check failed: %s)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))Tz9built-in browser tools: agent-browser --engine lightpanda)Fz3Browser Use cloud (BROWSER_USE_API_KEY) is selected)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_statusr4      sE  € ô ‹)€CÜ#×%Ò%ØÐÜ×!Ò!×#Ò#ØVÐVØ
×Ñ×ÒØEÐEô ×Ò×!Ò!ØbÐbðÜ×-Ò-Ó/ˆð Òð	+Ø×(Ñ(ˆDð ˜¨ vÐ-uÐvÐvÐvØ×'Ñ'×)Ò)ØPÐPðIß_Ù-Ñ.?Ó.A×BÒBØOÐOð Cð RÐQøô! ô ØŠðûô
 ô 	+Ü˜“>×*Ñ*ŠDð	+ûô ô IØ�
‰
×ÑÐDÀa×HÐHØQÐQûðIúsB   Á0C Â
C* Â7D ÃD ÃC'Ã&C'Ã* DÄDÄEÄD=Ä=Ec          	      ó€   € V ^8„  d   QhR\         R\         R\        \         \        3,          R\        \         ,          /# ©r   ÚengineÚcommandÚresultr   )r   Údictr   r   )r   s   "r   r   r   D   s7   € ÷ ñ ¬ð ´cð Ä4ÌÌSÈÅ>ð ÔV^Ô_bÕVcñ r   c                óˆ  € V R8w  g   V\         9  d   R# VP                  R4      '       g;   RV: R\        VP                  R4      ;'       g    R4      P                  4        R2# VP                  R	/ 4      pVR
8X  d;   \	        VP                  R
R4      ;'       g    RP                  4       4      ^8  d   R# VR8X  dq   VP                  RR4      '       dY    \
        P                  P                  VR,          4      pTR8  d+   \        4       P                  P                  RT4       RT R2# R#   \         d     R# i ; i)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.ÚdataÚsnapshotr!   zELightpanda returned an empty/too-short snapshot; retried with Chrome.Ú
screenshotÚ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Úgetr   ÚstripÚlenÚosrA   ÚgetsizeÚOSErrorr"   r.   r/   )r7   r8   r9   r>   Úsizes   &&&  r   Ú_lightpanda_fallback_reasonrJ   D   s%  € à�Ô Ô0BÔ!BÙØ�:‰:�i× Ò Ø˜W™K y´°V·Z±ZÀÓ5H×5\Ð5\ÐL\Ó1]×1cÑ1cÓ1eÐ0fÐf}Ð~Ð~Ø�:‰:�f˜bÓ!€DØ�*Ô¤ d§h¡h¨z¸2Ó&>×&DÐ&DÀ"×%KÑ%KÓ%MÓ!NÐQSÔ!SÙVØ�,Ô 4§8¡8¨F°B×#7Ò#7ð	]Ü—7‘7—?‘? 4¨¥<Ó0ˆDð �%Œ<Ü‹I×Ñ×"Ñ"ð $@ØAEôGàCÀDÀ6ÐIjÐjÐjÙøô ô 	]Ú\ð	]ús   Ã&D2 Ä2EÅ Ec                ój   € V ^8„  d   QhR\         R\         R\        \         \        3,          R\        /# r6   )r   r:   r   r   )r   s   "r   r   r   Z   s7   € ÷ Lñ L¤sð L´Sð LÄ$ÄsÌCÀxÅ.ð LÔUYñ Lr   c                ó   € \        WV4      RJ# )zICheck if a Lightpanda result should trigger an automatic Chrome fallback.N)rJ   )r7   r8   r9   s   &&&r   Ú_needs_lightpanda_fallbackrM   Z   s   € ä& v¸Ó?ÀtÐKÐKr   c                ó€   € V ^8„  d   QhR\         \        \        3,          R\        R\         \        \        3,          /# )r   r9   Úreasonr   ©r:   r   r   )r   s   "r   r   r   _   s2   € ÷ ñ ¬$¬s´C¨x­.ð Ä#ð Ì$ÌsÔTWÈxÍ.ñ r   c                ó>  € RV 2pRVRRRRRRRR	V//p/ V CVCpVP                  R
4      p\        V\        4      '       d]   \        V4      ;VR
&   pVP                  4        F8  w  rgTP	                  T\        V\        4      '       d   \        V4      MT4       K:  	  V# )zGAdd a user-visible Chrome fallback warning to a browser command result.uB   âš  Lightpanda fallback: Chrome was used for this browser action. Úfallback_warningÚbrowser_engineÚchromeÚbrowser_engine_fallbackÚfromr   ÚtorO   r>   )rC   Ú
isinstancer:   ÚitemsÚ
setdefault)r9   rO   ÚwarningÚfieldsÚ	annotatedr>   ÚkeyÚvalues   &&      r   Ú_annotate_lightpanda_fallbackr`   _   s«   € àRÐV\ÐU]Ð^€GØ  'Ð+;¸XØ'¨&°,ÀÀhÐPXÐZ`Ð)aðc€Fà$�6Ð$˜VÐ$€IØ�=‰=˜Ó €DÜ�$œ×ÒÜ#'¨£:Ð-ˆ	�&Ñ˜DØ Ÿ,™,ž.‰JˆCØ�O‰O˜C´
¸5Ä$×0GÒ0G¤ e¤ÈUÖSñ )àÐr   c                ó¢   € V ^8„  d   QhR\         \        \        3,          R\         \        \        3,          R\         \        \        3,          /# )r   Útargetr9   r   rP   )r   s   "r   r   r   m   s<   € ÷ ñ ¤4¬¬S¨¥>ð ¼4ÄÄSÀ½>ð ÌdÔSVÔX[ÐS[Ínñ r   c                óœ   € VP                  R4      '       d5   VR,          V R&   VP                  R4      V R&   VP                  R4      V R&   V # )zLCopy browser fallback metadata from an internal result into a tool response.rR   rS   rU   )rC   )rb   r9   s   &&r   Ú_copy_fallback_warningrd   m   sR   € à‡z�zÐ$×%Ò%Ø%+Ð,>Õ%?ˆÐ!Ñ"Ø#)§:¡:Ð.>Ó#?ˆÐÑ Ø,2¯J©JÐ7PÓ,QˆÐ(Ñ)Ø€Mr   c                óŒ   € V ^8„  d   QhR\         R\         R\        \         ,          R\        R\        \         \        3,          /# )r   Útask_idr8   ÚargsÚtimeoutr   ©r   ÚlistÚintr:   r   )r   s   "r   r   r   v   sH   € ÷ M;ñ M;¬#ð M;¼ð M;Ä4ÌÅ9ð M;ÔWZð M;Ô_cÔdgÔilÐdlÕ_mñ M;r   c                óê  aaaaa€ \        4       o^ RIp\        P                  ! V RR.^
RR7      pVP	                  R4      '       d:   \        VP	                  R/ 4      P	                  RR4      4      P                  4       MRpV'       g"   SP                  P                  R	4       RR
RR/# RVP                  4       P                  R,           2p \        P                  ! 4       p\        P                  ! 4       '       g'   \        P                  ! 4       '       d   Rp
MRp
RR
RT
/# \        P                   ! T4      RRRTR.,           o\        P"                  ! T4      o\        P$                  ! 4        \        P&                  ! S4      o\        P(                  ! S4       \        P*                  ! S4      oR TTTTT3R llp T! RT.4      pTP	                  R4      '       gf   SP                  P                  RTP	                  R4      4       RR
RRTP	                  R4       2/ T! R. 4       \.        P0                  ! SRR7       # T! Y4       T! R. 4       \.        P0                  ! SRR7       #   \         d   p	RR
R\        T	4      /u Rp	?	# Rp	?	ii ; i  \,         d     Lwi ; i  \,         d     L^i ; i   T! R. 4       M  \,         d     Mi ; i\.        P0                  ! SRR7       i ; i)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.
NrC   Úurlr   )rh   Ú_engine_overrider<   r>   r!   z@Chrome fallback: could not determine current URL from LP sessionFr=   z7Chrome fallback failed: could not determine current URLÚh_cfb_:Né   Nuž   Chrome fallback requires Chromium, but it is missing. You're running in Docker â€” pull the latest image: docker pull ghcr.io/nousresearch/hermes-agent:latestzaChrome fallback requires Chromium, but it is missing. Install it with: hermes pm install chromiumz--enginerT   z	--sessionz--jsonc                ót   € V ^8„  d   QhR\         R\        \         ,          R\        \         \        3,          /# )r   ÚcmdÚcmd_argsr   )r   rj   r:   r   )r   s   "r   r   Ú2_run_chrome_fallback_command.<locals>.__annotate__¡   s2   € ÷ Nñ N”cð N¤T¬#¥Yð N´4¼¼S¸µ>ñ Nr   c                 ó¤  <€ \         P                  ! S	V .,           V,           S
SV 4      p\        P                  P	                  SR V  24      p\        P                  P	                  SRV  24      p VP                  SR7        \        TRR	7      ;_uu_ 4       pTP                  4       P                  4       pR
R
R
4       X'       dC   \        P                  ! TP                  R4      R,          4      \         P                  ! Y44       #  \         P                  ! Y44       RRRRT  R2/#   \        P                   d.    TP                  4        TP                  4        RRRRT  R2/u # i ; i  + '       g   i     LÀ; i  \          d'   pSP"                  P%                  RY4        R
p?L¤R
p?ii ; i  \         P                  ! Y44       i ; i)Ú_stdout_Ú_stderr_)rh   r<   Fr=   zChrome fallback 'z' timed outz	utf-8-sig)ÚencodingNÚ
z&Chrome fallback tmp cmd '%s' error: %sz' failedéÿÿÿÿ)Ú_sessionÚ_popen_agent_browserrF   rA   ÚjoinÚwaitÚ
subprocessÚTimeoutExpiredÚkillÚopenÚreadrD   ÚjsonÚloadsÚsplitÚ_unlink_command_output_filesr(   r.   r/   )rr   rs   ÚprocÚstdout_pathÚstderr_pathÚfÚstdoutÚexcr0   Ú	base_argsÚbrowser_envÚtask_socket_dirrh   s   &&      €€€€€r   Ú_run_tmpÚ._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¨K×8Õ8¸AØŸ™›Ÿ™Ó)�÷ 9çÜ—z’z &§,¡,¨tÓ"4°RÕ"8Ó9ô ×1Ò1°+ÕKð ô
 ×1Ò1°+ÔKØ˜5 'Ð->¸s¸eÀ8Ð+LÐMÐMøô ×(Ñ(ô 	UØ�I‰IŒKØ�I‰IŒKØ˜u gÐ1BÀ3À%À{Ð/SÐTÒTð	Uú÷
 9×8ûô ô 	QØ�J‰J×ÑÐEÀs×PÑPûð	Qûô ×1Ò1°+ÕKús`   Á1D+ ÂF ÂE0Â8F Ã+F Ä
F7 Ä+?E-Å,E-Å0F 	Å;F ÆF4ÆF/Æ*F7 Æ/F4Æ4F7 Æ7Gr‚   z$Chrome fallback: navigate failed: %sz!Chrome fallback navigate failed: ÚcloseT)Úignore_errors)r"   Úuuidr{   Ú_run_browser_commandrC   r   rD   r.   r[   Úuuid4ÚhexÚ_installÚ_find_agent_browserÚFileNotFoundErrorÚ_chromium_installedÚ_running_in_dockerÚ_agent_browser_argvÚ_prepare_session_socket_dirÚ"_ensure_screen_for_headed_chromiumÚ_agent_browser_command_envÚ_apply_chromium_sandbox_argsÚ windows_headless_browser_optionsr(   ÚshutilÚrmtree)rf   r8   rg   rh   r•   Ú
url_resultÚcurrent_urlÚtmp_sessionÚbrowser_cmdr3   Úhintr‘   Únavr0   rŽ   r�   r�   s   &&&f         @@@@r   Ú_run_chrome_fallback_commandr¬   v   s   ü€ ô ‹)€CÛô ×.Ò.¨w¸À¸wÐPRÐeqÔr€JØLVÏNÉNÐ[d×LeÒLe”#�j—n‘n V¨RÓ0×4Ñ4°U¸BÓ?Ó@×FÑFÔHÐko€KßØ�
‰
×ÑÐ]Ô^Ø˜5 'Ð+dÐeÐeð ˜4Ÿ:™:›<×+Ñ+¨BÕ/Ð0Ð1€Kð3Ü×2Ò2Ó4ˆô ×'Ò'×)Ò)Ü×&Ò&×(Ò(ðb‰Dð1ˆDà˜5 '¨4Ð0Ð0ä×,Ò,¨[Ó9¸ZÈÐS^Ð`kÐmuÐ<vÕv€IÜ×:Ò:¸;ÓG€Oä×/Ò/Ô1Ü×5Ò5°oÓF€KÜ×)Ò)¨+Ô6ô ×;Ò;¸KÓH€K÷Nô Nð*;á�v ˜}Ó-ˆØ�w‰w�y×!Ò!Ø�J‰J×ÑÐEÀsÇwÁwÈwÓGWÔXØ˜u gÐ1RÐSV×SZÑSZÐ[bÓScÐRdÐ/eÐfð	Ù�W˜bÔ!ô 	�Š�o°TÖ:ñ ˜Ó&ð	Ù�W˜bÔ!ô 	�Š�o°TÖ:øôs ô 3Ø˜5 '¬3¨q«6Ð2Õ2ûð3ûôn ô 	Ùð	ûŒyô 	Ùð	ûð	Ù�W˜bÕ!øÜô 	Ùð	úä�Š�o°TÖ:ús   ÃI3 Ç J< Ç$AJ< È'	JÉ	J< É	J+É3JÉ>JÊJÊJÊJ(Ê'J(Ê+J9Ê8J9Ê<K2Ê>	KËK2ËKËK2ËKËK2c          
      ó€   € V ^8„  d   QhR\         R\        \         ,          R\        R\        \         \        3,          /# )r   rf   rg   rh   r   ri   )r   s   "r   r   r   Æ   s?   € ÷ Nñ N¬ð N´D¼µIð NÌð NÔPTÔUXÔZ]ÐU]ÕP^ñ Nr   c                ó   € \        V RW4      # )z3Take a screenshot using a temporary Chrome session.r@   )r¬   )rf   rg   rh   s   &&&r   Ú_chrome_fallback_screenshotr¯   Æ   s   € ä'¨°¸tÓMÐMr   >   ÚbackÚevalÚfillr‚   ÚclickÚpressÚerrorsÚscrollÚconsoler?   r@   )!Ú__doc__r„   rF   r¤   r   Útypingr   r   r   r   r   Útools.browser_tool_originr   r"   Útoolsr   r#   r	   r   r
   r™   r   r{   Ú	frozensetrB   r   r4   rJ   rM   r`   rd   r¬   r¯   r   r   r   Ú<module>r½      so   ðñó Û 	Û Û ß 3Õ 3Ý >Ý *Ý .Ý 2Ý 2ñ ò  Xó YÐ õ8õ
$RõNõ,Lõ
õõM;÷`Nr   