Ë
    ãß²j6r  ã                  óÀ  — d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	m
Z
 ddlmZmZmZmZmZmZmZ ddlmZmZmZmZmZmZmZ ddlmZmZ erddlmZ  ej@                  e!«      Z"d	Z#d%d
„Z$ G d„ de%«      Z&d&d„Z'd'd„Z(d(d„Z) e
d¬«       G d„ d«      «       Z* G d„ dee«      Z+ G d„ d«      Z, e,«       Z-g d¢Z.dZ/e
 G d„ d«      «       Z0ddddd d!d"d#œZ1d$„ Z2y))uw  Persistent CDP supervisor for browser dialog + frame detection.

One ``CDPSupervisor`` per Hermes ``task_id`` with a reachable CDP endpoint: one
persistent WebSocket, ``Page`` / ``Runtime`` / ``Target`` events on every attached
session (top page + auto-attached OOPIF / worker targets), pending dialogs + frame
tree exposed via a thread-safe snapshot. Not in the tool schema â€” output reaches the
agent via ``browser_snapshot`` / ``browser_dialog``. Dialog capture and frame tracking
are mixins (``browser_supervisor_dialogs`` / ``browser_supervisor_frames``).
Design spec: ``website/docs/developer-guide/browser-supervisor.md``.
é    )ÚannotationsN)Ú	dataclass)ÚAnyÚCallableÚDictÚListÚOptionalÚTupleÚTYPE_CHECKING)ÚDEFAULT_DIALOG_POLICYÚDEFAULT_DIALOG_TIMEOUT_SÚRECENT_DIALOGS_MAXÚ_VALID_POLICIESÚDialogRecordÚDialogSupervisionMixinÚPendingDialog)Ú	FrameInfoÚFrameTrackingMixin)ÚClientConnectioné   c                óP   — 	 ddl m}  |t        | «      «      S # t        $ r Y yw xY w)aV  Redact CDP endpoint credentials from an exception's (or URL's) string form.
    ``websockets`` bakes the raw URL (``?token=`` / ``user:pass@``) into its exception
    messages, so every egress point turning one into log/re-raise text MUST route through
    here; falls back to a fixed sentinel if redaction itself raises (err toward masking).r   )Úredact_cdp_urlz<error redacted>)Úagent.redactr   ÚstrÚ	Exception)Úexcr   s     ú=/home/ubuntu/.hermes/hermes-agent/tools/browser_supervisor.pyÚ_redact_cdp_error_textr   *   s+   € ð
"Ý/áœc #›hÓ'Ð'øÜò "Ù!ð"ús   ‚ ™	%¤%c                  ó   — e Zd ZdZy)Ú_LoopUnavailablez>The supervisor loop refused new work (closed / shutting down).N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    r   r    r    7   s   „ ÚHr&   r    c               ó^   — ddl m}  || |«      }|€t        d«      ‚|j                  |¬«      S )zORun ``coro`` on the supervisor loop from a sync caller and wait for its result.r   )Úsafe_schedule_threadsafez#Browser supervisor loop unavailable©Útimeout)Úagent.async_utilsr(   r    Úresult)ÚcoroÚloopr*   r(   Úfuts        r   Ú	_scheduler0   ;   s3   € å:á
" 4¨Ó
.€CØ
€{ÜÐDÓEÐEØ�:‰:˜gˆ:Ó&Ð&r&   c                ó   — d| dœS )NF)ÚokÚerrorr%   )r3   s    r   Ú_failr4   E   s   € Ø %Ñ(Ð(r&   c                óH   — t        t        | «      j                  › d| › �«      S )Nú: )r4   Útyper!   )r   s    r   Ú_errr8   I   s#   € Ü”D˜“I×&Ñ&Ð' r¨#¨Ð/Ó0Ð0r&   T)Úfrozenc                  óV   — e Zd ZU dZded<   ded<   ded<   ded	<   d
ed<   d
ed<   dd„Zy)ÚSupervisorSnapshotz9Read-only snapshot of supervisor state for tool handlers.zTuple[PendingDialog, ...]Úpending_dialogszTuple[DialogRecord, ...]Úrecent_dialogsúDict[str, Any]Ú
frame_treeÚboolÚactiver   Úcdp_urlÚtask_idc                óò   — | j                   D �cg c]  }|j                  «       ‘Œ c}| j                  dœ}| j                  r+| j                  D �cg c]  }|j                  «       ‘Œ c}|d<   |S c c}w c c}w )z7Serialize for inclusion in ``browser_snapshot`` output.)r<   r?   r=   )r<   Úto_dictr?   r=   )ÚselfÚdÚouts      r   rE   zSupervisorSnapshot.to_dictX   sc   € àHL×H\ÑH\Ö2]À1°1·9±9µ;Ò2]Ðmq×m|Ñm|Ñ}ˆØ×ÒØ:>×:MÑ:MÖ$N°Q Q§Y¡Y¥[Ò$NˆCÐ Ñ!Øˆ
ùò 3^ùâ$Ns   �A/ÁA4N©Úreturnr>   )r!   r"   r#   r$   Ú__annotations__rE   r%   r&   r   r;   r;   M   s+   … áCà.Ó.Ø,Ó,ØÓØƒLØƒLØƒLôr&   r;   c                  ó&  — e Zd ZU dZeedœ	 	 	 dd„Zddd„Zddd„Zd d„Z	d!d„Z
ddd	d
œ	 	 	 	 	 d"d„Zddd	dœ	 	 	 	 	 d#d„Zdd	dœd$d„Zd%d„Zd&d„Zd%d„Zd'd„Zd%d„Zd%d„Zd(dd	dœ	 	 	 	 	 d)d„Zd%d„Zi ej.                  ¥ej.                  ¥Zded<   y)*ÚCDPSupervisoraU  One supervisor per (task_id, cdp_url) pair. ``start()`` spawns a daemon thread
    running its own asyncio loop, connects, attaches to the first page target, enables
    domains and auto-attach. ``snapshot()`` / ``respond_to_dialog()`` / ``evaluate_runtime()``
    are sync, thread-safe bridges onto that loop; all CDP I/O lives on the loop.)Údialog_policyÚdialog_timeout_sc               óÂ  — |t         vrt        d|›dt        t         «      › �«      ‚|| _        || _        || _        t        |«      | _        t        j                  «       | _
        i | _        g | _        i | _        d| _        d | _        d | _        t        j"                  «       | _        d | _        d| _        d| _        i | _        d | _        d | _        i | _        d| _        y )NzInvalid dialog_policy z; must be one of Fé   r   )r   Ú
