+
    jHàjŸd  ã                  ó°  € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIHtH	t	 ^ RI
HtHtHtHt ]P                  ! ]4      t]! 4       tRtRtRt^t]! 0 R8m4      t]! RR04      t]! R	R
04      tRtRtR R ltR R ltR9R R llt R9R R llt!RR/R R llt" ! R R]#4      t$ ! R R]$4      t% ! R R]$4      t& ! R R]$4      t' ! R  R!]$4      t( ! R" R#]$4      t)]! R$R%7       ! R& R'4      4       t*R:t+R( R) lt,]! R$R%7       ! R* R+4      4       t-] ! R, R-4      4       t.] ! R. R/4      4       t/] ! R0 R14      4       t0R2 R3 lt1 ! R4 R54      t2]2! 4       t3R6 R7 lt4R# );a.  Transport-neutral browser-control broker core: binds an identity-scoped *controller*
(the party driving a browser) to *callers* on any transport. Tickets are short-lived,
single-use, identity-bound and consumed exactly once; ``select`` matches every stable
identity field plus the current capability set; ``complete`` is single-shot; ``detach``
fails pending work closed while ``disconnect`` only marks the transport offline. State
changes happen under one RLock; the send callback runs *outside* it so a controller may
``complete`` from inside its own send.)ÚannotationsN)Ú	dataclassÚfield)ÚAnyÚCallableÚDictÚOptionalg      >@i   Úbrowser_cdpÚbrowser_evaluateÚbrowser_artifact_downloadÚbrowser_artifact_uploadzbrowser.controller.commandzbrowser.controller.cancelc               ó    € V ^8„  d   QhRRRR/# )é   Úvaluer   ÚreturnÚbool© )Úformats   "ÚC/home/ubuntu/.hermes/hermes-agent/gateway/browser_control_broker.pyÚ__annotate__r   -   s   € ÷ Lñ L¨cð L°dñ Ló    c                óF   € \        V 4      \        J ;'       d
    V \        8H  # )z@Return whether ``value`` names the exact supported wire version.)ÚtypeÚintÚ BROWSER_CONTROL_PROTOCOL_VERSION)r   s   &r   Ú"browser_control_protocol_supportedr   -   s   € ä�‹;œ#Ð×KÐK %Ô+KÑ"KÐKr   c               ó$   € V ^8„  d   QhRRRRRR/# )r   ÚconfigúOptional[dict]ÚkeyÚstrr   r   r   )r   s   "r   r   r   2   s&   € ÷ ]ñ ] Nð ]¸ð ]Àñ ]r   c                óF  € V f    ^ RI Hp V! 4       p \        V \        4      '       d   V P                  R4      MRp\        V\        4      '       d   VP                  R4      MRp\        V\        4      ;'       d    VP                  VR4      RJ #   \         d     R# i ; i)zMRead ``browser.extension_control.<key>`` as a literal ``True`` (default off).N)Úload_config_readonlyFÚbrowserÚextension_controlT)Úhermes_cli.configr"   Ú	ExceptionÚ
