+
    iHàj´=  ã                  ó  € R t ^ RIHt ^ RIHt ^ RIHt ^ RI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 ]P,                  ! R
4      t]! 0 Rm4      t]R0,          t] ! R R4      4       tR R ltR R ltR# )ul  One tool-calling round of the conversation turn loop: validate/cap/dedupe the model's
tool calls, persist the tool-call turn BEFORE any side effect, execute the tools, honour
guardrail halts / persistence failures, then compress after tool results. Nothing here
imports ``agent.conversation_loop`` at module level (cycle) â€” loop-internal helpers resolve
lazily.
)Úannotations)Úsuppress)Ú	dataclassN)ÚAnyÚDictÚOptionalÚTuple)Úappend_message)Úcoalesce_tool_call_idÚ normalize_provider_tool_call_ids)Úcompress_after_tool_results)Úvalidate_tool_callszagent.conversation_loopÚ
setup_beatc                  óŽ   € ] tR t^t$ RtR]R&   R]R&   R]R&   R]R&   R]R&   R]R	&   R]R
&   R]R&   R]R&   R]R&   RtR]R&   RtR# )ÚToolRoundVerdictzþ``action``: ``"continue"`` (tools ran, next API call), ``"break"`` (turn ends:
persistence failure, guardrail halt, post-tool compression end) or ``"return"``
(``result`` is the turn's result dict). The other fields are the loop locals the round
rebinds.ÚstrÚactionr   ÚmessagesÚconversation_historyÚactive_system_promptÚcompression_attemptsÚfinal_responseÚfailedÚ_turn_exit_reasonÚtruncated_tool_call_retriesÚcurrent_turn_user_idxNúOptional[dict[str, Any]]Úresult© )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__annotations__r   Ú__static_attributes__r   ó    Ú:/home/ubuntu/.hermes/hermes-agent/agent/turn_tool_round.pyr   r      sM   ‡ ñð
 ƒKØƒMØÓØÓØÓØÓØƒKØÓØ!$Ó$ØÓØ'+€FÐ$×+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/# )é   Úagentr   Úassistant_messageÚfinish_reasonr   r   Úapi_call_countÚeffective_task_idÚuser_messageÚsystem_messager   r   Úmax_compression_attemptsr   r   r   r   r   Úreturnr   r   )Úformats   "r'   Ú__annotate__r4   1   sË   € ÷ x ñ x Øðx Ø&)ðx Ø:=ðx ØILðx àðx à/2ðx àGJðx àZ]ðx ð ðx ð 03ðx ð KNðx ð "ð	x ð 47ð	x ð ADð	x ð Y\ð	x ð
 "%ðx ð
 >Aðx ð ñx r&   c               óV  aaa	a
aaaaa€ ^ RI Hp R)R VV	V
VVVVVV3	R lllpV P                  '       g5   V P                  V P                   R\        VP                  4       R24       V P                  '       d‡   VP                   Fv  pVP                  P                  p\        V\        4      '       d
   VR,          M\        V4      R,          p\        P                  ! RVP                  P                  V4       Kx  	  \!        WVSSVVR	7      pVP"                  R
8X  d   V! R
VP$                  4      # VP"                  R8X  d	   V! R4      # ^ RIHp V! VP                  \+        VRR4      R7      Vn        V P-                  V P/                  VP                  4      4      Vn        \1        VP                  4       VP2                  '       dD   VP                   Uu. uF,  pVP                  P                  V P4                  9  g   K*  VNK.  	  upM. p\7        WVSR7      w  pp\9        SV4       V'       d¨   V FY  p\9        SRRRVP                  P                  R\;        V4      RV! VP                  P                  V P4                  4      /4       K[  	  VP                   Uu. uF,  pVP                  P                  V P4                  9   g   K*  VNK.  	  upVn         V P=                  SS4      pVRJ d%   \+        V RR4      f   RV n"        RoRoRoV! R4      # V'       g   V PM                  V4       V PN                  '       d2   \Q        \>        4      ;_uu_ 4        V PO                  R4       RRR4       T PS                  VSWe4       ^ RI*H+p V! V 4       \+        V R R4      '       d   RoRoRoV! R4      # V PX                  eÔ   V PX                  pR!oV P[                  V4      oV P]                  R"VP^                   R#VP`                   24       \9        SRR$RS/4       S'       dj   V Pc                  R%S R%24       V PN                  '       dC   \Q        \>        4      ;_uu_ 4        V PO                  S4       V PO                  R4       RRR4       V! R4      # ^ oRV n2        VP                   Uu0 uF  pVP                  P                  kK  	  upR&08X  d   V Pf                  Pi                  4        \k        V SW‡S	SS
W¶SSSR'7      p V Pl                  oV Pn                  o	V Pp                  oV Pr                  o
V Pt                  oV Pv                  oV Px                  oV Pz                  '       d	   V! R4      # SV n>        V P                  R(V 24       V! R4      # u upi u upi   \>         dL   pRp^ RI H!p T! T4      T n"        \F        PI                  RT PJ                  ;'       g    RT4        Rp?ELRp?ii ; i  + '       g   i     EL–; i  + '       g   i     EL�; iu upi )*a
  Execute one tool round in the exact original order. Persist-before-execute is a