ValueErrorÚsortedrC   rB   rN   ÚfloatrO   Ú	threadingÚLockÚ_state_lockÚ_pending_dialogsÚ_recent_dialogsÚ_framesÚ_activeÚ_loopÚ_threadÚEventÚ_ready_eventÚ_start_errorÚ_stop_requestedÚ_next_call_idÚ_pending_callsÚ_wsÚ_page_session_idÚ_dialog_watchdogsÚ_dialog_seq)rF   rC   rB   rN   rO   s        r   Ú__init__zCDPSupervisor.__init__f   sÜ   € à¤Ñ/ÜÐ5°mÐ5FÐFWÔX^Ô_nÓXoÐWpÐqÓrÐrØˆŒØˆŒØ*ˆÔÜ %Ð&6Ó 7ˆÔô %Ÿ>™>Ó+ˆÔØ:<ˆÔØ35ˆÔØ-/ˆŒØˆŒà:>ˆŒ
Ø37ˆŒÜ%ŸO™OÓ-ˆÔØ59ˆÔØ$ˆÔàˆÔØ9;ˆÔØ/3ˆŒØ/3ˆÔàACˆÔØˆÕr&   c                óT  — | j                   r| j                   j                  «       ry| j                  j                  «        d\  | _        | _        t        j                  | j                  d| j                  › �d¬«      | _         | j                   j                  «        | j                  j                  |¬«      s8| j                  «        t        d|› dt        | j                  «      dd	 › d
�«      ‚| j                  x}�(| j                  «        t!        dt        |«      › �«      d‚y)zkLaunch the background loop and block until attachment completes; raises what attach failed with (redacted).N)NFzcdp-supervisor-T)ÚtargetÚnameÚdaemonr)   z%CDP supervisor did not attach within zs (cdp_url=éP   z...)z CDP supervisor failed to start: )r]   Úis_aliver_   Úclearr`   ra   rU   ÚThreadÚ_thread_mainrC   ÚstartÚwaitÚstopÚTimeoutErrorr   rB   ÚRuntimeError)rF   r*   Úerrs      r   rr   zCDPSupervisor.start†   s  € à�<Š<˜DŸL™L×1Ñ1Ô3ØØ×Ñ×ÑÔ!Ø2=Ñ/ˆÔ˜4Ô/Ü ×'Ñ'¨t×/@Ñ/@ÈÐY]×YeÑYeÐXfÐGgÐptÔuˆŒØ�‰×ÑÔØ× Ñ ×%Ñ%¨gÐ%Ô6Ø�I‰IŒKÜÐ!FÀwÀið P+Ü+AÀ$Ç,Á,Ó+OÐPSÐQSÐ+TÐ*UÐUYð [ó \ð \à×$Ñ$Ð$ˆCÐ1Ø�I‰IŒKô Ð!AÔBXÐY\ÓB]ÐA^Ð_Ó`ÐfjÐjð	 2r&   c                óT  — d| _         | j                  }|�N|j                  «       r>t        j                  t
        «      5  t        | j                  «       |d¬«       ddd«       | j                  �| j                  j                  |¬«       | j                  d«       y# 1 sw Y   ŒCxY w)z/Cancel the supervisor task and join the thread.TNg       @r)   F)ra   r\   Ú
is_runningÚ
contextlibÚsuppressr   r0   Ú	_close_wsr]   ÚjoinÚ_set_active)rF   r*   r.   s      r   rt   zCDPSupervisor.stop˜   s‡   € à#ˆÔØ�z‰zˆØÐ §¡Ô 1ô ×$Ñ$¤YÓ/ñ ?Ü˜$Ÿ.™.Ó*¨D¸#Õ>÷?à�<‰<Ð#Ø�L‰L×Ñ gÐÔ.Ø×Ñ˜Õ÷	?ð ?ús   ¿BÂB'c                óT   — | j                   5  || _        d d d «       y # 1 sw Y   y xY w©N)rW   r[   )rF   Úvalues     r   r~   zCDPSupervisor._set_active¥   s'   € Ø×Ññ 	!Ø ˆDŒL÷	!÷ 	!ñ 	!ús   �ž'c           	     ó8  — | j                   5  t        t        | j                  j	                  «       «      t        | j
                  t         d «      | j                  «       | j                  | j                  | j                  ¬«      cddd«       S # 1 sw Y   yxY w)z.Return an immutable snapshot of current state.N)r<   r=   r?   rA   rB   rC   )rW   r;   ÚtuplerX   ÚvaluesrY   r   Ú_build_frame_tree_lockedr[   rB   rC   ©rF   s    r   ÚsnapshotzCDPSupervisor.snapshot©   sx   € à×Ññ 	Ü%Ü % d×&;Ñ&;×&BÑ&BÓ&DÓ EÜ$ T×%9Ñ%9Ô;MÐ:MÐ:NÐ%OÓPØ×8Ñ8Ó:Ø—|‘|¨T¯\©\À4Ç<Á<ô	÷	÷ 	ò 	ús   �A9BÂBNç      $@)Úprompt_textÚ	dialog_idr*   c          	     ó�  — |dvrt        d|›�«      S | j                  5  | j                  st        d«      cddd«       S t        | j                  j                  «       «      }|st        d«      cddd«       S |rK| j                  j                  |«      }|€{t        d|›dt        | j                  «      › d�«      cddd«       S t        |«      d	kD  r:t        t        |«      › d
|D �cg c]  }|j                  ‘Œ c}› �«      cddd«       S |d   }ddd«       | j                  }|€t        d«      S 	 | j                  |dk(  |xs d¬«      }	t        |	||¬«       d|j#                  «       dœS c c}w # 1 sw Y   ŒdxY w# t        $ r}
t        t        |
«      «      cY d}
~
S d}
~
wt        $ r}
t!        |
«      cY d}
~
S d}
~
ww xY w)z¨Accept/dismiss a pending dialog (sync bridge onto the supervisor loop). Returns
        ``{"ok": True, "dialog"}`` or ``{"ok": False, "error"}`` for recoverable errors.>   ÚacceptÚdismissz*action must be 'accept' or 'dismiss', got úsupervisor is not activeNzno dialog is currently openz
