+
    „WÝ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HtHt ^ RIHt ^ RIHt ^ RIHtHtHt ^ RIHtHtHt ^ RIHt ]P8                  ! ]4      t ! R	 R
]4      t RoR R llt!R R lt"R R lt#R R lt$RpR R llt%Rt&Rt'Rt(Rt) ! R R]*4      t+R R lt,R R lt-R R  lt.R! R" lt/RpR# R$ llt0RpR% R& llt1RpR' R( llt2RqR) R* llt3R+ R, lt4 ! R- R.4      t5R/R0/R1 R2 llt6R3 R4 lt7R5 R6 lt8R7 R8 lt9R9 R: lt:R; R< lt;R= R> lt<Rs=R?]>R@&   RA RB lt?RC RD lt@RpRER0/RF RG llltAR/R0RHRRIR/RJ RK lltB] ! RL RM4      4       tCRN RO ltDRP RQ ltERR RS ltFRHRRIR/RT RU lltGRVRRWR0/RX RY lltHRVRRZRRWR0/R[ R\ lltIR] R^ ltJRVR/R_ R` lltKRatLRb Rc ltMRd Re ltNRf Rg ltORpR/R0/Rh Ri llltP]RZRRjR/Rk Rl ll4       tQ]RjR/Rm Rn ll4       tRR# )rzßCross-process active chat session leases.

The session database records persisted conversations; this module records
currently open chat surfaces, including idle CLI/TUI sessions that have not
written a transcript row yet.
)ÚannotationsN)ÚcontextmanagerÚsuppress)Ú	dataclass)ÚPath)ÚAnyÚIteratorÚOptional)Úget_default_hermes_rootÚget_hermes_homeÚnamed_profile_is_live©Úatomic_json_writec                  ó   € ] tR t^tRtRtR# )ÚActiveSessionRegistryErrorz@The liveness registry could not prove a safe ownership decision.© N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__static_attributes__r   ó    ÚNC:\Users\johnn\AppData\Local\hermes\hermes-agent\hermes_cli\active_sessions.pyr   r      s   † ÝJr   r   c               ó$   € V ^8„  d   QhRRRRRR/# )é   Úvaluer   ÚkeyÚstrÚreturnúOptional[int]r   )Úformats   "r   Ú__annotate__r"       s"   € ÷ *ñ *¨#ð *°Cð *ÐXeñ *r   c                ó’  € V f   R#  \        V \        4      '       g-   \        V \        4      '       d"   V P                  4       '       g   \	        V 4      h\        V \
        4      '       d   \        V P                  4       ^
4      M
\        V 4      pT^ 8”  d   T# R#   \        \        3 d    \        P                  RY4        R# i ; i)z=Return a positive integer cap, or None when disabled/invalid.NzEIgnoring invalid %s=%r (expected a positive integer; 0/null disables))Ú
isinstanceÚboolÚfloatÚ
is_integerÚ
ValueErrorr   ÚintÚstripÚ	TypeErrorÚloggerÚwarning)r   r   Úparseds   && r   Úcoerce_max_concurrent_sessionsr/       s¥   € à‚}ÙðÜ�eœT×"Ò"¤z°%¼×'?Ò'?È×HXÑHX×HZÒHZÜ˜UÓ#Ð#Ü+5°e¼S×+AÒ+A”�U—[‘[“] BÔ'ÄsÈ5Ãzˆð ˜a”Zˆ6Ð) TÐ)øô ”zÐ"ô Ü�‰ØSÐUXô	
ò ð	ús   ˆAB Á
AB Â'CÃCc               ó    € V ^8„  d   QhRRRR/# )r   Úconfigr   r   r    r   )r!   s   "r   r"   r"   0   s   € ÷ 8ñ 8¨Cð 8°Mñ 8r   c                ó  € RpRp\        V \        4      '       dU   RV 9   d   V P                  R4      pMHV P                  R4      p\        V\        4      '       d   VP                  R4      pRpM\        V RR4      p\	        WR7      # )zBResolve top-level max_concurrent_sessions with gateway.* fallback.NÚmax_concurrent_sessionsÚgatewayzgateway.max_concurrent_sessions©r   )r$   ÚdictÚgetÚgetattrr/   )r1   Úrawr   Úgateway_cfgs   &   r   Úresolve_max_concurrent_sessionsr;   0   sz   € à€CØ
#€CÜ�&œ$×ÒØ$¨Ô.Ø—*‘*Ð6Ó7‰Cà Ÿ*™* YÓ/ˆKÜ˜+¤t×,Ò,Ø!—o‘oÐ&?Ó@�Ø7�øä�fÐ7¸Ó>ˆÜ)¨#Ô7Ð7r   c               ó    € V ^8„  d   QhRRRR/# )r   Úsecondsr&   r   r   r   )r!   s   "r   r"   r"   A   s   € ÷ Añ A˜ð A #ñ Ar   c                ó˜   € \        ^ \        V ^<,          4      4      pV^<8  d   V R2# \        V^<4      w  r!V'       g   V R2# V RV R2# )é    ÚmÚh)Úmaxr)   Údivmod)r=   ÚminutesÚhourss   &  r   Ú
format_agerF   A   sX   € Ü�!”S˜ B�Ó'Ó(€GØ�„|Ø�˜!ˆ}ÐÜ˜G RÓ(�N€Eß%ˆeˆW�Aˆ;Ð@¨e¨W°A°g°Y¸aÐ+@Ð@r   c               ó    € V ^8„  d   QhRRRR/# )r   Úentriesúlist[dict[str, Any]]r   r   r   )r!   s   "r   r"   r"   I   s   € ÷ ñ Ð3ð ¸ñ r   c                ó†  € V '       g   R# \         P                  ! R V  4       4      pRP                  R \        VP	                  4       R R7       4       4      pR V  4        Uu. uF  q3'       g   K  VNK  	  ppV'       d:   VR\        \        P                  ! 4       \        V4      ,
          4       R	2,          pV# u upi )
zDCompact "who is holding the slots" phrase, e.g. ``desktop x4, cli``.Ú c              3  ój   "  € T F)  p\        VP                  R 4      ;'       g    R4      x € K+  	  R# 5i)ÚsurfaceÚunknownN©r   r7   ©Ú.0Úes   & r   Ú	<genexpr>Ú$summarize_holders.<locals>.<genexpr>M   s)   é € Ð UÉWÈ¤ Q§U¡U¨9Ó%5×%BÐ%B¸×!CÐ!CËWùs   ‚!3¤3z, c              3  óF   "  € T F  w  rV^8”  d   V RV 2MTx € K  	  R# 5i)é   z xNr   )rQ   rM   Úns   &  r   rS   rT   N   s/   é € ð áP‰JˆGð  œUˆ7ˆ)�2�a�SÑ¨Ô/ÛPùs   ‚!c                ó(   € V ^,          ) V ^ ,          3# )rV   r   )Úkvs   &r   Ú<lambda>Ú#summarize_holders.<locals>.<lambda>P   s   € À"ÀQÅ%ÀÈÈAÍÁr   r5   c              3  óV   "  € T F  p\        VP                  R 4      4      x € K!  	  R# 5i)Ú
started_atN)Ú_optional_floatr7   rP   s   & r   rS   rT   R   s!   é € ÐQÉÀAœ?¨1¯5©5°Ó+>×?Ð?Ëùs   ‚')z	, oldest ú ago)ÚcollectionsÚCounterÚjoinÚsortedÚitemsrF   ÚtimeÚmin)rH   ÚcountsÚheldÚtÚstarteds   &    r   Úsummarize_holdersrk   I   s    € çÙÜ× Ò Ñ UÉWÓ UÓU€FØ�9‰9ñ ä  §¡£Ñ5OÕPóó €Dñ RÉÔQÓWÑQ�QÓUV�qˆqÑQ€GÐWßØ�)œJ¤t§y¢y£{´S¸³\Õ'AÓBÐCÀ4ÐHÕHˆØ€Kùò Xs   Á%	B>Á3B>c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   Úactive_countr)   Úmax_sessionsrH   zOptional[list[dict[str, Any]]]r   r   r   )r!   s   "r   r"   r"   X   s,   € ÷ 
ñ 
Øð
Ø%(ð
Ø3Qð
àñ
r   c                ód   € \        T;'       g    . 4      pV'       d   R V R2MRpRV  RV RV R2# )z
 Held by: Ú.rK   z'Hermes is at the active session limit (Ú/z).z) Try again when another session finishes.)rk   )rm   rn   rH   rh   Údetails   &&&  r   Úactive_session_limit_messagers   X   sG   € ô
 ˜WŸ]˜]¨Ó+€Dß%)ˆz˜$˜˜qÑ!¨r€Fà
