+
    lHàj("  ã                   óâ  a € R4 t#0 t R t^ RIt^ RIHt ^ RIHt ^ RIHt	 ^ RI
Ht ^ RI
Ht R R ltR	 R
 lt]P"                  ! R]P$                  4      tR R ltR R lt]P"                  ! R]P$                  4      R3]P"                  ! R]P$                  4      R3]P"                  ! R]P$                  4      R3]P"                  ! R]P$                  4      R3]P"                  ! R]P$                  4      R3]P"                  ! R]P$                  4      R3]P"                  ! R]P$                  4      R3]P"                  ! R]P$                  ]P,                  ,          4      R3]P"                  ! R ]P$                  ]P,                  ,          4      R33	t] ^ k ]P"                  ! R!]P,                  4      tR5t] ^k 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 R0 R1 lt!R2 R3 lt"R# )6ué   browser_console(expression=...) policy: SSRF guard gating, private-URL probes,
and the opt-in sensitive-primitive denylist.

Facade-owned state is read through ``_bt`` (``tools.browser_tool``, resolved per call) â€” no import cycle.
N)ÚOptional©Úis_truthy_value)Úorigin_module)Úbrowser_tool_cloud)Úbrowser_tool_sessionc                ó0   € V ^8„  d   QhR\         R\        /# ©é   Úeffective_task_idÚreturn©ÚstrÚbool)Úformats   "ÚC/home/ubuntu/.hermes/hermes-agent/tools/browser_tool_eval_policy.pyÚ__annotate__r      s   € ÷ Dñ D¬sð D´tñ Dó    c                óÊ   € \        4       p\        P                  ! 4       '       * ;'       d9    VP                  V 4      '       * ;'       d    \        P                  ! 4       '       * # )ag  Return True when eval-driven private-network access must be guarded.

