+
    jHàj®  ã                  ó  a € 0 t $ R t^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIH	t	 ^ RI
Ht ^ RIHtHt RtRt]	 ! R R	4      4       t ! R
 R4      t]P&                  ! 4       tR]R&   ]P,                  ! 4       tR R ltR R lt ! R R4      tR# )z=Recoverable per-path SessionDB handle caches for the gateway.)ÚannotationsN)Ú	dataclass)ÚPath)ÚAnyÚCallableg      ð?g      N@c                  óP   € ] tR t^t$ ^ tR]R&   RtR]R&   RtR]R&   R	tR
]R&   Rt	R# )Ú_UnavailableÚintÚfailuresç        ÚfloatÚnext_retry_atFÚboolÚ	in_flightÚ ÚstrÚerror© N)
Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r
   Ú__annotations__r   r   r   Ú__static_attributes__r   ó    Ú@/home/ubuntu/.hermes/hermes-agent/gateway/session_db_recovery.pyr   r      s)   ‡ à€HˆcÓØ€M�5ÓØ€IˆtÓØ€Eˆ3‡Or   r   c                  ó   € ] tR t^tRtRtR# )Ú_HealthSourcez5Weak-keyable identity for one cache's health entries.r   N)r   r   r   r   Ú__doc__r   r   r   r   r   r      s   † Ý?r   r   z9weakref.WeakKeyDictionary[_HealthSource, dict[Path, str]]Ú_health_statesc               ó(   € V ^8„  d   QhRRRRRRRR/# )	é   Úsourcer   Úpathr   Ústater   ÚreturnÚNoner   )Úformats   "r   Ú__annotate__r(   "   s(   € ÷ 
ñ 
˜Mð 
°ð 
¸cð 
Àdñ 
r   c                ó„  a€ \         ;_uu_ 4        V\        P                  V / 4      V&   \        P                  4        UUu0 uF  q3P                  4        F  qDkK  	  K  	  uppo\	        V3R lR 4       R4      pRRR4        ^ RIHp V! RX/R7       R# u uppi   + '       g   i     L*; i  \         d     R# i ; i)zPPublish one privacy-safe aggregate (no paths, no errors) across all live caches.c              3  ó8   <"  € T F  qS9   g   K  Vx € K  	  R # 5i©Nr   )Ú.0ÚsÚ
all_statess   & €r   Ú	<genexpr>Ú"_publish_health.<locals>.<genexpr>'   s   øé € ÐTÑ%@ ÈÁOŸ!š!Ó%@ùs   ƒ�
ÚokN)Úpublish_runtime_statusÚstatus)Úsession_store)ÚretryingÚunavailable)Ú_health_lockr   Ú
setdefaultÚvaluesÚnextÚgateway.statusr2   Ú	Exception)r"   r#   r$   ÚitemÚvalueÚ	aggregater2   r.   s   &&&    @r   Ú_publish_healthr@   "   s™   ø€ ç	ŽØ6;Œ×!Ñ! &¨"Ó-¨dÑ3Ü(6×(=Ñ(=Ô(?Ô[Ñ(? Ï[É[Î]ÀE’eÉ]‘eÑ(?Ò[ˆ
ÜÔTÑ%@ÓTÐVZÓ[ˆ	÷ 
ðÝ9Ù¨h¸	Ð-B×Cùó	 \÷ 
�ûô ô Úðús/   �1BÁ B
Á!BÂB0 ÂBÂB-	Â0B?Â>B?c               ó    € V ^8„  d   QhRRRR/# )r!   Úhandler   r%   r   r   )r'   s   "r   r(   r(   /   s   € ÷ Bñ B˜Cð B Dñ Br   c                ó:   € \        V RV 4      p\        VRR4      RJ # )zëTrue while the process-wide registry owns *handle*; an ``AsyncSessionDB`` (the only handle
type with a ``_db``) is judged by the SessionDB it wraps. ``close_all`` / ``close_all_under``
clear the flag when they tear the generation down.Ú_dbÚ_shared_registry_ownedNT)Úgetattr)rB   Úinners   & r   Ú_registry_ownedrH   /   s'   € ô �F˜E 6Ó*€EÜ�5Ð2°DÓ9¸TÐAÐAr   c            
      ó’   € ] tR t^7tRtRRRRR]P                  R]R]/R R	 llt	R
 R lt
