+
    iHàj¡n  ã                  óª  € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIHt ^ RIH	t	 ^ RI
HtHtHtHt ^ RIHt ^ RIHtHt ^ RIHt ^ R	IHt ]P0                  ! R
4      tR R ltRtR R lt]	 ! R R4      4       tR R ltRRRR/R R lltR R lt R R lt!]	 ! R R4      4       t"R R lt#]	 ! R  R!4      4       t$R" R# lt%]	 ! R$ R%4      4       t&R& R' lt'R# )(a¨  Outer-iteration bookkeeping for the conversation turn loop, in call order:
``begin_iteration`` (pending redirect, interrupt / review-budget / iteration-budget exits),
``prepare_iteration`` (``agent:step`` callback, skill-nudge counter, pre-API ``/steer`` drain as a
standalone user row after the newest tool result, run-budget wrap-up notice, tool_call
argument sanitization, interrupt-placeholder ghost-row neutralisation, role-alternation repair),
``announce_api_call`` (verbose summary / quiet spinner) and, after the retry loop,
``apply_retry_restarts`` (consumes the ``TurnRetryState`` restart flags). Nothing here
imports ``agent.conversation_loop`` at module level (cycle).)ÚannotationsN)Úsuppress)Ú	dataclass)ÚAnyÚDictÚListÚTuple)ÚKawaiiSpinner)Úinterrupt_issuerÚ"interrupted_during_api_call_reason)Ú	_reanchor)Úboosted_output_capzagent.conversation_loopc               ó(   € V ^8„  d   QhRRRRRRRR/# )é   Úmessagesr   ÚidxÚuser_messageÚreturnÚbool© )Úformats   "Ú>/home/ubuntu/.hermes/hermes-agent/agent/turn_iteration_prep.pyÚ__annotate__r      s.   € ÷ Dñ D Cð D¨cð DÀð DÈñ Dó    c                ób  € \        V\        4      '       d   ^ Tu;8:  d   \        V 4      8  g    R#  R# W,          p\        V\        4      '       d   VP	                  R4      R8X  g   R# VP	                  R4      V8X  d   R# ^ RIHp V! V4      pVRJ;'       d    VP	                  R4      V8H  # )z\True when ``messages[idx]`` is this turn's user row (verbatim, or its user-originated view).FÚroleÚuserÚcontentT)Úuser_originated_turn_viewN)Ú
isinstanceÚintÚlenÚdictÚgetÚagent.context_compressorr   )r   r   r   Úmsgr   Úviews   &&&   r   Ú_anchors_current_turnr'      s“   € ä�cœ3×Ò q¨CÖ'?´#°h³-Õ'?Ùð (@ÙØ
�-€CÜ�sœD×!Ò! c§g¡g¨f£o¸Ô&?ÙØ
‡w�wˆyÓ˜\Ô)ÙÝBá$ SÓ)€DØ�tÐ×CÐC §¡¨Ó 3°|Ñ CÐCr   uÂ   [SYSTEM NOTICE â€” iteration budget checkpoint] You have used {used} of {maximum} iterations. Checkpoint durable progress now, then continue the task; do not stop solely because of this warning.c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úagentr   r   r   r   r   )r   s   "r   r   r   0   s!   € ÷ 3ñ 3°#ð 3Àð 3Èñ 3r   c                óB  € ^ RI p^ RIHp \        V RR4      '       d   R# \        V RR4      p\	        VP
                  P                  R4      4      ;'       d     V! 4       ;'       d    R\        V RR4      9   pVf   V'       d   R	p\        V R
R4      pVe„   Ve€   VP                  ^8:  go   VP                  \        P                  8¼  gP   \        V RR4      '       g=   VP                  \        WFP                  ,          VP                  ^,
          4      8  d   R# \        P                  VP                  VP                  R7      pV'       d
   VR,          p^ RIHp V'       d<   VR,          P                  R4      R8w  g   VR,          P                  V4      '       d   R# VR,          p	V	P                  RR4      p
