
    `gj                        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 	 ddl	m
Z  ej                  e      Z e       ZdZ G d d      Zy# e$ r dZY /w xY w)	u  Best-effort WebSocket publisher transport for the PTY-side gateway.

The dashboard's `/api/pty` spawns `hermes --tui` as a child process, which
spawns its own ``tui_gateway.entry``.  Tool/reasoning/status events fire on
*that* gateway's transport — three processes removed from the dashboard
server itself.  To surface them in the dashboard sidebar (`/api/events`),
the PTY-side gateway opens a back-WS to the dashboard at startup and
mirrors every emit through this transport.

Wire protocol: newline-framed JSON dicts (the same shape the dispatcher
already passes to ``write``).  No JSON-RPC envelope here — the dashboard's
``/api/pub`` endpoint just rebroadcasts the bytes verbatim to subscribers.

Failure mode: silent.  The agent loop must never block waiting for the
sidecar to drain.  A dead WS short-circuits all subsequent writes.
Actual ``send`` calls run on a daemon thread so the TeeTransport's
``write`` returns after enqueueing (best-effort; drop when the queue is full).
    )annotationsN)Optional)connect   c                  6    e Zd ZdZddd	dZd
dZddZd
dZy)WsPublisherTransport)_url_lock_ws_dead_q_workerg       @)connect_timeoutc                  || _         t        j                         | _        d | _        d| _        t        j                  t              | _	        d | _
        t        d| _        y 	 t        ||d       | _        t        j                  | j                   dd      | _
        | j                  j#                          y # t        $ r.}t        j                  d|       d| _        d | _        Y d }~y d }~ww xY w)NF)maxsizeT)open_timeoutmax_sizez"event publisher connect failed: %szhermes-ws-pub)targetnamedaemon)r	   	threadingLockr
   r   r   queueQueue
_QUEUE_MAXr   r   
ws_connect	Exception_logdebugThread_drainstart)selfurlr   excs       N/root/.hermes/venv/lib/python3.12/site-packages/tui_gateway/event_publisher.py__init__zWsPublisherTransport.__init__+   s    	^^%
%)
',{{:'F37DJ	!#OdSDH !'';; 

 	  	JJ;SADJDH	s   $B9 9	C0$C++C0c                   	 | j                   j                         }|t        u ry t        |t              s5| j
                  B	 | j                  5  | j
                  | j
                  j                  |       d d d        # 1 sw Y   
xY w# t        $ r.}t        j                  d|       d| _        d | _        Y d }~?d }~ww xY w)NTz event publisher write failed: %s)r   get_DRAIN_STOP
isinstancestrr   r
   sendr   r   r   r   )r#   itemr%   s      r&   r!   zWsPublisherTransport._drainH   s    77;;=D{"dC(xx ZZ ,xx+d+, , ,   

=sC!
 s0   B (B8B B
B 	C$B??Cc                    | j                   s| j                  | j                  yt        j                  |d      }	 | j
                  j                  |       y# t        j                  $ r Y yw xY w)NF)ensure_asciiT)	r   r   r   jsondumpsr   
put_nowaitr   Full)r#   objlines      r&   writezWsPublisherTransport.writeZ   s^    ::)T\\-Azz#E2	GGt$zz 		s   A A0/A0c                   d| _         | j                  }|B|j                         r2	 | j                  j	                  t
               |j                  d       d | _        | j                  y 	 | j                  5  | j                  | j                  j                          d d d        d | _	        y # t        j                  $ r Y w xY w# 1 sw Y   *xY w# t        $ r
 Y d | _	        y w xY w)NTg      @)timeout)r   r   is_aliver   r3   r*   r   r4   joinr   r
   closer   )r#   ws     r&   r<   zWsPublisherTransport.closeg   s    
LL=QZZ\"";/
 FF3F88	 %88'HHNN$% # ::  % %  		s;   B0 -C 9'C	 C 0CC	CC 	C('C(N)r$   r,   r   floatreturnNone)r?   r@   )r5   dictr?   bool)__name__
__module____qualname__	__slots__r'   r!   r7   r<        r&   r   r   (   s    BI=@ : $rH   r   )__doc__
__future__r   r1   loggingr   r   typingr   websockets.sync.clientr   r   ImportError	getLoggerrC   r   objectr*   r   r   rG   rH   r&   <module>rQ      sh   & #     < w"h
V V  Js   A AA