isinstanceÚdictÚget)r   r   r"   r#   r$   s   &&   r   Ú_extension_control_flagr*   2   s“   € à‚~ð	å>Ù)Ó+ˆFô (2°&¼$×'?Ò'?ˆf�j‰j˜Ô#ÀT€GÜ<FÀwÔPT×<UÒ<U˜Ÿ™Ð$7Ô8Ð[_ÐÜÐ'¬Ó.×\Ð\Ð3D×3HÑ3HÈÈeÓ3TÐX\Ð3\Ð\øô	 ô 	Úð	ús   †B ÂB ÂB c               ó    € V ^8„  d   QhRRRR/# ©r   r   r   r   r   r   )r   s   "r   r   r   @   s   € ÷ =ñ =¨>ð =ÀTñ =r   c                ó   € \        V R4      # )zFExplicit Developer Mode flag; gates ``browser_evaluate``/raw CDP only.Údeveloper_mode©r*   ©r   s   &r   Úbrowser_control_developer_moder1   @   s   € ä" 6Ð+;Ó<Ð<r   c               ó    € V ^8„  d   QhRRRR/# r,   r   )r   s   "r   r   r   E   s   € ÷ 6ñ 6 Nð 6¸dñ 6r   c                ó   € \        V R4      # )zGReturn the explicit browser-control feature flag (disabled by default).Úenabledr/   r0   s   &r   Úbrowser_control_enabledr5   E   s   € ä" 6¨9Ó5Ð5r   r.   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r   r   r.   úOptional[bool]r   Ú	frozensetr   )r   s   "r   r   r   J   s'   € ÷ Nñ N¨sð NÀ~ð NÐajñ Nr   c               óÒ   a€ \        V \        4      '       g   \        4       # \        \        ,          oVf   \        4       MTRJ d   S\        ,          o\        V3R lV  4       4      # )zaPermitted subset of a capability list (non-list -> empty); developer caps only in Developer Mode.Tc              3  ój   <"  € T F(  p\        V\        4      '       g   K  VS9   g   K$  Vx € K*  	  R # 5i©N)r'   r    )Ú.0ÚcÚalloweds   & €r   Ú	<genexpr>Ú6filter_browser_control_capabilities.<locals>.<genexpr>Q   s$   øé € ÐM¡˜1¬°A´s×);”QÀÀWÁ—Q’Q£ùs   ƒ3 3©
3)r'   Úlistr8   ÚBROWSER_CONTROL_CAPABILITIESÚ%BROWSER_CONTROL_ARTIFACT_CAPABILITIESr1   Ú&BROWSER_CONTROL_DEVELOPER_CAPABILITIES)r   r.   r>   s   &$@r   Ú#filter_browser_control_capabilitiesrE   J   sS   ø€ ä�eœT×"Ò"Ü‹{ÐÜ*Ô-RÕR€GØ,:Ò,BÔ&Ô(ÈÐ[_Ó_ØÔ9Õ9ˆÜÔM¡ÓMÓMÐMr   c                  ó   € ] tR t^TtRtRtR# )ÚBrowserControlErrorz(Base class for broker contract failures.r   N©Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__static_attributes__r   r   r   rG   rG   T   s   † Ý2r   rG   c                  ó   € ] tR t^XtRtRtR# )ÚControllerTicketInvalidz?A registration ticket is unknown, already consumed, or expired.r   NrH   r   r   r   rP   rP   X   ó   † ÝIr   rP   c                  ó   € ] tR t^\tRtRtR# )ÚControllerUnavailablezFNo attached controller exactly matches the requested scope/capability.r   NrH   r   r   r   rS   rS   \   s   † ÝPr   rS   c                  ó   € ] tR t^`tRtRtR# )ÚControllerCancelledz:A pending command was cancelled (explicitly or by detach).r   NrH   r   r   r   rU   rU   `   s   † ÝDr   rU   c                  ó   € ] tR t^dtRtRtR# )ÚControllerTimeoutz?The controller did not complete the command before the timeout.r   NrH   r   r   r   rW   rW   d   rQ   r   rW   c                  ó   € ] tR t^htRtRtR# )ÚControllerRejectedz7The controller completed the command with ``ok=False``.r   NrH   r   r   r   rY   rY   h   s   † ÝAr   rY   T)Úfrozenc                  óˆ   € ] tR t^lt$ RtRtR]R&   RtR]R&   RtR]R&   Rt	R]R&   Rt
R]R&   RtR]R	&   ]! 4       tR
]R&   RtR# )ÚControllerScopezKExact controller identity plus capability set; equality is over all fields.NúOptional[str]Úprincipal_idÚ
profile_idÚ
session_idÚcontroller_idÚbrowser_profile_idÚtransport_familyr8   Úcapabilitiesr   )rI   rJ   rK   rL   rM   r^   Ú__annotations__r_   r`   ra   rb   rc   r8   rd   rN   r   r   r   r\   r\   l   sO   ‡ áUØ"&€L�-Ó&Ø $€J�Ó$Ø $€J�Ó$Ø#'€M�=Ó'Ø(,Ð˜Ó,Ø&*Ð�mÓ*Ù'›k€L�)×)r   r\   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úfirstr\   Úsecondr   r   r   )r   s   "r   r   r   |   s&   € ÷ [ñ [ ð [¸ð [ÈTñ [r   c                óŽ   a a€ \         ;QJ d$    V V3R  l\         4       F  '       d   K   R# 	  R# ! V V3R  l\         4       4      # )c              3  óV   <"  € T F  p\        SV4      \        SV4      8H  x € K   	  R # 5ir;   )Úgetattr)r<   Únamerg   rh   s   & €€r   r?   Ú'_same_scope_identity.<locals>.<genexpr>}   s&   øé € ÐZÑIYÀŒw�u˜dÓ#¤w¨v°tÓ'<Ö<ÓIYùs   ƒ&)FT)ÚallÚ_IDENTITY_FIELDS)rg   rh   s   ffr   Ú_same_scope_identityrp   |   s.   ù€ ß‹3ÕZÕIYÓZ�3Œ3ÐZŠ3ÐZˆ3ÕZÕIYÓZÓZÐZr   c                  ó0   € ] tR t^€t$ RtR]R&   R]R&   RtR# )ÚTicketz+Opaque, single-use registration credential.r    r   ÚfloatÚ
expires_atr   N)rI   rJ   rK   rL   rM   re   rN   r   r   r   rr   rr   €   s   ‡ á5ØƒJØ×r   rr   c                  ó:   € ] tR t^‡t$ R]R&   R]R&   RtR]R&   RtR	# )
Ú_TicketRecordr\   Úscopers   rt   Fr   Úconsumedr   N)rI   rJ   rK   rL   re   rx   rN   r   r   r   rv   rv   ‡   s   ‡ àÓØÓØ€Hˆd×r   rv   c                  ó”   € ] tR t^Žt$ R]R&   R]R&   RtR]R&   RtR	]R
&   ]! ]R7      t	R]R&   ]! ]
P                  R7      tR]R&   RtR# )Ú_Controllerr\   rw   úCallable[[dict], None]ÚsendNr   ÚownerTr   Ú	connected©Údefault_factoryz
list[dict]Údeferred_cancelszthreading.LockÚ	send_lockr   )rI   rJ   rK   rL   re   r}   r~   r   rA   r�   Ú	threadingÚLockr‚   rN   r   r   r   rz   rz   Ž   sE   ‡ àÓØ
 Ó Ø€Eˆ3ÓØ€IˆtÓÙ#(¸Ô#>Ð�jÓ>á %°i·n±nÔ E€Iˆ~×Er   rz   c                  óž   € ] tR t^™t$ R]R&   R]R&   R]R&   ]! ]P                  R7      tR]R	&   R
t	R]R&   R
t
R]R&   R
tR]R&   RtR]R&   RtR# )Ú_PendingCommandr\   rw   r    Ú
command_idr]   Útool_call_idr   zthreading.EventÚeventFr   ÚdoneÚ	cancelledÚokNr   Úresultr   )rI   rJ   rK   rL   re   r   rƒ   ÚEventr‰   rŠ   r‹   rŒ   r�   rN   r   r   r   r†   r†   ™   sN   ‡ àÓØƒOØÓÙ"°9·?±?ÔC€Eˆ?ÓCØ€Dˆ$ÓØ€IˆtÓØ€BˆÓØ€FˆC×r   r†   c               ó    € V ^8„  d   QhRRRR/# )r   Úpendingr†   r   r(   r   )r   s   "r   r   r   ¥   s   € ÷ xñ x˜?ð x¨tñ xr   c                óF   € R \         RRV P                  RV P                  //# )ÚmethodÚparamsr‡   rˆ   )ÚFRAME_CANCELr‡   rˆ   )r�   s   &r   Ú_cancel_framer•   ¥   s(   € Ø”l H¨|¸W×=OÑ=OÐQ_Ðah×auÑauÐ.vÐwÐwr   c                  ó   € ] tR t^©tRtR]R]RRRR/R R llt]R	 R
 l4       t	RR/R R llt
R R ltR R ltR R ltR R ltR R ltRR/R R lltR R ltR R ltR]/R R  lltR]R!R"/R# R$ lltR%RR&R/R' R( lltR)RR*R/R+ R, lltR- R. ltR/ R0 ltR1 R2 ltR3 R4 ltR5 R6 ltR7 R8 ltR9 R: ltR;RR<RR=RR>R/R? R@ lltR;RR<RR=RR>R/RA RB llt RC RD lt!RE RF lt"]RG RH l4       t#]RI RJ l4       t$RKt%R# )LÚBrowserControlBrokerzNThread-safe broker core; ``clock`` is injectable (default ``time.monotonic``).Ú
ticket_ttlÚcommand_timeoutÚclockNr.   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r   r˜   rs   r™   rš   zOptional[Callable[[], float]]r.   r7   r   ÚNoner   )r   s   "r   r   Ú!BrowserControlBroker.__annotate__«   s3   € ÷ =ñ = eð =ÐSXð =Ø5ð=ØN\ð=Øhlñ=r   c               	óÞ   € Wn         W n        Ve   TM\        P                  V n        \
        P                  ! 4       V n        / V n        / V n	        / V n
        Vf   R MVRJ V n        / V n        R # )NT)Ú_ticket_ttlÚ_command_timeoutÚtimeÚ	monotonicÚ_clockrƒ   ÚRLockÚ_lockÚ_ticketsÚ_controllersÚ_pendingÚ_developer_mode_pinnedÚ_artifact_stores)Úselfr˜   r™   rš   r.   s   &$$$$r   Ú__init__ÚBrowserControlBroker.__init__«   se   € à%ÔØ /ÔØ$Ò0‘e´d·n±nˆŒÜ—_’_Ó&ˆŒ
Ø24ˆŒØ@BˆÔØ46ˆŒð ?MÒ>T±dÐZhÐlpÐZpˆÔ#à:<ˆÖr   c               ó   € V ^8„  d   QhRR/# )r   r   r   r   )r   s   "r   r   r�   »   s   € ÷ ñ  ñ r   c                óp   € V P                   e   V P                   #  \        4       #   \         d     R# i ; i)zWWhether privileged capabilities may be selected/dispatched (live config unless pinned).F)r©   r1   r&   ©r«   s   &r   r.   Ú#BrowserControlBroker.developer_modeº   s<   € ð ×&Ñ&Ò2Ø×.Ñ.Ð.ð	Ü1Ó3Ð3øÜô 	Úð	ús   œ	& ¦5´5r_   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Ústorer   r_   r]   r   rœ   r   )r   s   "r   r   r�   Ä   s"   € ÷ 6ñ 6¨3ð 6¸}ð 6ÐX\ñ 6r   c               óf   € Vf   V P                   P                  VR4       R# WP                   V&   R# )z»Attach a store exposing ``validate(artifact_id, *, scope) -> receipt`` for one profile
(``None`` = default slot); ``store=None`` clears the slot. Artifact actions fail closed without one.N)rª   Úpop)r«   r³   r_   s   &&$r   Úattach_artifact_storeÚ*BrowserControlBroker.attach_artifact_storeÄ   s-   € ð Š=Ø×!Ñ!×%Ñ% j°$Ö7à05×!Ñ! *Ó-r   c               ó    € V ^8„  d   QhRRRR/# )r   rw   r\   r   r   r   )r   s   "r   r   r�   Ì   s   € ÷ Oñ O¨ð OÀ3ñ Or   c                	ó¤   € V P                   P                  \        VR R4      ;'       g    R4      pVe   V# V P                   P                  R4      # )r_   N)rª   r)   rk   )r«   rw   r³   s   && r   Ú_artifact_store_for_scopeÚ.BrowserControlBroker._artifact_store_for_scopeÌ   sK   € Ø×%Ñ%×)Ñ)¬'°%¸ÀtÓ*L×*TÐ*TÐPTÓUˆØÒ)ˆuÐN¨t×/DÑ/D×/HÑ/HÈÓ/NÐNr   c               ó    € V ^8„  d   QhRRRR/# )r   rw   r\   r   rr   r   )r   s   "r   r   r�   Ð   s   € ÷ Añ A ð A°Vñ Ar   c                óÌ  € V P                  4       pV P                  ;_uu_ 4        V P                  P                  4        UUu/ uF  w  r4VP                  V8”  g   K  W4bK  	  uppV n        \
        P                  ! ^ 4      p\        WV P                  ,           R7      ;V P                  V&   pRRR4       \        XXP                  R7      # u uppi   + '       g   i     L-; i)z9Mint a short-lived, single-use ticket bound to ``scope``.)rw   rt   N)r   rt   )
r£   r¥   r¦   Úitemsrt   ÚsecretsÚtoken_urlsaferv   rŸ   rr   )r«   rw   ÚnowÚvÚrecr   Úrecords   &&     r   Úmint_ticketÚ BrowserControlBroker.mint_ticketÐ   s©   € à�k‰k‹mˆØ�Z�Z‹ZØ26·-±-×2EÑ2EÔ2GÔ`Ñ2G©¨È3Ï>É>Ð\_ÑK_œV˜QšVÑ2GÒ`ˆDŒMÜ×)Ò)¨"Ó-ˆEÜ,9ÀÐX\×XhÑXhÕRhÔ,iÐiˆD�M‰M˜%Ñ  6÷ ô ˜E¨f×.?Ñ.?Ô@Ð@ùó a÷ �Zús$   ¥CÁC
ÁC
Á#ACÃCÃC#	c               ó    € V ^8„  d   QhRRRR/# )r   r   r    r   r\   r   )r   s   "r   r   r�   Ù   s   € ÷  ñ   Cð  ¨Oñ  r   c                ór  € V P                  4       pV P                  ;_uu_ 4        V P                  P                  V4      pVf   \	        R4      hVP
                  '       d   \	        R4      hW#P                  8”  d   \	        R4      hRVn        VP                  uuRRR4       #   + '       g   i     R# ; i)zbExchange a ticket for its scope exactly once; unknown/consumed/expired -> ControllerTicketInvalid.Nzunknown ticketzticket already consumedzticket expiredT)r£   r¥   r¦   r)   rP   rx   rt   rw   )r«   r   rÁ   rÄ   s   &&  r   Úconsume_ticketÚ#BrowserControlBroker.consume_ticketÙ   s‚   € à�k‰k‹mˆØ�Z�Z‹ZØ—]‘]×&Ñ& uÓ-ˆFØŠ~Ü-Ð.>Ó?Ð?Ø��ˆÜ-Ð.GÓHÐHØ×&Ñ&Ô&Ü-Ð.>Ó?Ð?Ø"ˆFŒOØ—<‘<÷ �Z�Z‹Zús   ¥<B%Á"8B%Â%B6	c               ó    € V ^8„  d   QhRRRR/# ©r   rw   r\   r   úOptional[_Controller]r   )r   s   "r   r   r�   ç   s   € ÷ kñ k°_ð kÐI^ñ kr   c                ó`   a€ \        V3R lV P                  P                  4        4       R4      # )zKAttached controller sharing ``scope``'s stable identity (any capabilities).c              3  ód   <"  € T F%  p\        VP                  S4      '       g   K!  Vx € K'  	  R # 5ir;   )rp   rw   )r<   r=   rw   s   & €r   r?   ÚGBrowserControlBroker._controller_for_identity_locked.<locals>.<genexpr>é   s'   øé € ÐcÑ :˜1Ô>RÐST×SZÑSZÐ\a×>b—Q’QÓ :ùs   ƒ0¦
