+
    lHàj  ã                   óV   € R t ^ RIt^ RIt^ RIHt RRRRRRR	R
RRRR/t ! R R4      tR# )zõOpt-in interrupt/poll tracing for ``BaseEnvironment._wait_for_process``
(``HERMES_DEBUG_INTERRUPT=1``): loop entry/exit, interrupt/timeout detection and ~30s
heartbeats so "agent never sees the interrupt" reports can be diagnosed from agent.log.N)Úis_interruptedÚENTERz/timeout=%ss activity_cb=%s initial_interrupt=%súINTERRUPT DETECTEDu/   iter=%d elapsed=%.1fs â€” killing process groupÚTIMEOUTziter=%d timeout=%ssÚ	HEARTBEATz3iter=%d elapsed=%.0fs interrupt=%s activity_cb=%s%sÚEXCEPTION_EXITuB   iter=%d elapsed=%.1fs â€” killing subprocess group before re-raiseúEXIT (natural)z#iter=%d elapsed=%.1fs returncode=%sc                   óÆ   a € ] tR t^t o RtV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR	 ltV 3R
 lR lt	V 3R lR lt
V 3R lR ltV 3R lR ltV 3R lR ltRtV tR# )Ú
_WaitTracezBPer-wait debug tracer; every method is a no-op unless ``enabled``.c                ó    <€ V ^8„  d   QhRS[ /# )é   Úenabled)Úbool)ÚformatÚ__classdict__s   "€ÚA/home/ubuntu/.hermes/hermes-agent/tools/environments/base_wait.pyÚ__annotate__Ú_WaitTrace.__annotate__   s   ø€ ÷ <ñ <±$ñ <ó    c               ó4  € W0n         ^ V n        V'       g   R# ^ RIHp WTVuV n        V n        V n        \        P                  ! 4       P                  V n
        \        VRR4      V n        \        P                  ! 4       ;V n        V n        V! 4       RJ V n        R# )é    N)Úget_activity_callbackÚpid)r   Ú
iterationsÚtools.environments.baser   Ú_get_cbÚ_logÚ_timeoutÚ	threadingÚcurrent_threadÚidentÚ_tidÚgetattrÚ_pidÚtimeÚ	monotonicÚ_startÚ_last_heartbeatÚ_cb_was_none)ÚselfÚprocÚtimeoutr   Úloggerr   s   &&&$$ r   Ú__init__Ú_WaitTrace.__init__   sx   € ØŒØˆŒßÙÝAà1FÐPWÐ.ˆŒ�d”i ¤Ü×,Ò,Ó.×4Ñ4ˆŒ	Ü˜D %¨Ó.ˆŒ	Ü-1¯^ª^Ó-=Ð=ˆŒ�dÔ*Ù1Ó3°tÐ;ˆÖr   c                ó$   <€ V ^8„  d   QhRS[ RR/# )r   ÚeventÚreturnN)Ústr)r   r   s   "€r   r   r   #   s   ø€ ÷ 0ñ 0™3ð 0¨$ñ 0r   c                ó’   € V P                   P                  ! R \        V,          ,           WP                  V P                  .VO5!   R# )z5[interrupt-debug] _wait_for_process %s tid=%s pid=%s N)r   ÚinfoÚ_FMTr!   r#   )r)   r0   Úargss   &&*r   Ú_emitÚ_WaitTrace._emit#   s3   € Ø�	‰	�ŠØCÄdÈ5ÅkÕQØ—9‘9˜dŸi™ið	0à*.ö	0r   c                ó    <€ V ^8„  d   QhRS[ /# )r   r1   )Úfloat)r   r   s   "€r   r   r   (   s   ø€ ÷ .ñ .™%ñ .r   c                óN   € \         P                  ! 4       V P                  ,
          # )N)r$   r%   r&   ©r)   s   &r   Ú_elapsedÚ_WaitTrace._elapsed(   s   € Ü�~Š~Ó $§+¡+Õ-Ð-r   c                ó   <€ V ^8„  d   QhRR/# ©r   r1   N© )r   r   s   "€r   r   r   +   s   ø€ ÷ Xñ X�tñ Xr   c                ó¢   € V P                   '       d=   T P                  R V P                  V P                  '       g   RMR\	        4       4       R# R# )r   ÚsetÚMISSINGN)r   r7   r   r(   r   r<   s   &r   ÚenterÚ_WaitTrace.enter+   s:   € Ø�<�<ˆ<Ø�J‰J�w §¡Ø$(×$5×$5Ð$5‘u¸9ÄnÓFVöXñ r   c                ó   <€ V ^8„  d   QhRR/# r@   rA   )r   r   s   "€r   r   r   0   s   ø€ ÷ Oñ O˜Tñ Or   c                ó„   € V P                   '       d.   V P                  R V P                  V P                  4       4       R# R# )r   N©r   r7   r   r=   r<   s   &r   ÚinterruptedÚ_WaitTrace.interrupted0   s+   € Ø�<�<ˆ<Ø�J‰JÐ+¨T¯_©_¸d¿m¹m»oÖNñ r   c                ó   <€ V ^8„  d   QhRR/# r@   rA   )r   r   s   "€r   r   r   4   s   ø€ ÷ Bñ B˜4ñ Br   c                ó|   € V P                   '       d*   V P                  R V P                  V P                  4       R# R# )r   N)r   r7   r   r   r<   s   &r   Ú	timed_outÚ_WaitTrace.timed_out4   s(   € Ø�<�<ˆ<Ø�J‰J�y $§/¡/°4·=±=ÖAñ r   c                ó   <€ V ^8„  d   QhRR/# r@   rA   )r   r   s   "€r   r   r   8   s   ø€ ÷ (ñ (˜4ñ (r   c                ó   € V P                   '       d,   \        P                  ! 4       V P                  ,
          R8  d   R# V P	                  4       RJ pT P                  RV P                  V P                  4       \        4       V'       g   RMRV'       d   V P                  '       g   RMR4       \        P                  ! 4       V n        Wn	        R# )z—Every ~30s: proves the loop is alive and reports whether the thread-local
activity callback got clobbered by nested tool calls / executor thread reuse.g      >@Nr   rC   rD   z (LOST during run)Ú )
r   r$   r%   r'   r   r7   r   r=   r   r(   )r)   Úcb_now_nones   & r   Ú	heartbeatÚ_WaitTrace.heartbeat8   s�   € ð �|�|ˆ|œtŸ~š~Ó/°$×2FÑ2FÕFÈÔMÙØ—l‘l“n¨Ð,ˆØ�
‰
Ø˜Ÿ™¨$¯-©-«/¼>Ó;Kß$‰E¨)ß$/¸×8I×8IÐ8IÑ Èrô	Sô  $Ÿ~š~Ó/ˆÔØ'Ör   c                ó   <€ V ^8„  d   QhRR/# r@   rA   )r   r   s   "€r   r   r   E   s   ø€ ÷ Kñ K ñ Kr   c                ó„   € V P                   '       d.   V P                  R V P                  V P                  4       4       R# R# )r   NrI   r<   s   &r   Úexception_exitÚ_WaitTrace.exception_exitE   s+   € Ø�<�<ˆ<Ø�J‰JÐ'¨¯©¸$¿-¹-»/ÖJñ r   c                ó   <€ V ^8„  d   QhRR/# r@   rA   )r   r   s   "€r   r   r   I   s   ø€ ÷ Wñ W¨$ñ Wr   c                ó†   € V P                   '       d/   V P                  R V P                  V P                  4       V4       R# R# )r   NrI   )r)   Ú
returncodes   &&r   Únatural_exitÚ_WaitTrace.natural_exitI   s-   € Ø�<�<ˆ<Ø�J‰JÐ'¨¯©¸$¿-¹-»/È:ÖVñ r   )
r(   r   r'   r   r#   r&   r!   r   r   r   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r-   r7   r=   rE   rJ   rN   rT   rX   r]   Ú__static_attributes__Ú__classdictcell__)r   s   @r   r
   r
      sl   ø‡ € ÙL÷<ð <÷0ð 0÷
.ð .÷Xð X÷
Oð O÷Bð B÷(ð (÷Kð K÷Wö Wr   r
   )rc   r   r$   Útools.interruptr   r5   r
   rA   r   r   Ú<module>rg      sO   ðñ[ó Û å *ð Ð>ØÐKØÐ$ØÐFØÐZØÐ;ð=€÷8Wó 8Wr   