§
    øžyj%ù  ã                  ó4  — 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m	Z	 ddl
mZmZmZmZmZmZ erddlmZ  ej        e¦  «        Zd+d„Zd,d„ZdZdZdZ eeeeh¦  «        ZeZdZdZdZ dZ!dZ"dZ#de#› d�Z$dZ%e	 G d„ d¦  «        ¦   «         Z&e	 G d„ d¦  «        ¦   «         Z'e	 G d„ d¦  «        ¦   «         Z(e	 G d „ d!¦  «        ¦   «         Z) e	d"¬#¦  «         G d$„ d%¦  «        ¦   «         Z* G d&„ d'¦  «        Z+ G d(„ d)¦  «        Z, e,¦   «         Z-g d*¢Z.dS )-u‡  Persistent CDP supervisor for browser dialog + frame detection.

One ``CDPSupervisor`` runs per Hermes ``task_id`` that has a reachable CDP
endpoint. It holds a single persistent WebSocket to the backend, subscribes
to ``Page`` / ``Runtime`` / ``Target`` events on every attached session
(top-level page and every OOPIF / worker target that auto-attaches), and
surfaces observable state â€” pending dialogs and frame tree â€” through a
thread-safe snapshot object that tool handlers consume synchronously.

The supervisor is NOT in the agent's tool schema. Its output reaches the
agent via two channels:

1. ``browser_snapshot`` merges supervisor state into its return payload
   (see ``tools/browser_tool.py``).
2. ``browser_dialog`` tool responds to a pending dialog by calling
   ``respond_to_dialog()`` on the active supervisor.

Design spec: ``website/docs/developer-guide/browser-supervisor.md``.
é    )ÚannotationsN)Ú	dataclass)ÚAnyÚDictÚListÚOptionalÚTupleÚTYPE_CHECKING)ÚClientConnectionÚexcÚobjectÚreturnÚstrc                ób   — 	 ddl m}  |t          | ¦  «        ¦  «        S # t          $ r Y dS w xY w)uK  Redact any CDP endpoint credentials from an error's string form.

    ``websockets`` bakes the raw target URL into its exception messages
    (``InvalidURI``, connection errors, TLS failures all embed the full
    ``self.cdp_url`` â€” including a ``?token=`` query credential or
    ``user:pass@`` userinfo). Every supervisor egress point that turns such an
    exception into log text or a re-raised message MUST route through here so
    those credentials never reach Hermes logs or tracebacks. Falls back to a
    fixed sentinel if redaction itself raises, erring toward masking.
    r   ©Úredact_cdp_urlz<error redacted>)Úagent.redactr   r   Ú	Exception)r   r   s     ú>/home/ragecks/.hermes/hermes-agent/tools/browser_supervisor.pyÚ_redact_cdp_error_textr   )   sS   € ð"Ø/Ð/Ð/Ð/Ð/Ð/àˆ~�c #™hœhÑ'Ô'Ð'øÝð "ð "ð "Ø!Ð!Ð!ð"øøøs   ‚   
.­.Úvaluec                ó(   — ddl m}  || d¬¦  «        S )zARedact page-originated text before exposing supervisor snapshots.r   )Úredact_sensitive_textT)Úforce)r   r   )r   r   s     r   Ú_redact_supervisor_textr   <   s*   € à2Ð2Ð2Ð2Ð2Ð2à Ð  ¨dÐ3Ñ3Ô3Ð3ó    Úmust_respondÚauto_dismissÚauto_acceptg     Àr@é   é   é2   é   zhermes-dialog-bridge.invalidzhttp://z/*u.  
(() => {
  if (window.__hermesDialogBridgeInstalled) return;
  window.__hermesDialogBridgeInstalled = true;
  const ENDPOINT = "http://hermes-dialog-bridge.invalid/";
  function ask(kind, message, defaultPrompt) {
    try {
      const xhr = new XMLHttpRequest();
      // Use GET with query params so we don't need to worry about request
      // body encoding in the Fetch interceptor.
      const params = new URLSearchParams({
        kind: String(kind || ""),
        message: String(message == null ? "" : message),
        default_prompt: String(defaultPrompt == null ? "" : defaultPrompt),
      });
      xhr.open("GET", ENDPOINT + "?" + params.toString(), false);  // sync
      xhr.send(null);
      if (xhr.status !== 200) return null;
      const body = xhr.responseText || "";
      let parsed;
      try { parsed = JSON.parse(body); } catch (e) { return null; }
      if (kind === "alert") return undefined;
      if (kind === "confirm") return Boolean(parsed && parsed.accept);
      if (kind === "prompt") {
        if (!parsed || !parsed.accept) return null;
        return parsed.prompt_text == null ? "" : String(parsed.prompt_text);
      }
      return null;
    } catch (e) {
      // If the bridge is unreachable, fall back to the native call so the
      // page still sees *some* behavior (the backend will auto-dismiss).
      return null;
    }
  }
  const realAlert   = window.alert;
  const realConfirm = window.confirm;
  const realPrompt  = window.prompt;
  window.alert   = function(message) { ask("alert",   message, ""); };
  window.confirm = function(message) {
    const r = ask("confirm", message, "");
    return r === null ? false : Boolean(r);
  };
  window.prompt  = function(message, def) {
    const r = ask("prompt", message, def == null ? "" : def);
    return r === null ? null : String(r);
  };
  // onbeforeunload â€” we can't really synchronously prompt the user from this
  // event without racing navigation.  Leave native behavior for now; the
  // supervisor's native-dialog fallback path still surfaces them in
  // recent_dialogs.
})();
c                  ót   — 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
Zded<   d
Zded<   dd„Zd
S )ÚPendingDialogz3A JS dialog currently open on some frame's session.r   ÚidÚtypeÚmessageÚdefault_promptÚfloatÚ	opened_atÚcdp_session_idNúOptional[str]Úframe_idÚbridge_request_idr   úDict[str, Any]c                ó„   — | j         | j        t          | j        ¦  «        t          | j        ¦  «        | j        | j        dœS )N)r&   r'   r(   r)   r+   r.   )r&   r'   r   r(   r)   r+   r.   ©Úselfs    r   Úto_dictzPendingDialog.to_dict°   s@   € à”'Ø”IÝ.¨t¬|Ñ<Ô<Ý5°dÔ6IÑJÔJØœØœð
ð 
ð 	
r   ©r   r0   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r.   r/   r4   © r   r   r%   r%       s”   € € € € € € à=Ð=à€G€G�GØ€I€I�IØ€L€L�LØÐÐÑØÐÐÑØÐÐÑØ"€HÐ"Ð"Ð"Ñ"ð (,ÐÐ+Ð+Ð+Ñ+ð
ð 
ð 
ð 
ð 
ð 
r   r%   c                  óf   — 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
Zded<   dd„Zd
S )ÚDialogRecorda  A historical record of a dialog that was opened and then handled.

    Retained in ``recent_dialogs`` for a short window so agents on backends
    that auto-dismiss dialogs server-side (Browserbase) can still observe
    that a dialog fired, even though they couldn't respond to it.
    r   r&   r'   r(   r*   r+   Ú	closed_atÚ	closed_byNr-   r.   r   r0   c                óv   — | j         | j        t          | j        ¦  «        | j        | j        | j        | j        dœS )N©r&   r'   r(   r+   r>   r?   r.   )r&   r'   r   r(   r+   r>   r?   r.   r2   s    r   r4   zDialogRecord.to_dictÌ   s<   € à”'Ø”IÝ.¨t¬|Ñ<Ô<ØœØœØœØœð
ð 
ð 	
r   r5   )r6   r7   r8   r9   r:   r.   r4   r;   r   r   r=   r=   »   sƒ   € € € € € € ðð ð €G€G�GØ€I€I�IØ€L€L�LØÐÐÑØÐÐÑØ€N€N�NØ"€HÐ"Ð"Ð"Ñ"ð	
ð 	
ð 	
ð 	
ð 	
ð 	
r   r=   c                  ój   — e Zd ZU dZded<   ded<   ded<   ded<   ded	<   d
Zded<   dZded<   dd„Zd
S )Ú	FrameInfoa  One frame in the page's frame tree.

    ``is_oopif`` means the frame has its own CDP target (separate process,
    reachable via ``cdp_session_id``). Same-origin / srcdoc iframes share
    the parent process and have ``is_oopif=False`` + ``cdp_session_id=None``.
    r   r.   ÚurlÚoriginr-   Úparent_frame_idÚboolÚis_oopifNr,   Ú Únamer   r0   c                ó¢   — | j         | j        | j        | j        dœ}| j        r
