+
    lHàjo ã                   ó˜  a€ Rù tâ0 t R t^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
t
^ RIHtHtHtHt ^ RIHt ^ RIHt ^ RIHtHt ^ RIHt ^ RIHtHt ^ RIHt Rút] ^ k RûR	 R
 lltR R lt  ^ RI!H"t"  ^ RI$H%t%H&t'H(t)H*t+ ^ RI,H-t-  ^ RI.H/t0  ^ RI2H3t4  ^ RI5H6t7 ]Pp                  ! ]94      t:Rüt;]Px                  P{                  ];4      t>^ RI?H@tA / tB] ^k ^tC^<tD^xtERtFRtGRtH]I! R R!04      tJ] ^k RtK] ^k R"tLRtM] ^k R"tNRtO] ^k R"tPRtQ] ^k / tR] ^k ]	P¦                  ! 4       tTR"tURtV] ^k RtW] ^	k R"tXR"tYR#tZ] ^
k Rt[] ^k R"t\R"t]]t^R$ R% lt_R& R' lt`R( R) ltaR* R+ ltbR, R- ltcR.R"/R/ R0 lltd^ R1I?Hetf R2 R3 ltg^ R4I?Hhti ^ R5I?Hjtk ^ R6I?Hltm R7tnR8to]	Pà                  ! 4       tq/ tr] ^k . ts] ^k RýttR9 R: ltuR; R< ltvR= R> ltwR? R@ ltxRA RB ltyRC RD ltzRE RF lt{RG RH lt|/ t}] ^k ]~! 4       t] ^k / t€] ^k RIt�R"t‚]ƒ! ]EP                  ! RJ/ 4      EP	                  RK^x4      4      t…RL RM lt†]†! 4       t‡RNtˆ]‰! RO]‡^,          4      tŠ/ t‹] ^k / tŒ] ^k / t�] ^k ^tŽ/ t�] ^k  ! RP RQ4      t�]�t‘Rt’R"t“]	Pà                  ! 4       t”^ RRI?H•t– ]EP.                  ! ]–EP0                  4       ]EP.                  ! ]–EP2                  4       RSRTRURVRWRXRYRZR[RXR\RUR]//R^R[.//RSR_RUR`RWRXRYRZRaRXRbRURcRdR"//R^. //RSReRURfRWRXRYRZRgRXR\RURh//R^Rg.//RSRiRURjRWRXRYRZRgRXR\RURk/RlRXR\RURm//R^RgRl.//RSRnRURoRWRXRYRZRpRXR\RqRrRs.RURt//R^Rp.//RSRuRURvRWRXRYRZ/ R^. //RSRwRURxRWRXRYRZRyRXR\RURz//R^Ry.//RSR{RUR|RWRXRYRZ/ R^. //RSR}RUR~RWRXRYRZRRXR\RUR€/R�RXRbRdR"RUR‚//R^R.//RSRƒRUR„RWRXRYRZR…RXRbRdR"RUR†/R‡RXR\RURˆ//R^. //.
tš^ R‰I?H›tœ RŠ R‹ lt�RŒ R� ltžRŽ R� ltŸR�R"/R‘ R’ llt R“ R” lt¡R�R"/R• R– llt¢Rþt£R— R˜ lt¤R™ Rš lt¥R› Rœ lt¦R� Rž lt§RÿRŸ R  llt¨R¡ R¢ lt©ER R£ R¤ l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± R² llt±RÿR³ R´ llt²RÿRµ R¶ llt³RÿR· R¸ llt´RÿR¹ Rº lltµR» R¼ lt¶R½ R¾ lt·R¿ RÀ lt¸RÁt¹RÂ RÃ ltºER RÄ RÅ llt»^ RÆI?H¼t½ RÇ RÈ lt¾RÉ RÊ lt¿RË RÌ ltÀRÍ RÎ ltÁRÏ RÐ ltÂRÿRÑ RÒ lltÃRÿRÓ RÔ lltÄRÕ RÖ ltÅR× RØ ltÆRÙtÇRÿRÚ RÛ lltÈRÜtÉ^ RÝI?HÊtË RÞ Rß ltÌERRà Rá lltÍ^ RâIÎHÏtÏHÐtÐ ^ RãIÑHÒtÒHÓtÓ ]š U u/ uF  q RS,          V bK  	  up tÔERRä Rå lltÕERRæ Rç lltÖRTRèRR[Ré/3R_RêRRaR"/ER3ReRëRRgRé/3RiRìRRgRéRlRé/3RnRíRRpRs/3RuRîR/ 3RwRìRRyRé/3R{Rï]AEP®                  / 3R}Rð]AEP°                  RRéR�R"/3RƒRñ]AEP®                  R…R"R‡R/33
tÙRò Ró ltÚRô Rõ ltÛ]Ù FR  vtÜtÝtÞtßtà]Þf   ]Ú! ]Ü4      ;tÞ]á! 4       Rö]Ü R÷2&   ]ÏEP.                  ! ]ÜRJ]Ô]Ü,          ]Û! ]Ü]Ö! ]Ü]ß.]àO5!  4      ]Þ]ÝRø7       KT  	  R#   ]# d    R t" ELvi ; i  ]# d    R t%R t'R t)R t+ ELƒi ; i  ]1 d    RR/R lt0 EL‹i ; i  ]1 d    R t4 EL•i ; i  ]1 d    R t7 ELŸi ; iu up i (  uË  Browser automation tools driven by the agent-browser CLI.

Backends â€” local headless Chromium, Browser Use / Browserbase / Firecrawl cloud
(auto-detected from config + credentials), a user-supplied CDP endpoint, or Camofox â€”
share one agent-facing behaviour: per-task sessions, accessibility-tree snapshots with
``@eN`` refs, automatic cleanup. Settings live under ``browser.*`` in config.yaml.
Sibling ``browser_tool_*`` modules hold extracted clusters.
N)ÚDictÚAnyÚOptionalÚUnion)ÚPath)Úredact_cdp_url)Úget_hermes_homeÚhermes_home_key)Úenv_int)ÚDEFAULT_CONFIGÚcfg_get)Úrecord_browser_callc                ó0   € V ^8„  d   QhR\         R\        /# )é   ÚtimeoutÚreturn)ÚfloatÚbool)Úformats   "Ú7/home/ubuntu/.hermes/hermes-agent/tools/browser_tool.pyÚ__annotate__r   '   s   € ÷ ñ ¬%ð ¼4ñ ó    c                ó   € R# )u(  Frozen old-updater surface (tests/compat/old_updater_surface.json): a pre-PM ``hermes update``
still running mid-swap imports this from the NEW tree. Nothing is warmed â€” PM owns the browser
runtime â€” and the permanent definition must live here, not behind the revert-scheduled compat
pointer.F© ©r   s   &r   Úwarm_agent_browser_npx_cacher   '   s   € ñ
 r   c                ó$   € V ^8„  d   QhR\         /# ©r   r   )Údict)r   s   "r   r   r   /   s   € ÷ ñ œDñ r   c                 ó:  € ^ RI Hp HpHp ^ RIHp ^ RIHp V! RR7      pV! 4       pV'       d   V ! 4       ;'       g    / MRp\         F.  pV'       d   VP                  V4      MV! V4      p	V	f   K*  W•V&   K0  	  ^ RI
Hp
 V! V
! V4      4      p\        4       VR&   V# )	a_  Credential-scrubbed env for an agent-browser subprocess (deferred import: test
harnesses stub the ``tools`` package). The passthrough keys are re-added from the active
profile's secret scope, never ``os.environ``: under multiplex that holds the LAUNCH profile's
Browserbase/Firecrawl keys, and a served profile's browser must run on its own (or none).)Úcurrent_secret_scopeÚ
get_secretÚserves_routed_profile)Úserved_profile_child_env)Úadd_loopback_no_proxyF)Úinherit_credentialsN)Údesktop_envÚTMPDIR)Úagent.secret_scoper    r!   r"   Útools.environments.localr#   Úagent.proxy_bypassr$   Ú_BROWSER_PASSTHROUGH_KEYSÚgetÚtools.bot_desktop.runtimer&   Ú_socket_safe_tmpdir)r    r!   r"   r#   r$   ÚenvÚroutedÚscopeÚkeyÚvalueÚ_bot_desktop_envs              r   Ú_build_browser_envr5   /   s�   € ÷
 [ÑZÝAå8á
"°uÔ
=€Cñ #Ó$€Fß.4Ñ!Ó#×)Ð) rø¸$€Eß(ˆß"(�—	‘	˜#”©j¸«oˆØÔØ�‹Hñ )õ JÙ
Ñ 0°Ó 5Ó
6€Cô (Ó)€Cˆ�MØ€Jr   )Úcheck_website_accessc                 ó   € R # ©Nr   ©Úurls   &r   Ú<lambda>r;   S   s   € ¡tr   )Ú_is_declared_fake_ipÚis_safe_urlÚis_always_blocked_urlÚnormalize_url_for_requestc                 ó   € R # ©Fr   )Úips   &r   r;   r;   ]   s   € ¡er   c                 ó   € R # rA   r   r9   s   &r   r;   r;   ^   ó   € ™ur   c                 ó   € R # )Tr   r9   s   &r   r;   r;   _   s   € ©r   c                 ó   € V # r8   r   r9   s   &r   r;   r;   `   s   € ©Sr   )ÚBrowserProvider)Úregistry_generationr1   c                 ó   € R# )é    )rJ   rJ   r   )r1   s   $r   Ú_browser_registry_generationrK   i   s   € Øˆr   )Úis_camofox_modec                  ó   € R # rA   r   r   r   r   r;   r;   p   rD   r   )Úis_browser_use_cli_modec                  ó   € R # rA   r   r   r   r   r;   r;   t   s   € ¡ur   )Úbrowser_tool_installi˜:  iè  i€„ ÚcloseÚrecordFTc                ó0   € V ^8„  d   QhR\         R\         /# )r   r2   Ú	log_label©Ústr)r   s   "r   r   r   ¼   s   € ÷ 
ñ 
”cð 
´cñ 
r   c                óô   €  ^ RI Hp V! 4       P                  R/ 4      p\        V\        4      '       d   W9   d   V! WP,          4      # V#   \
         d"   p\        P                  RY64        Rp?T# Rp?ii ; i)z�``parse(browser.<key>)`` from the RAW profile config (loader warnings must not
leak into tool JSON); ``default`` when absent, not a mapping, or on any error.©Úread_raw_configÚbrowserzCould not read %s: %sN)Úhermes_cli.configrY   r,   Ú
isinstancer   Ú	ExceptionÚloggerÚdebug)r2   ÚdefaultÚparserT   rY   Úbrowser_cfgÚes   &&&&   r   Ú_browser_cfgrd   ¼   so   € ð<Ý5Ù%Ó'×+Ñ+¨I°rÓ:ˆÜ�k¤4×(Ò(¨SÔ-?Ù˜Õ)Ó*Ð*ð €Nøô ô <Ü�‰Ð,¨i×;Ð;Ø€Nûð<ús   ‚AA ÁA7ÁA2Á2A7c                óH   € V ^8„  d   QhR\         R\         R\         R\         /# )r   Ú
cache_nameÚ	flag_namer2   rT   rU   )r   s   "r   r   r   É   s)   € ÷ ñ ¤Cð ´Cð ¼cð Ô^añ r   c                óÌ   € \        4       p\        4       pW`,          pVf   / ;q†V &   Wa,          '       d   VP                  V4      e	   W‡,          # \        W#WE4      p	W˜V&   RWa&   V	# )zâProcess-cached ``_browser_cfg`` read, one slot per profile home (cleared by
``cleanup_all_browsers``). The value is stored BEFORE the resolved flag flips so a
concurrent reader never sees ``resolved=True`` with an empty cache.T)Úglobalsr	   r,   rd   )
rf   rg   r2   r`   ra   rT   ÚgÚhomeÚcacheÚresults
   &&&&&&    r   Ú_cached_browser_cfgrn   É   sf   € ô 	‹	€AÜÓ€DØ�M€EØ‚}Ø "Ð"ˆ�*‘Ø‡|„|˜Ÿ	™	 $›Ò3Ø�{ÐÜ˜#¨Ó9€FØˆ$�KØ€A�LØ€Mr   c                ó$   € V ^8„  d   QhR\         /# r   ©Úint)r   s   "r   r   r   Ú   s   € ÷ ñ œcñ r   c                 ó,   € \        RRR\        R R4      # )z9``browser.command_timeout`` (floored at 5s; default 30s).Ú_cached_command_timeoutÚ_command_timeout_resolvedÚcommand_timeoutc                 ó@   € V f   \         # \        \        V 4      ^4      # r8   )ÚDEFAULT_COMMAND_TIMEOUTÚmaxrq   ©Úvs   &r   r;   Ú&_get_command_timeout.<locals>.<lambda>ß   s   € ¨QªYÔ)ÐJ¼CÄÀAÃÈ»NÐJr   zcommand_timeout from config)rn   rw   r   r   r   Ú_get_command_timeoutr|   Ú   s!   € äØ!Ð#>ØÔ2ÙJØ%ó	ð r   c                ó$   € V ^8„  d   QhR\         /# r   rp   )r   s   "r   r   r   ä   s   € ÷ ?ñ ?œsñ ?r   c                 ó.   € \        4       p V e   V # \        # )z�``_get_command_timeout`` guaranteed non-None (cache reset mid-flight); ``is not
None`` rather than ``or`` so a configured ``0`` is preserved.)r|   rw   )Úvals    r   Ú_safe_command_timeoutr€   ä   s   € ô Ó
 €CØ’/ˆ3Ð>Ô'>Ð>r   c                ó$   € V ^8„  d   QhR\         /# r   rp   )r   s   "r   r   r   ë   s   € ÷ ñ ¬ñ r   c                 ó,   € \        RRR\        R R4      # )zC``browser.snapshot_threshold`` (floored at MIN_SNAPSHOT_THRESHOLD).Ú_cached_snapshot_thresholdÚ_snapshot_threshold_resolvedÚsnapshot_thresholdc                 óH   € V f   \         # \        \        V 4      \        4      # r8   )ÚDEFAULT_SNAPSHOT_THRESHOLDrx   rq   ÚMIN_SNAPSHOT_THRESHOLDry   s   &r   r;   Ú0get_browser_snapshot_threshold.<locals>.<lambda>ð   s   € °²	Ô,Ðb¼sÄ3ÀqÃ6ÔKaÓ?bÐbr   zbrowser.snapshot_threshold)rn   r‡   r   r   r   Úget_browser_snapshot_thresholdrŠ   ë   s!   € äØ$Ð&DØÔ8ÙbØ$ó	ð r   Ú
first_openc                ó0   € V ^8„  d   QhR\         R\        /# )r   r‹   r   )r   rq   )r   s   "r   r   r   õ   s   € ÷ dñ d¬Tð d¼cñ dr   c                óV   € \        \        4       V '       d   \        4      # \        4      # )zDTimeout for agent-browser ``open`` (navigation / daemon cold start).)rx   r€   ÚMIN_FIRST_OPEN_TIMEOUTÚMIN_OPEN_TIMEOUT©r‹   s   $r   Ú_get_open_command_timeoutr‘   õ   s   € äÔ$Ó&Ç*Ô(>ÓcÐcÔRbÓcÐcr   )Úbrowser_tool_sessionc                ó:   € V ^8„  d   QhR\         \        ,          /# r   ©r   rV   )r   s   "r   r   r   ý   s   € ÷ Cñ Cœ8¤C�=ñ Cr   c                 ó`   € \         P                  ! RR4      P                  4       ;'       g    R# )u>   Model for browser_vision (screenshot analysis â€” multimodal).ÚAUXILIARY_VISION_MODELÚ N)ÚosÚgetenvÚstripr   r   r   Ú_get_vision_modelr›   ý   s%   € ä�9Š9Ð-¨rÓ2×8Ñ8Ó:×BÐB¸dÐBr   )Úbrowser_tool_cdp)Úbrowser_tool_cloud)Ú browser_tool_lightpanda_fallbackzhermes-real-profileg      >@c                ó0   € V ^8„  d   QhR\         R\        /# ©r   r:   r   ©rV   r   )r   s   "r   r   r     s   € ÷ "ñ "œð "¤ñ "r   c                ó�  aa€ ^ RI o^ RIp^ RIHp R V3R llo V! V 4      P                  ;'       g    RP                  4       P                  4       P                  R4      pV'       g   R# S! V4      ;pe   V# VR8X  g   VP                  \        4      '       d   R	#  VP                  VRVP                  VP                  4      p\        ;QJ d    T3R
 lT 4       F  '       g   K   R	# 	  R# ! T3R
 lT 4       4      #   TP                   d     R# i ; i  \         d"   p\         P#                  RY4        Rp?R# Rp?ii ; i)aº  True when the URL's host is (or resolves to) a private/LAN/loopback/CGNAT address.
