Ë
    ãß²j  ã                   óJ   — d Z ddlZddlZddlmZ dddddd	d
œZ G d„ d«      Zy)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_interruptedz/timeout=%ss activity_cb=%s initial_interrupt=%su/   iter=%d elapsed=%.1fs â€” killing process groupziter=%d timeout=%ssz3iter=%d elapsed=%.0fs interrupt=%s activity_cb=%s%suB   iter=%d elapsed=%.1fs â€” killing subprocess group before re-raisez#iter=%d elapsed=%.1fs returncode=%s)ÚENTERúINTERRUPT DETECTEDÚTIMEOUTÚ	HEARTBEATÚEXCEPTION_EXITúEXIT (natural)c                   óh   — e Zd ZdZdefd„Zdeddfd„Zdefd„Z	dd	„Z
dd
„Zdd„Zdd„Zdd„Zdd„Zy)Ú
_WaitTracezBPer-wait debug tracer; every method is a no-op unless ``enabled``.Úenabledc                ó$  — || _         d| _        |sy ddlm} |||c| _        | _        | _        t        j                  «       j                  | _
        t        |dd «      | _        t        j                  «       x| _        | _         |«       d u | _        y )Nr   )Ú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         úA/home/ubuntu/.hermes/hermes-agent/tools/environments/base_wait.pyÚ__init__z_WaitTrace.__init__   s|   € ØˆŒØˆŒÙØÝAà1FÈÐPWÐ.ˆŒ�d”i ¤Ü×,Ñ,Ó.×4Ñ4ˆŒ	Ü˜D %¨Ó.ˆŒ	Ü-1¯^©^Ó-=Ð=ˆŒ�dÔ*Ù1Ó3°tÐ;ˆÕó    ÚeventÚreturnNc                 ó€   —  | j                   j                  dt        |   z   || j                  | j                  g|¢­Ž  y )Nz5[interrupt-debug] _wait_for_process %s tid=%s pid=%s )r   ÚinfoÚ_FMTr   r   )r    r'   Úargss      r$   Ú_emitz_WaitTrace._emit#   s7   € Øˆ�	‰	�‰ØCÄdÈ5ÁkÑQØ�4—9‘9˜dŸi™ið	0à*.ô	0r&   c                 óD   — t        j                  «       | j                  z
  S )N)r   r   r   ©r    s    r$   Ú_elapsedz_WaitTrace._elapsed(   s   € Ü�~‰~Ó $§+¡+Ñ-Ð-r&   c                 ó†   — | j                   r5| j                  d| j                  | j                  sdndt	        «       «       y y )Nr   ÚsetÚMISSING)r   r-   r   r   r   r/   s    r$   Úenterz_WaitTrace.enter+   s5   € Ø�<Š<Ø�J‰J�w §¡Ø$(×$5Ò$5‘u¸9ÄnÓFVõXð r&   c                 ót   — | j                   r,| j                  d| j                  | j                  «       «       y y )Nr   ©r   r-   r   r0   r/   s    r$   Úinterruptedz_WaitTrace.interrupted0   s)   € Ø�<Š<Ø�J‰JÐ+¨T¯_©_¸d¿m¹m»oÕNð r&   c                 ól   — | j                   r(| j                  d| j                  | j                  «       y y )Nr   )r   r-   r   r   r/   s    r$   Ú	timed_outz_WaitTrace.timed_out4   s&   € Ø�<Š<Ø�J‰J�y $§/¡/°4·=±=ÕAð r&   c                 ó^  — | j                   r$t        j                  «       | j                  z
  dk  ry| j	                  «       du }| j                  d| j                  | j                  «       t        «       |sdnd|r| j                  sdnd«       t        j                  «       | _        || _	        y)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   r2   r3   z (LOST during run)Ú )
r   r   r   r   r   r-   r   r0   r   r   )r    Úcb_now_nones     r$   Ú	heartbeatz_WaitTrace.heartbeat8   sŠ   € ð �|Š|œtŸ~™~Ó/°$×2FÑ2FÑFÈÒMØØ—l‘l“n¨Ð,ˆØ�
‰
Ø˜Ÿ™¨$¯-©-«/¼>Ó;KÙ$‰E¨)Ù$/¸×8IÒ8IÑ Èrô	Sô  $Ÿ~™~Ó/ˆÔØ'ˆÕr&   c                 ót   — | j                   r,| j                  d| j                  | j                  «       «       y y )Nr   r6   r/   s    r$   Úexception_exitz_WaitTrace.exception_exitE   s)   € Ø�<Š<Ø�J‰JÐ'¨¯©¸$¿-¹-»/ÕJð r&   c                 óv   — | j                   r-| j                  d| j                  | j                  «       |«       y y )Nr	   r6   )r    Ú
returncodes     r$   Únatural_exitz_WaitTrace.natural_exitI   s+   € Ø�<Š<Ø�J‰JÐ'¨¯©¸$¿-¹-»/È:ÕVð r&   )r(   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úboolr%   Ústrr-   Úfloatr0   r4   r7   r9   r=   r?   rB   © r&   r$   r   r      sS   „ ÙLð<°$ó <ð0˜3ð 0¨$ó 0ð
.˜%ó .óXó
OóBó(óKôWr&   r   )rF   r   r   Útools.interruptr   r+   r   rJ   r&   r$   ú<module>rL      s=   ðñ[ó Û å *ð ?ØKØ$ØFØZØ;ñ=€÷8Wò 8Wr&   