
    iF                     n    d Z ddlZddlmZmZmZ ddlmZ ddlm	Z	 ddl
mZmZ ddlmZ  G d d	e      Zy)
zLoop timer guard node executor.    N)ListDictAny)Node)LoopTimerConfig)MessageMessageRole)NodeExecutorc                   h    e Zd ZdZdZdedee   dee   fdZde	e
e	e
ef   f   fdZded	e
defd
Zy)LoopTimerNodeExecutora  Track loop duration and emit output only after hitting the time limit.

    Supports two modes:
    1. Standard Mode (passthrough=False): Suppresses input until time limit, then emits message
    2. Terminal Gate Mode (passthrough=True): Acts as a sequential switch
       - Before limit: Pass input through unchanged
       - At limit: Emit configured message, suppress original input
       - After limit: Transparent gate, pass all subsequent messages through
    
loop_timernodeinputsreturnc           	         |j                  t              }|t        d|j                   d      | j	                         }|j                  |j                  i       }t        j                         }d|vr
||d<   d|d<   |d   }||z
  }| j                  |j                  |j                        }	||	k\  }
|j                  r |
s3| j                  j                  d|j                   d|dd	|	dd
       |S |d   sd|d<   |j                  r||d<   |j                  xs d|j                   d|j                   d}d||j                  |j                  |j                  ddi}| j                  j                  d|j                   d|dd	|	dd       t        t         j"                  ||      gS | j                  j                  d|j                   d|dd       |S |
s3| j                  j                  d|j                   d|dd	|	dd       g S |j                  r
|d   s||d<   d|d<   |j                  xs d|j                   d|j                   d}d||j                  |j                  |j                  ddi}| j                  j                  d|j                   d|dd	|	dd       t        t         j"                  ||      gS )NzNode z! missing loop_timer configuration
start_timeFemittedz
LoopTimer z: z.1fzs / z&s (passthrough mode: forwarding input)TzTime limit reached ( )r   )elapsed_timemax_durationduration_unitreset_on_emitpassthroughz,s (passthrough mode: emitting limit message))rolecontentmetadataz&s (passthrough mode: transparent gate)zs (suppress downstream)z!s reached limit, releasing output)	as_configr   
ValueErrorid
_get_state
setdefaulttime_convert_to_secondsr   r   r   log_managerdebugr   messager   r	   	ASSISTANT)selfr   r   configstatetimer_statecurrent_timer   r   max_duration_secondslimit_reachedr   r   s                V/Users/bowang/.openclaw/workspace/ChatDev/runtime/node/executor/loop_timer_executor.pyexecutezLoopTimerNodeExecutor.execute   sp   0>uTWWI-NOPP!&&tww3 yy{{*(4K%%*K	" .
#j0  $77!5!5 

 %(<<    && 	L+=TBVWZA[ \; <  +)-I&''0<K- NN \-f.A.A-B!FDXDXCYYZ[ 
 !(4(.(;(;)/)=)=)/)=)='+#   && 	L+=TBVWZA[ \A B (22 '!)    && 	L+==cd  ""TWWIRS'9>RSV=W X( ) II(>(4K%!%I NN T%f&9&9%:!F<P<P;QQRS 	
  , & 3 3!'!5!5!'!5!5$
 		L#5T:Ns9S T. /	
  **!
 	
    c                 b    | j                   j                  j                  | j                  i       S )N)contextglobal_stater"   	STATE_KEY)r)   s    r0   r!   z LoopTimerNodeExecutor._get_state   s#    ||((33DNNBGGr2   durationunitc                 8    dddd}||j                  |d      z  S )z*Convert duration to seconds based on unit.g      ?g      N@g      @)secondsminuteshours)get)r)   r7   r8   unit_multiplierss       r0   r$   z)LoopTimerNodeExecutor._convert_to_seconds   s0     

 *..tS999r2   N)__name__
__module____qualname____doc__r6   r   r   r   r1   r   strr   r!   floatr$    r2   r0   r   r      so     Io
D o
$w- o
DM o
bHDd38n!45 H:E : : :r2   r   )rB   r#   typingr   r   r   entity.configsr   entity.configs.node.loop_timerr   entity.messagesr   r	   runtime.node.executor.baser
   r   rE   r2   r0   <module>rK      s+    %  " "  : 0 3H:L H:r2   