Routing oracle only: DNS failures are NOT private (the configured backend surfaces the
error); obvious names short-circuit the DNS hop. A local proxy's declared fake-ip sentinel
(``security.fake_ip_ranges``) is not private: the name is public, the cloud browser resolves
it itself, so routing it to the local sidecar would send every URL local on such a host.N)Úurlparsec                óF   € V ^8„  d   QhR\         R\        \        ,          /# )r   Úhostr   )rV   r   r   )r   s   "r   r   Ú%_url_is_private.<locals>.__annotate__"  s"   € ÷ rñ r”cð rœh¤t�nñ rr   c                 ó  <€  SP                  V 4      p\        T4      '       d   R# TP                  ;'       g=    TP                  ;'       g)    TP
                  ;'       g    TSP                  R4      9   #   \         d     R # i ; i)NFz100.64.0.0/10)Ú
ip_addressÚ
ValueErrorr<   Ú
is_privateÚis_loopbackÚis_link_localÚ
ip_network)r¥   rB   Ú	ipaddresss   & €r   ÚprivateÚ _url_is_private.<locals>.private"  sy   ø€ ð	Ø×%Ñ% dÓ+ˆBô   ×#Ò#ÙØ�}‰}×qÐq §¡×qÐq°"×2BÑ2B×qÐqÀbÈI×L`ÑL`ÐapÓLqÑFqÐqøô	 ô 	Úð	ús   ƒA7 Á7BÂBr—   Ú.FÚ	localhostTc              3   óF   <"  € T F  Ev rS! V^ ,          4      x € K  	  R# 5i)rJ   Nr   )Ú.0Ú_Úsockaddrr¯   s   &  €r   Ú	<genexpr>Ú"_url_is_private.<locals>.<genexpr>7  s   øé € ÐF¹I©L¨Q‘7˜8 A�;×'Ð'»Iùs   ƒ!z#URL-privacy check failed for %s: %s)r®   ÚsocketÚurllib.parser£   Úhostnamerš   ÚlowerÚrstripÚendswithÚ_PRIVATE_HOST_SUFFIXESÚgetaddrinfoÚ	AF_UNSPECÚSOCK_STREAMÚgaierrorÚanyr]   r^   r_   )	r:   r¹   r£   r»   ÚliteralÚ	addr_infoÚexcr®   r¯   s	   &      @@r   Ú_url_is_privaterÈ     s  ù€ ó ÛÝ%÷rð rðÙ˜S“M×*Ñ*×0Ð0¨b×7Ñ7Ó9×?Ñ?ÓA×HÑHÈÓMˆßÙÙ˜xÓ(Ð(ˆGÒ5ØˆNØ�{Ô" h×&7Ñ&7Ô8N×&OÒ&OÙð	Ø×*Ñ*¨8°T¸6×;KÑ;KÈV×M_ÑM_Ó`ˆI÷ ‹sÔF¹IÓF�sŒsÐFŠsÐFˆsÔF¹IÓFÓFÐFøð �‰ô 	Úð	ûô ô Ü�‰Ð:¸CÔEÝûðúsd   ›D ´5D Á,D Á:!D Â(D Ã
D ÃD Ã)D Ã,D Ã0D ÄDÄD ÄDÄD ÄEÄ$E Å Ec                ó0   € V ^8„  d   QhR\         R\        /# r    r¡   )r   s   "r   r   r   =  s   € ÷ 
ñ 
¤ð 
¬ñ 
r   c                ó  € \         P                  ! 4       '       * ;'       d_    \        4       '       * ;'       dH    \        P                  ! 4       RJ;'       d)    \        P
                  ! 4       ;'       d    \        V 4      # )a(  True when ``url`` belongs on the hybrid LOCAL sidecar instead of the cloud provider: a cloud provider
configured, ``browser.auto_local_for_private_urls`` on, a private URL, no CDP override (it owns the
whole session), Camofox off (already local-only). Shared by browser_navigate and browser_exec.N)Ú_cdpÚ_get_cdp_override_rawÚ_is_camofox_modeÚ_cloudÚ_get_cloud_providerÚ_auto_local_for_private_urlsrÈ   r9   s   &r   Ú_hybrid_routes_locallyrÑ   =  sr   € ô
 ×&Ò&Ó(Ô(÷ 	!ð 	!Ü Ó"Ô"÷	!ð 	!ä×&Ò&Ó(°Ð4÷	!ð 	!ô ×/Ò/Ó1÷	!ð 	!ô ˜CÓ ðr   c                ó<   € V ^8„  d   QhR\         R\         R\         /# )r   Útask_idr:   r   rU   )r   s   "r   r   r   J  s&   € ÷ Sñ S¤Sð S¬sð S´sñ Sr   c                óH   € V f   Rp \        V4      '       d   V  \         2# T # )zËSession key that should handle ``url`` for ``task_id``: ``f"{task_id}::local"`` (hybrid
local sidecar while the cloud session keeps serving public URLs) when
``_hybrid_routes_locally`` holds for ``url``.r`   )rÑ   Ú_LOCAL_SUFFIX)rÓ   r:   s   &&r   Ú_navigation_session_keyrÖ   J  s,   € ð ‚ØˆÜ*@À×*EÒ*EˆgˆY”}�oÐ&ÐRÈ7ÐRr   c                ó0   € V ^8„  d   QhR\         R\        /# ©r   Úsession_keyr   r¡   )r   s   "r   r   r   S  s   € ÷ /ñ /¤sð /¬tñ /r   c                 ó,   € V P                  \        4      # r8   )r¾   rÕ   ©rÙ   s   &r   Ú_is_local_sidecar_keyrÜ   S  s   € Ø×Ñ¤Ó.Ð.r   c                ó0   € V ^8„  d   QhR\         R\         /# rØ   rU   )r   s   "r   r   r   W  s   € ÷ eñ e¬sð e´sñ er   c                 óN   € \        V 4      '       d   V R \        \        4      )  # T # r8   )rÜ   ÚlenrÕ   rÛ   s   &r   Ú_bare_task_id_for_session_keyrà   W  s(   € Ü1FÀ{×1SÒ1Sˆ;Ð,œ#œmÓ,Ð,Ð-ÐdÐYdÐdr   c                ój   € V ^8„  d   QhR\         \        \        3,          R\        R\        R\        /# )r   Úsession_inforÓ   rÙ   r   )r   rV   r   r   )r   s   "r   r   r   [  s8   € ÷ Wñ W¬d´3¼°8­nð WÄsð WÔY\ð WÔaeñ Wr   c                ó–   € V P                  R4      pV P                  R4      pVRJ ;'       g    W18H  ;'       d    VRJ ;'       g    WB8H  # )zžOwnership check; entries without metadata (older in-memory / hot-reload) pass,
any explicit mismatch fails before a non-nav tool can act on the wrong session.Úowner_task_idrÙ   N)r,   )râ   rÓ   rÙ   Úownerr2   s   &&&  r   Ú_session_info_owned_by_taskræ   [  sP   € ð ×Ñ˜_Ó-€EØ
×
Ñ
˜=Ó
)€CØ�TˆM×-Ð-˜UÑ-×VÐV°C¸4°K×4UÐ4UÀ3ÑCUÐVr   c                ó0   € V ^8„  d   QhR\         R\         /# ©r   rÓ   r   rU   )r   s   "r   r   r   c  s   € ÷ ñ œsð ¤sñ r   c                ór  € V f   Rp \         P                  V 4      pV'       g   V # \        ;_uu_ 4        \        P                  V4      pV'       d   \	        W V4      '       d   VuuRRR4       # \         P                  V R4       RRR4       \        P                  RW4       V #   + '       g   i     L(; i)zéSession key a non-nav tool must use: the one that served the task's last navigation.
If it was cleaned up or ownership no longer matches, fail closed by dropping the stale
binding rather than recreating or mutating the wrong browser.Nr`   zQbrowser session ownership: dropping stale/mismatched last-active binding %s -> %s)Ú_last_active_session_keyr,   Ú_cleanup_lockÚ_active_sessionsræ   Úpopr^   r_   )rÓ   Úrecorded_keyrâ   s   &  r   Ú_last_session_keyrï   c  s�   € ð ‚ØˆÜ+×/Ñ/°Ó8€LßØˆß	ŽÜ'×+Ñ+¨LÓ9ˆßÔ7¸È|×\Ò\Ø÷ 
Šô 	!×$Ñ$ W¨dÔ3÷	 
ô
 ‡L�LÐdØô(à€N÷ 
�ús   ´1B&Á0B&Â&B6	c                ó$   € V ^8„  d   QhR\         /# r   rU   )r   s   "r   r   r   v  s   € ÷  ñ  œSñ  r   c                 ó   € ^ RI Hp  V ! 4       # )zTemp root short enough for the agent-browser socket dir and Chrome's SingletonSocket
(``hermes_constants.socket_safe_tmpdir``).©Úsocket_safe_tmpdir)Úhermes_constantsró   rò   s    r   r.   r.   v  s   € õ 4ÙÓÐr   z::localrZ   Úinactivity_timeoutc                ó$   € V ^8„  d   QhR\         /# r   rp   )r   s   "r   r   r   �  s   € ÷ ñ ¬ñ r   c                  óH   a € \        R \        4      o \        RS V 3R lR4      # )ÚBROWSER_INACTIVITY_TIMEOUTrõ   c                 ó:   <€ V f   S# \        \        V 4      ^4      # r8   )rx   rq   )rz   Úenv_defaults   &€r   r;   Ú1_get_session_inactivity_timeout.<locals>.<lambda>‘  s   ø€  ¢�+Ð?´´C¸³F¸B³Ð?r   zinactivity_timeout from config)r
   Ú"DEFAULT_SESSION_INACTIVITY_TIMEOUTrd   )rú   s   @r   Ú_get_session_inactivity_timeoutrý   �  s)   ø€ ÜÐ6Ô8ZÓ[€KÜØ˜kÜ?Ø(óð r   i,  i  c                   ó^   a € ] tR tRt o RtR	tV 3R lR ltV 3R lR ltV 3R lR ltR	t	V t
