§
    kÇjÈ  ã                  ó>   — d Z ddlmZ ddlZ G d„ d¦  «        ZdgZdS )uÄ  Per-agent iteration budget â€” thread-safe consume/refund counter.

Extracted from ``run_agent.py``.  Each ``AIAgent`` instance (parent or
subagent) holds an :class:`IterationBudget`; the parent's cap comes from
``max_iterations`` (default 90), each subagent's cap comes from
``delegation.max_iterations`` (default 50).

``run_agent`` re-exports ``IterationBudget`` so existing
``from run_agent import IterationBudget`` imports keep working unchanged.
é    )ÚannotationsNc                  óZ   — e Zd ZdZdd„Zdd„Zdd	„Zedd
„¦   «         Zedd„¦   «         Z	dS )ÚIterationBudgetua  Thread-safe iteration counter for an agent.

    Each agent (parent or subagent) gets its own ``IterationBudget``.
    The parent's budget is capped at ``max_iterations`` (default 90).
    Each subagent gets an independent budget capped at
    ``delegation.max_iterations`` (default 50) â€” this means total
    iterations across parent + subagents can exceed the parent's cap.
    Users control the per-subagent limit via ``delegation.max_iterations``
    in config.yaml.

    ``execute_code`` (programmatic tool calling) iterations are refunded via
    :meth:`refund` so they don't eat into the budget.
    Ú	max_totalÚintc                óR   — || _         d| _        t          j        ¦   «         | _        d S ©Nr   )r   Ú_usedÚ	threadingÚLockÚ_lock)Úselfr   s     ú</home/rurouni/.hermes/hermes-agent/agent/iteration_budget.pyÚ__init__zIterationBudget.__init__    s#   € Ø"ˆŒØˆŒ
Ý”^Ñ%Ô%ˆŒ
ˆ
ˆ
ó    ÚreturnÚboolc                ó¤   — | j         5  | j        | j        k    r	 ddd¦  «         dS | xj        dz  c_        	 ddd¦  «         dS # 1 swxY w Y   dS )z7Try to consume one iteration.  Returns True if allowed.NFé   T)r   r
   r   ©r   s    r   ÚconsumezIterationBudget.consume%   s¼   € àŒZð 	ð 	ØŒz˜Tœ^Ò+Ð+Øð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð ˆJŒJ˜!‰OˆJŒJØð		ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   ˆA§AÁA	ÁA	ÚNonec                ó|   — | j         5  | j        dk    r| xj        dz  c_        ddd¦  «         dS # 1 swxY w Y   dS )z6Give back one iteration (e.g. for execute_code turns).r   r   N©r   r
   r   s    r   ÚrefundzIterationBudget.refund-   sˆ   € àŒZð 	 ð 	 ØŒz˜AŠ~ˆ~Ø
”
˜a‘
”
ð	 ð 	 ð 	 ñ 	 ô 	 ð 	 ð 	 ð 	 ð 	 ð 	 ð 	 ð 	 øøøð 	 ð 	 ð 	 ð 	 ð 	 ð 	 s   ˆ1±5¸5c                óR   — | j         5  | j        cd d d ¦  «         S # 1 swxY w Y   d S )Nr   r   s    r   ÚusedzIterationBudget.used3   ss   € àŒZð 	ð 	Ø”:ð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   ˆœ £ c                ó~   — | j         5  t          d| j        | j        z
  ¦  «        cd d d ¦  «         S # 1 swxY w Y   d S r	   )r   Úmaxr   r
   r   s    r   Ú	remainingzIterationBudget.remaining8   s„   € àŒZð 	7ð 	7Ýq˜$œ.¨4¬:Ñ5Ñ6Ô6ð	7ð 	7ð 	7ð 	7ñ 	7ô 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7øøøð 	7ð 	7ð 	7ð 	7ð 	7ð 	7s   ˆ2²6¹6N)r   r   )r   r   )r   r   )r   r   )
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   Úpropertyr   r    © r   r   r   r      sš   € € € € € ðð ð&ð &ð &ð &ð
ð ð ð ð ð  ð  ð  ð ðð ð ñ „Xðð ð7ð 7ð 7ñ „Xð7ð 7ð 7r   r   )r$   Ú
__future__r   r   r   Ú__all__r&   r   r   ú<module>r)      sf   ðð	ð 	ð #Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð ð*7ð *7ð *7ð *7ð *7ñ *7ô *7ð *7ðZ Ð
€€€r   