0N)Únextr§   Úvalues)r«   rw   s   &fr   Ú_controller_for_identity_lockedÚ4BrowserControlBroker._controller_for_identity_lockedç   s&   ø€ äÔc × 1Ñ 1× 8Ñ 8Ô :ÓcÐeiÓjÐjr   c               ó    € V ^8„  d   QhRRRR/# rÌ   r   )r   s   "r   r   r�   ë   s   € ÷ Wñ W oð WÐ:Oñ Wr   c                	ó¸   € V P                   ;_uu_ 4        V P                  V4      pR R R 4       Xe   VP                  '       d   V# R #   + '       g   i     L*; ir;   )r¥   rÓ   r~   )r«   rw   Ú
controllers   && r   Ú_live_controllerÚ%BrowserControlBroker._live_controllerë   sD   € Ø�Z�Z‹ZØ×=Ñ=¸eÓDˆJ÷ à'Ò3¸
×8L×8LÐ8LˆzÐVÐRVÐV÷ �Zús   •A	Á	A	r}   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   rw   r\   r|   r{   r}   r   r   rœ   r   )r   s   "r   r   r�   ð   s+   € ÷ /ñ /˜Oð /Ð3Ið /ÐUXð /Ðdhñ /r   c          
     ó´  €  V P                   ;_uu_ 4        V P                  V4      pV P                   Uu. uFy  p\        WQ4      '       d   K  VP                  VP
                  VP                  VP                  3VP                  VP
                  VP                  VP                  38X  g   Kw  VNK{  	  ppVf.   V'       g&   \        WVR7      V P                  V&    RRR4       R# RRR4       X'       d    V F  pV P                  VRR7       K  	  EK  XP                  ;_uu_ 4        V P                   ;_uu_ 4        V P                  P                  VP                  4      VJd    RRR4       RRR4       EK}  V P                  P                  VP                  R4       WVR3w  Vn        Vn        Vn        Vn        V P#                  V4       F	  pWn        K  	  VP$                  . uq”n        W@P                  V&   RRR4       \'        X	4       F  w  r« V! V4       K  	  V P                   ;_uu_ 4        V P                  P                  V4      VJ d   RVn        RRR4        RRR4       R# u upi   + '       g   i     ELš; i  + '       g   i     L”; i  \(         d    \*        P-                  R4        Mi ; iT P                   ;_uu_ 4        T P                  P                  T4      TJ d   YšR \.        ) R Tn        RRR4       M  + '       g   i     M; i\1        R4      h  + '       g   i     LÙ; i  + '       g   i     EKV  ; i)zôAttach or refresh the controller for one stable identity: a same-identity reconnect refreshes send