Same gating as ``browser_navigate`` / ``browser_snapshot`` / ``browser_vision``: the SSRF guard
only matters for non-local backends (cloud browser, or a containerized terminal whose
browser-on-host reaches networks the terminal can't); skipped for local sidecars / ``allow_private_urls``.
)Ú_originÚ_cloudÚ_is_local_backendÚ_is_local_sidecar_keyÚ_allow_private_urls)r   Ú_bts   & r   Ú_eval_ssrf_guard_activer      sh   € ô ‹)€CÜ×'Ò'Ó)Ô)÷  Dð  D°#×2KÑ2KÐL]Ó2^Ô.^÷  Dð  DÔgm÷  hBò  hBó  hDô  dDð  Dr   c                ó0   € V ^8„  d   QhR\         R\        /# )r
   Úurlr   r   )r   s   "r   r   r      s   € ÷ Hñ Hœ3ð H¤4ñ Hr   c                ó`   € V P                  V4      ;'       g    V P                  V4      '       * # )zWTrue when ``url`` hits the always-blocked cloud-metadata floor or fails the SSRF guard.)Ú_is_always_blocked_urlÚ_is_safe_url)r   r   s   &&r   Ú_url_blockedr!      s)   € à×%Ñ% cÓ*×GÐG°#×2BÑ2BÀ3Ó2GÔ.GÐGr   zhttps?://[^\s'"`)\]<>]+c                óF   € V ^8„  d   QhR\         R\        \         ,          /# ©r
   Ú
expressionr   ©r   r   )r   s   "r   r   r   %   s"   € ÷ `ñ `´ð `¼Ä½ñ `r   c                ó¬   a€ \        4       o\        V \        4      '       d   \        P	                  V 4      M. p\        V3R lR V 4        4       R4      # )zkReturn the first private/always-blocked ``http(s)://`` literal in a JS expression (best-effort), else None.c              3   óP   <"  € T F  p\        SV4      '       g   K  Vx € K  	  R # 5i©N)r!   )Ú.0Úcr   s   & €r   Ú	<genexpr>Ú2_expression_targets_private_url.<locals>.<genexpr>)   s    øé € ÐXÑ?�qÄ<ÐPSÐUV×CW—’Ó?ùs   ƒ&œ
&c              3   óB   "  € T F  qP                  R 4      x € K  	  R# 5i)z.,;N)Úrstrip)r)   Úms   & r   r+   r,   )   s   é € Ð?±h°ŸX™X eŸ_˜_³hùs   ‚N)r   Ú
isinstancer   Ú_JS_URL_LITERAL_REÚfindallÚnext)r$   Úliteralsr   s   & @r   Ú_expression_targets_private_urlr5   %   sE   ø€ ä
‹)€CÜ9CÀJÔPS×9TÒ9TÔ!×)Ñ)¨*Ô5ÐZ\€HÜÔXÑ?±hÔ?ÓXÐZ^Ó_Ð_r   c                óF   € V ^8„  d   QhR\         R\        \         ,          /# r	   r%   )r   s   "r   r   r   ,   s   € ÷ ñ ´ð ¼Ä#½ñ r   c                ó¾  € \        4       p \        P                  ! V RR.^RR7      pVP                  R4      '       dj   VP                  R/ 4      P                  RR4      P	                  4       P	                  R	4      P	                  R
4      pV'       d   \        W4      '       d   V# R#   \         d(   pTP                  P                  RT4        Rp?R# Rp?ii ; i)z¼Return the current page URL when it targets a private/internal address (e.g. after a prior
``location.href = '...'`` eval). Fail-open on probe failure, matching the snapshot/vision guards.Úevalúwindow.location.hrefÚauto)ÚtimeoutÚ_engine_overrideÚsuccessÚdataÚresultÚ Ú"Ú'z,_current_page_private_url: probe failed (%s)N)	r   Ú_sessionÚ_run_browser_commandÚgetÚstripr!   Ú	ExceptionÚloggerÚdebug)r   r   Ú
url_resultÚcurrent_urlÚexcs   &    r   Ú_current_page_private_urlrM   ,   sË   € ô ‹)€CðNÜ×2Ò2Ð3DÀfÐOeÐNfÐpqð  EKô  Lˆ
Ø�>‰>˜)×$Ò$Ø$Ÿ.™.¨°Ó4×8Ñ8¸À2ÓF×LÑLÓN×TÑTÐUXÓY×_Ñ_Ð`cÓdˆKßœ|¨C×=Ò=Ø"Ð"ñ øô ô NØ�
‰
×ÑÐGÈ×MÐMÙûðNús   ŒBB* ÂB* Â*CÂ5CÃCz\bdocument\s*\.\s*cookie\búdocument.cookiez#\b(?:localStorage|sessionStorage)\búweb storagez\bindexedDB\bÚ	IndexedDBz%\bcaches\s*\.\s*(?:open|match|keys)\búCache Storagez<\bnavigator\s*\.\s*(?:clipboard|credentials|serviceWorker)\búnavigator sensitive APIz5\b(?:fetch|XMLHttpRequest|WebSocket|EventSource)\s*\(únetwork requestz"\bnavigator\s*\.\s*sendBeacon\s*\(únetwork beaconz$\bdocument\s*\.\s*forms\b.*\bvalue\bzform value extractionzN\bquerySelector(?:All)?\s*\([^)]*(?:input|textarea|password)[^)]*\).*\bvalue\bz8'(?:\\.|[^'\\])*'|\"(?:\\.|[^\"\\])*\"|`(?:\\.|[^`\\])*`c                ó0   € V ^8„  d   QhR\         R\        /# )r
   Úkeyr   r   )r   s   "r   r   r   V   s   € ÷ sñ sœCð s¤Dñ sr   c                óH   € \        4       pVP                  V RR RV  R24      # )zRRead boolean ``browser.<key>`` (default False) through the origin's config reader.Fc                 ó   € \        V R R7      # )F)Údefaultr   )Úvs   &r   Ú<lambda>Ú$_browser_eval_flag.<locals>.<lambda>Y   s   € ´/À!ÈUÕ2Sr   zbrowser.z from config)r   Ú_browser_cfg)rV   r   s   & r   Ú_browser_eval_flagr^   V   s.   € ä