R
# )Ú_BrowserSessionBackendi°  uç   ``agent.deadline.SuspectableBackend`` adapter for one cached session key: the
timeout path calls ``mark_suspect`` inline; ``ensure_healthy`` runs at the top of
``_get_session_info`` â€” the choke point every command passes through.c                ó$   <€ V ^8„  d   QhRS[ RR/# )r   rÙ   r   NrU   )r   Ú__classdict__s   "€r   r   Ú#_BrowserSessionBackend.__annotate__·  s   ø€ ÷ (ñ (¡Cð (¨Dñ (r   c                ó   € Wn         R # r8   ©Ú_session_key)ÚselfrÙ   s   &&r   Ú__init__Ú_BrowserSessionBackend.__init__·  s   € Ø'Ör   c                ó$   <€ V ^8„  d   QhRS[ RR/# )r   Úreasonr   NrU   )r   r  s   "€r   r   r  º  s   ø€ ÷ >ñ >¡3ð >¨4ñ >r   c                ó,   € V\         V P                  &   R# )zMMUST stay cheap and lock-free (runs inline on the timed-out caller's thread).N)Ú_suspect_browser_sessionsr  ©r  r
  s   &&r   Úmark_suspectÚ#_BrowserSessionBackend.mark_suspectº  s   € à7=Ô! $×"3Ñ"3Ó4r   c                ó    <€ V ^8„  d   QhRS[ /# r   ©r   )r   r  s   "€r   r   r  ¾  s   ø€ ÷ ñ ¡ñ r   c                ó>  € \         P                  V P                  R4      pVf   R# \        P	                  RV P                  V4        \
        P                  ! V P                  4       R#   \         d'    \        P                  RT P                  RR7        R# i ; i)zÊRecycle the session when a prior timeout marked it suspect; False after teardown.
The flag is popped BEFORE teardown: ``close`` re-enters ``_get_session_info``
and must not recurse into another recycle.NTz6Recycling suspect browser session %s before reuse (%s)zUTeardown of suspect browser session %s failed; a fresh session will be created anyway©Úexc_infoF)	r  rí   r  r^   ÚinfoÚ
_lifecycleÚ_cleanup_single_browser_sessionr]   Úwarningr  s   & r   Úensure_healthyÚ%_BrowserSessionBackend.ensure_healthy¾  s”   € ô +×.Ñ.¨t×/@Ñ/@À$ÓGˆØŠ>ÙÜ�‰ÐLÈd×N_ÑN_ÐagÔhð	_Ü×6Ò6°t×7HÑ7HÔIñ øô ô 	_Ü�N‰Nð <Ø=A×=NÑ=NÐY]ð õ _áð	_ús   Á	 A+ Á+-BÂBr  N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú	__slots__r  r  r  Ú__static_attributes__Ú__classdictcell__)r  s   @r   rÿ   rÿ   °  s0   ø‡ € ñOð "€I÷(ð (÷>ð >÷ö r   rÿ   )Úbrowser_tool_lifecycleÚnameÚbrowser_navigateÚdescriptionu×  Navigate to a URL in the browser. Initializes the session and loads the page. Must be called before other browser tools. For simple information retrieval, prefer a lightweight retrieval tool when one is available (faster, cheaper). For plain-text endpoints â€” URLs ending in .md, .txt, .json, .yaml, .yml, .csv, .xml, raw.githubusercontent.com, or any documented API endpoint â€” prefer an available text-extraction or terminal-fetch tool; the browser stack is overkill and much slower for these. Use browser tools when you need to interact with a page (click, fill forms, dynamic content). Returns a compact page snapshot with interactive elements and ref IDs â€” no need to call browser_snapshot separately after navigating.Ú
parametersÚtypeÚobjectÚ
propertiesr:   Ústringz4The URL to navigate to (e.g., 'https://example.com')ÚrequiredÚbrowser_snapshotuŽ  Get a text-based snapshot of the current page's accessibility tree. Returns interactive elements with ref IDs (like @e1, @e2) for browser_click and browser_type. full=false (default): compact view with interactive elements. full=true: complete page content. Snapshots over 15000 chars are truncated or LLM-summarized; when that happens the complete snapshot is saved to a file and the output includes its path so you can page through the rest with read_file. Requires browser_navigate first. Note: browser_navigate already returns a compact snapshot â€” use this to refresh after interactions that change the page, or with full=true for complete content.ÚfullÚbooleanzpIf true, returns complete page content. If false (default), returns compact view with interactive elements only.r`   Úbrowser_clickzÑClick on an element identified by its ref ID from the snapshot (e.g., '@e5'). The ref IDs are shown in square brackets in the snapshot output. Requires browser_navigate and browser_snapshot to be called first.Úrefz=The element reference from the snapshot (e.g., '@e5', '@e12')Úbrowser_typez«Type text into an input field identified by its ref ID. Clears the field first, then types the new text. Requires browser_navigate and browser_snapshot to be called first.z5The element reference from the snapshot (e.g., '@e3')ÚtextzThe text to type into the fieldÚbrowser_scrollzžScroll the page in a direction. Use this to reveal more content that may be below or above the current viewport. Requires browser_navigate to be called first.Ú	directionÚenumÚupÚdownzDirection to scrollÚbrowser_backzdNavigate back to the previous page in browser history. Requires browser_navigate to be called first.Úbrowser_pressz‘Press a keyboard key. Useful for submitting forms (Enter), navigating (Tab), or keyboard shortcuts. Requires browser_navigate to be called first.r2   z:Key to press (e.g., 'Enter', 'Tab', 'Escape', 'ArrowDown')Úbrowser_get_imagesz³Get a list of all images on the current page with their URLs and alt text. Useful for finding images to analyze with the vision tool. Requires browser_navigate to be called first.Úbrowser_visiona�  Take a screenshot of the current page so you can inspect it visually. Use this when you need to understand what the page looks like - especially for CAPTCHAs, visual verification challenges, complex layouts, or cases where the text snapshot misses important visual information. When your active model has native vision, the screenshot is attached to your context directly and you inspect it on the next turn; otherwise Hermes falls back to an auxiliary vision model and returns a text analysis. Includes a screenshot_path that you can share with the user by including MEDIA:<screenshot_path> in your response. Requires browser_navigate to be called first.ÚquestionzYWhat you want to know about the page visually. Be specific about what you're looking for.Úannotatez®If true, overlay numbered [N] labels on interactive elements. Each [N] maps to ref @eN for subsequent browser commands. Useful for QA and spatial reasoning about page layout.Úbrowser_consoleuÐ  Get browser console output and JavaScript errors from the current page. Returns console.log/warn/error/info messages and uncaught JS exceptions. Use this to detect silent JavaScript errors, failed API calls, and application warnings. Requires browser_navigate to be called first. When 'expression' is provided, evaluates JavaScript in the page context and returns the result â€” use this for DOM inspection, reading page state, or extracting data programmatically.Úclearz0If true, clear the message buffers after readingÚ
expressionuõ   JavaScript expression to evaluate in the page context. Runs in the browser like DevTools console â€” full access to DOM, window, document. Return values are serialized to JSON. Example: 'document.title' or 'document.querySelectorAll("a").length')Úbrowser_tool_snapshotc                ó0   € V ^8„  d   QhR\         R\        /# )r   Úerrorr   )rV   r   )r   s   "r   r   r   s  s   € ÷ 7ñ 7”ð 7¤ñ 7r   c                 ó   € R RRV /VC# )ÚsuccessFrD  r   )rD  Úextras   &,r   Ú_errrH  s  s   € Ø�u˜g uÐ6°Ð6Ð6r   c                óR   € V ^8„  d   QhR\         \        \        3,          R\        /# )r   Úpayloadr   ©r   rV   r   )r   s   "r   r   r   w  s"   € ÷ 9ñ 9”Dœœc˜•Nð 9¬Sñ 9r   c                 ó4   € \         P                  ! V 3R R/VB # )Úensure_asciiF)ÚjsonÚdumps)rJ  Úkws   &,r   Ú_dumpsrQ  w  s   € Ü�:Š:�gÑ8¨EÐ8°RÑ8Ð8r   c                óF   € V ^8„  d   QhR\         R\        \        ,          /# r    )rV   r   r   )r   s   "r   r   r   {  s   € ÷ ñ œ3ð ¤8¬D¥>ñ r   c                ó¾   € ^ RI p^ RIHp VP                  V 4      '       g1   VP                  VP                  P                  V 4      4      '       d   \        R4      # R# )uœ   Refuse URLs embedding an API key/token (raw and URL-decoded, catching ``%2D``
tricks) â€” a prompt injection could otherwise exfiltrate secrets via the URL.N)Ú
_PREFIX_REz_Blocked: URL contains what appears to be an API key or token. Secrets must not be sent in URLs.)rº   Úagent.redactrT  Úsearchra   ÚunquoterH  )r:   ÚurllibrT  s   &  r   Ú_secret_url_errorrY  {  sI   € ó Ý'à×Ñ˜×Ò ×!2Ñ!2°6·<±<×3GÑ3GÈÓ3L×!MÒ!MÜÐuÓvÐvÙr   Ú
auto_localc                óR   € V ^8„  d   QhR\         R\        R\        \        ,          /# ©r   r:   rZ  r   ©rV   r   r   r   )r   s   "r   r   r   †  s%   € ÷ ñ œ3ð ¬tð ÄÌÅñ r   c          
     óz  € \         P                  ! 4       p\        V 4      '       d   \        R4      # V'       g@   V'       g8   \         P                  ! 4       '       g   \        V 4      '       g   \        R4      # \        V 4      pV'       d0   \        VR,          RVR,          RVR,          RVR,          /R7      # R# )	uÅ  Backend-aware URL checks on an already-normalized URL; None if allowed. Ordered floors:
(1) cloud metadata / IMDS refused UNCONDITIONALLY (a local Chromium on a cloud VM still
reaches the host IMDS); (2) private addresses refused unless local, sidecar-routed, or
``browser.allow_private_urls``; (3) website policy allow/deny lists.

Credential-NAMED query params (``?token=``, ``?signature=``) are deliberately NOT a floor:
magic links, OAuth callbacks and signed CDN assets are how the agent signs in and browses, and
a cloud browser already sees every cookie and typed password of the session â€” refusing the
URL protects nothing. Hermes' own secrets leaking into a URL are caught by ``_secret_url_error``.z.Blocked: URL targets a cloud metadata endpointz2Blocked: URL targets a private or internal addressÚmessager¥   ÚruleÚsource)Úblocked_by_policyN)rÎ   Ú_is_local_backendÚ_is_always_blocked_urlrH  Ú_allow_private_urlsÚ_is_safe_urlr6   )r:   rZ  ÚlocalÚblockeds   &$  r   Ú_url_policy_errorri  †  s�   € ô ×$Ò$Ó&€Eô ˜c×"Ò"ÜÐDÓEÐEßŸ¬F×,FÒ,F×,HÒ,HÔQ]Ð^a×QbÒQbÜÐHÓIÐIÜ" 3Ó'€GßÜ�G˜IÕ&Ø'-¨w°v­ÀÈÐPVÍÐYaÐcjÐksÕctÐ&uôwð 	wár   c                óh   € V ^8„  d   QhR\         R\        \         \        \        ,          3,          /# r    )rV   Útupler   r   )r   s   "r   r   r   ¢  s(   € ÷ ñ ¤cð ¬e´C¼Ä$½Ð4GÕ.Hñ r   c                óR   € \        V 4      pVf   \        V 4      p \        V 4      pW3# )zXSecret check on the raw URL, then again on the normalized one; returns ``(url, error)``.)rY  Ú_normalize_url_for_request)r:   Úerrs   & r   Ú_secret_url_error_normalizedro  ¢  s,   € ä
˜CÓ
 €CØ
‚{Ü(¨Ó-ˆÜ Ó$ˆØˆ8€Or   c                óR   € V ^8„  d   QhR\         R\        R\        \        ,          /# r\  r]  )r   s   "r   r   r   «  s*   € ÷ @ñ @œSð @´ð @Ä(Ì4Å.ñ @r   c               óH   € \        V 4      w  rT;'       g    \        WR7      # )z½Run URL safety checks; None if safe, else an error dict. ``auto_local`` (the URL is served by the
hybrid local sidecar) relaxes only the private-address floor, never the cloud-metadata one.©rZ  )ro  ri  )r:   rZ  rn  s   &$ r   Úevaluate_url_safetyrs  «  s$   € ô ,¨CÓ0�H€CØ×?Ð?Ô# CÔ?Ð?r   c                ój   € V ^8„  d   QhR\         R\         R\         R\        R\        \         ,          /# )r   Únav_session_keyr:   Ú	final_urlÚauto_local_this_navr   )rV   r   r   )r   s   "r   r   r   ¹  s>   € ÷ Cñ C¬#ð C´Cð CÄCð CÔ^bð CÔgoÔpsÕgtñ Cr   c                ól  € V'       d   W!8X  d   R# \        V4      '       d   RpMT\        P                  ! 4       '       g8   V'       g0   \        P                  ! 4       '       g   \	        V4      '       g   RpMR# \
        P                  ! V RR.^