\!        V
\"        4      '       d   V
RV 2,           V	R&   M4\!        V
\$        4      '       g   V
f   . T
;'       g    . ORRRV/NV	R&   MR# RV n        R# )z=Append the opt-in one-shot warning to the newest tool result.N)Ú"is_dispatcher_owned_worker_contextÚ_interrupt_requestedFÚbudget_warning_ratioÚHERMES_KANBAN_TASKÚkanban_completeÚvalid_tool_namesgÍÌÌÌÌÌì?Úiteration_budgetÚ"_iteration_budget_warning_injected)ÚusedÚmaximuma   While tools are still available, call kanban_complete only if all task requirements are verified, or kanban_request_review if it is ready for review; otherwise persist a kanban_comment handoff and continue. A diff or commit alone is not completion evidence.)Ú_DB_PERSISTED_MARKERr   Útoolr   Ú z

ÚtypeÚtextTr   éÿÿÿÿ)ÚosÚagent.delegation_contextr+   Úgetattrr   Úenvironr#   Ú	max_totalÚsysÚmaxsizer3   ÚminÚ!ITERATION_BUDGET_WARNING_TEMPLATEr   r$   r5   r   ÚstrÚlistr2   )r)   r   r;   r+   ÚratioÚkanban_workerÚbudgetÚnoticer5   Úmessager   s   &&         r   Ú&_maybe_inject_iteration_budget_warningrK   0   så  € ãÝKô ˆuÐ,¨e×4Ò4Ùä�EÐ1°4Ó8€EäˆR�Z‰Z�^‰^Ð0Ó1Ó2÷ 	Hð 	HÙ.Ó0÷	Hð 	Hà¤¨Ð0BÀBÓ!GÑGð ð
 ‚}ŸØˆÜ�UÐ.°Ó5€FàŠØŠ>Ø×Ñ˜qÔ Ø×ÑœsŸ{™{Ô*Ü�5Ð>À×FÒFØ�;‰;œ˜U×%5Ñ%5Õ5°v×7GÑ7GÈ!Õ7KÓLÔLáÜ.×5Ñ5Ø�[‰[ &×"2Ñ"2ð 6ó €F÷ ØðKõ	
ˆõ >ß˜ �×(Ñ(¨Ó0°FÔ:Ø˜�|×ÑÐ 4×5Ò5ÙØ�r�l€GØ�k‰k˜) RÓ(€GÜ�'œ3×ÒØ$¨¨f¨X Õ6ˆ�	ÒÜ	�GœT×	"Ò	" g¢oØQ § ¨2ÐQ°¸ÀÈÐ0PÐQˆ�	ÒáØ/3€EÔ,Ùr   c                  óD   € ] tR t^ft$ RtR]R&   R]R&   R]R&   R]R&   RtR	# )
ÚIterationPrepzœAlways ``action == "fallthrough"``. ``messages`` is the (possibly filtered) transcript
and ``request_logger`` the per-request logger the caller keeps using.rD   Úactionr   r   Úrequest_loggerÚcurrent_turn_user_idxr   N©Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__annotations__Ú__static_attributes__r   r   r   rM   rM   f   s    ‡ ñMð ƒKØƒMØÓØ×r   rM   c               ó    € V ^8„  d   QhRRRR/# )r   Úseqzlist[dict[str, Any]]r   z tuple[list[dict[str, Any]], int]r   )r   s   "r   r   r   w   s   € ÷ 6ñ 6Ð(<ð 6ÐAañ 6r   c                ó„  aa€ ^ RI HpHp ^ RIHp W20o^ p. pV  F•  oSP                  R4      R8X  dl   SP                  R4      R8X  dV   \        ;QJ d     VV3R lR 4       F  '       g   K   R
M	  RM! VV3R lR 4       4      '       d   / SCRRR	V/CoV^,          pVP                  S4       K—  	  V'       d   WT3# T V3# )z@(new list, neutralised); never mutates ``seq`` or its row dicts.)Ú_INTERRUPTED_PLACEHOLDERÚ_LEGACY_INTERRUPTED_PLACEHOLDER)Ú_INTERRUPT_SCAFFOLD_MARKERÚdisplay_kindÚhiddenr   Ú	assistantc              3  ó¦   <"  € T FF  p\        SP                  V4      \        4      ;'       d    SV,          P                  4       S9   x € KH  	  R # 5i)N)r   r#   rD   Ústrip)Ú.0ÚkÚhazardsÚms   & €€r   Ú	<genexpr>Ú1_neutralise_replay_echo_ghosts.<locals>.<genexpr>ˆ   s<   øé € ÐnÑSmÈa”J˜qŸu™u Q›x¬Ó-×IÐI°!°Aµ$·*±*³,À'Ñ2IÔIÓSmùs
   ƒ*A®#Ar   Úapi_contentTFr7   )r   rj   )Ú(agent.agent_runtime_helpers_placeholdersr\   r]   Úagent.conversation_loopr^   r#   ÚanyÚappend)rZ   r\   r]   r^   ÚneutralisedÚoutrf   rg   s   &     @@r   Ú_neutralise_replay_echo_ghostsrq   w   s±   ù€ ÷õ Cð
 *ÐK€GØ€KØ "€CÛˆà�E‰E�.Ó! XÔ-°!·%±%¸³-À;Ô2Nß“ÕnÑSmÓn——’ÕnÑSmÓn×nÒnàM�1ÐM�i  ]Ð4LÑMˆAØ˜1ÕˆKØ�
‰
�1Žñ ÷ ˆCÐ5Ð5 C¨+Ð5Ð5r   r   rP   c               ó0   € V ^8„  d   QhRRRRRRRRRRRR/# )	r   r)   r   r   Úapi_call_countr   rP   r   rM   r   )r   s   "r   r   r   �   sD   € ÷ rñ rØðrØ ðrØ25ðrØEHðrØhkðràñrr   c               óÀ  € ^ RI Hp \        V RR4      '       d   ^ RIHp V! V 4       V P
                  e    V P                  V\        V4      4       V P                  ^ 8”  d+   RV P                  9   d   V ;P                  ^,          un        V P                  4        V P                  4       pV'       d   \        WV4       \        V RR4      '       d	   V! W4       \!        W4       \        V RR4      ;'       g    \        p	\        V R	R4      p
V
f)   / p
\#        \        4      ;_uu_ 4        W n        RRR4       V P'                  WV P(                  V
R
7      pV^ 8”  d/   RV n        T	P-                  RTV P(                  ;'       g    R4       \/        V4      w  rV'       d'   T	P-                  RYÀP(                  ;'       g    R4       ^ RIHp V! W4      pV^ 8”  dg   T	P-                  RTV P(                  ;'       g    R4       Ve<   \5        WV4      pWô8w  d*   T	P-                  RYOV P(                  ;'       g    R4       TpVeH   \7        WV4      '       g6   \5        WV4      pT	P-                  RYOV P(                  ;'       g    R4       Tp\9        RWVR7      #   \         d"   p\        P                  RY'4        Rp?ELrRp?ii ; i  + '       g   i     EL¢; i)a#  Prepare ``messages`` for this iteration in the original order. Every mutation here is
cache-safe by construction: steer text is appended as a new (not yet persisted) user row, the ghost-row
filter neutralises copies of hidden interrupt placeholders, and repair runs BEFORE the request build.)Ú_maybe_inject_run_budget_wrapupÚ_nous_wire_pendingN)Úapply_pending_wire_switchz&step_callback error (iteration %s): %sÚskill_manageÚrun_budget_secondsÚloggerÚ_sanitize_args_cursor)rz   Ú
session_idÚcursorzFSanitized %s corrupted tool_call arguments before request (session=%s)Ú-zGNeutralised %d interrupt-placeholder row(s) before request (session=%s))Ú#repair_message_sequence_with_cursorzFRepaired %s message-alternation violations before request (session=%s)zPRe-anchored current_turn_user_idx %s -> %s after alternation repair (session=%s)z=Re-anchored stale current_turn_user_idx %s -> %s (session=%s)Úfallthrough)rN   r   rO   rP   )rl   ru   r=   Úagent.nous_wirerw   Ústep_callbackÚ_previous_tool_roundÚ	Exceptionrz   ÚdebugÚ_skill_nudge_intervalr0   Ú_iters_since_skillÚ_adopt_nous_key_before_expiryÚ_drain_pending_steerÚ&_inject_steer_after_newest_tool_resultrK   r   r{   Ú_sanitize_tool_call_argumentsr|   Ú_db_flush_scan_prefixÚinforq   Úagent.agent_runtime_helpersr   r   r'   rM   )r)   r   rs   r   rP   ru   rw   Ú	_step_errÚ_pre_api_steerrO   Ú_sanitize_cursorÚrepaired_tool_callsÚ_echo_neutralisedr   Úrepaired_seqÚ_reanchored_idxs   &$$$$           r   Úprepare_iterationr–   �   sÃ  € õ Hô ˆuÐ*¨D×1Ò1Ý=Ù! %Ô(ð ×ÑÒ&ð	^Ø×Ñ Ô0DÀXÓ0NÔOð
 ×"Ñ" QÔ&¨>¸U×=SÑ=SÔ+SØ× Ò  AÕ%Õ ð 
×'Ñ'Ô)ð ×/Ñ/Ó1€NßÜ.¨uÀÔOô ˆuÐ*¨D×1Ò1Ù'¨Ô8ô +¨5Ô;ä˜U H¨dÓ3×=Ð=´v€Nô ˜uÐ&=¸tÓDÐØÒØÐÜ”i× Õ Ø*:Ô'÷ !à×=Ñ=Ø°E×4DÑ4DÐM]ð >ó Ðð ˜QÔð '+ˆÔ#Ø×ÑØTØØ×Ñ×#Ð# ô	
ô #AÀÓ"JÑ€HßØ×ÑØUØ×/Ñ/×6Ð6°3ô	
õ PÙ6°uÓG€LØ�aÔØ×ÑØTØØ×Ñ×#Ð# ô	
ð Ò#Ü'¨¸ÓFˆOØÔ7Ø×#Ñ#ØfØ)¸E×<LÑ<L×<SÐ<SÐPSôð )8Ð%ð ÒÔ(=¸hÐ_k×(lÒ(lÜ# E°\ÓBˆØ×ÑØKØ!°E×4DÑ4D×4KÐ4KÈô	
ð !0ÐÜØ xØ3ôð øô{ ô 	^Ü�L‰LÐAÀ>×]Ò]ûð	^ú÷F !× Ð ús#   ·J Ä,KÊK	Ê(KËK	ËK	c               ó    € V ^8„  d   QhRRRR/# )r   r   r   r   rE   r   )r   s   "r   r   r     s   € ÷ ñ  3ð ¨4ñ r   c                ój  € \        \        V 4      4       EF  w  rVP                  R4      R8X  g   K  VP                  R4      '       g   K7  / pV \        V 4      V,
          R  FJ  pVP                  R4      R8w  d    M3VP                  R4      pV'       g   K6  VP                  RR4      W5&   KL  	  VR,           Uu. uFe  p\	        V\
        4      '       g   K  R	VR