dialog_id z not found (known: ú)rQ   z1 pending dialogs; specify dialog_id. Candidates: r   úsupervisor loop is not runningrŒ   Ú )rŒ   r‰   r)   T)r2   Údialog)r4   rW   r[   ÚlistrX   r„   ÚgetrS   ÚlenÚidr\   Ú_handle_dialog_cdpr0   r    r   r   r8   rE   )rF   Úactionr‰   rŠ   r*   Úpendingr’   rG   r.   r-   Úes              r   Úrespond_to_dialogzCDPSupervisor.respond_to_dialog³   sÅ  € ð Ð.Ñ.ÜÐEÀfÀZÐPÓQÐQØ×Ññ 	$Ø—<’<ÜÐ7Ó8÷	$ñ 	$ô ˜4×0Ñ0×7Ñ7Ó9Ó:ˆGÙÜÐ:Ó;÷	$ñ 	$ñ Ø×.Ñ.×2Ñ2°9Ó=�Ø�>Ü  :¨i¨]Ð:MÌfÐUY×UjÑUjÓNkÐMlÐlmÐ!nÓo÷	$ñ 	$ô �W“ Ò!Ü¤ G£˜~Ð-^ÐnuÖ_vÐijÐ`a×`dÓ`dÒ_vÐ^wÐxÓy÷	$ñ 	$ð ! ™�÷	$ð �z‰zˆØˆ<ÜÐ9Ó:Ð:ð	Ø×*Ñ*¨6¸6ÀXÑ;MÐ\gÒ\mÐkmÐ*ÓnˆDÜ�d˜D¨'Õ2ð
  f§n¡nÓ&6Ñ7Ð7ùò `w÷	$ð 	$ûô(  ò 	!Üœ˜Q›“=Õ ûÜò 	Ü˜“7�Nûð	úsf   ŸE6Á /E6Á9AE6Ã#E6Ã)E1Ã<E6ÄE6Ä5)F Å1E6Å6E?Æ	GÆF$ÆGÆ$GÆ0
G Æ:GÇ GT)Úreturn_by_valueÚawait_promiser*   c               óê  ‡ ‡‡‡‡‡— ‰ j                   Š‰�‰j                  «       st        d«      S ‰ j                  5  ‰ j                  ‰ j
                  c}Šddd«       st        d«      S ‰st        d«      S dˆˆˆˆ ˆˆfd„}	  ||«      }t        |t        «      r|j                  di «      ni }
|
j                  d	«      }|rQ|j                  d
«      xs d}|j                  d«      xs i j                  d«      }t        |r|› d|› �«      S |«      S |
j                  di «      }|j                  dd«      }d|v r|d   }n,|dk(  rd}n$|j                  d«      xs |j                  d«      }d||dœS # 1 sw Y   �Œ xY w# t        $ rh}|rdt        |«      j                  «       v st        |«      cY d}~S 	  |d«      }n&# t        $ r}	t        |	«      cY d}	~	cY d}~S d}	~	ww xY wY d}~�Œad}~ww xY w)a>  Evaluate ``expression`` in the page's Runtime context over the live WS.
        Returns ``{"ok": True, "result", "result_type"}`` or ``{"ok": False, "error"}``.
        ``return_by_value=True`` JSON-serializes the result (DevTools-console
        semantics); non-serializable objects come back as a description string.Nr�   rŽ   z'supervisor has no attached page sessionc                ó^   •— ‰| ‰ddœ}‰j                  d|‰‰¬«      }t        |‰‰dz   ¬«      S )NT)Ú