RRRRRR/R R lltR R ltR R ltRtR# )ÚRecoverableHandleCachezüCache handles by path while allowing failed opens to heal in-process.

Opens run OUTSIDE ``lock`` (single-flight per path via ``in_flight``); ``close_all`` bumps
``_generation`` so a later-completing open is rejected instead of resurrecting the cache.
ÚhandlesNÚlockÚclockÚinitial_retry_delayÚmax_retry_delayc               ó0   € V ^8„  d   QhRRRRRRRRR	RR
R/# )r!   rK   zdict[Path, Any] | NonerL   zthreading.Lock | NonerM   zCallable[[], float]rN   r   rO   r%   r&   r   )r'   s   "r   r(   Ú#RecoverableHandleCache.__annotate__>   sJ   € ÷ Bñ BØ0ðBØ?TðBà"ðBð #ðBð ð	Bð
 
ñBr   c               	óN  € Ve   TM/ V n         Ve   TM\        P                  ! 4       V n        W0n        \        R\        V4      4      V n        \        V P                  \        V4      4      V n        / V n	        \        4       V n        \        4       V n        ^ V n        R V n        R # )Nr   )rK   Ú	threadingÚLockrL   Ú_clockÚmaxr   Ú_initial_retry_delayÚ_max_retry_delayÚ_unavailableÚsetÚ_registry_backedr   Ú_health_sourceÚ_generationÚ_close_rejected)ÚselfrK   rL   rM   rN   rO   s   &$$$$$r   Ú__init__ÚRecoverableHandleCache.__init__>   s‰   € ð #*Ò"5‘w¸2ˆŒØ Ò,‘D´)·.².Ó2BˆŒ	ØŒÜ$'¨¬UÐ3FÓ-GÓ$HˆÔ!Ü # D×$=Ñ$=¼uÀ_Ó?UÓ VˆÔØ68ˆÔô ,/«5ˆÔÜ+›oˆÔØˆÔØ=AˆÖr   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r!   r#   r   r6   r   Ú
generationr	   r%   r   r   )r'   s   "r   r(   rQ   Q   s/   € ÷ `ñ `˜dð `°ð `È3ð `ÐSWñ `r   c                óh   € W0P                   8g  ;'       g    V P                  P                  V4      VJ# )zQCaller holds ``lock``: True when close_all ran or the slot was replaced mid-open.)r]   rY   Úget)r_   r#   r6   rc   s   &&&&r   Ú	_is_staleÚ RecoverableHandleCache._is_staleQ   s0   € à×-Ñ-Ñ-×_Ð_°×1BÑ1B×1FÑ1FÀtÓ1LÐT_Ð1_Ð_r   Úraise_on_errorFÚon_recoveredÚnon_cacheablec               ó0   € V ^8„  d   QhRRRRRRRRR	R
RR/# )r!   r#   r   ÚopenerzCallable[[], Any]rh   r   ri   zCallable[[], None] | Nonerj   z"Callable[[Exception], bool] | Noner%   r   r   )r'   s   "r   r(   rQ   U   sH   € ÷ Dñ DØðDØ"3ðDØHLðDà/ðDð :ðDð 
ñ	Dr   c          	     óN  € \        V4      pV P                  ;_uu_ 4        WP                  9   di   V P                  V,          pWP                  9  g   \	        V4      '       d   VuuRRR4       # V P                  V V P                  P                  V4       V P                  P                  V\        4       4      pVP                  '       g    V P                  4       VP                  8  d    RRR4       R# RVn	        VP                  ^ 8„  pV P                  p	RRR4       X'       d   \        V P                  VR4        V! 4       pT P                  ;_uu_ 4        T P#                  TXX	4      pT'       gs   Y`P                  T&   \	        T4      '       d   T P                  P3                  T4       MT P                  P                  T4       T P                  P%                  TR4       T'       d   T P4                  MRpRRR4       X'       d<   Xe6   \6        P8                  ! \         4      ;_uu_ 4        T! T4       RRR4       R# R# \        T P                  TR4       T'       d   Te   T! 4        T#   + '       g   i     ELg; i  \          Edd   p
TRJ;'       d	    T! T
4      pT P                  ;_uu_ 4        T P#                  TXX	4      pT'       d&   T'       g   T P                  P%                  TR4       h T'       g¤   T;P                  ^,          un        \'        T
4      P(                   RT
 2Tn        T P,                  ^\/        TP                  ^,
          ^4      ,          ,          pT P                  4       \/        YÐP0                  4      ,           Tn        RTn	        RRR4       M  + '       g   i     M; iX'       g   \        T P                  TR4       T'       d   h  Rp
?
R# Rp
?
ii ; i  + '       g   i     EL; i  + '       g   i     R# ; i)züReturn a cached handle or make one bounded, single-flight open attempt; None while
a retry is in flight or backing off.  ``non_cacheable`` exceptions (e.g. a live-system
guard) are re-raised without recording a failure so the next call retries at once.NTr5   z: Fr6   r1   )r   rL   rK   r[   rH   ÚdiscardrY   r8   r   r   rU   r   r
   r]   r@   r\   r<   rf   ÚpopÚtyper   r   rW   ÚminrX   Úaddr^   Ú