,          R	,          RVP                  VP                  R4      4      RVR
,          P                  R4      /NKg  	  upu # 	  . # u upi )zRThe newest assistant tool_calls batch with each call's result, for ``agent:step``.r   ra   Ú
tool_callsNr6   Útool_call_idr   r7   ÚnameÚfunctionÚresultÚidÚ	arguments)Ú	enumerateÚreversedr#   r!   r   r"   )r   Ú_idxÚ_mÚ_results_by_idÚ_tmÚ_tcidÚtcs   &      r   rƒ   rƒ     s  € äœh xÓ0×1‰ˆØ�6‰6�&‹>˜[Ö(¨R¯V©V°L×-AÔ-AØˆNØ¤ H£°Õ 4Ð 5Ó6�Ø—7‘7˜6“? fÔ,ÙØŸ™ Ó/�ß‘5Ø,/¯G©G°I¸rÓ,B�NÓ)ñ 7ð ˜\Ö*óñ +�BÜ˜b¤$×'ôØ˜B˜z�N¨6Õ2Ø˜n×0Ñ0°·±¸³Ó>Ø  J¥×!3Ñ!3°KÓ!@óñ
 +ñò ñ 2ð$ €Iùòs   Â<D0ÃAD0c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   r)   r   r   Ú
steer_textrD   r   ÚNoner   )r   s   "r   r   r     s*   € ÷ .ñ .°#ð .Àð .ÐRUð .ÐZ^ñ .r   c                óR  € \        \        V4      ^,
          RR4       Fw  pW,          p\        V\        4      '       g   K#  VP	                  R4      R8X  g   K;  ^ RIHp VP                  V^,           V! V4      4       \        P                  RV4        R# 	  ^ RI