expressionÚreturnByValueÚawaitPromiseÚuserGestureúRuntime.evaluate©Ú
session_idr*   rQ   r)   )Ú_cdpr0   )	Úby_valueÚparamsr-   r�   r    r.   rF   r¦   r*   s	      €€€€€€r   Ú	_run_evalz1CDPSupervisor.evaluate_runtime.<locals>._run_evalã   s@   ø€ à$.ÀØ&3ÀDñJˆFà—9‘9Ð/°ÀJÐX_�9Ó`ˆDÜ˜T 4°¸1±Ô=Ð=r&   zreference chain is too longFr,   ÚexceptionDetailsÚtextzJavaScript exceptionÚ	exceptionÚdescriptionr6   r7   Ú	undefinedr�   ÚunserializableValueT)r2   r,   Úresult_type)r¨   r@   rJ   r>   )r\   ry   r4   rW   r[   re   r   r   Úlowerr8   Ú
isinstanceÚdictr”   )rF   r    rœ   r�   r*   rA   rª   Úresponser   Úexc2Úresult_payloadÚexception_detailsÚexc_textr®   Ú
result_objr±   r�   r.   r¦   s   `` ``            @@r   Úevaluate_runtimezCDPSupervisor.evaluate_runtimeÓ   só  ý€ ð �z‰zˆØˆ<˜tŸ™Ô0ÜÐ9Ó:Ð:Ø×Ññ 	EØ!%§¡¨t×/DÑ/DÐˆF�J÷	EáÜÐ3Ó4Ð4ÙÜÐBÓCÐC÷	>ò 	>ð	"Ù  Ó1ˆHô 8BÀ(ÌDÔ7Q˜Ÿ™ h°Ô3ÐWYˆØ*×.Ñ.Ð/AÓBÐÙØ(×,Ñ,¨VÓ4ÒNÐ8NˆHØ,×0Ñ0°Ó=ÒCÀ×HÑHÈÓWˆKÜ¹˜H˜: R¨ }Ð5ÓSÐSÈ(ÓSÐSà#×'Ñ'¨°"Ó5ˆ
Ø —n‘n V¨[Ó9ˆØ�jÑ Ø˜wÑ'‰EØ˜KÒ'Ø‰Eð —N‘N =Ó1ÒZ°Z·^±^ÐDYÓ5ZˆEØ e¸KÑHÐH÷Y	Eñ 	Eûô  ò 		"ñ $Ð(EÌÈSËÏÉÓIYÑ(YÜ˜C“yÕ ð"Ù$ UÓ+‘øÜò "Ü˜D“z×!Ò!ûð"úõ ûð		"ús_   ¼E4ÂF Å4E>Æ	G2Æ
'G-Æ1G2Æ8GÇ G-Ç	G$Ç

GÇG$ÇG-ÇG2ÇG$Ç$G-Ç-G2)rŒ   r*   c               óð   ‡ ‡‡‡‡— ‰ j                   }|�|j                  «       st        d«      S dˆ ˆfd„Šdˆˆˆˆ ˆfd„}	 t         |«       |‰dz   ¬«      S # t        $ r}t        |«      cY d}~S d}~ww xY w)	a  Re-attach the supervisor's page session to an open page target on ``origin``
        (``scheme://host[:port]``). The initial attach picks the FIRST page target, but tools
        that open their own tabs (browser_exec) put the login form somewhere else. With
        ``accept`` (a JS expression) the first same-origin tab where it evaluates truthy wins,
        so a login and a checkout tab on one site resolve to the right one. Returns
        ``{"ok": True, "url"}`` or ``{"ok": False, "error"}``; on failure the previous session stays.Nr�   c              “  óÒ   •K  — ‰j                  d| ddœ‰¬«      ƒ d {  –—† }|d   d   }‰j                  |‰¬«      ƒ d {  –—†  ‰j                  |«      ƒ d {  –—†  |S 7 ŒB7 Œ!7 Œ
­w)NúTarget.attachToTargetT©ÚtargetIdÚflattenr)   r,   Ú	sessionId)r§   Ú_enable_page_domainsÚ_install_dialog_bridge)Ú	target_idÚattachÚsidrF   r*   s      €€r   Ú_attachz)CDPSupervisor.focus_page.<locals>._attach  su   øè ø€ ØŸ9™9Ð%<È9ÐaeÑ>fÐpw˜9Óx×xˆFØ˜Ñ" ;Ñ/ˆCØ×+Ñ+¨C¸Ð+ÓA×AÐAØ×-Ñ-¨cÓ2×2Ð2ØˆJð	 yøàAøØ2ús3   ƒA'žA!Ÿ"A'ÁA#ÁA'ÁA%ÁA'Á#A'Á%A'c               “  óV  •K  — ddl m}  ‰j                  d‰¬«      ƒ d {  –—† j                  di «      j                  dg «      }g }|D ]i  }t	        |j                  d«      xs d«      }	 |j                  d	«      d
k(  r4|j                  d«      r#‰
r | |«      ‰
k(  r|j                  |d   |f«       Œk |D ]©  \  }} ‰|«      ƒ d {  –—† }‰	rp‰j                  d‰	ddœ|‰¬«      ƒ d {  –—† }|j                  di «      j                  di «      j                  d«      s‰j                  dd|i‰¬«      ƒ d {  –—†  Œˆ‰j                  5  |‰_	        d d d «       d|dœc S  t        d‰
xs d› �‰	r
|rdz   «      S dz   «      S 7 �Œd# t        $ r Y �ŒJw xY w7 ŒÎ7 Œ®7 Œa# 1 sw Y   ŒKxY w­w)Nr   )Únormalize_originúTarget.getTargetsr)   r,   ÚtargetInfosÚurlr‘   r7   Úpage)zhttp://zhttps://rÀ   r¤   T)r    r¡   r¥   r�   zTarget.detachFromTargetrÂ   )r2   rÍ   zno open page on zany sitez with the expected form)Úagent.vault_storerÊ   r§   r”   r   Ú
startswithÚappendr   rW   re   r4   )rÊ   ÚtargetsÚ
candidatesÚtrÍ   rÅ   rÇ   ÚproberÈ   rŒ   ÚoriginrF   r*   s           €€€€€r   Ú_focusz(CDPSupervisor.focus_page.<locals>._focus  sñ  øè ø€ Ý:Ø!ŸY™YÐ':ÀG˜YÓL×L×QÑQÐRZÐ\^Ó_×cÑcÐdqÐsuÓvˆGØˆJØò �Ü˜!Ÿ%™% ›,Ò,¨"Ó-�ðà—u‘u˜V“}¨Ò.°3·>±>ÐBYÔ3ZÙ%+Ñ/?ÀÓ/DÈÒ/NØ"×)Ñ)¨1¨Z©=¸#Ð*>Ô?øðð #-ò 
0‘�	˜3Ù# IÓ.×.�ÙØ"&§)¡)Ð,>ÈvÐhlÑ@mØ7:ÀGð #,ó #M÷ M�Eà Ÿ9™9 X¨rÓ2×6Ñ6°xÀÓD×HÑHÈÔQØ"Ÿi™iÐ(AÀKÐQTÐCUÐ_f˜iÓg×gÐgØ Ø×%Ñ%ñ 0Ø,/�DÔ)÷0à"¨3Ñ/Ò/ð
0ô Ð+¨FÒ,@°jÐ+AÐBÑciÑnxÐF_ñ  Bó  Cð  Cð  Añ  Bó  Cð  Cð- Múô !ò Úðúð /øðMøð hø÷0ð 0üs~   ƒF) F¡A	F)Á+AFÂ3F)ÃFÃ	!F)Ã*FÃ+AF)Ä9FÄ:F)ÅFÅ2F)Æ	FÆF)ÆFÆF)ÆF)ÆF)ÆF&	Æ"F)rQ   r)   )rÅ   r   rJ   r   rI   )r\   ry   r4   r0   r   r8   )rF   rÖ   rŒ   r*   r.   r×   r   rÈ   s   ````   @r   Ú
focus_pagezCDPSupervisor.focus_page
  sm   ü€ ð �z‰zˆØˆ<˜tŸ™Ô0ÜÐ9Ó:Ð:ö	÷	Cñ 	Cð4	Ü™V›X t°W¸q±[ÔAÐAøÜò 	Ü˜“9Õûð	ús   ÁA Á	A5Á 
A0Á*A5Á0A5c           
     ó  — t        j                  «       }|| _        	 t        j                  |«       |j	                  | j                  «       «       t        j                  t        «      5  t        j                  |«      D �cg c]  }|j                  «       rŒ|‘Œ }}|D ]  }|j!                  «        Œ |r$|j	                  t        j"                  |ddiŽ«       ddd«       t        j                  t        «      5  |j%                  «        ddd«       | j'                  d«       y# t        $ r=}| j                  |«      s!t        j                  d| j                  |«       Y d}~�Œd}~ww xY wc c}w # 1 sw Y   Œ›xY w# 1 sw Y   ŒuxY w# t        j                  t        «      5  t        j                  |«      D �cg c]  }|j                  «       rŒ|‘Œ nc c}w }}|D ]  }|j!                  «        Œ |r$|j	                  t        j"                  |ddiŽ«       ddd«       n# 1 sw Y   nxY wt        j                  t        «      5  |j%                  «        ddd«       n# 1 sw Y   nxY w| j'                  d«       w xY w)z2Entry point for the supervisor's dedicated thread.zCDP supervisor %s crashed: %sNÚreturn_exceptionsTF)ÚasyncioÚnew_event_loopr\   Úset_event_loopÚrun_until_completeÚ_runÚBaseExceptionÚ_fail_startÚloggerÚwarningrC   rz   r{   r   Ú	all_tasksÚdoneÚcancelÚgatherÚcloser~   )rF   r.   rš   rÔ   r™   s        r   rq   zCDPSupervisor._thread_main=  s  € ä×%Ñ%Ó'ˆØˆŒ
ð	$Ü×"Ñ" 4Ô(Ø×#Ñ# D§I¡I£KÔ0ô ×$Ñ$¤YÓ/ñ ^Ü&-×&7Ñ&7¸Ó&=ÖN ÀQÇVÁVÅXš1ÐN�ÐNØ ò �AØ—H‘H•JðáØ×+Ñ+¬G¯N©N¸GÐ,\ÐW[Ñ,\Ô]÷^ô ×$Ñ$¤YÓ/ñ Ø—
‘
”÷à×Ñ˜UÕ#øô ò 	QØ×#Ñ# AÔ&Ü—‘Ð>ÀÇÁÈaÔPÿùð	Qüò O÷^ð ^ú÷ð ûô ×$Ñ$¤YÓ/ñ ^Ü&-×&7Ñ&7¸Ó&=ÖN ÀQÇVÁVÅXš1ÑNùÒN�ÐNØ ò �AØ—H‘H•JðáØ×+Ñ+¬G¯N©N¸GÐ,\ÐW[Ñ,\Ô]÷^÷ ^ñ ^úô ×$Ñ$¤YÓ/ñ Ø—
‘
”÷÷ ñ úà×Ñ˜UÕ#úsœ   �4D' Á*E5ÂE0ÂE0Â?E5Ã<FÄ'	E-Ä02E(Å"F Å(E-Å-F Å0E5Å5E>ÆF
ÆJÆ'H'Æ?G
ÇG
ÇAH'È	JÈ'H0È, JÉI&É	JÉ&I/É+Jc                ó|   — | j                   j                  «       ry|| _        | j                   j                  «        y)zNPropagate ``e`` to ``start()`` if we never got ready; True if it was consumed.FT)r_   Úis_setr`   Úset)rF   rš   s     r   rá   zCDPSupervisor._fail_startT  s4   € à×Ñ×#Ñ#Ô%ØØˆÔØ×Ñ×ÑÔØr&   c              ƒ  óÊ   K  — | j                   dc}| _         |�;t        j                  t        «      5  |j	                  «       ƒ d{  –—†  ddd«       yy7 Œ# 1 sw Y   yxY w­w)z@Detach and close the current WebSocket, swallowing close errors.N)rd   rz   r{   r   rè   )rF   Úwss     r   r|   zCDPSupervisor._close_ws\  s[   è ø€ à—x‘x ˆˆˆDŒHØˆ>Ü×$Ñ$¤YÓ/ñ !Ø—h‘h“j× Ð ÷!ð !ð à ø÷!ð !üs.   ‚0A#²AÁAÁAÁ
A#ÁAÁA ÁA#c                óî   — |t         k  ryt        j                  d| j                  |t	        |«      «       t
        j                  | j                  «      | u rt
        j                  | j                  «       y)ab  True once ``failures`` consecutive post-attach reconnects failed: log ONE final line
        and drop this supervisor from the registry so a dead endpoint (its Chrome exited with
        the task) leaves neither a retrying thread nor a stale registry entry behind. A later
        browser call for the task starts a fresh supervisor via ``get_or_start``.FzACDP supervisor %s: stopped after %s failed reconnect attempts: %sT)Ú"MAX_POST_ATTACH_RECONNECT_FAILURESrâ   rã   rC   r   ÚSUPERVISOR_REGISTRYr”   Ú_pop)rF   Úfailuresrš   s      r   Ú_reconnect_budget_spentz%CDPSupervisor._reconnect_budget_spentc  s]   € ð
 Ô8Ò8ØÜ�‰ÐZØ—|‘| XÔ/EÀaÓ/Hô	Jä×"Ñ" 4§<¡<Ó0°DÑ8Ü×$Ñ$ T§\¡\Ô2Ør&   c              ƒ  ó²
  K  — d\  }}}ddl }ddlm} ddi || j                  «      ¥}| j                  �s	 t        j                   |j                  | j                  fi |¤Žd¬«      ƒ d{  –—† | _        t        j&                  | j)                  «       d¬«      }	 d| _        | j-                  «       ƒ d{  –—†  | j/                  d«       t1        j0                  «       }d}d}| j2                  j5                  «        |ƒ d{  –—†  | j/                  d«       |j9                  «       sK|j;                  «        t=        j>                  t
        j@                  t        «      5  |ƒ d{  –—†  ddd«       | jB                  jE                  «       D ]  }	|	j;                  «        Œ | jB                  jG                  «        | jI                  «       ƒ d{  –—†  | j                  ryt        jK                  d| j                  |«       t        j"                  |«      ƒ d{  –—†  t%        |dz  d«      }| j                  s�Œyy7 �ŒÓ# t        $ r¤}| j                  |«      rY d}~y|d	z  }| j                  ||«      rY d}~yt        j                  d
| j                  |t        t!        |«      «       t        j"                  t%        |d«      «      ƒ d{  –—†7   t%        |dz  d«      }Y d}~�ŒÁd}~ww xY w7 �Œ<7 �Œò# t6        $ �r[}| j                  |«      r‚ |d	z  }| j                  ||«      ráY d}~| j/                  d«       |j9                  «       sY|j;                  «        t=        j>                  t
        j@                  t        «      5  |ƒ d{  –—†7   ddd«       n# 1 sw Y   nxY w| jB                  jE                  «       D ]  }	|	j;                  «        Œ | jB                  jG                  «        | jI                  «       ƒ d{  –—†7   yt        j                  d| j                  t1        j0                  «       |z
  |t        t!        |«      «       Y d}~�ŒPd}~ww xY w7 �Œù# 1 sw Y   �ŒùxY w7 �Œ # | j/                  d«       |j9                  «       sY|j;                  «        t=        j>                  t
        j@                  t        «      5  |ƒ d{  –—†7   ddd«       n# 1 sw Y   nxY w| jB                  jE                  «       D ]  }	|	j;                  «        Œ | jB                  jG                  «        | jI                  «       ƒ d{  –—†7   w xY w7 �Œ9­w)aE  Top-level reconnecting supervisor coroutine. Browserbase tears down the CDP
        socket whenever a short-lived client (agent-browser's per-command CDP client)
        disconnects, so on drop we reset per-session ids, re-attach, and keep going.
        A failure before the first successful attach is fatal for ``start()``.)r   g        ç      à?r   N)Úloopback_connect_kwargsÚmax_sizei   rˆ   r)   rQ   z5CDP supervisor %s: connect failed (attempt %s/%s): %sé   z
