+
    lHàj�   ã                  óÄ   € R t ^ RIHt ^ RIt^ RIt^ RIHtHt ^ RIH	t	H
t
HtHtHtHt ]P                  ! R4      t^t^tRRRR	R
R/t] ! R R4      4       t ! R R4      tR# )af  Frame / OOPIF target tracking half of the CDP supervisor.

Maintains ``CDPSupervisor._frames`` from ``Page.frame*`` and ``Target.*``
events and renders the bounded ``frame_tree`` snapshot payload. ``FrameInfo``
entries for OOPIFs carry the child CDP session id so ``browser_cdp(frame_id=)``
can route calls into the iframe over the supervisor's live socket.
)ÚannotationsN)Ú	dataclassÚreplace)ÚAnyÚCallableÚDictÚListÚOptionalÚTupleztools.browser_supervisorÚ
autoAttachTÚwaitForDebuggerOnStartFÚflattenc                  óv   € ] tR t^t$ RtR]R&   R]R&   R]R&   R]R&   R]R	&   R
tR]R&   RtR]R&   R R ltRt	R
# )Ú	FrameInfozÚOne frame in the page's frame tree. ``is_oopif`` frames have their own CDP
target (reachable via ``cdp_session_id``); same-origin / srcdoc iframes share
the parent process (``is_oopif=False``, ``cdp_session_id=None``).ÚstrÚframe_idÚurlÚoriginúOptional[str]Úparent_frame_idÚboolÚis_oopifNÚcdp_session_idÚ Únamec               ó   € V ^8„  d   QhRR/# ©é   Úreturnúdict[str, Any]© )Úformats   "ÚD/home/ubuntu/.hermes/hermes-agent/tools/browser_supervisor_frames.pyÚ__annotate__ÚFrameInfo.__annotate__(   s   € ÷ ñ ˜ñ ó    c                	ó&  € R V P                   RV P                  RV P                  RV P                  /pRV P                  3RV P
                  3RV P                  33pTP                  V UUu/ uF  w  r4V'       g   K  W4bK  	  upp4       V# u uppi )r   r   r   r   Ú
session_idr   r   )r   r   r   r   r   r   r   Úupdate)ÚselfÚdÚoptionalÚkÚvs   &    r"   Úto_dictÚFrameInfo.to_dict(   s‰   € Ø˜Ÿ™¨¨t¯x©x¸À4Ç;Á;ÐPZÐ\`×\iÑ\iÐjˆØ! 4×#6Ñ#6Ð7Ð:KÈT×MaÑMaÐ9bÐekÐmq×mvÑmvÐdwÐxˆØ	�‰¡8Ô1¡8™4˜1¬q”$�!’$¡8Ò1Ô2Øˆùó 2s   Á,B
Á=B
r    )
Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__annotations__r   r   r.   Ú__static_attributes__r    r%   r"   r   r      sA   ‡ ñIð ƒMØ	ƒHØƒKØ"Ó"ØƒNØ$(€N�MÓ(Ø€Dˆ#ƒN÷ñ r%   r   c            
      ó²   € ] tR t^/t$ RtR R ltR R ltR R ltR R	 ltR
 R lt	RR R llt
R R ltRR R lltR R ltR]R]R]	R]
R]/tR]R&   RtR# )ÚFrameTrackingMixinzNFrame-tree bookkeeping for ``CDPSupervisor`` (event handlers run on its loop).c               ó$   € V ^8„  d   QhRRRRRR/# )r   r'   r   ÚtimeoutÚfloatr   ÚNoner    )r!   s   "r"   r#   ÚFrameTrackingMixin.__annotate__2   s(   € ÷ mñ m°]ð mÐPUð mÐZ^ñ mr%   c             ƒ  óÆ   "  € V P                  RWR7      G Rj  x€L
  V P                  RWR7      G Rj  x€L
  V P                  R\        WR7      G Rj  x€L
  R#  LA L( L
