Ë
    ãß²jì  ã                   ó|   — d Z ddlZddlZddlZddlmZmZmZmZ ddl	m
Z
  ej                  d«      Z G d„ d«      Zy)z=Running-process checkpoint persistence and PID-safe recovery.é    N)ÚAnyÚDictÚListÚOptional)Úredact_sensitive_textztools.process_registryc                   ó<   — e Zd Zddeeeeef         fd„Zde	fd„Z
y)ÚProcessCheckpointMixinNÚextra_entriesc                 ó4  ‡— ddl m}m} 	 | j                  5  g }| j                  j                  «       D ]Ç  }|j                  rŒ|j                  €;|j                  dk(  r,|j                  r | j                  |j                  «      |_        d|j                  i|D �ci c]  }|t        ||«      “Œ c}¥}t        |j                  d¬«      |d<   |j                  xs |j                   |d	<   |j#                  |«       ŒÉ |r9|D �ch c]  }|j%                  d«      ’Œ c}Š|j'                  ˆfd
„|D «       «       ddd«       ddlm}	  |	 |«       «       yc c}w c c}w # 1 sw Y   Œ(xY w# t,        $ r"}
t.        j1                  d|
d¬«       Y d}
~
yd}
~
ww xY w)zAWrite running process metadata to the checkpoint file atomically.r   )Ú_checkpoint_pathÚ_CHECKPOINT_FIELDSNÚhostÚ
session_idT)Ú	code_fileÚcommandÚowner_task_idc              3   óJ   •K  — | ]  }|j                  d «      ‰vsŒ|–— Œ y­w)r   N)Úget)Ú.0ÚitemÚtracked_idss     €úF/home/ubuntu/.hermes/hermes-agent/tools/process_registry_checkpoint.pyú	<genexpr>z;ProcessCheckpointMixin._write_checkpoint.<locals>.<genexpr>(   s"   øè ø€ Ò"o¨DÀTÇXÁXÈlÓE[ÐcnÒEn¤4Ñ"oùs   ƒ#œ#)Úatomic_json_writez#Failed to write checkpoint file: %s)Úexc_info)Útools.process_registryr   r   Ú_lockÚ_runningÚvaluesÚexitedÚhost_start_timeÚ	pid_scopeÚpidÚ_safe_host_start_timeÚidÚgetattrr   r   r   Útask_idÚappendr   ÚextendÚutilsr   Ú	ExceptionÚloggerÚdebug)Úselfr
   r   r   ÚentriesÚsÚfÚentryr   r   Úer   s              @r   Ú_write_checkpointz(ProcessCheckpointMixin._write_checkpoint   sj  ø€ çOð	RØ—‘ñ pØ�ØŸ™×-Ñ-Ó/ò *�AØ—x’xØ ð ×(Ñ(Ð0°Q·[±[ÀFÒ5JÈqÏuÊuØ,0×,FÑ,FÀqÇuÁuÓ,M˜Ô)Ø)¨1¯4©4ÐbÐN`Ö3aÈ°A´w¸qÀ!³}Ñ4DÒ3aÐb�Eô
 (=¸Q¿Y¹YÐRVÔ'W�E˜)Ñ$Ø-.¯_©_Ò-IÀÇ	Á	�E˜/Ñ*Ø—N‘N 5Õ)ð*ñ !ØFMÖ"N¸d 4§8¡8¨LÕ#9Ò"N�KØ—N‘NÓ"o°MÔ"oÔo÷'põ( 0ÙÑ.Ó0°'Õ:ùò 4bùò #O÷%pð pûô, ò 	RÜ�L‰LÐ>ÀÈDˆL×QÑQûð	RúsN   ‹E, —BE ÂE
Â0AE ÄEÄE Ä9E, Å
E Å E)Å%E, Å,	FÅ5FÆFÚreturnc                 óˆ  — ddl m}m}m}m}m}m}  |«       }|j                  «       sy	 t        j                  |j                  d¬«      «      }d}	g }
|D �]¥  }|j                  d«      |j                  dd«      }}|sŒ*| j                  5  |j                  d«      | j                  v }d	d	d	«       rŒ_|dk7  r,t        j!                  d
|j                  dd«      d	d ||«       Œ�| j#                  ||j                  d«      «      s~| j%                  |«      r't        j!                  d|j                  dd«      |«       |j                  dd«      }|r0 ||«      s(t        j'                  d||«       |
j)                  |«       �Œ/|D �ci c]  }||j                  |||   «      “Œ }}|j+                  |j                  dd«      |j                  dd«      xs |j                  dd«      |j                  dt-        j,                  «       «      ¬«        |d |d   ddœ|¤Ž}| j                  5  || j                  |j.                  <   d	d	d	«       |	dz  }	t        j!                  d|j0                  d	d |«       |j2                  dkD  s�Œ2| j4                  j)                  |j.                  |j2                  |j6                  dœ|D �ci c]  }|t9        |d|› �«      “Œ c}¥|j:                  |j<                  dœ¥«       �Œ¨ | j?                  |
¬«       |	S # t        $ r Y yw xY w# 1 sw Y   �ŒzxY wc c}w # 1 sw Y   ŒïxY wc c}w )!zvOn gateway startup, probe PIDs from the checkpoint file; returns how many
        were recovered as detached sessions.r   )ÚProcessSessionr   r   Ú_CHECKPOINT_DEFAULTSÚ_WATCHER_ROUTE_KEYSÚ_stop_systemd_unitzutf-8)Úencodingr#   r"   r   r   Nz=Skipping recovery for non-host process: %s (pid=%s, scope=%s)r   Úunknowné<   r!   u•   Not recovering session %s: pid %d is alive but its start time no longer matches â€” PID was recycled onto an unrelated process; refusing to adopt it.ú?Úsystemd_unitÚ zjCould not reap persisted scope %s for dead wrapper pid %s; retaining checkpoint entry for the next startupr   r'   Ú
started_at)r   r   rA   T)r%   Údetachedé   z'Recovered detached process: %s (pid=%d))r   Úcheck_intervalÚsession_keyÚwatcher_)Únotify_on_completeÚparent_session_id)r
   © ) r   r7   r   r   r8   r9   r:   ÚexistsÚjsonÚloadsÚ	read_textr+   r   r   r   r,   ÚinfoÚ_host_pid_is_oursÚ_is_host_pid_aliveÚwarningr(   ÚupdateÚtimer%   r   Úwatcher_intervalÚpending_watchersrE   r&   rG   rH   r4   )r.   r7   r   r   r8   r9   r:   Úcheckpoint_pathr/   Ú	recoveredÚunresolved_scope_entriesr2   r#   r"   Úalready_trackedr?   r1   ÚfieldsÚsessionÚkeys                       r   Úrecover_from_checkpointz.ProcessCheckpointMixin.recover_from_checkpoint.   s:  € ÷	
÷ 	
ñ
 +Ó,ˆØ×%Ñ%Ô'Øð	Ü—j‘j ×!:Ñ!:ÀGÐ!:Ó!LÓMˆGð ˆ	Ø9;Ð Øó 5	ˆEØ"ŸY™Y uÓ-¨u¯y©y¸ÀfÓ/M�ˆCÙØð —‘ñ KØ"'§)¡)¨LÓ"9¸T¿]¹]Ð"J�÷KáØØ˜FÒ"Ü—‘ØSØ—I‘I˜i¨Ó3°C°RÐ8¸#¸yôJð ð ×)Ñ)¨#¨u¯y©yÐ9JÓ/KÔLØ×*Ñ*¨3Ô/Ü—K‘KðFð Ÿ	™	 ,°Ó4°cô	;ð
  %Ÿy™y¨¸Ó<�ÙÑ(:¸<Ô(HÜ—N‘NðJà$ cô+ð -×3Ñ3°EÔ:ÙØHZÖ[À1�a˜Ÿ™ 1Ð&:¸1Ñ&=Ó>Ñ>Ð[ˆFÐ[Ø�M‰MØŸ	™	 )¨YÓ7Ø#Ÿi™i¨¸Ó<ÒXÀÇ	Á	È)ÐUWÓ@XØ Ÿ9™9 \´4·9±9³;Ó?ð ô Añ
 %ÐU¨¨lÑ(;ÀdÑUÈfÑUˆGØ—‘ñ 4Ø,3�—‘˜gŸj™jÑ)÷4à˜‰NˆIÜ�K‰KÐAÀ7Ç?Á?ÐSVÐTVÐCWÐY\Ô]à×'Ñ'¨!Ô+Ø×%Ñ%×,Ñ,Ø")§*¡*Ø&-×&>Ñ&>Ø#*×#6Ñ#6ñ.ð K^Ö^À3�sœG G¨x¸°uÐ-=Ó>Ñ>Ò^ð	.ð
 +2×*DÑ*DØ)0×)BÑ)Bò.ö ð]5	ðl 	×ÑÐ-EÐÔFØÐøôw ò 	Ùð	ú÷Kñ Küò6 \÷4ð 4üò _s5   ª%L ÂL!ÆL.È+L3ËL?Ì	LÌLÌ!L+	Ì3L<	)N)Ú__name__Ú
__module__Ú__qualname__r   r   r   Ústrr   r4   Úintr]   rI   ó    r   r	   r	      s0   „ ñR¨x¸¸TÀ#ÀsÀ(¹^Ñ8LÑ/Mó Rð<H¨ô Hrc   r	   )Ú__doc__rK   ÚloggingrS   Útypingr   r   r   r   Úagent.redactr   Ú	getLoggerr,   r	   rI   rc   r   ú<module>ri      s9   ðÙ Cã Û Û ß ,Ó ,å .à	ˆ×	Ñ	Ð3Ó	4€÷iò irc   