R7       \        P                  ! \        RV 24      4      # )a  Post-redirect SSRF check; blocked JSON payload or None. The page is moved to about:blank
first so later snapshots can't read the internal content. The metadata floor fires for
every backend; the private-address check is skipped for local, the sidecar, and
``browser.allow_private_urls``.Nza cloud metadata endpointza private/internal addressÚopenzabout:blankr   zBlocked: redirect landed on )
rd  rÎ   rc  re  rf  Ú_sessionÚ_run_browser_commandrN  rO  rH  )ru  r:   rv  rw  Úwhats   &&&& r   Ú_post_redirect_blockr}  ¹  s†   € ÷
 ˜	Ô(ÙÜ˜i×(Ò(Ø*‰ä×$Ò$×&Ò&ß#Ü×*Ò*×,Ò,Ü˜Y×'Ò'à+‰áÜ×!Ò! /°6¸M¸?ÐTVÕWÜ�:Š:”dÐ9¸$¸Ð@ÓAÓBÐBr   c                ót   € V ^8„  d   QhR\         \        \        3,          R\         \        \        3,          /# )r   Úsnap_resultr   rK  )r   s   "r   r   r   Ï  s.   € ÷ 	tñ 	t¤$¤s¬C x¥.ð 	t´T¼#¼s¸(µ^ñ 	tr   c                ó,  € V P                  R/ 4      pVP                  RR4      pVP                  R/ 4      p\        4       p\        V4      V8”  d   \        P                  ! W$R7      pR\        P
                  ! V4      RV'       d   \        V4      /# ^ /# )zª``snapshot`` + ``element_count`` fields from a successful snapshot result; oversized
snapshots truncate at line boundaries with the full tree stored for read_file paging.ÚdataÚsnapshotr—   Úrefs)Ú	max_charsÚelement_count)r,   rŠ   rß   Ú	_snapshotÚ_truncate_snapshotÚ_redact_browser_output)r  r�  Úsnapshot_textrƒ  Ú	thresholds   &    r   Ú_snapshot_fieldsr‹  Ï  s†   € ð �?‰?˜6 2Ó&€DØ—H‘H˜Z¨Ó,€MØ�8‰8�F˜BÓ€DÜ.Ó0€IÜ
ˆ=Ó˜IÔ%Ü!×4Ò4°]ÔXˆØœ	×8Ò8¸ÓGÈ×gkÔZ]Ð^bÓZcÐsÐsÐqrÐsÐsr   c                óx   € V ^8„  d   QhR\         \        \        3,          R\         \        \        3,          RR/# )r   Úresponserm   r   NrK  )r   s   "r   r   r   Û  s2   € ÷ 5ñ 5¤d¬3´¨8¥nð 5¼dÄ3ÌÀ8½nð 5ÐQUñ 5r   c                ó–   € VP                  R4      '       d2   V P                  R4      '       g   \        P                  ! W4       R# R# R# )zMCopy a secondary result's fallback warning only if the response has none yet.Úfallback_warningN)r,   Ú_lpÚ_copy_fallback_warning©r�  rm   s   &&r   Ú_merge_fallback_warningr“  Û  s8   € à‡z�zÐ$×%Ò%¨h¯l©lÐ;M×.NÒ.NÜ×"Ò" 8Ö4ñ /OÑ%r   c                óV   € V ^8„  d   QhR\         \        \        3,          R\        RR/# )r   r�  ru  r   NrK  )r   s   "r   r   r   á  s.   € ÷ Cñ C¤D¬¬c¨¥Nð CÄSð CÈTñ Cr   c                ó  €  \         P                  ! VRR.4      pVP                  R4      '       d(   V P                  \	        V4      4       \        W4       R# R#   \         d"   p\        P                  RT4        Rp?R# Rp?ii ; i)z\Add a compact snapshot to a navigate response so the model can act without browser_snapshot.r‚  ú-crF  z'Auto-snapshot after navigate failed: %sN)	rz  r{  r,   Úupdater‹  r“  r]   r^   r_   )r�  ru  r  rc   s   &&  r   Ú_attach_auto_snapshotr˜  á  st   € ðCÜ×3Ò3°OÀZÐRVÐQWÓXˆØ�?‰?˜9×%Ò%Ø�O‰OÔ,¨[Ó9Ô:Ü# HÖ:ñ &øô ô CÜ�‰Ð>À×BÒBûðCús   ‚/A ²%A ÁBÁ&BÂBc                óR   € V ^8„  d   QhR\         R\        \         ,          R\         /# )r   r:   rÓ   r   ©rV   r   )r   s   "r   r   r   ì  s%   € ÷ 7ñ 7œ#ð 7¬´­ð 7Äñ 7r   c           	     ó@  € \        V 4      w  rVe   \        P                  ! V4      # T;'       g    Rp\        W04      p\	        V4      p\        WR7      pVe   \        P                  ! V4      # \        4       '       d   \        RW4      # V'       d[   \        P                  RT \        P                  ! 4       '       d)   \        \        P                  ! 4       4      P                  MR4       \        P                  ! V4      pVP!                  RR4      pV'       d   R	VR&   \#        V4       \        P$                  ! VR
V .\'        VR7      R7      pVP!                  R4      '       g%   \)        \+        VP!                  RR4      4      4      # VP!                  R/ 4      p	V	P!                  RR4      p
V	P!                  RV 4      p\-        W@Wµ4      pVe   V# RRRVRV
/pVP!                  R4      ;'       g    / pVP!                  R4      '       d   RVR&   M?VP!                  R4      '       d)   VP!                  R4      '       g   RVR&   VR,          VR&   V\.        V&   \0        P2                  ! WØ4       \5        YÚV'       d   TMR4       \7        WÔ4       \)        V4      # )a  Navigate to ``url``; JSON with title, compact snapshot and, on first nav, stealth features.
Hybrid routing decides BEFORE the safety checks whether this URL goes to a local sidecar
(the cloud provider never sees it then, so the private-address checks are relaxed).Nr`   rr  Úcamofox_navigatez©browser_navigate: auto-routing %s to local Chromium sidecar (cloud provider %s stays on cloud for public URLs; set browser.auto_local_for_private_urls: false to disable)ÚnoneÚ
_first_navTFry  r�   r   rF  rD  zNavigation failedr�  Útitler—   r:   ÚfeaturesÚreal_profileÚused_real_profileÚreal_profile_unavailableÚ_rp_note_shown)ro  rN  rO  rÖ   rÜ   ri  rÍ   Ú_camofoxr^   r  rÎ   rÏ   r(  r  rz  Ú_get_session_infor,   Ú_maybe_start_recordingr{  r‘   rQ  rH  r}  rê   r�  r‘  Ú_add_navigate_warningsr˜  )r:   rÓ   Úsafety_errorÚeffective_task_idru  rw  râ   Úis_first_navrm   r�  rŸ  rv  rh  r�  r   s   &&             r   r%  r%  ì  sM  € ô 5°SÓ9Ñ€CØÒÜ�zŠz˜,Ó'Ð'à×,Ð, 9ÐÜ-Ð.?ÓE€OÜ/°Ó@Ðä$ SÔI€LØÒÜ�zŠz˜,Ó'Ð'ä×ÒÜÐ*¨CÓ9Ð9çÜ�‰ð hàÌ×HbÒHb×HdÒHdœœf×8Ò8Ó:Ó;×DÒDÐjpô	rô ×-Ò-¨oÓ>€LØ×#Ñ# L°$Ó7€LßØ%*ˆ�\Ñ"Ü˜Ô/ä×*Ò*¨?¸FÀSÀEÜ*CÈ|Ô*\ô^€Fà�:‰:�i× Ò Ü”d˜6Ÿ:™: gÐ/BÓCÓDÓEÐEà�:‰:�f˜bÓ!€DØ�H‰H�W˜bÓ!€EØ—‘˜ Ó$€IÜ" ?¸ÓX€GØÒØˆà˜4 ¨	°7¸EÐB€HØ×Ñ 
Ó+×1Ð1¨r€HØ‡|�|�N×#Ò#Ø(,ˆÐ$Ò%Ø	×	Ñ	Ð4×	5Ò	5¸l×>NÑ>NÐO_×>`Ò>`Ø)-ˆÐ%Ñ&Ø/;Ð<VÕ/WˆÐ+Ñ,ð 3BÔÐ.Ñ/Ü×Ò˜xÔ0Ü˜8¿L©LÈdÔSÜ˜(Ô4Ü�(ÓÐr   c          	      óš   € V ^8„  d   QhR\         \        \        3,          R\        R\        \         \        \        3,          ,          RR/# )r   r�  rŸ  Úfirst_nav_sessionr   N)r   rV   r   r   )r   s   "r   r   r   &  sJ   € ÷ Mñ M¤T¬#¬s¨(¥^ð M¼Cð MÔT\Ô]aÔbeÔgjÐbjÕ]kÕTlð MÐquñ Mr   c                ó   a€ VP                  4       o\        ;QJ d#    V3R l\         4       F  '       g   K   RM	  RM! V3R l\         4       4      '       d
   RV R2V R&   Veb   RV9   dY   VR,          pVP                  R	4      '       g   R
V R&   VP	                  4        UUu. uF  w  rEV'       g   K  VNK  	  uppV R&   R# R# R# u uppi )z\Bot-detection hint from the page title; on first navigation, the session's stealth features.c              3   ó,   <"  € T F	  qS9   x € K  	  R # 5ir8   r   )r´   ÚpatternÚtitle_lowers   & €r   r·   Ú)_add_navigate_warnings.<locals>.<genexpr>)  s   øé € Ð
OÑ1N g�kÖ!Ó1Nùs   ƒTFzPage title 'a0  ' suggests bot detection. The site may have blocked this request. Options: 1) Try adding delays between actions, 2) Access different pages first, 3) Enable advanced stealth (BROWSERBASE_ADVANCED_STEALTH=true, requires Scale plan), 4) Some sites have very aggressive bot detection that may be unavoidable.Úbot_detection_warningNr   Úproxiesz�Running WITHOUT residential proxies. Bot detection may be more aggressive. Consider upgrading Browserbase plan for proxy support.Ústealth_warningÚstealth_features)r¼   rÄ   Ú_BOT_DETECTION_TITLE_PATTERNSr,   Úitems)r�  rŸ  r­  r   Úkrz   r±  s   &&&   @r   r¨  r¨  &  sÃ   ø€ à—+‘+“-€Kß
ƒsÔ
OÕ1NÓ
O‡s‡s‚sÔ
OÕ1NÓ
O×OÒOà˜5˜'ð "Xð Xð 	Ð(Ñ)ð Ò$¨Ð7HÔ)HØ$ ZÕ0ˆØ�|‰|˜I×&Ò&ðIð Ð&Ñ'ð 7?·n±nÔ6FÔ'LÑ6F©d¨aÌ!¯¨Ñ6FÒ'LˆÐ#Ó$ñ *IÑ$ùó (Ms   Â&C
Â7C
c                ót   € V ^8„  d   QhR\         R\        \        ,          R\        \        ,          R\        /# )r   r.  rÓ   Ú	user_taskr   ©r   r   rV   )r   s   "r   r   r   :  s4   € ÷ ñ Ü
ðÜ!)¬#¥ðÜBJÌ3Å-ðäñr   c                ó°  € \        4       '       d   \        RW4      # \        T;'       g    R4      p\        P                  ! TRV '       d   . MR.4      pVP                  R4      '       g   \        VR4      # \        V4      pVe   V# RR/\        V4      Cp\        P                  ! Wd4        ^ R	IHp VP                  V4      pVeV   VP                  4       p	V	P                  '       d4   VP                  \         P"                  ! V	P%                  4       4      4       \-        T4      #   \&         d!   p
\(        P+                  R
T
4        Rp
?
L1Rp
?
ii ; i)z¡Text snapshot of the page's accessibility tree (compact unless ``full``).
``user_task`` is deprecated and unused (oversized snapshots always truncate-and-store).Úcamofox_snapshotr`   r‚  r–  rF  zFailed to get snapshotNT©ÚSUPERVISOR_REGISTRYz$supervisor snapshot merge failed: %s)rÍ   r¥  rï   rz  r{  r,   Ú_failed_responseÚ_blocked_private_page_contentr‹  r�  r‘  Útools.browser_supervisorrÀ  r‚  Úactiver—  r†  rˆ  Úto_dictr]   r^   r_   rQ  )r.  rÓ   r»  rª  rm   rh  r�  rÀ  Ú_supervisorÚ_sv_snapÚ_sv_excs   &&&        r   r-  r-  :  s,  € ô
 ×ÒÜÐ*¨DÓ:Ð:Ü)¨'×*>Ð*>°YÓ?ÐÜ×*Ò*Ð+<¸j×PTÉ"Ð[_ÐZ`Óa€FØ�:‰:�i× Ò Ü Ð(@ÓAÐAä+Ð,=Ó>€GØÒØˆà˜4Ð<Ô#3°FÓ#;Ð<€HÜ×Ò˜xÔ0ðFÝ@Ø)×-Ñ-Ð.?Ó@ˆØÒ"Ø"×+Ñ+Ó-ˆHØ��ˆØ—‘¤	× @Ò @À×AQÑAQÓASÓ TÔUô �(ÓÐøô ô FÜ�‰Ð;¸W×EÑEûðFús   Â/<D* Ã,3D* Ä*EÄ5EÅEc                ó€   € V ^8„  d   QhR\         \        \        3,          R\         \        \        3,          R\        /# )r   r�  rm   r   rK  )r   s   "r   r   r   \  s6   € ÷ @ñ @¤$¤s¬C x¥.ð @¼$¼sÄC¸x½.ð @ÌSñ @r   c                ó@   € \        \        P                  ! W4      4      # )z\``json.dumps`` of ``response`` with the Lightpanda fallback metadata copied from ``result``.)rQ  r�  r‘  r’  s   &&r   Ú_json_with_fallbackrË  \  s   € ä”#×,Ò,¨XÓ>Ó?Ð?r   c                ó^   € V ^8„  d   QhR\         \        \        3,          R\        R\        /# )r   rm   Údefault_errorr   rK  )r   s   "r   r   r   a  s.   € ÷ Zñ ZœT¤#¤s (�^ð Z¼Cð ZÄCñ Zr   c                 ó–   € V P                  R 4      '       d   R V R ,          /M/ p\        \        V P                  RV4      3/ VB V 4      # )ÚcoderD  )r,   rË  rH  )rm   rÍ  rG  s   && r   rÁ  rÁ  a  sC   € à(.¯
©
°6×(:Ò(:ˆV�V˜F•^Ñ$À€EÜœt F§J¡J¨w¸Ó$FÑPÈ%ÑPÐRXÓYÐYr   c                óŒ   € V ^8„  d   QhR\         \        \        3,          R\         \        \        3,          R\        R\        /# )r   rm   ÚokrÍ  r   rK  )r   s   "r   r   r   g  s?   € ÷ @ñ @œ4¤¤S �>ð @¬t´C¼°H­~ð @Ìcð @ÔVYñ @r   c                óf   € V P                  R4      '       g   \        W4      # \        RR/VCV 4      # )zp``{"success": True, **ok}`` or ``{"success": False, "error": result.error or default}``, plus fallback metadata.rF  T)r,   rÁ  rË  )rm   rÑ  rÍ  s   &&&r   Ú_tool_responserÓ  g  s3   € à�:‰:�i× Ò Ü Ó6Ð6Ü 	¨4Ð6°2Ð6¸Ó?Ð?r   c                ó$   € V ^8„  d   QhR\         /# )r   Ú	func_namerU   )r   s   "r   r   r   n  s   € ÷ Wñ Wœñ Wr   c                óH   € ^ RI p\        VP                  R4      V 4      ! V!  # )zLCall ``tools.browser_camofox.<func_name>(*args)`` (Camofox mode delegation).Nztools.browser_camofox)Ú	importlibÚgetattrÚimport_module)rÕ  Úargsr×  s   &* r   r¥  r¥  n  s$   € ãÜ�9×*Ñ*Ð+BÓCÀYÔOÐQUÑVÐVr   c                ó¤   € V ^8„  d   QhR\         \        ,          R\        R\        R\        R\        \        \        3,          R\        R\        /# )r   rÓ   ÚactionÚcommandrÚ  rÑ  rn  r   )r   rV   Úlistr   r   )r   s   "r   r   r   t  sY   € ÷ dñ dœX¤c�]ð d´Cð dÄ#ð dÌTð dÔW[Ô\_ÔadÐ\dÕWeð dÔloð dÔtwñ dr   c                ó�   € \        T ;'       g    R4      p\        Wa4      pVe   V# \        \        P                  ! WbV4      WE4      # )zTInput action on the task's current page, refused when the SSRF guard flags the page.r`   )rï   Ú_blocked_private_page_actionrÓ  rz  r{  )rÓ   rÜ  rÝ  rÚ  rÑ  rn  rª  rh  s   &&&&&&  r   Ú_guarded_actionrá  t  sH   € ä)¨'×*>Ð*>°YÓ?ÐÜ*Ð+<ÓE€GØÒØˆÜœ(×7Ò7Ð8IÐTXÓYÐ[]ÓcÐcr   c                ó0   € V ^8„  d   QhR\         R\         /# )r   r1  r   rU   )r   s   "r   r   r   }  s   € ÷ 5ñ 5”ð 5œñ 5r   c                 ó>   € V P                  R 4      '       d   V # R V  2# )Ú@)Ú
startswith)r1  s   &r   Ú_at_refræ  }  s!   € Ø—.‘. ×%Ò%ˆ3Ð4¨Q¨s¨e¨9Ð4r   c                óR   € V ^8„  d   QhR\         R\        \         ,          R\         /# )r   r1  rÓ   r   rš  )r   s   "r   r   r   �  s*   € ÷ iñ i”sð i¤X¬c¥]ð i¼cñ ir   c           	     ó|   € \        4       '       d   \        RW4      # \        V 4      p \        VRRV .RV /RV  24      # )z'Click the element ``ref`` (e.g. "@e5").Úcamofox_clickÚclickÚclickedzFailed to click )rÍ   r¥  ræ  rá  )r1  rÓ   s   &&r   r0  r0  �  sG   € ä×ÒÜ˜¨Ó6Ð6Ü
�#‹,€CÜ˜7 G¨W°s°e¸iÈÐ=MÐQaÐbeÐafÐOgÓhÐhr   c                ó^   € V ^8„  d   QhR\         R\         R\        \         ,          R\         /# )r   r1  r3  rÓ   r   rš  )r   s   "r   r   r   ‰  s2   € ÷ mñ m”cð m¤ð m¬x¼­}ð mÌñ mr   c                óâ  € \        4       '       d   \        RWV4      # \        T;'       g    R4      p\        VR4      pVe   V# \	        V 4      p \
        P                  ! VRW.4      p^ RIHpH	p V! RRV/4      ;'       g    / R,          pVP                  R4      '       d
   RR	R
