+
    lHàjD  ã                  óð   € R t ^ RIHt ^ RIt^ RIHt ]P                  ! 4       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 ltR R ltR R ltR R ltR R ltR R ltR R ltR# )z7Additive transport membership for shared live sessions.)ÚannotationsN)Úbind_modulec               ó   € V ^8„  d   QhRR/# )é   ÚreturnÚbool© )Úformats   "ÚC/home/ubuntu/.hermes/hermes-agent/tui_gateway/session_transports.pyÚ__annotate__r      s   € ÷ 3ñ 3¨$ñ 3ó    c                óÀ   € V RJ;'       dT    V \         J;'       dD    V \        J;'       d4    \        V \        \        34      '       * ;'       d    \        V 4      '       * # )zEExclude the process fallback sink, parked sentinel, and closed peers.N)Ú_detached_ws_transportÚ_stdio_transportÚ
isinstanceÚ_DropTransportÚStdioTransportÚ_transport_is_dead©Ú	transports   &r
   Ú_transport_is_live_peerr      sj   € à˜TÐ!÷ 2ð 2ØÔ!7Ð7÷2ð 2àÔ!1Ð1÷2ð 2ô ˜y¬>¼>Ð*JÓKÔK÷2ð 2ô ' yÓ1Ô1ð	3r   c               ó    € V ^8„  d   QhRRRR/# ©r   Úsessionúdict | Noner   r   r   )r	   s   "r
   r   r      s   € ÷ Pñ P¨ð PÀDñ Pr   c                óÊ   € V '       d   Ve   \        V4      '       d   R# V P                  R4      pW!J ;'       g*    \        V\        4      ;'       d    VP	                  V4      # )NFr   )r   Úgetr   ÚFanoutTransportÚcontains)r   r   Úexistings   && r
   Ú_session_transport_containsr       s[   € ß�iÒ'Ô+=¸i×+HÒ+HÙØ�{‰{˜;Ó'€HØÐ ÷ Pð PÜ�8œ_Ó-×NÐN°(×2CÑ2CÀIÓ2NðPr   c               ó    € V ^8„  d   QhRRRR/# )r   r   r   r   Úlistr   )r	   s   "r
   r   r      s   € ÷ Eñ E kð E°dñ Er   c                óÞ   € T ;'       g    / P                  R 4      p\        V\        4      '       d   VP                  4       MV.pV Uu. uF  p\	        V4      '       g   K  VNK  	  up# u upi r   )r   r   r   Ú
transportsr   )r   r   ÚpeersÚpeers   &   r
   Ú_session_live_transportsr'      sZ   € Ø—�˜2×"Ñ" ;Ó/€HÜ%/°¼/×%JÒ%JˆH×ÑÔ!ÐQYÐPZ€EÙ"ÓD™U�TÔ&=¸d×&C�DˆD™UÑDÐDùÒDs   Á	A*Á!A*Ú	excludingc               ó    € V ^8„  d   QhRRRR/# r   r   )r	   s   "r
   r   r   "   s   € ÷ Tñ T¨ð TÈDñ Tr   c               óœ   a€ \         ;QJ d(    V3R  l\        V 4       4       F  '       g   K   R# 	  R# ! V3R  l\        V 4       4       4      # )c              3  ó*   <"  € T F  qSJx € K
  	  R # 5i©Nr   )Ú.0r&   r(   s   & €r
   Ú	<genexpr>Ú._session_has_live_transport.<locals>.<genexpr>#   s   øé € ÐSÑ1R¨˜9Õ$Ó1Rùs   ƒTF)Úanyr'   )r   r(   s   &dr
   Ú_session_has_live_transportr1   "   s8   ø€ ß‹3ÔSÔ1IÈ'Ô1RÓS�3Œ3ÐSŠ3ÐSˆ3ÔSÔ1IÈ'Ô1RÓSÓSÐSr   c               ó   € V ^8„  d   QhRR/# )r   r   ú
str | Noner   )r	   s   "r
   r   r   &   s   € ÷ ñ ¨*ñ r   c                óÜ   € \        V RR4      p\        P                  V4      '       dD   \        VR,          4      P	                  4        R\        VR,          4      P	                  4        2# R# )zì``<provider>:<user id>`` the WS-upgrade credential authenticated for ``transport``, or None for the legacy
