+
    lHàjá!  ã                   ó~   € R t ^ RIt^ RIt^ RIt^ RIHtHtHtHt ^ RI	H
t
 ]P                  ! R4      t ! R R4      tR# )z=Running-process checkpoint persistence and PID-safe recovery.N)ÚAnyÚDictÚListÚOptional)Úredact_sensitive_textztools.process_registryc                   ól   a € ] tR t^t o V 3R lR ltRV 3R lR lltV 3R lR ltV 3R lR	 ltR
tV t	R# )ÚProcessCheckpointMixinc                óL   <€ V ^8„  d   QhRS[ S[,          RS[ S[,          RS[/# )é   ÚpidÚexpected_startÚreturn)r   ÚintÚstr)ÚformatÚ__classdict__s   "€ÚF/home/ubuntu/.hermes/hermes-agent/tools/process_registry_checkpoint.pyÚ__annotate__Ú#ProcessCheckpointMixin.__annotate__   s+   ø€ ÷ "ñ "¡x±¥}ð "ÁhÉsÅmð "ÑX[ñ "ó    c                ó   € \         h)z=Subclass supplies the live PID decision. See ProcessRegistry.)ÚNotImplementedError)Úselfr   r   s   &&&r   Ú_detached_host_fateÚ*ProcessCheckpointMixin._detached_host_fate   s   € ä!Ð!r   Nc                óV   <€ V ^8„  d   QhRS[ S[S[S[S[3,          ,          ,          /# )r
   Úextra_entries)r   ÚlistÚdictr   r   )r   r   s   "€r   r   r      s)   ø€ ÷ $Rñ $R©x¹¹TÁ#ÁsÀ(½^Õ8LÕ/Mñ $Rr   c                óº  a€ ^ RI HpHp  V P                  ;_uu_ 4        . pV P                  P                  4        Fß  pVP                  '       d   K  VP                  fD   VP                  R8X  d3   VP                  '       d!   V P                  VP                  4      Vn        RVP                  /V Uu/ uF  qf\        WV4      bK  	  upCp\        VP                  RR7      VR&   VP                  ;'       g    VP                   VR&   VP#                  V4       Ká  	  V'       d<   V Uu0 uF  qˆP%                  R4      kK  	  upoVP'                  V3R	 lV 4       4       0 V P                  mV P(                  mp	RRR4       ^ R
IHp
 ^ RIHp V! 4       pV
! VP3                  VP4                  R,           4      4      ;_uu_ 4        XP'                  V P7                  VX	4      4       V! WÄ4       RRR4       R# u upi u upi   + '       g   i     L‘; i  + '       g   i     R# ; i  \8         d$   p\:        P=                  RTRR7        Rp?R# Rp?ii ; i)zAWrite running process metadata to the checkpoint file atomically.)Ú_checkpoint_pathÚ_CHECKPOINT_FIELDSNÚhostÚ
session_idT)Ú	code_fileÚcommandÚowner_task_idc              3   óV   <"  € T F  qP                  R 4      S9  g   K  Vx € K   	  R# 5i)r#   N)Úget)Ú.0ÚitemÚtracked_idss   & €r   Ú	<genexpr>Ú;ProcessCheckpointMixin._write_checkpoint.<locals>.<genexpr>,   s"   øé € Ð"o±M¨DÇXÁXÈlÓE[ÐcnÑEn§4¢4³Mùs   ƒ)Ÿ
))Ú	_FileLock)Úatomic_json_writez.lockz#Failed to write checkpoint file: %s)Úexc_info)Útools.process_registryr    r!   Ú_lockÚ_runningÚvaluesÚexitedÚhost_start_timeÚ	pid_scoper   Ú_safe_host_start_timeÚidÚgetattrr   r%   r&   Útask_idÚappendr(   ÚextendÚ	_finishedÚhermes_cli.active_sessionsr.   Úutilsr/   Ú	with_nameÚnameÚ_foreign_handoffsÚ	ExceptionÚloggerÚdebug)r   r   r    r!   ÚentriesÚsÚfÚentryr*   Úknownr.   r/   ÚpathÚer+   s   &&            @r   Ú_write_checkpointÚ(ProcessCheckpointMixin._write_checkpoint   sÐ  ø€ çOð 	RØ——“Ø�ØŸ™×-Ñ-Ö/�AØ—x—x�xÙ ð ×(Ñ(Ò0°Q·[±[ÀFÔ5JÈqÏuÏuÈuØ,0×,FÑ,FÀqÇuÁuÓ,M˜Ô)Ø)¨1¯4©4ÐbÑN`Ó3aÑN`È´w¸q³}Ò4DÑN`Ñ3aÐb�Eô
 (=¸Q¿Y¹YÐRVÔ'W�E˜)Ñ$Ø-.¯_©_×-IÐ-IÀÇ	Á	�E˜/Ñ*Ø—N‘N 5Ö)ñ 0÷ !ÙFMÓ"NÁg¸d§8¡8¨LÖ#9ÁgÑ"N�KØ—N‘NÔ"o±MÓ"oÔoØ9˜$Ÿ-™-Ð9¨$¯.©.Ð9�÷) õ* =Ý/Ù#Ó%ˆDñ ˜4Ÿ>™>¨$¯)©)°gÕ*=Ó>×?Õ?Ø—‘˜t×5Ñ5°d¸EÓBÔCÙ! $Ô0÷ @Ñ?ùò% 4bùò #O÷% —ú÷6 @×?Ð?ûô ô 	RÜ�L‰LÐ>ÀÈDˆL×QÒQûð	Rús~   ‹H, ŸA$HÂ1HÂ5G;Ã	0HÃ:,HÄ'HÄ+H Å8HÅ<AH, Ç*HÇ1H, Ç;
HÈH	ÈH, ÈH)	È#H, È)H, È,IÈ7IÉIc                óF   <€ V ^8„  d   QhRS[ S[S[S[3,          ,          /# ©r
   r   )r   r   r   r   )r   r   s   "€r   r   r   :   s$   ø€ ÷ Sñ S±±T¹#¹s¸(µ^Õ0Dñ Sr   c           	     óP  € ^ RI Hp ^ RIHpHp  \
        P                  ! VP                  RR7      4      pT Uu. uFÇ  p\        T\        4      '       g   K  TP                  R4      T9  g   K3  T! TP                  R4      4      ;p'       g   KT  T! T4      P                  4       '       g   Kr  T! T4      P                  4       '       g8   T P                  TP                  R4      TP                  R4      4      R	8X  g   KÅ  TNKÉ  	  up#   \        \        3 d    . u # i ; iu upi )