5i)zAPage.enable + Runtime.enable + nested auto-attach on one session.zPage.enable)r'   r:   NzRuntime.enablezTarget.setAutoAttach)Ú_cdpÚ_AUTO_ATTACH_PARAMS)r)   r'   r:   s   &&$r"   Ú_enable_page_domainsÚ'FrameTrackingMixin._enable_page_domains2   sY   é € à�i‰i˜°*ˆiÓN×NÐNØ�i‰iÐ(°ZˆiÓQ×QÐQØ�i‰iÐ.Ô0CÐPZˆiÓl×lÒlñ 	OÙQÙlùs1   ‚A!™AšA!´AµA!ÁAÁA!ÁA!ÁA!c               ó$   € V ^8„  d   QhRRRRRR/# ©r   Úparamsr   r'   r   r   r<   r    )r!   s   "r"   r#   r=   8   s'   € ÷ Rñ R¨ð RÀ]ð RÐW[ñ Rr%   c                	óš   € VP                  R 4      pV'       d2   V P                  \        VRRVP                  R4      RVR7      4       R# R# )ÚframeIdr   ÚparentFrameIdF)r   r   r   r   r   r   N)ÚgetÚ
_set_framer   )r)   rE   r'   r   s   &&& r"   Ú_on_frame_attachedÚ%FrameTrackingMixin._on_frame_attached8   sG   € Ø—:‘:˜iÓ(ˆßØ�O‰OœI¨x¸RÈÐ\b×\fÑ\fÐgvÓ\wØ/4ÀZôQö Rñ r%   c               ó    € V ^8„  d   QhRRRR/# )r   Úframer   r   r<   r    )r!   s   "r"   r#   r=   >   s   € ÷ 1ñ 1 	ð 1¨dñ 1r%   c                	ó˜   € V P                   ;_uu_ 4        WP                  VP                  &   R R R 4       R #   + '       g   i     R # ; i©N)Ú_state_lockÚ_framesr   )r)   rN   s   &&r"   rJ   ÚFrameTrackingMixin._set_frame>   s-   € Ø××ÓØ+0�L‰L˜Ÿ™Ñ(÷ ××Òús	   •8¸A		c               ó$   € V ^8„  d   QhRRRRRR/# rD   r    )r!   s   "r"   r#   r=   B   s"   € ÷ ñ ¨.ð Àmð ÐX\ñ r%   c                	óø  € VP                  R 4      ;'       g    / pVP                  R4      pV'       g   R# V P                  ;_uu_ 4        V P                  P                  V4      ;'       g    \        VRRRRV4      p\        T\	        VP                  R4      ;'       g    R4      \	        VP                  R4      ;'       g    VP                  R4      ;'       g    R4      VP                  R4      ;'       g    VP
                  VP                  VP                  \	        VP                  R	4      ;'       g    VP                  4      R
7      V P                  V&   RRR4       R#   + '       g   i     R# ; i)rN   ÚidNr   Fr   ÚsecurityOriginr   ÚparentIdr   )r   r   r   r   r   r   r   )	rI   rQ   rR   r   r   r   r   r   r   )r)   rE   r'   rN   r   Úolds   &&&   r"   Ú_on_frame_navigatedÚ&FrameTrackingMixin._on_frame_navigatedB   s  € Ø—
‘
˜7Ó#×)Ð) rˆØ—9‘9˜T“?ˆßÙØ××ÓØ—,‘,×"Ñ" 8Ó,×dÐd´	¸(ÀBÈÈDÐRWÐYcÓ0dˆCÜ%.Ø!¤s¨5¯9©9°UÓ+;×+AÐ+A¸rÓ'BÜ˜5Ÿ9™9Ð%5Ó6×SÐS¸%¿)¹)ÀHÓ:M×SÐSÐQSÓTØ %§	¡	¨*Ó 5× LÐ L¸×9LÑ9LÐWZ×WcÑWcØ"×1Ñ1¼¸E¿I¹IÀfÓ<M×<YÐ<YÐQT×QYÑQYÓ8Zô	&ˆD�L‰L˜Ñ"÷ ××Òús+   ÁAE(Â""E(ÃE(ÃE(Ã<>E(Ä;#E(Å(E9	c               ó$   € V ^8„  d   QhRRRRRR/# rD   r    )r!   s   "r"   r#   r=   P   s"   € ÷ 1ñ 1¨ð 1À]ð 1ÐW[ñ 1r%   c                óÒ  € VP                  R4      pV'       d8   \        VP                  R4      ;'       g    R4      P                  4       R8X  d   R# V P                  ;_uu_ 4        V P                  P                  V4      pV'       d%   VP
                  '       d   VP                  '       g   V P                  P                  VR4       RRR4       R#   + '       g   i     R# ; i)uF  Drop a frame only when it's truly gone. ``reason="swap"`` = migrating processes