cdp-reader)rk   Trõ   FzBCDP supervisor %s: session dropped after %.1fs (attempt %s/%s): %sz+CDP supervisor %s: reconnecting in %.1fs...)&Ú
websocketsÚagent.proxy_bypassrö   rB   ra   rÛ   Úwait_forÚconnectrd   r   rá   ró   râ   rã   rC   rï   r   ÚsleepÚminÚcreate_taskÚ
_read_loopre   Ú_attach_initial_pager~   Útimer_   rë   rà   rå   ræ   rz   r{   ÚCancelledErrorrf   r„   ro   r|   Údebug)
rF   Úreconnect_failuresÚlast_success_atÚbackoffrù   rö   Úconnect_kwargsrš   Úreader_taskÚhandles
             r   rß   zCDPSupervisor._runp  s`  è ø€ ð
 8CÑ4Ð˜O¨WÛÝ>Ø$Ð&6Ð`Ñ:QÐRV×R^ÑR^Ó:_Ð`ˆØ×&Ó&ðÜ!(×!1Ñ!1Ð2D°*×2DÑ2DÀTÇ\Á\Ñ2dÐUcÑ2dÐnrÔ!s×s�”ô "×-Ñ-¨d¯o©oÓ.?ÀlÔSˆKð'ð )-�Ô%Ø×/Ñ/Ó1×1Ð1Ø× Ñ  Ô&Ü"&§)¡)£+�Ø%&Ð"Ø�Ø×!Ñ!×%Ñ%Ô'Ø!×!Ð!ð × Ñ  Ô'Ø"×'Ñ'Ô)Ø×&Ñ&Ô(Ü#×,Ñ,¬W×-CÑ-CÄYÓOñ *Ø)×)Ð)÷*à"×4Ñ4×;Ñ;Ó=ò $�FØ—M‘M•Oð$à×&Ñ&×,Ñ,Ô.Ø—n‘nÓ&×&Ð&à×#Ò#ØÜ�L‰LÐFÈÏÉÐV]Ô^Ü—-‘- Ó(×(Ð(Ü˜' A™+ tÓ,ˆGðk ×&Ö&àsúÜò Ø×#Ñ# AÔ&ÜØ" aÑ'Ð"Ø×/Ñ/Ð0BÀAÔFÜÜ—‘ÐVØ#Ÿ|™|Ð-?ÔAcÜ5°aÓ8ô:ô —m‘m¤C¨°Ó$6Ó7×7Ñ7Ü˜g¨™k¨4Ó0�Ýûðúð& 2ùð "úÜ ó ^Ø×#Ñ# AÔ&ØØ" aÑ'Ð"Ø×/Ñ/Ð0BÀAÔFÛð
 × Ñ  Ô'Ø"×'Ñ'Ô)Ø×&Ñ&Ô(Ü#×,Ñ,¬W×-CÑ-CÄYÓOñ *Ø)×)Ñ)÷*÷ *ñ *úà"×4Ñ4×;Ñ;Ó=ò $�FØ—M‘M•Oð$à×&Ñ&×,Ñ,Ô.Ø—n‘nÓ&×&Ò&ô —‘ÐcØ#Ÿ|™|¬T¯Y©Y«[¸?Ñ-JÐL^ÜAÔCYÐZ[ÓC\÷^ò ^ûð^úð *ù÷*ñ *úð
 'úð × Ñ  Ô'Ø"×'Ñ'Ô)Ø×&Ñ&Ô(Ü#×,Ñ,¬W×-CÑ-CÄYÓOñ *Ø)×)Ñ)÷*÷ *ñ *úà"×4Ñ4×;Ñ;Ó=ò $�FØ—M‘M•Oð$à×&Ñ&×,Ñ,Ô.Ø—n‘nÓ&×&Ò&úð
 )ûs‚  ‚4U·5I Á,H?Á-	I Á6%UÂK8 Â6K2Â7AK8 ÄK5ÄK8 ÄAUÅ!Q#Å'Q Å(Q#Å,A$UÇQ0ÇA
UÈUÈUÈ=UÈ?I É	K/ÉK*ÉUÉ!K*É8UÉ=AK*ËKËK*Ë$UË*K/Ë/UË2K8 Ë5K8 Ë8
QÌ)QÌ+Q3 Ì/AUÎNÎNÎNÎ	UÎN&Î"A#UÐPÐUÐAQÑQ3 ÑQÑQ3 Ñ Q#Ñ#Q-Ñ(	UÑ3AUÓS"ÓS
ÓS"Ó	UÓ"S+Ó'A#UÕ
UÕUÕUc              ƒ  óÀ  K  — | j                  d«      ƒ d{  –—† j                  di «      j                  dg «      }t        d„ |D «       d«      }|€| j                  dddi«      ƒ d{  –—† d   }| j                  d	|d
   ddœ«      ƒ d{  –—† }|d   d   x| _        }| j	                  |d¬«      ƒ d{  –—†  | j                  |«      ƒ d{  –—†  y7 Œ¼7 Œm7 ŒL7 Œ$7 Œ­w)zXFind (or create) a page target, attach flattened, enable domains, install dialog bridge.rË   Nr,   rÌ   c              3  óJ   K  — | ]  }|j                  d «      dk(  sŒ|–— Œ y­w)r7   rÎ   N)r”   )Ú.0rÔ   s     r   ú	<genexpr>z5CDPSupervisor._attach_initial_page.<locals>.<genexpr>³  s   è ø€ ÒJ !°!·%±%¸³-À6Ó2IœAÑJùs   ‚#œ#zTarget.createTargetrÍ   zabout:blankr¾   rÀ   Tr¿   rÂ   rˆ   r)   )r§   r”   Únextre   rÃ   rÄ   )rF   rÒ   Úpage_targetrÆ   rÇ   s        r   r  z"CDPSupervisor._attach_initial_page°  sæ   è ø€ àŸ™Ð#6Ó7×7×<Ñ<¸XÀrÓJ×NÑNÈ}Ð^`ÓaˆÜÑJ wÔJÈDÓQˆØÐØ!%§¡Ð+@À5È-ÐBXÓ!Y×YÐ[cÑdˆKØ—y‘yÐ!8À{ÐS]ÑG^ÐkoÑ:pÓq×qˆØ&,¨XÑ&6°{Ñ&CÐCˆÔ Ø×'Ñ'¨°TÐ'Ó:×:Ð:Ø×)Ñ)¨#Ó.×.Ñ.ð 8øð ZøØqøà:øØ.úsX   ‚C—C˜ACÁ(CÁ)"CÂCÂ)CÂ5CÂ6CÃCÃCÃCÃCÃCÃCr¥   c             ƒ  ó|  K  — | j                   €t        d«      ‚| j                  | j                  dz   c}| _        ||dœ}|j                  d|fd|ffD ��ci c]  \  }}|sŒ	||“Œ c}}«       t	        j
                  «       j                  «       }	|	| j                  |<   | j                   j                  t        j                  |«      «      ƒ d{  –—†  	 t	        j                  |	|¬«      ƒ d{  –—† | j                  j                  |d«       S c c}}w 7 ŒF7 Œ(# | j                  j                  |d«       w xY w­w)z*Send a CDP command and await its response.Nz%supervisor WebSocket is not connectedrQ   )r–   Úmethodr©   rÂ   r)   )rd   rv   rb   ÚupdaterÛ   Úget_running_loopÚcreate_futurerc   ÚsendÚjsonÚdumpsrû   Úpop)
rF   r  r©   r¦   r*   Úcall_idÚpayloadÚkÚvr/   s
             r   r§   zCDPSupervisor._cdp»  s  è ø€ ð �8‰8ÐÜÐFÓGÐGØ&*×&8Ñ&8¸$×:LÑ:LÈqÑ:PÐ#ˆ�Ô#Ø)0¸FÑ"CˆØ�‰¨8°VÐ*<¸{ÈJÐ>WÐ)X×^¡  AÒ\]˜˜1™Ó^Ô_Ü%×6Ñ6Ó8×FÑFÓHˆØ'*ˆ×Ñ˜GÑ$Ø�h‰h�m‰mœDŸJ™J wÓ/Ó0×0Ð0ð	3Ü ×)Ñ)¨#°wÔ?×?à×Ñ×#Ñ# G¨TÕ2ùó _ð 	1øà?ùà×Ñ×#Ñ# G¨TÕ2üsO   ‚AD<Á
D
Á!D
Á&A*D<ÃDÃD<ÃD Ã0DÃ1D Ã4$D<ÄD ÄD9Ä9D<c           
   ƒ  óú  K  — | j                   €J ‚	 | j                   2 3 d{  –—† }| j                  r y	 t        j                  |«      }d|v ro| j                  j                  |d   d«      }|�|j                  «       rŒcd|v r'|j                  t        d|d   › d|d   › �«      «       ŒŽ|j                  |«       Œ | j                  j                  |j                  d«      «      x}sŒÍ || |j                  di «      |j                  d	«      «      }|€Œù|ƒ d{  –—†  �Œ7 �Œ# t        $ r t
        j                  d«       Y �Œ)w xY w7 Œ.6 y# t        $ r }t
        j                  d