contextlibÚsuppress)r_   r#   rl   rh   ri   rj   rB   r6   Úwas_unavailablerc   ÚexcÚuncacheableÚstaleÚbackoffÚclose_rejecteds   &&&$$$         r   re   ÚRecoverableHandleCache.getU   s	  € ô �D‹zˆØ�Y�Y‹YØ—|‘|Ô#ØŸ™ dÕ+�Ø×4Ñ4Ô4¼È×8OÒ8OØ!÷	 ŠYð —L‘L Ð&Ø×%Ñ%×-Ñ-¨dÔ3Ø×+Ñ+×6Ñ6°t¼\»^ÓLˆKØ×$×$Ð$¨¯©«¸×8QÑ8QÔ(QØ÷ ‰Yð %)ˆKÔ!Ø)×2Ñ2°QÑ6ˆOØ×)Ñ)ˆJ÷ ÷  Ü˜D×/Ñ/°°zÔBð	Ù“XˆFð* �Y�Y‹YØ—N‘N 4¨°jÓAˆEßØ%+—‘˜TÑ"Ü" 6×*Ò*Ø×)Ñ)×-Ñ-¨dÕ3à×)Ñ)×1Ñ1°$Ô7Ø×!Ñ!×%Ñ% d¨DÔ1ß5:˜T×1Ò1ÀˆN÷ ÷ ØÒ)Ü×(Ò(¬×3Õ3Ù" 6Ô*÷ 4ãÜ˜×+Ñ+¨T°4Ô8ß˜|Ò7ÙŒNØˆ÷w �YˆYûô* õ 	Ø'¨tÐ3×JÐJ¹ÀcÓ8JˆKØ——“ØŸ™ t¨[¸*ÓE�ßß Ø×)Ñ)×-Ñ-¨d°DÔ9ØßØ×(Ò(¨AÕ-Õ(Ü+/°«9×+=Ñ+=Ð*>¸bÀÀÐ(F�KÔ%Ø"×7Ñ7¸1ÄÀK×DXÑDXÐ[\ÕD\Ð^`Ó@aÕ;aÕb�GØ04·±³ÄÀG×MbÑMbÓ@cÕ0c�KÔ-Ø,1�KÔ)÷ ——�ú÷ Ü × 3Ñ 3°T¸=ÔIßØÝûð%	ú÷( �YˆYú÷ 4Ö3áús�    AI9Á1A>I9Ã9"I9ÅJ ÅBO?Ç4O?È8	PÉ9J
	ÊO<Ê(O7Ë#N6Ë%$N6Ì
B#N6Î-	O7Î6OÏO7ÏO7Ï0O7Ï7O<Ï?P	ÐP$	c               ó    € V ^8„  d   QhRRRR/# )r!   r#   r   r%   r   r   )r'   s   "r   r(   rQ   ›   s   € ÷ jñ j˜tð j¨ñ jr   c                óø   a€ \        V4      P                  4       oV P                  ;_uu_ 4        \        V3R lV P                  P                  4        4       R4      uuRRR4       #   + '       g   i     R# ; i)zUThe exception the latest failed open of *path* raised (``''`` when none is recorded).c              3  ón   <"  € T F*  w  rVP                  4       S8X  g   K  VP                  x € K,  	  R # 5ir+   )Úresolver   )r,   ÚkeyÚuÚtargets   &  €r   r/   Ú4RecoverableHandleCache.last_error.<locals>.<genexpr>Ÿ   s)   øé € ÐdÑ/H¡V SÈCÏKÉKËMÐ]cÑLcœ˜ŸžÓ/Hùs   ƒ5¡5r   N)r   r   rL   r:   rY   Úitems)r_   r#   r‚   s   &&@r   Ú
last_errorÚ!RecoverableHandleCache.last_error›   sJ   ø€ ä�d“×#Ñ#Ó%ˆØ�Y�Y‹YÜÔd¨t×/@Ñ/@×/FÑ/FÔ/HÓdÐfhÓi÷ �Y�Y‹Yús   ¯.A(Á(A9	c               ó    € V ^8„  d   QhRRRR/# )r!   ÚclosezCallable[[Any], None]r%   r&   r   )r'   s   "r   r(   rQ   ¡   s   € ÷ 'ñ 'Ð4ð '¸ñ 'r   c                óP  € V P                   ;_uu_ 4        V ;P                  ^,          un        Wn        \        V P                  P                  4       4      p\        V P                  4      \        V P                  4      ,          pV P                  P                  4        V P                  P                  4        V P                  P                  4        RRR4       X F6  p\        P                  ! \        4      ;_uu_ 4        V! V4       RRR4       K8  	  \        ;_uu_ 4        \        P                  V P                   / 4      pX F  pVP#                  VR4       K  	  RRR4       R#   + '       g   i     L ; i  + '       g   i     K²  ; i  + '       g   i     R# ; i)z>Drain cached handles under the lock and close them outside it.N)rL   r]   r^   ÚlistrK   r9   rZ   rY   Úclearr[   rs   rt   r<   r7   r   re   r\   ro   )r_   rˆ   rK   ÚpathsrB   Ústatesr#   s   &&     r   Ú	close_allÚ RecoverableHandleCache.close_all¡   s  € à�Y�Y‹YØ×Ò Õ!ÕØ#(Ô Ü˜4Ÿ<™<×.Ñ.Ó0Ó1ˆGÜ˜Ÿ™Ó%¬¨D×,=Ñ,=Ó(>Õ>ˆEØ�L‰L×ÑÔ Ø×!Ñ!×'Ñ'Ô)Ø×Ñ×#Ñ#Ô%÷ ó ˆFÜ×$Ò$¤Y×/Õ/Ù�f”÷ 0Ñ/ñ ÷ Ž\Ü#×'Ñ'¨×(;Ñ(;¸RÓ@ˆFÛ�Ø—
‘
˜4 Ö&ñ ÷ ‰\÷ �Yú÷ 0×/Ð/úç�\ˆ\ús$   •C E-Ä	F Ä'<FÅ-E=	Æ FÆF%	)
rU   r^   r]   r\   rW   rX   r[   rY   rK   rL   )r   r   r   r   r   ÚtimeÚ	monotonicÚ_INITIAL_RETRY_DELAY_SECONDSÚ_MAX_RETRY_DELAY_SECONDSr`   rf   re   r…   rŽ   r   r   r   r   rJ   rJ   7   s~   † ñðBØ37ðBØW[ðBà%)§^¡^ðBð &BðBð ":÷	Bõ&`ðDØOTðDà26ðDð =A÷DõLj÷'ñ 'r   rJ   )Ú__conditional_annotations__r   Ú
__future__r   rs   rS   r�   ÚweakrefÚdataclassesr   Úpathlibr   Útypingr   r   r’   r“   r   r   rT   r7   r   ÚWeakKeyDictionaryr   r@   rH   rJ   )r”   s   @r   Ú<module>r›      s‹   øðÜ Cå "ã Û Û Û Ý !Ý ß  à"Ð ØÐ ð ÷ð ó ð÷@ñ @ð �~Š~Ó€ØIÓ IØ×*Ò*Ó,€õ
õB÷z'ó z'r   