zªOn-disk worker handoffs this registry never tracked whose log still decides an outcome:
the process is alive (same start time) or its recorded exit is waiting to be read.)ÚPath)Ú
_exit_pathÚadoptable_logú	utf-8-sig©Úencodingr#   Ú
output_logr   r6   Úrunning)ÚpathlibrS   Ú!tools.process_registry_output_logrT   rU   ÚjsonÚloadsÚ	read_textÚOSErrorÚ
ValueErrorÚ
isinstancer   r(   Úexistsr   )	r   rL   rK   rS   rT   rU   Úon_diskrJ   Úlogs	   &&&      r   rC   Ú(ProcessCheckpointMixin._foreign_handoffs:   s  € õ 	!ßOð	Ü—j’j §¡¸ Ó!EÓFˆGñ $+ó S¡7˜%¬j¸Ä×.E”È%Ï)É)ÐT`ÓJaÐinÑJn”Ù)¨%¯)©)°LÓ*AÓBÐB�SÓBô ÙHLÈSË	×HXÑHX×HZô á “_×+Ñ+×-Ò-°×1IÑ1IØ—I‘I˜eÓ$ e§i¡iÐ0AÓ&Bó2DØGPñ2Q÷ �¡7ñ Sð 	Søô œÐ$ô 	ØŠIð	üòSs:   �&D
 ºD#ÁD#Á/D#ÂD#Â.D#Ã
2D#ÄD#Ä
D ÄD c                ó    <€ V ^8„  d   QhRS[ /# rQ   )r   )r   r   s   "€r   r   r   H   s   ø€ ÷ Wñ W©ñ Wr   c                ó6  € ^ RI HpHpHpHpHpHp ^ RIHp V! 4       pVP                  4       '       g   ^ #  \        P                  ! VP                  RR7      4      p	^ p
. pT	 EF[  pTP                  R4      TP                  RR4      ríT'       g   K0  T P                  ;_uu_ 4        TP                  R4      T P                   9   pR	R	R	4       X'       d   Ku  TR8w  d1   \"        P%                  R
TP                  RR4      R,          YÞ4       K¬  T P'                  YÜP                  R4      4      pT! TP                  R4      4      pT'       d   RpTR8X  d+   \"        P%                  RTP                  RR4      T4       EK  TR8w  dT   TP                  RR4      pT'       d7   T! T4      '       g)   \"        P)                  RTT4       TP+                  T4       EKx  T Uu/ uF  pTTP                  TTT,          4      bK  	  ppTP-                  TP                  RR4      TP                  RR4      ;'       g    TP                  RR4      TP                  R\.        P.                  ! 4       4      R7       TTR&   T! R&RTR,          RR/TB pTP0                  '       d,   T P3                  TT P4                  RTP6                   24       M6T P                  ;_uu_ 4        TT P                   TP6                  &   R	R	R	4       T
^,          p
\"        P%                  RTP8                  R,          T4       TP:                  ^ 8”  g   EKâ  T P<                  P+                  RTP6                  R TP:                  R!TP>                  /T Uu/ uF  pT\A        TR"T 24      bK  	  upCR#TPB                  R$TPD                  /C4       EK^  	  T PG                  TR%7       T
#   \         d     ^ # i ; i  + '       g   i     EL,; iu upi   + '       g   i     EL; iu upi )'znOn gateway startup, probe PIDs from the checkpoint file; returns how many
were recovered as detached sessions.)ÚProcessSessionr!   r    Ú_CHECKPOINT_DEFAULTSÚ_WATCHER_ROUTE_KEYSÚ_stop_systemd_unit)rU   rV   rW   r   r7   r"   r#   Nz=Skipping recovery for non-host process: %s (pid=%s, scope=%s)r%   Úunknown:Né<   Nr6   rY   rZ   ÚreuseduŸ   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 or signal 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&   rs   r9   ÚdetachedTzproc-log-reader-z'Recovered detached process: %s (pid=%d)Úcheck_intervalÚsession_keyÚwatcher_Únotify_on_completeÚparent_session_id)r   © )$r1   ri   r!   r    rj   rk   rl   r\   rU   rc   r]   r^   r_   rD   r(   r2   r3   rE   Úinfor   Úwarningr<   ÚupdateÚtimerY   Ú_track_startedÚ_log_reader_loopr9   r%   Úwatcher_intervalÚpending_watchersrv   r:   rx   ry   rN   )r   ri   r!   r    rj   rk   rl   rU   Úcheckpoint_pathrG   Ú	recoveredÚunresolved_scope_entriesrJ   r   r7   Úalready_trackedÚfatere   rq   rI   ÚfieldsÚsessionÚkeys   &                      r   Úrecover_from_checkpointÚ.ProcessCheckpointMixin.recover_from_checkpointH   s¤  € ÷	
÷ 	
õ 	Dá*Ó,ˆØ×%Ñ%×'Ò'Ùð	Ü—j’j ×!:Ñ!:ÀKÐ!:Ó!PÓQˆGð ˆ	Ø9;Ð ÜˆEØ"ŸY™Y uÓ-¨u¯y©y¸ÀfÓ/M�ßÙð ——“Ø"'§)¡)¨LÓ"9¸T¿]¹]Ñ"J�÷ çÙØ˜FÔ"Ü—‘ØSØ—I‘I˜i¨Ó3°CÕ8¸#ôJñ ð ×+Ñ+¨C·±Ð;LÓ1MÓNˆDñ   §	¡	¨,Ó 7Ó8ˆCßØ �Ø�xÔÜ—‘ðLð —I‘I˜l¨CÓ0°#ô	7ò
 Ø�yÔ Ø$Ÿy™y¨¸Ó<�ßÑ(:¸<×(HÒ(HÜ—N‘NðJà$ cô+ð -×3Ñ3°EÔ:ÚÙHZÓ[ÑHZÀ1�a˜Ÿ™ 1Ð&:¸1Õ&=Ó>Ò>ÑHZˆFÐ[Ø�M‰MØŸ	™	 )¨YÓ7Ø#Ÿi™i¨¸Ó<×XÐXÀÇ	Á	È)ÐUWÓ@XØ Ÿ9™9 \´4·9²9³;Ó?ð ô Að $'ˆF�<Ñ Ù$ÑU¨¨lÕ(;ÐUÀdÐUÈfÑUˆGØ×!×!Ð!Ø×#Ñ# G¨T×-BÑ-BÐFVÐW^×WaÑWaÐVbÐDcÕdà—Z—Z“ZØ07�D—M‘M '§*¡*Ñ-÷  à˜�NˆIÜ�K‰KÐAÀ7Ç?Á?ÐSVÕCWÐY\Ô]à×'Ñ'¨!×+Ø×%Ñ%×,Ñ,Ø  '§*¡*Ø$ g×&>Ñ&>Ø! 7×#6Ñ#6ð.ñ K^Ó^ÑJ]À3�sœG G¨x¸°uÐ-=Ó>Ò>ÑJ]Ñ^ð	.ð
 )¨'×*DÑ*DØ'¨×)BÑ)Bñ.÷ ñy ðH 	×ÑÐ-EÐÔFØÐøôS ô 	Úð	ú÷ —�üòH \÷  —Z�Züò _s5   ·&O Â'O)Ç#O=ËPÎPÏO&Ï%O&Ï)O:ÐPrz   )N)
Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   rN   rC   r‹   Ú__static_attributes__Ú__classdictcell__)r   s   @r   r   r      s4   ø‡ € ÷"ð "÷$Rò $R÷LSð S÷Wö Wr   r   )Ú__doc__r]   Úloggingr~   Útypingr   r   r   r   Úagent.redactr   Ú	getLoggerrE   r   rz   r   r   Ú<module>r˜      s7   ðÙ Cã Û Û ß ,Ó ,å .à	×	Ò	Ð3Ó	4€÷Ró Rr   