|«       Y d}~yd}~ww xY w­w)uW   Continuously dispatch incoming CDP frames (responses â†’ futures, events â†’ handlers).Nz&CDP supervisor: non-JSON frame droppedr–   r3   zCDP error on id=r6   r  r©   rÂ   zCDP read loop exited: %s)rd   ra   r  Úloadsr   râ   r  rc   r  rå   Úset_exceptionrv   Ú
set_resultÚ_EVENT_HANDLERSr”   )rF   ÚrawÚmsgr/   Úhandlerr,   rš   s          r   r   zCDPSupervisor._read_loopË  sj  è ø€ à�x‰xÐ#Ð#Ð#ð	8Ø!ŸX™X÷ %ð %�cØ×'Ò'ÙðÜŸ*™* S›/�Cð ˜3‘;Ø×-Ñ-×1Ñ1°#°d±)¸TÓB�CØ�{ c§h¡h¤jØ Ø #‘~Ø×)Ñ)¬,Ð9IÈ#ÈdÉ)ÈÐTVÐWZÐ[bÑWcÐVdÐ7eÓ*fÕgàŸ™ sÕ+Ø $× 4Ñ 4× 8Ñ 8¸¿¹ÀÓ9JÓ KÐK�WÑKÙ$ T¨3¯7©7°8¸RÓ+@À#Ç'Á'È+ÓBVÓW�FØÑ)Ø$Ÿšð'%úô
 !ò Ü—L‘LÐ!IÔJÚðúð %øñ' &øô( ò 	8Ü�L‰LÐ3°Q×7Ñ7ûð	8üs�   ‚E;’E žE¢D#£E¦E ´E;¶D&ÁBE Ã++E ÄE ÄEÄE Ä#EÄ&EÅE ÅEÅE ÅE ÅE;Å	E8ÅE3Å.E;Å3E8Å8E;zDict[str, Callable[..., Any]]r"  )