Hp V! W4       R# )z«Append the steer marker as a standalone user row after the newest tool message; with no
tool message, put the text back so the post-tool-execution drain delivers it later.r   r6   )Ústeer_user_rowzFPre-API-call steer drain: appended user row after tool msg at index %dN)Ú_requeue_pending_steerr:   )Úranger!   r   r"   r#   Úagent.prompt_builderr¬   Úinsertrz   r…   rŽ   r­   )r)   r   r©   Ú_siÚ_smr¬   r­   s   &&&    r   rŠ   rŠ     s~   € ô ”S˜“] QÕ&¨¨BÖ/ˆØ�mˆÜ�cœ4× Ô  S§W¡W¨V£_¸Ö%>Ý;Ø�O‰O˜C !�G¡^°JÓ%?Ô@Ü�L‰LÐaÐcfÔgÚñ 0õ CÙ˜5Ö-r   c                  ó0   € ] tR tRt$ RtR]R&   R]R&   RtR# )	ÚApiCallAnnouncementi*  zŽAlways ``action == "fallthrough"``; ``thinking_spinner`` is the started raw spinner or
None (TUI widget / streaming consumers / verbose mode).rD   rN   r   Úthinking_spinnerr   NrQ   r   r   r   r´   r´   *  s   ‡ ñ?ð ƒKØ×r   r´   c               ó4   € V ^8„  d   QhRRRRRRRRRRRRRR	/# )
r   r)   r   r   Úapi_messagesrs   Úapprox_tokensÚtotal_charsr   r´   r   )r   s   "r   r   r   3  sO   € ÷ Xñ XØðXØ ðXØ03ðXØEHðXØY\ðXàðXð ñXr   c          
     óÞ  € RpV P                   '       gª   V P                  RV P                   RV RV P                   R24       V P                  V P                   R\	        V4       RVR R	VR R