| j        |d<   | j        r
| j        |d<   | j        r
| j        |d<   |S )N)r.   rD   rE   rH   Ú
session_idrF   rJ   )r.   rD   rE   rH   r,   rF   rJ   )r3   Úds     r   r4   zFrameInfo.to_dicté   sn   € àœØ”8Ø”kØœð	
ð 
ˆð Ôð 	2Ø"Ô1ˆAˆl‰OØÔð 	8Ø#'Ô#7ˆAÐÑ ØŒ9ð 	"Øœ	ˆAˆf‰IØˆr   r5   )r6   r7   r8   r9   r:   r,   rJ   r4   r;   r   r   rC   rC   Ø   s„   € € € € € € ðð ð €M€M�MØ€H€H�HØ€K€K�KØ"Ð"Ð"Ñ"Ø€N€N�NØ$(€NÐ(Ð(Ð(Ñ(Ø€D€N€N€N�Nðð ð ð ð ð r   rC   c                  ó@   — e Zd ZU dZded<   ded<   ded<   dZded	<   dS )
ÚConsoleEventz2Ring buffer entry for console + exception traffic.r*   Útsr   ÚlevelÚtextNr-   rD   )r6   r7   r8   r9   r:   rD   r;   r   r   rO   rO   ù   sD   € € € € € € à<Ð<à€I€I�IØ€J€J�JØ€I€I�IØ€CÐÐÐÑÐÐr   rO   T)Úfrozenc                  ób   — 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ed<   dd„ZdS )ÚSupervisorSnapshotz Read-only snapshot of supervisor state.

    Frozen dataclass so tool handlers can freely dereference without
    worrying about mutation under their feet.
    zTuple[PendingDialog, ...]Úpending_dialogszTuple[DialogRecord, ...]Úrecent_dialogsr0   Ú
frame_treezTuple[ConsoleEvent, ...]Úconsole_errorsrG   Úactiver   Úcdp_urlÚtask_idr   c                ón   — d„ | j         D ¦   «         | j        dœ}| j        rd„ | j        D ¦   «         |d<   |S )z7Serialize for inclusion in ``browser_snapshot`` output.c                ó6   — g | ]}|                      ¦   «         ‘ŒS r;   ©r4   ©Ú.0rM   s     r   ú
<listcomp>z.SupervisorSnapshot.to_dict.<locals>.<listcomp>  s    € ÐJÐJÐJ° §	¢	¡¤ÐJÐJÐJr   )rV   rX   c                ó6   — g | ]}|                      ¦   «         ‘ŒS r;   r_   r`   s     r   rb   z.SupervisorSnapshot.to_dict.<locals>.<listcomp>  s    € Ð$NÐ$NÐ$N°Q Q§Y¢Y¡[¤[Ð$NÐ$NÐ$Nr   rW   )rV   rX   rW   )r3   Úouts     r   r4   zSupervisorSnapshot.to_dict  sY   € ð  KÐJ°TÔ5IÐJÑJÔJØœ/ð
ð 
ˆð Ôð 	OØ$NÐ$N¸$Ô:MÐ$NÑ$NÔ$NˆCÐ Ñ!Øˆ
r   Nr5   )r6   r7   r8   r9   r:   r4   r;   r   r   rU   rU     s�   € € € € € € ðð ð /Ð.Ð.Ñ.Ø,Ð,Ð,Ñ,ØÐÐÑØ,Ð,Ð,Ñ,Ø€L€L�LØ€L€L�LØ€L€L�Lðð ð ð ð ð r   rU   c                  ó&  — e Zd ZdZeedœdEd„ZdFdGd„ZdHdGd„ZdId„Z	ddddœdJd„Z
ddddœdKd"„ZdLd#„ZdLd$„ZdLd%„ZdMd'„Z	 dNddd(œdOd,„ZdLd-„ZdPd.„ZdQd/„ZdRd3„ZdSd4„ZdTd6„ZdRd7„ZdQd8„ZdQd9„ZdRd:„ZdQd;„ZdQd<„ZdQd=„ZdUd>„ZdVd@„ZdUdA„Z dWdC„Z!dXdD„Z"dS )YÚCDPSupervisoru  One supervisor per (task_id, cdp_url) pair.

    Lifecycle:
      * ``start()`` â€” kicked off by ``SupervisorRegistry.get_or_start``; spawns
        a daemon thread running its own asyncio loop, connects the WebSocket,
        attaches to the first page target, enables domains, starts
        auto-attaching to child targets.
      * ``snapshot()`` â€” sync, thread-safe, called from tool handlers.
      * ``respond_to_dialog(action, ...)`` â€” sync bridge; schedules a coroutine
        on the supervisor's loop and waits (with timeout) for the CDP ack.
      * ``stop()`` â€” cancels task, closes WebSocket, joins thread.

    All CDP I/O lives on the supervisor's own loop. External callers never
    touch the loop directly; they go through the sync API above.
    )Údialog_policyÚdialog_timeout_sr\   r   r[   rg   rh   r*   r   ÚNonec               óø  — |t           vr't          d|›dt          t           ¦  «        › �¦  «        ‚|| _        || _        || _        t          |¦  «        | _        t          j	        ¦   «         | _
        i | _        g | _        i | _        g | _        d| _        d | _        d | _        t          j        ¦   «         | _        d | _        d| _        d| _        i | _        d | _        d | _        i | _        i | _        d| _        d S )NzInvalid dialog_policy z; must be one of Fé   r   )Ú_VALID_POLICIESÚ
ValueErrorÚsortedr\   r[   rg   r*   rh   Ú	threadingÚLockÚ_state_lockÚ_pending_dialogsÚ_recent_dialogsÚ_framesÚ_console_eventsÚ_activeÚ_loopÚ_threadÚEventÚ_ready_eventÚ_start_errorÚ_stop_requestedÚ_next_call_idÚ_pending_callsÚ_wsÚ_page_session_idÚ_child_sessionsÚ_dialog_watchdogsÚ_dialog_seq)r3   r\   r[   rg   rh   s        r   Ú__init__zCDPSupervisor.__init__2  s  € ð ¥Ð/Ð/Ýð<¨ð <ð <Ý"(­Ñ"9Ô"9ð<ð <ñô ð ð ˆŒØˆŒØ*ˆÔÝ %Ð&6Ñ 7Ô 7ˆÔõ %œ>Ñ+Ô+ˆÔØ:<ˆÔØ35ˆÔØ-/ˆŒØ35ˆÔØˆŒð ;?ˆŒ
Ø37ˆŒÝ%œOÑ-Ô-ˆÔØ59ˆÔØ$ˆÔð ˆÔØ9;ˆÔØ/3ˆŒØ/3ˆÔØ:<ˆÔð BDˆÔàˆÔÐÐr   ç      .@Útimeoutc                óŽ  — | j         r| j                              ¦   «         rdS | j                             ¦   «          d| _        d| _        t          j        | j        d| j	        › �d¬¦  «        | _         | j          
                    ¦   «          | j                             |¬¦  «        s\|                      ¦   «          	 ddlm}  || j        ¦  «        }n# t           $ r d	}Y nw xY wt#          d
|› d|dd…         › d�¦  «        ‚| j        �;| j        }|                      ¦   «          t%          dt'          |¦  «        › �¦  «        d‚dS )u[  Launch the background loop and wait until attachment is complete.

        Raises whatever exception attach failed with (connect error, bad
        WebSocket URL, CDP domain enable failure, etc.). On success, the
        supervisor is fully wired up â€” pending-dialog events will be captured
        as of the moment ``start()`` returns.
        NFzcdp-supervisor-T)ÚtargetrJ   Údaemon©r†   r   r   z<cdp_url redacted>z%CDP supervisor did not attach within zs (cdp_url=éP   z...)z CDP supervisor failed to start: )rx   Úis_aliverz   Úclearr{   r|   ro   ÚThreadÚ_thread_mainr\   ÚstartÚwaitÚstopr   r   r[   r   ÚTimeoutErrorÚRuntimeErrorr   )r3   r†   r   Ú	_safe_urlÚerrs        r   r�   zCDPSupervisor.starta  s™  € ð Œ<ð 	˜DœL×1Ò1Ñ3Ô3ð 	ØˆFØÔ×ÒÑ!Ô!Ð!Ø ˆÔØ$ˆÔÝ Ô'ØÔ$Ø1 4¤<Ð1Ð1Øð
ñ 
ô 
ˆŒð
 	Œ×ÒÑÔÐØÔ ×%Ò%¨gÐ%Ñ6Ô6ð 
	Ø�IŠI‰KŒKˆKð1Ø7Ð7Ð7Ð7Ð7Ð7Ø*˜N¨4¬<Ñ8Ô8�	�	øÝð 1ð 1ð 1Ø0�	�	�	ð1øøøåð1¸ð 1ð 1Ø% c r cœNð1ð 1ð 1ñô ð ð ÔÐ(ØÔ#ˆCØ�IŠI‰KŒKˆKõ ØPÕ3IÈ#Ñ3NÔ3NÐPÐPñô àðð )Ð(s   Â<C ÃC"Ã!C"ç      @c                ó˜  ‡ — d‰ _         ‰ j        }|�o|                     ¦   «         r[ˆ fd„}	 ddlm}  | |¦   «         |¦  «        }|�(	 |                     d¬¦  «         n# t          $ r Y nw xY wn# t          $ r Y nw xY w‰ j        �‰ j         	                    |¬¦  «         ‰ j
        5  d‰ _        ddd¦  «         dS # 1 swxY w Y   dS )	z/Cancel the supervisor task and join the thread.TNc               “  óˆ   •K  — ‰j         } d ‰_         | �.	 |                      ¦   «         ƒ d {V —† d S # t          $ r Y d S w xY wd S ©N)r   Úcloser   )Úwsr3   s    €r   Ú	_close_wsz%CDPSupervisor.stop.<locals>._close_ws“  sn   øè è € Ø”X�Ø�”Ø�>ðØ Ÿhšh™jœjÐ(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ð(øÝ$ð ð ð Ø˜˜ðøøøð "�>s   •1 ±
?¾?r   ©Úsafe_schedule_threadsafeg       @rŠ   F)r|   rw   Ú
is_runningÚagent.async_utilsrŸ   Úresultr   r”   rx   Újoinrq   rv   )r3   r†   Úloopr�   rŸ   Úfuts   `     r   r’   zCDPSupervisor.stop‹  sf  ø€ à#ˆÔØŒzˆØÐ §¢Ñ 1Ô 1Ððð ð ð ð ð	ØFÐFÐFÐFÐFÐFØ.Ð.¨y¨y©{¬{¸DÑAÔA�Ø�?ðØŸ
š
¨3˜
Ñ/Ô/Ð/Ð/øÝ$ð ð ð Ø˜ðøøøøøåð ð ð Ø�ðøøøàŒ<Ð#ØŒL×Ò gÐÑ.Ô.Ð.ØÔð 	!ð 	!Ø ˆDŒLð	!ð 	!ð 	!ñ 	!ô 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!øøøð 	!ð 	!ð 	!ð 	!ð 	!ð 	!sG   ¬A1 Á	A  ÁA1 Á 
A-Á*A1 Á,A-Á-A1 Á1
A>Á=A>Â*B?Â?CÃCrU   c           	     óŠ  — | j         5  t          | j                             ¦   «         ¦  «        }t          | j        t
           d…         ¦  «        }|                      ¦   «         }t          | j        t           d…         ¦  «        }| j	        }ddd¦  «         n# 1 swxY w Y   t          |||||| j        | j        ¬¦  «        S )z.Return an immutable snapshot of current state.N)rV   rW   rX   rY   rZ   r[   r\   )rq   Útuplerr   Úvaluesrs   ÚRECENT_DIALOGS_MAXÚ_build_frame_tree_lockedru   ÚCONSOLE_HISTORY_MAXrv   rU   r[   r\   )r3   ÚdialogsÚrecentÚframes_treeÚconsolerZ   s         r   ÚsnapshotzCDPSupervisor.snapshot«  s  € àÔð 	"ð 	"Ý˜DÔ1×8Ò8Ñ:Ô:Ñ;Ô;ˆGÝ˜4Ô/Õ1CÐ0CÐ0DÐ0DÔEÑFÔFˆFØ×7Ò7Ñ9Ô9ˆKÝ˜DÔ0Õ2EÐ1EÐ1FÐ1FÔGÑHÔHˆGØ”\ˆFð	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"õ "Ø#Ø!Ø"Ø"ØØ”LØ”Lð
ñ 
ô 
ð 	
s   ˆBBÂBÂ!BNç      $@)Úprompt_textÚ	dialog_idr†   Úactionr²   r-   r³   r0   c               óZ  ‡ ‡‡‡— ‰dvrdd‰›�dœS ‰ j         5  ‰ j        sdddœcddd¦  «         S t          ‰ j                             ¦   «         ¦  «        }|sdddœcddd¦  «         S |rG‰ j                             |¦  «        }|€*dd|›d	t          ‰ j        ¦  «        › d
�dœcddd¦  «         S nHt          |¦  «        dk    r-dt          |¦  «        › dd„ |D ¦   «         › �dœcddd¦  «         S |d         }|Šddd¦  «         n# 1 swxY w Y   ‰ j        }|€dddœS ˆˆˆ ˆfd„}	 ddl	m
}	  |	 |¦   «         |¦  «        }
|
€dddœS |
                     |¬¦  «         n3# t          $ r&}dt          |¦  «        j        › d|› �dœcY d}~S d}~ww xY wd‰                     ¦   «         dœS )a  Accept/dismiss a pending dialog. Sync bridge onto the supervisor loop.

        Returns ``{"ok": True, "dialog": {...}}`` on success,
        ``{"ok": False, "error": "..."}`` on a recoverable error (no dialog,
        ambiguous dialog_id, supervisor inactive).
        >   ÚacceptÚdismissFz*action must be 'accept' or 'dismiss', got ©ÚokÚerrorúsupervisor is not activeNzno dialog is currently openz