and capabilities without cancelling pending work; a different controller/browser profile in the same
authenticated session lane hard-replaces it.TN)rw   r|   r}   F)Únotify_controllerz2failed to flush deferred browser-controller cancelz=browser controller reconnect could not flush deferred cancels)r¥   rÓ   r§   rp   r^   r_   r`   rc   rz   Údetachr‚   r)   rw   rµ   r|   r}   r~   Ú_pending_for_scope_lockedr�   Ú	enumerater&   ÚloggerÚ	exceptionÚMAX_DEFERRED_CANCELSÚConnectionError)r«   rw   r|   r}   Úexistingr=   Úlane_scopesÚ
lane_scoper�   ÚdeferredÚindexÚframes   &&&$        r   ÚattachÚBrowserControlBroker.attachð   s«  € ð Ø——“Ø×?Ñ?ÀÓF�à#×0Ò0óÙ0˜!Ô8LÈQ×8V”AØŸ™¨¯©°q·|±|ÀQ×EWÑEWÐXØ×*Ñ*¨E×,<Ñ,<¸e×>NÑ>NÐPU×PfÑPfÐgñh÷ �AÑ0ð ð ð
 Ò#¯KÜ/:ÀÐY^Ô/_�D×%Ñ% eÑ,Ø÷ —‘÷ Û"-�JØ—K‘K 
¸e�KÖDñ #.âà×#×#Ó#Ø—Z—Z“ZØ×(Ñ(×,Ñ,¨X¯^©^Ó<ÀHÓLØ ÷  ÷ $Ò#ð ×%Ñ%×)Ñ)¨(¯.©.¸$Ô?ØX]ÐejÐlqÐXqÑU�H”N H¤M°8´>À8ÔCUØ#'×#AÑ#AÀ%Ö#H˜Ø(-žñ $Ià:B×:SÑ:SÐUWÐ7�HÔ7Ø/7×%Ñ% eÑ,÷  ô %.¨hÖ$7‘L�Eð_Ù˜UœÙ ñ %8ð —Z—Z“ZØ×(Ñ(×,Ñ,¨UÓ3°xÓ?Ø-1˜Ô*÷  ð ÷1 $Ñ#ùò!÷ —�ú÷&  —Zûô %ô _Ü×(Ñ(Ð)]Ö^ð_úàŸŸ›Ø×,Ñ,×0Ñ0°Ó7¸8ÓCØ8@ÀÐ8HÔJ^ÐI^ÐI_Ð8`˜HÔ5÷ $ŸŸ˜úô *Ð*iÓjÐjß—Zú÷+ $×#Ñ#ús´   – I9¶I4ÁAI4Â/I4Â5I9ÃI9Ä+MÅ +J	Å+MÅ>BJ	ÈMÈJ È"MÈ:'L2	É!	MÉ4I9É9J
	ÊJÊMÊ  K	Ë MËK	ËMË1LÌ	MÌL$ÌMÌ2MÌ=MÍM	c               ó$   € V ^8„  d   QhRRRRRR/# )r   rw   r\   Ú
capabilityr    r   rÍ   r   )r   s   "r   r   r�   !  s'   € ÷ nñ n˜Oð n¸ð nÐAVñ nr   c                ó¦   € V\         9   d   V P                  '       g   R# V P                  V4      pVe   W#P                  P                  9   d   V# R# )zÁConnected controller matching identity whose *current* negotiated set holds ``capability`` (the
caller's set is not authoritative); developer capabilities are also gated on LIVE Developer Mode.N)rD   r.   rØ   rw   rd   )r«   rw   rí   r×   s   &&& r   ÚselectÚBrowserControlBroker.select!  sM   € ð Ô?Ô?È×H[×H[ÐH[ÙØ×*Ñ*¨5Ó1ˆ
Ø'Ò3¸
×FVÑFV×FcÑFcÔ8cˆzÐmÐimÐmr   c               ó$   € V ^8„  d   QhRRRRRR/# ©r   rw   r\   r}   r   r   r   r   )r   s   "r   r   r�   )  s&   € ÷ Dñ D˜oð D°cð D¸dñ Dr   c                óX   € V P                  V4      pVRJ;'       d    VP                  VJ # )zUWhether ``owner`` is the exact live transport for ``scope`` (capability-independent).N)rØ   r}   )r«   rw   r}   r×   s   &&& r   Úis_ownerÚBrowserControlBroker.is_owner)  s0   € à×*Ñ*¨5Ó1ˆ
Ø Ð%×CÐC¨*×*:Ñ*:¸eÐ*CÐCr   c               ó$   € V ^8„  d   QhRRRRRR/# rò   r   )r   s   "r   r   r�   .  s"   € ÷ ñ  ð ¸3ð ÐRVñ r   c          	     ó8  € V P                   ;_uu_ 4        V P                  V4      pRRR4       Xf   R# VP                  ;_uu_ 4        V P                   ;_uu_ 4        V\        J ;'       g    VP                  VJ pV P
                  P                  VP                  4      VJg	   V'       g    RRR4       RRR4       R# RRuVn        Vn        RRR4       RRR4       R#   + '       g   i     LÃ; i  + '       g   i     L-; i  + '       g   i     R# ; i)zDMark one exact controller transport offline without cancelling work.NFT)	r¥   rÓ   r‚   Ú_OWNER_UNSETr}   r§   r)   rw   r~   )r«   rw   r}   r×   Úowneds   &&$  r   Ú
