+
    lHàj‰Ž  ã                  ó”  a € 0 t $ R t^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
t
^ RIt^ RIt^ RIHtHt ^ RIHt ^ RIHt ^ RIHt ^ RIHt ^ RIHtHt ]	P6                  ! ]4      tR	tR
s]P@                  ! 4       t!]PD                  PG                  ^RR7      t$]%! 4       t&R]'R&   R R lt(RR/R R llt)R R lt*Rt+Rt,^ðt-Rt.]/! R04      t0^t1^t2]/! R04      t3R R lt4]/! 0 R5m4      t5Rt6 ^ RI7H8t9  ! R  R!4      t<R" R# lt=R$ R% lt>R& R' lt?R( R) lt@R* R+ ltAR, R- ltB ! R. R/];4      tCR0RR1RR2R/R3 R4 lltDR#   ]: d    ];t9 LTi ; i)6a’  WebSocket transport for the tui_gateway JSON-RPC server: reuses :func:`tui_gateway.server.dispatch`
verbatim so every RPC, slash command, approval flow and agent event takes the same handlers as Ink over
stdio. Wire protocol is identical to stdio (newline-delimited JSON-RPC both ways; ``gateway.ready`` right
after accept). Mount as ``@app.websocket("/api/ws") async def ws(ws): await handle_ws(ws)``.)ÚannotationsN)ÚAnyÚCallable)Úserver©Ú_sanitize_surrogates)Úreplay_epoch)Úserialize_frame)Údispatch_legacyÚlegacy_fallback_allowedg      @g        zdashboard-client-touch)Úmax_workersÚthread_name_prefixÚsetÚ_dashboard_client_touch_pendingc               ó   € V ^8„  d   QhRR/# ©é   ÚreturnÚNone© )Úformats   "Ú3/home/ubuntu/.hermes/hermes-agent/tui_gateway/ws.pyÚ__annotate__r   (   s   € ÷ +ñ +¨Dñ +ó    c                ó    € \         ;_uu_ 4        \        P                  V 4       R R R 4       ^ RIHp V! V 4       R #   + '       g   i     L ; i)N)Ú touch_dashboard_client_heartbeat)Ú_dashboard_client_touch_lockr   ÚdiscardÚgateway.scale_to_zeror   )Úpathr   s   & r   Ú_touch_dashboard_client_markerr    (   s2   € ß	%Ö	%ä'×/Ñ/°Ô5÷ 
&õ GÙ$ TÖ*÷	 
&×	%ús	   �=½A	ÚforceFc               ó    € V ^8„  d   QhRRRR/# )r   r!   Úboolr   r   r   )r   s   "r   r   r   0   s   € ÷ Mñ M¨dð M¸tñ Mr   c                óT  € \         P                  ! 4       p\        ;_uu_ 4        V '       g"   V\        ,
          \        8  d    RRR4       R# VsRRR4       Rp ^ RIHp V! 4       p\        ;_uu_ 4        V\        9   d    RRR4       R# \        P                  V4       RRR4       \        P                  \        V4       R#   + '       g   i     L~; i  + '       g   i     L?; i  \         d1    \        P                  T4       \        P                  RRR7        R# i ; i)z_Refresh the dashboard-client liveness marker (throttled, best-effort, never blocks the caller).N)Údashboard_client_heartbeat_pathz'dashboard client heartbeat touch failedT©Úexc_info)ÚtimeÚ	monotonicr   Ú_dashboard_client_touched_atÚ&_DASHBOARD_CLIENT_TOUCH_MIN_INTERVAL_Sr   r%   r   ÚaddÚ_dashboard_client_touch_poolÚsubmitr    Ú	Exceptionr   Ú_logÚdebug)r!   Únowr   r%   s   $   r   Ú_note_dashboard_client_activityr3   0   sÜ   € ô �.Š.Ó
€Cß	%Ö	%ß˜Ô;Õ;Ô>dÔdØ÷ 
&Ñ	%ð (+Ð$÷ 
&ð €DðMÝIá.Ó0ˆß)Ö)ØÔ6Ô6Ø÷ *Ñ)ô ,×/Ñ/°Ô5÷ *ô 	%×+Ñ+Ô,JÈDÖQ÷ 
&×	%ú÷ *×)ûô
 ô MÜ'×/Ñ/°Ô5Ü�
‰
Ð<Àtˆ
×LðMúsG   ¤ CÁCÁC, Á6CÂC, ÂCÂ""C, ÃC	ÃC)	Ã$C, Ã,7D'Ä&D'c               ó    € V ^8„  d   QhRRRR/# )r   ÚtextÚstrr   r   )r   s   "r   r   r   G   s   € ÷ 	8ñ 	8˜Cð 	8 Cñ 	8r   c                ó,   € V '       d   \        V 4      # T # )aH  Return *text* that can be UTF-8 encoded for a WebSocket frame.

``json.dumps(..., ensure_ascii=False)`` happily emits lone UTF-16 surrogates; Starlette's
``send_text`` then raises ``UnicodeEncodeError``, which used to latch the whole connection
closed. Same U+FFFD replacement every other Hermes transport applies.

See #97288.
r   )r5   s   &r   Ú_sanitize_ws_textr8   G   s   € ÷ *.Ô Ó%Ð7°4Ð7r   g      $@g      >@é   zsession.context_breakdownzclarify.lockc               ó    € V ^8„  d   QhRRRR/# )r   Úreqr   r   r#   r   )r   s   "r   r   r   q   s   € ÷ iñ i˜sð i tñ ir   c                óŽ   € ^ RI Hp \        V \        4      ;'       d)    V P	                  R4      \
        9   ;'       g	    V! V 4      # )é    )Úis_response_frameÚmethod)Útui_gateway.server_requestsr>   Ú
isinstanceÚdictÚgetÚ_WS_ANSWER_METHODS)r;   r>   s   & r   Ú_answers_open_requestrE   q   s8   € Ý=Ü�cœ4Ó ×hÐh c§g¡g¨hÓ&7Ô;MÑ&M×&gÐ&gÑQbÐcfÓQgÐhr   gL7‰A`å ?)ÚWebSocketDisconnectc                  óä   € ] tR t^„tRtRR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4       tR R ltR R ltR R ltRRR^ /R R lltR R ltR R ltR  R! ltR" R# ltR$tR# )%ÚWSTransporta@  Per-connection WS transport. ``write`` is safe from any thread *other than* the loop thread owning the
socket (pool workers marshal onto the loop and block on the future); from the loop thread itself it would
deadlock, so it detects that and fires-and-forgets. Loop-thread callers needing completion use ``write_async``.ÚpeerÚunknownÚauth_identityNc          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# )r   Úwsr   Úloopzasyncio.AbstractEventLooprI   r6   rK   údict | Noner   r   r   )r   s   "r   r   ÚWSTransport.__annotate__‰   s2   € ÷ &ñ &˜3ð &Ð&?ð &È#ð &Ø +ð&Ø7;ñ&r   c               	ó   € Wn         W n        W0n        W@n        R V n        RV n        R V n        \        P                  ! 4       V n	        . V n
        RV n        R V n        \        P                  ! 4       V n        R V n        R# )FN)Ú_wsÚ_loopÚ_peerrK   Údesktop_localÚ	skin_homeÚ_closedÚ	threadingÚLockÚ_token_lockÚ_pending_tokensÚ_token_flush_handleÚ_token_flush_armedÚasyncioÚ
_send_lockÚ_abort_requested)ÚselfrM   rN   rI   rK   s   &&&$$r   Ú__init__ÚWSTransport.__init__‰   sm   € àŒØŒ
ØŒ
ð +ÔØ"ˆÔà%)ˆŒØˆŒô %Ÿ>š>Ó+ˆÔØ*,ˆÔØ?CˆÔ Ø"'ˆÔä!Ÿ,š,›.ˆŒØ %ˆÖr   c               ó   € V ^8„  d   QhRR/# ©r   r   r#   r   )r   s   "r   r   rP       s   € ÷ ñ ˜$ñ r   c                	ój   €  \         P                  ! 4       V P                  J #   \         d     R # i ; i)F)r^   Úget_running_looprS   ÚRuntimeError©ra   s   &r   Ú_on_loopÚWSTransport._on_loop    s1   € ð	Ü×+Ò+Ó-°·±Ð;Ð;øÜô 	Úð	ús   ‚ # £2±2c               ó    € V ^8„  d   QhRRRR/# ©r   ÚobjrB   r   r#   r   )r   s   "r   r   rP   ¦   s   € ÷ )ñ )˜ð ) $ñ )r   c                	óÀ  € V P                   '       d   R # \        WP                  \        4      pV P	                  4       p\        V\        4      '       d   VP                  R4      MRp\        V\        4      '       d¢   VP                  R4      \        9   dˆ   V P                  ;_uu_ 4        V P                  P                  V4       V P                  '       g-   RV n        V P                  P                  V P                  4       RRR4       V P                   '       * # ^ RIHp V P                  ;_uu_ 4        V P                  P                  V4       V P                  . uq`n
        V'       d6   V P                  P%                  V P'                  V4      4        RRR4       R# V! V P'                  V4      V P                  4      pVf   RV n          RRR4       R #  RRR4        XP)                  \*        R7       V P                   '       * #   + '       g   i     EL; i  + '       g   i     LL; i  \,        P.                  P0                   d:    \        P3                  R\*        T P                  4       T P                   '       * u # \4         dH   pRT n         \        P3                  RT P                  \7        T4      P8                  T4        Rp?R # Rp?ii ; i)	FÚparamsNÚtypeT)Úsafe_schedule_threadsafe©ÚtimeoutuB   ws write slow (loop stalled >%ss) peer=%s â€” frame left in flightz.ws write failed peer=%s error_type=%s error=%s)rW   r	   rT   r0   rj   rA   rB   rC   Ú_STREAMING_EVENT_TYPESrZ   r[   Úappendr]   rS   Úcall_soon_threadsafeÚ_arm_token_flushÚagent.async_utilsrr   Úcreate_taskÚ_safe_send_manyÚresultÚ_WS_WRITE_TIMEOUT_SÚ