rC   r   rB   r   rN   r   rO   rT   rJ   ÚNone)ç      .@)r*   rT   rJ   r&  )g      @)r�   r@   rJ   r&  )rJ   r;   )
r˜   r   r‰   úOptional[str]rŠ   r(  r*   rT   rJ   r>   )
r    r   rœ   r@   r�   r@   r*   rT   rJ   r>   )rÖ   r   rŒ   r(  r*   rT   rJ   r>   ©rJ   r&  )rš   rà   rJ   r@   )rò   Úintrš   rà   rJ   r@   r€   )
r  r   r©   zOptional[Dict[str, Any]]r¦   r(  r*   rT   rJ   r>   )r!   r"   r#   r$   r   r   rh   rr   rt   r~   r‡   r›   r»   rØ   rq   rá   r|   ró   rß   r  r§   r   r   ÚEVENT_HANDLERSr   r"  rK   r%   r&   r   rM   rM   `   s  … ñTð
 LaØ+CñØ#(ðØHLóô@kô$ ó!óð NRØ59ÈDñ8Ø%2ð8ØDIð8ØUcó8ð@ LPØ/3Àdñ5IØ(,ð5IØ>Cð5IØO]ó5Iðn BFÐX\õ /óf$ó.ó!óó>-ó@	/ð3Ø/3Àdñ3Ø,ð3Ø>Cð3ØO]ó3ó 8ð:6Ø
 ×
/Ñ
/ð6Ø3E×3TÑ3Tð6€OÐ2ô r&   rM   c                  óT   — e Zd ZdZdd„Zdd„Zdd„Zeeddœ	 	 	 	 	 dd„Z	dd„Z
dd	„Zy
)Ú_SupervisorRegistryua   Process-global (task_id â†’ supervisor) map with idempotent start/stop (``SUPERVISOR_REGISTRY``).c                óD   — t        j                  «       | _        i | _        y r€   )rU   rV   Ú_lockÚ_by_taskr†   s    r   rh   z_SupervisorRegistry.__init__ð  s   € Ü—^‘^Ó%ˆŒ
Ø24ˆ�r&   c                ó|   — | j                   5  | j                  j                  |«      cd d d «       S # 1 sw Y   y xY wr€   )r/  r0  r”   ©rF   rC   s     r   r”   z_SupervisorRegistry.getô  s0   € Ø�Z‰Zñ 	.Ø—=‘=×$Ñ$ WÓ-÷	.÷ 	.ò 	.ús   �2²;c                ó~   — | j                   5  | j                  j                  |d «      cd d d «       S # 1 sw Y   y xY wr€   )r/  r0  r  r2  s     r   rñ   z_SupervisorRegistry._popø  s2   € Ø�Z‰Zñ 	4Ø—=‘=×$Ñ$ W¨dÓ3÷	4÷ 	4ò 	4ús   �3³<r'  )rN   rO   Ústart_timeoutc               óÔ  — | j                   5  | j                  j                  |«      }|�~|j                  |j                  }}|duxr( |j                  «       xr |duxr |j                  «       }	|j                  |k(  r|	r|cddd«       S | j                  j                  |d«       ddd«       �|j                  «        t        ||||¬«      }
|
j                  |¬«       | j                   5  | j                  j                  |«      }|�*|j                  |k(  r|
j                  «        |cddd«       S |
| j                  |<   ddd«       |
S # 1 sw Y   Œ©xY w# 1 sw Y   |
S xY w)z±Idempotently ensure a supervisor runs for ``(task_id, cdp_url)``; one bound to a
        different ``cdp_url`` or unhealthy (dead thread / stopped loop) is stopped and replaced.N)rC   rB   rN   rO   r)   )r/  r0  r”   r]   r\   rn   ry   rB   r  rt   rM   rr   )rF   rC   rB   rN   rO   r4  ÚexistingÚthreadr.   ÚhealthyÚ
supervisorÚalreadys               r   Úget_or_startz _SupervisorRegistry.get_or_startü  sZ  € ð �Z‰Zñ 	1Ø—}‘}×(Ñ(¨Ó1ˆHØÐ#Ø'×/Ñ/°·±˜�Ø ¨Ð,Òm°·±Ó1BÒmÀtÐSWÐGWÒmÐ\`×\kÑ\kÓ\m�Ø×#Ñ# wÒ.±7Ø#÷	1ñ 	1ð —‘×!Ñ! '¨4Ô0÷	1ð ÐØ�M‰MŒOä"¨7¸GØ1>ÐQaôcˆ
à×Ñ ÐÔ/Ø�Z‰Zñ 	0à—m‘m×'Ñ'¨Ó0ˆGØÐ" w§¡¸'Ò'AØ—‘Ô!Ø÷	0ñ 	0ð &0ˆD�M‰M˜'Ñ"÷	0ð Ð÷+	1ð 	1ú÷	0ð Ðús$   �A6EÂEÃ0>EÄ8EÅEÅE'c                óL   — | j                  |«      }|�|j                  «        y y r€   )rñ   rt   )rF   rC   r9  s      r   rt   z_SupervisorRegistry.stop  s%   € Ø—Y‘Y˜wÓ'ˆ
ØÐ!Ø�O‰OÕð "r&   c                óî   — | j                   5  t        | j                  j                  «       «      }| j                  j	                  «        ddd«       D ]  }|j                  «        Œ y# 1 sw Y   Œ!xY w)z<Stop every running supervisor. For shutdown / test teardown.N)r/  r“   r0  r„   ro   rt   )rF   Úitemsr9  s      r   Ústop_allz_SupervisorRegistry.stop_all  s`   € à�Z‰Zñ 	"Ü˜Ÿ™×-Ñ-Ó/Ó0ˆEØ�M‰M×ÑÔ!÷	"ð  ò 	ˆJØ�O‰OÕñ	÷	"ð 	"ús   �>A+Á+A4Nr)  )rC   r   rJ   zOptional[CDPSupervisor])rC   r   rB   r   rN   r   rO   rT   r4  rT   rJ   rM   )rC   r   rJ   r&  )r!   r"   r#   r$   rh   r”   rñ   r   r   r;  rt   r?  r%   r&   r   r-  r-  í  sH   „ Ùkó5ó.ó4ð PeØ/GÐ`dñØ',ðØX]ðØivóó6ô
r&   r-  )rM   rð   r;   r-  é2   c                  ó>   — e Zd ZU dZded<   ded<   ded<   dZded	<   y)
ÚConsoleEventz2Ring buffer entry for console + exception traffic.rT   Útsr   Úlevelr¬   Nr(  rÍ   )r!   r"   r#   r$   rK   rÍ   r%   r&   r   rB  rB  2  s   … á<àƒIØƒJØ
ƒIØ€CˆÔr&   rB  )ú tools.browser_supervisor_dialogsÚDIALOG_BRIDGE_HOST)rE  ÚDIALOG_BRIDGE_URL_PATTERN)rE  ÚDIALOG_POLICY_AUTO_ACCEPT)rE  ÚDIALOG_POLICY_AUTO_DISMISS)rE  ÚDIALOG_POLICY_MUST_RESPOND)útools.browser_supervisor_framesÚFRAME_TREE_MAX_ENTRIES)rK  ÚFRAME_TREE_MAX_OOPIF_DEPTH)rF  rG  rH  rI  rJ  rL  rM  c                óÌ   — t         j                  | «      }|€t        dt        ›d| ›�«      ‚dd l}ddlm}  |t        | g|¢­Ž  t        |j                  |d   «      |d   «      S )Nzmodule z has no attribute r   )Ú	warn_oncerQ   )	Ú_PLUGIN_COMPAT_LAZYr”   ÚAttributeErrorr!   Ú	importlibÚhermes_cli.plugin_compatrO  ÚgetattrÚimport_module)rk   rj   rR  rO  s       r   Ú__getattr__rV  G  se   € Ü ×$Ñ$ TÓ*€FØ€~Ü˜w¤x lÐ2DÀTÀHÐMÓNÐNÛÝ2ÙŒh˜Ð&˜vÓ&Ü�9×*Ñ*¨6°!©9Ó5°v¸a±yÓAÐAr&   )r   ÚobjectrJ   r   )r*   rT   )r3   r   rJ   r>   )r   rà   rJ   r>   )3r$   Ú
__future__r   rÛ   rz   r  ÚloggingrU   r  Údataclassesr   Útypingr   r   r   r   r	   r
   r   Ú tools.browser_supervisor_dialogsr   r   r   r   r   r   r   Útools.browser_supervisor_framesr   r   Úwebsockets.asyncio.clientr   Ú	getLoggerr!   râ   rï   r   rv   r    r0   r4   r8   r;   rM   r-  rð   Ú__all__ÚCONSOLE_HISTORY_MAXrB  rP  rV  r%   r&   r   ú<module>rb     s  ðñ	õ #ã Û Û Û Û Û Ý !ß L× LÑ L÷÷ ñ ÷ Jñ Ý:à	ˆ×	Ñ	˜8Ó	$€ð &'Ð "ó
"ôI�|ô Ió'ó)ó1ñ �$Ô÷ð ó ðô$JÐ*Ð,>ô J÷Z5ñ 5ñp *Ó+Ð ò `€ð Ð à
÷ð ó ðð UØ!bØ!bØ"dØ"dØ[Ø"cñÐ óBr&   