disconnectÚBrowserControlBroker.disconnect.  sÎ   € à�Z�Z‹ZØ×=Ñ=¸eÓDˆJ÷ àÒÙØ×!×!Ó!Ø——“Ø¤Ð-×JÐJ°×1AÑ1AÀUÐ1J�Ø×$Ñ$×(Ñ(¨×)9Ñ)9Ó:À*ÓL×TYØ ÷ ÷ "Ñ!ð
 :?ÀÐ6�
Ô$ jÔ&6÷	 ÷ "ñ ÷ �Zú÷
 —ú÷ "Ö!ñ úsB   •C"Á	DÁAC5	Â.C5	Â/DÃC5	ÃDÃ"C2	Ã5DÄ DÄD	rÜ   Tc               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   rw   r\   r}   r   rÜ   r   r   rœ   r   )r   s   "r   r   r�   <  s*   € ÷ ?ñ ?˜Oð ?°sð ?Ð^bð ?Ðnrñ ?r   c          
     ó  € V P                   ;_uu_ 4        V P                  P                  V4      pRRR4       Xe   V\        Jd   VP                  V8w  d   R# VP
                  ;_uu_ 4        V P                   ;_uu_ 4        V P                  P                  V4      VJg   V\        Jd%   VP                  V8w  d    RRR4       RRR4       R# V P                  P                  VR4       V P                  V4      pV F  pV P                  VRR7       K  	  RRR4       V'       d   V P                  VX4       RRR4       R#   + '       g   i     EL; i  + '       g   i     LH; i  + '       g   i     R# ; i)z[Remove the controller for ``scope`` and fail its pending work closed (ControllerCancelled).NT©r‹   )
r¥   r§   r)   rø   r}   r‚   rµ   rÞ   Ú_resolve_pendingÚ_emit_cancel_frames)r«   rw   r}   rÜ   r×   Úpendingsr�   s   &&$$   r   rÝ   ÚBrowserControlBroker.detach<  s  € à�Z�Z‹ZØ×*Ñ*×.Ñ.¨uÓ5ˆJ÷ àÒ %¬|Ó";À
×@PÑ@PÐTYÔ@YÙØ×!×!Ó!Ø——“Ø×$Ñ$×(Ñ(¨Ó/°zÓAÀeÔS_ÓF_Ðdn×dtÑdtÐx}Ôd}Ø÷ ÷ "Ñ!ð ×!Ñ!×%Ñ% e¨TÔ2Ø×9Ñ9¸%Ó@�Û'�GØ×)Ñ)¨'¸TÐ)ÖBñ  (÷ ÷ !Ø×(Ñ(¨°XÔ>÷ "Ñ!÷	 �ZˆZú÷
 —ú÷ "×!Ð!úsB   •EÁ.E-Â<E	Â?E-ÃA	E	ÄE-Ä*E-ÅE	ÅE*Å%E-Å-E>	Ú	argumentsrˆ   c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# )r   rw   r\   Úactionr    r  r   rˆ   r]   r   r   r   )r   s   "r   r   r�   O  s4   € ÷ 7ñ 7Ø$ð7Ø14ð7ØAOð7Øfsð7à	ñ7r   c               ó†  € V P                  W4      pVf   \        RV: RV: 24      h\        T;'       g    / 4      pV\        9   d   V P	                  WV4       \
        P                  ! ^4      pR\        RRVRVRVR	VP                  R