24       T P                  V P                   RV P
                  '       d   \	        V P
                  4      M^  24       Mí\        P                  ! \        P                  ! 4       4      p\        P                  ! \        P                  ! 4       4      pV P                  '       d   V P                  V RV R24       MqV P                  4       '       g\   V P                  4       '       dF   \        P                  ! . RO4      p	\        V RV R2W�P                  R7      pVP                  4        V P                   '       d¦   \"        P$                  ! RV P&                   R\	        V4       RV P
                  '       d   \	        V P
                  4      M^  24       \"        P$                  ! RV'       d   VR,          R,          MR 24       \"        P$                  ! RVR R24       \)        RVR7      # )zOPrint the request summary (verbose) or start the quiet-mode thinking indicator.NÚ
u   ðŸ”„ Making API call #Ú/z...u      ðŸ“Š Request size: z messages, ~Ú,z
 tokens (~z chars)u      ðŸ”§ Available tools: Ú )Úspinner_typeÚprint_fnzAPI Request - Model: z, Messages: z	, Tools: zLast message role: r   ÚnonezTotal message size: ~z tokensr€   )rN   rµ   )ÚbrainÚsparkleÚpulseÚmoonÚstarr:   )Ú
quiet_modeÚ_vprintÚ
log_prefixÚmax_iterationsr!   ÚtoolsÚrandomÚchoicer	   Úget_thinking_facesÚget_thinking_verbsÚthinking_callbackÚ_has_stream_consumersÚ_should_start_quiet_spinnerÚ	_print_fnÚstartÚverbose_loggingÚloggingr…   Úmodelr´   )
r)   r   r·   rs   r¸   r¹   rµ   ÚfaceÚverbr¿   s
   &$$$$$    r   Úannounce_api_callrÚ   3  s7  € ð
 ÐØ××ÐØ�‰˜˜5×+Ñ+Ð,Ð,BÀ>ÐBRÐRSÐTY×ThÑThÐSiÐilÐmÔnØ�‰˜×)Ñ)Ð*Ð*@ÄÀ\ÓARÐ@SÐS_Ð`mÐnoÐ_pÐpzð  |Gð  HIð  {Jð  JQð  Rô  	SØ�‰˜×)Ñ)Ð*Ð*CÐX]×Xc×XcÐXcÄCÈÏÉÔDTÐijÐCkÐlÕmô �}Š}œ]×=Ò=Ó?Ó@ˆÜ�}Š}œ]×=Ò=Ó?Ó@ˆØ×"×"Ð"ð ×#Ñ# t f¨A¨d¨V°3Ð$7Õ8Ø×,Ñ,×.Ò.°5×3TÑ3T×3VÒ3Vô "Ÿ=š=Ò)VÓWˆLÜ,°¨v°Q°t°f¸CÐ-@È|×fuÑfuÔvÐØ×"Ñ"Ô$ð ××ÐÜ�ŠÐ-¨e¯k©k¨]¸,ÄsÈ8Ã}ÀoÐU^Ðsx×s~×s~Ðs~Ô_bÐch×cnÑcnÔ_oð  EFð  _Gð  Hô  	IÜ�ŠÐ+ÇH¨H°R­L¸Ö,@ÐRXÐ+YÐZÔ[Ü�ŠÐ-¨m¸AÐ->¸gÐFÔGÜ mÐFVÔWÐWr   c                  óN   € ] tR tRt$ RtR]R&   R]R&   R]R&   R]R&   R]R	&   R
tR# )ÚIterationStartiT  u©   ``action``: ``"fallthrough"`` (run the iteration) or ``"break"`` (turn ends: interrupt,
review input budget or iteration budget exhausted â€” ``_turn_exit_reason`` set).rD   rN   r   Úoriginal_user_messagers   ÚinterruptedÚ_turn_exit_reasonr   NrQ   r   r   r   rÜ   rÜ   T  s'   ‡ ñYð ƒKØÓØÓØÓØ×r   rÜ   c               ó8   € V ^8„  d   QhRRRRRRRRRRRRRRR	R
/# )r   r)   r   r   Úconversation_historyrÝ   rs   rÞ   rß   r   rÜ   r   )r   s   "r   r   r   `  sX   € ÷ A#ñ A#ØðA#Ø ðA#Ø8;ðA#ØTWðA#àðA#à&)ðA#à>AðA#ð ñA#r   c               óê  aaaa€ ^ RI HpHp R VVVV3R llp	V P                  4       p
V
'       d8   V! WV
4       \	        S\
        4      '       d   S RV
 2oV P                  W4       V P                  P                  4        V P                  '       dI   Ro\        V 4      pV'       d   RV R2MRoV P                  '       g   V P                  R	4       V	! R