VRV /p	M\        VP                  RRV  24      4      p	\        V! \        P                  ! W•4      V4      4      # )zBType ``text`` into the element ``ref`` (fill: clears, then types).Úcamofox_typer`   r(  Úfill)Ú%redact_browser_typed_text_for_displayÚredact_tool_args_for_displayr2  r3  rF  TÚtypedÚelementrD  zFailed to type into )rÍ   r¥  rï   rà  ræ  rz  r{  Úagent.displayrð  rñ  r,   rH  rQ  r�  r‘  )
r1  r3  rÓ   rª  rh  rm   rð  rñ  Údisplay_textr�  s
   &&&       r   r2  r2  ‰  sç   € ä×ÒÜ˜¨°7Ó;Ð;Ü)¨'×*>Ð*>°YÓ?ÐÜ*Ð+<¸fÓE€GØÒØˆÜ
�#‹,€CÜ×*Ò*Ð+<¸fÀsÀkÓR€Fßañ 1°À&È$ÀÓP×VÐVÐTVÐX^Õ_€LØ‡z�z�)×ÒØ˜t W¨l¸IÀsÐK‰ä˜Ÿ
™
 7Ð.BÀ3À%Ð,HÓIÓJˆÜÑ7¼×8RÒ8RÐS[Ó8dÐfjÓkÓlÐlr   c                óR   € V ^8„  d   QhR\         R\        \         ,          R\         /# )r   r5  rÓ   r   rš  )r   s   "r   r   r   ž  s*   € ÷ 	\ñ 	\œcð 	\¬H´S­Mð 	\ÄSñ 	\r   c                óZ  € V R	9  d   \        \        RV  R24      4      # Rp\        4       '       d-   \        ^4       Uu. uF  p\	        RW4      NK  	  upR
,          # \        T;'       g    R4      p\        P                  ! VRV \        V4      .4      p\        VRV /RV  24      # u upi )zEScroll the page ``direction`` ("up"/"down") by about half a viewport.zInvalid direction 'z'. Use 'up' or 'down'.iô  Úcamofox_scrollr`   ÚscrollÚscrolledzFailed to scroll >   r7  r8  éÿÿÿÿ)
rQ  rH  rÍ   Úranger¥  rï   rz  r{  rV   rÓ  )r5  rÓ   Ú_SCROLL_PIXELSrµ   rª  rm   s   &&    r   r4  r4  ž  s°   € à˜Ô&Ü”dÐ0°°Ð;QÐRÓSÓTÐTØ€NÜ×ÒÜHMÈaÌÓQÉÀ1”Ð)¨9Ö>ÉÑQÐRTÕUÐUÜ)¨'×*>Ð*>°YÓ?ÐÜ×*Ò*Ð+<¸hÈÔTWÐXfÓTgÐHhÓi€FÜ˜& :¨yÐ"9Ð=NÈyÈkÐ;ZÓ[Ð[ùò Rs   ¿B(c                óF   € V ^8„  d   QhR\         \        ,          R\        /# rè   r”   )r   s   "r   r   r   ª  s"   € ÷ gñ gœ(¤3�-ð g´3ñ gr   c                óD  € \        4       '       d   \        RV 4      # \        T ;'       g    R4      p\        P                  ! VR. 4      pVP                  R4      '       d   \        VR4      pVe   V# \        VRVP                  R/ 4      P                  RR4      /R	4      # )
z!Navigate back in browser history.Úcamofox_backr`   ÚbackrF  z9Browser history navigation (back) landed on this address.r:   r�  r—   zFailed to go back)rÍ   r¥  rï   rz  r{  r,   Ú_blocked_private_pagerÓ  )rÓ   rª  rm   rh  s   &   r   r9  r9  ª  s—   € ä×ÒÜ˜¨Ó0Ð0Ü)¨'×*>Ð*>°YÓ?ÐÜ×*Ò*Ð+<¸fÀbÓI€FØ‡z�z�)×Òô (Ð(9Ð;vÓwˆØÒØˆNÜ˜& 5¨&¯*©*°V¸RÓ*@×*DÑ*DÀUÈBÓ*OÐ"PÐReÓfÐfr   c                óR   € V ^8„  d   QhR\         R\        \         ,          R\         /# )r   r2   rÓ   r   rš  )r   s   "r   r   r   ¹  s*   € ÷ iñ i”sð i¤X¬c¥]ð i¼cñ ir   c           	     óf   € \        4       '       d   \        RW4      # \        VRRV .RV /RV  24      # )z+Press a keyboard key (e.g. "Enter", "Tab").Úcamofox_pressÚpressÚpressedzFailed to press )rÍ   r¥  rá  )r2   rÓ   s   &&r   r:  r:  ¹  s>   € ä×ÒÜ˜¨Ó6Ð6Ü˜7 G¨W°s°e¸iÈÐ=MÐQaÐbeÐafÐOgÓhÐhr   c                ó<   € V ^8„  d   QhR\         R\         R\         /# )r   Úblocked_urlÚwhyr   rU   )r   s   "r   r   r   À  s&   € ÷ kñ k¬Cð k´cð k¼cñ kr   c                ó6   € \        \        RV  RV 24      4      # )zHRefusal payload for a page whose URL targets a private/internal address.z9Blocked: page URL targets a private or internal address (z). )rQ  rH  )r	  r
  s   &&r   Ú_blocked_private_page_jsonr  À  s%   € ä”$ÐRÐS^ÐR_Ð_bÐcfÐbgÐhÓiÓjÐjr   c                óR   € V ^8„  d   QhR\         R\         R\        \         ,          /# )r   rª  r
  r   rš  )r   s   "r   r   r   Å  s*   € ÷ Qñ Q¬Sð Q´sð Q¼xÌ½}ñ Qr   c                ó”   € \         P                  ! V 4      '       g   R# \         P                  ! V 4      pV'       d   \        W!4      # R# )z™Blocked payload when the SSRF guard is active and the current page is private, else
None. Fail-open on probe failure (see ``_current_page_private_url``).N)Ú_eval_policyÚ_eval_ssrf_guard_activeÚ_current_page_private_urlr  )rª  r
  r	  s   && r   r  r  Å  s=   € ô ×/Ò/Ð0A×BÒBÙÜ×8Ò8Ð9JÓK€Kß;FÔ% kÓ7ÐPÈDÐPr   c                óR   € V ^8„  d   QhR\         R\         R\        \         ,          /# )r   rª  rÜ  r   rš  )r   s   "r   r   r   Î  s+   € ÷ pñ p´Cð pÄð pÌÔRUÍñ pr   c                ó"   € \        V RV R24      # )z>Blocked payload when an unsafe cloud page would receive input.zRefusing to z# on this page in this browser mode.)r  )rª  rÜ  s   &&r   rà  rà  Î  s   € ä Ð!2°lÀ6À(ÐJmÐ4nÓoÐor   zIThis may have been caused by a JavaScript navigation via browser_console.c                óF   € V ^8„  d   QhR\         R\        \         ,          /# )r   rª  r   rš  )r   s   "r   r   r   Ö  s"   € ÷ Iñ I´Sð I¼XÄc½]ñ Ir   c                ó"   € \        V \        4      # )z§Content-returning tools (snapshot/vision/eval/get_images): after an eval that may
have moved ``location.href`` to a private address, returning content would expose it.)r  Ú_EVAL_NAVIGATED_WHY)rª  s   &r   rÂ  rÂ  Ö  s   € ô !Ð!2Ô4GÓHÐHr   c                ót   € V ^8„  d   QhR\         R\        \        ,          R\        \        ,          R\        /# )r   r@  rA  rÓ   r   r¼  )r   s   "r   r   r   Ü  s4   € ÷ #ñ #œ4ð #´X¼cµ]ð #ÔT\Ô]`ÕTað #Ômpñ #r   c                ó  € Ve>   \         P                  ! V4      pV'       d   \        \        V4      4      # \	        W4      # \        4       '       d   \        RW4      # \        T;'       g    R4      p\        V4      pVe   V# V '       d   R.M. p\        P                  ! VRV4      p\        P                  ! VRV4      pVP                  R4      '       dm   VP                  R/ 4      P                  R. 4       U	u. uF?  p	R	V	P                  R	R
4      R\        P                  ! V	P                  RR4      4      RR/NKA  	  up	M. p
VP                  R4      '       d[   VP                  R/ 4      P                  R. 4       Uu. uF-  pR\        P                  ! VP                  RR4      4      RR/NK/  	  upM. pRRRV
RVR\        V
4      R\        V4      /p\        P                   ! W×4       \#        WØ4       \        V4      # u up	i u upi )u§   Console messages + uncaught JS errors (optionally ``clear``ing the buffers),
or â€” when ``expression`` is given â€” evaluate JS in the page like the DevTools console.Úcamofox_consoler`   z--clearÚconsoleÚerrorsrF  r�  Úmessagesr(  Úlogr3  r—   ra  r_  Ú	exceptionTÚconsole_messagesÚ	js_errorsÚtotal_messagesÚtotal_errors)r  Ú_enforce_browser_eval_policyrQ  rH  Ú_browser_evalrÍ   r¥  rï   rÂ  rz  r{  r,   r†  rˆ  rß   r�  r‘  r“  )r@  rA  rÓ   Úpolicy_errorrª  rh  Ú
clear_argsÚconsole_resultÚerrors_resultÚmsgr  rn  r  r�  s   &&&           r   r?  r?  Ü  s   € ð ÒÜ#×@Ò@ÀÓLˆßÜœ$˜|Ó,Ó-Ð-Ü˜ZÓ1Ð1ä×ÒÜÐ)¨5Ó:Ð:ä)¨'×*>Ð*>°YÓ?ÐÜ+Ð,=Ó>€GØÒØˆç %�)‘¨2€JÜ×2Ò2Ð3DÀiÐQ[Ó\€NÜ×1Ò1Ð2CÀXÈzÓZ€Mð
 
×	Ñ	˜I×	&Ò	&ð "×%Ñ% f¨bÓ1×5Ñ5°jÀ"ÔEóáEˆCð 
�—‘˜ Ó'¨´×1QÒ1QÐRU×RYÑRYÐZ`ÐbdÓReÓ1fÐhpÐr{Ó|ÙEòð -/ð ð 
×	Ñ	˜9×	%Ò	%ð !×$Ñ$ V¨RÓ0×4Ñ4°X¸rÔBóáBˆCð 
”I×4Ò4°S·W±W¸YÈÓ5KÓLÈhÐXcÓdÙBòð ,.ð ð
 	�4Ð+¨X°{ÀFØœ#˜h›-¨¼¸V»ð€Hô ×Ò˜xÔ8Ü˜HÔ4Ü�(ÓÐùòùòs   Ã<AHÆ3H)Úbrowser_tool_eval_policyc                ó0   € V ^8„  d   QhR\         R\         /# )r   Ú
raw_resultr   )r   )r   s   "r   r   r     s   € ÷ ñ ¤#ð ¬#ñ r   c                ó¤   € \        V \        4      '       d    \        P                  ! V 4      # V #   \        P                  \
        3 d     T # i ; i)zZEval returns the JS value as a string; parse valid JSON so the model gets structured data.)r\   rV   rN  ÚloadsÚJSONDecodeErrorr©   )r,  s   &r   Ú_parse_eval_valuer0    sP   € ä�*œc×"Ò"ð	Ü—:’:˜jÓ)Ð)ð Ðøô ×$Ñ$¤jÐ1ô 	ØØÐð	ús   ˜0 °AÁAc                óR   € V ^8„  d   QhR\         R\        \        \         3,          /# )r   Úparsedr   )r   r   rV   )r   s   "r   r   r     s&   € ÷ @ñ @œcð @¬t´C¼°H­~ñ @r   c                 ód   € R RR\         P                  ! V 4      R\        V 4      P                  /VC# )rF  Trm   Úresult_type)r†  rˆ  r(  r  )r2  rG  s   &,r   Ú_eval_ok_responser5    s4   € Ø�t˜X¤y×'GÒ'GÈÓ'OÐQ^Ô`dÐekÓ`l×`uÑ`uÐÐy~ÐÐr   c                ój   € V ^8„  d   QhR\         R\        R\        \         \        3,          R\         /# )r   rª  r2  rm   r   )rV   r   r   )r   s   "r   r   r     s8   € ÷ gñ g¬sð g¼Cð gÌÌcÔSVÈhÍð gÔehñ gr   c           	     ó„   € \        V 4      pVe   V# \        \        P                  ! \	        V3/ VB V4      \
        R7      # )uŒ   Eval tool JSON, unless the post-eval page-URL recheck finds an eval navigated the
