Ë
    ãß²jì  ã                   óš   — d Z ddlZddlZddlmZ ddlmZ ddlmZ	 de
de
fd„Zde
fd	„Zde
fd
„Zdee
ef   fd„Zde
ddfd„Zde
ddfd„Zy)u  User-supplied CDP endpoint resolution (browser.cdp_url / real-profile), dialog-policy config and the per-task CDP supervisor lifecycle.

Split out of ``tools/browser_tool.py``. Facade-owned state is read through ``_bt`` (``tools.browser_tool``, resolved per call) â€” no import cycle.é    N)ÚTuple)Úloopback_request_kwargs)Úorigin_moduleÚcdp_urlÚreturnc           	      ó<  — t        «       }| xs dj                  «       }|sy|j                  «       }d|v r|S |}|j                  d«      rŠ|j	                  d«      dk(  rI|j                  d«      j                  dd«      d   j                  «       rd|j                  dd«      d   vs|S |j                  d	«      rd
nd|j                  dd«      d   z   }|j                  «       j                  d«      r|n|j                  d«      dz   }|j                  }	 ddl} |j                  |fddit        |«      ¤Ž}|j                  «        |j                  «       }	t'        |	j                  d«      xs d«      j                  «       }|r+|j"                  j)                  d ||«       ||«      «       |S |j"                  j%                  d ||«      «       |S # t         $ r<}
|j"                  j%                  d ||«       ||«       ||
«      «       |cY d}
~
S d}
~
ww xY w)u,  Normalize a user-supplied CDP endpoint into a concrete websocket URL.

    Full ``ws://.../devtools/browser/...`` endpoints pass through; HTTP discovery roots and bare ``ws://host:port``
    resolve via ``/json/version`` â†’ ``webSocketDebuggerUrl`` (falls back to the raw value with a warning).
    Ú z/devtools/browser/)úws://zwss://ú:é   ú/é   éÿÿÿÿr
   zhttp://zhttps://z://z/json/versionr   NÚtimeouté
   z,Failed to resolve CDP endpoint %s via %s: %sÚwebSocketDebuggerUrlzResolved CDP endpoint %s -> %szKCDP discovery at %s did not return webSocketDebuggerUrl; using raw endpoint)Ú_originÚstripÚlowerÚ
