+
    jHàjY  ã                  ó^  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 ^ RIHt ^ RIHt ]P"                  ! ]4      tRt^tRtRt]	P0                  ! 4       tRsR	sRsR
]R&   ^ sR R ltR R lt R R lt!R R lt"R R R llt#R R lt$R R lt%RR	RRRR/R R llt&R# )!aH  Rate-limited heap release for long-lived Hermes gateway processes.

On Linux/glibc, ``malloc_trim(0)`` can return pages from freed Python/C allocations to the OS. Every
platform runs the rate-limited ``gc.collect()``; only the page release is glibc-only. Behavior is configured
under ``context.memory_trim`` in ``config.yaml``.
)ÚannotationsN)ÚCallable)ÚPath)ÚAnyg      N@ç        g      @FúCallable[[int], int] | NoneÚ_malloc_trimc               ó   € V ^8„  d   QhRR/# )é   Úreturnztuple[bool, float, int, float]© )Úformats   "Ú8/home/ubuntu/.hermes/hermes-agent/hermes_cli/mem_trim.pyÚ__annotate__r   &   s   € ÷ dñ dÐ8ñ dó    c            	     óT  € Rp  ^ RI Hp V! 4       ;'       g    / p\        V\        4      '       d   VP	                  R4      MRp\        V\        4      '       d   VP	                  R4      MRp \        V \        4      '       g   / p \        V P	                  R4      \        4      '       d
   V R,          MRpV\        V P	                  R4      4      \        V P	                  R4      \        \        ^4      \        V P	                  R	4      \        \        R
4      3#   \
         d     L¹i ; i)zYReturn fail-open ``(enabled, cooldown, log_every_n, info_log_min_delta_mb)`` from config.N)Úload_config_readonlyÚcontextÚmemory_trimÚenabledTÚcooldown_secondsÚlog_every_nÚinfo_log_min_delta_mbr   )Úhermes_cli.configr   Ú
isinstanceÚdictÚgetÚ	ExceptionÚboolÚ_cooldown_secondsÚ_coerceÚ_DEFAULT_LOG_EVERY_NÚintÚ_DEFAULT_INFO_LOG_MIN_DELTA_MBÚfloat)Úsettingsr   Úconfigr   r   s        r   Ú_config_settingsr'   &   sø   € à€Hð	õ 	;Ù%Ó'×-Ð-¨2ˆÜ+5°f¼d×+CÒ+C�&—*‘*˜YÔ'ÈˆÜ1;¸GÄT×1JÒ1J�7—;‘;˜}Ô-ÐPTˆô �h¤×%Ò%ØˆÜ%/°·±¸YÓ0GÌ×%NÒ%Nˆh�yÖ!ÐTX€GàÜ˜(Ÿ,™,Ð'9Ó:Ó;Ü�—‘˜]Ó+Ô-AÄ3ÈÓJÜ�—‘Ð4Ó5Ô7UÔW\Ð^aÓbð	dð døô ô Ùðús   „D ˜AD ÄD'Ä&D'c               ó   € V ^8„  d   QhRR/# )r
   Úvaluer   r   )r   s   "r   r   r   =   s   € ÷ ñ �3ñ r   c                óˆ   € \        V \        4      '       d   V#  \        W2! V 4      4      #   \        \        3 d    Tu # i ; i)z\``cast(value)`` clamped to ``floor``; bools and unparseable values fall back to ``default``.)r   r   ÚmaxÚ	TypeErrorÚ
ValueError)r)   ÚdefaultÚcastÚfloors   &&&&r   r    r    =   sC   € ä�%œ×ÒØˆðÜ�5˜$˜u›+Ó&Ð&øÜ”zÐ"ô ØŠðús   š+ «AÁ Ac               ó    € V ^8„  d   QhRRRR/# )r
   r)   r   r   r$   r   )r   s   "r   r   r   G   s   € ÷ Añ A˜Sð A Uñ Ar   c                ó.   € \        V \        \        R 4      # )r   )r    Ú_DEFAULT_COOLDOWN_SECONDSr$   )r)   s   &r   r   r   G   s   € Ü�5Ô3´U¸CÓ@Ð@r   c               ó   € V ^8„  d   QhRR/# )r
   r   z
