+
    jHàjG  ã                  óî   € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RI	t	]P                  ! ]4      tR R ltR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 ltR R ltR R ltR# )zIConservative recovery of the one router recorded by this managed runtime.)ÚannotationsN)ÚPathc               ó   € V ^8„  d   QhRR/# )é   ÚreturnÚdict© )Úformats   "ÚF/home/ubuntu/.hermes/hermes-agent/hermes_cli/local_runtime/recovery.pyÚ__annotate__r      s   € ÷ ñ �Dñ ó    c                 óÌ   € ^ RI Hp   \        P                  ! V ! 4       P	                  RR7      4      p\        V\        4      '       d   V# / #   \        \        3 d    / u # i ; i)é    ©Ú
state_pathú	utf-8-sig©Úencoding)	Ú#hermes_cli.local_runtime.supervisorr   ÚjsonÚloadsÚ	read_textÚ
isinstancer   ÚOSErrorÚ
ValueError)r   Ústates     r
   Ú
read_stater      sX   € Ý>ðÜ—
’
™:›<×1Ñ1¸;Ð1ÓGÓHˆÜ" 5¬$×/Ò/ˆuÐ7°RÐ7øÜ”ZÐ ô ØŠ	ðús   ˆAA ÁA ÁA#Á"A#c               ó    € V ^8„  d   QhRRRR/# ©r   r   r   r   Úboolr   )r	   s   "r
   r   r      s   € ÷ 7ñ 7�Tð 7˜dñ 7r   c                óˆ   a € \         ;QJ d#    V 3R  l\         4       F  '       g   K   R# 	  R# ! V 3R  l\         4       4      # )c              3  ó,   <"  € T F	  qS9   x € K  	  R # 5i)Nr   )Ú.0Úkeyr   s   & €r
   Ú	<genexpr>Úis_modern.<locals>.<genexpr>   s   øé € Ð6¡~ �eŽ|£~ùs   ƒTF)ÚanyÚ_MODERN_FIELDS)r   s   fr
   Ú	is_modernr(      s,   ø€ ß‹3Ô6¥~Ó6�3Œ3Ð6Š3Ð6ˆ3Ô6¥~Ó6Ó6Ð6r   c               ó   € V ^8„  d   QhRR/# ©r   r   r   r   )r	   s   "r
   r   r       s   € ÷ ,ñ ,˜ñ ,r   c                ó>   € \        V 4      \        J ;'       d    V ^ 8„  # ©r   )ÚtypeÚint©Úvalues   &r
   Ú
_valid_pidr1       s   € Ü�‹;œ#Ð×+Ð+ %¨!¡)Ð+r   c               ó   € V ^8„  d   QhRR/# r*   r   )r	   s   "r
   r   r   $   s   € ÷ Nñ N˜4ñ Nr   c                óˆ   € \        V 4      \        \        39   ;'       d$    \        P                  ! V 4      ;'       d    V ^ 8„  # r,   )r-   r.   ÚfloatÚmathÚisfiniter/   s   &r
   Ú_valid_birthr7   $   s2   € Ü�‹;œ3¤˜,Ñ&×MÐM¬4¯=ª=¸Ó+?×MÐMÀEÈAÁIÐMr   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r   r   ÚprefixÚstrr   r   r   )r	   s   "r
   r   r   (   s&   € ÷ 
Tñ 
T˜Tð 
T¨3ð 
T¸ñ 
Tr   c                óà   € ^ RI HpHp VP                  V R24      p\	        V4      '       g   V P                  4       W R2,          8H  # V! V P                  4      pVRJ;'       d	    V! WV4      # )a  Linux derives psutil's create_time from /proc/stat's boot time, which moves whenever the
clock is stepped (WSL re-syncs within minutes), so a live process stops matching its record.
The start_time fingerprint is boot-relative there; create_time is for records that predate it.)Úget_process_start_timeÚstart_time_fingerprints_matchÚ
start_timeÚcreate_timeN)Úgateway.statusr<   r=   Úgetr7   r?   Úpid)Úprocr   r9   r<   r=   ÚrecordedÚcurrents   &&&    r
   Ú_same_birthrF   (   sm   € ÷ Uà�y‰y˜F˜8 :Ð.Ó/€HÜ˜×!Ò!Ø×ÑÓ! U¨X°[Ð+AÕ%BÑBÐBÙ$ T§X¡XÓ.€GØ˜$Ð×SÐSÑ#@ÀÓ#SÐSr   c               ó   € V ^8„  d   QhRR/# ©r   r   r   r   )r	   s   "r
   r   r   5   s   € ÷ ñ ˜Dñ r   c                óŠ  €  V R,          V R,          r!V R,          V R,          rCV R,          p\        V4      '       dX   \        V4      '       dG   \        V4      '       d6   \        V4      '       d%   WB8”  g   \        V\        4      '       d	   V'       g   R# \        P
                  ! V4      pVP                  4       '       d9   \        W`4      '       d(   \        VP                  4       4      \        V4      8w  d   R# \        P                  R8X  d   VP                  4       V8w  d   R# VP                  4       pVeQ   VP                  V8X  d   \        WpR4      '       g   R#  V# \        P                  R8X  g   \        V 4      '       g   R# V#   \         \"        \$        \&        \(        \        P*                  3 d     R# i ; i)	z@Match a modern process incarnation, never just its reusable PID.rB   r?   Ú	owner_pidÚowner_create_timeÚ
executableNÚntÚowner_)r1   r7   r   r:   ÚpsutilÚProcessÚ
is_runningrF   r   ÚexeÚosÚnameÚppidÚparentrB   Ú_owner_is_deadÚKeyErrorÚ	TypeErrorr   ÚOverflowErrorr   ÚError)r   rB   ÚcreatedrJ   Úowner_createdrR   rC   rV   s   &       r
   Úrecorded_processr^   5   sG  € ðØ˜U•| U¨=Õ%9ˆWØ#(¨Õ#5°uÐ=PÕ7Q�=Ø�LÕ!ˆÜ˜3—’¤|°G×'<Ò'<Ü! )×,Ò,´LÀ×4OÒ4OØ Ô*´*¸SÄ#×2FÒ2FÏcÙÜ�~Š~˜cÓ"ˆØ—‘×!Ò!¬°T×)AÒ)AÜ˜Ÿ™›
Ó#¤t¨C£yÔ0Ùä�7‰7�dŒ?˜tŸy™y›{¨iÔ7ÙØ—‘“ˆØÒØ�z‰z˜YÔ&Ü" 6°(×;Ò;Ùð <ð ˆô —‘˜D”¬°u×(=Ò(=ÙØˆøÜ”i¤¬]¼GÄVÇ\Á\ÐRô Úðús<   ‚BF Â+F Ã8F Ã=*F Ä)7F Å"F Å%&F ÆF Æ/GÇGc               ó    € V ^8„  d   QhRRRR/# r   r   )r	   s   "r
   r   r   R   s   € ÷ ñ ˜$ð  4ñ r   c                óø  €  V R ,          V R,          r!\        V4      '       d   \        V4      '       g   R#  \        P                  ! V4      pVP	                  4       '       g   R# \        V P                  R4      4      '       d   \        W0R4      '       * # VP                  4       V8„  #   \        P                   d     R# i ; i  \        \        \        \        \        \        P                  3 d     R# i ; i)rJ   rK   FTÚowner_start_timerN   )r1   r7   rO   rP   rQ   rA   rF   r?   ÚNoSuchProcessrX   rY   r   rZ   r   r[   )r   rB   r\   Úowners   &   r
   rW   rW   R   sÉ   € ðØ˜[Õ)¨5Ð1DÕ+EˆWÜ˜#�Š¤l°7×&;Ò&;Ùð
	Ü—N’N 3Ó'ˆEØ×#Ñ#×%Ò%ÙÜ˜EŸI™IÐ&8Ó9×:Ò:Ü& u°XÓ>Ô>Ð>ð ×$Ñ$Ó&¨Ñ0Ð0øÜ×#Ñ#ô 	Úð	ûä”i¤¬]¼GÄVÇ\Á\ÐRô Úðús:   ‚3C ¸+B* Á&0B* ÂB* Â*CÂ?C ÃCÃC Ã/C9Ã8C9c               ó   € V ^8„  d   QhRR/# rH   r   )r	   s   "r
   r   r   f   s   € ÷ -ñ - 4ñ -r   c                óH  a€ ^ RI Hp ^ RIHp ^ RIHp \        V 4      '       d   R#  \        V R,          4      '       g   R# \        P                  ! V R,          4      pV! 4       P                  p\        VP                  4       4      pVP                  V4       VP                  P                  4       R9  d   R# VP!                  4       V! 4       P#                  4       P$                  8”  d   R# V! V R,          4      pVP&                  R8w  g3   VP(                  R8w  g"   VP*                  '       d   V R	,          '       g   R# VP-                  4       oV3R
 lpV! R4      R8w  g5   V! R4      \/        VP*                  4      8w  g   V! R4      V R	,          8w  d   R# V! R4      V! R4      r©V	'       d   \        V	4      VR,          8X  d   V
e$   V
'       d   \        V
4      V! 4       8X  d   V	e   R# V#   \0        \2        \4        \6        \        P8                  3 d     R# i ; i)ai  Match an older record only to the managed binary and its exact launch arguments.

Legacy records lack process birth identity. A live PID alone is not evidence because the OS
can reuse it after llama-server exits. The executable location, state-file age, endpoint key,
and launch arguments together keep old records usable without adopting an unrelated process.
)Úurlsplit)Ú
models_dirr   NrB   Úbase_urlÚhttpz	127.0.0.1Úapi_keyc                óš   <€ SP                  V 4      ^8w  d   R# SP                  V 4      ^,           pV\        S4      8  d
   SV,          # R# )é   N)ÚcountÚindexÚlen)Úflagrn   Úargvs   & €r
   r0   Ú&legacy_recorded_process.<locals>.value„   sD   ø€ Ø�z‰z˜$Ó 1Ô$ÙØ—J‘J˜tÓ$ qÕ(ˆEØ"'¬#¨d«)Ô"3�4˜•;Ð=¸Ð=r   z--hostz--portz	--api-keyz--models-presetz--models-dirzpresets.ini)zllama-serverúllama-server.exe)Úurllib.parserf   Ú"hermes_cli.local_runtime.bootstraprg   r   r   r(   r1   rO   rP   rV   r   rR   Úrelative_torT   Úlowerr?   ÚstatÚst_mtimeÚschemeÚhostnameÚportÚcmdliner:   rX   rY   r   r   r[   )r   rf   rg   r   rC   ÚrootrR   Úurlr0   ÚpresetÚ	directoryrq   s   &          @r
   Úlegacy_recorded_processr‚   f   s–  ø€ õ &Ý=Ý>ô �×ÒÙðÜ˜% �,×'Ò'ÙÜ�~Š~˜e E�lÓ+ˆÙ‹|×"Ñ"ˆÜ�4—8‘8“:ÓˆØ�‰˜ÔØ�8‰8�>‰>ÓÐ#GÔGÙØ×ÑÓ¡