1°,°¸qÀÀÈbØˆ(Ð;ð	=ðr   ÚSESSION_NOT_OWNEDÚMAX_CONCURRENT_SESSIONSÚ SESSION_COORDINATION_UNAVAILABLETc                  ó>   a € ] tR t^xt$ RtR]R&   R V 3R lltRtV ;t# )ÚActiveSessionRefusalzYRefusal message (a ``str``, so callers are untouched) with a machine-readable ``reason``.r   Úreasonc               ó$   € V ^8„  d   QhRRRRRR/# )r   Úmessager   ry   r   rx   r   )r!   s   "r   r"   Ú!ActiveSessionRefusal.__annotate__}   s"   € ÷ ñ ˜cð ¨3ð Ð3Gñ r   c                	ó2   <€ \         SV `  W4      pW#n        V# ©N)ÚsuperÚ__new__ry   )Úclsr{   ry   ÚobjÚ	__class__s   &&& €r   r€   ÚActiveSessionRefusal.__new__}   s   ø€ Ü‰g‰o˜cÓ+ˆØŒ
Øˆ
r   r   )	r   r   r   r   r   Ú__annotations__r€   r   Ú__classcell__)rƒ   s   @r   rx   rx   x   s   ø‡ ÙcàƒK÷ö r   rx   c               ó    € V ^8„  d   QhRRRR/# )r   r{   r   r   r   )r!   s   "r   r"   r"   ƒ   s   € ÷ Uñ U 3ð U¨3ñ Ur   c                óR   € \        V RR4      pV'       d	   RV RV  2# \        V 4      # )zFKeep the refusal contract across the one-shot CLI subprocess boundary.ry   rK   zhermes-refusal-reason: Ú
)r8   r   )r{   ry   s   & r   Úformat_refusal_stderrrŠ   ƒ   s/   € ä�W˜h¨Ó+€Fß<BÐ$ V H¨B¨w¨iÐ8ÐTÌÈGËÐTr   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úentryúdict[str, Any]ÚmetadataúOptional[dict[str, Any]]r   r%   r   )r!   s   "r   r"   r"   ‰   s(   € ÷ Tñ T˜>ð TÐ5Mð TÐRVñ Tr   c                óÊ  €  \        V P                  R4      ;'       g    R4      \        P                  ! 4       8w  d   R#  \        T P                  R4      ;'       g    / P                  R4      ;'       g    R4      p\        T;'       g    / P                  R4      ;'       g    R4      p\        T;'       d    T4      ;'       d    Y#8H  #   \        \
        3 d     R# i ; i)zîTrue when an existing lease belongs to the very caller re-acquiring it.
Identity is (pid, live_session_id): pid alone lets two live sessions in one process
steal each other's lease; the live id alone lets another process with an equal id.ÚpidFrŽ   Úlive_session_idrK   éÿÿÿÿ)r)   r7   ÚosÚgetpidr+   r(   r   r%   )rŒ   rŽ   Úexisting_liveÚincoming_lives   &&  r   Ú_is_same_writerr˜   ‰   sÀ   € ðÜˆu�y‰y˜Ó×%Ð% 2Ó&¬"¯)ª)«+Ô5Ùð 6ô ˜Ÿ™ :Ó.×4Ð4°"×9Ñ9Ð:KÓL×RÐRÐPRÓS€MÜ˜Ÿ˜ R×,Ñ,Ð->Ó?×EÐEÀ2ÓF€MÜ�×/Ð/ -Ó0×SÐS°]Ñ5SÐSøô	 ”zÐ"ô Úðús   ‚C ŸC ÃC"Ã!C"c               ó$   € V ^8„  d   QhRRRRRR/# ©r   Ú
session_idr   rŒ   r�   r   r   )r!   s   "r   r"   r"   —   s&   € ÷ Fñ F cð F°.ð FÀSñ Fr   c                óú   € \        VP                  R4      ;'       g    R4      p\        VP                  R4      4      pV'       d*   R\        \        P                  ! 4       V,
          4       R2MRpRV  RV V R	2# )
z<The ``Details:`` line shared by every owner-refusal message.rM   zanother surfacer]   Ú r_   rK   zDetails: session z opened by rp   )r   r7   r^   rF   re   )r›   rŒ   rM   rj   Úages   &&   r   Úsession_owner_detailsrŸ   —   sm   € ä�%—)‘)˜IÓ&×;Ð;Ð*;Ó<€GÜ˜eŸi™i¨Ó5Ó6€Gß9@ˆAŒjœŸš› wÕ.Ó/Ð0°Ñ
5Àb€CØ˜z˜l¨+°g°Y¸s¸eÀ1ÐEÐEr   c               ó$   € V ^8„  d   QhRRRRRR/# rš   r   )r!   s   "r   r"   r"   Ÿ   s!   € ÷ 	ñ 	¨cð 	¸.ð 	ÈSñ 	r   c                ó&   € R\        W4      ,           # )zìRefusal text for a session another live process holds.

Contract shared with the TUI/Desktop surfaces: the FIRST line is the plain user sentence
(no lease/pid/owner jargon); the second line is ``Details: ...`` for logs and bug reports.
z]This chat is open in another Hermes window/terminal. Use it there, or start a new chat here.
)rŸ   )r›   rŒ   s   &&r   Úsession_already_owned_messager¢   Ÿ   s   € ð 	iÜ
 