str | Noner   )r   s   "r   r   r   K   s   € ÷ ñ ˜:ñ r   c                 óŒ   € \         P                  R8w  d   R#  \        R4      P                  RR7      #   \         d     R# i ; i)zHRead Linux process status without making non-Linux callers special-case.ÚlinuxNz/proc/self/statuszutf-8)Úencoding)ÚsysÚplatformr   Ú	read_textÚOSErrorr   r   r   Ú_read_proc_statusr<   K   sB   € ä
‡|�|�wÔÙðÜÐ'Ó(×2Ñ2¸GÐ2ÓDÐDøÜô Úðús   ™4 ´AÁAc               ó    € V ^8„  d   QhRRRR/# )r
   Úhistory_bytesz
int | Noner   údict[str, int | None]r   )r   s   "r   r   r   U   s   € ÷ ñ ¨:ð ÐAVñ r   c                óæ  € RRRRR\         P                  ! 4       /p\        4       pV'       d£   VP                  4        FŽ  pVP	                  R4      w  rEpV'       d   VR	9  d   K(  VP                  4       P                  ^R7      pV'       g   KR  V^ ,          P                  4       '       g   Kq  \        V^ ,          4      YR8X  d   RMR&   K�  	  \        V \        4      '       d   V ^ 8¼  d   WR&   V# )
z�Lightweight process-memory telemetry for trim logs and canaries.

``VmRSS`` / ``RssAnon`` are Linux-only best effort; deliberately psutil-free.
Úrss_kibNÚrss_anon_kibÚthread_countÚ:ÚVmRSS)Úmaxsplitr>   >   rE   ÚRssAnon)
Ú	threadingÚactive_countr<   Ú
splitlinesÚ	partitionÚstripÚsplitÚisdigitr"   r   )r>   ÚsnapshotÚstatusÚlineÚkeyÚ	separatorÚ	raw_valuer)   s   &       r   Úcollect_memory_snapshotrU   U   sÐ   € ð 	�4˜¨¨~¼y×?UÒ?UÓ?Wð'Y€HäÓ €FßØ×%Ñ%Ö'ˆDØ(,¯©°sÓ(;Ñ%ˆC˜Iß Ð+?Ô ?ÙØ—O‘OÓ%×+Ñ+°QÐ+Ó7ˆEß‰u˜˜q�×)Ñ)×+Ô+ÜLOÐPUÐVWÕPXËM�¨W¤n™¸.ÓIñ (ô �-¤×%Ò%¨-¸1Ô*<Ø$1�Ñ!Ø€Or   c               ó4   € V ^8„  d   QhRRRRRRRRRRR	R
RR/# )r
   Úforcer   r   r"   Ú
call_countÚbeforer?   Úafterr   r$   r   r   )r   s   "r   r   r   j   sM   € ÷ Gñ GØðGØ!$ðGØ25ðGØ?TðGà ðGà9>ðGàCGñGr   c                óÄ   € V '       d   R # W!,          '       d   R# VP                  R4      pVP                  R4      pVe   Vf   R # \        Wv,
          4      VR,          8¬  # )TFrA   i   )r   Úabs)rW   r   rX   rY   rZ   r   Ú
before_rssÚ	after_rsss   $$$$$$  r   Ú_should_log_trimr_   j   sY   € ÷
 ÙØ×ÔÙØ—‘˜IÓ&€JØ—	‘	˜)Ó$€IØÒ˜YÒ.ÙÜˆyÕ%Ó&Ð*?À$Õ*FÑFÐFr   c               ó   € V ^8„  d   QhRR/# )r
   r   r   r   )r   s   "r   r   r   z   s   € ÷ ñ Ð"=ñ r   c                 óÈ  € \         '       d   \        # Rs \        P                  R8w  d   R#  \        P                  ! 4       ^ ,          P                  4       R8w  d   R# \        P                  ! R4      P                  p \        P                  .V n
        \        P                  V n        V s\        #   \         d&   p\        P                  RT4        Rp?\        # Rp?ii ; i)zEResolve glibc's malloc_trim once; return None on unsupported systems.Tr6   NÚglibczmalloc_trim unavailable: %s)Ú_probe_doner   r8   r9   Úlibc_verÚlowerÚctypesÚCDLLÚmalloc_trimÚc_size_tÚargtypesÚc_intÚrestyper   ÚloggerÚdebug)ÚtrimÚexcs     r   Ú_probe_glibc_malloc_trimrq   z   s®   € ÷ ƒ{ÜÐØ€KÜ