(e.g. promoted to an OOPIF) â€” dropping would hide the iframe. Even with ``remove``
the parent only knows the child left ITS process; a live child session means it's
still alive, so keep it until Target.detached + a later frameDetached clear it.rG   ÚreasonÚremoveÚswapN)rI   r   ÚlowerrQ   rR   r   r   Úpop)r)   rE   r'   r   rY   s   &&&  r"   Ú_on_frame_detachedÚ%FrameTrackingMixin._on_frame_detachedP   s—   € ð
 —:‘:˜iÓ(ˆßœ3˜vŸz™z¨(Ó3×?Ð?°xÓ@×FÑFÓHÈFÔRÙØ××ÓØ—,‘,×"Ñ" 8Ó,ˆCß˜CŸLŸL˜L¨S×-?×-?Ð-?Ø—‘× Ñ  ¨4Ô0÷ ××Òús   Á'5CÂCÂ/CÃC&	Nc               ó$   € V ^8„  d   QhRRRRRR/# rD   r    )r!   s   "r"   r#   r=   ]   s"   € ÷ =ñ =°ð =ÈMð =Ðeiñ =r%   c              ƒ  	óÐ  "  € VP                  R 4      ;'       g    / pVP                  R4      pVP                  R4      pV'       d   VR9  d   R# VR8X  dÕ   VP                  R4      pV P                  ;_uu_ 4        V P                  P                  V4      p\        T\	        VP                  R4      ;'       g    R4      RRTV'       d   VP
                  MR\	        VP                  R	4      ;'       g    V'       d   VP                  MR4      R
7      V P                  V&   RRR4       \        P                  ! V P                  V4      4       R#   + '       g   i     L7; i5i)Ú
targetInfoÚ	sessionIdÚtypeÚiframeNÚtargetIdr   r   TÚtitle)r   r   r   r   r   r   r   >   rj   Úworker)
rI   rQ   rR   r   r   r   r   ÚasyncioÚcreate_taskÚ_enable_child_domains)r)   rE   r'   ÚinfoÚsidÚtarget_typeÚ	target_idrY   s   &&&     r"   Ú_on_target_attachedÚ&FrameTrackingMixin._on_target_attached]   s   é € Ø�z‰z˜,Ó'×-Ð-¨2ˆØ�j‰j˜Ó%ˆØ—h‘h˜vÓ&ˆß�kÐ)=Ô=ÙØ˜(Ô"ð Ÿ™ Ó,ˆIØ×!×!Ó!Ø—l‘l×&Ñ& yÓ1�Ü*3Ø&¬C°·±¸³×0EÐ0EÀ2Ó,FÈrÐ\`Ðqtß;> C×$7Ò$7ÀDÌsÐSW×S[ÑS[Ð\cÓSd÷  TBð  TB×uxÐil×iqÒiqð  Aó  PCô+�—‘˜YÑ'÷ "ô 	×Ò˜D×6Ñ6°sÓ;Ö<÷ "×!üs7   ‚AE&Á5E&Á=AEÃ)EÃ7EÄ $EÄ$/E&ÅE#	ÅE&c               ó    € V ^8„  d   QhRRRR/# )r   rr   r   r   r<   r    )r!   s   "r"   r#   r=   q   s   € ÷ /ñ /¨sð /°tñ /r%   c              ƒ  óì   "  €  V P                  VRR7      G Rj  x€L
  V P	                  V4      G Rj  x€L
  R#  L  \         d)   p\        P                  RTR,          T4        Rp?LKRp?ii ; i L>5i)zUEnable Page+Runtime (+nested setAutoAttach) and the dialog bridge on a child session.g      @)r:   Nz!child session %s setup failed: %s:Né   N)rA   Ú	ExceptionÚloggerÚdebugÚ_install_dialog_bridge)r)   rr   Úes   && r"   rp   Ú(FrameTrackingMixin._enable_child_domainsq   sl   é € ð	KØ×+Ñ+¨C¸Ð+Ó=×=Ð=ð ×)Ñ)¨#Ó.×.Ò.ñ >øÜô 	KÜ�L‰LÐ<¸cÀ#½hÈ×JÑJûð	Kúá.ùsA   ‚A4„< š:›< ŸA4³A2´A4º< ¼A/ÁA*Á%A4Á*A/Á/A4c               ó$   € V ^8„  d   QhRRRRRR/# rD   r    )r!   s   "r"   r#   r=   y   s"   € ÷ 	>ñ 	>¨.ð 	>Àmð 	>Ð_cñ 	>r%   c                óv  € VP                  R4      pV'       g   R# V P                  ;_uu_ 4        V P                  P                  V P                  P	                  4        UUu/ uF&  w  rEVP
                  V8X  g   K  V\        VRR7      bK(  	  upp4       RRR4       R# u uppi   + '       g   i     R# ; i)zýClear the session binding of frames on a detached child session. Frames are
deliberately NOT dropped: Browserbase fires transient detaches during page transitions
while the iframe is still visible; ``Page.frameDetached`` cleans up if it truly goes away.rh   N)r   )rI   rQ   rR   r(   Úitemsr   r   )r)   rE   r'   rr   ÚfidÚfs   &&&   r"   Ú_on_target_detachedÚ&FrameTrackingMixin._on_target_detachedy   s˜   € ð �j‰j˜Ó%ˆßÙØ××ÓØ�L‰L×ÑÐTX×T`ÑT`×TfÑTfÔThô !=ÑThÉ&È#Ø$%×$4Ñ$4¸Ñ$;ô "F ¤g¨aÀÔ&EÒ!EÑThò !=ô >÷ Ñùó!=÷ ×Ðús#   °3B'Á#B!Á=B!ÂB'Â!B'Â'B8	c               ó   € V ^8„  d   QhRR/# r   r    )r!   s   "r"   r#   r=   „   s   € ÷ cñ c¨.ñ cr%   c                ó|  aa	a
€ V P                   pVP                  4        Uu. uF  q"P                  '       d   K  VNK  	  pp\        R V 4       V'       d
   V^ ,          MR4      pVf	   RRR. RR/# . pRpVP                  4        Uu. uF#  q"P                  VP                  8X  g   K  V^3NK%  	  ppVP                  0o