4      # V! V 4      '       dH   RoV P                  '       g,   V P                  R\        V P                  4      R R2RR7       V	! R
4      # S^,          oSV n        V P!                  RS 24       V P"                  '       d	   RV n        M~V P$                  P'                  4       '       g_   RoV P                  '       gC   V P                  RV P$                  P(                   RV P$                  P*                   R2RR7       V	! R
4      # V	! R4      # )zúIteration entry in the original order: apply a pending redirect, reset the checkpoint
dedup, then the interrupt / review-budget / iteration-budget exits. ``api_call_count`` is
incremented here (the grace call consumes its flag instead of the budget).)Ú_apply_active_turn_redirectÚ_review_input_budget_exhaustedc               ó    € V ^8„  d   QhRRRR/# )r   rN   rD   r   rÜ   r   )r   s   "r   r   Ú%begin_iteration.<locals>.__annotate__k  s   € ÷ 
ñ 
˜ð 
 ñ 
r   c                ó$   <€ \        V SSSSR 7      # ))rN   rÝ   rs   rÞ   rß   )rÜ   )rN   rß   rs   rÞ   rÝ   s   &€€€€r   Ú_verdictÚ!begin_iteration.<locals>._verdictk  s   ø€ ÜØÐ1FØ)°{Ø/ô
ð 	
r   z#