dialog_id z not found (known: ú)rk   z1 pending dialogs; specify dialog_id. Candidates: c                ó   — g | ]	}|j         ‘Œ
S r;   )r&   r`   s     r   rb   z3CDPSupervisor.respond_to_dialog.<locals>.<listcomp>á  s   € Ð'>Ð'>Ð'>°¨¬Ð'>Ð'>Ð'>r   r   úsupervisor loop is not runningc               “  óP   •K  — ‰                      ‰‰ dk    ‰pd¬¦  «        ƒ d {V —†S )Nr¶   rI   ©r¶   r²   )Ú_handle_dialog_cdp)r´   r²   r3   Úsnapshot_copys   €€€€r   Ú_do_respondz4CDPSupervisor.respond_to_dialog.<locals>._do_respondì  sT   øè è € Ø×0Ò0Ø v°Ò'9ÈÐHYÐWYð 1ñ ô ð ð ð ð ð ð ð r   rž   ú#Browser supervisor loop unavailablerŠ   ú: T)r¹   Údialog)rq   rv   Úlistrr   r¨   Úgetrn   Úlenrw   r¡   rŸ   r¢   r   r'   r6   r4   )r3   r´   r²   r³   r†   ÚpendingrÆ   r¤   rÃ   rŸ   r¥   ÚerÂ   s   ```         @r   Úrespond_to_dialogzCDPSupervisor.respond_to_dialog½  sR  øøøø€ ð Ð.Ð.Ð.ØÐ*aÐW]Ð*aÐ*aÐbÐbÐbàÔð 	#ð 	#Ø”<ð JØ#Ð.HÐIÐIð	#ð 	#ð 	#ð 	#ñ 	#ô 	#ð 	#ð 	#õ ˜4Ô0×7Ò7Ñ9Ô9Ñ:Ô:ˆGØð MØ#Ð.KÐLÐLð	#ð 	#ð 	#ð 	#ñ 	#ô 	#ð 	#ð 	#ð ð $ØÔ.×2Ò2°9Ñ=Ô=�Ø�>à#ð"D¨ið "Dð "DÝ#)¨$Ô*?Ñ#@Ô#@ð"Dð "Dð "Dðð ð	#ð 	#ð 	#ð 	#ñ 	#ô 	#ð 	#ð 	#ð "õ �W‘” Ò!Ð!àå˜w™<œ<ð Að AØ'>Ð'>°gÐ'>Ñ'>Ô'>ðAð Aðð ð	#ð 	#ð 	#ð 	#ñ 	#ô 	#ð 	#ð 	#ð. ! œ�Ø"ˆMð1	#ð 	#ð 	#ñ 	#ô 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#øøøð 	#ð 	#ð 	#ð 	#ð4 ŒzˆØˆ<ØÐ*JÐKÐKÐKð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð
	FØBÐBÐBÐBÐBÐBØ*Ð*¨;¨;©=¬=¸$Ñ?Ô?ˆCØˆ{Ø#Ð.SÐTÐTÐTØ�JŠJ˜wˆJÑ'Ô'Ð'Ð'øÝð 	Fð 	Fð 	FØ­T°!©W¬WÔ-=Ð*DÐ*DÀÐ*DÐ*DÐEÐEÐEÐEÐEÐEÐEÐEøøøøð	Føøøà m×&;Ò&;Ñ&=Ô&=Ð>Ð>Ð>sL   ˜D	±,D	Á*;D	Â24D	Ã3
D	Ä	DÄDÄ+ E# ÅE# Å#
FÅ-FÆFÆFT)Úreturn_by_valueÚawait_promiser†   Ú
expressionrÍ   rG   rÎ   c               ó~  ‡ ‡‡‡‡‡‡‡— ‰ j         Š‰�‰                     ¦   «         sdddœS ‰ j        5  ‰ j        sdddœcddd¦  «         S ‰ j        Šddd¦  «         n# 1 swxY w Y   ‰sdddœS dˆˆˆ ˆˆfd„ŠddlmŠ dˆˆˆˆfd„}	  ||¦  «        }n¢# t          $ r•}|rhdt          |¦  «         	                    ¦   «         v rE	  |d¦  «        }nY# t          $ r+}dt          |¦  «        j        › d|› �dœcY d}~cY d}~S d}~ww xY wdt          |¦  «        j        › d|› �dœcY d}~S Y d}~nd}~ww xY wt          |t          ¦  «        r|                     di ¦  «        ni }	|	                     d¦  «        }
|
rQ|
                     d¦  «        pd}|
                     d¦  «        pi }|                     d¦  «        }|r|› d|› �}d|dœS |	                     di ¦  «        }|                     dd¦  «        }d|v r	|d         }n3|dk    rd}n*|                     d¦  «        p|                     d¦  «        }d||dœS )uþ  Evaluate ``expression`` in the page's Runtime context over the live WS.

        Reuses the supervisor's already-connected WebSocket â€” zero subprocess
        startup cost vs the agent-browser CLI ``eval`` command (which does
        fork+exec+Node-startup+CDP-setup on every call).

        Returns a dict shaped like ``{"ok": True, "result": <value>, "result_type": "..."}``
        on success, or ``{"ok": False, "error": "..."}`` on failure.

        ``return_by_value=True`` asks the browser to JSON-serialize the result
        before sending it back, matching DevTools-console semantics for
        primitive / plain-object expressions. For DOM nodes or non-serializable
        objects, the browser returns a description string in ``result_type``.
        NFr¾   r¸   r»   z'supervisor has no attached page sessionÚby_valuerG   r   r0   c              “  óP   •K  — ‰                      d‰| ‰ddœ‰‰¬¦  «        ƒ d {V —†S )NúRuntime.evaluateT)rÏ   ÚreturnByValueÚawaitPromiseÚuserGesture©rL   r†   )Ú_cdp)rÑ   rÎ   rÏ   r3   rL   r†   s    €€€€€r   Ú_do_evalz0CDPSupervisor.evaluate_runtime.<locals>._do_eval  sc   øè è € ØŸšØ"à",Ø%-Ø$1ð $(ðð ð &Øð #ñ ô ð ð ð ð ð ð ð r   r   rž   c                ó‚   •—  ‰ ‰| ¦  «        ‰¦  «        }|€t          d¦  «        ‚|                     ‰dz   ¬¦  «        S )NrÄ   rk   rŠ   )r”   r¢   )rÑ   r¥   rÙ   r¤   rŸ   r†   s     €€€€r   Ú	_run_evalz1CDPSupervisor.evaluate_runtime.<locals>._run_eval.  sK   ø€ Ø*Ð*¨8¨8°HÑ+=Ô+=¸tÑDÔDˆCØˆ{Ý"Ð#HÑIÔIÐIØ—:’: g°¡k�:Ñ2Ô2Ð2r   zreference chain is too longrÅ   r¢   ÚexceptionDetailsrR   zJavaScript exceptionÚ	exceptionÚdescriptionr'   Ú	undefinedr   ÚunserializableValueT)r¹   r¢   Úresult_type)rÑ   rG   r   r0   )rw   r    rq   rv   r€   r¡   rŸ   r   r   Úlowerr'   r6   Ú
isinstanceÚdictrÈ   )r3   rÏ   rÍ   rÎ   r†   rÛ   Úresponser   Úexc2Úresult_payloadÚexception_detailsÚexc_textÚexc_objrÞ   Ú
result_objrá   r   rÙ   r¤   rŸ   rL   s   `` ``            @@@@r   Úevaluate_runtimezCDPSupervisor.evaluate_runtimeû  sÂ  øøøøøøøø€ ð, ŒzˆØˆ<˜tŸšÑ0Ô0ˆ<ØÐ*JÐKÐKÐKàÔð 	/ð 	/Ø”<ð JØ#Ð.HÐIÐIð	/ð 	/ð 	/ð 	/ñ 	/ô 	/ð 	/ð 	/ð Ô.ˆJð	/ð 	/ð 	/ñ 	/ô 	/ð 	/ð 	/ð 	/ð 	/ð 	/ð 	/øøøð 	/ð 	/ð 	/ð 	/ð
 ð 	UØÐ*SÐTÐTÐTð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	?Ð>Ð>Ð>Ð>Ð>ð	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð	NØ �y Ñ1Ô1ˆHˆHøÝð 	Nð 	Nð 	Nð ð NÐ#@ÅCÈÁHÄHÇNÂNÑDTÔDTÐ#TÐ#TðTØ(˜y¨Ñ/Ô/�H�HøÝ ð Tð Tð TØ"'µT¸$±Z´ZÔ5HÐ2RÐ2RÈDÐ2RÐ2RÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSøøøøðTøøøð $µ°c±´Ô1CÐ.LÐ.LÀsÐ.LÐ.LÐMÐMÐMÐMÐMÐMÐMÐMð	 �H�H�H�Høøøøð	Nøøøõ( 8BÀ(ÍDÑ7QÔ7QÐY˜Ÿš h°Ñ3Ô3Ð3ÐWYˆØ*×.Ò.Ð/AÑBÔBÐØð 	4à(×,Ò,¨VÑ4Ô4ÐNÐ8NˆHØ'×+Ò+¨KÑ8Ô8Ð>¸BˆGØ!Ÿ+š+ mÑ4Ô4ˆKØð 8Ø&Ð7Ð7¨+Ð7Ð7�Ø¨(Ð3Ð3Ð3à#×'Ò'¨°"Ñ5Ô5ˆ
Ø —n’n V¨[Ñ9Ô9ˆà�jÐ Ð Ø˜wÔ'ˆEˆEØ˜KÒ'Ð'ØˆEˆEð —N’N =Ñ1Ô1ÐZ°Z·^²^ÐDYÑ5ZÔ5ZˆEà e¸KÐHÐHÐHsk   ²AÁAÁA"Á%A"Â
B Â
D5Â %D0ÃCÃD0Ã
DÃDÃ7DÃ8D0Ã<D5ÄDÄD0Ä%D5Ä0D5c           	     ó�  — t          j        ¦   «         }|| _        	 t          j        |¦  «         |                     |                      ¦   «         ¦  «         nr# t          $ re}| j                             ¦   «         s!|| _	        | j         
                    ¦   «          n!t                               d| j        |¦  «         Y d}~nd}~ww xY w	 d„ t          j        |¦  «        D ¦   «         }|D ]}|                     ¦   «          Œ|r$|                     t          j        |ddiŽ¦  «         n# t"          $ r Y nw xY w	 |                     ¦   «          n# t"          $ r Y nw xY w| j        5  d| _        ddd¦  «         dS # 1 swxY w Y   dS # 	 d„ t          j        |¦  «        D ¦   «         }|D ]}|                     ¦   «          Œ|r$|                     t          j        |ddiŽ¦  «         n# t"          $ r Y nw xY w	 |                     ¦   «          n# t"          $ r Y nw xY w| j        5  d| _        ddd¦  «         w # 1 swxY w Y   w xY w)z2Entry point for the supervisor's dedicated thread.zCDP supervisor %s crashed: %sNc                ó:   — g | ]}|                      ¦   «         °|‘ŒS r;   )Údone©ra   Úts     r   rb   z.CDPSupervisor._thread_main.<locals>.<listcomp>v  s%   € ÐNÐNÐN ÀQÇVÂVÁXÄXÐN˜1ÐNÐNÐNr   Úreturn_exceptionsTF)ÚasyncioÚnew_event_looprw   Úset_event_loopÚrun_until_completeÚ_runÚBaseExceptionrz   Úis_setr{   ÚsetÚloggerÚwarningr\   Ú	all_tasksÚcancelÚgatherr   r›   rq   rv   )r3   r¤   rË   rÊ   rñ   s        r   r�   zCDPSupervisor._thread_maine  s-  € åÔ%Ñ'Ô'ˆØˆŒ
ð	%ÝÔ" 4Ñ(Ô(Ð(Ø×#Ò# D§I¢I¡K¤KÑ0Ô0Ð0Ð0øÝð 	Qð 	Qð 	QØÔ$×+Ò+Ñ-Ô-ð QØ$%�Ô!ØÔ!×%Ò%Ñ'Ô'Ð'Ð'å—’Ð>ÀÄÈaÑPÔPÐPøøøøøøøøøð	QøøøðØNÐN¥gÔ&7¸Ñ&=Ô&=ÐNÑNÔN�Ø ð ð �AØ—H’H‘J”J�J�JØð ^Ø×+Ò+­G¬N¸GÐ,\ÐW[Ð,\Ð,\Ñ]Ô]Ð]øøÝð ð ð Ø�ðøøøðØ—
’
‘”��øÝð ð ð Ø�ðøøøàÔ!ð %ð %Ø$�”ð%ð %ð %ñ %ô %ð %ð %ð %ð %ð %ð %ð %øøøð %ð %ð %ð %ð %ð %øðØNÐN¥gÔ&7¸Ñ&=Ô&=ÐNÑNÔN�Ø ð ð �AØ—H’H‘J”J�J�JØð ^Ø×+Ò+­G¬N¸GÐ,\ÐW[Ð,\Ð,\Ñ]Ô]Ð]øøÝð ð ð Ø�ðøøøðØ—
’
‘”��øÝð ð ð Ø�ðøøøàÔ!ð %ð %Ø$�”ð%ð %ð %ñ %ô %ð %ð %ð %ð %ð %ð %øøøð %ð %ð %ð %ð %øøøsÔ   œ;A ÁF Á
CÁ"ACÂ=F ÃCÃF ÃAD) Ä)
D6Ä5D6Ä:E Å
EÅEÅ&E;Å;E?ÆE?ÆIÆ
AG(Ç'IÇ(
G5Ç2IÇ4G5Ç5IÇ9HÈIÈ
HÈIÈHÈ
IÈ%H9È-IÈ9H=È=IÉ H=ÉIc           	   ƒ  óú	  K  — d}d}d}ddl }| j        �sæ	 t          j        |                     | j        d¬¦  «        d¬¦  «        ƒ d{V —†| _        nÆ# t          $ r¹}|d	z  }| j         	                    ¦   «         s&|| _
        | j                             ¦   «          Y d}~dS t                               d
| j        |t          |¦  «        ¦  «         t          j        t#          |d¦  «        ¦  «        ƒ d{V —† t#          |dz  d¦  «        }Y d}~�Œd}~ww xY wt          j        |                      ¦   «         d¬¦  «        }	 d| _        | j                             ¦   «          |                      ¦   «         ƒ d{V —† | j        5  d| _        ddd¦  «         n# 1 swxY w Y   t5          j        ¦   «         }d}| j         	                    ¦   «         s| j                             ¦   «          |ƒ d{V —† n”# t6          $ r‡}| j         	                    ¦   «         s!|| _
        | j                             ¦   «          ‚ t                               d| j        t5          j        ¦   «         |z
  t          |¦  «        ¦  «         Y d}~nd}~ww xY w| j        5  d| _        ddd¦  «         n# 1 swxY w Y   |                     ¦   «         s:|                     ¦   «          	 |ƒ d{V —† n# t          j        t          f$ r Y nw xY wt?          | j          !                    ¦   «         ¦  «        D ]}|                     ¦   «          Œ| j                              ¦   «          | j        }d| _        |�.	 | "                    ¦   «         ƒ d{V —† �n# t          $ r Y �nw xY w�n# | j        5  d| _        ddd¦  «         n# 1 swxY w Y   |                     ¦   «         s:|                     ¦   «          	 |ƒ d{V —† n# t          j        t          f$ r Y nw xY wt?          | j          !                    ¦   «         ¦  «        D ]}|                     ¦   «          Œ| j                              ¦   «          | j        }d| _        |�,	 | "                    ¦   «         ƒ d{V —† w # t          $ r Y w w xY ww xY w| j        rdS t           #                    d| j        |¦  «         t          j        |¦  «        ƒ d{V —† t#          |dz  d¦  «        }| j        �¯ädS dS )u’  Top-level supervisor coroutine.

        Holds a reconnecting loop so we survive the remote closing the
        WebSocket â€” Browserbase in particular tears down the CDP socket
        every time a short-lived client (e.g. agent-browser's per-command
        CDP client) disconnects.  We drop our state snapshot keys that
        depend on specific CDP session ids, re-attach, and keep going.
        r   g        g      à?Ni   )Úmax_sizer±   rŠ   rk   z2CDP supervisor %s: connect failed (attempt %s): %sr!   z