Ó
2õ	3ðr   c               ó    € V ^8„  d   QhRRRR/# ©r   Úregistry_homeústr | Path | Noner   r   r   )r!   s   "r   r"   r"   «   s   € ÷ Yñ YÐ"3ð Y¸tñ Yr   c                óF   € V e   \        V 4      # \        \        4       4      # r~   )r   r   ©r¥   s   &r   Ú_registry_homer©   «   s   € Ø"/Ò";Œ4�ÓÐXÄÄoÓFWÓAXÐXr   c               ó    € V ^8„  d   QhRRRR/# r¤   r   )r!   s   "r   r"   r"   ¯   s   € ÷ Nñ NÐ0ð N¸Dñ Nr   c                ó4   € \        V 4      R ,          R,          # )Úruntimeúactive_sessions.json©r©   r¨   s   &r   Ú_state_pathr¯   ¯   ó   € Ü˜-Ó(¨9Õ4Ð7MÕMÐMr   c               ó    € V ^8„  d   QhRRRR/# r¤   r   )r!   s   "r   r"   r"   ³   s   € ÷ Nñ NÐ/ð N¸4ñ Nr   c                ó4   € \        V 4      R ,          R,          # )r¬   úactive_sessions.lockr®   r¨   s   &r   Ú
_lock_pathr´   ³   r°   r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   ÚleasezOptional[ActiveSessionLease]r¥   r¦   r   ztuple[Path, Path]r   )r!   s   "r   r"   r"   ·   s)   € ÷ `ñ `Ø'ð`Ø?Pð`àñ`r   c                óÈ   € V e5   V P                   e'   V P                  e   V P                   V P                  3# \        V4      pVR,          R,          VR,          R,          3# )Nr¬   r­   r³   )Ú
state_pathÚ	lock_pathr©   )r¶   r¥   Úhomes   && r   Ú_lease_pathsr»   ·   s^   € ð Ò˜U×-Ñ-Ò9¸e¿o¹oÒ>YØ×Ñ §¡Ð0Ð0Ü˜-Ó(€DØ�)ÕÐ4Õ4°d¸YÕ6FÐI_Õ6_Ð_Ð_r   c               ó    € V ^8„  d   QhRRRR/# )r   Úlockr%   r   ÚNoner   )r!   s   "r   r"   r"   À   s   € ÷ Kñ K˜ð K ñ Kr   c               ó`  € \         P                  R8X  dW   ^ RIpV P                  ^ 4       TP	                  V P                  4       V'       d   VP                  MVP                  ^4       R# ^ RIpTP                  V P                  4       V'       d   VP                  MVP                  4       R# )zOExclusive whole-file lock/unlock on ``fh`` (fcntl on POSIX, msvcrt on Windows).ÚntN)r”   ÚnameÚmsvcrtÚseekÚlockingÚfilenoÚLK_LOCKÚLK_UNLCKÚfcntlÚflockÚLOCK_EXÚLOCK_UN)Úfhr½   rÂ   rÈ   s   &$  r   Ú_flockrÍ   À   sa   € ä	‡w�w�$„ÛØ
�‰�Œ
Ø�‰�r—y‘y“{·d F§N¢NÀÇÁÐQRÖSãØ�‰�B—I‘I“K·$ §¢¸E¿M¹MÖJr   c                  ó.   € ] tR t^ËtR R ltR tR tRtR# )Ú	_FileLockc               ó   € V ^8„  d   QhRR/# )r   Úpathr   r   )r!   s   "r   r"   Ú_FileLock.__annotate__Ì   s   € ÷ ñ ˜Tñ r   c                	ó    € Wn         R V n        R # r~   )rÑ   Ú_fh)ÚselfrÑ   s   &&r   Ú__init__Ú_FileLock.__init__Ì   s   € ØŒ	ØˆŽr   c                	ó:  € V P                   P                  P                  R R R7       \        V P                   R4      V n         \        V P                  R R7       V #   \         d3   pT P                  P                  4        RT n        \        R4      ThRp?ii ; i)T)ÚparentsÚexist_okza+b©r½   Nz$active session file lock unavailable)	rÑ   ÚparentÚmkdirÚopenrÔ   rÍ   Ú	ExceptionÚcloseÚRuntimeError)rÕ   Úexcs   & r   Ú	__enter__Ú_FileLock.__enter__Ð   sƒ   € Ø�	‰	×Ñ×Ñ t°dÐÔ;Ü˜Ÿ	™	 5Ó)ˆŒð	PÜ�4—8‘8 $Õ'ð
 ˆøô	 ô 	PØ�H‰H�N‰NÔØˆDŒHÜÐEÓFÈCÐOûð	Pús   ÁA ÁBÁ(-BÂBc                	óØ   € V P                   R uq@n         Ve@   \        \        4      ;_uu_ 4        \        VRR7       R R R 4       VP	                  4        R # R #   + '       g   i     L$; i)NFrÛ   )rÔ   r   rß   rÍ   rà   )rÕ   Úexc_typerâ   ÚtbrÌ   s   &&&& r   Ú__exit__Ú_FileLock.__exit__Û   sE   € Ø—x‘x ˆˆŒHØŠ>Üœ)×$Õ$Ü�r Õ&÷ %à�H‰HŽJñ ß$×$ús   ¯AÁA)	)rÔ   rÑ   N)r   r   r   r   rÖ   rã   rè   r   r   r   r   rÏ   rÏ   Ë   s   † õò	ör   rÏ   ÚstrictFc               ó$   € V ^8„  d   QhRRRRRR/# )r   rÑ   r   rê   r%   r   rI   r   )r!   s   "r   r"   r"   ã   s"   € ÷ *ñ *˜ð *¨ð *Ð:Nñ *r   c          
     óÈ  a aaa€ R  V 3R llp \        S RRR7      ;_uu_ 4       p\        P                  ! V4      pRRR4       \        X\        4      '       d   TP                  R4      MTp\        T\        4      '       g   T'       d	   T! R	4      h. # T Uu. uF  p\        T\        4      '       g   K  TNK  	  ppT'       g   T# \        T4      \        T4      8w  d	   T! R
4      h\        4       oT F�  oSP                  R4      oT3R lR3TT3R lR3T3R lR3T3R lR3T3R lR3T3R lR3T3R lR3T3R lR33 F  w  ršT	! 4       '       g   K  T! RT
 24      h	  SP                  S4       Kƒ  	  T#   + '       g   i     ELI; i  \         d    . u # \         d4   pT'       d
   T! R4      Th\
        P                  RS 4       . u Rp?# Rp?ii ; iu upi )c               ó    € V ^8„  d   QhRRRR/# )r   Úwhatr   r   r   r   )r!   s   "r   r"   Ú#_read_entries.<locals>.__annotate__ä   s   € ÷ Uñ U�cð UÐ8ñ Ur   c                ó&   <€ \        R V  RS 24      # )zactive session registry z: )r   )rî   rÑ   s   &€r   ÚinvalidÚ_read_entries.<locals>.invalidä   s   ø€ Ü)Ð,DÀTÀFÈ"ÈTÈFÐ*SÓTÐTr   Úrz	utf-8-sig)ÚencodingNÚ
unreadablez.Ignoring corrupt active session registry at %srH   zhas invalid shapezcontains invalid entriesÚlease_idc                 ó$   <€ \        S 4      '       * # r~   )Ú_nonblank_str)rö   s   €r   rZ   Ú_read_entries.<locals>.<lambda>  s   ø€ œ xÓ0Õ0r   zan invalid lease idc                 ó   <€ S S9   # r~   r   )rö   Úseen_leasess   €€r   rZ   rù     s
   ø€ �X Ò,r   za duplicate lease idc                 óB   <€ \        S P                  R 4      4      '       * # )r›   )rø   r7   ©rŒ   s   €r   rZ   rù     s   ø€ œ u§y¡y°Ó'>Ó?Õ?r   zan invalid session idc                 ó>   <€ \        S P                  R 4      4      ^ 8*  # ©r‘   )Ú_registry_pidr7   rý   s   €r   rZ   rù     s   ø€ ”] 5§9¡9¨UÓ#3Ó4¸Ò9r   zan invalid pidc                 óL   <€ \        S P                  R 4      \        4      '       * # )rM   )Ú_optional_isinstancer7   r   rý   s   €r   rZ   rù     s   ø€ Ô-¨e¯i©i¸	Ó.BÄCÓHÕHr   zan invalid surfacec                 óL   <€ \        S P                  R 4      \        4      '       * # )Útrack_liveness)r  r7   r%   rý   s   €r   rZ   rù     s   ø€ Ô-¨e¯i©iÐ8HÓ.IÌ4ÓPÕPr   zan invalid liveness markerc                 óL   <€ \        S P                  R 4      \        4      '       * # )rŽ   )r  r7   r6   rý   s   €r   rZ   rù     s   ø€ Ô-¨e¯i©i¸
Ó.CÄTÓJÕJr   zinvalid metadatac                 óB   <€ \        S P                  R 4      4      '       * # )Úprocess_start_time)Ú_valid_process_startr7   rý   s   €r   rZ   rù     s   ø€ Ô-¨e¯i©iÐ8LÓ.MÓNÕNr   zan invalid process start timez	contains )rÞ   ÚjsonÚloadÚFileNotFoundErrorrß   r,   r-   r$   r6   r7   ÚlistÚlenÚsetÚadd)rÑ   rê   rñ   rÌ   Údatarâ   rH   rŒ   ÚvalidÚbadrî   rö   rû   s   f$     `   @@r   Ú_read_entriesr  ã   s²  û€ ÷Uð Uð	Ü�$˜ k×2Õ2°bÜ—9’9˜R“=ˆD÷ 3ô &0°´d×%;Ò%;ˆd�h‰h�yÔ!À€GÜ�gœt×$Ò$ßÙÐ-Ó.Ð.Øˆ	Ù 'ÓC¡�u¬:°e¼T×+B�UˆU¡€EÐCßØˆÜ
ˆ5ƒz”S˜“\Ô!ÙÐ0Ó1Ð1Ü›E€KÛˆØ—9‘9˜ZÓ(ˆô 1Ð2GÐHÝ,Ð.DÐEÜ?ÐAXÐYÜ9Ð;KÐLÜHÐJ^Ð_ÜPÐRnÐoÜJÐL^Ð_ÜNÐPoÐpó	
‰IˆCñ �uŒuÙ 	¨$¨Ð0Ó1Ð1ñ	
ð 	�‰˜Ö!ñ! ð" €L÷K 3×2Ð2ûäô ØŠ	Üô ßÙ˜,Ó'¨SÐ0Ü�‰ÐGÈÔNØ�	ûð	üò DsQ   �F ¥E<¼F ÂGÂ6GÅ<F	ÆF ÆF ÆGÆGÆ(GÆ)(GÇGÇGc               ó    € V ^8„  d   QhRRRR/# ©r   Úvr   r   r%   r   )r!   s   "r   r"   r"     s   € ÷ 2ñ 2�Sð 2˜Tñ 2r   c                ód   € \        V \        4      ;'       d    \        V P                  4       4      # r~   )r$   r   r%   r*   )r  s   &r   rø   rø     s!   € Ü�aœÓ×1Ð1¤$ q§w¡w£y£/Ð1r   c               ó    € V ^8„  d   QhRRRR/# r  r   )r!   s   "r   r"   r"     s   € ÷ +ñ +˜Cð +¨ñ +r   c                ó0   € V R J ;'       g    \        W4      # r~   )r$   )r  Útyps   &&r   r  r    s   € Ø�ˆ9×*Ð*œ
 1Ó*Ð*r   c               ó    € V ^8„  d   QhRRRR/# )r   r‘   r   r   r)   r   )r!   s   "r   r"   r"     s   € ÷ ñ �sð ˜sñ r   c                ó²   € \        V \        4      '       g   \        V \        \        34      '       g   ^ #  \        V 4      #   \        \
        3 d     ^ # i ; i)zERegistry pid as int; 0 for bools, non-int/str, or unparseable values.)r$   r%   r)   r   r+   r(   rÿ   s   &r   r   r     sG   € ä�#”t×Ò¤J¨s´S¼#°J×$?Ò$?ÙðÜ�3‹xˆøÜ”zÐ"ô Úðús   ¶
A ÁAÁAc               ó    € V ^8„  d   QhRRRR/# r  r   )r!   s   "r   r"   r"   "  s   € ÷ 8ñ 8˜Cð 8 Dñ 8r   c                ón   € V R9   d   R# \        V 4      pVR J;'       d    \        P                  ! V4      # )NT©NrK   )r^   ÚmathÚisfinite)r  r.   s   & r   r  r  "  s2   € ØˆJ„ÙÜ˜QÓ€FØ˜Ð×7Ð7¤$§-¢-°Ó"7Ð7r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   rÑ   r   rH   rI   r   r¾   r   )r!   s   "r   r"   r"   )  s'   € ÷ Oñ O˜ð OÐ(<ð OÀñ Or   c                ó(   € \        V R V/RRR7       R# )rH   NT)ÚindentÚ	sort_keysr   )rÑ   rH   s   &&r   Ú_write_entriesr&  )  s   € Ü�d˜Y¨Ð0¸È×Nr   c               ó    € V ^8„  d   QhRRRR/# )r   r‘   r)   r   úOptional[float]r   )r!   s   "r   r"   r"   -  s   € ÷ ñ ˜Sð  _ñ r   c                ó€   €  ^ RI p\        VP                  V 4      P                  4       4      #   \         d     R# i ; i)r?   N)Úpsutilr&   ÚProcessÚcreate_timerß   )r‘   r*  s   & r   Ú_process_start_timer-  -  s9   € ðÛÜ�V—^‘^ CÓ(×4Ñ4Ó6Ó7Ð7øÜô Úðús   ‚+. ®=¼=ztuple[int, float] | NoneÚ
_OWN_STARTc               ó   € V ^8„  d   QhRR/# )r   r   r(  r   )r!   s   "r   r"   r"   :  s   € ÷ 	ñ 	˜ñ 	r   c                 ó¢   € \         P                  ! 4       p \        e   \        ^ ,          V 8w  d   \        V 4      pVf   R# W3s\        ^,          # )zMThis process's create_time, read from psutil once instead of per lease probe.N)r”   r•   r.  r-  )r‘   Ústarts     r   Ú_own_start_timer2  :  sC   € ô �)Š)‹+€CÜÒœZ¨�]¨cÔ1Ü# CÓ(ˆØŠ=ÙØ�\ˆ
Ü�a�=Ðr   c               ó    € V ^8„  d   QhRRRR/# )r   r   r   r   r(  r   )r!   s   "r   r"   r"   F  s   € ÷ ñ ˜3ð  ?ñ r   c                ód   € V e   V R8X  d   R #  \        V 4      #   \        \        3 d     R # i ; ir  )r&   r+   r(   )r   s   &r   r^   r^   F  s6   € Ø‚}˜ œÙðÜ�U‹|ÐøÜ”zÐ"ô Úðús   �
 š/®/Úlenientc               ó(   € V ^8„  d   QhRRRRRRRR/# )r   r‘   r   r  r5  r%   r   zOptional[bool]r   )r!   s   "r   r"   r"   O  s)   € ÷ 7ñ 7�sð 7°ð 7Èð 7ÐYgñ 7r   c               ó°  € V'       d   RMRp \        V 4      pV^ 8:  d   V# V\        P                  ! 4       8H  pV'       g    ^ RIHp V! V4      '       g   R#  \        V4      pVf   R# V'       d   \        4       M
\        V4      pVf   V'       d   R# R# \        W‡,
          4      R8  #   \        \        3 d    ^ p L¨i ; i  \         d    Tu # i ; i)z­True/False for live/dead, or None when unknowable. ``lenient`` never returns None:
an unparseable pid or failed existence probe counts as dead, an unreadable start as alive.FN)Ú_pid_existsTgü©ñÒMbP?)r)   r+   r(   r”   r•   Úgateway.statusr8  rß   r^   r2  r-  Úabs)	r‘   r  r5  Úunknown_deadÚpid_intÚis_selfr8  Úexpected_startÚcurrent_starts	   &&$      r   Ú_pid_livenessr@  O  s×   € ÷ $‘5¨€LðÜ�c“(ˆð �!„|ØÐØœŸš›Ñ$€Gßð	 Ý2Ù˜w×'Ò'Ùð (ô %Ð%7Ó8€NØÒÙß)0”OÔ%Ô6IÈ'Ó6R€MØÒßˆtÐ( DÐ(Üˆ}Õ-Ó.°Ñ6Ð6øô% ”zÐ"ô ØŠðûô ô 	 ØÒð	 ús#   ŽB, ÁC Â,CÃCÃCÃCÚtarget_session_idÚ
target_pidc          
     ó,   € V ^8„  d   QhRRRRRRRRR	R/# )
r   rH   rI   rê   r%   rA  ú
str | NonerB  ú
int | Noner   r   )r!   s   "r   r"   r"   j  s6   € ÷  ñ  Ø!ð Ø.2ð à!ð à6@ð ð ñ r   c               óî  € VRJ;'       g    VRJp. pV  FÜ  pT;'       g    \        VP                  R4      4      p\        VP                  R4      VP                  R4      V'       * R7      pVff   V'       dQ   Ve3   \        VP                  R4      ;'       g    R4      \        V4      8X  g   Ve"   VP                  R4      V8X  d   \	        R4      hR	pV'       g   KË  VP                  V4       KÞ  	  V# )
u=  Keep entries whose owner is alive; tracked/strict entries must be provably so.