page to a private address â€” then the result is withheld.©r`   )rÂ  rQ  r�  r‘  r5  rV   )rª  r2  rm   rG  rh  s   &&&, r   Ú_eval_result_or_blockedr9    sA   € ô ,Ð,=Ó>€GØÒØˆÜ”#×,Ò,Ô->¸vÑ-OÈÑ-OÐQWÓXÔbeÔfÐfr   c                óR   € V ^8„  d   QhR\         R\         R\        \         ,          /# )r   rª  rA  r   rš  )r   s   "r   r   r     s&   € ÷ ñ ´#ð Ä3ð Ì8ÔTWÍ=ñ r   c                ó  €  ^ RI Hp VP                  V 4      pVf   R# VP                  V4      pVP                  R4      '       d(   \	        V \        VP                  R4      4      / RR7      # VP                  R4      ;'       g    RpR	VP                  4       9  d   \        \        V4      4      # \        P                  R
V4       R#   \         d     R# \         d"   p\        P                  RT4        Rp?R# Rp?ii ; i)u3  ``Runtime.evaluate`` on the CDP supervisor's persistent WebSocket (no subprocess cost).
Tool JSON when the supervisor gave a definitive answer (value, blocked page, or a real
JS-side exception â€” NOT retried via subprocess, that would just reproduce it slower);
None to fall through to the subprocess path.r¿  NrÑ  rm   Úcdp_supervisor)ÚmethodrD  zevaluate_runtime failedÚ
supervisorzJbrowser_eval: supervisor path unavailable (%s), falling back to subprocessz8browser_eval: supervisor path errored (%s), falling back)rÃ  rÀ  r,   Úevaluate_runtimer9  r0  r¼   rQ  rH  r^   r_   ÚImportErrorr]   )rª  rA  rÀ  r>  Ú
sup_resultrn  rÇ   s   &&     r   Ú_eval_supervisor_fast_pathrB    sò   € ð
VÝ@Ø(×,Ñ,Ð->Ó?ˆ
ØÒÙØ×0Ñ0°Ó<ˆ
Ø�>‰>˜$×ÒÜ*Ø!Ô#4°Z·^±^ÀHÓ5MÓ#NÐPRÐ[kômð mà�n‰n˜WÓ%×BÐBÐ)BˆØ˜sŸy™y›{Ô*Üœ$˜s›)Ó$Ð$Ü�‰ÐaÐcfÔgñ
 øô	 ô Øñ ô ô VÜ�‰ÐOÐQT×UÐUÙûðVús@   ‚C
 Ÿ'C
 Á&C
 Á.C
 Â+C
 Â2C
 Ã
DÃDÃ!DÃ"C>Ã>Dc                óR   € V ^8„  d   QhR\         \        \        3,          R\        /# )r   rm   r   rK  )r   s   "r   r   r   5  s&   € ÷ Eñ E¤4¬¬S¨¥>ð E´cñ Er   c                óJ  a€ V P                  RR4      o\        ;QJ d    V3R lR	 4       F  '       g   K   RM	  RM! V3R lR	 4       4      '       d   RS 2oMRSP                  4       9   d   Ro\        P                  ! \
        P                  ! \        S4      V 4      4      # )
zXTool JSON for a failed ``agent-browser eval``, with actionable rewrites of known errors.rD  zeval failedc              3   óH   <"  € T F  qSP                  4       9   x € K  	  R # 5ir8   )r¼   )r´   Úhintrn  s   & €r   r·   Ú)_eval_failure_response.<locals>.<genexpr>8  s   øé € Ð
pÑ+o 4�3—9‘9“;ÖÓ+oùs   ƒ"TFz@JavaScript evaluation is not supported by this browser backend. zreference chain is too longzÇExpression returned a live DOM node / NodeList / Window, which can't be serialized. Extract a primitive value (e.g. .innerText, .href, .src, .value) or use JSON.stringify() / a snapshot tool instead.)zunknown commandznot supportedz	not foundzno such command)r,   rÄ   r¼   rN  rO  r�  r‘  rH  )rm   rn  s   &@r   Ú_eval_failure_responserH  5  s~   ø€ à
�*‰*�W˜mÓ
,€Cß
ƒsÔ
pÑ+oÓ
p‡s‡s‚sÔ
pÑ+oÓ
p×pÒpØPÐQTÐPUÐV‰Ø	&¨#¯)©)«+Ô	5ð:ð 	ô �:Š:”c×0Ò0´°c³¸FÓCÓDÐDr   c                óR   € V ^8„  d   QhR\         R\        \         ,          R\         /# ©r   rA  rÓ   r   rš  )r   s   "r   r   r   F  s*   € ÷ !wñ !wœcð !w¬H´S­Mð !wÄSñ !wr   c           	     óÈ  a a€ \        T;'       g    R4      o\        P                  ! S4      '       d7   \        P                  ! S 4      pV'       d   \	        \        RV R24      4      # \        4       '       d   \        S V4      # \        P                  ! \        P                  S4      ;'       g    / VV 3R l4      pVP                  R4      R8X  d   \	        V4      # VR,          e
   VR,          # \        P                  ! SRS .4      pVP                  R	4      '       g   \        V4      # \        S\        VP                  R
/ 4      P                  R4      4      V4      # )zÑEvaluate JS in the page context. Private-network guard in two halves: the literal
pre-scan closes direct fetches (they never update ``location.href``); the post-eval
page-URL recheck closes navigate-then-read.r`   zFBlocked: JavaScript expression targets a private or internal address (zX). Reading internal endpoints via browser_console is not permitted in this browser mode.c                  ó    <€ R \        S S4      /# )Úfast)rB  )rª  rA  s   €€r   r;   Ú_browser_eval.<locals>.<lambda>^  s   ø€ ¨&Ô2LÐM^Ð`jÓ2kÑ)lr   rÏ  Úhuman_has_controlrM  ÚevalrF  r�  rm   )rï   r  r  Ú_expression_targets_private_urlrQ  rH  rÍ   Ú_camofox_evalrz  Ú
run_fencedrì   r,   r{  rH  r9  r0  )rA  rÓ   Úblocked_literalÚfencedrm   rª  s   f&   @r   r$  r$  F  s<  ù€ ô *¨'×*>Ð*>°YÓ?Ðä×+Ò+Ð,=×>Ò>Ü&×FÒFÀzÓRˆßÜœ$ð%Ø%4Ð$5ð 6 ð óó ð ô ×ÒÜ˜Z¨Ó1Ð1ô
 × Ò Ô!1×!5Ñ!5Ð6GÓ!H×!NÐ!NÈBÝ!lón€Fà‡z�z�&ÓÐ0Ô0Ü�f‹~ÐØˆf…~Ò!Ø�f�~Ðä×*Ò*Ð+<¸fÀzÀlÓS€FØ�:‰:�i× Ò Ü% fÓ-Ð-Ü"Ð#4Ô6GÈÏ
É
ÐSYÐ[]ÓH^×HbÑHbÐckÓHlÓ6mÐouÓvÐvr   c                óR   € V ^8„  d   QhR\         R\        \         ,          R\         /# rJ  rš  )r   s   "r   r   r   j  s%   € ÷ 1ñ 1œcð 1¬H´S­Mð 1ÄSñ 1r   c                ó(  a
€ ^ RI HpHp  T! T;'       g    R4      pVP                  R4      ;'       g    VP                  R4      pVR,          pV! RV R2RV R	V/R
7      p\	        \        V\        4      '       d   VP                  R4      MT4      p\        P                  ! T;'       g    R4      '       d/   \        P                  ! WV4      p	V	'       d   \        V	\        4      # \        \        V4      \        R7      #   \         d…   o
\         ;QJ d    T
3R lR 4       F  '       g   K   RM	  RM! T
3R lR 4       4      '       d%   \"        P$                  ! \'        R4      4      u Ro
>
# \)        \        S
4      RR7      u Ro
>
# Ro
>
ii ; i)zJEvaluate JS via Camofox's /tabs/{tab_id}/evaluate endpoint (if available).)Ú_ensure_tabÚ_postr`   Útab_idÚidÚuser_idz/tabs/z	/evaluaterA  ÚuserId)Úbodyrm   r8  c              3   ó>   <"  € T F  q\        S4      9   x € K  	  R # 5ir8   rU   )r´   rÏ  rc   s   & €r   r·   Ú _camofox_eval.<locals>.<genexpr>{  s   øé € Ð@Ñ*? $”s˜1“vŽ~Ó*?ùs   ƒTFz|JavaScript evaluation is not supported by this Camofox server. Use browser_snapshot or browser_vision to inspect page state.N)rF  )Ú404Ú405Ú501)Útools.browser_camofoxrX  rY  r,   r0  r\   r   r  r  Ú!_camofox_current_page_private_urlr  r  rQ  r5  rV   r]   rÄ   rN  rO  rH  Ú
tool_error)rA  rÓ   rX  rY  Útab_inforZ  r\  Úrespr2  Ú_blocked_urlrc   s   &&        @r   rR  rR  j  s:  ø€ ç8ð1Ù˜w×3Ð3¨)Ó4ˆØ—‘˜hÓ'×=Ð=¨8¯<©<¸Ó+=ˆØ˜9Õ%ˆÙ�v˜f˜X YÐ/°|ÀZÐQYÐ[bÐ6cÔdˆÜ"¼ÀDÌ$×9OÒ9O 4§8¡8¨HÔ#5ÐUYÓZˆä×/Ò/°×0DÐ0D¸9×EÒEÜ'×IÒIÈ&ÓZˆLßÜ1°,Ô@SÓTÐTäÔ'¨Ó/¼Ô=Ð=øÜô 1ß‹3Ô@Ñ*?Ó@�3�3Š3Ô@Ñ*?Ó@×@Ò@Ü—:’:œdð $có dó eõ eäœ#˜a›&¨%Ô0Õ0ûð	1úsR   ‹
D –D µA7D Â-D Â:-D Ã(D ÄFÄFÄ/FÅFÅ+FÅ1FÆFÆFc                ó$   € V ^8„  d   QhR\         /# ©r   rÓ   rU   )r   s   "r   r   r   �  s   € ÷ ;ñ ;¤Cñ ;r   c                ój  € \         ;_uu_ 4        V \        9   d    RRR4       R#  RRR4        ^ RIHp \	        4       p\        V! 4       RRRR7      '       g   R# VR,          pVP                  RRR	7       \        P                  ! ^HR
7       VR\        P                  ! R4       RV R,           R2,          p\        P                  ! V RR\        V4      .4      pVP                  R4      '       dE   \         ;_uu_ 4        \        P                  V 4       RRR4       \         P#                  RW4       R# \         P%                  RVP                  R4      4       R#   + '       g   i     ELA; i  + '       g   i     Lc; i  \&         d"   p\         P%                  RT4        Rp?R# Rp?ii ; i)z@Start recording if browser.record_sessions is enabled in config.NrX   rZ   Úrecord_sessionsFr8  Úbrowser_recordingsT©ÚparentsÚexist_ok©Úmax_age_hoursÚsession_z%Y%m%d_%H%M%Srµ   :Né   Nz.webmrR   ÚstartrF  z'Auto-recording browser session %s to %sz"Could not start auto-recording: %srD  zAuto-recording setup failed: %s)rë   Ú_recording_sessionsr[   rY   r   r   Úmkdirr  Ú_cleanup_old_recordingsÚtimeÚstrftimerz  r{  rV   r,   Úaddr^   r  r_   r]   )rÓ   rY   Úhermes_homeÚrecordings_dirÚrecording_pathrm   rc   s   &      r   r§  r§  �  sF  € ç	ŽØÔ)Ô)Ø÷ 
‰Ø)÷ 
ð;Ý5Ü%Ó'ˆÜ‘Ó(¨)Ð5FÐPU×VÓVÙØ$Ð';Õ;ˆØ×Ñ T°DÐÔ9Ü×*Ò*¸Õ<Ø'¨H´T·]²]À?Ó5SÐ4TÐTUÐV]Ð^aÕVbÐUcÐchÐ*iÕiˆÜ×.Ò.¨w¸À7ÌCÐP^ÓL_ÐB`ÓaˆØ�:‰:�i× Ò ß–Ü#×'Ñ'¨Ô0÷ ä�K‰KÐAÀ7Ö[ä�L‰LÐ=¸v¿z¹zÈ'Ó?RÖS÷% 
�ˆú÷ —ûô
 ô ;Ü�‰Ð6¸×:Ò:ûð;úsG   �E°*F ÁB&F ÄE3ÄF Ä8%F ÅE0	Å3F	Å>F ÆF2ÆF-Æ-F2c                ó$   € V ^8„  d   QhR\         /# rk  rU   )r   s   "r   r   r   š  s   € ÷ 1ñ 1¤3ñ 1r   c           	     óº  € \         ;_uu_ 4        V \        9  d    RRR4       R#  RRR4        \        P                  ! V RR.4      pVP	                  R4      '       d7   \
        P                  RWP	                  R/ 4      P	                  RR4      4       \         ;_uu_ 4        \        P                  T 4       RRR4       R#   + '       g   i     L¥; i  \         d!   p\
        P                  R	Y4        Rp?LgRp?ii ; i  + '       g   i     R# ; i  \         ;_uu_ 4        \        P                  T 4       RRR4       i   + '       g   i     i ; i; i)