concurrentÚfuturesÚTimeoutErrorÚwarningr/   rq   Ú__name__)	ra   rn   ÚlineÚon_looprp   rr   ÚbatchÚfutÚexcs	   &&       r   ÚwriteÚWSTransport.write¦   s  € Ø�<�<ˆ<ÙÜ˜s§J¡J´Ó5ˆØ—-‘-“/ˆô '1°´d×&;Ò&;�—‘˜Ô"ÀˆÜ�fœd×#Ò#¨¯
©
°6Ó(:Ô>TÔ(TØ×!×!Ó!Ø×$Ñ$×+Ñ+¨DÔ1Ø×.×.Ð.Ø.2�DÔ+Ø—J‘J×3Ñ3°D×4IÑ4IÔJ÷	 "ð
 —|‘|Ô#Ð#õ 	?Ø××ÓØ× Ñ ×'Ñ'¨Ô-Ø*.×*>Ñ*>ÀÐ'ˆEÔ'ßØ—
‘
×&Ñ& t×';Ñ';¸EÓ'BÔCØ÷ Ññ +¨4×+?Ñ+?ÀÓ+FÈÏ
É
ÓSˆCØŠ{Ø#�”Ø÷ Ñð ÷ ð	Ø�J‰JÔ2ˆJÔ3Ø—|‘|Ô#Ð#÷- "×!Ð!ú÷ ×ûô ×!Ñ!×.Ñ.ô 	$ô �L‰LÐ]Ô_rÐtx×t~Ñt~ÔØ—|‘|Ô#Ò#Üô 	ØˆDŒLÜ�L‰LÐIÈ4Ï:É:ÔW[Ð\_ÓW`×WiÑWiÐknÔoÝûð	úsE   Â,AHÄ9A"H"Æ%.H"Ç'&H5 ÈH	È"H2	È5AKÊKÊKÊ<KËKc               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   rP   Ñ   s   € ÷ dñ d $ñ dr   c                	óŒ   € V P                   '       g2   V P                  P                  \        V P                  4      V n        R # R # ©N)rW   rS   Ú
call_laterÚ_TOKEN_COALESCE_SÚ_flush_tokensr\   ri   s   &r   rx   ÚWSTransport._arm_token_flushÑ   s1   € Ø�|�|ˆ|Ø'+§z¡z×'<Ñ'<Ô=NÐPT×PbÑPbÓ'cˆDÖ$ñ r   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   rP   Õ   s   € ÷ Dñ D˜tñ Dr   c                ó2  € V P                   ;_uu_ 4        RV n        RV n        V P                  . uqn        V'       d=   V P                  '       g+   V P
                  P                  V P                  V4      4       RRR4       R#   + '       g   i     R# ; i)z”Timer callback (loop thread): send buffered tokens as one batch, scheduled under the lock so
wire order is fixed relative to a concurrent ``write``.NF)rZ   r\   r]   r[   rW   rS   rz   r{   )ra   r…   s   & r   r�   ÚWSTransport._flush_tokensÕ   sj   € ð ××ÓØ'+ˆDÔ$Ø&+ˆDÔ#Ø*.×*>Ñ*>ÀÐ'ˆEÔ'ß˜TŸ\Ÿ\˜\Ø—
‘
×&Ñ& t×';Ñ';¸EÓ'BÔC÷ ××Òús   •;BÁ*BÂB	c               ó   € V ^8„  d   QhRR/# re   r   )r   s   "r   r   rP   à   s   € ÷ ñ ˜ñ r   c                	ó   € V P                   # rŒ   )rW   ri   s   &r   ÚclosedÚWSTransport.closedß   s   € à�|‰|Ðr   c               ó    € V ^8„  d   QhRRRR/# rm   r   )r   s   "r   r   rP   ã   s   € ÷ 	 ñ 	  Tð 	 ¨dñ 	 r   c           	   ƒ  ób  "  € V P                   '       d   R# V P                  ;_uu_ 4        V P                  . uq n        VP                  \	        WP
                  \        4      4       RRR4       V P                  X4      G Rj  x€L
  V P                   '       * #   + '       g   i     L:; i L(5i)z•Send from the owning loop; awaits until the frame is on the wire. Buffered tokens are flushed
ahead of it in the SAME batch so nothing slips between.FN)rW   rZ   r[   rv   r	   rT   r0   r{   )ra   rn   r…   s   && r   Úwrite_asyncÚWSTransport.write_asyncã   s   é € ð �<�<ˆ<ÙØ××ÓØ*.×*>Ñ*>ÀÐ'ˆEÔ'Ø�L‰Lœ¨¯j©j¼$Ó?Ô@÷ ð ×"Ñ" 5Ó)×)Ð)Ø—<‘<ÔÐ÷	 ×úñ 	*ùs(   ‚)B/«=BÁ(B/ÂB-ÂB/ÂB*	Â%	B/c               ó    € V ^8„  d   QhRRRR/# )r   Úframesú
list[dict]r   r#   r   )r   s   "r   r   rP   î   s   € ÷ Dñ D¨Zð D¸Dñ Dr   c              ƒ  óB   "  € V P                  VR4      G Rj  x€L
 #  L5i)zX``write_async`` for an ordered batch: buffered tokens, then *frames*, in one send batch.N)Úwrite_many_if_current_async)ra   r�   s   &&r   Úwrite_many_asyncÚWSTransport.write_many_asyncî   s   é € à×5Ñ5°f¸dÓC×CÐCÑCùs   ‚˜™c               ó$   € V ^8„  d   QhRRRRRR/# )r   r�   rž   Ú
is_currentúCallable[[], bool] | Noner   r#   r   )r   s   "r   r   rP   ò   s#   € ÷ 	 ñ 	 ¸
ð 	 ÐPið 	 Ðnrñ 	 r   c              ƒ  óf  a "  € S P                   '       d   R# S P                  ;_uu_ 4        S P                  . upS n        \        V4      pVP	                  V 3R lV 4       4       RRR4       S P                  XVXR7      G Rj  x€L
  S P                   '       * #   + '       g   i     L=; i L(5i)zWRecheck the batch's owner at each send without gating other producers' buffered tokens.Fc              3  óZ   <"  € T F   p\        VSP                  \        4      x € K"  	  R # 5irŒ   )r	   rT   r0   )Ú.0Úframera   s   & €r   Ú	<genexpr>Ú:WSTransport.write_many_if_current_async.<locals>.<genexpr>ù   s!   øé € ÐVÉvÀeœ¨°·
±
¼D×AÐAËvùs   ƒ(+N)r¤   Úunguarded_prefix)rW   rZ   r[   ÚlenÚextendr{   )ra   r�   r¤   r…   r¬   s   f&&  r   r    Ú'WSTransport.write_many_if_current_asyncò   sŽ   øé € à�<�<ˆ<ÙØ××ÓØ*.×*>Ñ*>ÀÐ'ˆE�4Ô'Ü" 5›zÐØ�L‰LÔVÉvÓVÔV÷ ð ×"Ñ" 5°ZÐRbÐ"Óc×cÐcØ—<‘<ÔÐ÷ ×úñ 	dùs(   ƒ)B1¬;BÁ'B1ÂB/ÂB1ÂB,	Â'	B1r¤   r¬   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   Úlinesz	list[str]r¤   r¥   r¬   Úintr   r   r   )r   s   "r   r   rP   ý   s+   € ÷  ñ  ¨9ð  ÐE^ð  Ø03ð Ø<@ñ r   c             ƒ  ó„  "  € V P                   ;_uu_4       GRj  x€L
  V P                  '       d    RRR4      GRj  x€L
  R# \        V4       F�  w  rEV P                  '       d    RRR4      GRj  x€L
  R# Ve'   WC8¼  d!   V! 4       '       g    RRR4      GRj  x€L
  R# \        V4      p \        P
                  ! V P                  P                  V4      \        R7      G Rj  x€L
  KŸ  	  RRR4      GRj  x€L
  R#  Lç LÆ L“ Lk L"  \         dn    RT n        \        P                  RT P                  \        4       T P                  P                  T P                  RR4      4         RRR4      GRj  x€L 
  R# \          d.   p\        P                  RT P                  T4        Rp?EKf  Rp?i\"         dZ   pRT n        \        P                  RT P                  \%        T4      P&                  T4        Rp? RRR4      GRj  x€L 
  R# Rp?ii ; i EL$  + GRj  x€L 
 '       g   i     R# ; i5i)	zBSend one indivisible batch of pre-serialized frames in wire order.Nrs   Tu\   ws send deadline exceeded (socket stalled, loop responsive) peer=%s deadline=%ss â€” closingéó  zsend deadlinez4ws send skipped invalid utf-8 frame peer=%s error=%sz-ws send failed peer=%s error_type=%s error=%s)r_   rW   Ú	enumerater8   r^   Úwait_forrR   Ú	send_textÚ_WS_SEND_DEADLINE_Sr€   r0   r�   rT   rS   rz   Ú_close_socketÚUnicodeEncodeErrorr/   rq   r‚   )ra   r±   r¤   r¬   Úindexrƒ   Úpayloadr‡   s   &&$$    r   r{   ÚWSTransport._safe_send_manyý   sŒ  é € ð —?—?—?“?Ø�|�|ˆ|Ø÷ #—?‘?ô  )¨Ö/‘�Ø—<—<�<Ø÷ #—?‘?ð Ò)¨eÔ.GÑPZ×P\ÒP\Ø÷ #—?‘?ô ,¨DÓ1�ðÜ!×*Ò*¨4¯8©8×+=Ñ+=¸gÓ+FÔPcÔd×dÒdñ  0÷ #—?—?‘?ñ eøÜ#ô 	ð
 $(�D”LÜ—L‘LÐ!Ø!%§¡Ô-@ôBà—J‘J×*Ñ*¨4×+=Ñ+=¸dÀOÓ+TÔUÙ÷) #—?’?ô* *ô ä—L‘LÐ!WÐY]×YcÑYcÐehÔiÞûÜ ô à#'�D”LÜ—L‘LÐ!PÐRV×R\ÑR\Ô^bÐcfÓ^g×^pÑ^pÐruÔvÜ÷; #—?’?ûð2ú÷3 #—?—?”?üs2  ‚I ›DœI ŸH#³I ¾D¿I Á#H#Á(I Á3DÁ4I Á:H#ÂH#ÂI ÂD	ÂI Â$H#Â08DÃ(D
Ã)DÃ-H#Ã1I Ã<H Ã=I ÄI ÄI Ä	I ÄDÄA"H	Å/H#Å1I Å<E?Å=I ÆH	ÆH	Æ!F6	Æ/H#Æ6H	ÇH	Ç<H	È H#ÈI ÈHÈI ÈH	ÈH#È I È#H=	È)H,È*
H=	È5H=	È7	I c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   rP     s   € ÷ ,ñ ,�tñ ,r   c                	óv   € R V n         V P                  e$   V P                  P                  4        RV n        R# R# )TN)rW   r\   Úcancelri   s   &r   ÚcloseÚWSTransport.close  s4   € ØˆŒØ×#Ñ#Ò/Ø×$Ñ$×+Ñ+Ô-Ø'+ˆDÖ$ñ 0r   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   rP   %  s   € ÷ @ñ @�tñ @r   c                óÔ  € RV n         V P                  ;_uu_ 4        V P                  '       d    RRR4       R# RV n        RRR4       V P                  4       '       d   V P	                  4        R# \
        P                  ! \        4      ;_uu_ 4        V P                  P                  V P                  4       RRR4       R#   + '       g   i     LŠ; i  + '       g   i     R# ; i)z¸Close from any thread and drop the socket with 1011 so the client reconnects and replays
