Ë
    áß²j³  ã                  óî   — U 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mZm	Z	 dgZ
 ej                  «       Zi Zded<   i Zded	<   i Zd
ed<    G d„ d«      Z G d„ d«      Zdd„Zej(                  dd„«       Zy)aø  Thread-scoped stdout/stderr silencing for background worker threads.

``contextlib.redirect_stdout`` reassigns the *process-global* stream, so a daemon worker
silencing itself also silences every other thread (gateway event loop included). This
module installs a per-thread routing proxy as ``sys.stdout``/``sys.stderr``: silenced
threads write to a sink, everyone else passes through to the original stream. Installed
once, idempotently, and never uninstalled (that would race other threads mid-write).
é    )ÚannotationsN)ÚIteratorÚTextIOÚthread_scoped_silencez!dict[str, '_ThreadRoutingStream']Ú
_installedzdict[str, TextIO]Ú_sinkszdict[str, '_RoutingState']Ú_routing_statesc                  ó   — e Zd ZdZdd„Zy)Ú_RoutingStatezCSilencing registry shared by every proxy generation for one stream.c                óR   — || _         i | _        t        j                  «       | _        y ©N)ÚsinkÚsilencedÚ	threadingÚLockÚlock)Úselfr   s     ú?/home/ubuntu/.hermes/hermes-agent/agent/thread_scoped_output.pyÚ__init__z_RoutingState.__init__    s   € ØˆŒ	Ø(*ˆŒÜ—N‘NÓ$ˆ�	ó    N)r   r   ÚreturnÚNone)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   © r   r   r   r      s
   „ ÙMô%r   r   c                  ó^   — e Zd ZdZdd„Zdd„Zdd„Zdd„Zdd„Zd„ Z	d„ Z
d	„ Zdd
„Zd„ Zd„ Zy)Ú_ThreadRoutingStreamz‰``sys.stdout``/``sys.stderr`` stand-in routing writes per calling thread;
    unknown attributes delegate to the current thread's target.c                ó    — || _         || _        y r   )Ú_passthroughÚ_state)r   ÚpassthroughÚstates      r   r   z_ThreadRoutingStream.__init__*   s   € Ø'ˆÔØˆ�r   c                ó¼   — | j                   j                  j                  t        j                  «       d«      dkD  r| j                   j
                  S | j                  S ©Nr   )r"   r   Úgetr   Ú	get_identr   r!   ©r   s    r   Ú_targetz_ThreadRoutingStream._target.   sG   € Ø#'§;¡;×#7Ñ#7×#;Ñ#;¼I×<OÑ<OÓ<QÐSTÓ#UÐXYÒ#Yˆt�{‰{×ÑÐpÐ_c×_pÑ_pÐpr   c                óÚ   — | j                   j                  5  | j                   j                  j                  |d«      dz   | j                   j                  |<   d d d «       y # 1 sw Y   y xY w©Nr   é   )r"   r   r   r'   )r   Úidents     r   Úsilencez_ThreadRoutingStream.silence1   sX   € Ø�[‰[×Ññ 	QØ*.¯+©+×*>Ñ*>×*BÑ*BÀ5È!Ó*LÈqÑ*PˆD�K‰K× Ñ  Ñ'÷	Q÷ 	Qñ 	Qús   —AA!Á!A*c                ó6  — | j                   j                  5  | j                   j                  j                  |d«      dz
  }|dkD  r|| j                   j                  |<   n&| j                   j                  j	                  |d «       d d d «       y # 1 sw Y   y xY wr,   )r"   r   r   r'   Úpop)r   r.   Údepths      r   Ú	unsilencez_ThreadRoutingStream.unsilence5   sz   € Ø�[‰[×Ññ 	6Ø—K‘K×(Ñ(×,Ñ,¨U°AÓ6¸Ñ:ˆEØ�qŠyØ.3�—‘×$Ñ$ UÒ+à—‘×$Ñ$×(Ñ(¨°Ô5÷	6÷ 	6ñ 	6ús   —A/BÂBc                óf   — 	  t        | j                  «       |«      |Ž S # t        $ r  ||Ž cY S w xY w)zaCall ``name`` on the current target; a dead target yields ``fallback(*args)`` instead of raising.)Úgetattrr*   Ú	Exception)r   ÚnameÚfallbackÚargss       r   Ú_forwardz_ThreadRoutingStream._forward=   s:   € ð	#Ø0”7˜4Ÿ<™<›>¨4Ó0°$Ð7Ð7øÜò 	#Ù˜T�?Ò"ð	#ús   ‚ Ÿ0¯0c                ó*   — | j                  dd„ |«      S )NÚwritec                ó<   — t        | t        «      rt        | «      S dS r&   )Ú