durability invariant: resume must see the executed block if a destructive tool restarts
Hermes; a failed canonical append ends the turn rather than running tools from
process-only state.)Ú _invalid_tool_name_error_contentNc               ó$   € V ^8„  d   QhRRRRRR/# )r)   r   r   r   r   r2   r   r   )r3   s   "r'   r4   Ú$run_tool_round.<locals>.__annotate__>   s#   € ÷ 
ñ 
˜ð 
Ð&>ð 
ÐJZñ 
r&   c                ó0   <	€ \        V S	SSSSSSS
SVR 7      # ))r   r   r   r   r   r   r   r   r   r   r   )r   )r   r   r   r   r   r   r   r   r   r   r   s   &&€€€€€€€€€r'   Ú_verdictÚ run_tool_round.<locals>._verdict>   s.   ø€ ÜØ HÐCWØ!5ÐL`Ø)°&ÐL]Ø(CØ"7Àô
ð 	
r&   u   ðŸ”§ Processing z tool call(s)...:NéÈ   NzTool call: %s with args: %s...)r   r   r-   r.   r2   Úcontinue)Úexpand_local_tool_batchesÚprovider_data)r?   )r+   r,   r   ÚroleÚtoolÚnameÚtool_call_idÚcontentF)Úclassify_persistence_errorzJIncremental tool-call persistence failed before execution (session=%s): %sÚnoneÚ_last_persistence_error_causeÚunknownÚsession_persistence_failedÚ TÚbreak)Úfinish_tool_roundÚ_incremental_persistence_failedÚguardrail_haltu   âš ï¸� Tool guardrail halted z: Ú	assistantÚ
Úexecute_code)r   r0   r/   r   r   r   r1   r.   r   Úturn_exit_reasonr   z+tool results posted, continuing iteration #©N)@Úagent.conversation_loopr6   Ú
quiet_modeÚ_vprintÚ
log_prefixÚlenÚ
tool_callsÚverbose_loggingÚfunctionÚ	argumentsÚ
isinstancer   ÚreprÚloggingÚdebugrB   r   r   r   Úagent.tool_call_batchesr>   ÚgetattrÚ_deduplicate_tool_callsÚ_cap_delegate_task_callsr   Úmixed_invalid_batchÚvalid_tool_namesÚstage_tool_call_messager	   r
   Ú_flush_messages_to_session_dbÚ	ExceptionÚhermes_staterE   rG   ÚloggerÚwarningÚ