cdp-reader)rJ   Tz2CDP supervisor %s: session dropped after %.1fs: %sFz+CDP supervisor %s: reconnecting in %.1fs...)$Ú
websocketsr|   ró   Úwait_forÚconnectr[   r   r   rz   rù   r{   rú   rû   rü   r\   r   ÚsleepÚminÚcreate_taskÚ
_read_loopr€   r�   r�   Ú_attach_initial_pagerq   rv   Útimerø   rï   rþ   ÚCancelledErrorrÇ   r‚   r¨   r›   Údebug)	r3   ÚattemptÚlast_success_atÚbackoffr  rË   Úreader_taskÚhandlerœ   s	            r   r÷   zCDPSupervisor._run„  sË  è è € ð ˆØˆØˆØÐÐÐØÔ&ñ R	-ðÝ!(Ô!1Ø×&Ò& t¤|Ð>NÐ&ÑOÔOØ ð"ñ "ô "ð ð ð ð ð ð �”�øõ ð ð ð Ø˜1‘�ØÔ(×/Ò/Ñ1Ô1ð à()�DÔ%ØÔ%×)Ò)Ñ+Ô+Ð+Ø�F�F�F�F�FÝ—’ØHØ”L 'Õ+AÀ!Ñ+DÔ+Dñô ð õ ”m¥C¨°Ñ$6Ô$6Ñ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ý˜g¨™k¨4Ñ0Ô0�Ø���‘øøøøðøøøõ "Ô-¨d¯oªoÑ.?Ô.?ÀlÐSÑSÔSˆKð2ð )-�Ô%ØÔ$×*Ò*Ñ,Ô,Ð,ð ×/Ò/Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1Ð1ØÔ%ð (ð (Ø#'�D”Lð(ð (ð (ñ (ô (ð (ð (ð (ð (ð (ð (øøøð (ð (ð (ð (å"&¤)¡+¤+�Ø�ØÔ(×/Ò/Ñ1Ô1ð ,ØÔ%×)Ò)Ñ+Ô+Ð+à!Ð!Ð!Ð!Ð!Ð!Ð!Ð!Ð!øÝ ð ð ð ØÔ(×/Ò/Ñ1Ô1ð à()�DÔ%ØÔ%×)Ò)Ñ+Ô+Ð+ØÝ—’ØHØ”LÝ”I‘K”K /Ñ1Ý*¨1Ñ-Ô-ñ	ô ð ð ð ð ð ð øøøøðøøøð Ô%ð )ð )Ø#(�D”Lð)ð )ð )ñ )ô )ð )ð )ð )ð )ð )ð )øøøð )ð )ð )ð )à"×'Ò'Ñ)Ô)ð Ø×&Ò&Ñ(Ô(Ð(ðØ)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)øÝ#Ô2µIÐ>ð ð ð Ø˜ðøøøå" 4Ô#9×#@Ò#@Ñ#BÔ#BÑCÔCð $ð $�FØ—M’M‘O”O�O�OØÔ&×,Ò,Ñ.Ô.Ð.Ø”X�Ø�”Ø�>ðØ Ÿhšh™jœjÐ(Ð(Ð(Ð(Ð(Ð(Ð(Ñ(øÝ$ð ð ð Ø™ðøøøñ "øð Ô%ð )ð )Ø#(�D”Lð)ð )ð )ñ )ô )ð )ð )ð )ð )ð )ð )øøøð )ð )ð )ð )à"×'Ò'Ñ)Ô)ð Ø×&Ò&Ñ(Ô(Ð(ðØ)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)øÝ#Ô2µIÐ>ð ð ð Ø˜ðøøøå" 4Ô#9×#@Ò#@Ñ#BÔ#BÑCÔCð $ð $�FØ—M’M‘O”O�O�OØÔ&×,Ò,Ñ.Ô.Ð.Ø”X�Ø�”Ø�>ðØ Ÿhšh™jœjÐ(Ð(Ð(Ð(Ð(Ð(Ð(Ð(øÝ$ð ð ð Ø˜ðøøøð "øøøð Ô#ð Ø�õ �LŠLØ=¸t¼|ÈWñô ð õ ”- Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ý˜' A™+ tÑ,Ô,ˆGðe Ô&ñ R	-ð R	-ð R	-ð R	-ð R	-s  –;A Á
DÁ>DÂ A*DÄDÅAG1 ÆFÆ
G1 ÆFÆG1 ÆFÆAG1 Ç0N Ç1
JÇ;A=I=É8N É=JÊN ÊJ Ê J$Ê'J$ËK ËK6Ë5K6Í M< Í<
N
Î	N
ÎRÎN+ÎRÎ+N/Î/RÎ2N/Î3+RÏO(Ï'RÏ(PÏ>RÐ PÐA)RÑ+RÒRÒ
RÒRÒRÒRc              ƒ  ó°  K  — |                       d¦  «        ƒ d{V —†}|                     di ¦  «                             dg ¦  «        }t          d„ |D ¦   «         d¦  «        }|€-|                       dddi¦  «        ƒ d{V —†}|d         d	         }n|d	         }|                       d
|ddœ¦  «        ƒ d{V —†}|d         d         | _        |                       d| j        ¬¦  «        ƒ d{V —† |                       d| j        ¬¦  «        ƒ d{V —† |                       dddddœ| j        ¬¦  «        ƒ d{V —† |                      | j        ¦  «        ƒ d{V —† dS )zTFind a page target, attach flattened session, enable domains, install dialog bridge.zTarget.getTargetsNr¢   ÚtargetInfosc              3  óL   K  — | ]}|                      d ¦  «        dk    ¯|V — Œ dS )r'   ÚpageN©rÈ   rð   s     r   ú	<genexpr>z5CDPSupervisor._attach_initial_page.<locals>.<genexpr>é  s6   è è € ÐJÐJ !°!·%²%¸±-´-À6Ò2IÐ2I˜AÐ2IÐ2IÐ2IÐ2IÐJÐJr   zTarget.createTargetrD   zabout:blankÚtargetIdzTarget.attachToTargetT)r  ÚflattenÚ	sessionIdúPage.enable)rL   úRuntime.enableúTarget.setAutoAttachF©Ú
autoAttachÚwaitForDebuggerOnStartr  )rØ   rÈ   Únextr€   Ú_install_dialog_bridge)r3   ÚrespÚtargetsÚpage_targetÚcreatedÚ	target_idÚattachs          r   r	  z"CDPSupervisor._attach_initial_pageå  sá  è è € à—Y’YÐ2Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3ˆØ—(’(˜8 RÑ(Ô(×,Ò,¨]¸BÑ?Ô?ˆÝÐJÐJ wÐJÑJÔJÈDÑQÔQˆØÐØ ŸIšIÐ&;¸eÀ]Ð=SÑTÔTÐTÐTÐTÐTÐTÐTˆGØ Ô)¨*Ô5ˆIˆIà# JÔ/ˆIà—y’yØ#Ø"¨tÐ4Ð4ñ
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆð !' xÔ 0°Ô =ˆÔØ�iŠi˜°$Ô2GˆiÑHÔHÐHÐHÐHÐHÐHÐHÐHØ�iŠiÐ(°TÔ5JˆiÑKÔKÐKÐKÐKÐKÐKÐKÐKØ�iŠiØ"Ø¸5ÈTÐRÐRØÔ,ð ñ 
ô 
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð ×)Ò)¨$Ô*?Ñ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@r   rL   c              ƒ  ó  K  — 	 |                       dt          ddœ|d¬¦  «        ƒ d{V —† n=# t          $ r0}t                               d|pddd	…         |¦  «         Y d}~nd}~ww xY w	 |                       d
t
          ddœgddœ|d¬¦  «        ƒ d{V —† n=# t          $ r0}t                               d|pddd	…         |¦  «         Y d}~nd}~ww xY w	 |                       dt          ddœ|d¬¦  «        ƒ d{V —† dS # t          $ r Y dS w xY w)u�  Install the dialog-bridge init script + Fetch interceptor on a session.

        Two CDP calls:
          1. ``Page.addScriptToEvaluateOnNewDocument`` â€” the JS override runs
             in every frame before any page script. Replaces alert/confirm/
             prompt with a sync XHR to our bridge URL.
          2. ``Fetch.enable`` scoped to the bridge URL â€” we catch those XHRs,
             surface them as pending dialogs, then fulfill once the agent
             responds.

        Idempotent at the CDP level: Chromium de-duplicates identical
        add-script calls by source, and Fetch.enable replaces prior patterns.
        z%Page.addScriptToEvaluateOnNewDocumentT)ÚsourceÚrunImmediatelyr—   r×   NzDdialog bridge: addScriptToEvaluateOnNewDocument failed on sid=%s: %srI   é   zFetch.enableÚRequest)Ú
urlPatternÚrequestStageF)ÚpatternsÚhandleAuthRequestsz0dialog bridge: Fetch.enable failed on sid=%s: %srÓ   )rÏ   rÔ   ç      @)rØ   Ú_DIALOG_BRIDGE_SCRIPTr   rû   r  ÚDIALOG_BRIDGE_URL_PATTERN)r3   rL   rË   s      r   r"  z$CDPSupervisor._install_dialog_bridge  s  è è € ð	Ø—)’)Ø7Ý0ÀDÐIÐIØ%Øð	 ñ ô ð ð ð ð ð ð ð ð øõ ð 	ð 	ð 	Ý�LŠLØVØÐ!˜r 3 B 3Ô'¨ñô ð ð ð ð ð ð øøøøð	øøøð
	Ø—)’)Øõ +DØ,5ðð ð!ð +0ðð ð &Øð ñ ô ð ð ð ð ð ð ð ð øõ ð 	ð 	ð 	Ý�LŠLØBØÐ!˜r 3 B 3Ô'¨ñô ð ð ð ð ð ð øøøøð	øøøð	Ø—)’)Ø"Ý4ÀtÐLÐLØ%Øð	 ñ ô ð ð ð ð ð ð ð ð ð øõ ð 	ð 	ð 	ØˆDˆDð	øøøs>   „', ¬