isinstanceÚstrÚlen)Úds    r   ú<lambda>z,_ThreadRoutingStream.write.<locals>.<lambda>E   s   € ¼*ÀQÌÔ:L´°A³€ ÐRS€ r   ©r:   )r   Údatas     r   r<   z_ThreadRoutingStream.writeD   s   € Ø�}‰}˜WÑ&SÐUYÓZÐZr   c                ó(   — | j                  dd„ «      S )NÚflushc                  ó   — y r   r   r   r   r   rB   z,_ThreadRoutingStream.flush.<locals>.<lambda>H   ó   � r   rC   r)   s    r   rF   z_ThreadRoutingStream.flushG   s   € Ø�}‰}˜W¡lÓ3Ð3r   c                ó*   — | j                  dd„ |«      S )NÚ
writelinesc                 ó   — y r   r   )Ú_ls    r   rB   z1_ThreadRoutingStream.writelines.<locals>.<lambda>K   rH   r   rC   )r   Úliness     r   rJ   z_ThreadRoutingStream.writelinesJ   s   € Ø�}‰}˜\©?¸EÓBÐBr   c                óp   — 	 t        | j                  «       j                  «       «      S # t        $ r Y yw xY w)NF)Úboolr*   Úisattyr6   r)   s    r   rP   z_ThreadRoutingStream.isattyM   s3   € ð	Ü˜Ÿ™›×-Ñ-Ó/Ó0Ð0øÜò 	Ùð	ús   ‚&) ©	5´5c                ó>   — | j                  «       j                  «       S r   )r*   Úfilenor)   s    r   rR   z_ThreadRoutingStream.filenoS   s   € Ø�|‰|‹~×$Ñ$Ó&Ð&r   c                ó6   — t        | j                  «       |«      S r   )r5   r*   )r   r7   s     r   Ú__getattr__z _ThreadRoutingStream.__getattr__V   s   € Ü�t—|‘|“~ tÓ,Ð,r   N)r#   r   r$   r   r   r   )r   r   )r.   Úintr   r   )r7   r?   )r   rO   )r   r   r   r   r   r*   r/   r3   r:   r<   rF   rJ   rP   rR   rT   r   r   r   r   r   &   sC   „ ñCóóqóQó6ó#ò[ò4òCóò'ó-r   r   c                ót  — t         5  t        j                  | «      }t        t        | d«      }t        |t        «      r'|t        | <   |j                  t        | <   |cddd«       S |�||u r|cddd«       S |�|n|}t        j                  | «      }|�|j                  r%t        t        j                  dd¬«      x}t        | <   t        j                  | «      }|�|j                  |urt        |«      x}t        | <   t        ||«      x}t        | <   t!        t        | |«       |cddd«       S # 1 sw Y   yxY w)zGInstall (idempotently) a routing proxy as ``sys.<attr>`` and return it.NÚwzutf-8)Úencoding)Ú_install_lockr   r'   r5   Úsysr>   r   r"   r	   r   ÚclosedÚopenÚosÚdevnullr   r   Úsetattr)Úattrr#   ÚproxyÚcurrentr   r$   s         r   Ú_ensure_installedrc   Z   s  € ä	ñ Ü—‘˜tÓ$ˆÜœ#˜t TÓ*ˆÜ�gÔ3Ô4ð  'ŒJ�tÑØ$+§N¡NŒO˜DÑ!Ø÷ñ ð Ð ¨EÑ!1Ø÷ñ ð ")Ð!4‘g¸+ˆÜ�z‰z˜$ÓˆØˆ<˜4Ÿ;š;Ü"&¤r§z¡z°3ÀÔ"IÐIˆD”6˜$‘<Ü×#Ñ# DÓ)ˆØˆ=˜EŸJ™J¨dÑ2Ü,9¸$Ó,?Ð?ˆE”O DÑ)Ü#7¸ÀUÓ#KÐKˆ”
˜4Ñ Ü”�T˜5Ô!Ø÷-÷ ò ús   ‡AD.Á%D.Á6B.D.Ä.D7c               #  óˆ  K  — t        j                  «       } t        dt        j                  xs t        j
                  «      t        dt        j                  xs t        j                  «      f}|D ]  }|j                  | «       Œ 	 d–— |D ]  }|j                  | «       Œ y# |D ]  }|j                  | «       Œ w xY w­w)z<Silence ``stdout``/``stderr`` for the *current thread only*.ÚstdoutÚstderrN)
r   r(   rc   rZ   Ú
__stdout__re   Ú
__stderr__rf   r/   r3   )r.   Úproxiesra   s      r   r   r   u   s¼   è ø€ ô ×ÑÓ!€EÜ  ¬3¯>©>Ò+G¼S¿Z¹ZÓHÔJ[Ð\dÔfi×ftÑftò  gCÔx{÷  yCñ  yCó  KDð  E€GØò ˆØ�‰�eÕðð#Ûàò 	#ˆEØ�O‰O˜EÕ"ñ	#ø�Wò 	#ˆEØ�O‰O˜EÕ"ñ	#üs   ‚BCÂB% ÂCÂ%B?Â?C)r`   r?   r#   r   r   z'_ThreadRoutingStream')r   zIterator[None])r   Ú
__future__r   Ú
contextlibr]   rZ   r   Útypingr   r   Ú__all__r   rY   r   Ú__annotations__r   r	   r   r   rc   Úcontextmanagerr   r   r   r   ú<module>rp      s‹   ðòõ #ã Û 	Û 
Û ß #à"Ð
#€à�	—‘Ó €à02€
Ð-Ó 2ð €ÐÓ Ø.0€Ð+Ó 0÷%ñ %÷1-ñ 1-óhð6 ×Ñò
#ó ñ
#r   