User correction during the turn: Tzinterrupted_by_system(Ú)Úinterrupted_by_useru2   
âš¡ Breaking out of tool loop due to interrupt...ÚbreakÚreview_input_budget_exhaustedu(   
â�¹ï¸�  Review input budget exhausted (r½   uI    tokens) â€” stopping the review tool loop before the next provider call.)Ú
diagnosticzstarting API call #FÚbudget_exhaustedu%   
âš ï¸�  Iteration budget exhausted (r¼   z iterations used)r€   )rl   rã   rä   Ú_drain_pending_redirectr   rD   Ú_persist_sessionÚ_checkpoint_mgrÚnew_turnr,   r
   rÇ   Ú_safe_printr    Úsession_input_tokensÚ_api_call_countÚ_touch_activityÚ_budget_grace_callr1   Úconsumer3   r?   )r)   r   rá   rÝ   rs   rÞ   rß   rã   rä   rè   Ú_redirect_textÚ_issuers   &$$dddd     r   Úbegin_iterationrü   `  s  û€ ÷÷
ó 
ð ×2Ñ2Ó4€NßÙ# E°^ÔDÜÐ+¬S×1Ò1à(Ð)Ð)RÐSaÐRbÐcð "ð 	×Ñ˜xÔ>ð 
×Ñ×"Ñ"Ô$à×!×!Ð!ØˆÜ" 5Ó)ˆßCJÐ4°W°I¸QÑ?ÐPeÐØ××ÐØ×ÑÐSÔTÙ˜Ó Ð ñ & e×,Ò,Ø;ÐØ××ÐØ×ÑðÜ˜×2Ñ2Ó3°AÐ6ð 7FðGàSWð ô ñ
 ˜Ó Ð à�aÕ€NØ*€EÔØ	×ÑÐ/°Ð/?Ð@ÔAð ××Ðð $)ˆÕ Ø×#Ñ#×+Ñ+×-Ò-Ø.ÐØ××ÐØ×ÑÐ FÀu×G]ÑG]×GbÑGbÐFcÐcdÐej×e{Ñe{÷  fFñ  fFð  eGð  GXð  Yð  fjÐô  kÙ˜Ó Ð Ù�MÓ"Ð"r   c                  ól   € ] tR tRt$ RtR]R&   R]R&   R]R&   R]R&   R]R	&   R]R
&   R]R&   R]R&   RtR# )ÚRetryRestartVerdicti¤  u8  ``action``: ``"fallthrough"`` (a response is ready â€” process it), ``"continue"``
(a restart flag re-issues the iteration: redirect / compressed / rebuilt-for-fallback /
length continuation) or ``"break"`` (turn ends: interrupted, non-actionable compaction
handoff, or every retry exhausted without a response).rD   rN   r   rP   Úfinal_responseÚretry_countÚrestart_countrs   Ú_preflight_compression_blockedrß   r   NrQ   r   r   r   rþ   rþ   ¤  s8   ‡ ñ>ð
 ƒKØÓØÓØÓØÓØÓØ$'Ó'Ø×r   rþ   c          $     ó`   € V ^8„  d   QhRRRRRRRRRRRRRRR	RR
RRRRRRRRRRRRRRRRRRR/# )r   r)   r   Ú_retryÚresponserÞ   r   rá   r   Ú
api_kwargsrP   rÿ   r   Úmax_retriesrs   r  Úlength_continue_retriesr  rß   r   rþ   r   )r   s   "r   r   r   µ  sÅ   € ÷ A#ñ A#ØðA#ØðA#Ø*-ðA#Ø<?ðA#ØKNðA#àðA#à-0ðA#à>AðA#àZ]ðA#ð ðA#ð '*ðA#ð 9<ðA#ð NQðA#ð ð	A#ð 25ð	A#ð
 %(ðA#ð
 =@ðA#ð ñA#r   c               ó¢  aa	a
aaaa€ ^ RI HpHp R VVVVV	VV
3R llpVP                  '       dŒ   S^,          oSV8”  dJ   Ro\        P                  RV4       V P                  4       pV'       d   V P                  V4       V! R4      # S^,          oV P                  P                  4        RVn        V! R4      # V'       d   \        V 4      oV! R4      # VP                  '       d   S^,          oV P                  P                  4        S
^,          o
RVn        V! WF4      '       d*   \        P                  R	4       S	'       g   Vo	R
oV! R4      # \        WV4      oV! R4      # VP                  '       de   S^,          oSV8”  d!   Ro\        P                  RV4       V! R4      # S^,          oV P                  P                  4        RVn        RoV! R4      # VP                  '       d)   \!        W P#                  V4      V4      V n        V! R4      # Vf-   RoV P'                  R4       V P)                  WE4       V! R4      # ^ oV! R4      # )az  Consume the ``TurnRetryState`` restart flags after the retry loop, in the original
priority order. Refunds the iteration budget/count for restarts that produced no valid
assistant item; ``restart_with_rebuilt_messages`` is the single consumer that clears
``_preflight_compression_blocked`` so the fallback gets a fresh preflight (#84733).

The two refunding restart paths (redirect and rebuilt-for-fallback) are bounded by
``max_retries`` via ``restart_count`` (restarts since the last response) so a runaway
interrupt/redirect that keeps re-arming a restart flag cannot refund the budget
forever and hold the turn lease indefinitely.)Ú_HANDOFF_SKIP_FINAL_RESPONSEÚ-_should_skip_model_call_for_reference_handoffc               ó    € V ^8„  d   QhRRRR/# )r   rN   rD   r   rþ   r   )r   s   "r   r   Ú*apply_retry_restarts.<locals>.__annotate__Ê  s   € ÷ 
ñ 
˜ð 
Ð!4ñ 
r   c                ó*   <€ \        V SSSSSSSR 7      # ))rN   rP   rÿ   r   r  rs   r  rß   )rþ   )rN   r  rß   rs   rP   rÿ   r  r   s   &€€€€€€€r   rè   Ú&apply_retry_restarts.<locals>._verdictÊ  s'   ø€ Ü"ØÐ1FØ)°{ÐR_Ø)Ø+IØ/ô
ð 	
r   Úredirect_restart_limit_exceededzsRedirected-message restart limit (%s) exceeded; ending turn instead of refunding the iteration budget indefinitely.rì   FÚcontinuezjSkipping compressed-restart model call: reference-only handoff would be the sole active user turn (#80622)Ú!compaction_handoff_not_actionableÚrebuilt_restart_limit_exceededzpRebuilt-message restart limit (%s) exceeded; ending turn instead of refunding the iteration budget indefinitely.Ú!all_retries_exhausted_no_responseub   â�Œ The model provider didn't answer after all retries. Send /retry, or switch models with /model.r€   )rl   r
  r  Ú restart_with_redirected_messagesrz   Úwarningrð   Ústeerr1   Úrefundr   Ú restart_with_compressed_messagesr�   r   Úrestart_with_rebuilt_messagesÚ restart_with_length_continuationr   Ú%_requested_output_cap_from_api_kwargsÚ_ephemeral_max_output_tokensÚ_emit_diagnostic_statusrñ   )r)   r  r  rÞ   r   rá   r   r  rP   rÿ   r   r  rs   r  r  r  rß   r
  r  rè   Ú