A&¶&A!Á!A&Á*+B Â
CÂ &CÃCÃ'C= Ã=
DÄ
Dr×   ÚmethodÚparamsúOptional[Dict[str, Any]]c             ƒ  óú  K  — | j         €t          d¦  «        ‚| j        }| xj        dz  c_        ||dœ}|r||d<   |r||d<   t          j        ¦   «                              ¦   «         }|| j        |<   | j                              t          j	        |¦  «        ¦  «        ƒ d{V —† 	 t          j
        ||¬¦  «        ƒ d{V —†	 | j                             |d¦  «         S # | j                             |d¦  «         w xY w)z*Send a CDP command and await its response.Nz%supervisor WebSocket is not connectedrk   )r&   r5  r6  r  rŠ   )r   r”   r}   ró   Úget_running_loopÚcreate_futurer~   ÚsendÚjsonÚdumpsr  Úpop)r3   r5  r6  rL   r†   Úcall_idÚpayloadr¥   s           r   rØ   zCDPSupervisor._cdp<  s+  è è € ð Œ8ÐÝÐFÑGÔGÐGØÔ$ˆØÐÔ˜aÑÐÔØ)0¸FÐ"CÐ"CˆØð 	'Ø &ˆG�HÑØð 	.Ø#-ˆG�KÑ Ý%Ô6Ñ8Ô8×FÒFÑHÔHˆØ'*ˆÔ˜GÑ$ØŒh�mŠm�DœJ wÑ/Ô/Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0ð	3Ý Ô)¨#°wÐ?Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?Ð?àÔ×#Ò# G¨TÑ2Ô2Ð2Ð2øˆDÔ×#Ò# G¨TÑ2Ô2Ð2Ð2øøøs   Â%C ÃC:c           
   ƒ  óê  K  — | j         €J ‚	 | j         2 3 d{V —†}| j        r dS 	 t          j        |¦  «        }n*# t          $ r t
                               d¦  «         Y ŒMw xY wd|v r†| j                             |d         d¦  «        }|�b| 	                    ¦   «         sNd|v r5| 
                    t          d|d         › d|d         › �¦  «        ¦  «         ŒÅ|                     |¦  «         ŒÛd|v rJ|                      |d         |                     di ¦  «        |                     d	¦  «        ¦  «        ƒ d{V —† �Œ+6 dS # t          $ r&}t
                               d
|¦  «         Y d}~dS d}~ww xY w)z*Continuously dispatch incoming CDP frames.Nz&CDP supervisor: non-JSON frame droppedr&   rº   zCDP error on id=rÅ   r5  r6  r  zCDP read loop exited: %s)r   r|   r<  Úloadsr   rû   r  r~   r>  rï   Úset_exceptionr”   Ú
set_resultÚ	_on_eventrÈ   )r3   ÚrawÚmsgr¥   rË   s        r   r  zCDPSupervisor._read_loopV  sÝ  è è € àŒxÐ#Ð#Ð#ð	8Ø!œXð eð eð eð eð eð eð e�cØÔ'ð Ø�E�EðÝœ* S™/œ/�C�CøÝ ð ð ð Ý—L’LÐ!IÑJÔJÐJØ�Hðøøøð ˜3�;�;ØÔ-×1Ò1°#°d´)¸TÑBÔB�CØ�¨s¯xªx©z¬z�Ø" c˜>˜>Ø×-Ò-Ý ,Ð-[ÀÀDÄ	Ð-[Ð-[ÈSÐQXÌ\Ð-[Ð-[Ñ \Ô \ñô ð ð ð  ŸNšN¨3Ñ/Ô/Ð/øØ �_�_ØŸ.š.¨¨X¬¸¿ºÀÈ"Ñ8MÔ8MÈsÏwÊwÐWbÑOcÔOcÑdÔdÐdÐdÐdÐdÐdÐdÐdùð% &˜X˜Xøõ& ð 	8ð 	8ð 	8Ý�LŠLÐ3°QÑ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7Ð7øøøøð	8øøøsB   �E ”D?š	E ¦;ºE »$A"ÁE Á!A"Á"CE Å
E2ÅE-Å-E2c              ƒ  ó’  K  — |dk    r|                       ||¦  «        ƒ d {V —† d S |dk    r|                      ||¦  «        ƒ d {V —† d S |dk    r|                      ||¦  «        ƒ d {V —† d S |dk    r|                      ||¦  «         d S |dk    r|                      ||¦  «         d S |dk    r|                      ||¦  «         d S |dk    r|                      |¦  «        ƒ d {V —† d S |dk    r|                      |¦  «         d S |d	k    r|                      |d
¬¦  «         d S |dk    r|                      |d¬¦  «         d S d S )NzPage.javascriptDialogOpeningzPage.javascriptDialogClosedzFetch.requestPausedzPage.frameAttachedzPage.frameNavigatedzPage.frameDetachedzTarget.attachedToTargetzTarget.detachedFromTargetzRuntime.consoleAPICalledÚapi)Ú
level_fromzRuntime.exceptionThrownrÝ   )	Ú_on_dialog_openingÚ_on_dialog_closedÚ_on_fetch_pausedÚ_on_frame_attachedÚ_on_frame_navigatedÚ_on_frame_detachedÚ_on_target_attachedÚ_on_target_detachedÚ_on_console)r3   r5  r6  rL   s       r   rE  zCDPSupervisor._on_eventr  sê  è è € ð Ð3Ò3Ð3Ø×)Ò)¨&°*Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=ØÐ4Ò4Ð4Ø×(Ò(¨°Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<ØÐ,Ò,Ð,Ø×'Ò'¨°
Ñ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;ØÐ+Ò+Ð+Ø×#Ò# F¨JÑ7Ô7Ð7Ð7Ð7ØÐ,Ò,Ð,Ø×$Ò$ V¨ZÑ8Ô8Ð8Ð8Ð8ØÐ+Ò+Ð+Ø×#Ò# F¨JÑ7Ô7Ð7Ð7Ð7ØÐ0Ò0Ð0Ø×*Ò*¨6Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2ØÐ2Ò2Ð2Ø×$Ò$ VÑ,Ô,Ð,Ð,Ð,ØÐ1Ò1Ð1Ø×Ò˜V°ÐÑ6Ô6Ð6Ð6Ð6ØÐ0Ò0Ð0Ø×Ò˜V°ÐÑ<Ô<Ð<Ð<Ð<ð 1Ð0r   c              ƒ  ó<  ‡ ‡K  — ‰ xj         dz  c_         t          d‰ j         › �t          |                     d¦  «        pd¦  «        t          |                     d¦  «        pd¦  «        t          |                     d¦  «        pd¦  «        t	          j        ¦   «         |p‰ j        pd|                     d¦  «        ¬¦  «        Š‰ j        t          k    ra‰ j        5  ‰  	                    ‰d	¦  «         d d d ¦  «         n# 1 swxY w Y   t          j        ‰                      ‰d
d¬¦  «        ¦  «         d S ‰ j        t          k    rf‰ j        5  ‰  	                    ‰d	¦  «         d d d ¦  «         n# 1 swxY w Y   t          j        ‰                      ‰d‰j        ¬¦  «        ¦  «         d S ‰ j        5  ‰‰ j        ‰j        <   d d d ¦  «         n# 1 swxY w Y   t          j        ¦   «         }|                     ‰ j        ˆˆ fd„¦  «        }|‰ j        ‰j        <   d S )Nrk   úd-r'   rI   r(   ÚdefaultPromptÚframeId)r&   r'   r(   r)   r+   r,   r.   Úauto_policyFrÀ   Tc                 ó\   •— t          j        ‰                     ‰ j        ¦  «        ¦  «        S rš   ©ró   r  Ú_dialog_timeout_expiredr&   ©rÆ   r3   s   €€r   ú<lambda>z2CDPSupervisor._on_dialog_opening.<locals>.<lambda>°  ó"   ø€ �Ô+¨D×,HÒ,HÈÌÑ,SÔ,SÑTÔT€ r   )rƒ   r%   r   rÈ   r
  r€   rg   ÚDIALOG_POLICY_AUTO_DISMISSrq   Ú_archive_dialog_lockedró   r  Ú_auto_handle_dialogÚDIALOG_POLICY_AUTO_ACCEPTr)   rr   r&   r9  Ú
call_laterrh   r‚   )r3   r6  rL   r¤   r  rÆ   s   `    @r   rK  z CDPSupervisor._on_dialog_openingŠ  s  øøè è € ð 	ÐÔ˜AÑÐÔÝØ&�DÔ$Ð&Ð&Ý�V—Z’Z Ñ'Ô'Ð-¨2Ñ.Ô.Ý˜Ÿ
š
 9Ñ-Ô-Ð3°Ñ4Ô4Ý˜vŸzšz¨/Ñ:Ô:Ð@¸bÑAÔAÝ”i‘k”kØ%ÐD¨Ô)>ÐDÀ"Ø—Z’Z 	Ñ*Ô*ð
ñ 
ô 
ˆð ÔÕ!;Ò;Ð;ð Ô!ð Cð CØ×+Ò+¨F°MÑBÔBÐBðCð Cð Cñ Cô Cð Cð Cð Cð Cð Cð Cøøøð Cð Cð Cð CåÔØ×(Ò(¨¸È2Ð(ÑNÔNñô ð ð ð ð ÔÕ#<Ò<Ð<ØÔ!ð Cð CØ×+Ò+¨F°MÑBÔBÐBðCð Cð Cñ Cô Cð Cð Cð Cð Cð Cð Cøøøð Cð Cð Cð CåÔØ×(Ò(Ø 4°VÔ5Jð )ñ ô ñô ð ð ð ð Ô!ð :ð :Ø39�Ô% f¤iÑ0ð:ð :ð :ñ :ô :ð :ð :ð :ð :ð :ð :øøøð :ð :ð :ð :åÔ+Ñ-Ô-ˆDØ—_’_ØÔ%ØTÐTÐTÐTÐTñô ˆFð 17ˆDÔ" 6¤9Ñ-Ð-Ð-s6   ÃD Ä DÄDÅE1Å1E5Å8E5Æ4GÇGÇGrÆ   r%   r¶   c             ƒ  óò   K  — d|i}|j         dk    r||d<   	 |                      d||j        pdd¬¦  «        ƒ d{V —† dS # t          $ r,}t                               d|j        |¦  «         Y d}~dS d}~ww xY w)	zÏSend handleJavaScriptDialog for auto_dismiss/auto_accept.

        Dialog has already been archived by the caller (``_on_dialog_opening``);
        this just fires the CDP call so the page unblocks.
        r¶   ÚpromptÚ
promptTextúPage.handleJavaScriptDialogNr—   r×   z&auto-handle CDP call failed for %s: %s)r'   rØ   r,   r   rû   r  r&   )r3   rÆ   r¶   r²   r6  rË   s         r   ra  z!CDPSupervisor._auto_handle_dialog´  sÖ   è è € ð #+¨FÐ!3ˆØŒ;˜(Ò"Ð"Ø#.ˆF�<Ñ ð	QØ—)’)Ø-ØØ!Ô0Ð8°DØð	 ñ ô ð ð ð ð ð ð ð ð ð øõ ð 	Qð 	Qð 	QÝ�LŠLÐAÀ6Ä9ÈaÑPÔPÐPÐPÐPÐPÐPÐPÐPøøøøð	Qøøøs   ˜&A  Á 
A6Á
!A1Á1A6c              ƒ  ó˜  K  — | j         5  | j                             |¦  «        }d d d ¦  «         n# 1 swxY w Y   |€d S t                               d| j        ||j        | j        ¦  «         	 | j         5  || j        v r1| j                             |d ¦  «         |  	                    |d¦  «         d d d ¦  «         n# 1 swxY w Y   |j
        r |                      |dd¬¦  «        ƒ d {V —† d S |                      dddi|j        pd d¬	¦  «        ƒ d {V —† d S # t          $ r'}t                               d
||¦  «         Y d }~d S d }~ww xY w)NzBCDP supervisor %s: dialog %s (%s) auto-dismissed after %ss timeoutÚwatchdogFrI   rÀ   rg  r¶   r—   r×   zauto-dismiss failed for %s: %s)rq   rr   rÈ   rû   rü   r\   r'   rh   r>  r`  r/   Ú_fulfill_bridge_requestrØ   r,   r   r  )r3   r³   rÆ   rË   s       r   r[  z%CDPSupervisor._dialog_timeout_expiredÉ  sM  è è € ØÔð 	:ð 	:ØÔ*×.Ò.¨yÑ9Ô9ˆFð	:ð 	:ð 	:ñ 	:ô 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:øøøð 	:ð 	:ð 	:ð 	:àˆ>ØˆFÝ�ŠØPØŒLØØŒKØÔ!ñ	
ô 	
ð 	
ð	IàÔ!ð Dð DØ Ô 5Ð5Ð5ØÔ)×-Ò-¨i¸Ñ>Ô>Ð>Ø×/Ò/°¸
ÑCÔCÐCðDð Dð Dñ Dô Dð Dð Dð Dð Dð Dð Døøøð Dð Dð Dð Dð Ô'ð Ø×2Ò2°6À%ÐUWÐ2ÑXÔXÐXÐXÐXÐXÐXÐXÐXÐXÐXà—i’iØ1Ø˜uÐ%Ø%Ô4Ð<¸Øð	  ñ ô ð ð ð ð ð ð ð ð ð øõ ð 	Ið 	Ið 	IÝ�LŠLÐ9¸9ÀaÑHÔHÐHÐHÐHÐHÐHÐHÐHøøøøð	IøøøsN   Š1±5¸5Á.D Á5;B<Â0D Â<C Ã D ÃC Ã(D Ã.(D Ä
E	Ä"EÅE	r?   c           	     ó2  — t          |j        |j        |j        |j        t          j        ¦   «         ||j        ¬¦  «        }| j                             |¦  «         t          | j        ¦  «        t          dz  k    r| j        t           d…         | _        dS dS )zNMove a pending dialog to the recent_dialogs ring buffer. Must hold state_lock.rA   r!   N)r=   r&   r'   r(   r+   r
  r.   rs   ÚappendrÉ   r©   )r3   rÆ   r?   Úrecords       r   r`  z$CDPSupervisor._archive_dialog_lockedé  s™   € åØŒyØ”Ø”NØÔ&Ý”i‘k”kØØ”_ð
ñ 
ô 
ˆð 	Ô×#Ò# FÑ+Ô+Ð+ÝˆtÔ#Ñ$Ô$Õ'9¸AÑ'=Ò=Ð=Ø#'Ô#7Õ9KÐ8KÐ8LÐ8LÔ#MˆDÔ Ð Ð ð >Ð=r   c             ƒ  ó¸  K  — |j         �rZ	 |                      |||¬¦  «        ƒ d{V —† | j        5  |j        | j        v r6| j                             |j        d¦  «         |                      |d¦  «         ddd¦  «         n# 1 swxY w Y   | j                             |j        d¦  «        }|�|                     ¦   «          nŸ# | j        5  |j        | j        v r6| j                             |j        d¦  «         |                      |d¦  «         ddd¦  «         n# 1 swxY w Y   | j                             |j        d¦  «        }|�|                     ¦   «          w w xY wdS d|i}|j	        dk    r||d<   	 |  
                    d||j        pdd¬	¦  «        ƒ d{V —† | j        5  |j        | j        v r6| j                             |j        d¦  «         |                      |d¦  «         ddd¦  «         n# 1 swxY w Y   | j                             |j        d¦  «        }|�|                     ¦   «          dS dS # | j        5  |j        | j        v r6| j                             |j        d¦  «         |                      |d¦  «         ddd¦  «         n# 1 swxY w Y   | j                             |j        d¦  «        }|�|                     ¦   «          w w xY w)
zÖSend the Page.handleJavaScriptDialog CDP command (agent path only).

        Routes to the bridge-fulfill path when the dialog was captured via
        the injected XHR override (see ``_on_fetch_paused``).
        rÀ   NÚagentr¶   re  rf  rg  r—   r×   )r/   rj  rq   r&   rr   r>  r`  r‚   rþ   r'   rØ   r,   )r3   rÆ   r¶   r²   r  r6  s         r   rÁ   z CDPSupervisor._handle_dialog_cdpø  sy  è è € ð Ô#ñ 	ð$Ø×2Ò2Ø 6°{ð 3ñ ô ð ð ð ð ð ð ð ð Ô%ð Eð EØ”y DÔ$9Ð9Ð9ØÔ-×1Ò1°&´)¸TÑBÔBÐBØ×3Ò3°F¸GÑDÔDÐDðEð Eð Eñ Eô Eð Eð Eð Eð Eð Eð Eøøøð Eð Eð Eð Eð Ô/×3Ò3°F´I¸tÑDÔD�ØÐ%Ø—M’M‘O”O�Oøøð Ô%ð Eð EØ”y DÔ$9Ð9Ð9ØÔ-×1Ò1°&´)¸TÑBÔBÐBØ×3Ò3°F¸GÑDÔDÐDðEð Eð Eñ Eô Eð Eð Eð Eð Eð Eð Eøøøð Eð Eð Eð Eð Ô/×3Ò3°F´I¸tÑDÔD�ØÐ%Ø—M’M‘O”O�O�Oð &øøøàˆFà"*¨FÐ!3ˆØŒ;˜(Ò"Ð"Ø#.ˆF�<Ñ ð	 Ø—)’)Ø-ØØ!Ô0Ð8°DØð	 ñ ô ð ð ð ð ð ð ð ð Ô!ð Að AØ”9 Ô 5Ð5Ð5ØÔ)×-Ò-¨f¬i¸Ñ>Ô>Ð>Ø×/Ò/°¸Ñ@Ô@Ð@ðAð Að Añ Aô Að Að Að Að Að Að Aøøøð Að Að Að Að Ô+×/Ò/°´	¸4Ñ@Ô@ˆFØÐ!Ø—’‘”���ð "Ð!øð Ô!ð Að AØ”9 Ô 5Ð5Ð5ØÔ)×-Ò-¨f¬i¸Ñ>Ô>Ð>Ø×/Ò/°¸Ñ@Ô@Ð@ðAð Að Añ Aô Að Að Að Að Að Að Aøøøð Að Að Að Að Ô+×/Ò/°´	¸4Ñ@Ô@ˆFØÐ!Ø—’‘”��ð "øøøs†   ŒC ±ABÂBÂ	BÃE ÃADÄE ÄD!Ä!E Ä$D!Ä%;E Å:&H= Æ'AG8Ç8G<Ç?G<È=KÉAJÊ