With ``target_session_id`` only THAT session's owner has to be provable: an
unrelated sibling whose liveness is unknowable (pid present, start time
unreadable â€” an LXC ``/proc`` after a backend restart) stays in the live set,
so it still fences its own session and still counts toward capacity, but no
longer refuses every claim/release for a different session id. See #113683.
``target_pid`` scopes the same way by owner pid (the orphan sweep only ever
reclaims this process's own leases).
Nr  r‘   r  )r5  r›   rK   z(active session owner liveness is unknownT)r%   r7   r@  r   r   Úappend)	rH   rê   rA  rB  ÚtargetedÚliverŒ   ÚtrackedÚstates	   &$$$     r   Ú_prune_deadrL  j  sß   € ð !¨Ð,×FÐF°
À$Ð0F€HØ!#€DÛˆØ×=Ð=œD §¡Ð+;Ó!<Ó=ˆÜØ�I‰I�eÓ˜eŸi™iÐ(<Ó=È7Ä{ô
ˆð Š=çØ%Ò1Ü˜EŸI™I lÓ3×9Ð9°rÓ:¼cÐBSÓ>TÔTØÒ*¨u¯y©y¸Ó/?À:Ô/Mä0Ð1[Ó\Ð\ØˆEß‰5Ø�K‰K˜Öñ ð  €Kr   c                  óˆ   € ] tR tRt$ R]R&   R]R&   R]R&   RtR]R&   R	tR]R
&   RtR]R&   RtR]R&   R	t	R]R&   R R lt
RtR# )ÚActiveSessionLeasei�  r   rö   r›   rM   Tr%   ÚenabledFÚreleasedNzOptional[Path]r¸   r¹   r  c               ó   € V ^8„  d   QhRR/# )r   r   r¾   r   )r!   s   "r   r"   ÚActiveSessionLease.__annotate__œ  s   € ÷ %ñ %˜ñ %r   c                	óh   € V P                   '       g   V P                  '       g   R # \        V 4       R # r~   )rP  rO  Úrelease_active_session)rÕ   s   &r   ÚreleaseÚActiveSessionLease.releaseœ  s   € Ø�=�=ˆ= §§ ÙÜ˜tÖ$r   r   )r   r   r   r   r…   rO  rP  r¸   r¹   r  rU  r   r   r   r   rN  rN  �  sO   ‡ àƒMØƒOØƒLØ€GˆTÓØ€HˆdÓð
 "&€J�Ó%Ø $€Iˆ~Ó$Ø €N�DÓ ÷%ñ %r   rN  c               ó    € V ^8„  d   QhRRRR/# )r   rŽ   r�   r   r   )r!   s   "r   r"   r"   ¢  s   € ÷ Jñ J˜nð J°ñ Jr   c                óš   € V P                  4        UUu/ uF)  w  r\        V\        4      '       g   K  \        V4      VbK+  	  upp# u uppi r~   )rd   r$   r   )rŽ   Úkr  s   &  r   Ú_clean_metadatarZ  ¢  s8   € Ø"*§.¡.Ô"2ÔIÑ"2™$˜!´jÀÄC×6HŒIŒC�‹F�AŠIÑ"2ÒIÐIùÓIs
   ”A³Ac               ó(   € V ^8„  d   QhRRRRRRRR/# )r   r¸   r   rH   rI   rö   r   r   r   )r!   s   "r   r"   r"   ¦  s,   € ÷ ñ ØðØ3ðØ?Bðàñr   c                óÐ   € V Uu. uF0  p\        VP                  R4      ;'       g    R4      V8w  g   K.  VNK2  	  pp\        V4      \        V4      8w  d   \        W4       V# u upi )zRRemove ``lease_id`` from ``entries``, writing the registry only if it was present.rö   rK   )r   r7   r  r&  )r¸   rH   rö   rR   Úkepts   &&&  r   Ú_drop_leaser^  ¦  sZ   € ñ ÓK‘w�!¤# a§e¡e¨JÓ&7×&=Ð&=¸2Ó">À(Ñ"J�AˆA‘w€DÐKÜ
ˆ4ƒy”C˜“LÔ Ü�zÔ(Ø€Kùò Ls   …!A#§	A#µA#c               ó$   € V ^8„  d   QhRRRRRR/# )r   rH   rI   r›   r   r   r%   r   )r!   s   "r   r"   r"   °  s'   € ÷ [ñ [Ð0ð [¸cð [Àdñ [r   c                óÈ   a€ \        T;'       g    R 4      o\        S4      ;'       d;    \        ;QJ d    V3R lV  4       F  '       g   K   R# 	  R# ! V3R lV  4       4      # )rK   c              3  ór   <"  € T F,  p\        VP                  R 4      ;'       g    R4      S8H  x € K.  	  R# 5i)r›   rK   NrO   )rQ   rR   Útargets   & €r   rS   Ú!_holds_session.<locals>.<genexpr>²  s.   øé € ÐZÑRYÈQ¤ A§E¡E¨,Ó$7×$=Ð$=¸2Ó >À&Ö HÓRYùs   ƒ!7¥7TF)r   r%   Úany)rH   r›   rb  s   &&@r   Ú_holds_sessionre  °  sL   ø€ Ü�×!Ð!˜rÓ"€FÜ�‹<×ZÐZŸC›CÔZÑRYÓZŸCœCÐZšCÐZ˜CÔZÑRYÓZÓZÐZr   c               ó0   € V ^8„  d   QhRRRRRRRRR	R
RR/# )r   r¸   r   r  r%   Úwarnr   rA  rD  rB  rE  r   z;Optional[tuple[list[dict[str, Any]], list[dict[str, Any]]]]r   )r!   s   "r   r"   r"   µ  s?   € ÷ ñ ØðØ)-ðØ58ðà!ðà6@ðð Añr   c               óœ   €  \        V RR7      pV\        WQW4R7      3#   \         d#    T'       d   h \        P	                  T4        R# i ; i)aD  ``(raw, pruned)`` from the registry, or None when it is unreadable.

Liveness-tracked callers re-raise instead (they must not proceed on an unprovable
registry); untracked callers get ``warn`` logged and decide how to degrade.
``target_session_id`` is the session the caller is about to claim/release (see
``_prune_dead``).
T©rê   )rê   rA  rB  N)r  rL  r   r,   r-   )r¸   r  rg  rA  rB  Úraw_entriess   &$$$$ r   Ú_read_live_entriesrk  µ  sS   € ð
Ü# J°tÔ<ˆØœKØØ/ô
ð 
ð 	
øô &ô ßØÜ�‰�tÔÚð	ús   ‚ žA±AÁ
ArŽ   r  c               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )r   rö   r   r›   rM   rŽ   r�   r  r%   r   r�   r   )r!   s   "r   r"   r"   Í  s>   € ÷ ñ ØðØ"%ðØ03ðà&ðà?Cðð ñr   c                óð   € \         P                   ! 4       pR V R\        V4      R\        V4      R\        P                  ! 4       R\	        4       RVRV/pV'       d   RVR&   V'       d   \        V4      VR	&   V# )
rö   r›   rM   r‘   r  r]   Ú
updated_atTr  rŽ   )re   r   r”   r•   r2  rZ  )rö   r›   rM   rŽ   r  ÚnowrŒ   s   $$$$$  r   Ú_lease_entryrp  Í  sq   € ô �)Š)‹+€Cà�HØ”c˜*“oØ”3�w“<ØŒr�yŠy‹{ØœoÓ/Ø�cØ�cð€E÷ Ø"&ˆÐÑßÜ+¨HÓ5ˆˆjÑØ€Lr   r¥   c               ó4   € V ^8„  d   QhRRRRRRRRRR	R
RRR/# )r   r›   r   rM   r1   r   rŽ   r�   r¥   r¦   r  r%   r   z2tuple[Optional[ActiveSessionLease], Optional[str]]r   )r!   s   "r   r"   r"   â  sO   € ÷ \ñ \Øð\Ø!$ð\Ø.1ð\Ø=Uð\à$ð\à=Að\ð 8ñ\r   c                ó  aa€ \        V4      p\        P                  ! 4       P                  p\	        T ;'       g    R4      pV'       g"   V'       g   \        Wx\	        V4      RR7      R3# \        Wx\	        V4      VVR7      p	\        VR7      w  op
\        Wx\	        V4      SW¥R7      p\        V
4      ;_uu_ 4        \        SVRVR	7      pVf!   R\        R
S R2\        4      3uuRRR4       # Vw  po\        V4      \        S4      ,
          pV'       d   \        P                  RV4       R VV3R llpV'       d·   \        S4       F§  w  pp\	        VP!                  R4      ;'       g    R4      V8w  d   K1  \#        VV4      '       d"   V	SV&   \%        SS4       VR3u uuRRR4       # V! \'        VV4      \(        RVVP!                  R4      VP!                  R4      4      u uuRRR4       # 	  VeH   \        S4      V8¼  d8   V! \+        \        S4      VS4      \,        R\        S4      Wa4      uuRRR4       # SP/                  V	4       \%        SS4       RRR4       VR3#   + '       g   i     TR3# ; i)aq  Acquire an active-session slot: ``(lease, None)`` or ``(None, ActiveSessionRefusal)``.

Per-session exclusivity is CORRECTNESS, enforced unconditionally (at most one live
owner per stored session); ``max_concurrent_sessions`` is resource POLICY, applied
only when configured. ``registry_home`` lets profile-scoped backends share the owning
profile's registry. Ownership uncertainty fails CLOSED (SESSION_COORDINATION_UNAVAILABLE).

Liveness tracking keeps richer desktop lifecycle semantics; ``registry_home`` lets profile-scoped
backends share the owning profile's registry even when launched from another home. See #94595.
rK   F)rö   r›   rM   rO  N©rö   r›   rM   rŽ   r  r¨   )rö   r›   rM   r¸   r¹   r  zdActive-session registry is unavailable; refusing the session rather than risking a concurrent writer©r  rg  rA  z5Hermes could not read the active-session registry at za, so it cannot prove this session has no other live owner. Fix or remove that file and try again.z'Pruned %d stale active session lease(s)c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   r{   r   ry   Úlogr   z!tuple[None, ActiveSessionRefusal]r   )r!   s   "r   r"   Ú0try_acquire_active_session.<locals>.__annotate__  s)   € ÷ 	?ñ 	?˜Cð 	?¨ð 	?°3ð 	?ÐBcñ 	?r   c                óf   <€ \        SS4       \        P                  ! V.VO5!   R \        W4      3# r~   )r&  r,   Úinforx   )r{   ry   rv  ÚargsrH   r¸   s   &&&*€€r   ÚrefuseÚ*try_acquire_active_session.<locals>.refuse  s/   ø€ Ü˜: wÔ/Ü�KŠK˜Ð#˜dÔ#ØÔ-¨gÓ>Ð>Ð>r   r›   z<Refused active session %s: already held by pid=%s surface=%sr‘   rM   z9Active session limit reached: active=%d max=%d surface=%s)r;   ÚuuidÚuuid4Úhexr   rN  rp  r»   rÏ   rk  rx   rv   r  r,   ry  Ú	enumerater7   r˜   r&  r¢   rt   rs   ru   rG  )r›   rM   r1   rŽ   r¥   r  rn   rö   r   rŒ   r¹   r¶   Úloadedrj  Úprunedr{  ÚindexÚexistingrH   r¸   s   $$$$$$            @@r   Útry_acquire_active_sessionr…  â  sk  ù€ ô 3°6Ó:€LÜ�zŠz‹|×Ñ€HÜ
ˆj×Ð˜BÓ
€C÷ —~Ü!Ø´s¸7³|ÈUô
àðð 	ô Ø´3°w³<È(Ø%ô€Eô )°}ÔEÑ€J�	ÜØ´3°w³<ÈJØô€Eô 
�9×	Õ	ô $Ø ~ð;à!ô	
ˆð Š>ØÔ-ØGØ�,ð EðEô 1ó	ð ÷ 
Ò	ð   &Ñˆ�WÜ�[Ó!¤C¨£LÕ0ˆßÜ�K‰KÐAÀ6ÔJ÷	?ñ 	?÷ Ü#,¨WÖ#5‘��xÜ�x—|‘| LÓ1×7Ð7°RÓ8¸CÔ?Ùô
 # 8¨X×6Ò6Ø%*�G˜E‘NÜ" :¨wÔ7Ø  $˜;Ñ&÷Q 
Ò	ñR Ü1°#°xÓ@ÔBSØRØ˜Ÿ™ eÓ,¨h¯l©l¸9Ó.Eóñ ÷S 
Ò	ñ< $6ð$ Ò#¬¨G«¸Ô(DÙÜ,¬S°«\¸<ÈÓQÜ'ØKÜ�G“˜ló	÷c 
Ò	ðn 	�‰�uÔÜ�z 7Ô+÷q 
ðt �$ˆ;Ð÷u 
Ö	ðt �$ˆ;Ðús2   Â=)I+Ã1AI+Å-I+Å/6I+Æ0:I+Ç5AI+ÉI+É+I>	c               ó    € V ^8„  d   QhRRRR/# )r   r¶   rN  r   r¾   r   )r!   s   "r   r"   r"   A  s   € ÷ ñ Ð"4ð ¸ñ r   c           	     óN  € \        V 4      w  r\        V4      ;_uu_ 4        V P                  '       d    R R R 4       R # \        WP                  RV P
                  R7      pVe   \        W^,          V P                  4       RV n        R R R 4       R #   + '       g   i     R # ; i)NzXActive-session registry is unavailable; preserving it while releasing an untracked leasert  T)r»   rÏ   rP  rk  r  r›   r^  rö   )r¶   r¸   r¹   r�  s   &   r   rT  rT  A  sƒ   € ô )¨Ó/Ñ€JÜ	�9×	Õ	Ø�>�>ˆ>Ø÷ 