z1Stop recording if one is active for this session.NrR   ÚstoprF  z*Saved browser recording for session %s: %sr�  Úpathr—   z#Could not stop recording for %s: %s)
rë   rw  rz  r{  r,   r^   r  r]   r_   Údiscard)rÓ   rm   rc   s   &  r   Ú_maybe_stop_recordingr…  š  sè   € ç	ŽØÔ-Ô-Ø÷ 
‰Ø-÷ 
ð1Ü×.Ò.¨w¸À6À(ÓKˆØ�:‰:�i× Ò Ü�K‰KÐDÀgÏzÉzÐZ`ÐbdÓOe×OiÑOiÐjpÐrtÓOuÔv÷ Ž]Ü×'Ñ'¨Ô0÷ ‰]÷ 
�ûô ô HÜ�‰Ð:¸G×GÑGûðHú÷ �]ˆ]û�]Ž]Ü×'Ñ'¨Ô0÷ �]�]ˆ]ýsY   �C°A&C Â$DÃC	ÃDÃ"C=Ã8D Ã=DÄD ÄD	ÄEÄ(E	Ä>	EÅEÅEzÀJSON.stringify([...document.images].map(img => ({src: img.src, alt: img.alt || '', width: img.naturalWidth, height: img.naturalHeight})).filter(img => img.src && !img.src.startsWith('data:')))c                óF   € V ^8„  d   QhR\         \        ,          R\        /# rè   r”   )r   s   "r   r   r   ­  s"   € ÷ Añ A¤¬¥ð A¼ñ Ar   c                ód  € \        4       '       d   \        RV 4      # \        T ;'       g    R4      p\        P                  ! VR\
        .4      pVP                  R4      '       g   \        VR4      # \        V4      pVe   V# VP                  R/ 4      P                  RR4      p \        V\        4      '       d   \        P                  ! V4      MTp\        RR	R
\        P                  ! V4      R\!        V4      /V4      #   \        P"                   d    \        RR	R
. R^ RR/T4      u # i ; i)zFList the page's images (src, alt, natural size), excluding data: URIs.Úcamofox_get_imagesr`   rP  rF  zFailed to get imagesr�  rm   z[]TÚimagesÚcountr  zCould not parse image data)rÍ   r¥  rï   rz  r{  Ú_GET_IMAGES_JSr,   rÁ  rÂ  r\   rV   rN  r.  rË  r†  rˆ  rß   r/  )rÓ   rª  rm   rh  r,  r‰  s   &     r   r;  r;  ­  s,  € ä×ÒÜÐ,¨gÓ6Ð6ä)¨'×*>Ð*>°YÓ?ÐÜ×*Ò*Ð+<¸fÄ~ÐFVÓW€FØ�:‰:�i× Ò Ü Ð(>Ó?Ð?ä+Ð,=Ó>€GØÒØˆà—‘˜F BÓ'×+Ñ+¨H°dÓ;€JðAÜ+5°jÄ#×+FÒ+F”—’˜JÔ'ÈJˆÜ" I¨t°X¼y×?_Ò?_Ð`fÓ?gÐipÔruÐv|Ór}Ð#~ð  AGó  Hð  	HøÜ×Ñô AÜ" I¨t°X¸rÀ7ÈAÈyÐZvÐ#wÐyó  Aò  	AðAús   Â&AD Ä)D/Ä.D/zULightpanda has no graphical renderer for screenshots; used Chrome for vision capture.)Úbrowser_tool_visionc                óH   € V ^8„  d   QhR\         R\        R\        R\        /# )r   rª  r>  Úscreenshot_pathÚlp_prerouted)rV   r   r   )r   s   "r   r   r   É  s*   € ÷  )ñ  )´#ð  )Äð  )ÔX\ð  )Ôlpñ  )r   c                óš  € V'       dB   VP                  4       '       d,   \        P                  ! RRRR\        V4      //\        4      pMó\
        P                  ! V4      pV'       d   R.M. RT;'       g    \        V4      .,           p\
        P                  ! T RTV'       d   RMR	R
7      pV'       d‰   VP                  R4      '       dr    \
        P                  ! \        VP                  R4      ;'       g    / P                  R4      ;'       g    T4      V4       \        V4      VP                  R/ 4      R&   VP                  R4      '       gA   WB\        \        R\         P"                  ! 4        RVP                  RR4       24      V4      3# VP                  R/ 4      P                  R4      '       d   \%        VR,          R,          4      pVP                  4       '       g1   WB\'        \        RV R\         P"                  ! 4        R24      4      3# WBR	3#   \         d"   p\        P                  RYW4        R	p?ELR	p?ii ; i)zZTake (or adopt the pre-routed) screenshot; returns ``(result, path, error_json_or_None)``.rF  Tr�  rƒ  z