VP                  RV//p\        VP                  WdR7      pVP                  ;_uu_ 4        V P                  ;_uu_ 4        V P                  V4      VJg   VP                  '       g   \        RV: R24      hVP                  Vn        W€P                   V&   RRR4        VP#                  V4        RRR4       TP(                  P+                  T P,                  R7      '       Eg%   T P                  ;_uu_ 4        TP.                  '       * ;'       d    T P                   P1                  T4      TJ p	T	'       d   RTn        T P                   T RRR4       X	'       d®   TP                  ;_uu_ 4        T P                  ;_uu_ 4        T P                  T4      ;'       g    Tp
T
P                  '       g   T P3                  Y¨4       Rp
RRR4       X
e   T P5                  Y¨.4       RRR4       \7        RT: RT P,                   R24      hTP8                  '       d   \;        RT: R24      hTP<                  '       g   \?        RT: RTP@                  : 24      hTP@                  #   + '       g   i     ELÚ; i  \$         dO    T P                  ;_uu_ 4        T P                   P'                  TR4       RRR4       h   + '       g   i     h ; ii ; i  + '       g   i     EL/; i  + '       g   i     EL§; i  + '       g   i     ELA; i  + '       g   i     EL7; i)zÓSend one controller command and block for completion; raises ControllerUnavailable/Cancelled/Timeout/
Rejected. Artifact actions also need an attached store and an approved ``artifact_id`` (only the id travels).Nzno controller for scope z with capability r’   r“   r‡   r  r  ra   rb   rˆ   )rw   r‡   rˆ   zcontroller for scope z detached before dispatch)ÚtimeoutTz$controller did not complete command z within Úszcommand z was cancelledzcontroller rejected command ú: )!rï   rS   r(   rC   Ú_validate_artifact_referencer¿   Ú	token_hexÚFRAME_COMMANDra   rb   r†   rw   r‚   r¥   rÓ   r~   r¨   r|   r&   rµ   r‰   Úwaitr    rŠ   r)   Ú_defer_cancel_lockedr   rW   r‹   rU   rŒ   rY   r�   )r«   rw   r  r  rˆ   r×   r‡   ré   r�   Ú	timed_outÚactives   &&$$$      r   ÚdispatchÚBrowserControlBroker.dispatchO  s  € ð
 —[‘[ Ó/ˆ
ØÒÜ'Ð*BÀ5Á)ÐK\Ð]cÑ\fÐ(gÓhÐhÜ˜Ÿ˜ bÓ)ˆ	ØÔ:Ô:Ø×-Ñ-¨e¸YÔGÜ×&Ò& rÓ*ˆ
Øœ=¨(Ø˜* h°¸ÀYÐP_Ðaf×atÑatØ  %×":Ñ":¸NÈLð5
ð ˆô "¨
×(8Ñ(8ÀZÔkˆØ×!×!Ó!Ø——“ð ×7Ñ7¸Ó>ÀjÓPÐXb×Xl×XlÐXlÜ/Ð2GÈÁyÐPiÐ0jÓkÐkØ *× 0Ñ 0�”Ø,3—‘˜jÑ)÷ ðØ—‘ Õ&÷ "ð  �}‰}×!Ñ!¨$×*?Ñ*?Ð!×@Ó@Ø——“ð !(§¡Ô,×YÐY°·±×1BÑ1BÀ:Ó1NÐRYÐ1Y�	ßØ#'�G”LØŸ™ jÐ1÷ ÷ Ø×)×)Ó)ØŸŸ›Ø!%×!EÑ!EÀeÓ!L×!ZÐ!ZÐPZ˜Ø%×/×/Ð/Ø ×5Ñ5°fÔFØ%)˜F÷	 $ð
 Ò)Ø×0Ñ0°¸ÔC÷ *ô (Ð*NÈzÉnÐ\dÐei×ezÑezÐd{Ð{|Ð(}Ó~Ð~Ø××ÐÜ%¨°±¸nÐ&MÓNÐNØ�z�zˆzÜ$Ð'CÀJÁ>ÐQSÐT[×TbÑTbÑSeÐ%fÓgÐgØ�~‰~Ð÷K —�ûô ô à—Z—Z“ZØ—M‘M×%Ñ% j°$Ô7÷  à÷  –Zàúð	ú÷ "×!Ð!ú÷" —�ú÷ $Ÿ˜ú÷ *×)Ð)ús�   ÃM3Ã'L	Ä/L	Ä2M3Ä;LÆ>NÇNÈN/È"-N	ÉN	É#N/ÌLÌ	M3ÌM0Ì6MÍ	M0ÍM,Í'	M0Í0M3Í3N	ÎN	ÎN,Î&	N/Î/O 	rw   r�   c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R/# )
r   r‡   r    rw   úOptional[ControllerScope]rŒ   r   r�   r   r   r   )r   s   "r   r   r�   ˆ  s3   € ÷ 	ñ 	 3ð 	Ð2Kð 	ÐX\ð 	Ðfið 	Ðuyñ 	r   c               óˆ  € V P                   ;_uu_ 4        V P                  P                  V4      pVe(   VP                  '       g   Ve   VP                  V8w  d    RRR4       R# RVRJ VuVn        Vn        Vn        V P                  V VP                  P                  4        RRR4       R#   + '       g   i     R# ; i)zdResolve a pending command by id; ``False`` when none is pending. Safe from inside the send callback.NFT)	r¥   r¨   r)   rŠ   rw   rŒ   r�   r‰   Úset)r«   r‡   rw   rŒ   r�   r�   s   &&$$$ r   ÚcompleteÚBrowserControlBroker.completeˆ  s–   € à�Z�Z‹ZØ—m‘m×'Ñ'¨
Ó3ˆGØŠ '§,§, ,°5Ò3DÈÏÉÐZ_ÔI_Ø÷ ‰Zð 8<¸RÀ4¸ZÈÐ4ˆGŒL˜'œ* g¤nØ—‘˜jÐ)Ø�M‰M×ÑÔ÷ ñ ÷ ŽZñ ús   •1B0ÁB0Á'?B0Â0C	c               ó$   € V ^8„  d   QhRRRRRR/# )r   rw   r\   rˆ   r]   r   r   r   )r   s   "r   r   r�   “  s"   € ÷ ñ ˜Oð ¸mð ÐPTñ r   c          
     ó2  a€ V P                  V4      pVf   R# VP                  ;_uu_ 4        V P                  ;_uu_ 4        V P                  V4      VJg   VP                  '       g    RRR4       RRR4       R# \        V3R lV P                  V4       4       R4      pVf    RRR4       RRR4       R# V P                  VRR7       RRR4       V P                  VX.4        RRR4       R#   + '       g   i     L.; i  + '       g   i     R# ; i)zcCancel the pending command matching ``scope`` + tool_call_id (one cancel frame); ``False`` if none.NFc              3  óv   <"  € T F.  pVP                   S8X  g   K  VP                  '       d   K*  Vx € K0  	  R # 5ir;   )rˆ   rŠ   )r<   Úprˆ   s   & €r   r?   Ú.BrowserControlBroker.cancel.<locals>.<genexpr>œ  s3   øé € ð QÑ*O QØ"#§.¡.°LÑ"@ô  !ØIJÏÍ÷  !šqÓ*Oùs   ƒ9›9¯
9Trþ   )	rØ   r‚   r¥   rÓ   r~   rÑ   rÞ   rÿ   r   )r«   rw   rˆ   r×   Útargets   &&d  r   ÚcancelÚBrowserControlBroker.cancel“  sé   ø€ à×*Ñ*¨5Ó1ˆ
ØÒÙØ×!×!Ó!Ø——“Ø×7Ñ7¸Ó>ÀjÓPÐXb×Xl×XlÐXlØ ÷ ÷ "Ñ!ô ô Q¨$×*HÑ*HÈÔ*Oó QØRVóX�à’>Ø ÷ ÷ "Ñ!ð ×%Ñ% f¸Ð%Ô=÷ ð ×$Ñ$ Z°&°Ô:Ø÷ "Ñ!ß—ú÷ "×!Ð!úsA   ­DÁ'C2	Á*C2	Á+DÁ=*C2	Â'DÂ9C2	ÃDÃ2DÃ=DÄD	c               ó$   € V ^8„  d   QhRRRRRR/# )r   r�   r†   r‹   r   r   rœ   r   )r   s   "r   r   r�   ¤  s"   € ÷ ñ ¨ð Àtð ÐPTñ r   c               	ó†   € VR uVn         Vn        V P                  VP                   VP                  P                  4        R# )TN)r‹   rŠ   r¨   r‡   r‰   r  )r«   r�   r‹   s   &&$r   rÿ   Ú%BrowserControlBroker._resolve_pending¤  s5   € Ø*3°TÐ'ˆÔ˜7œ<Ø�M‰M˜'×,Ñ,Ð-Ø�‰×ÑÖr   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   rw   r\   r  r    r  r(   r   rœ   r   )r   s   "r   r   r�   ©  s0   € ÷ nñ n°/ð nÈ3ð nÐ[_ð nÐdhñ nr   c                óŒ  € V P                  V4      pVf   \        V R24      hVP                  R4      p\        V\        4      '       d   VP                  4       '       g   \        V R24      h VP                  VP                  4       VR7       R#   \         d    h \         d   p\        T RT: RT 24      ThRp?ii ; i)zgFail closed unless ``arguments`` carries a store-approved artifact id (failures -> ControllerRejected).Nz$ requires an attached artifact storeÚartifact_idz! requires a non-empty artifact_id)rw   z rejected artifact reference r	  )rº   rY   r)   r'   r    ÚstripÚvalidater&   )r«   rw   r  r  r³   r&  Úexcs   &&&&   r   r
  Ú1BrowserControlBroker._validate_artifact_reference©  sÅ   € à×.Ñ.¨uÓ5ˆØŠ=Ü$¨ xÐ/SÐ%TÓUÐUØ—m‘m MÓ2ˆÜ˜+¤s×+Ò+°;×3DÑ3D×3FÒ3FÜ$¨ xÐ/PÐ%QÓRÐRð	nØ�N‰N˜;×,Ñ,Ó.°eˆNÖ<øÜ!ô 	ØÜô 	nÜ$¨ xÐ/LÈ[ÉOÐ[]Ð^aÐ]bÐ%cÓdÐjmÐmûð	nús   Á0!B ÂCÂ(CÂ)B>Â>Cc               ó$   € V ^8„  d   QhRRRRRR/# )r   r×   rz   r�   r†   r   rœ   r   )r   s   "r   r   r�   ¸  s'   € ÷ Dñ D¨{ð DÀ_ð DÐY]ñ Dr   c                	ó¶   € VP                   P                  \        V4      4       \        VP                   4      \        8”  d   VP                   R \        ) 1 R # R # r;   )r�   Úappendr•   Úlenrâ   )r«   r×   r�   s   &&&r   r  Ú)BrowserControlBroker._defer_cancel_locked¸  sM   € Ø×#Ñ#×*Ñ*¬=¸Ó+AÔBÜˆz×*Ñ*Ó+Ô.BÔBØ×+Ñ+Ð,BÔ.BÐ-BÐ,BÒCñ Cr   c               ó    € V ^8„  d   QhRRRR/# )r   rw   r\   r   úlist[_PendingCommand]r   )r   s   "r   r   r�   ½  s   € ÷ añ a¨ð aÐCXñ ar   c                	ó®   € \        V P                  P                  4       4       Uu. uF#  p\        VP                  V4      '       g   K!  VNK%  	  up# u upi r;   )rA   r¨   rÒ   rp   rw   )r«   rw   r  s   && r   rÞ   Ú.BrowserControlBroker._pending_for_scope_locked½  sB   € Ü §¡× 4Ñ 4Ó 6Ô7Ó`Ñ7�aÔ;OÐPQ×PWÑPWÐY^×;_—�Ñ7Ñ`Ð`ùÒ`s   ¦AÁ	Ac               ó$   € V ^8„  d   QhRRRRRR/# )r   r×   rz   r  r1  r   rœ   r   )r   s   "r   r   r�   À  s(   € ÷ cñ c¨kð cÐEZð cÐ_cñ cr   c                ó²   € V F  p VP                  \        V4      4       K   	  R#   \         d%    \        P	                  RTP
                  4        KR  i ; i)zGSend cancel frames (caller holds ``send_lock``, never the broker lock).z*failed to emit cancel frame for command %rN)r|   r•   r&   rà   rá   r‡   )r«   r×   r  r�   s   &&& r   r   Ú(BrowserControlBroker._emit_cancel_framesÀ  sM   € ãˆGðcØ—‘¤¨gÓ 6Ö7ó  øô ô cÜ× Ñ Ð!MÈw×OaÑOa×bðcús   ‡'§+AÁAc               ó   € V ^8„  d   QhRR/# )r   r   zlist[ControllerScope]r   )r   s   "r   r   r�   È  s   € ÷ oñ oÐShñ or   c                óª  € \         ;QJ d     . R T;'       g    TW43 4       F  NK  	  5M! R T;'       g    TW43 4       4      p\        V4      '       g   . # V P                  ;_uu_ 4        V P                   Uu. uF.  qfP                  VP
                  VP                  3V8X  g   K,  VNK0  	  upuuRRR4       # u upi   + '       g   i     R# ; i)zLAttached scopes bound to one session lane (session + principal + transport).c              3  óh   "  € T F(  p\        T;'       g    R 4      P                  4       x € K*  	  R# 5i)Ú N)r    r'  )r<   rÂ   s   & r   r?   Ú4BrowserControlBroker._lane_scopes.<locals>.<genexpr>Ê  s(   é € ÐjÑ2i¨Q”C˜Ÿ˜˜R“L×&Ñ&×(Ð(Ó2iùs   ‚2•2N)Útuplern   r¥   r§   r`   r^   rc   )r«   r`   Útask_idr^   rc   r   r  s   &&&&&  r   Ú_lane_scopesÚ!BrowserControlBroker._lane_scopesÈ  s�   € çŒeÑj°:×3HÐ3HÀÈ,Ñ2iÓj�e‰eÑj°:×3HÐ3HÀÈ,Ñ2iÓjÓjˆÜ�3�xŠxØˆIØ�Z�Z‹ZØ#×0Ò0ÓnÑ0˜!·\±\À1Ç>Á>ÐST×SeÑSeÐ4fÐjmÑ4m—A�AÑ0Ñn÷ ŠZùÚn÷ �ZˆZús$   Á,CÁ;)B<Â)B<Â/CÂ<CÃC	r`   r=  r^   rc   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )r   r`   r]   r=  r^   rc   r   r  r   )r   s   "r   r   r�   Ð  s6   € ÷ 9ñ 9¨}ð 9Èmð 9Ø(5ð9ØP]ð9ð jCñ9r   c               ó\   € V P                  WW44      p\        V4      ^8X  d
   V^ ,          # R# )zÄOne unambiguous attached scope for a server-owned session (session id is only a hint; the caller
supplies its server-derived principal + transport family). Missing/ambiguous identity fails closed.N)r>  r.  )r«   r`   r=  r^   rc   Úmatchess   &$$$$ r   Úscope_for_sessionÚ&BrowserControlBroker.scope_for_sessionÐ  s0   € ð ×#Ñ# J¸ÓXˆÜ  ›\¨QÔ.ˆw�q�zÐ8°DÐ8r   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )r   r`   r]   r=  r^   rc   r   r   r   )r   s   "r   r   r�   ×  s9   € ÷ \ñ \¨]ð \ÈMð \Ø&3ð\ØN[ð\Øgkñ\r   c               ó8   € \        V P                  WW44      4      # )zºWhether ANY controller (even offline) registered for this lane: "bound but unavailable" fails closed
vs "never registered" (caller keeps the legacy backend). Ambiguous lanes report True.)r   r>  )r«   r`   r=  r^   rc   s   &$$$$r   Úlane_registeredÚ$BrowserControlBroker.lane_registered×  s   € ô �D×%Ñ% j¸<ÓZÓ[Ð[r   c               ó    € V ^8„  d   QhRRRR/# )r   r}   r   r   r   r   )r   s   "r   r   r�   Ý  s   € ÷ Qñ Q cð Q¨cñ Qr   c                ó  a a€ S P                   ;_uu_ 4        S P                  P                  4        UUu. uF  w  r#VP                  SJ g   K  VNK  	  pppRRR4       \	        VV 3R lX 4       4      # u uppi   + '       g   i     L,; i)z:Mark every controller owned by one lost transport offline.Nc              3  ó\   <"  € T F!  p\        SP                  VSR 7      4      x € K#  	  R# 5i))r}   N)r   rú   )r<   rw   r}   r«   s   & €€r   r?   Ú8BrowserControlBroker.disconnect_owner.<locals>.<genexpr>á  s&   øé € ÐPÉÀ”3�t—‘ u°E�Ó:×;Ð;Ëùs   ƒ),)r¥   r§   r¾   r}   Úsum)r«   r}   r  r=   Úscopess   ff   r   Údisconnect_ownerÚ%BrowserControlBroker.disconnect_ownerÝ  sd   ù€ à�Z�Z‹ZØ$(×$5Ñ$5×$;Ñ$;Ô$=ÔRÑ$=™D˜AÀÇÁÈEÐAQ—a�aÑ$=ˆFÑR÷ äÕPÉÓPÓPÐPùó S÷ �Zús"   —A;µA5
ÁA5
ÁA;Á5A;Á;B	c               ó   € V ^8„  d   QhRR/# )r   r   rœ   r   )r   s   "r   r   r�   ã  s   € ÷ 
?ñ 
?�tñ 
?r   c                óÔ  € V P                   ;_uu_ 4        \        V P                  4      pRRR4       X F  pV P                  V4       K  	  V P                   ;_uu_ 4        V P                  P                  4        \        V P                  P                  4       4       F  pV P                  VRR7       K  	  RRR4       R#   + '       g   i     L ; i  + '       g   i     R# ; i)z=Fail all live work closed and clear tickets (tests/shutdown).NTrþ   )	r¥   rA   r§   rÝ   r¦   Úclearr¨   rÒ   rÿ   )r«   rN  rw   r�   s   &   r   ÚresetÚBrowserControlBroker.resetã  s—   € à�Z�Z‹ZÜ˜$×+Ñ+Ó,ˆF÷ ãˆEØ�K‰K˜Öñ à�Z�Z‹ZØ�M‰M×ÑÔ!ä §¡× 4Ñ 4Ó 6Ö7�Ø×%Ñ% g¸Ð%Ö>ñ 8÷ ‰Z÷	 �Zú÷ �ZˆZús   •CÁ!ACÃC	ÃC'	c               ó   € V ^8„  d   QhRR/# )r   r   rs   r   )r   s   "r   r   r�   ð  s   € ÷  ñ   Eñ  r   c                ó   € V P                   # )z6Configured lifetime for newly minted one-shot tickets.)rŸ   r°   s   &r   Úticket_ttl_secondsÚ'BrowserControlBroker.ticket_ttl_secondsï  s   € ð ×ÑÐr   c               ó   € V ^8„  d   QhRR/# )r   r   r   r   )r   s   "r   r   r�   õ  s   € ÷ &ñ &˜sñ &r   c                ó’   € V P                   ;_uu_ 4        \        V P                  4      uuRRR4       #   + '       g   i     R# ; i)z;Number of commands awaiting completion (diagnostics/tests).N)r¥   r.  r¨   r°   s   &r   Úpending_countÚ"BrowserControlBroker.pending_countô  s%   € ð �Z�Z‹ZÜ�t—}‘}Ó%÷ �Z�Z‹Zús	   •5µA	)	rª   r£   r    r§   r©   r¥   r¨   rŸ   r¦   )&rI   rJ   rK   rL   rM   ÚDEFAULT_TICKET_TTLÚDEFAULT_COMMAND_TIMEOUTr¬   Úpropertyr.   r¶   rº   rÅ   rÉ   rÓ   rØ   rê   rï   rô   rø   rú   rÝ   r  r  r  rÿ   r
  r  rÞ   r   r>  rC  rG  rO  rT  rX  r\  rN   r   r   r   r—   r—   ©   ss  † ÙXð=Ð.@ð =Ð[rð =Ø8<ð=Ø_c÷=ð ôó ðð6Èt÷ 6õOõAõ õkõWð
/Ð[_÷ /õbnõDð
À÷ ð?¸\ð ?Ðei÷ ?ð&7ØRVð7Øvz÷7ðr	Èdð 	Ðlp÷ 	õõ"õ
nõDõ
aõcõoð9¸tð 9Ð^bð 9Ø8<ð9Ø`d÷9ð\¸Tð \Ð\`ð \Ø6:ð\Ø^b÷\õQõ
?ð ô ó ð ð ô&ó ô&r   r—   c               ó   € V ^8„  d   QhRR/# )r   r   r—   r   )r   s   "r   r   r   þ  s   € ÷ ñ Ð$8ñ r   c                 ó   € \         # )zDProcess-local broker shared by API and dashboard Gateway transports.)Ú_GLOBAL_BROKERr   r   r   Úget_browser_control_brokerrd  þ  s   € äÐr   >   Úbrowser_backÚbrowser_tabsÚbrowser_typeÚbrowser_clickÚbrowser_pressÚbrowser_scrollÚbrowser_navigateÚbrowser_snapshotÚbrowser_screenshotÚbrowser_tab_activateúcontroller.noopr;   )r^   r_   r`   ra   rb   rc   )5rM   Ú
__future__r   Úloggingr¿   rƒ   r¡   Údataclassesr   r   Útypingr   r   r   r   Ú	getLoggerrI   rà   Úobjectrø   r^  r_  râ   r   r8   rB   rD   rC   r  r”   r   r*   r1   r5   rE   r&   rG   rP   rS   rU   rW   rY   r\   ro   rp   rr   rv   rz   r†   r•   r—   rc  rd  r   r   r   Ú<module>rv     sÏ  ðñ*õ #ã Û Û Û ß (ß 0Ó 0à	×	Ò	˜8Ó	$€Ù‹x€ð Ð àÐ àÐ à#$Ð  ñ  )ò *ó  Ð ñ
 *3°MÐCUÐ3VÓ)WÐ &á(1Ð3NÐPiÐ2jÓ(kÐ %ð -€Ø*€õLõ
]÷=÷
6ð
NÐX\÷ Nô3˜)ô 3ôJÐ1ô JôQÐ/ô QôEÐ-ô EôJÐ+ô JôBÐ,ô Bñ �$Ô÷*ð *ó ð*ð {Ð õ[ñ �$Ô÷ð ó ðð ÷ð ó ðð ÷Fð Fó ðFð ÷ð ó ðõx÷O&ñ O&ñd
 &Ó'€÷r   