£× 1Ñ 1Ó 3× <Ñ <Ô<ÙÙ�u˜ZÕ(Ó)ˆØ�:‰:˜Ô 3§<¡<°;Ô#>ÀcÇhÇhÀhÐV[Ð\e×VfÔVfÙØ�|‰|‹~ˆõ	>ñ �(‹O˜{Ô*©e°H«oÄÀSÇXÁXÃÔ.NÙ˜Ó%¨¨yÕ)9Ô9ÙÙ!Ð"3Ó4±e¸NÓ6K�	ßœD ›L¨D°=Õ,@Ô@ÀYÒEVß¤$ y£/±Z³\Ô"AÀfÂnÙØˆøÜ”i¤¬W´f·l±lÐCô ÚðúsD   ¨G3 ÁA7G3 Â;2G3 Ã/AG3 Ä2G3 ÅAG3 Æ9G3 ÇG3 Ç1G3 Ç3*H!È H!c               ó   € V ^8„  d   QhRR/# rH   r   )r	   s   "r
   r   r   –   s   € ÷ ñ  $ñ r   c                óÞ  € ^ RI Hp \        P                  R8w  d   R# \	        V 4      pVf   R#  \        VP                  4       4      P                  V! 4       P                  4      p\        VP                  4      ^8w  g    VP                  P                  4       R8w  d   R# VP                  4       f   VP                  4       ^ 8:  d   R# V#   \        \        P                  3 d     R# i ; i)zLWindows-only legacy stop recovery after the process identity is established.r   rM   Nrs   )r   r   rS   rT   r‚   r   rR   rv   rV   ro   Úpartsrw   rU   r   rO   r[   )r   r   rC   Úrelatives   &   r
   Ú_legacy_orphan_processr‡   –   s²   € å>ä	‡w�w�$„ÙÜ" 5Ó)€DØ‚|ÙðÜ˜Ÿ™›