Ñ	ô $Ø×';Ñ';ð0à#×.Ñ.ô	
ˆð ÒÜ˜
¨1¥I¨u¯~©~Ô>ØˆŒ÷ 
×	×	Ò	ús   ¡B¿A
BÂB$	c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   r¶   rN  r›   r   rŽ   r�   r   r%   r   )r!   s   "r   r"   r"   T  s,   € ÷ )ñ )Øð)Ø.1ð)Ø=Uð)à	ñ)r   c               ó,  a € \        T;'       g    R4      pV'       d   S P                  '       d   R# S P                  '       g
   VS n        R# \	        S 4      w  rE\        V4      ;_uu_ 4        S P                  '       d    RRR4       R# \        VS P                  RS P                  R7      pVf    RRR4       R# V^,          p\        V 3R lV 4       R4      pVe4   W8R&   \        P                  ! 4       VR	&   V'       d   \        V4      VR
&   MQS P                  '       d5   VP                  \        S P                  VS P                  VRR7      4       M RRR4       R# \        WG4       VS n         RRR4       R#   + '       g   i     R# ; i)zEMove an existing lease to a new session id without dropping the slot.rK   FTNzVActive-session registry is unavailable; refusing to overwrite it during lease transferrt  c              3  ó’   <"  € T F<  p\        VP                  R 4      ;'       g    R4      SP                  8X  g   K8  Vx € K>  	  R# 5i)rö   rK   N)r   r7   rö   )rQ   rR   r¶   s   & €r   rS   Ú*transfer_active_session.<locals>.<genexpr>n  s4   øé € ÐY™w˜!¬#¨a¯e©e°JÓ.?×.EÐ.EÀ2Ó*FÈ%Ï.É.Ñ*X—A’A›wùs   ƒ!A¥A½
Ar›   rn  rŽ   rs  )r   rP  rO  r›   r»   rÏ   rk  r  Únextre   rZ  rG  rp  rö   rM   r&  )	r¶   r›   rŽ   Únew_session_idr¸   r¹   r�  rH   Úowns	   f$$      r   Útransfer_active_sessionr�  T  sO  ø€ ô ˜×)Ð) rÓ*€Nß˜UŸ^Ÿ^˜^ÙØ�=�=ˆ=Ø)ˆÔÙä(¨Ó/Ñ€JÜ	�9×	Õ	ð �>�>ˆ>Ø÷	 
Ñ	ô
 $Ø u×';Ñ';ð,à#×.Ñ.ô	
ˆð Š>Ø÷ 
Ñ	ð ˜•)ˆÜÔY™wÓYÐ[_Ó`ˆØŠ?Ø .�ÑÜ $§	¢	£ˆC�ÑßÜ"1°(Ó";��J‘øØ×!×!Ð!Ø�N‰Nœ<ØŸ™°NÈEÏMÉMØ!°$ôõ ð
 ÷5 
Ñ	ô6 	�zÔ+Ø)ˆÔØ÷; 
×	×	Ò	ús%   Á.FÂ(FÂ>A'FÄ&5FÅ%FÆF	g      >@c               ó$   € V ^8„  d   QhRRRRRR/# )r   rH   rI   Úown_live_lease_idsúset[str] | Noner   r   )r!   s   "r   r"   r"   ‰  s$   € ÷ ñ Ø!ðØ7Fðàñr   c                óz  € Vf   V # \         P                  ! 4       p\        P                  ! 4       \        ,
          pV  Uu. uFo  pVP	                  R4      V8w  gU   \        VP	                  R4      ;'       g    R4      V9   g,   \        VP	                  R4      4      ;'       g    RV8”  g   Km  VNKq  	  up# u upi )zEDrop this process's leases only when its caller can vouch for owners.r‘   rö   rK   r]   g        )r”   r•   re   Ú_SELF_ORPHAN_GRACE_SECONDSr7   r   r^   )rH   r‘  r‘   ÚcutoffrŒ   s   &&   r   Ú_drop_self_orphansr–  ‰  sŸ   € ð Ò!ØˆÜ
�)Š)‹+€CÜ�YŠY‹[Ô5Õ5€Fá"óÙ"�%Ø�9‰9�UÓ˜sÔ"Üˆu�y‰y˜Ó$×*Ð*¨Ó+Ð/AÔAÜ˜EŸI™I lÓ3Ó4×;Ð;¸¸vÑE÷ 	ˆ™7ñð ùò s   Á 7B8Á8,B8Â%B8Â/B8c               ó$   € V ^8„  d   QhRRRRRR/# )r   r¥   r   Úlive_lease_idsúset[str]r   r)   r   )r!   s   "r   r"   r"   ™  s"   € ÷ ñ °Dð È(ð ÐWZñ r   c           	     ó¨  € \        V 4      pVP                  4       '       g   ^ # \        \        V 4      4      ;_uu_ 4        \	        VRR\
        P                  ! 4       R7      pVf    RRR4       ^ # V^,          p\        WA4      p\        V4      \        V4      ,
          pV'       d   \        W%4       VuuRRR4       #   + '       g   i     R# ; i)r?   FzEActive-session registry is unavailable; skipping orphaned-lease sweep)r  rg  rB  N)
r¯   ÚexistsrÏ   r´   rk  r”   r•   r–  r  r&  )r¥   r˜  r¸   r�  rH   r]  Údroppeds   &&     r   Ú _release_orphaned_leases_in_homer�  ™  s¡   € Ü˜]Ó+€Jð ×Ñ×ÒÙÜ	”:˜mÓ,×	-Õ	-Ü#Ø uØXÜ—y’y“{ô
ˆð
 Š>Ø÷ 
.Ñ	-ð ˜•)ˆÜ! 'Ó:ˆÜ�g“,¤ T£Õ*ˆßÜ˜:Ô,Ø÷ 
.×	-×	-Ó	-ús   Á (C Á2AC Ã C	c               ó    € V ^8„  d   QhRRRR/# )r   r˜  r™  r   r)   r   )r!   s   "r   r"   r"   ¯  s   € ÷ ñ ¨Hð ¸ñ r   c                ó8  € \        4       pV.p VP                  R VR,          P                  4        4       4       ^ pV F  p V\	        W@4      ,          pK  	  V#   \         d     L-i ; i  \         d"   p\
        P                  RYE4        Rp?KT  Rp?ii ; i)uš  Drop this process's registry entries that no live session owns.

``_prune_dead`` only reclaims leases of dead processes, so on a days-long server a
lease whose session skipped teardown is held until restart. The owning process is the
only authority on its own leases â€” exact, no heartbeat on the turn path, no threshold.
Sweeps the root home and every profile home (a multiplexed server leases across them).
c              3  óL   "  € T F  p\        V4      '       g   K  Vx € K  	  R # 5ir~   )r   )rQ   Úps   & r   rS   Ú*release_orphaned_leases.<locals>.<genexpr>º  s   é € ÐZÑ =˜1ÔAVÐWX×AY—Q’QÓ =ùs   ‚$š
$Úprofilesz&orphaned-lease sweep failed for %s: %sN)r
   ÚextendÚiterdirÚOSErrorr�  r,   Údebug)r˜  ÚrootÚhomesrœ  rº   râ   s   &     r   Úrelease_orphaned_leasesrª  ¯  sŸ   € ô #Ó$€DØˆF€EðØ�‰ÑZ ¨
Õ!2× ;Ñ ;Ô =ÓZÔZð €GÛˆð	NØÔ7¸ÓMÕMŠGñ ð
 €Nøô ô Ùðûô ô 	NÜ�L‰LÐAÀ4×MÒMûð	Nús)   �-A ÁA-ÁA*Á)A*Á-BÁ8BÂBc               ó$   € V ^8„  d   QhRRRRRR/# )r   r¥   r¦   rê   r%   r   rI   r   )r!   s   "r   r"   r"   Ç  s$   € ÷ ñ Ø$ðØ8<ðàñr   c          
     óB  € \        V R7      w  r#\        V4      ;_uu_ 4        \        VRR7      pRRR4       \        XVR7      pWT8w  Ed   V Uu0 uF'  p\	        VP                  R4      ;'       g    R4      kK)  	  ppV Uu0 uFR  p\	        VP                  R4      ;'       g    R4      V9  g   K.  \	        VP                  R4      ;'       g    R4      kKT  	  pp\        V4      ;_uu_ 4        \        VRR7      p	V	 Uu. uF0  p\	        VP                  R4      ;'       g    R4      V9  g   K.  VNK2  	  p
p\        V
4      \        V	4      8w  d   \        W*4       RRR4       V# V#   + '       g   i     ELC; iu upi u upi u upi   + '       g   i     T# ; i)aÀ  Return live leases; attachment callers require provable liveness.

The per-entry liveness probes in ``_prune_dead`` run AFTER the file lock
is released: holding an exclusive, unfair lock across process-introspection
syscalls starves concurrent pollers once a handful of leases exist
(#115578). The prune write-back re-locks and drops only the lease ids
already proven dead, so a lease created between the snapshot and the
write-back is never lost.
r¨   Tri  Nrö   rK   )r»   rÏ   r  rL  r   r7   r  r&  )r¥   rê   r¸   r¹   rj  rH   rŒ   r˜  Údead_lease_idsÚcurrent_entriesÚkept_entriess   &$         r   Ú active_session_registry_snapshotr°  Ç  sp  € ô )°}ÔEÑ€JÜ	�9×	Õ	Ü# J°tÔ<ˆ÷ 
ä˜+¨fÔ5€GØÕÙHOÓPÉ¸uœ#˜eŸi™i¨
Ó3×9Ð9°rÖ:ÉˆÐPñ %ó
á$�Ü�5—9‘9˜ZÓ(×.Ð.¨BÓ/°~ÑEô -ŒC�—	‘	˜*Ó%×+Ð+¨Ö,Ù$ð 	ð 
ô
 �y×!Õ!Ü+¨J¸tÔDˆOá#2óÙ#2˜%Ü�u—y‘y Ó,×2Ð2°Ó3¸>ÑI÷ �¡?ð ð ô �<Ó ¤C¨Ó$8Ô8Ü˜zÔ8÷ "ð €Nˆ7€N÷% 
×	Ð	üò Qùò
ùò÷ "Ö!ð €NúsY   ¢E*Á!E>Á2E>Â!FÂ%	FÂ3FÃFÃ0FÄ!FÄ$	FÄ2FÄ8&FÅ*E;	ÆFÆF	r‘  c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   r›   r   r¥   r¦   r‘  r’  r   úIterator[bool]r   )r!   s   "r   r"   r"   ê  s.   € ÷ 2ñ 2Øð2Ø'8ð2à'ð2ð ñ2r   c          	   #  ó  "  € \        VR7      w  r4\        V4      ;_uu_ 4        \        \        VRR7      RV R7      p\	        WR4      p\        W54       \        WP4      x € RRR4       R#   + '       g   i     R# ; i5i)z¢Hold the registry lock while reporting whether ``session_id`` is leased, so no
new backend can acquire a lease between the check and the caller's ``end_session``.r¨   Tri  ©rê   rA  N)r»   rÏ   rL  r  r–  r&  re  )r›   r¥   r‘  r¸   r¹   rH   s   &$$   r   Úactive_session_liveness_guardrµ  é  se   é € ô )°}ÔEÑ€JÜ	�9×	Õ	ÜÜ˜*¨TÔ2¸4ÐS]ô
ˆô % WÓAˆÜ�zÔ+Ü˜WÓ1Ò1÷ 
×	×	Ò	üs   ‚"A?¤=A+Á!
A?Á+A<	Á6	A?c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   r¶   rN  r›   r   r‘  r’  r   r²  r   )r!   s   "r   r"   r"   û  s,   € ÷ /ñ /Øð/Ø+.ð/ØGVð/àñ/r   c          
   #  óî  "  € V P                   '       d   V P                  '       dU   V P                  e!   V P                  P                  P                  MRp\	        WVR7      ;_uu_ 4       pVx € RRR4       R# \        V 4      w  rV\        V4      ;_uu_ 4        \        \        VRR7      RVR7      pV Uu. uF:  p\        VP                  R4      ;'       g    R4      V P                  8w  g   K8  VNK<  	  p	p\        W’4      p	\        V	4      \        V4      8w  d   \        WY4       RV n        \        W‘4      x € RRR4       R#   + '       g   i     R# ; iu upi   + '       g   i     R# ; i5i)z™Remove ``lease`` and hold its registry lock through a lifecycle write, making
cleanup one atomic decision (release, check siblings, end the durable row).N)r¥   r‘  Tri  r´  rö   rK   )rO  rP  r¸   rÜ   rµ  r»   rÏ   rL  r  r   r7   rö   r–  r  r&  re  )
r¶   r›   r‘  rº   Úactiver¸   r¹   rH   rR   r]  s
   &&$       r   Ú%release_active_session_liveness_guardr¹  ú  s(  é € ð �=�=ˆ=˜EŸNŸN˜NØ16×1AÑ1AÒ1Mˆu×Ñ×&Ñ&×-Ò-ÐSWˆÜ*ØÐ?Q÷
õ 
àØŠL÷
ñ 	ä(¨Ó/Ñ€JÜ	�9×	Õ	ÜÜ˜*¨TÔ2¸4ÐS]ô
ˆñ #ÓU™7�a¤c¨!¯%©%°
Ó*;×*AÐ*A¸rÓ&BÀeÇnÁnÑ&T—�™7ˆÐUÜ! $Ó;ˆÜˆt‹9œ˜G›Ô$Ü˜:Ô,ØˆŒÜ˜TÓ.Ò.÷ 
Ñ	÷
ö 
ñ 	üò V÷	 
×	Ð	üsZ   ‚$E5§AE5Á,EÁ1*E5ÂE!Â9!EÃEÃ3EÃ9AE!Ä>
E5ÅE	Å	E5ÅE!Å!E2	Å,	E5)r3   r~   )NN)SÚ__conditional_annotations__r   Ú
__future__r   r	  Úloggingr`   r   r”   re   r}  Ú
contextlibr   r   Údataclassesr   Úpathlibr   Útypingr   r   r	   Úhermes_constantsr
   r   r   Úutilsr   Ú	getLoggerr   r,   rá   r   r/   r;   rF   rk   rs   rt   ru   rv   ÚPER_SESSION_EXCLUSIVE_SUBMITr   rx   rŠ   r˜   rŸ   r¢   r©   r¯   r´   r»   rÍ   rÏ   r  rø   r  r   r  r&  r-  r.  r…   r2  r^   r@  rL  rN  rZ  r^  re  rk  rp  r…  rT  r�  r”  r–  r�  rª  r°  rµ  r¹  )rº  s   @r   Ú<module>rÅ     sD  øðôõ #ã Û Û Û Û 	Û Û ß /Ý !Ý ß *Ñ *ç \Ñ \Ý #à	×	Ò	˜8Ó	$€ôK ô K÷*õ 8õ"Aõ÷
ð  (Ð Ø3Ð ð $FÐ  ð
  $Ð ô˜3ô õUõTõFõ	÷Y÷N÷N÷`õK÷ñ ð0*°÷ *õZ2õ+õõ8õOõð (,€
Ð$Ó +õ	õñ7Èu÷ 7ð 7ð6 Ø5:ð à$(ð àCG÷ ðF ÷%ð %ó ð%õ(Jõõ[ð
à$(ðàCG÷ð0à)-ðàFK÷ð*\ØX\ð\à'+ð\àDI÷\õ~ð&)ØX\÷)ðd "Ð õõ õ,ñ0Ø?D÷ð ðD ð2Ø;?ð2à*.ö2ó ð2ð  ð/ØY]ö/ó ò/r   