‹)€CØ×Ñ˜C Ñ(SÐW_Ð`cÐ_dÐdpÐUqÓrÐrr   c                ó$   € V ^8„  d   QhR\         /# ©r
   r   ©r   )r   s   "r   r   r   \   s   € ÷ 7ñ 7¬ñ 7r   c                 ó   € \        R4      # )z`Whether sensitive browser JS evaluation is explicitly allowed (overrides ``restrict_evaluate``).Úallow_unsafe_evaluate©r^   © r   r   Ú_allow_unsafe_browser_evaluaterf   \   s   € äÐ5Ó6Ð6r   c                ó$   € V ^8„  d   QhR\         /# r`   ra   )r   s   "r   r   r   a   s   € ÷ 3ñ 3¤Dñ 3r   c                 ó   € \        R4      # )a¯  Whether the sensitive-primitive eval denylist is enabled (off by default).

It blocks the *names* of common primitives (``fetch``, ``cookie``, ``querySelector(...input...)``),
not actual exfiltration, so it also blocks much legitimate DOM extraction; egress is still gated
by the SSRF/private-URL guards in ``_browser_eval`` regardless. Opt in via
``browser.restrict_evaluate: true`` (e.g. hostile pages with a logged-in profile).
Úrestrict_evaluaterd   re   r   r   Ú_restrict_browser_evaluaterj   a   s   € ô Ð1Ó2Ð2r   c                ó0   € V ^8„  d   QhR\         R\         /# )r
   Úliteralr   )r   )r   s   "r   r   r   l   s   € ÷ ñ ¤sð ¬sñ r   c                ó�   € \        V 4      ^8  d   V #  \        V ^R R4      P                  R4      #   \         d	    T ^R u # i ; i)zbBest-effort decode of a JS string literal (not a parser): normalizes escapes like ``"co\x6fkie"``.zutf-8Úunicode_escapeéÿÿÿÿ)ÚlenÚbytesÚdecoderG   )rl   s   &r   Ú_decode_js_string_literalrs   l   sR   € ä