(fanout overflow). One-shot: N mirrored sessions overflowing on this socket schedule one close.TN)
rW   rZ   r`   rj   Ú_finish_abortÚ
contextlibÚsuppressrh   rS   rw   ri   s   &r   ÚabortÚWSTransport.abort%  sŸ   € ð ˆŒØ××ÓØ×$×$Ð$Ø÷ Ñð %)ˆDÔ!÷ ð �=‰=�?Š?Ø×ÑÔ Ùä× Ò ¤×.Õ.Ø�J‰J×+Ñ+¨D×,>Ñ,>Ô?÷ /Ñ.÷ ×ú÷ /×.Ð.ús   œCºCÂ&CÃC	ÃC'	c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   rP   4  s   € ÷ Lñ L˜tñ Lr   c                	ó|   € V P                  4        V P                  P                  V P                  R R4      4       R# )r´   zfanout overflowN)rÁ   rS   rz   r¹   ri   s   &r   rÅ   ÚWSTransport._finish_abort4  s+   € Ø�
‰
ŒØ�
‰
×Ñ˜t×1Ñ1°$Ð8IÓJÖKr   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úcoder²   Úreasonr6   r   r   r   )r   s   "r   r   rP   8  s&   € ÷ ]ñ ]¨ð ]°Sð ]¸Tñ ]r   c              ƒ  óÐ   "  €  V P                   P                  VR7      G Rj  x€L
  R#  L  \         d-   p\        P	                  RY P
                  T4        Rp?R# Rp?ii ; i5i)u­   Close the peer socket so ``handle_ws``'s ``receive_text`` unblocks and its disconnect teardown
runs. The server library bounds this (websockets ``close_timeout`` â†’ abort).)rÎ   Nz)ws close after %s failed peer=%s error=%s)rR   rÁ   r/   r0   r1   rT   )ra   rÎ   rÏ   r‡   s   &&& r   r¹   ÚWSTransport._close_socket8  sM   é € ð	]Ø—(‘(—.‘. d�.Ó+×+Ô+øÜô 	]Ü�J‰JÐBÀFÏJÉJÐX[×\Ò\ûð	]üs6   ‚A&„, £*¤, ¨A&ª, ¬A#·!AÁA&ÁA#Á#A&)r`   rW   rS   rT   r[   r_   r]   r\   rZ   rR   rK   rU   rV   )r‚   Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rb   rj   rˆ   rx   r�   Úpropertyr–   rš   r¡   r    r{   rÁ   rÈ   rÅ   r¹   Ú__static_attributes__r   r   r   rH   rH   „   s‹   † ñwð&ÐPYð &Ø.2÷&õ.õ)õVdõDð ôó ðõ	 õDõ	 ð Ðaeð  Ø67÷ õD,õ@õL÷]ñ ]r   rH   c               ó    € V ^8„  d   QhRRRR/# )r   rM   r   r   r6   r   )r   s   "r   r   r   A  s   € ÷ :ñ :�sð :˜sñ :r   c                óˆ   € \        V RR4      pVf   R# \        VRR4      ;'       g    R\        VRR4      r2Ve   V RV 2# T# )z8``host:port`` when available, else a stable placeholder.ÚclientNrJ   ÚhostÚportÚ:)Úgetattr)rM   rÚ   rÛ   rÜ   s   &   r   Ú_ws_peer_labelrß   A  sU   € ä�R˜ 4Ó(€FØ‚~ÙÜ˜ ¨Ó.×;Ð;°)¼WÀVÈVÐUYÓ=Zˆ$Ø#Ò/ˆdˆV�1�T�FÐÐ9°TÐ9r   c               ó   € V ^8„  d   QhRR/# re   r   )r   s   "r   r   r   J  s   € ÷ Cñ C ñ Cr   c                ó¬   € \        V \        4      '       d   V P                  R 4      MRp\        V\        4      ;'       d    VP                  R4      R8H  # )ÚerrorNrÎ   i§€ÿÿ)rA   rB   rC   )Úresprâ   s   & r   Ú_is_unknown_methodrä   J  sA   € Ü!+¨D´$×!7Ò!7ˆD�H‰H�WÔ¸T€EÜ�eœTÓ"×BÐB u§y¡y°Ó'8¸FÑ'BÐBr   c               ó    € V ^8„  d   QhRRRR/# )r   rM   r   r   r   r   )r   s   "r   r   r   O  s   € ÷ 3ñ 3�sð 3˜tñ 3r   c                óâ  €  \        V RR4      ;'       g    / pVP                  R4      ;'       g    / P                  R4      ;'       g    \        V RR4      pVe   VP                  R4      MRpVEeM   VP                  \        P
                  \        P                  ^4       VP                  \        P                  \        P                  ^4       \        \        R4      '       d�   VP                  \        P
                  \        P                  ^4       VP                  \        P
                  \        P                  ^