session_idÚ_emit_interim_assistant_messageÚstream_delta_callbackr   Ú_execute_tool_callsÚ/hermes_cli.observability.shared_metrics_harnessrL   Ú_tool_guardrail_halt_decisionÚ#_toolguard_controlled_halt_responseÚ_emit_diagnostic_statusÚ	tool_nameÚcodeÚ_safe_printÚ_stream_needs_breakÚiteration_budgetÚrefundr   r   r   r   r   r   rR   r   Úend_turnÚ_session_messagesÚ_touch_activity)!r*   r+   r,   r   r   r-   r.   r/   r0   r   r   r1   r   r   r   r   r   r6   r:   ÚtcÚraw_argsÚargs_previewÚ_tvvr>   Ú_invalid_batch_callsÚassistant_msgÚduplicate_previous_interimÚ_tool_turn_persistedÚexcrE   rL   ÚdecisionÚ_ptcs!   &$$dd$$$$dd$ddddd                r'   Úrun_tool_roundr‰   1   sÁ  ÿø€ õ I÷
÷ 
ò 
ð ××ÐØ�‰˜×)Ñ)Ð*Ð*:¼3Ð?P×?[Ñ?[Ó;\Ð:]Ð]mÐnÔoà××ÐØ#×.Ô.ˆBØ—{‘{×,Ñ,ˆHÜ-7¸Ä#×-FÒ-F˜8 Dž>ÌDÐQYËNÐ[_ÕL`ˆLÜ�MŠMÐ:¸B¿K¹K×<LÑ<LÈlÖ[ñ /ô
 Ø -¸(Ø1À.Ø+ô€Dð
 ‡{�{�hÔÙ˜ $§+¡+Ó.Ð.Ø‡{�{�jÔ Ù˜
Ó#Ð#õ BÙ#<Ø×$Ñ$´GÐ<MÈÐ`dÓ4eô$gÐÔ ð $)×#@Ñ#@Ø×&Ñ&Ð'8×'CÑ'CÓDó$ÐÔ ô
 %Ð%6×%AÑ%AÔBð 
×	!×	!Ð	!ð '×1Ò1óÙ1ˆr°R·[±[×5EÑ5EÈU×McÑMcÑ5c�ˆÑ1òà')ð ô 1HØÀ-ÐZbô1Ñ-€MÐ-ô �8˜]Ô+÷ Û&ˆBÜ˜8Ø˜Ø˜Ÿ™×(Ñ(ØÔ 5°bÓ 9ØÑ;Ø—K‘K×$Ñ$ e×&<Ñ&<óð	&ö ñ 'ð +×5Ò5ó(
Ù5�2¸¿¹×9IÑ9IÈU×McÑMcÑ9c�BˆBÑ5ñ(
ÐÔ$ð
Ø$×BÑBÀ8ÐMaÓbÐð ˜uÓ$ô �5Ð9¸4Ó@ÒHØ2;ˆEÔ/Ø8ÐØˆØˆÙ˜Ó Ð ÷ &Ø×-Ñ-¨mÔ<ð ×"×"Ð"Ü”i× Õ Ø×'Ñ'¨Ô-÷ !ð 
×ÑÐ/°Ð;LÔ]ÝQá�eÔäˆuÐ7¸×?Ò?ð 9ÐØˆØˆÙ˜Ó Ð à×*Ñ*Ò6Ø×6Ñ6ˆØ,ÐØ×BÑBÀ8ÓLˆØ×%Ñ%Ð(EÀh×FXÑFXÐEYÐY[Ð\d×\iÑ\iÐ[jÐ&kÔlÜ�x &¨+°yÀ.Ð!QÔR÷ Ø×Ñ  >Ð"2°"Ð5Ô6Ø×*×*Ð*Üœi×(Õ(Ø×/Ñ/°Ô?Ø×/Ñ/°Ô5÷ )ñ ˜Ó Ð ð #$Ðð !%€EÔð $5×#?Ò#?Ó@Ñ#?˜Rˆ�‰×ÔÑ#?Ñ@À^ÐDTÔTØ×Ñ×%Ñ%Ô'ä&Ø˜°Ø1ÐH\Ø1Ø!9Ø%Ð8IØ3ô€Dð �}‰}€HØ×4Ñ4ÐØ×4Ñ4ÐØ×4Ñ4ÐØ×(Ñ(€NØ×-Ñ-ÐØ ×6Ñ6ÐØ‡}‡}€}Ù˜Ó Ð ð '€EÔð 
×ÑÐGÈÐGWÐXÔYÙ�JÓÐùòùò((
øô ô 	
Ø$ÐÝ;Ù.HÈÓ.MˆÔ+Ü�‰ðà×Ñ×&Ð& Ø÷		
ò 	
ûð		
ú÷: !× Ð ú÷6 )×(Ð(üò AsO   Ç'VÈ	VÊ&'V ËV Ë!V% ÍW>Ñ)#XÒ3X&Ö%W;Ö0A W6×6W;×>X	ØX#	c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )r)   r*   r   r+   r,   r   r2   ztuple[dict[str, Any], bool]r   )r3   s   "r'   r4   r4   ì   s;   € ÷ M5ñ M5ØðM5Ø&)ðM5Ø:=ðM5ØILðM5à ñM5r&   c               óü  € ^ RI Hp V P                  W4      pVP                  ;'       g    RpVP                  '       dC   VP                  VP                  4       4      '       d   \        P                  RV4       RpRVR&   \        ;QJ d&    R VP                   4       F  '       d   K   RM	  RM! R VP                   4       4      p\        ;QJ d&    R VP                   4       F  '       d   K   RM	  RM! R VP                   4       4      pVP                  '       d   V'       g   R	V n
        RV n        RV n        V'       d›   V P                  V4      '       d„   W`n
        W€n        V'       d   V P                  4       '       d	   RV n        MQV P                  4       '       d<   V P!                  V4      P                  4       p	V	'       d   V P#                  R
V	 24       Rp
V'       dP   \%        VR,          \&        4      '       d3   VR,          P)                  R4      '       d   VP+                  4        Rp
KW  V
'       d   ^ V n        ^ V n        RV n        ^ V n        V'       d
   VR,          MR	pV P5                  V4      p\7        V4      ;'       de    \%        V\&        4      ;'       dM    VP)                  R4      R8H  ;'       d1    VP)                  R4      R8H  ;'       d    V P5                  V4      V8H  pW]3# )aù  Build the assistant tool-call row and update the per-turn fallback/mute state.

Drops a bare bracketed marker beside a call (#78148), classifies housekeeping-only
rounds, keeps visible content as the empty-follow-up fallback, pops thinking-only
prefills (resetting their counters), re-arms the post-tool nudge and the
dropped-tool-call stall budget. Returns ``(assistant_msg, duplicate_previous_interim)``;
the flag suppresses re-emitting interim commentary the previous ``incomplete`` row
already showed.)Ú_STALE_MARKER_RErJ   z;Discarding bare tool-call marker from assistant content: %srD   c              3  óZ   "  € T F!  qP                   P                  \        9   x € K#  	  R # 5irS   )r[   rB   Ú_HOUSEKEEPING_TOOLS©Ú.0r~   s   & r'   Ú	<genexpr>Ú*stage_tool_call_message.<locals>.<genexpr>
  s"   é € ð Ù:V°B�‰×ÑÔ/Ö/Ó:Vùó   ‚)+FTc              3  óZ   "  € T F!  qP                   P                  \        9   x € K#  	  R # 5irS   )r[   rB   Ú_LINE_IS_REPLY_TOOLSr�   s   & r'   r‘   r’     s    é € ÐiÑLhÀbŸ™×)Ñ)Ô-AÖAÓLhùr“   Nu     â”Š ðŸ’¬ Ú_thinking_prefillr@   rO   r,   Ú
incompleteéÿÿÿÿ)rT   rŒ   Ú_build_assistant_messagerD   rY   Ú	fullmatchÚstriprk   rl   ÚallÚ_last_content_with_toolsÚ$_last_content_tools_all_housekeepingÚ_mute_post_responseÚ_has_content_after_think_blockÚ_has_stream_consumersÚ _should_emit_quiet_tool_messagesÚ_strip_think_blocksrV   r]   ÚdictÚgetÚpopÚ_thinking_prefill_retriesÚ_empty_content_retriesÚ_post_tool_empty_retriedÚ_dropped_toolcall_retriesÚ_interim_assistant_visible_textÚbool)r*   r+   r,   r   rŒ   rƒ   Úturn_contentÚ_all_housekeepingÚ_line_is_replyÚcleanÚ_had_prefillÚprevious_msgÚcurrent_interim_visibler„   s   &$$$          r'   rg   rg   ì   s�  € õ 9à×2Ñ2Ð3DÓT€Mà$×,Ñ,×2Ð2°€Lð ×#×#Ð#Ð(8×(BÑ(BÀ<×CUÑCUÓCW×(XÒ(XÜ�‰ØIÈ<ô	
ð ˆØ#%ˆ�iÑ ÷ ›ñ Ø:K×:VÒ:VóŸŸšñ Ø:K×:VÒ:Vóó Ð÷ “SÑiÐL]×LhÒLhÓi—S—S’SÑiÐL]×LhÒLhÓiÓi€NØ×#×#Ð#×,=Ø)-ˆÔ&Ø5:ˆÔ2Ø$)ˆÔ!÷
 ˜×<Ñ<¸\×JÒJØ)5Ô&Ø5CÔ2ß ×!<Ñ!<×!>Ò!>Ø(,ˆEÕ%Ø×3Ñ3×5Ò5Ø×-Ñ-¨lÓ;×AÑAÓCˆEßØ—‘ ¨E¨7Ð3Ô4ð
 €Lß
”z (¨2¥,´×5Ò5¸(À2½,×:JÑ:JÐK^×:_Ò:_Ø�‰ŒØŠßØ*+ˆÔ'Ø'(ˆÔ$ð &+€EÔ"Ø&'€EÔ#ç#+�8˜B–<°€LØ#×CÑCÀMÓRÐäÐ$Ó%÷ 	[ð 	[Ü�|¤TÓ*÷	[ð 	[à×Ñ˜VÓ$¨Ñ3÷	[ð 	[ð ×Ñ˜_Ó-°Ñ=÷	[ð 	[ð ×1Ñ1°,Ó?ÐCZÑZð ð Ð4Ð4r&   >   ÚmemoryÚ	todo_listÚskill_manageÚsession_search)r#   Ú
__future__r   Ú
contextlibr   Údataclassesr   r_   Útypingr   r   r   r   Úagent.message_metadatar	   Úagent.message_sanitizationr
   r   Úagent.turn_preflightr   Úagent.turn_tool_validationr   Ú	getLoggerrk   Ú	frozensetrŽ   r•   r   r‰   rg   r   r&   r'   Ú<module>rÂ      s~   ðñõ #å Ý !Û ß -Ó -å 1ß ^Ý <Ý :à	×	Ò	Ð4Ó	5€ñ  Ò YÓZÐ ð +¨l¨^Õ;Ð ð ÷,ð ,ó ð,õ&x ÷vM5r&   