token, stdio and the PTY child's server-internal credential. The prefix keeps a basic-auth ``alice`` and an
OIDC ``alice`` apart.Úauth_identityNÚproviderÚ:Úuser_id)ÚgetattrÚ_methods_browser_controlÚ_is_authenticated_identityÚstrÚstrip)r   Úidentitys   & r
   Ú_transport_auth_user_idr?   &   s_   € ô �y /°4Ó8€HÜ×:Ñ:¸8×DÒDÜ�h˜zÕ*Ó+×1Ñ1Ó3Ð4°A´c¸(À9Õ:MÓ6N×6TÑ6TÓ6VÐ5WÐXÐXÙr   c               ó    € V ^8„  d   QhRRRR/# )r   r   r   r   r3   r   )r	   s   "r
   r   r   0   s   € ÷ =ñ = ;ð =°:ñ =r   c                ón   € T ;'       g    / p RV 9   d
   V R,          # \        V P                  R4      4      # )záThe login ``session`` was created under, stamped on the record as ``auth_user_id``. A second window turns
the transport slot into a FanoutTransport, which names no login, so only a record without the slot reads
its transport.Úauth_user_idr   )r?   r   )r   s   &r
   Ú_session_auth_user_idrC   0   s6   € ð �mˆm˜€GØ˜Ô Ø�~Õ&Ð&Ü" 7§;¡;¨{Ó#;Ó<Ð<r   c               ó    € V ^8„  d   QhRRRR/# )r   Úsidr<   r   r   r   )r	   s   "r
   r   r   :   s   € ÷ 	Zñ 	Z¨#ð 	Z°$ñ 	Zr   c                ó8  a€ ^ RI Ho ^ RIHp \	        \
        P                  V 4      4       Uu. uF  p\        W!4      '       g   K  VNK  	  ppV'       * ;'       g;    \        ;QJ d    V3R lV 4       F  '       g   K   R# 	  R# ! V3R lV 4       4      # u upi )u³  Whether a serverâ†’client request for *sid* can be answered: False only when every live WebSocket
client attached to the session is a build that never sent ``client.capabilities`` (Desktop / dashboard
update separately from this backend; the stdio TUI ships with it). No attached client is still True â€” the
question waits in ``open_requests`` for the reconnect replay. Compute-host relays and other non-client
transports never count.©Úserver_requests©ÚWSTransportc              3  óF   <"  € T F  pSP                  V4      x € K  	  R # 5ir,   )Úanswers_requests)r-   r&   rH   s   & €r
   r.   Ú3_session_client_answers_requests.<locals>.<genexpr>C   s!   øé € ÐYÑQXÈ˜o×>Ñ>¸t×DÐDÓQXùs   ƒ!TF)	Útui_gatewayrH   Útui_gateway.wsrJ   r'   Ú	_sessionsr   r   r0   )rE   rJ   r&   ÚclientsrH   s   &   @r
   Ú _session_client_answers_requestsrR   :   su   ø€ õ ,Ý*Ü 8¼¿¹ÀsÓ9KÔ LÓnÑ L˜ÔPZÐ[_×Pm�tˆtÑ L€GÐnØŒ;×YÐYŸ#›#ÔYÑQXÓYŸ#œ#ÐYš#ÐY˜#ÔYÑQXÓYÓYÐYùò os   ®BÁBc               ó    € V ^8„  d   QhRRRR/# )r   rE   r<   r   r"   r   )r	   s   "r
   r   r   F   s   € ÷ Yñ Y Cð Y¨Dñ Yr   c                óØ   € ^ RI Hp ^ RIHp \	        \
        P                  V 4      4       Uu. uF1  p\        W24      '       g   K  VP                  V4      '       g   K/  VNK3  	  up# u upi )uÂ   The live WebSocket clients attached to *sid* that advertised answering serverâ†’client requests:
the windows whose unanimous "not shown here" settles a window-owned request (server_requests.py).rG   rI   )	rN   rH   rO   rJ   r'   rP   r   r   rL   )rE   rH   rJ   r&   s   &   r
   Ú_session_answering_clientsrU   F   s_   € õ ,Ý*Ü5´i·m±mÀCÓ6HÔIó YÑI�TÜ˜$×,ô Ø1@×1QÑ1QÐRV×1W÷ ˆDÑIñ Yð Yùò Ys   ­A'ÁA'ÁA'c               ó    € V ^8„  d   QhRRRR/# )r   r   Údictr   ÚNoner   )r	   s   "r
   r   r   O   s   € ÷ 	Sñ 	S ð 	S°Tñ 	Sr   c                ó°   € \        V4      pVf   R# \        V 4      pW28w  d4   \        P                  RV P	                  R4      T;'       g    RV4       R# R# )zvOwnership is not enforced; a second login sharing a session is only logged, and the agent keeps the