Ó#×/Ñ/±
³×0CÑ0CÓDˆÜˆx�~‰~Ó !Ô# x§}¡}×':Ñ':Ó'<Ð@RÔ'RÙØ�;‰;‹=Ò$¨¯	©	«°qÔ(8ÙØˆøÜ”V—\‘\Ð"ô Úðús   °A0C Â"'C ÃC ÃC,Ã+C,c               ó   € V ^8„  d   QhRR/# r*   r   )r	   s   "r
   r   r   ª   s   € ÷ ñ ˜dñ r   c                 ó@  € ^ RI Hp Hp  \        P                  ! V! 4       P                  RR7      4      p\        T\        4      '       d!   \        TP                  R4      4      '       g   R#  \        P                  ! TR,          4      '       g   R# \        T4      '       d$   \!        T4      pTe   \#        T4      '       g   R# M\%        T4      pTe&   \'        4       T8w  g   TP)                  4       '       g   R# T P+                  TRR7       TP-                  ^R7       \.        P1                  R	TP2                  4       R#   \         d     R# \        \        3 d     R# i ; i  \        \        P4                  3 d    \.        P7                  R
4        R# i ; i)zNExplicit user stop only. Refuse uncertain identity or a living recorded owner.)ÚLlamaServerSupervisorr   r   r   TFrB   )Úverified_root)Útimeoutz,stopped orphaned managed llama-server pid=%sz6could not verify or stop recorded managed llama-server)r   rŠ   r   r   r   r   ÚFileNotFoundErrorr   r   r   r   r1   rA   rO   Ú
pid_existsr(   r^   rW   r‡   r   rQ   Ú_terminate_treeÚwaitÚloggerÚinforB   r[   Úwarning)rŠ   r   r   rC   s       r
   Ústop_recorded_orphanr”   ª   sC  € çUðÜ—
’
™:›<×1Ñ1¸;Ð1ÓGÓHˆô
 �eœT×"Ò"¬*°U·Y±Y¸uÓ5E×*FÒ*FÙðÜ× Ò   u¥×.Ò.ÙÜ�U×ÒÜ# EÓ*ˆDØŠ|¤>°%×#8Ò#8Ùð $9ô *¨%Ó0ˆDØŠ<œ:›<¨5Ô0¸¿¹×8IÒ8IÙà×-Ñ-¨dÀ$Ð-ÔGØ�	‰	˜!ˆ	ÔÜ�‰ÐBÀDÇHÁHÔMÙøô+ ô ÚÜ”ZÐ ô Úðûô( ”V—\‘\Ð"ô Ü�‰ÐOÔPÚðúsB   Š+E Á."E) Â1E) Ã4E) Ã=AE) ÅE&ÅE&Å!E&Å%E&Å)0FÆF)r?   rL   rJ   rK   )Ú )Ú__doc__Ú
__future__r   r   Úloggingr5   rS   Úpathlibr   rO   Ú	getLoggerÚ__name__r‘   r   r'   r(   r1   r7   rF   r^   rW   r‚   r‡   r”   r   r   r
   Ú<module>rœ      sj   ðÙ OÝ "ã Û Û Û 	Ý ã à	×	Ò	˜8Ó	$€õð Q€õ7õ,õN÷
Tõõ:õ(-õ`÷(r   