_unapplieds   &$$$$$$$ddd$dd$dd    r   Úapply_retry_restartsr   µ  s`  þ€ ÷"÷
ö 
ð ×.×.Ð.Ø˜ÕˆØ˜;Ô&ð !BÐÜ�N‰Nð?àôð ×6Ñ6Ó8ˆJßØ—‘˜JÔ'Ù˜GÓ$Ð$ð 	˜!ÕˆØ×Ñ×%Ñ%Ô'Ø27ˆÔ/Ù˜
Ó#Ð#çÜ>¸uÓEÐÙ˜Ó Ð à×.×.Ð.Ø˜!ÕˆØ×Ñ×%Ñ%Ô'ð 	�qÕˆØ27ˆÔ/Ù8ð ÷
ò 
ô �K‰KðFô÷ "Ø!=�Ø CÐÙ˜GÓ$Ð$ô !*¨%¸<Ó HÐÙ˜
Ó#Ð#à×+×+Ð+Ø˜ÕˆØ˜;Ô&ð !AÐÜ�N‰Nð?àôñ
 ˜GÓ$Ð$ð 	˜!ÕˆØ×Ñ×%Ñ%Ô'Ø/4ˆÔ,ð */Ð&Ù˜
Ó#Ð#à×.×.Ð.ä-?Ø×>Ñ>¸zÓJÐLcó.
ˆÔ*ñ ˜
Ó#Ð#ð ÒØ?ÐØ×%Ñ%ð  'Kô  	LØ×Ñ˜xÔ>Ù˜Ó Ð ð
 €MÙ�MÓ"Ð"r   )(rV   Ú
__future__r   rÖ   rÌ   r@   Ú
contextlibr   Údataclassesr   Útypingr   r   r   r   Úagent.displayr	   Úagent.interrupt_controlr
   r   Úagent.turn_context_compactionr   Úagent.turn_truncationr   Ú	getLoggerrz   r'   rC   rK   rM   rq   r–   rƒ   rŠ   r´   rÚ   rÜ   rü   rþ   r   r   r   r   Ú<module>r*     sø   ðñ@õ #ã Û Û 
Ý Ý !ß )Ó )å 'ß XÝ 3Ý 4à	×	Ò	Ð4Ó	5€õDð&ð "õ3ðl ÷ð ó ðõ 6ð2rØKOðrØnr÷rõjõ..ð ÷ð ó ðõXðB ÷ð ó ðõA#ðH ÷ð ó ð÷ A#r   