ˆ7ƒ|�aÔØˆðÜ�W˜Q˜r�] GÓ,×3Ñ3Ð4DÓEÐEøÜô Ø�q˜ˆ}Òðús   ”2 ²AÁAc                óF   € V ^8„  d   QhR\         R\        \         ,          /# r#   )r   Úlist)r   s   "r   r   r   v   s"   € ÷ oñ o¬Cð o´D¼µIñ or   c                 ó†   € \         P                  V 4       Uu. uF  p\        VP                  ^ 4      4      NK  	  up# u upi )é    )Ú_JS_STRING_LITERAL_REÚfinditerrs   Úgroup)r$   Úmatchs   & r   Ú_decoded_js_string_literalsr|   v   s6   € ÜCX×CaÑCaÐblÔCmÓnÑCm¸%Ô% e§k¡k°!£nÖ5ÑCmÑnÐnùÒns   ˜#>c                óF   € V ^8„  d   QhR\         R\        \         ,          /# r#   r%   )r   s   "r   r   r   z   s"   € ÷ zñ z´Sð z¼XÄc½]ñ zr   c                óŒ   a a€ RP                  \        S 4      4      P                  4       o\        V V3R l\         4       R4      # )z÷Risk reason for direct or quoted sensitive primitives: direct spellings alone miss
``document["cookie"]`` / ``globalThis["fetch"]``, so tokens are also matched inside the decoded,
concatenated string literals (catches ``document["coo" + "kie"]``).r@   c              3   óâ   <"  € T Fd  w  r\         P                  ! R \         P                  ! V4       R 2S\         P                  4      '       g   VP	                  4       S9   g   K`  Vx € Kf  	  R# 5i)z\bN)ÚreÚsearchÚescapeÚ
IGNORECASEÚlower)r)   ÚtokenÚreasonr$   r4   s   &  €€r   r+   Ú7_sensitive_browser_eval_token_reason.<locals>.<genexpr>   sY   øé € ð sÑ-K™M˜EÜ—I’I ¤B§I¢I¨eÓ$4Ð#5°RÐ8¸*ÄbÇmÁm×TÒTÐX]×XcÑXcÓXeÐiqÑXq÷ ’Ó-Kùs   ƒAA/Á%
A/N)Újoinr|   r„   r3   Ú_SENSITIVE_BROWSER_EVAL_TOKENS)r$   r4   s   f@r   Ú$_sensitive_browser_eval_token_reasonrŠ   z   sC   ù€ ð �w‰wÔ2°:Ó>Ó?×EÑEÓG€HÜõ sÕ-Kó sØtxózð zr   c                óF   € V ^8„  d   QhR\         R\        \         ,          /# r#   r%   )r   s   "r   r   r   ƒ   s"   € ÷ Cñ C¬3ð C´8¼Cµ=ñ Cr   c                óv   a € S '       g   R# \        V 3R l\         4       R4      pT;'       g    \        S 4      # )zHReturn a human-readable reason if a JS expression uses risky primitives.Nc              3   ó^   <"  € T F"  w  rVP                  S4      '       g   K  Vx € K$  	  R # 5ir(   )r�   )r)   Úpatternr†   r$   s   &  €r   r+   Ú-_risky_browser_eval_reason.<locals>.<genexpr>‡   s#   øé € ÐiÑ.J™?˜7ÈgÏnÉnÐ]g×Nh—’Ó.Jùs   ƒ-£
-)r3   Ú_RISKY_BROWSER_EVAL_PATTERNSrŠ   )r$   Úhits   f r   Ú_risky_browser_eval_reasonr’   ƒ   s1   ø€ çÙÜ
ÔiÕ.JÓiÐkoÓ
p€CØ×BÐBÔ6°zÓBÐBr   c                óF   € V ^8„  d   QhR\         R\        \         ,          /# r#   r%   )r   s   "r   r   r   ‹   s"   € ÷ añ a¬Sð a´X¼cµ]ñ ar   c                ó|   € \        4       '       d   \        4       '       d   R# \        V 4      pV'       g   R# RV R2# )z¸Block sensitive browser JS evaluation when the opt-in denylist is on (opt-in because it gates on
primitive *names*; private-address egress is enforced separately in ``_browser_eval``).Nz^Blocked: browser_console(expression=...) tried to use sensitive browser JavaScript primitive (zè) while browser.restrict_evaluate is enabled. Use browser_snapshot/browser_get_images/browser_console without expression for normal inspection, or set browser.restrict_evaluate: false in config.yaml to allow programmatic evaluation.)rj   rf   r’   )r$   r†   s   & r   Ú_enforce_browser_eval_policyr•   ‹   sE   € ô &×'Ò'Ô+I×+KÒ+KÙÜ'¨
Ó3€FßÙð%Ø%+ Hð -`ð`ð ar   c                óR   € V ^8„  d   QhR\         R\         R\        \         ,          /# )r
   Útab_idÚuser_idr   r%   )r   s   "r   r   r   š   s%   € ÷ ñ ¬cð ¼Cð ÄHÌSÅMñ r   c                óÀ  € \        4       p ^ RIHp V! RV  R2RRRV/R7      p\        \	        V\
        4      '       d   VP                  R4      MT;'       g    R	4      pVP                  4       P                  R