‡|�|�wÔÙð9Ü×ÒÓ˜qÕ!×'Ñ'Ó)¨WÔ4ÙÜ�{Š{˜4Ó ×,Ñ,ˆÜŸ™Ð)ˆŒÜ—|‘|ˆŒØˆô Ðøô ô 9Ü�‰Ð2°C×8Ð8ÜÐûð9ús   ­/B1 ÁAB1 Â1C!Â<CÃC!rW   ÚreasonÚ r   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r
   rW   r   rr   Ústrr   zfloat | Noner   r   )r   s   "r   r   r   Ž   s,   € ÷ /ñ /Øð/Ø$'ð/Ø@Lð/ØX\ñ/r   c                óD  € \        4       w  r4rVV'       g   R# \        ;_uu_ 4        \        4       p\        P                  ! 4       pVf   TM
\        V4      p	V\        ,
          p
\        '       d    Y '       d   \        MT	8  d    RRR4       R# Vs \        4       p\        P                  ! 4       p\        P                  ! 4        Ve	   V! ^ 4      M^ p\        V4      p\        4       p\        P                  ! 4       V,
          R,          p\        ^,          sV'       dŒ   \        W\        W¿VR7      '       ds   \        P!                  RT;'       g    RVVP#                  R4      VP#                  R4      VP#                  R4      VP#                  R4      VP#                  R	4      V4	       VuuRRR4       #   \$         dI   p\        P'                  R
T;'       g    R\)        T4      P*                  T4        Rp?RRR4       R# Rp?ii ; i  + '       g   i     R# ; i)a  Collect cycles and ask glibc to release free heap pages.

Returns ``True`` only when ``malloc_trim(0)`` ran and reported success. Unsupported allocators,
the config kill switch, cooldown suppression, and all runtime errors return ``False`` without
affecting the caller.
FNiè  )rW   r   rX   rY   rZ   r   zdmemory trim: reason=%s malloc_trim=%s rss_kib=%s->%s rss_anon_kib=%s->%s threads=%s duration_ms=%.1fÚcleanuprA   rB   rC   z#memory trim failed after %s: %s: %s)r'   Ú
_trim_lockrq   ÚtimeÚ	monotonicr   Ú_last_trim_monotonicÚ_FORCE_FLOOR_SECONDSrU   Úperf_counterÚgcÚcollectr   Ú_trim_call_countr_   rm   Úinfor   r   ÚwarningÚtypeÚ__name__)rW   rr   r   r   Úconfigured_cooldownr   r   ro   ÚnowÚcooldownÚ
since_lastrY   ÚstartedÚtrim_resultÚreleasedrZ   Úduration_msrp   s   $$$               r   Útrim_memoryr�   Ž   s¹  € ô HXÓGYÑD€G +ßÙ÷ 
ŽÜ'Ó)ˆÜ�nŠnÓˆØ*:Ò*BÑ&ÔHYÐZjÓHkˆØÔ/Õ/ˆ
ßÓ JÎ%Õ2FÐU]Ô$^Ø÷ 
‰ð  #Ðð	Ü,Ó.ˆFÜ×'Ò'Ó)ˆGÜ�JŠJŒLà%)Ò%5™$˜qœ'¸1ˆKÜ˜KÓ(ˆHÜ+Ó-ˆEÜ×,Ò,Ó.°Õ8¸DÕ@ˆKÜ Õ!ÐßÔ,ØÔAQØÐBW÷Yó Yô —‘ðFà×'Ð'˜i¨Ø—J‘J˜yÓ)¨5¯9©9°YÓ+?Ø—J‘J˜~Ó.°·	±	¸.Ó0IØ—I‘I˜nÓ-¨{ô<ð ÷= 
Šøô> ô 	Ü�N‰NØ5°v×7JÐ7JÀÌDÐQTËI×L^ÑL^Ð`côeã÷E 
‰ûð>	ú÷? 
�ˆúsD   ¦A	HÁ0HÂHÂC F8ÅAF8Æ8HÇ5HÇ8HÈHÈHÈH	)N)'Ú__conditional_annotations__Ú__doc__Ú
__future__r   rf   r~   Úloggingr9   r8   rH   ry   Úcollections.abcr   Úpathlibr   Útypingr   Ú	getLoggerr„   rm   r3   r!   r#   r|   ÚLockrx   r{   rc   r   Ú__annotations__r€   r'   r    r   r<   rU   r_   rq   r�   )rŽ   s   @r   Ú<module>r˜      sÈ   øðôõ #ã Û 	Û Û Û 
Û Û Ý $Ý Ý à	×	Ò	˜8Ó	$€à Ð ØÐ Ø!$Ð ð
 Ð Ø�^Š^Ó€
ØÐ Ø€Ø,0€Ð)Ó 0ØÐ õdõ.õAõ÷õ*Gõ ð(/Øð/Ø*,ð/ØOS÷/ñ /r   