Ë
    áß²j  ã                  óF   — d Z ddlmZ ddlZddlZdd„Z G d„ d«      ZdgZy)uO  Per-agent iteration budget â€” thread-safe consume/refund counter.

Each ``AIAgent`` (parent or subagent) holds its own :class:`IterationBudget`: the parent's
cap is ``max_iterations`` (default 500), each subagent's ``delegation.max_iterations``
(default 50), so total iterations across parent + subagents can exceed the parent's cap.
é    )ÚannotationsNc                ó´   — | �t        | t        «      ry	 t        | «      }t        j                  |«      rd|cxk  rdk  r|S  dS # t        t        f$ r Y yw xY w)zDA finite ratio strictly between zero and one, or None (feature off).Nr   é   )Ú
isinstanceÚboolÚfloatÚ	TypeErrorÚ
ValueErrorÚmathÚisfinite)ÚvalueÚratios     ú;/home/ubuntu/.hermes/hermes-agent/agent/iteration_budget.pyÚnormalize_budget_warning_ratior      s^   € à€}œ
 5¬$Ô/ØðÜ�e“ˆô —M‘M %Ô(¨Q°¬]¸ª]ˆ5ÐD¨]ÀÐDøô ”zÐ"ò Ùðús   •A ÁAÁAc                  óL   — e Zd ZdZdd„Zd	d„Zd
d„Zedd„«       Zedd„«       Z	y)ÚIterationBudgetz�Thread-safe iteration counter; ``execute_code`` (programmatic tool calling)
    iterations are refunded via :meth:`refund` so they don't eat into the budget.c                óR   — || _         d| _        t        j                  «       | _        y ©Nr   )Ú	max_totalÚ_usedÚ	threadingÚLockÚ_lock)Úselfr   s     r   Ú__init__zIterationBudget.__init__   s   € Ø"ˆŒØˆŒ
Ü—^‘^Ó%ˆ�
ó    c                ó¸   — | j                   5  | j                  | j                  k\  r
	 ddd«       y| xj                  dz  c_        	 ddd«       y# 1 sw Y   yxY w)z7Try to consume one iteration.  Returns True if allowed.NFr   T)r   r   r   ©r   s    r   ÚconsumezIterationBudget.consume"   sM   € à�Z‰Zñ 	Ø�z‰z˜TŸ^™^Ò+Ø÷	ð 	ð �JŠJ˜!‰O�JØ÷		÷ 	ñ 	ús   �A±AÁAc                óŽ   — | j                   5  | j                  dkD  r| xj                  dz  c_        ddd«       y# 1 sw Y   yxY w)z6Give back one iteration (e.g. for execute_code turns).r   r   N©r   r   r   s    r   ÚrefundzIterationBudget.refund*   s6   € à�Z‰Zñ 	 Ø�z‰z˜AŠ~Ø—
’
˜a‘•
÷	 ÷ 	 ñ 	 ús	   �%;»Ac                ó^   — | j                   5  | j                  cd d d «       S # 1 sw Y   y xY w)Nr!   r   s    r   ÚusedzIterationBudget.used0   s%   € à�Z‰Zñ 	Ø—:‘:÷	÷ 	ò 	ús   �#£,c                óŒ   — | j                   5  t        d| j                  | j                  z
  «      cd d d «       S # 1 sw Y   y xY wr   )r   Úmaxr   r   r   s    r   Ú	remainingzIterationBudget.remaining5   s5   € à�Z‰Zñ 	7Ü�q˜$Ÿ.™.¨4¯:©:Ñ5Ó6÷	7÷ 	7ò 	7ús	   �#:ºAN)r   Úint)Úreturnr   )r)   ÚNone)r)   r(   )
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r"   Úpropertyr$   r'   © r   r   r   r      s?   „ ñUó&ó
ó ð òó ðð ò7ó ñ7r   r   )r)   zfloat | None)r.   Ú
__future__r   r   r   r   r   Ú__all__r0   r   r   ú<module>r3      s0   ðñõ #ã Û óE÷7ñ 7ðD Ð
�r   