--annotatez--fullÚ
screenshotÚautoN)Ú_engine_overridez-could not fetch the sandbox screenshot %s: %szFailed to take screenshot (z mode): rD  zUnknown errorz#Screenshot file was not created at z (z• mode). This may indicate a socket path issue (macOS /var/folders/), a missing Chromium install ('agent-browser install'), or a stale daemon process.)Úexistsr�  Ú_annotate_lightpanda_fallbackrV   Ú_LP_VISION_FALLBACK_REASONrz  Úsandbox_screenshot_pathr{  r,   Úfetch_sandbox_fileÚ
setdefaultr]   r^   r  rË  rH  Ú_visionÚ_vision_mode_labelr   rQ  )rª  r>  rŽ  r�  rm   Úremote_pathÚscreenshot_argsrÇ   s   &&&&    r   Ú_capture_vision_screenshotrž  É  s  € ç˜×.Ñ.×0Ò0Ü×2Ò2Ø˜˜f v¬s°?Ó/CÐ&DÐEÔGaóc‰ô ×6Ò6°ÓGˆß-5˜L™>¸2À(ÈK×LoÐLoÔ[^Ð_nÓ[oÐApÕpˆô ×.Ò.Ð/@À,ÐP_ßAM±vÐSWôYˆç˜6Ÿ:™: i×0Ò0ðbÜ×+Ò+¬C°·±¸FÓ1C×1IÐ1IÀr×0NÑ0NÈvÓ0V×0eÐ0eÐZeÓ,fÐhwÔxÜ8;¸OÓ8L�×!Ñ! &¨"Ó-¨fÑ5ð �:‰:�i× Ò ØÔ(;¼DØ)¬'×*DÒ*DÓ*FÐ)GÀxÐPV×PZÑPZÐ[bÐdsÓPtÐOuÐvó=
àó)ð ð 	ð ‡z�z�&˜"Ó×!Ñ! &×)Ò)Ü˜v f�~¨fÕ5Ó6ˆØ×!Ñ!×#Ò#Ø¬¬tØ1°/Ð1BÀ"ÄW×E_ÒE_ÓEaÐDbð c)ð *ó0
ó )ð ð 	ð  DÐ(Ð(øô ô bÜ—‘ÐNÐP[×aÒaûðbús$   Ã,H Ã:H Ä*H ÈI
È)IÉI
c                ó–   € V ^8„  d   QhR\         R\        R\        \         ,          R\         \        \         \        3,          ,          /# )r   r=  r>  rÓ   r   )rV   r   r   r   r   )r   s   "r   r   r   ì  s?   € ÷ 0"ñ 0"œSð 0"¬Dð 0"Ä8ÌCÅ=ð 0"Ô\_ÔbfÔgjÔloÐgoÕbpÕ\pñ 0"r   c                óD  € \        4       '       d   \        RWV4      # ^ RIp^ RIHp V! RR4      pVRVP                  4       P                   R2,          p\        T;'       g    R4      p\        V4      pVe   V# \        P                  ! WqV4      w  ršp/ p VP                  R	R	R
7       \        P                  ! V^R7       \        WqWi4      w  r¶pVe   V# ^ RIHp V! 4       '       d   \        P"                  ! W`WV
4      # \        P$                  ! W`4      pRR	RT;'       g    RR\'        V4      /p\(        P*                  ! Wû4       V'       d;   VP-                  R/ 4      P-                  R4      '       d   VR,          R,          VR&   \/        V4      #   \0         d}   p\2        P5                  RTR	R7       \7        RT: 24      pTP9                  4       '       d   \'        T4      TR&   RTR&   \(        P*                  ! TT4       \/        T4      u Rp?# Rp?ii ; i)zèScreenshot the current page for visual inspection. Native-vision models get the image
attached to the conversation; otherwise the auxiliary vision model returns a text
analysis. The file is kept and its path returned (MEDIA:<path>).Úcamofox_visionN)Úget_hermes_dirzcache/screenshotsÚbrowser_screenshotsÚbrowser_screenshot_z.pngr`   Tro  rr  )Ú#_should_use_native_vision_fast_pathrF  Úanalysisz$Vision analysis returned no content.rŽ  r�  Úannotationszbrowser_vision failed: %sr  zError during vision analysis: z\Screenshot was captured but vision analysis failed. You can still share it via MEDIA:<path>.Únote)rÍ   r¥  Úuuidrô   r¢  Úuuid4Úhexrï   rÂ  rš  Ú_lightpanda_vision_prerouterx  r  Ú_cleanup_old_screenshotsrž  Útools.vision_toolsr¥  Ú_native_vision_resultÚ _analyze_screenshot_with_aux_llmrV   r�  r‘  r,   rQ  r]   r^   r  rH  r”  )r=  r>  rÓ   Úuuid_modr¢  Úscreenshots_dirrŽ  rª  rh  Ú_lp_preroutedÚ_lp_fallback_warningrm   rD  r¥  r¦  Úresponse_datarc   Ú
error_infos   &&&               r   r<  r<  ì  s  € ô ×ÒÜÐ(¨(¸gÓFÐFãÝ/Ù$Ð%8Ð:OÓP€OØ%Ð*=¸h¿n¹nÓ>N×>RÑ>RÐ=SÐSWÐ(XÕX€OÜ)¨'×*>Ð*>°YÓ?ÐÜ+Ð,=Ó>€GØÒØˆä;B×;^Ò;^Ø _ó<6Ñ8€M¨à€Fð"Ø×Ñ d°TÐÔ:Ü×+Ò+¨OÈ2ÕNÜ)CØ¨ó*IÑ&ˆ àÒØˆLõ 	KÙ.×0Ò0Ü×0Ò0°ÈHÐ^rÓsÐsä×;Ò;¸OÓVˆØ" D¨*°h×6hÐ6hÐBhØ*¬C°Ó,@ðBˆä×"Ò" =Ô9ß˜Ÿ
™
 6¨2Ó.×2Ñ2°=×AÒAØ+1°&­>¸-Õ+HˆM˜-Ñ(Ü�mÓ$Ð$øÜô 	"ô 	�‰Ð2°AÀˆÔEÜÐ:¸1¹%Ð@ÓAˆ
Ø×!Ñ!×#Ò#Ü,/°Ó,@ˆJÐ(Ñ)Ø!ˆJ�vÑÜ×"Ò" :¨vÔ6Ü�jÓ!Õ!ûð	"ús>   Â?F ÃF Ã,F Ä!F Ä&AF Å:F ÆHÆ#A1HÈHÈH)Úregistryrf  )Úextension_controller_availableÚrouted_browser_handlerc                ó0   € V ^8„  d   QhR\         R\        /# )r   rÜ  r   r¡   )r   s   "r   r   r   (  s   € ÷ [ñ [¬cð [Ì4ñ [r   c                óR   € \         P                  ! 4       ;'       g    \        V 4      # )z@Availability gate for tools that can use either browser backend.)Ú_installÚcheck_browser_requirementsr¸  )rÜ  s   &r   Ú!check_browser_routed_requirementsr¾  (  s    € ä×.Ò.Ó0×ZÐZÔ4RÐSYÓ4ZÐZr   c                ó^   € V ^8„  d   QhR\         R\        \         \        3,          R\        /# )r   Úfn_nameÚarg_defaultsÚextra_kw)rV   r   r   rk  )r   s   "r   r   r   -  s)   € ÷ 	ñ 	œCð 	¬t´C¼°H­~ð 	Ìñ 	r   c                ó   a aa€ VVV 3R lpV# )zªAdapter from the registry's ``(args, kw)`` to ``<fn_name>(**schema_args, task_id=...)``;
the function is looked up in module globals at call time so monkeypatching works.c           	      ó  <€ SP                  4        UUu/ uF  w  r#W P                  W#4      bK  	  pppVP                  R 4      VR &   S F  pVP                  V4      WE&   K  	  \        4       S,          ! R/ VB # u uppi )rÓ   r   )r¸  r,   ri   )	rÚ  rP  ÚaÚdÚparamsr¹  rÁ  rÂ  rÀ  s	   &&    €€€r   ÚcallÚ_fallback_call.<locals>.call0  sv   ø€ Ø0<×0BÑ0BÔ0DÔEÑ0D©¨�!—X‘X˜a“^Ò#Ñ0DˆÑEØŸF™F 9Ó-ˆˆyÑÛˆAØŸ™˜q›	ˆF‹Iñ ä‹y˜Ö!Ñ+ FÑ+Ð+ùó	 Fs   •A;r   )rÀ  rÁ  rÂ  rÈ  s   fff r   Ú_fallback_callrÊ  -  s   ú€ ÷,ð €Kr   u   ðŸŒ�r—   u   ðŸ“¸u   ðŸ‘†u   âŒ¨ï¸�u   ðŸ“œu   â—€ï¸�u   ðŸ–¼ï¸�u   ðŸ‘�ï¸�u   ðŸ–¥ï¸�c                ó$   € V ^8„  d   QhR\         /# ©r   r$  rU   )r   s   "r   r   r   J  s   € ÷ ñ œ3ñ r   c                ó>   a € R V 3R llpRS  R2;Vn         Vn        V# )zIPer-action availability gate (a named function, as the registry expects).c                ó$   € V ^8„  d   QhR\         /# r   r  )r   s   "r   r   Ú&_routed_check_fn.<locals>.__annotate__L  s   € ÷ 7ñ 7”4ñ 7r   c                  ó   <€ \        S 4      # r8   )r¾  )r$  s   €r   ÚcheckÚ_routed_check_fn.<locals>.checkL  s   ø€ Ü0°Ó6Ð6r   Úcheck_Ú_requirements)r  r  )r$  rÑ  s   f r   Ú_routed_check_fnrÕ  J  s*   ø€ ÷7ð 7à,2°4°&¸Ð*FÐF€E„N�UÔ'Ø€Lr   c                ó$   € V ^8„  d   QhR\         /# rÌ  rU   )r   s   "r   r   r   R  s   € ÷ ñ œ#ñ r   c                 ó   a a€ VV 3R  lpV# )c                 óJ   <a a€ \        V VVV3R  l\        P                  4      # )c           	      óp   <a € \        SSVVVV 3R  lSP                  R4      SP                  R4      R7      # )c                  ó    <€ S! V VV3R  l4      # )c                  ó   <€ S! S S4      # r8   r   )rÚ  ÚfallbackrP  s   €€€r   r;   ÚV_routed_handler.<locals>.handler.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>U  s   ø€ ¹ÀÀrÔ8Jr   r   )rÚ  rÜ  rP  Úlegacys   €€€€r   r;   ÚD_routed_handler.<locals>.handler.<locals>.<lambda>.<locals>.<lambda>U  s   ø€ ©Ö0JÔ)Kr   rÓ   Ú
session_id)rÜ  rÓ   rà  )r¹  r,   )rÞ  rÚ  rÜ  rP  r$  s   f€€€€r   r;   Ú2_routed_handler.<locals>.handler.<locals>.<lambda>T  s*   ù€ Ô2HØ�$×!KØ—F‘F˜9Ó%°"·&±&¸Ó2Fõ3
r   )r   rÎ   Úbrowser_backend_name)rÚ  rP  rÜ  r$  s   fl€€r   ÚhandlerÚ _routed_handler.<locals>.handlerS  s    ú€ Ü"÷ $
ô ×&Ñ&ó(ð 	(r   r   )r$  rÜ  rã  s   ff r   Ú_routed_handlerrå  R  s   ù€ ö(ð
 €Nr   rÓ  rÔ  )r$  ÚtoolsetÚschemarã  Úcheck_fnÚemojic                óä  € V ^8„  d   Qh/ ^ \         9   d   \        \        R3,          ;R&   ^\         9   d   \        \        \        3,          ;R&   ^\         9   d
   \
        ;R&   ^\         9   d&   \        \        \        \        3,          ,          ;R&   ^\         9   d&   \        \        \        \        3,          ,          ;R&   ^\         9   d   \        \        ,          ;R&   ^\         9   d   \        \        ,          ;R&   ^\         9   dH   \        \        \        \        \        \        3,          3,          \        \        ,          3,          ;R	&   ^\         9   d   \        \        ,          ;R
&   ^	\         9   d   \        \        ,          ;R&   ^
\         9   d
   \        ;R&   ^\         9   d   \        \        ,          ;R&   ^\         9   d
   \        ;R&   ^\         9   d
   \        ;R&   ^\         9   d,   \        \        \        \        \        3,          3,          ;R&   ^\         9   d
   \        ;R&   ^\         9   d   \        \        \        3,          ;R&   ^\         9   d   \        \        \        3,          ;R&   ^\         9   d   \        \        \        3,          ;R&   ^\         9   d   \        \        \        3,          ;R&   ^\         9   d   \        \        \        3,          ;R&   # )r   .r+   Ú_last_screenshot_cleanup_by_dirÚ_EMPTY_OK_COMMANDSrs   rƒ   Ú_cached_cloud_providerÚ_cached_cloud_provider_scopeÚ_cached_cloud_providersÚ_cached_allow_private_urlsÚ_cached_browser_engineÚ#_cached_auto_local_for_private_urlsÚ_cached_headed_modeÚ_real_profile_cdp_cacheÚ_real_profile_chrome_procsrì   rw  rê   Ú_session_last_activityÚ_session_owner_homesÚ_cleanup_failuresr  )Ú__conditional_annotations__rk  rV   r   r   Ú	frozensetr   rq   rG   r   rÞ  r   Úset)r   s   "r   r   r      sO  € ÷ ñ ÷>ò œ5¤ c �?ñ ñ?÷L 7Ò 6¤¤c¬5 jÕ!1Ñ 6ñM÷t ?Ò >”IÑ >ñu÷B 9Ò 8œ¤$¤s¬C x¥.Õ1Ñ 8ñC÷J <Ò ;œH¤T¬#¬s¨(¥^Õ4Ñ ;ñK÷N 9Ò 8œ¤Õ1Ñ 8ñO÷R 3Ò 2œh¤s�mÑ 2ñS÷T [Ò Zœœe¤C¬¬s´C¨x­Ð$8Õ9¼8ÄOÕ;TÐTÕUÑ ZñU÷Z 2Ò 1œH¤T�NÑ 1ñ[÷\ -Ò ,œ¤�Ñ ,ñ]÷b 1Ò 0¤TÑ 0ñc÷d +Ò *”Xœd•^Ñ *ñe÷\ #Ò "œÑ "ñ]÷^ &Ò %œDÑ %ñ_÷| 1Ò 0”$”sœD¤¤c �NÐ*Õ+Ñ 0ñ}÷~ !Ò  ”SÑ  ñ÷D .Ò -œ$œs¤C˜x�.Ñ -ñE÷z .Ò -œœS¤%˜ZÕ(Ñ -ñ{÷D *Ò )”dœ3¤˜8•nÑ )ñE÷J 'Ò &”4œœS˜•>Ñ &ñK÷V /Ò .œ4¤¤S �>Ñ .òWr   )ÚBROWSERBASE_API_KEYÚBROWSERBASE_PROJECT_IDÚBROWSER_USE_API_KEYÚFIRECRAWL_API_KEYÚFIRECRAWL_API_URLÚFIRECRAWL_BROWSER_TTL)g      N@)z/opt/homebrew/binz/opt/homebrew/sbinz/usr/local/sbinz/usr/local/binz	/usr/sbinz/usr/binz/sbinz/bin)z
.localhostz.localz.lanz	.internal)zaccess deniedz#access to this page has been deniedrh  zbot detectedzverification requiredzplease verifyzare you a robotÚcaptchaÚ
cloudflarezddos protectionzchecking your browserzjust a momentzattention requiredr8   )FNN)FN)r-  )r   )r»  )ãrù  r  ÚatexitrN  Úloggingr˜   Ú
subprocessÚsysÚtempfileÚ	threadingrz  Útypingr   r   r   r   Úpathlibr   rU  r   rô   r   r	   Úutilsr
   r[   r   r   Ú,hermes_cli.observability.shared_metrics_loopr   r+   r   r5   Útools.website_policyr6   r]   Útools.url_safetyr<   r=   rf  r>   rd  r?   rm  Úagent.browser_providerrG   Úagent.browser_registryrH   rK   r@  rd  rL   rÍ   Útools.browser_use_clirN   Ú_is_browser_use_cli_modeÚ	getLoggerr  r^   Ú_SANE_PATH_DIRSÚpathsepÚjoinÚ
_SANE_PATHÚtoolsrP   r¼  rë  rw   r�   rŽ   r‡   rˆ   ÚMAX_STORED_SNAPSHOT_CHARSrú  rì  rs   rt   rƒ   r„   rí  Ú_cloud_provider_resolvedrî  rï  ÚRLockÚ_cloud_provider_cache_lockÚ_allow_private_urls_resolvedrð  rñ  Ú_browser_engine_resolvedÚ%_auto_local_for_private_urls_resolvedrò  ró  Ú_headed_mode_resolvedÚ_chromium_autoinstall_attemptedÚ_sanitize_url_for_logsrd   rn   r|   r€   rŠ   r‘   r’   rz  r›   rœ   rË   r�   rÎ   rž   r�  Ú_REAL_PROFILE_SESSIONÚ _REAL_PROFILE_CDP_LOCK_TIMEOUT_SÚLockÚ_real_profile_cdp_lockrô  rõ  r¿   rÈ   rÑ   rÖ   rÜ   rà   ræ   rï   r.   rì   rû  rw  rê   rÕ   Ú_cleanup_donerq   r,   rü   rý   Ú"BROWSER_SESSION_INACTIVITY_TIMEOUTÚBROWSER_ORPHAN_REAP_INTERVALrx   ÚBROWSER_ORPHAN_GRACE_SECONDSrö  r÷  rø  ÚMAX_INACTIVITY_CLEANUP_FAILURESr  rÿ   Ú_browser_session_backendÚ_cleanup_threadÚ_cleanup_runningrë   r#  r  ÚregisterÚ_emergency_cleanup_all_sessionsÚ_stop_browser_cleanup_threadÚBROWSER_TOOL_SCHEMASrB  r†  rH  rQ  rY  ri  ro  rs  r·  r}  r‹  r“  r˜  r%  r¨  r-  rË  rÁ  rÓ  r¥  rá  ræ  r0  r2  r4  r9  r:  r  r  rà  r  rÂ  r?  r*  r  r0  r5  r9  rB  rH  r$  rR  r§  r…  r‹  r;  r–  rŒ  rš  rž  r<  Útools.registryr·  rf  Útools.browser_extension_routerr¸  r¹  Ú_BROWSER_SCHEMA_MAPr¾  rÊ  r½  Ú!check_browser_vision_requirementsÚ_BROWSER_TOOL_TABLErÕ  rå  Ú_nameÚ_emojiÚ	_check_fnÚ	_defaultsÚ_extrari   r   )Úsrù  s   0@r   Ú<module>r?     s~	  øðöó Û Û Û 	Û Û 
Û Û Û ß -Ó -Ý Ý 'ß =Ý ß 5Ý Lð.Ð ó ÷õðB,Ý9ð1÷ó õ 3ðÝZð%ÝIð-ÝYð 
×	Ò	˜8Ó	$€ð	€ð �Z‰Z�_‰_˜_Ó-€
å 2à46Ð Ó 6ð
 Ð ð Ð ØÐ ð
 #Ð ØÐ ð &Ð Ù )¨7°HÐ*=Ó >Ð Ó >ð 59Ð Ó 8ð "Ð Ø7;Ð Ó ;Ø$Ð Ø48Ð Ó 8Ø Ð Ø.2Ð Ó 2ØXZÐ Ó ZØ&Ÿ_š_Ó.Ð Ø$Ð Ø-1Ð Ó 1Ø(,Ð Ó ,Ø Ð Ø(-Ð %Ø,0Ð #Ó 0Ø&*Ð Ó *ØÐ Ø"'Ð ð (Ð õ
õõ"õ?õðd°E÷ dõ
 3õCõ
 +å .å 9ð
 .Ð ð $(Ð  Ø"ŸšÓ)Ð Ø "Ð Ó "Ø#%Ð Ó %ð GÐ õ"õJ
õSõ/õeõWõõ& ð /1Ð Ó 0Ù›5Ð Ó  ð ,.Ð Ó -Ø€Ø€ñ &)¨×);Ó);¸IÀrÓ)J×)NÒ)NÐOcÐehÓ)iÓ%jÐ "õñ &EÓ%FÐ "ð  #Ð ñ  # 4Ð)KÈbÕ)PÓQÐ à+-Ð Ó -ð
 (*Ð Ó )ð %'Ð Ó &Ø"#Ð ð
 -/Ð Ó .÷ñ ð< 2Ð à€ØÐ Ø—’Ó €å 6ð
 ‡ƒ�
×:Ò:Ô ;Ø ‡ƒ�
×7Ò7Ô 8ð 	Ð"Øð  qØØ�HØØØ˜HØ!Ð#Yððð ˜˜ð	
ðð 	Ð"Øð  h
ØØ�HØØØ˜IØ!ð  $VØ˜uððð ˜ð

ðð  	�Øð  kØØ�HØØØ˜HØ!Ð#bððð ˜˜ð	
ðð 	�Øð  EØØ�HØØØ˜HØ!Ð#Zðð Ø˜H mÐ5Vððð ˜ ˜ð
ðð$ 	Ð Øð  xØØ�HØØØ˜H f¨t°V¨n¸mÐMbððð
 ˜˜ð
ðð 	�ØÐ}ØØ�H˜l¨B°
¸Bð
ðð 	�Øð  kØØ�HØØØ˜HØ!Ð#_ððð ˜˜ð	
ðð 	Ð$Øð  MØØ�H˜l¨B°
¸Bð
ðð 	Ð Øð  i
ØØ�HØØØ˜HØ!Ð#~ðð Ø˜IØ˜uØ!ð  $Tðð
ð ˜˜ð
ðð( 	Ð!Øð  jØØ�HØØØ˜IØ˜uØ!Ð#Uðð
 Ø˜HØ!ð  $]ðð
ð ˜ð
ððsLÐ õ\ 5õ7õ9õð°e÷ õ8ð@¸÷ @ð!Ð õCõ,	tõ5õC÷7õtM÷(ð õD@õ
Zõ@õWõdõ5÷i÷m÷*	\÷g÷iõkõ
Qõpð
 bÐ õI÷#ð #õL ;õõ@õgõõ2E÷"!w÷H1õ.;õ21ð  T€÷Að, uÐ õ 1õ )÷F0"ð 0"÷l 0ß aá-AÓBÑ-A¨˜•y !’|Ñ-AÑBÐ ÷[ð [÷
	ð 	ð  ˜ ¨¨r {Ð3Ø˜ ¨° ¹ÐGØ�f˜d U¨B KÐ0Ø�X˜t e¨R°¸Ð%<Ð=Ø�v˜t k°6Ð%:Ð;Ø�X˜t RÐ(Ø�h  u¨b kÐ2Ø˜9 h×&IÒ&IÈ2ÐNØ�y (×"LÒ"LÈzÐ[]Ð_iÐkpÐNqÐrØ˜	 8×#FÒ#FÈÐRWÐYeÐgkÐHlÐmðÐ õõó 5HÐ0€Eˆ6�9˜i¨&ØÒÙ?OÐPUÓ?VÐVˆ	‘G“I  u g¨]Ð;Ñ<Ø×Ó˜5¨)Ð<OÐPUÕ<VÙ-¨e±^ÀEÈ9Ð5^ÐW]Ó5^Ó_Ø(°÷8ó 5HøðS( ô ,Ù+Óð,ûð ô 1Ù+ÐÙ$€LÙ-ÐÙ!0Óð	1ûð ô ð¨d÷ ðûð ô %Ù$Óð%ûð ô -Ù,Óð-üòd% Cs`   Á6W% Á=W6 ÂX ÂX% ÂX6 Ó+Y×%
W3×2W3×6XØXØX"Ø!X"Ø%
X3Ø2X3Ø6
YÙY