4       VP                  \        P
                  \        P                  ^4       R# \        \        R4      '       d2   VP                  \        P
                  \        P                  ^4       R# R# R#   \         d"   p\        P!                  RT4        Rp?R# Rp?ii ; i)	a�  Disable Nagle + enable TCP keepalive on the raw socket (best-effort). Without TCP_NODELAY the kernel
coalesces small per-token frames, so a burst after the model's think-pause lands in one tick and no
client-side smoothing can recover the cadence. Without keepalive a silently-dropped client (SSH tunnel
reset, sleep) leaves the leg half-open forever: receive_text() blocks and the disconnect teardown never runs.ÚscopeNÚ
extensionsÚ	transportÚsocketÚTCP_KEEPIDLEÚTCP_KEEPALIVEzws TCP_NODELAY skip: %s)rÞ   rC   Úget_extra_infoÚ
setsockoptrê   ÚIPPROTO_TCPÚTCP_NODELAYÚ
SOL_SOCKETÚSO_KEEPALIVEÚhasattrrë   ÚTCP_KEEPINTVLÚTCP_KEEPCNTrì   r/   r0   r1   )rM   rç   ré   Úsockr‡   s   &    r   Ú_disable_nagler÷   O  s`  € ð
3Ü˜˜G TÓ*×0Ð0¨bˆØ—Y‘Y˜|Ó,×2Ð2°×7Ñ7¸ÓD×fÐfÌÐPRÐT_ÐaeÓHfˆ	Ø5>Ò5Jˆy×'Ñ'¨Ô1ÐPTˆØÓØ�O‰OœF×.Ñ.´×0BÑ0BÀAÔFØ�O‰OœF×-Ñ-¬v×/BÑ/BÀAÔFÜ”v˜~×.Ò.Ø—‘¤× 2Ñ 2´F×4GÑ4GÈÔLØ—‘¤× 2Ñ 2´F×4HÑ4HÈ"ÔMØ—‘¤× 2Ñ 2´F×4FÑ4FÈÖJÜœ ×1Ò1Ø—‘¤× 2Ñ 2´F×4HÑ4HÈ"ÖMñ 2ñ øô ô 3Ü�
‰
Ð,¨c×2Ò2ûð3ús/   ‚G –G ±G Á
D+G Å7AG ÇG.ÇG)Ç)G.c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   rM   r   ré   rH   rK   rO   Úoperatorr#   r   )r   s   "r   r   r   e  s/   € ÷ ]ñ ]˜cð ]¨kð ]È+ð ]Ðaeñ ]r   c           	     óæ   € \        V RR4      ;'       g    / P                  R4      ;'       g$    \        \        \        V RR4      RR4      RR4      pVf   R# ^ RIHp T! YAT;'       g    / VR7      # )	z­The session-authority connection for this socket (route scope, else app state), or None
when this backend has no authority and requests go to the legacy ``server.dispatch``.rç   Nzhermes.session_authorityÚappÚstateÚsession_authority)ÚAuthorityConnection)rù   )rÞ   rC   Úgateway.session_controlsrþ   )rM   ré   rK   rù   Ú	authorityrþ   s   &&&&  r   Ú_authority_connectionr  e  sz   € ô ˜˜W dÓ+×1Ð1¨r×6Ñ6Ð7QÓR÷ Uð UÔV]Ü”˜˜E 4Ó(¨'°4Ó8Ð:MÈtóWU€IàÒÙÝ<Ù˜y°]×5HÐ5HÀbÐS[Ô\Ð\r   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )r   Úauthority_connectionr   r;   Ú
req_methodré   rH   r   r   )r   s   "r   r   r   p  s1   € ÷ ñ °#ð ¸Cð ÈSð Ð]hð Ðmpñ r   c           	   ƒ  ó  "  € ^ RI Hp V! \        VRR4      4      ;_uu_ 4        V f8   \        P                  ! \
        P                  W4      G Rj  x€L
 uuRRR4       # V P                  V4      G Rj  x€L
 pV P                  p\        V4      '       dP   V\
        P                  9   d;   \        Wb4      '       d*   \        P                  ! \        \
        WV4      G Rj  x€L
 pVuuRRR4       #  LŸ L~ L  + '       g   i     R# ; i5i)a  One request through the authority when attached, else the legacy dispatcher. A request from the
local Desktop runs as work for it (the welcome trial and onboarding key on that), and so do the
threads it hands off to: ``to_thread`` and the legacy pool copy this context.)Úserving_local_desktoprU   FN)Úhermes_cli.process_identityr  rÞ   r^   Ú	to_threadr   ÚdispatchÚactorrä   Ú_methodsr   r
   )r  r;   r  ré   r  rã   r
  s   &&&&   r   Ú_dispatch_requestr  p  sÆ   é € õ BÙ	œw y°/À5ÓI×	JÕ	JØÒ'Ü ×*Ò*¬6¯?©?¸CÓK×K÷ 
KÒ	Jð *×2Ñ2°3Ó7×7ˆØ$×*Ñ*ˆÜ˜t×$Ò$¨´v·±Ô)FÜ+¨E×>Ò>ô
 !×*Ò*¬?¼FÀCÐTYÓZ×ZˆDØ÷ 
KÒ	JáKÙ7ñ [÷ 
K×	JÐ	Jüs_   ‚"D¤-C7ÁC1ÁC7ÁDÁ C7Á4C3Á5A+C7Ã C5Ã!C7Ã&DÃ1C7Ã3C7Ã5C7Ã7D	Ä	Dc               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r   „  s   € ÷ ;ñ ; ñ ;r   c                 óÄ   € \         P                  R3\         P                  R33 F  w  r V ! 4        K  	  R#   \         d    \        P                  RTRR7        K9  i ; i)z‘Backend heartbeat refresher + startup orphan sweep (idempotent, once per process); a
failure of either is logged and never blocks the connection.z!backend heartbeat refresher startzstartup orphan sweep schedulingz	%s failedTr&   N)r   Ú"_start_backend_heartbeat_refresherÚ_schedule_startup_orphan_sweepr/   r0   r�   )ÚstartÚwhats     r   Ú_start_backend_livenessr  „  s]   € ô 
×	2Ñ	2Ð4WÐXÜ	×	.Ñ	.Ð0QÐRó‰ˆð	;ÙŽGóøô ô 	;Ü�L‰L˜ d°TˆL×:ð	;ús   «8¸#AÁAc                  ó   € ] tR tRtRtRtR# )Ú_SendFailedi’  zQRaised by handle_ws._reply when a reply could not be written: ends the read loop.r   N)r‚   rÒ   rÓ   rÔ   rÕ   r×   r   r   r   r  r  ’  s   † Ý[r   r  rK   Úsubprotocolrù   c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# )r   rM   r   rK   rO   r  z
str | Nonerù   r#   r   r   r   )r   s   "r   r   r   –  s9   € ÷ 
ñ 
˜ð 
¨{ð 
ÐPZð 
Ø"ð
Ø/3ñ
r   c             ƒ  óT  aaaaaaaaaaaa a!a"a#a$a%a&a'a(a)"  € \        V 4      Ruo"o)Ro^ ;p;p;o o&RoR VV&V)3R lloR R lo\        P                  ! \        R7      o#Ro!\	        4       o\	        4       o'\        P
                  ! \        4      o\        P
                  ! \        \        ,           4      o$\        P                  ! 4       P                  4       o%\        4       o(R VVVV V"V)3R	 lloR
 VVV%V'3R lloR VV$V'3R lloR V#V%V(3R lloR VVVVVV(3R llpR VVV#V$3R llpR VV'3R llpR V!V%3R llo V'       d   V P                  VR7      MV P                  4       G Rj  x€L
  Ro\        RR7       \        V 4       \        P                  RS"4       \!        V \        P                  ! 4       S"VR7      o)\#        V S)W4      o\        P$                  ! \&        P(                  4      G Rj  x€L
 p	S)P+                  RRR R!R"R#R$R%R&V	R'RR(RR)\-        4       /Se   R*R/M/ C//4      G Rj  x€L
 p
V
'       dt   \&        P.                  ! 4        \&        P0                  ! 4        Se0   \&        P2                  ! SP4                  P6                  4      S)n        \&        P:                  ! S)4       \=        4        V
'       EgN   R+oS&^,          o&\        P?                  R,S"4        S!Ee   \        P@                  ! 4       pVe(   VPC                  4       '       d   S!PE                  4        MJ\F        PH                  ! \J        4      ;_uu_ 4        S! S#PM                  S(4      4      G Rj  x€L
  RRR4       \        PN                  ! S!04      G Rj  x€L
  S!PQ                  4       '       d   RMS!PS                  4       pVe/   \U        V\J        4      '       g   \        P?                  R-S"VR.7       V! 4       G Rj  x€L
  Se   SPW                  4       G Rj  x€L
  ^ ;rÞS)e¼   \&        PX                  ! S)4        ^ R/I-H.p \        P$                  ! V! 4       P^                  S)4      G Rj  x€L
  S)PW                  4         \        P$                  ! \&        Pb                  S)4      G Rj  x€L
   \        P$                  ! \&        Pd                  S)R2R37      G Rj  x€L
 w  rÞ V PW                  4       G Rj  x€L
  \        P                  R6S"SWES S&WÞ4	       R# \        Ph                  ! V! 4       4      o!  S! V Pk                  4       4      G Rj  x€L
 p\        4        TPq                  4       pT'       g   KD  T^,          p \r        Pt                  ! T4      p\U        T\|        4      '       dF   TP                  R 4      RB8X  d0   TP                  RC4      pS! RRRDRER/RCT/RFRGS"T4      G Rj  x€L
  K¿  T! T4      G Rj  x€L
  KÑ   EL“ EL ELÒ ELž  + '       g   i     EL¥; i ELŽ EL( EL ELÀ  \`         d    \        PS                  R0S"4        ELâi ; i EL­  \`         d    \        PS                  R1S"4        ELÏi ; i EL¨  \`         d    \        PS                  R4S"4        ELÈi ; i EL¸  \`         d#   p\        Pg                  R5S"T4        Rp?ELÞRp?ii ; i EL“  \J         d    h \l         d*   pR7\o        TR8R4       R9\o        TR:R4       R;2o Rp?M¬Rp?i\`         d    R<o\        PS                  R=S"4        M„i ; i  \r        Pv                   dR   pT^,          p\        Py                  R>S"TTTR\z         4       S! S! RHR?R4      R@RAS"4      G Rj  x€L 
   Rp?EKx  Rp?ii ; i ELÈ EL¹  \J         d     Mi ; iS!Ee   \        P@                  ! 4       pTe(   TPC                  4       '       d   S!PE                  4        M_\F        PH                  ! \J        4      ;_uu_ 4        S! S#PM                  S(4      4      G Rj  x€L 
  RRR4       M  + '       g   i     M; i\        PN                  ! S!04      G Rj  x€L 
  S!PQ                  4       '       d   RMS!PS                  4       pTe/   \U        T\J        4      '       g   \        P?                  R-S"TR.7       T! 4       G Rj  x€L 
  Se   SPW                  4       G Rj  x€L 
  ^ ;rÞS)Ee7   \&        PX                  ! S)4        ^ R/I-H.p \        P$                  ! T! 4       P^                  S)4      G Rj  x€L 
  M'  \`         d    \        PS                  R0S"4        Mi ; iS)PW                  4         \        P$                  ! \&        Pb                  S)4      G Rj  x€L 
  M'  \`         d    \        PS                  R1S"4        Mi ; i \        P$                  ! \&        Pd                  S)R2R37      G Rj  x€L 
 w  rÞM'  \`         d    \        PS                  R4S"4        Mi ; i T PW                  4       G Rj  x€L 
  M/  \`         d"   p\        Pg                  R5S"T4        Rp?MRp?ii ; i\        P                  R6S"SYES S&YÞ4	       R#   S!Ee   \        P@                  ! 4       pTe(   TPC                  4       '       d   S!PE                  4        M_\F        PH                  ! \J        4      ;_uu_ 4        S! S#PM                  S(4      4      G Rj  x€L 
  RRR4       M  + '       g   i     M; i\        PN                  ! S!04      G Rj  x€L 
  S!PQ                  4       '       d   RMS!PS                  4       pTe/   \U        T\J        4      '       g   \        P?                  R-S"TR.7       T! 4       G Rj  x€L 
  Se   SPW                  4       G Rj  x€L 
  ^ ;rÞS)Ee7   \&        PX                  ! S)4        ^ R/I-H.p \        P$                  ! T! 4       P^                  S)4      G Rj  x€L 
  M'  \`         d    \        PS                  R0S"4        Mi ; iS)PW                  4         \        P$                  ! \&        Pb                  S)4      G Rj  x€L 
  M'  \`         d    \        PS                  R1S"4        Mi ; i \        P$                  ! \&        Pd                  S)R2R37      G Rj  x€L 
 w  rÞM'  \`         d    \        PS                  R4S"4        Mi ; i T PW                  4       G Rj  x€L 
  M/  \`         d"   p\        Pg                  R5S"T4        Rp?MRp?ii ; i\        P                  R6S"SYES S&YÞ4	       i ; i5i)IaJ  Run one WebSocket session. Wire-compatible with ``tui_gateway.entry``. *auth_identity* is the server-minted
``{user_id, provider}`` recorded at WS-upgrade auth, stored as ``WSTransport.auth_identity`` (the only identity
authority for browser-controller registration); callers that omit it (harnesses, embedded TUI child) get None.NÚnot_connectedc          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r   r©   rB   rÏ   r6   ÚmsgÚargsr   r   r   r   )r   s   "r   r   Úhandle_ws.<locals>.__annotate__   s/   € ÷ ñ ˜Dð ¨#ð °Cð Àð Èñ r   c              —  ó¤   <"  € SP                  V 4      G Rj  x€L
 '       g*   VoS^,          o\        P                  ! V.VO5!   \        hR#  L55i)zIwrite_async; on failure record *reason*, log *msg* and end the read loop.N)rš   r0   r�   r  )r©   rÏ   r  r  Údisconnect_reasonÚsend_failuresré   s   &&&*€€€r   Ú_replyÚhandle_ws.<locals>._reply   sH   øé € ð ×*Ñ*¨5Ó1×1Ö1Ø &ÐØ˜QÕˆMÜ�LŠL˜Ð$˜tÔ$ÜÐó	 2ùs   ƒA˜A™	A£,Ac               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   rÎ   r²   Úmessager6   Úreq_idr   r   rB   r   )r   s   "r   r   r  ©  s.   € ÷ ]ñ ]�Sð ] 3ð ]°ð ]¸ñ ]r   c                ó   € R RRRV RV/RV/# )Újsonrpcú2.0râ   rÎ   r$  Úidr   )rÎ   r$  r%  s   &&&r   Ú_errorÚhandle_ws.<locals>._error©  s   € Ø˜5 '¨F°D¸)ÀWÐ+MÈtÐU[Ð\Ð\r   )Úmaxsizec               ó    € V ^8„  d   QhRRRR/# ©r   r;   r   r   r   r   )r   s   "r   r   r  ¸  s   € ÷ fñ f ð f¨ñ fr   c           	   “  óº  <"  € \        V \        4      '       d   V P                  R4      MRp\        V \        4      '       d   V P                  R4      MRp \        SWS	4      G Rj  x€L
 pTe   S! TRR	SY4      G Rj  x€L
  R# R#  L   \         dB    S^,          o\
        P                  RSY4       S! S! R
RT4      RRSY4      G Rj  x€L 
   R# i ; i LY5i)z0Dispatch one request and write its inline reply.r)  Nr?   z)ws dispatch crash peer=%s id=%s method=%szinternal errorÚ send_failed_after_dispatch_crashz;ws dispatch-crash reply send failed peer=%s id=%s method=%sÚsend_failed_after_responsez/ws response send failed peer=%s id=%s method=%si¥€ÿÿ)rA   rB   rC   r  r/   r0   Ú	exception)
r;   r%  r  rã   r*  r!  r  Údispatch_crashesrI   ré   s
   &   €€€€€€r   Ú_dispatch_oneÚ handle_ws.<locals>._dispatch_one¸  sí   øé € ô #-¨S´$×"7Ò"7�—‘˜”¸TˆÜ*4°S¼$×*?Ò*?�S—W‘W˜XÔ&ÀTˆ
ð	Ü*Ð+?ÀÐR[Ó\×\ˆDð ÒÙ˜Ð;ØJÈDÐRXóf÷ fò fñ ñ ]øäô 	Ø Õ!ÐÜ�N‰NÐFÈÈfÔaÙ™ Ð(8¸&ÓAÐCeØVÐX\Ð^dór÷ rñ râð	úñfùsU   ƒACÁB
 Á'BÁ(B
 Á,CÁ?CÂ CÂB
 Â
ACÃCÃCÃCÃCÃCc               ó    € V ^8„  d   QhRRRR/# r.  r   )r   s   "r   r   r  Í  s   € ÷ 
ñ 
¨Sð 
°Tñ 
r   c              “  ót  <"  € S;_uu_4       GR j  x€L
  SP                  \        P                  ! 4       4        S! V 4      G R j  x€L
  R R R 4      GR j  x€L
  R #  LK L  \         d*    SP	                  4       '       g   SP                  R 4       h i ; i LA  + GR j  x€L 
 '       g   i     R # ; i5irŒ   )r,   r^   Úcurrent_taskr  ÚdoneÚ
set_result)r;   r4  Úconcurrent_read_slotsÚsend_failedÚstarted_readss   &€€€€r   Ú_dispatch_concurrent_readÚ,handle_ws.<locals>._dispatch_concurrent_readÍ  sˆ   øé € ß(×(Ò(Ø×Ñœg×2Ò2Ó4Ô5ðÙ# CÓ(×(Ð(÷ )×(Ó(ñ )øÜô ð #×'Ñ'×)Ò)Ø×*Ñ*¨4Ô0Øðú÷	 )×(×(Ó(üss   ƒB8’A“B8–%B¼A"ÁA ÁA"ÁB8ÁBÁB8Á A"Á" BÂBÂBÂB8ÂB5	Â!B$Â"
B5	Â-B5	Â/	B8c               ó    € V ^8„  d   QhRRRR/# )r   Útaskzasyncio.Taskr   r   r   )r   s   "r   r   r  Ù  s   € ÷ ñ  lð °tñ r   c                ó(  <€ SP                  4        SP                  V 4       SP                  V 4       \        P                  ! \        P
                  \        4      ;_uu_ 4        V P                  4        R R R 4       R #   + '       g   i     R # ; irŒ   )Úreleaser   rÆ   rÇ   r^   ÚCancelledErrorr  r|   )rA  Úconcurrent_readsÚread_admissionr=  s   &€€€r   Ú_finish_concurrent_readÚ*handle_ws.<locals>._finish_concurrent_readÙ  s]   ø€ à×ÑÔ Ø× Ñ  Ô&Ø×Ñ˜dÔ#Ü× Ò ¤×!7Ñ!7¼×EÕEØ�K‰KŒM÷ F×E×EÒEús   Á%B Â B	c               ó   € V ^8„  d   QhRR/# )r   r   r   r   )r   s   "r   r   r  á  s   € ÷ ñ  ñ r   c               “  óX  <"  € \         P                  ! SP                  4       4      p \         P                  ! V S0\         P                  R7      G Rj  x€L
  V P                  4       '       d)   SP                  4       '       d   S# V P                  4       # V P                  4        S#  LT5i)zMThe next queued frame, or ``stop`` once the read lane failed to send a reply.©Úreturn_whenN)r^   Úensure_futurerC   ÚwaitÚFIRST_COMPLETEDr9  r|   rÀ   )ÚstepÚpendingr<  Ústops    €€€r   Ú_next_requestÚ handle_ws.<locals>._next_requestá  sy   øé € ä×$Ò$ W§[¡[£]Ó3ˆÜ�lŠl˜D +Ð.¼G×<SÑ<SÔT×TÐTØ�9‰9�;Š;Ø&×+Ñ+×-Ò-�4Ð@°4·;±;³=Ð@Ø�‰ŒØˆñ	 	Uùs   ƒAB*ÁB(ÁB*Á.B*Â%B*c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r  ê  s   € ÷ 	%ñ 	% $ñ 	%r   c               “  óN  <"  € S! 4       G Rj  x€L
 ;p SJd‡   \        V \        4      '       d   V P                  R4      MRpV\        9   dA   \        P
                  ! S! V 4      4      pSP                  V4       VP                  S4       K‰  S! V 4      G Rj  x€L
  K›  R#  L’ L
5i)z_Dispatch controls in arrival order; bounded expensive read-only projections run alongside them.Nr?   )rA   rB   rC   Ú_WS_CONCURRENT_READ_METHODSr^   rz   r,   Úadd_done_callback)	r;   r  rA  r>  r4  rG  rS  rE  rR  s	      €€€€€€r   Ú_dispatch_loopÚ!handle_ws.<locals>._dispatch_loopê  sŽ   øé € á)›O×+Ð+ˆs°DÓ8Ü.8¸¼d×.CÒ.C˜Ÿ™ Ô*ÈˆJØÔ8Ô8Ü×*Ò*Ñ+DÀSÓ+IÓJ�Ø ×$Ñ$ TÔ*Ø×&Ñ&Ð'>Ô?ÙÙ Ó$×$Ò$ñ 9Ñ+ñ %ùs"   ƒB%ŽB!�B	B%ÂB#Â	B%Â#B%c               ó    € V ^8„  d   QhRRRR/# r.  r   )r   s   "r   r   r  õ  s   € ÷ 8ñ 8 #ð 8¨$ñ 8r   c              “  ó<  <"  € \        V 4      '       d   S! V 4      G R j  x€L
  R # \        V \        4      '       d9   V P                  R4      \        9   d   S! SP                  4       4      G R j  x€L
  S! SP                  V 4      4      G R j  x€L
  R #  Lu L' L
5i)Nr?   )rE   rA   rB   rC   rW  ÚacquireÚput)r;   r4  Ú_unless_dispatch_failedrQ  rF  s   &€€€€r   Ú_queue_requestÚ!handle_ws.<locals>._queue_requestõ  s~   øé € Ü  ×%Ò%Ù Ó$×$Ð$ÙÜ�cœ4× Ò  S§W¡W¨XÓ%6Ô:UÔ%Uñ *¨.×*@Ñ*@Ó*BÓC×CÐCÙ% g§k¡k°#Ó&6Ó7×7Ò7ñ %ñ
 DÙ7ùs4   ƒB B¡ABÁ0BÁ1BÂBÂBÂBÂBc               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r  ÿ  s   € ÷ Hñ H˜dñ Hr   c               “  ó  <"  € \         P                  ! 4       p V RJ;'       d    V P                  4       pS F$  pV'       g
   VS9  g   K  VP                  4        K&  	  \         P                  ! SRR/ G Rj  x€L
  R#  L5i)z«Reads that never started are dropped (their client is gone); started ones finish before the
authority closes, unless the connection itself was cancelled (server shutdown).NÚreturn_exceptionsT)r^   r8  Ú
cancellingrÀ   Úgather)rA  Úshutting_downÚreadrE  r=  s      €€r   Ú
_end_readsÚhandle_ws.<locals>._end_readsÿ  sf   øé € ô ×#Ò#Ó%ˆØ DÐ(×>Ð>¨T¯_©_Ó->ˆÛ$ˆDß ¨MÖ 9Ø—‘–ñ %ô �nŠnÐ.ÐGÀ$ÑG×GÔGùs   ƒABÁ-BÁ8A?Á9Bc               ó    € V ^8„  d   QhRRRR/# )r   Úawr   r   r   )r   s   "r   r   r  	  s   € ÷ ñ ¨#ð °#ñ r   c              “  óN  <"  € Sf   Q h\         P                  ! V 4      p \         P                  ! VSS0\         P                  R7      G Rj  x€L
  VP	                  4       '       d!   VP                  4       VP                  4        # \        h L@  TP                  4        i ; i5i)z{Await *aw*, or raise _SendFailed once a reply could not be sent (the dispatcher ended on one,
or the read lane failed one).NrK  )r^   rM  rN  rO  r9  r|   rÀ   r  )rl  rP  Ú
dispatcherr<  s   & €€r   r_  Ú*handle_ws.<locals>._unless_dispatch_failed	  sƒ   øé € ð Ò%Ð%Ð%Ü×$Ò$ RÓ(ˆð	Ü—,’,  j°+Ð>ÌG×LcÑLcÔd×dÐdØ�y‰y�{Š{Ø—{‘{“}ð �K‰K�Mô Ðñ eøð
 �K‰K�Müs4   ƒB%¡,B ÁBÁB Á(B Á7B%ÂB ÂB"Â"B%)r  Ú	connectedT)r!   zws accepted peer=%s)rI   rK   r'  r(  r?   Úeventrp   rq   zgateway.readyr¼   ÚskinÚchange_eventsÚ	heartbeatr   rý   Úready_send_failedz"ws ready frame send failed peer=%szws dispatcher failed peer=%sr&   )Úget_browser_control_brokerz/ws browser-controller disconnect failed peer=%sz$ws wake-word teardown failed peer=%sÚws_disconnect)Ú
end_reasonz$ws transport teardown failed peer=%sz ws close failed peer=%s error=%sz„ws closed peer=%s reason=%s messages=%d parse_errors=%d dispatch_crashes=%d send_failures=%d reaped_sessions=%d detached_sessions=%dzclient_disconnect(code=rÎ   z,reason=rÏ   Ú)Úreceive_failedzws receive failed peer=%sz3ws parse error peer=%s index=%d error=%s payload=%rzparse errorÚsend_failed_after_parse_errorz(ws parse-error reply send failed peer=%szgateway.pingr)  r|   ÚokÚsend_failed_after_heartbeatz,ws heartbeat reply send failed peer=%s id=%siD€ÿÿ)@rß   r^   ÚQueueÚ_WS_DISPATCH_QUEUE_MAXr   Ú	SemaphoreÚ_WS_CONCURRENT_READ_LIMITÚ_WS_WAITING_READ_LIMITrg   Úcreate_futureÚobjectÚacceptr3   r÷   r0   ÚinforH   r  r  r   Úresolve_skinrš   r   Ú_ensure_skin_watcherÚ_ensure_lease_watcherÚ_skin_home_forr
  Ú
profile_idrV   Úregister_live_transportr  râ   r8  re  rÀ   rÆ   rÇ   r  r^  rN  Ú	cancelledr2  rA   rÁ   Úunregister_live_transportÚgateway.browser_control_brokerrv  Údisconnect_ownerr/   Ú_release_wake_for_transportÚ_close_sessions_for_transportr1   rz   Úreceive_textÚ_WebSocketDisconnectrÞ   ÚstripÚjsonÚloadsÚJSONDecodeErrorr�   Ú_WS_LOG_PAYLOAD_PREVIEWrB   rC   )*rM   rK   r  rù   ÚmessagesÚparse_errorsrY  r`  ri  Úskin_payloadÚready_okrA  ÚfailureÚreaped_sessionsÚdetached_sessionsrv  r‡   Úrawrƒ   r;   r%  r>  r4  r*  rG  rS  r!  r_  r  r;  rE  r  r3  rn  rI   rQ  rF  r<  r   r=  rR  ré   s*   &$$$                 @@@@@@@@@@@@@@@@@@@@@r   Ú	handle_wsr¢  –  s�  ÿÿüé € ô
 % RÓ(¨$€O€Dˆ)ØÐØABÐB€HÐBˆ|ÐBÐ.°Ø'Ð÷ò õ]ô %Ÿ]š]Ô3IÔJ€GØ&*€JÜ*-«%ÐÜ'*£u€MÜ#×-Ò-Ô.GÓHÐä×&Ò&Ô'@ÔCYÕ'YÓZ€Nô #*×":Ò":Ó"<×"JÑ"JÓ"L€KÜ‹8€D÷fõ f÷*