startswithÚcountÚrstripÚrsplitÚisdigitÚsplitÚendswithÚ_sanitize_url_for_logsÚrequestsÚgetr   Úraise_for_statusÚjsonÚ	ExceptionÚloggerÚwarningÚstrÚinfo)r   Ú_btÚrawÚloweredÚdiscovery_urlÚversion_urlÚsanr   ÚresponseÚpayloadÚexcÚws_urls               ú;/home/ubuntu/.hermes/hermes-agent/tools/browser_tool_cdp.pyÚ_resolve_cdp_overrider2      s  € ô ‹)€CØŠ=�b×
Ñ
Ó
!€CÙØØ�i‰i‹k€GØ˜wÑ&Øˆ
à€MØ×ÑÐ-Ô.Ø—	‘	˜#“ !Ò#¨¯
©
°3«×(>Ñ(>¸sÀAÓ(FÀrÑ(J×(RÑ(RÔ(TÐY\Ðdg×dmÑdmÐnqÐstÓduÐvxÑdyÑYyØˆJØ&-×&8Ñ&8¸Ô&A™ÀzÐUX×U^ÑU^Ð_dÐfgÓUhÐijÑUkÑkˆØ#0×#6Ñ#6Ó#8×#AÑ#AÀ/Ô#R‘-ÐXe×XlÑXlÐmpÓXqð  uDñ  YD€Kà
×
$Ñ
$€CðÛØ�8—<‘< Ñ`°RÐ`Ô;RÐS^Ó;_Ñ`ˆØ×!Ñ!Ô#Ø—-‘-“/ˆô �—‘Ð3Ó4Ò:¸Ó;×AÑAÓC€FÙØ�
‰
�‰Ð8¹#¸c»(ÁCÈÃKÔPØˆØ‡J�J×ÑÐdÑfiÐjuÓfvÔwØ€Jøô ò Ø�
‰
×ÑÐIÉ3ÈsË8ÑUXÐYdÓUeÑgjÐknÓgoÔpØ�
ûðús   ÄAG Ç	HÇ1HÈHÈHc                  ó    — t         j                  j                  dd«      j                  «       } | xs t	        «       j                  ddd„ d«      S )a©  Return the *configured* CDP override without any network I/O.

    Precedence: ``BROWSER_CDP_URL`` env (live ``/browser connect``), then ``browser.cdp_url``. Is-it-configured
    gates (check_fns, ``_is_local_mode`` / ``_is_local_backend``, ``hermes doctor``) MUST use this, not
    :func:`_get_cdp_override`: its 10s HTTP discovery against a stale ``cdp_url`` would stall every startup's
    schema build with no error.
    ÚBROWSER_CDP_URLr	   r   c                 ó<   — t        | xs d«      j                  «       S )Nr	   )r%   r   )Úvs    r1   ú<lambda>z'_get_cdp_override_raw.<locals>.<lambda><   s   € Ì3ÈqÊwÐTVË<×K]ÑK]ÓK_€ ó    zbrowser.cdp_url from config)ÚosÚenvironr   r   r   Ú_browser_cfg)Úenv_overrides    r1   Ú_get_cdp_override_rawr=   3   sB   € ô —:‘:—>‘>Ð"3°RÓ8×>Ñ>Ó@€LØÒœ7›9×1Ñ1°)¸RÑA_Ða~ÓÐr8   c                  óH   — t        «       } t        «       x}rt        |«      S dS )uÙ   Resolved CDP URL override, or "" (skips cloud AND local launch).

    May perform HTTP ``/json/version`` discovery â€” only call on paths about to *connect*; pure gates must use
    :func:`_get_cdp_override_raw`.
    r	   )r   r=   r2   )r'   r(   s     r1   Ú_get_cdp_overrider?   ?   s)   € ô ‹)€CÜ1FÓ1HÐ*H¨#Ð*HÔ  Ó%ÐQÈrÐQr8   c                  óì  — t        «       } ddlm}m}m} ||}}	 ddlm}  |«       }t        |t        «      r|j                  di «      ni }t        |t        «      s||fS t        |j                  d«      xs |«      }	|	|v r|	}n| j                  j                  d|	«       |j                  d«      }
	 |
�t        |
«      n|}|dk  r|}||fS # t        t        f$ r |}Y Œw xY w# t         $ r ||fcY S w xY w)zgRead ``browser.dialog_policy`` + ``browser.dialog_timeout_s``; supervisor defaults when absent/invalid.r   )ÚDEFAULT_DIALOG_POLICYÚDEFAULT_DIALOG_TIMEOUT_SÚ_VALID_POLICIES)Úread_raw_configÚbrowserÚdialog_policyz/Invalid browser.dialog_policy=%r; using defaultÚdialog_timeout_s)r   Ú tools.browser_supervisor_dialogsrA   rB   rC   Úhermes_cli.configrD   Ú
isinstanceÚdictr   r%   r#   ÚdebugÚfloatÚ	TypeErrorÚ
ValueErrorr"   )r'   rA   rB   rC   ÚpolicyÚ	timeout_srD   ÚcfgÚbrowser_cfgÚ	candidateÚtimeout_raws              r1   Ú_get_dialog_policy_configrV   I   s  € ä
‹)€CçqÑqØ-Ð/GˆI€Fð?Ý5ÙÓˆÜ0:¸3ÄÔ0E�c—g‘g˜i¨Ô,È2ˆÜ˜+¤tÔ,Ø˜9Ð$Ð$Ü˜Ÿ™¨Ó8ÒQÐ<QÓRˆ	Ø˜Ñ'Ø‰Fà�J‰J×ÑÐNÐPYÔZØ!—o‘oÐ&8Ó9ˆð	1Ø.9Ð.Eœ˜kÔ*ÐKcˆIØ˜AŠ~Ø4�	ð �yÐ Ð øô œ:Ð&ò 	1Ø0ŠIð	1ûô ò ?Ø$Ð&>Ð>Ò>ð?ús=   šAC# ÁAC# Â2C ÃC# ÃC ÃC# ÃC Ã C# Ã#C3Ã2C3Útask_idc                 ó¾  — t        «       }t        «       }|s\|j                  5  |j                  j	                  | i «      }ddd«       t        j	                  d«      xs d«      }|rt        |«      }|sy	 ddlm} t        «       \  }}|j                  | |||¬«       y# 1 sw Y   ŒaxY w# t        $ r'}|j                  j                  d| |«       Y d}~yd}~ww xY w)uÖ  Start a CDP supervisor for ``task_id`` if an endpoint is reachable.

    Idempotent (``get_or_start`` skips an existing ``(task_id, cdp_url)`` and restarts on URL change), so safe on
    every navigate / ``/browser connect``. URL precedence: the CDP override, then the session's own ``cdp_url``
    (cloud providers, e.g. Browserbase). Swallows all errors â€” a failed attach must not break the session;
    snapshots just lack ``pending_dialogs`` / ``frame_tree``.
    Nr   r	   r   ©ÚSUPERVISOR_REGISTRY)rW   r   rF   rG   z8CDP supervisor attach for task=%s failed (non-fatal): %s)r   r?   Ú_cleanup_lockÚ_active_sessionsr   r%   r2   Útools.browser_supervisorrZ   rV   Úget_or_startr"   r#   rL   )	rW   r'   r   Úsession_infoÚmayberZ   rP   rQ   r/   s	            r1   Ú_ensure_cdp_supervisorra   f   sÛ   € ô ‹)€CÜÓ!€GÙØ×Ññ 	AØ×/Ñ/×3Ñ3°G¸RÓ@ˆL÷	Aä�L×$Ñ$ YÓ/Ò5°2Ó6ˆÙÜ+¨EÓ2ˆGÙØðcÝ@Ü5Ó7Ñˆ�	Ø×(Ñ(°À'ÐY_Ðr{Ð(Õ|÷	Að 	Aûô ò cØ�
‰
×ÑÐSÐU\Ð^a×bÑbûðcús#   £B Á7(B, Â B)Â,	CÂ5CÃCc                 óª   — 	 ddl m} |j                  | «       y# t        $ r/}t	        «       j
                  j                  d| |«       Y d}~yd}~ww xY w)zGStop the CDP supervisor for ``task_id`` if one exists. No-op otherwise.r   rY   z6CDP supervisor stop for task=%s failed (non-fatal): %sN)r]   rZ   Ústopr"   r   r#   rL   )rW   rZ   r/   s      r1   Ú_stop_cdp_supervisorrd   €   sK   € ðgÝ@Ø× Ñ  Õ)øÜò gÜ‹	×Ñ×ÑÐWÐY`Ðbe×fÑfûðgús   ‚ š	A£%AÁA)Ú__doc__Ú
contextlibr9   Útypingr   Úagent.proxy_bypassr   Útools.browser_tool_originr   r   r%   r2   r=   r?   rM   rV   ra   rd   © r8   r1   ú<module>rk      s�   ðñWó Û 	Ý å 6Ý >ð# 3ð #¨3ó #ðL	@˜só 	@ðR˜3ó Rð? 5¨¨e¨Ñ#4ó ?ð:c Cð c¨Dó cð4g #ð g¨$ô gr8   