V'       dÄ   \        V4      \        8  d°   VP                  ^ 4      w  o	oS	P                  S
9   d   KC  S
P                  S	P                  4       S	P                  '       d   S\        8”  d   RpK  VP                  S	P                  4       4       VP                  VV	V
3R lVP                  4        4       4       KË  RVP                  4       RTRT;'       g    \        V4      /# u upi u upi )	zÊCapped frame_tree payload (must hold state lock). Top frame = one with
no parent, preferring oopif=False; BFS from it, capped by
FRAME_TREE_MAX_ENTRIES and FRAME_TREE_MAX_OOPIF_DEPTH for OOPIF branches.c              3  óL   "  € T F  qP                   '       d   K  Vx € K  	  R # 5irP   )r   )Ú.0r„   s   & r"   Ú	<genexpr>Ú>FrameTrackingMixin._build_frame_tree_locked.<locals>.<genexpr>Š   s   é € Ð6™t˜!¯:­:—A’A›tùs   ‚$š
$NÚtopÚchildrenÚ	truncatedFTc              3  óš   <"  € T F@  pVP                   SP                  8X  g   K   VP                  S9  g   K3  VS^,           3x € KB  	  R# 5i)é   N)r   r   )rŠ   r„   ÚdepthrN   Úvisiteds   & €€€r"   r‹   rŒ   ›   sE   øé € ð _±¨AØ×-Ñ-°·±Ñ?ô (ØDEÇJÁJÐV]ÑD]ô (˜!˜U Q�Y�³ùs   ƒA¥A¸A)rR   Úvaluesr   Únextr   ÚlenÚFRAME_TREE_MAX_ENTRIESrb   Úaddr   ÚFRAME_TREE_MAX_OOPIF_DEPTHÚappendr.   Úextendr   )r)   Úframesr„   Útopsr�   rŽ   r�   Úqueuer’   rN   r“   s   &       @@@r"   Ú_build_frame_tree_lockedÚ+FrameTrackingMixin._build_frame_tree_locked„   sh  ú€ ð —‘ˆØ!Ÿ=™=œ?ÓD™?�a×2CÕ2C—�™?ˆÐDÜÑ6™tÓ6Ç4¸¸Q¾ÈTÓRˆØŠ;Ø˜4 ¨R°¸eÐDÐDà)+ˆØˆ	Ø>D¿m¹m¼oÓ-s¹o¸×QbÑQbÐfi×frÑfrÑQr¬f¨q°!«f¹oˆÐ-sØ—<‘<�.ˆßœ˜H›Ô(>Ô>Ø Ÿ9™9 Q›<‰LˆE�5Ø�~‰~ Ô(ÙØ�K‰K˜Ÿ™Ô'Ø�~�~ˆ~ %Ô*DÔ"DØ �	ÙØ�O‰O˜EŸM™M›OÔ,Ø�L‰Lö _°·±´ó _ö _à�s—{‘{“} j°(¸KÈ×IaÐIaÔVZÐ[`ÓVaÐbÐbùò) Eùò .ts   ¢F4ºF4ÂF9Â)F9zPage.frameAttachedzPage.frameNavigatedzPage.frameDetachedzTarget.attachedToTargetzTarget.detachedFromTargetzdict[str, Callable[..., Any]]ÚEVENT_HANDLERSr    rP   )r0   r1   r2   r3   r4   rA   rK   rJ   rZ   rc   ru   rp   r…   rŸ   r¡   r5   r6   r    r%   r"   r8   r8   /   sd   ‡ ÙXõmõRõ1õõ1÷=õ(/÷	>õcð: 	Ð0ØÐ2ØÐ0Ø!Ð#6Ø#Ð%8ð5€NÐ1÷ r%   r8   )r4   Ú
__future__r   rn   ÚloggingÚdataclassesr   r   Útypingr   r   r   r   r	   r
   Ú	getLoggerr{   r—   r™   r@   r   r8   r    r%   r"   Ú<module>r§      sy   ðñõ #ã Û ß *ß =× =ð 
×	Ò	Ð5Ó	6€ð Ð ØÐ à# TÐ+CÀUÈIÐW[Ð\Ð ð ÷ð ó ð÷(wó wr%   