ó 
÷ò ÷ò ÷	%õ 	%÷8ó 8÷Hñ H÷ñ ð
ß5@ˆr�y‰y [ˆyÔ1ÀbÇiÁiÃk×RÐRØ'Ðä'¨dÕ3Ü�rÔÜ�	‰	Ð'¨Ô.Ü ¤G×$<Ò$<Ó$>ÀTÐYfÔgˆ	Ü4°R¸ÀMÓ\Ðä$×.Ò.¬v×/BÑ/BÓC×Cˆð #×.Ñ.Ø�u˜h¨Ø�v˜°	Ø˜ o°t¸[È$ÐP^Ô`lÓ`nð<à2FÒ2RÐ'¨Ñ.ÐXZð<ð ð0
ó ÷ ˆ÷ ô ×'Ò'Ô)Ü×(Ò(Ô*Ø#Ò/ä&,×&;Ò&;Ð<P×<VÑ<V×<aÑ<aÓ&b�	Ô#Ü×*Ò*¨9Ô5ô 	 Ô!ßˆxØ 3ÐØ˜QÕˆMÜ�J‰JÐ;¸TÔBØðJ Ó!ô ×'Ò'Ó)ˆDØÒ D§O¡O×$5Ò$5Ø×!Ñ!Õ#ä×(Ò(¬×5Õ5Ù1°'·+±+¸dÓ2CÓD×DÐD÷ 6ä—,’, 
˜|Ó,×,Ð,Ø(×2Ñ2×4Ò4‘d¸*×:NÑ:NÓ:PˆGØÒ"¬:°g¼{×+KÒ+KÜ—
‘
Ð9¸4È'�
ÔRÙ‹l×ÐØÒ+à&×,Ñ,Ó.×.Ð.Ø./Ð/ˆØÒ Ü×,Ò,¨YÔ7ðXÝUÜ×'Ò'Ñ(BÓ(D×(UÑ(UÐW`Óa×aÐað �O‰OÔðMÜ×'Ò'¬×(JÑ(JÈIÓV×VÐVðMÜ;B×;LÒ;LÜ×8Ñ8¸)ÐP_ô<÷ 6Ñ2�ð
	FØ—(‘(“*×Ðô 	�	‰	ð[àÐ# XÐ=MÈ}Ð^mö	
ôg ×(Ò(©Ó)9Ó:ˆ
ØðÙ3°B·O±OÓ4EÓF×F�Ü/Ô1ð —9‘9“;ˆDßÙØ˜�MˆHðÜ—j’j Ó&�ô ˜#œt×$Ò$¨¯©°Ó):¸nÔ)LØŸ™ ›�Ù˜i¨°¸4À¸,ÈÈfÐUÐWtØKÈTÐSYó[÷ [ð [áÙ  Ó%×%Ò%òM 	Sò DòòL E÷ 6×5Ð5úâ,ò 	ò /ò bøÜô XÜ—‘ÐPÐRV×WðXúò WøÜô MÜ—‘ÐEÀt×LðMúò6øô ô MÜ—‘ÐEÀt×LðMúò øÜô 	FÜ�J‰JÐ9¸4À×EÒEûð	Fúò] Gøäô ØÜ'ô Ø&=¼gÀcÈ6ÐSWÓ>XÐ=YÐYaÔbiÐjmÐowÐy}Ób~Ðað  @Að  %BÐ!ÜûÜô Ø$4Ð!Ü—‘Ð:¸DÔAÙðûô ×'Ñ'ô Ø Õ!�Ü—‘ÐRÐTXÐZbÐdgÐimð  oGô  pGð  jHô  IÙ™V F¨M¸4Ó@ÐBaØGÈóO÷ Oñ Oæûðúò[ò &øÜô Ùðúð Ó!ô ×'Ò'Ó)ˆDØÒ D§O¡O×$5Ò$5Ø×!Ñ!Õ#ä×(Ò(¬×5Õ5Ù1°'·+±+¸dÓ2CÓD×DÑD÷ 6×5×5Ð5úä—,’, 
˜|Ó,×,Ñ,Ø(×2Ñ2×4Ò4‘d¸*×:NÑ:NÓ:PˆGØÒ"¬:°g¼{×+KÒ+KÜ—
‘
Ð9¸4È'�
ÔRÙ‹l×ÑØÒ+à&×,Ñ,Ó.×.Ñ.Ø./Ð/ˆØÓ Ü×,Ò,¨YÔ7ðXÝUÜ×'Ò'Ñ(BÓ(D×(UÑ(UÐW`Óa×aÒaøÜô XÜ—‘ÐPÐRVÖWðXúà�O‰OÔðMÜ×'Ò'¬×(JÑ(JÈIÓV×VÒVøÜô MÜ—‘ÐEÀtÖLðMúðMÜ;B×;LÒ;LÜ×8Ñ8¸)ÐP_ô<÷ 6ð 6Ñ2�Ð!2øô ô MÜ—‘ÐEÀtÖLðMúð	FØ—(‘(“*×ÒøÜô 	FÜ�J‰JÐ9¸4À×EÑEûð	Fúä�	‰	ð[àÐ# XÐ=MÈ}Ð^mö	
øða Ó!ô ×'Ò'Ó)ˆDØÒ D§O¡O×$5Ò$5Ø×!Ñ!Õ#ä×(Ò(¬×5Õ5Ù1°'·+±+¸dÓ2CÓD×DÑD÷ 6×5×5Ð5úä—,’, 
˜|Ó,×,Ñ,Ø(×2Ñ2×4Ò4‘d¸*×:NÑ:NÓ:PˆGØÒ"¬:°g¼{×+KÒ+KÜ—
‘
Ð9¸4È'�
ÔRÙ‹l×ÑØÒ+à&×,Ñ,Ó.×.Ñ.Ø./Ð/ˆØÓ Ü×,Ò,¨YÔ7ðXÝUÜ×'Ò'Ñ(BÓ(D×(UÑ(UÐW`Óa×aÒaøÜô XÜ—‘ÐPÐRVÖWðXúà�O‰OÔðMÜ×'Ò'¬×(JÑ(JÈIÓV×VÒVøÜô MÜ—‘ÐEÀtÖLðMúðMÜ;B×;LÒ;LÜ×8Ñ8¸)ÐP_ô<÷ 6ð 6Ñ2�Ð!2øô ô MÜ—‘ÐEÀtÖLðMúð	FØ—(‘(“*×ÒøÜô 	FÜ�J‰JÐ9¸4À×EÑEûð	Fúä�	‰	ð[àÐ# XÐ=MÈ}Ð^mõ	
üs¤  —D'v(Ä?-^4 Å,W?Å-B	^4 Ç6XÇ7<^4 È3XÈ4^4 É B'^4 Ë(3v(Ì3v(ÍXÍ*XÍ+XÍ/"v(ÎXÎv(Î,Av(Ï:X"Ï;v(ÐX%Ð!v(Ð9/X+ Ñ(X(Ñ)X+ Ñ-v(Ñ>(Y Ò&YÒ'Y Ò,*Z ÓY>ÓZ ÓZ, Ó1Z)Ó2Z, Ó6v(Ô^4 Ô0[ Õ	[Õ
[ Õ^4 Õ0^4 Õ<] ÖA^4 ×&^.×'^4 ×8^1×9^4 Ø^4 Ø^4 ØXØX	Ø
v(Ø"v(Ø%v(Ø(X+ Ø+!YÙv(ÙYÙv(ÙY Ù!Y;Ù7v(Ù:Y;Ù;v(Ù>Z Ú!Z&Ú"v(Ú%Z&Ú&v(Ú)Z, Ú,[Ú7[Ûv(Û[Ûv(Û[ Û]Û4]Û5\Ü^4 Üj5 Ü]Ü&]Ü?^4 Ý j5 Ý]Ý^4 Ý^+Ý?^&Þ^Þ^&Þ^4 Þ&^+Þ+^4 Þ1^4 Þ4_Þ?j5 ß_ßj5 ß3v(ß93v(à,aáa
áaá	v(áa&	á!"v(âbâv(âAv(ã-c0ã.v(ä
dä#v(ä//e% åe!åe% å$v(å%!f	æv(æf	æ	v(æ(g çgçg çv(ç!g0ç-v(ç/g0ç0v(ç4*h' èh!èh' è&v(è'!iév(é
iév(éi) é"i%é#i) é(v(é)jé4jêv(êjê v(ê54v%ë*3v%ìm	ì8l;ì9m	ì>	v%ímí"v%í4m7í5v%îAv%ïo!ïv%ï;o>ï<#v%ð /qñqñqñv%ñ!q:ñ7v%ñ9q:ñ:v%ò(r=ò6r9ò7r=ò<v%ò=!s!óv%ó s!ó!v%ó%*tôtôtôv%ô!t<ô9v%ô;t<ô<v%õ uõuõuõv%õvõ%võ<v%övöv%ö%v(>   úmessage.deltaúthinking.deltaúreasoning.delta)EÚ__conditional_annotations__rÕ   Ú
__future__r   r^   rÆ   Úconcurrent.futuresr~   r–  Úloggingrê   rX   r(   Útypingr   r   Útui_gatewayr   Úagent.message_sanitizationr   Útui_gateway.event_replayr   Útui_gateway.transportr	   Útui_gateway.ws_legacy_fallbackr
   r   Ú	getLoggerr‚   r0   r+   r*   rY   r   r   ÚThreadPoolExecutorr-   r   r   Ú__annotations__r    r3   r8   r}   r¸   r™  r  Ú	frozensetrW  r�  r‚  rD   rE   ru   rŽ   Ústarlette.websocketsrF   r”  ÚImportErrorr/   rH   rß   rä   r÷   r  r  r  r  r¢  )r¦  s   @r   Ú<module>r¶     s™  øðô`õ
 #ã Û Û Û Û Û Û Û ß  å Ý ;Ý 1Ý 1ß Sà×Ò˜Ó"€ð
 *-Ð &Ø"Ð Ø(Ÿ~š~Ó/Ð ð  *×1Ñ1×DÑDØÐ&>ð  Eó  @Ð á'*£uÐ  Ó ,õ+ðM°U÷ Mõ.	8ð Ð ð Ð ØÐ ð
 Ð ñ
 (Ð)DÐ(EÓFÐ ØÐ àÐ ñ  Ð/Ó0Ð õiñ #Ò#YÓZÐ ØÐ ð%ÝP÷
z]ñ z]õz:õCõ
3õ,]õõ(;ô\�)ô \ð
¸Tð 
Ð]að 
Ø%*÷
ñ 
øðm ô %Ø$Òð%ús   Ã,D; Ä;	EÅE