KÊJÊKÊJÊ;Kc              ƒ  ór  ‡K  — | j         5  ˆfd„| j                             ¦   «         D ¦   «         }|rl|d         }| j                             |d ¦  «        }|�|                      |d¦  «         | j                             |d ¦  «        }|�|                     ¦   «          d d d ¦  «         d S # 1 swxY w Y   d S )Nc                óB   •— g | ]}|j         ‰k    r|j        ­|j        ‘ŒS rš   )r,   r/   r&   )ra   rM   rL   s     €r   rb   z3CDPSupervisor._on_dialog_closed.<locals>.<listcomp>/  s@   ø€ ð ð ð àØÔ# zÒ1Ð1ð Ô'Ð/ð ”ð 0Ð/Ð/r   r   Úremote)rq   rr   r¨   r>  r`  r‚   rþ   )r3   r6  rL   Úcandidate_idsÚdidrÆ   r  s     `    r   rL  zCDPSupervisor._on_dialog_closed$  s   øè è € ð Ôð 	$ð 	$ðð ð ð àÔ.×5Ò5Ñ7Ô7ðñ ô ˆMð ð $Ø# AÔ&�ØÔ.×2Ò2°3¸Ñ=Ô=�ØÐ%Ø×/Ò/°¸ÑAÔAÐAØÔ/×3Ò3°C¸Ñ>Ô>�ØÐ%Ø—M’M‘O”O�Oð#	$ð 	$ð 	$ñ 	$ô 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$øøøð 	$ð 	$ð 	$ð 	$ð 	$ð 	$s   ‹BB,Â,B0Â3B0c              ƒ  ó6  ‡ ‡‡K  — t          |                     di ¦  «                             d¦  «        pd¦  «        }|                     d¦  «        }|sdS t          |vr5	 ‰                      dd|i|d¬¦  «        ƒ d{V —† n# t          $ r Y nw xY wdS d	d
lm}m}  | ||¦  «        j        ¦  «        Šdˆfd„} |d¦  «        pd} |d¦  «        }	 |d¦  «        }
‰ xj	        dz  c_	        t          d‰ j	        › �||	|
t          j        ¦   «         |p‰ j        pd|                     d¦  «        t          |¦  «        ¬¦  «        Š‰ j        t          k    ra‰ j        5  ‰                      ‰d¦  «         ddd¦  «         n# 1 swxY w Y   t#          j        ‰                      ‰dd¬¦  «        ¦  «         dS ‰ j        t(          k    ra‰ j        5  ‰                      ‰d¦  «         ddd¦  «         n# 1 swxY w Y   t#          j        ‰                      ‰d|
¬¦  «        ¦  «         dS ‰ j        5  ‰‰ j        ‰j        <   ddd¦  «         n# 1 swxY w Y   t#          j        ¦   «         }|                     ‰ j        ˆˆ fd„¦  «        }|‰ j        ‰j        <   dS )u	  Bridge XHR captured mid-flight â€” materialize as a pending dialog.

        The injected script (``_DIALOG_BRIDGE_SCRIPT``) fires a synchronous
        XHR to ``DIALOG_BRIDGE_HOST`` whenever page code calls alert/confirm/
        prompt. We catch it via Fetch.enable pattern; the page's JS thread
        is blocked on the XHR's response until we call Fetch.fulfillRequest
        (which happens from ``respond_to_dialog``) or until the watchdog
        fires (at which point we fulfill with a cancel response).
        ÚrequestrD   rI   Ú	requestIdNzFetch.continueRequestr2  r×   r   )ÚurlparseÚparse_qsrJ   r   r   c                óJ   •— ‰                      | dg¦  «        }|r|d         ndS )NrI   r   r  )rJ   ÚvÚqs     €r   Ú_qz*CDPSupervisor._on_fetch_paused.<locals>._qb  s+   ø€ Ø—’�d˜R˜DÑ!Ô!ˆAØÐ$�1�Q”4�4 "Ð$r   ÚkindÚalertr(   r)   rk   rU  rW  )r&   r'   r(   r)   r+   r,   r.   r/   rX  FrÀ   Tc                 ó\   •— t          j        ‰                     ‰ j        ¦  «        ¦  «        S rš   rZ  r\  s   €€r   r]  z0CDPSupervisor._on_fetch_paused.<locals>.<lambda>Œ  r^  r   )rJ   r   r   r   )r   rÈ   ÚDIALOG_BRIDGE_HOSTrØ   r   Úurllib.parserx  ry  Úqueryrƒ   r%   r
  r€   rg   r_  rq   r`  ró   r  rj  rb  rr   r&   r9  rc  rh   r‚   )r3   r6  rL   rD   Ú
request_idrx  ry  r}  r~  r(   r)   r¤   r  rÆ   r|  s   `            @@r   rM  zCDPSupervisor._on_fetch_pausedA  s-  øøøè è € õ �&—*’*˜Y¨Ñ+Ô+×/Ò/°Ñ6Ô6Ð<¸"Ñ=Ô=ˆØ—Z’Z Ñ,Ô,ˆ
Øð 	ØˆFõ  SÐ(Ð(ðØ—i’iØ+¨k¸:Ð-FØ)°3ð  ñ ô ð ð ð ð ð ð ð ð øõ ð ð ð Ø�ðøøøàˆFð 	4Ð3Ð3Ð3Ð3Ð3Ð3Ð3ØˆH�X�X˜c‘]”]Ô(Ñ)Ô)ˆð	%ð 	%ð 	%ð 	%ð 	%ð 	%ð ˆr�&‰zŒzÐ$˜WˆØ�"�Y‘-”-ˆØ˜Ð,Ñ-Ô-ˆàÐÔ˜AÑÐÔÝØ&�DÔ$Ð&Ð&ØØØ)Ý”i‘k”kØ%ÐD¨Ô)>ÐDÀ"Ø—Z’Z 	Ñ*Ô*Ý! *™oœoð	
ñ 	
ô 	
ˆð ÔÕ!;Ò;Ð;ØÔ!ð Cð CØ×+Ò+¨F°MÑBÔBÐBðCð Cð Cñ Cô Cð Cð Cð Cð Cð Cð Cøøøð Cð Cð Cð CåÔØ×,Ò,¨V¸EÈrÐ,ÑRÔRñô ð ð ð ð ÔÕ#<Ò<Ð<ØÔ!ð Cð CØ×+Ò+¨F°MÑBÔBÐBðCð Cð Cñ Cô Cð Cð Cð Cð Cð Cð Cøøøð Cð Cð Cð CåÔØ×,Ò,Ø 4°^ð -ñ ô ñô ð ð ð ð Ô!ð :ð :Ø39�Ô% f¤iÑ0ð:ð :ð :ñ :ô :ð :ð :ð :ð :ð :ð :øøøð :ð :ð :ð :åÔ+Ñ-Ô-ˆDØ—_’_ØÔ%ØTÐTÐTÐTÐTñô ˆFð 17ˆDÔ" 6¤9Ñ-Ð-Ð-sH   Á!!B Â
BÂBÅFÆFÆ	FÇG3Ç3G7Ç:G7È1IÉIÉIc          	   ƒ  óè  K  — |j         sdS t          |¦  «        |j        dk    r|nd|j        dœ}t	          j        |¦  «                             ¦   «         }	 ddl}|                      d|j         ddd	d
œddd
œg| 	                    |¦  «         
                    ¦   «         dœ|j        pdd¬¦  «        ƒ d{V —† dS # t          $ r,}t                               d|j        |¦  «         Y d}~dS d}~ww xY w)zCResolve a bridge XHR via Fetch.fulfillRequest so the page unblocks.Nre  rI   )r¶   r²   r³   r   zFetch.fulfillRequestéÈ   zContent-Typezapplication/json)rJ   r   zAccess-Control-Allow-OriginÚ*)rw  ÚresponseCodeÚresponseHeadersÚbodyr—   r×   z bridge fulfill failed for %s: %s)r/   rG   r'   r&   r<  r=  ÚencodeÚbase64rØ   Ú	b64encodeÚdecoder,   r   rû   r  )r3   rÆ   r¶   r²   r@  rŠ  Ú_b64rË   s           r   rj  z%CDPSupervisor._fulfill_bridge_request�  sf  è è € ð Ô'ð 	ØˆFå˜6‘l”lØ*0¬+¸Ò*AÐ*A˜;˜;ÀrØœð
ð 
ˆõ
 Œz˜'Ñ"Ô"×)Ò)Ñ+Ô+ˆð	KØ!Ð!Ð!Ð!Ø—)’)Ø&à!'Ô!9Ø$'à!/Ð:LÐMÐMØ!>ÈÐMÐMð(ð !ŸNšN¨4Ñ0Ô0×7Ò7Ñ9Ô9ðð ð "Ô0Ð8°DØð ñ ô ð ð ð ð ð ð ð ð ð øõ ð 	Kð 	Kð 	KÝ�LŠLÐ;¸V¼YÈÑJÔJÐJÐJÐJÐJÐJÐJÐJøøøøð	Køøøs   ÁA!B; Â;
C1Ã!C,Ã,C1c           	     óØ   — |                      d¦  «        }|sd S | j        5  t          |dd|                      d¦  «        d|¬¦  «        | j        |<   d d d ¦  «         d S # 1 swxY w Y   d S )NrW  rI   ÚparentFrameIdF)r.   rD   rE   rF   rH   r,   )rÈ   rq   rC   rt   )r3   r6  rL   r.   s       r   rN  z CDPSupervisor._on_frame_attached±  sÈ   € ð —:’:˜iÑ(Ô(ˆØð 	ØˆFØÔð 	ð 	Ý%.Ø!ØØØ &§
¢
¨?Ñ ;Ô ;ØØ)ð&ñ &ô &ˆDŒL˜Ñ"ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   ¡1AÁA#Á&A#c                óœ  — |                      d¦  «        pi }|                      d¦  «        }|sd S | j        5  | j                              |¦  «        }t          |t	          |                      d¦  «        pd¦  «        t	          |                      d¦  «        p|                      d¦  «        pd¦  «        |                      d¦  «        p
|r|j        nd t          |r|j        nd¦  «        |r|j        n|t	          |                      d	¦  «        p
|r|j	        nd¦  «        ¬
¦  «        }|| j        |<   d d d ¦  «         d S # 1 swxY w Y   d S )NÚframer&   rD   rI   ÚsecurityOriginrE   ÚparentIdFrJ   ©r.   rD   rE   rF   rH   r,   rJ   )
rÈ   rq   rt   rC   r   rF   rG   rH   r,   rJ   )r3   r6  rL   r“  r.   ÚexistingÚinfos          r   rO  z!CDPSupervisor._on_frame_navigatedÁ  sš  € ð —
’
˜7Ñ#Ô#Ð) rˆØ—9’9˜T‘?”?ˆØð 	ØˆFØÔð 	*ð 	*Ø”|×'Ò'¨Ñ1Ô1ˆHÝØ!Ý˜Ÿ	š	 %Ñ(Ô(Ð.¨BÑ/Ô/Ý˜5Ÿ9š9Ð%5Ñ6Ô6ÐS¸%¿)º)ÀHÑ:MÔ:MÐSÐQSÑTÔTØ %§	¢	¨*Ñ 5Ô 5Ð iÐV^Ð:h¸(Ô:RÐ:RÐdhÝ°8ÐF˜hÔ/Ð/ÀÑGÔGØ:BÐR˜xÔ6Ð6È
Ý˜Ÿš 6Ñ*Ô*ÐQÀÐ/P¨x¬}¨}ÈbÑRÔRðñ ô ˆDð &*ˆDŒL˜Ñ"ð	*ð 	*ð 	*ñ 	*ô 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*øøøð 	*ð 	*ð 	*ð 	*ð 	*ð 	*s   ¸C<EÅEÅEc                óš  — |                      d¦  «        }|sdS t          |                      d¦  «        pd¦  «                             ¦   «         }|dk    rdS | j        5  | j                              |¦  «        }|r|j        r|j        r	 ddd¦  «         dS | j                             |d¦  «         ddd¦  «         dS # 1 swxY w Y   dS )u€  Remove a frame from our state only when it's truly gone.

        CDP emits ``Page.frameDetached`` with a ``reason`` of either
        ``"remove"`` (the frame is actually gone from the DOM) or ``"swap"``
        (the frame is migrating to a new process â€” typical when a
        same-process iframe becomes an OOPIF, or when history navigates).
        Dropping on ``swap`` would hide OOPIFs from the agent the moment
        Chromium promotes them to their own process, so treat swap as a
        no-op.

        Even with ``reason=remove``, the parent page's perspective is
        "the child frame left MY process tree" â€” which is what happens
        when a same-origin iframe gets promoted to an OOPIF. If we
        already have a live child CDP session attached for that frame_id,
        the frame is still very much alive; only drop it when we have
        no session record.
        rW  NÚreasonÚremoveÚswap)rÈ   r   râ   rq   rt   rH   r,   r>  )r3   r6  rL   r.   rš  r—  s         r   rP  z CDPSupervisor._on_frame_detachedÕ  sA  € ð( —:’:˜iÑ(Ô(ˆØð 	ØˆFÝ�V—Z’Z Ñ)Ô)Ð5¨XÑ6Ô6×<Ò<Ñ>Ô>ˆØ�VÒÐØˆFØÔð 		-ð 		-Ø”|×'Ò'¨Ñ1Ô1ˆHð ð ˜HÔ-ð °(Ô2Ið Øð		-ð 		-ð 		-ñ 		-ô 		-ð 		-ð 		-ð 		-ð ŒL×Ò˜X tÑ,Ô,Ð,ð		-ð 		-ð 		-ñ 		-ô 		-ð 		-ð 		-ð 		-ð 		-ð 		-ð 		-ð 		-øøøð 		-ð 		-ð 		-ð 		-ð 		-ð 		-s   Á,C ÂC Ã CÃCc              ƒ  ó”  K  — |                      d¦  «        pi }|                      d¦  «        }|                      d¦  «        }|r|dvrd S ||dœ| j        |<   |dk    rÂ|                      d¦  «        }| j        5  | j                              |¦  «        }t	          |t          |                      d¦  «        pd	¦  «        d	|r|j        nd d