creator's user id.NzVSession %s keeps the user id %s it was created with; a client logged in as %s attachedÚsession_keyz(none))r?   rC   ÚloggerÚwarningr   )r   r   Ú	attachingÚcreators   &&  r
   Ú_warn_foreign_loginr_   O   sT   € ô (¨	Ó2€IØÒÙÜ# GÓ,€GØÔÜ�‰ÐoØ—{‘{ =Ó1°7×3FÐ3F¸hÈ	ö	Sñ r   c               ó    € V ^8„  d   QhRRRR/# r   r   )r	   s   "r
   r   r   [   s   € ÷  ñ   {ð  À$ñ  r   c           	     ó�  € V '       d   Vf   R# \         ;_uu_ 4        \        V\        4      '       d>   VP                  4        Uu. uF  p\	        W4      NK  	  pp\        V4      uuRRR4       # V P                  R4      p\        V4      '       d3   \        V\        4      '       d   VP                  V4        RRR4       R# \        V4      '       g,   \        V 4      '       d    RRR4       R# WR&    RRR4       R# WAJ d    RRR4       R# \        V\        4      '       dO   VP                  V4      '       g   \        W4       VP                  V4       VP                  V4      uuRRR4       # \        W4       \        V4      '       d   \        WA4      V R&   MWR&    RRR4       R# u upi   + '       g   i     R# ; i)zJAdd live peers; flatten captured queued fanouts without nesting authority.NFr   T)Ú_session_transport_lockr   r   r$   Ú_attach_session_transportr0   r   r   Údetachr   r1   r   r_   Úattach)r   r   r&   Úattachedr   s   &&   r
   rc   rc   [   su  € ç�iÒ'Ùß	 Ö	 Ü�i¤×1Ò1ð NW×MaÑMaÔMcÓdÑMcÀTÔ1°'Ö@ÑMcˆHÐdÜ�x“=÷ 
!Ò	 ð —;‘;˜{Ó+ˆÜ˜i×(Ò(Ü˜(¤O×4Ò4Ø—‘ 	Ô*Ø÷ 
!Ñ	 ô ' y×1Ò1Ü*¨7×3Ò3Ø÷ 
!Ñ	 ð $-�KÑ Ø÷ 
!Ñ	 ð  Ó Ø÷# 
!Ñ	 ô$ �h¤×0Ò0Ø×$Ñ$ Y×/Ò/Ü# GÔ7Ø�O‰O˜IÔ&Ø×$Ñ$ YÓ/÷- 
!Ò	 ô. 	˜GÔ/Ü" 8×,Ò,Ü#2°8Ó#GˆG�KÒ à#,�KÑ Ø÷9 
!Ñ	 ùò e÷	 
!×	 Ð	 úsH   �)F4ÁF/ÁF4Á1A
F4Ã#F4Ã2F4ÄF4Ä,F4Ä>,F4Å50F4Æ/F4Æ4G	c               ó    € V ^8„  d   QhRRRR/# r   r   )r	   s   "r
   r   r   ~   s   € ÷ Iñ I {ð IÀ$ñ Ir   c                ó   € V '       g   R# \         ;_uu_ 4        V P                  R4      ;'       g    / P                  VR4       V P                  R4      p\        V\        4      '       d{   VP                  V4       V P                  R4      ;'       g    / p\        V4       F?  pVP                  V4      '       d   \        V4      '       g   K-  VP                  VR4       KA  	  \        WR7      uuRRR4       #   + '       g   i     R# ; i)zGRemove membership; return whether another live client prevents parking.FÚviewersNr   )r(   )
rb   r   Úpopr   r   rd   r"   r   r   r1   )r   r   r   ri   Úviewers   &&   r
   Ú_detach_session_transportrl   ~   s½   € çÙß	 Ö	 Ø	�‰�YÓ	×	%Ð	% 2×*Ñ*¨9°dÔ;Ø—;‘;˜{Ó+ˆÜ�h¤×0Ò0Ø�O‰O˜IÔ&Ø—k‘k )Ó,×2Ð2°ˆGÜ˜wž-�Ø×(Ñ(¨×0Ò0Ô4FÀv×4NÔ4NØ—K‘K ¨Ö-ñ (ô
 +¨7ÔH÷ 
!×	 ×	 Ó	 ús   ™A;C<Â6C<Ã!C<Ã<D	c               ó   € V ^8„  d   QhRR/# )r   r   zlist[tuple[str, dict]]r   )r	   s   "r
   r   r   �   s   € ÷ Bñ BÐ2Hñ Br   c                óà  € \         ;_uu_ 4        . p\        P                  4        F{  w  r#VP                  R4      pW@J gO   \	        V\
        4      '       d   VP                  V 4      '       g"   YP                  R4      ;'       g    / 9   g   Ki  VP                  W#34       K}  	  RRR4       X UUu. uF  w  r#\        W04      '       d   K  W#3NK  	  upp#   + '       g   i     L:; iu uppi )zIRemove even closed/pruned peers' viewer entries; return clientless slots.r   ri   N)	Ú_sessions_lockrP   Úitemsr   r   r   r   Úappendrl   )r   rf   rE   r   r   s   &    r
   Ú_detach_transport_from_sessionsrr   �   s¹   € ç	ŽØˆÜ%ŸO™OÖ-‰LˆCØ—{‘{ ;Ó/ˆHØÓ%Ü! (¬O×<Ò<À×ARÑARÐS\×A]ÒA]Ø §[¡[°Ó%;×%AÐ%A¸rÖBØ—‘  Ö/ñ .÷ 
ñ 08ô B©x™|˜sÜ,¨W×@ô ˆS‹N©xò Bð B÷ 
�üóBs*   �ACÁ.CÂCÂCÂ2C*ÃC*ÃC'	c               ó   € V ^8„  d   QhRR/# )r   r   rX   r   )r	   s   "r
   r   r   ž   s   € ÷ #ñ #˜ñ #r   c                ó.   € \        \        4       V 4       R # r,   )r   Úglobals)Úservers   &r
   Úregisterrw   ž   s   € Ü”“	˜6Ö"r   )Ú__doc__Ú
__future__r   Ú	threadingÚtui_gateway.method_ctxr   ÚRLockrb   r   r    r'   r1   r?   rC   rR   rU   r_   rc   rl   rr   rw   r   r   r
   Ú<module>r}      sr   ðÙ =Ý "ã Ý .ð $Ÿ/š/Ó+Ð õ3õPõEðTÀ4÷ Tõõ=õ	ZõYõ	Sõ õFIõ$B÷#r   