4      P                  R4      pV'       d   \        W%4      '       d   V# R#   \         d(   pTP                  P                  RT4        Rp?R# Rp?ii ; i)uÊ   Camofox analogue of ``_current_page_private_url`` (evaluate endpoint instead of the CLI). Fail-open
on probe failure, matching the snapshot/vision guards â€” do not make fail-closed without the sibling.)Ú_postz/tabs/z	/evaluater$   r9   ÚuserId)Úbodyr?   r@   rA   rB   z4_camofox_current_page_private_url: probe failed (%s)N)r   Útools.browser_camofoxrš   r   r0   ÚdictrE   rF   r!   rG   rH   rI   )r—   r˜   r   rš   r>   rK   rL   s   &&     r   Ú!_camofox_current_page_private_urlrŸ   š   sÉ   € ô ‹)€CðVÝ/Ù�v˜f˜X YÐ/°|ÐE[Ð]eÐgnÐ6oÔpˆÜ´
¸4Ä×0FÒ0F˜$Ÿ(™( 8Ô,ÈDÏJÈJÐTVÓWˆØ!×'Ñ'Ó)×/Ñ/°Ó4×:Ñ:¸3Ó?ˆßœ<¨×9Ò9ØÐñ øô ô VØ�
‰
×ÑÐOÐQT×UÐUÙûðVús$   ŒAB+ Á<B+ ÂB+ Â+CÂ6CÃCc                ó
  € V ^8„  d   Qh/ ^ \         9   d=   \        \        \        P                  \        ,          \        3,          R3,          ;R&   ^\         9   d(   \        \        \        \        3,          R3,          ;R&   # )r
   .r�   r‰   )Ú__conditional_annotations__Útupler€   ÚPatternr   )r   s   "r   r   r      sj   € ÷ ñ ÷t
ò 
œe¤E¬"¯*©*´S­/¼3Ð*>Õ$?ÀÐ$DÕEñ 
ñu÷R	ò 	¤¤e¬C´¨H¥o°sÐ&:Õ ;ñ 	òSr   ))ÚcookierN   )ÚlocalStoragerO   )ÚsessionStoragerO   )Ú	indexedDBrP   )ÚcachesrQ   )Ú	clipboardrR   )ÚcredentialsrR   )ÚserviceWorkerrR   )ÚfetchrS   )ÚXMLHttpRequestrS   )Ú	WebSocketrS   )ÚEventSourcerS   )Ú
sendBeaconrT   )$r¡   Ú__doc__r€   Útypingr   Úutilsr   Útools.browser_tool_originr   r   Útoolsr   r   r   rC   r   r!   Úcompilerƒ   r1   r5   rM   ÚDOTALLr�   rx   r‰   r^   rf   rj   rs   r|   rŠ   r’   r•   rŸ   r   )r¡   s   @r   Ú<module>r¸      s¸  øðöó 
Ý Ý !Ý >Ý .Ý 2õDõHð —Z’ZÐ >ÀÇÁÓNÐ õ`õð  ‡Z‚ZÐ-¨r¯}©}Ó=Ð?PÐQØ‡Z‚ZÐ6¸¿¹ÓFÈÐVØ‡Z‚ZÐ  "§-¡-Ó0°+Ð>Ø‡Z‚ZÐ8¸"¿-¹-ÓHÈ/ÐZØ‡Z‚ZÐOÐQS×Q^ÑQ^Ó_ÐazÐ{Ø‡Z‚ZÐHÈ"Ï-É-ÓXÐZkÐlØ‡Z‚ZÐ5°r·}±}ÓEÐGWÐXØ‡Z‚ZÐ7¸¿¹ÈÏÉÕ9RÓSÐUlÐmØ‡Z‚ZÐaÐce×cpÑcpÐsu×s|Ñs|Õc|Ó}ð  @Wð  Xð
IÐ ó 
ð Ÿ
š
Ð#bÐdf×dmÑdmÓnÐ ð	?Ð ó 	õsõ7õ
3õõoõzõCõa÷r   