|t          |                      d¦  «        p
|r|j        nd	¦  «        ¬¦  «        | j        |<   d d d ¦  «         n# 1 swxY w Y   t          j	        |  
                    |¦  «        ¦  «         d S )NÚ
targetInfor  r'   >   ÚiframeÚworker)r˜  r'   rŸ  r  rD   rI   TÚtitler–  )rÈ   r�   rq   rt   rC   r   rF   rJ   ró   r  Ú_enable_child_domains)r3   r6  r˜  ÚsidÚtarget_typer'  r—  s          r   rQ  z!CDPSupervisor._on_target_attachedú  sœ  è è € Ø�zŠz˜,Ñ'Ô'Ð-¨2ˆØ�jŠj˜Ñ%Ô%ˆØ—h’h˜vÑ&Ô&ˆØð 	�kÐ)=Ð=Ð=ØˆFØ-1¸;Ð$GÐ$GˆÔ˜SÑ!ð ˜(Ò"Ð"ØŸš Ñ,Ô,ˆIØÔ!ð 
ð 
Øœ<×+Ò+¨IÑ6Ô6�Ý*3Ø&Ý˜DŸHšH U™OœOÐ1¨rÑ2Ô2ØØAIÐ%S XÔ%=Ð%=ÈtØ!Ø#&Ý˜TŸXšX gÑ.Ô.ÐUÀHÐ3T°8´=°=ÐRTÑVÔVð+ñ +ô +�”˜YÑ'ð
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
õ 	Ô˜D×6Ò6°sÑ;Ô;Ñ<Ô<Ð<Ð<Ð<s   Á;BDÄDÄDr£  c              ƒ  óx  K  — 	 |                       d|d¬¦  «        ƒ d{V —† |                       d|d¬¦  «        ƒ d{V —† |                       ddddd	œ|d¬¦  «        ƒ d{V —† n;# t          $ r.}t                               d
|dd…         |¦  «         Y d}~nd}~ww xY w|                      |¦  «        ƒ d{V —† dS )zÇEnable Page+Runtime (+nested setAutoAttach) on a child CDP session.

        Also installs the dialog bridge so iframe-scoped alert/confirm/prompt
        calls round-trip through Fetch too.
        r  r2  r×   Nr  r  TFr  z!child session %s setup failed: %sr,  )rØ   r   rû   r  r"  )r3   r£  rË   s      r   r¢  z#CDPSupervisor._enable_child_domains  s7  è è € ð
	KØ—)’)˜M°cÀ3�)ÑGÔGÐGÐGÐGÐGÐGÐGÐGØ—)’)Ð,¸Àc�)ÑJÔJÐJÐJÐJÐJÐJÐJÐJØ—)’)Ø&Ø#¸uÐQUÐVÐVØØð	 ñ ô ð ð ð ð ð ð ð ð øõ ð 	Kð 	Kð 	KÝ�LŠLÐ<¸cÀ#À2À#¼hÈÑJÔJÐJÐJÐJÐJÐJÐJøøøøð	Køøøð ×)Ò)¨#Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.s   „AA$ Á$
BÁ.$BÂBc                ó–  — |                      d¦  «        }|sdS | j                             |d¦  «         | j        5  t	          | j                             ¦   «         ¦  «        D ]L\  }}|j        |k    r<t          |j	        |j
        |j        |j        |j        d|j        ¬¦  «        | j        |<   ŒM	 ddd¦  «         dS # 1 swxY w Y   dS )u7  Handle a child CDP session detaching.

        We deliberately DO NOT drop frames from ``_frames`` here â€” Browserbase
        fires transient detach events during page transitions even while the
        iframe is still visible to the user, and dropping the record hides
        OOPIFs from the agent between the detach and the next
        ``Target.attachedToTarget``. Instead, we just clear the session
        binding so stale ``cdp_session_id`` values aren't used for routing.
        If the iframe truly goes away, ``Page.frameDetached`` will clean up.
        r  Nr–  )rÈ   r�   r>  rq   rÇ   rt   Úitemsr,   rC   r.   rD   rE   rF   rH   rJ   )r3   r6  r£  Úfidr“  s        r   rR  z!CDPSupervisor._on_target_detached*  s$  € ð �jŠj˜Ñ%Ô%ˆØð 	ØˆFØÔ× Ò   dÑ+Ô+Ð+ØÔð 	ð 	Ý" 4¤<×#5Ò#5Ñ#7Ô#7Ñ8Ô8ð ð ‘
��UØÔ'¨3Ò.Ð.õ )2Ø!&¤Ø!œIØ$œ|Ø(-Ô(=Ø!&¤Ø'+Ø"œZð)ñ )ô )�D”L Ñ%øð	ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   ¼A4B>Â>CÃCrJ  c               óÆ  — |dk    ru|                      d¦  «        pi }t          |                      d¦  «        pd¦  «        }|                      d¦  «        }t          t          j        ¦   «         d||¬¦  «        }nñt          |                      d¦  «        pd¦  «        }|d	v rd
n	|dk    rdnd}|                      d¦  «        pg }	g }
|	d d…         D ]c}t	          |t
          ¦  «        rL|
                     t          |                      d¦  «        p|                      d¦  «        pd¦  «        ¦  «         Œdt          t          j        ¦   «         |d                     |
¦  «        ¬¦  «        }| j        5  | j	                             |¦  «         t          | j	        ¦  «        t          dz  k    r| j	        t           d …         | _	        d d d ¦  «         d S # 1 swxY w Y   d S )NrÝ   rÜ   rR   rI   rD   )rP   rQ   rR   rD   r'   Úlog>   rº   Úassertrº   rü   Úargsé   r   rÞ   Ú )rP   rQ   rR   r!   )rÈ   r   rO   r
  rã   rä   rl  r£   rq   ru   rÉ   r«   )r3   r6  rJ  ÚdetailsrR   rD   ÚeventÚ	raw_levelrQ   r¬  ÚpartsÚas               r   rS  zCDPSupervisor._on_consoleJ  s,  € Ø˜Ò$Ð$Ø—j’jÐ!3Ñ4Ô4Ð:¸ˆGÝ�w—{’{ 6Ñ*Ô*Ð0¨bÑ1Ô1ˆDØ—+’+˜eÑ$Ô$ˆCÝ ¥D¤I¡K¤K°{ÈÐSVÐWÑWÔWˆEˆEå˜FŸJšJ vÑ.Ô.Ð7°%Ñ8Ô8ˆIØ(Ð,?Ð?Ð?�G�GØ&¨)Ò3Ð3�	�	¸ð ð —:’:˜fÑ%Ô%Ð+¨ˆDØ!ˆEØ˜"˜1˜"”Xð Tð T�Ý˜a¥Ñ&Ô&ð TØ—L’L¥ Q§U¢U¨7¡^¤^Ð%Q°q·u²u¸]Ñ7KÔ7KÐ%QÈrÑ!RÔ!RÑSÔSÐSøÝ ¥D¤I¡K¤K°uÀ3Ç8Â8ÈEÁ?Ä?ÐSÑSÔSˆEØÔð 	Sð 	SØÔ ×'Ò'¨Ñ.Ô.Ð.Ý�4Ô'Ñ(Ô(Õ+>ÀÑ+BÒBÐBà'+Ô';Õ=PÐ<PÐ<QÐ<QÔ'R�Ô$ð		Sð 	Sð 	Sñ 	Sô 	Sð 	Sð 	Sð 	Sð 	Sð 	Sð 	Sð 	Søøøð 	Sð 	Sð 	Sð 	Sð 	Sð 	Ss   Å4AGÇGÇGc                ó2  ‡
— | j         }|sdg ddœS d„ |                     ¦   «         D ¦   «         }t          d„ |D ¦   «         |r|d         nd¦  «        Š
g }d}‰
€dg ddœS ˆ
fd„|                     ¦   «         D ¦   «         }‰
j        h}|rôt	          |¦  «        t
          k     rÜ|                     d¦  «        \  }}|j        |v rŒ<|                     |j        ¦  «         |j        r|t          k    rd}Œk| 
                    |                     ¦   «         ¦  «         |                     ¦   «         D ]5}	|	j        |j        k    r#|	j        |vr| 
                    |	|d	z   f¦  «         Œ6|rt	          |¦  «        t
          k     °Ü|rd}‰
                     ¦   «         ||dœS )
zEBuild the capped frame_tree payload. Must be called under state lock.NF)ÚtopÚchildrenÚ	truncatedc                ó    — g | ]}|j         °	|‘ŒS r;   )rF   ©ra   Úfs     r   rb   z:CDPSupervisor._build_frame_tree_locked.<locals>.<listcomp>j  s    € ÐDÐDÐD�a°!Ô2CÐD�ÐDÐDÐDr   c              3  ó(   K  — | ]}|j         °	|V — Œd S rš   )rH   r¹  s     r   r  z9CDPSupervisor._build_frame_tree_locked.<locals>.<genexpr>k  s)   è è € Ð6Ð6˜!¨1¬:Ð6�AÐ6Ð6Ð6Ð6Ð6Ð6r   r   c                ó8   •— g | ]}|j         ‰j        k    ¯|d f‘ŒS )rk   )rF   r.   )ra   rº  rµ  s     €r   rb   z:CDPSupervisor._build_frame_tree_locked.<locals>.<listcomp>t  s3   ø€ ð .
ð .
ð .
Ø¨qÔ/@ÀCÄLÒ/PÐ/PˆQ�ˆFÐ/PÐ/PÐ/Pr   Trk   )rt   r¨   r!  r.   rÉ   ÚFRAME_TREE_MAX_ENTRIESr>  ÚaddrH   ÚFRAME_TREE_MAX_OOPIF_DEPTHrl  r4   rF   )r3   ÚframesÚtopsr¶  r·  ÚqueueÚvisitedr“  Údepthrº  rµ  s             @r   rª   z&CDPSupervisor._build_frame_tree_lockedc  sé  ø€ à”ˆØð 	EØ¨R¸eÐDÐDÐDð EÐD˜6Ÿ=š=™?œ?ÐDÑDÔDˆÝÐ6Ð6˜tÐ6Ñ6Ô6À4Ð8Q¸¸Q¼¸ÈTÑRÔRˆð *,ˆØˆ	Øˆ;Ø¨R¸eÐDÐDÐDð.
ð .
ð .
ð .
Ø"ŸMšM™OœOð.
ñ .
ô .
ˆð !œ\˜NˆØð 	1�˜H™œÕ(>Ò>Ð>Ø Ÿ9š9 Q™<œ<‰LˆE�5ØŒ~ Ð(Ð(ØØ�KŠK˜œÑ'Ô'Ð'ØŒ~ð  %Õ*DÒ"DÐ"DØ �	ØØ�OŠO˜EŸMšM™OœOÑ,Ô,Ð,Ø—]’]‘_”_ð 1ð 1�ØÔ$¨¬Ò6Ð6¸1¼:ÈWÐ;TÐ;TØ—L’L ! U¨Q¡Y Ñ0Ô0Ð0øð ð 	1�˜H™œÕ(>Ò>Ð>ð ð 	ØˆIð —;’;‘=”=Ø Ø"ð
ð 
ð 	
r   )
r\   r   r[   r   rg   r   rh   r*   r   ri   )r…   )r†   r*   r   ri   )r—   )r   rU   )
r´   r   r²   r-   r³   r-   r†   r*   r   r0   )
rÏ   r   rÍ   rG   rÎ   rG   r†   r*   r   r0   ©r   ri   )rL   r   r   ri   rš   )
r5  r   r6  r7  rL   r-   r†   r*   r   r0   )r5  r   r6  r0   rL   r-   r   ri   )r6  r0   rL   r-   r   ri   )rÆ   r%   r¶   rG   r²   r   r   ri   )r³   r   r   ri   )rÆ   r%   r?   r   r   ri   )r6  r0   r   ri   )r£  r   r   ri   )r6  r0   rJ  r   r   ri   r5   )#r6   r7   r8   r9   ÚDEFAULT_DIALOG_POLICYÚDEFAULT_DIALOG_TIMEOUT_Sr„   r�   r’   r°   rÌ   rì   r�   r÷   r	  r"  rØ   r  rE  rK  ra  r[  r`  rÁ   rL  rM  rj  rN  rO  rP  rQ  r¢  rR  rS  rª   r;   r   r   rf   rf   !  sþ  € € € € € ðð ð* 3Ø":ð+ð +ð +ð +ð +ð +ð^(ð (ð (ð (ð (ðT!ð !ð !ð !ð !ð@
ð 
ð 
ð 
ð, &*Ø#'Øð<?ð <?ð <?ð <?ð <?ð <?ðD !%Ø"ØðfIð fIð fIð fIð fIð fIðT%ð %ð %ð %ð>_-ð _-ð _-ð _-ðBAð Að Að Að:8ð 8ð 8ð 8ðz ,0ð3ð
 %)Øð3ð 3ð 3ð 3ð 3ð 3ð48ð 8ð 8ð 8ð8=ð =ð =ð =ð0(7ð (7ð (7ð (7ðTQð Qð Qð Qð*Ið Ið Ið Ið@Nð Nð Nð Nð* ð * ð * ð * ðX$ð $ð $ð $ð:M7ð M7ð M7ð M7ð^Kð Kð Kð KðBð ð ð ð *ð *ð *ð *ð(#-ð #-ð #-ð #-ðJ=ð =ð =ð =ð8/ð /ð /ð /ð(ð ð ð ð@Sð Sð Sð Sð2(
ð (
ð (
ð (
ð (
ð (
r   rf   c                  óD   — e Zd ZdZdd„Zdd„Zeed	d
œdd„Zdd„Z	dd„Z
dS )Ú_SupervisorRegistryuÈ   Process-global (task_id â†’ supervisor) map with idempotent start/stop.

    One instance, exposed as ``SUPERVISOR_REGISTRY``. Safe to call from any
    thread â€” mutations go through ``_lock``.
    r   ri   c                óD   — t          j        ¦   «         | _        i | _        d S rš   )ro   rp   Ú_lockÚ_by_taskr2   s    r   r„   z_SupervisorRegistry.__init__˜  s   € Ý”^Ñ%Ô%ˆŒ
Ø24ˆŒˆˆr   r\   r   úOptional[CDPSupervisor]c                óx   — | j         5  | j                             |¦  «        cddd¦  «         S # 1 swxY w Y   dS )z@Return the supervisor for ``task_id`` if running, else ``None``.N)rË  rÌ  rÈ   )r3   r\   s     r   rÈ   z_SupervisorRegistry.getœ  s�   € àŒZð 	.ð 	.Ø”=×$Ò$ WÑ-Ô-ð	.ð 	.ð 	.ð 	.ñ 	.ô 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.øøøð 	.ð 	.ð 	.ð 	.ð 	.ð 	.s   ˆ/¯3¶3r…   )rg   rh   Ústart_timeoutr[   rg   rh   r*   rÏ  rf   c               óÖ  — | j         5  | j                             |¦  «        }|�||j        |k    rV|j        duo|j                             ¦   «         }|j        duo|j                             ¦   «         }|r|r|cddd¦  «         S | j                             |d¦  «         ddd¦  «         n# 1 swxY w Y   |�| 	                    ¦   «          t          ||||¬¦  «        }	|	                     |¬¦  «         | j         5  | j                             |¦  «        }
|
�-|
j        |k    r"|	 	                    ¦   «          |
cddd¦  «         S |	| j        |<   ddd¦  «         n# 1 swxY w Y   |	S )zãIdempotently ensure a supervisor is running for ``(task_id, cdp_url)``.

        If a supervisor exists for this task but was bound to a different
        ``cdp_url``, the old one is stopped and a fresh one is started.
        N)r\   r[   rg   rh   rŠ   )rË  rÌ  rÈ   r[   rx   rŒ   rw   r    r>  r’   rf   r�   )r3   r\   r[   rg   rh   rÏ  r—  Ú	thread_okÚloop_okÚ
supervisorÚalreadys              r   Úget_or_startz _SupervisorRegistry.get_or_start¡  sA  € ð ŒZð 
	1ð 
	1Ø”}×(Ò(¨Ñ1Ô1ˆHØÐ#ØÔ# wÒ.Ð.Ø (Ô 0¸Ð <Ð \ÀÔAQ×AZÒAZÑA\ÔA\�IØ&œn°DÐ8ÐX¸X¼^×=VÒ=VÑ=XÔ=X�GØ ð ( Wð (Ø'ð
	1ð 
	1ð 
	1ð 
	1ñ 
	1ô 
	1ð 
	1ð 
	1ð ”×!Ò! '¨4Ñ0Ô0Ð0ð
	1ð 
	1ð 
	1ñ 
	1ô 
	1ð 
	1ð 
	1ð 
	1ð 
	1ð 
	1ð 
	1øøøð 
	1ð 
	1ð 
	1ð 
	1ð ÐØ�MŠM‰OŒOˆOå"ØØØ'Ø-ð	
ñ 
ô 
ˆ
ð 	×Ò ÐÑ/Ô/Ð/ØŒZð 	0ð 	0à”m×'Ò'¨Ñ0Ô0ˆGØÐ" w¤¸'Ò'AÐ'AØ—’Ñ!Ô!Ð!Øð	0ð 	0ð 	0ð 	0ñ 	0ô 	0ð 	0ð 	0ð &0ˆDŒM˜'Ñ"ð	0ð 	0ð 	0ñ 	0ô 	0ð 	0ð 	0ð 	0ð 	0ð 	0ð 	0øøøð 	0ð 	0ð 	0ð 	0ð Ðs0   ˆA1B-ÂB-Â-B1Â4B1Ã>=EÅ
EÅE"Å%E"c                óª   — | j         5  | j                             |d¦  «        }ddd¦  «         n# 1 swxY w Y   |�|                     ¦   «          dS dS )z=Stop and discard the supervisor for ``task_id`` if it exists.N)rË  rÌ  r>  r’   )r3   r\   rÓ  s      r   r’   z_SupervisorRegistry.stopÍ  sš   € àŒZð 	:ð 	:Øœ×*Ò*¨7°DÑ9Ô9ˆJð	:ð 	:ð 	:ñ 	:ô 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:øøøð 	:ð 	:ð 	:ð 	:àÐ!Ø�OŠOÑÔÐÐÐð "Ð!s   ˆ0°4·4c                óú   — | j         5  t          | j                             ¦   «         ¦  «        }| j                             ¦   «          ddd¦  «         n# 1 swxY w Y   |D ]\  }}|                     ¦   «          ŒdS )z<Stop every running supervisor. For shutdown / test teardown.N)rË  rÇ   rÌ  r§  r�   r’   )r3   r§  Ú_rÓ  s       r   Ústop_allz_SupervisorRegistry.stop_allÔ  sÀ   € àŒZð 	"ð 	"Ý˜œ×,Ò,Ñ.Ô.Ñ/Ô/ˆEØŒM×ÒÑ!Ô!Ð!ð	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"ð #ð 	ð 	‰MˆAˆzØ�OŠOÑÔÐÐð	ð 	s   ˆA AÁAÁANrÅ  )r\   r   r   rÍ  )r\   r   r[   r   rg   r   rh   r*   rÏ  r*   r   rf   )r\   r   r   ri   )r6   r7   r8   r9   r„   rÈ   rÆ  rÇ  rÕ  r’   rÙ  r;   r   r   rÉ  rÉ  ‘  s˜   € € € € € ðð ð5ð 5ð 5ð 5ð.ð .ð .ð .ð 3Ø":Ø#ð*ð *ð *ð *ð *ð *ðXð ð ð ðð ð ð ð ð r   rÉ  )rf   rO   rÆ  rÇ  rb  r_  ÚDIALOG_POLICY_MUST_RESPONDr=   rC   r%   ÚSUPERVISOR_REGISTRYrU   rÉ  )r   r   r   r   )r   r   r   r   )/r9   Ú
__future__r   ró   r<  Úloggingro   r
  Údataclassesr   Útypingr   r   r   r   r	   r
   Úwebsockets.asyncio.clientr   Ú	getLoggerr6   rû   r   r   rÚ  r_  rb  Ú	frozensetrl   rÆ  rÇ  r½  r¿  r«   r©   r�  r4  r3  r%   r=   rC   rO   rU   rf   rÉ  rÛ  Ú__all__r;   r   r   ú<module>rä     s  ððð ð( #Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø €€€Ø Ð Ð Ð Ø €€€Ø !Ð !Ð !Ð !Ð !Ð !Ø BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ Bð ð ;Ø:Ð:Ð:Ð:Ð:Ð:à	ˆÔ	˜8Ñ	$Ô	$€ð"ð "ð "ð "ð&4ð 4ð 4ð 4ð ,Ð Ø+Ð Ø)Ð à�)ØÐ!;Ð=VÐWñô €ð 3Ð Ø Ð ð Ð ØÐ ð Ð ð
 Ð ð
 4Ð Ø<Ð&8Ð<Ð<Ð<Ð ð3Ð ðr ð
ð 
ð 
ð 
ð 
ñ 
ô 
ñ „ð
ð4 ð
ð 
ð 
ð 
ð 
ñ 
ô 
ñ „ð
ð8 ðð ð ð ð ñ ô ñ „ðð@ ðð ð ð ð ñ ô ñ „ðð €�$ÐÑÔðð ð ð ð ñ ô ñ Ôðð:j
ð j
ð j
ð j
ð j
ñ j
ô j
ð j
ð`#Ið Ið Ið Ið Iñ Iô Ið IðX *Ð)Ñ+Ô+Ð ðð ð €€€r   