
    NQj%b                    6    d Z ddlmZ ddlZddlmZ dddZdS )u  Post-loop turn finalization for ``run_conversation``.

Extracted from ``agent/conversation_loop.py`` as part of the god-file
decomposition campaign (``~/.hermes/plans/god-file-decomposition.md``, Phase 1
step 4 — the post-loop ``TurnFinalizer`` seam). ``run_conversation``'s tail
(everything after the main tool-calling ``while`` loop) is lifted here verbatim:
budget-exhaustion summary, trajectory save, session persist, turn diagnostics,
response transforms, result-dict assembly, steer drain, and the memory/skill
review trigger.

Behavior-neutral: the body is moved unchanged. All ``agent.*`` side effects fire
exactly as before; only the post-loop *locals* are passed in as keyword args, and
the assembled ``result`` dict is returned to ``run_conversation`` which returns it
to the caller. The function is synchronous with a single return — mirroring the
region it replaces (no awaits, no early returns).

Module ``logger`` is imported lazily inside the body (``from
agent.conversation_loop import logger``) so this module never imports
``agent.conversation_loop`` at import time -> no import cycle, and the log records
keep the exact logger name (``"agent.conversation_loop"``).
    )annotationsN)_summarize_user_message_for_log)_pending_verification_responsec               4   ddl m} || j        k    p| j        j        dk    }|o| o| ot          |          dv }|du ot          |          o|}d}d}|r|}d| d| j         d}d	}d	}ns|q|rod| d| j         d}|                     d
| d| j         d           | j        s!| 	                    d| d| j         d           | 
                    ||          }d	}|rt          j                            d          }|r	 ddlm} |                                }	 |                    ||d| d| j         ddd	d	|| j        d           |                    d||| j                   	 |                                 n:# t(          $ r Y n.w xY w# 	 |                                 w # t(          $ r Y w w xY wxY wn(# t(          $ r |                    d|d	           Y nw xY wt          |                              d          }|duo| o|| j        k     p|}g }	 |                     |t1          |	          |           nG# t(          $ r:}|                    d|            |                    d|d	           Y d}~nd}~ww xY w	 |                     |           nG# t(          $ r:}|                    d|            |                    d|d	           Y d}~nd}~ww xY w	 |                     |           |rddlm}  |||           |rS|sQ	 |r|d                             d          nd}n# t(          $ r d}Y nw xY w|d k    r|                    d |d!           |                     ||           nG# t(          $ r:}|                    d"|            |                    d#|d	           Y d}~nd}~ww xY w|r|d                             d          nd}d} |d$k    rtA          |          D ]}!|!                    d          d k    rk|!                    d%          rV|!d%         }"|"rJtC          |"d         tD                    r/|"d                             d&i                               d'          }  ntG          d( |D                       }#|rtI          |          nd}$| j        r| j        j%        nd}%| j        r| j        j&        nd}&d)}'|| j'        || j        |%|&|#||$| j(        pd*f
}(|d$k    r|s |j        d+|'z   d,z   g|(| R   n |j        |'g|(R   |r|s	 tS          | d-d          pi })|)rE| *                                r1| +                    |)          }*|*r|,                                d.z   |*z   }n-# t(          $ r }+|-                    d/|+           Y d}+~+nd}+~+ww xY w|s	 | .                                r|pd0/                                },|,d0k    p|,d1k    }-|- oD| oAt          |                              d2           otI          |,          d3k    o|,dd         d4v}.t          |          d5k    }/|-s|.s|/r$| 0                    |          }0|0r|-r|0}n|,d.z   |0z   }n-# t(          $ r }1|-                    d6|1           Y d}1~1nd}1~1ww xY wd}2|r|s	 dd7l1m2}3  |3d8|| j(        pd0| j'        tS          | d9d          pd0:          }4|4D ]}5tC          |5t
                    r|5r|5}d	}2 n n-# t(          $ r }6|                    d;|6           Y d}6~6nd}6~6ww xY w|rs|sq	 dd7l1m2}3  |3d<| j(        |||
|tg          |          | j'        tS          | d9d          pd0=	  	         n-# t(          $ r }6|                    d>|6           Y d}6~6nd}6~6ww xY wd}7tA          |          D ]U}8|8                    d          d?k    r n9|8                    d          d k    r|8                    d@          r
|8d@         }7 nVi dA|dB|7dC|dD|dE|dF|dG|dHddI|dJ|2dKtS          | dLd          dM| j'        dN| j4        dO| j5        dP| j6        dQ| j7        dR| j8        | j9        | j:        | j;        | j<        | j=        tS          | j>        dSd          pd| j?        | j@        | jA        | j(        dT
}9| jB        | jB        C                                |9dU<   |r||9dV<   | D                                }:|:r|:|9dW<   d| _E        |r| jF        r
| jF        |9dX<   | G                                 d| _H        d};| jI        dk    r"| jJ        | jI        k    rdY| jK        v r	d	};d| _J        | L                    |
|||Z           |r=|s;|s|;r7	 | M                    tg          |          ||;[           n# t(          $ r Y nw xY w	 dd7l1m2}3  |3d\| j(        ||||| j'        tS          | d9d          pd0]           n-# t(          $ r }6|                    d^|6           Y d}6~6nd}6~6ww xY w|9S )_zRun the post-loop finalization and return the turn ``result`` dict.

    Lifted verbatim from ``run_conversation`` (the region after the main agent
    loop). See module docstring.
    r   )logger>   unknownbudget_exhaustedNFzmax_iterations_reached(/)Tu#   ⚠️ Iteration budget exhausted (u   ) — asking model to summariseu%   
⚠️  Iteration budget exhausted (u   ) — requesting summary...HERMES_KANBAN_TASK)	kanban_dbzIteration budget exhausted (u;   ) — task could not complete within the allowed iterations	timed_out)budget_used
budget_max)erroroutcomerelease_claimend_runevent_payload_extraz5recorded budget-exhausted failure for task %s (%d/%d)z5Failed to record budget-exhausted failure for task %s)exc_infoztext_response(zsave_trajectory: z*finalize_turn: _save_trajectory failed: %szcleanup_task_resources: z1finalize_turn: _cleanup_task_resources failed: %s)close_interrupted_tool_sequencerole	assistant)r   contentzpersist_session: z*finalize_turn: _persist_session failed: %stool
tool_callsfunctionnamec              3     K   | ]I}t          |t                    r2|                    d           dk    0|                    d          EdV  JdS )r   r   r      N)
isinstancedictget).0ms     8/home/alina/.hermes/hermes-agent/agent/turn_finalizer.py	<genexpr>z finalize_turn.<locals>.<genexpr>   sf        a#$55==K#?#?AEE,DWDW#? 	
#?#?#?#?     zuTurn ended: reason=%s model=%s api_calls=%d/%d budget=%d/%d tool_turns=%d last_msg_role=%s response_len=%d session=%snonez>Turn ended with pending tool result (agent may appear stuck). z last_tool=%s_turn_failed_file_mutationsz

z(file-mutation verifier footer failed: %s z(empty)text_response   >      。   ！   ？!r   .?`partial_stream_recoveryz$turn-completion explainer failed: %s)invoke_hooktransform_llm_outputplatform)response_text
session_idmodelr9   z$transform_llm_output hook failed: %spost_llm_call)r;   task_idturn_iduser_messageassistant_responseconversation_historyr<   r9   zpost_llm_call hook failed: %suser	reasoningfinal_responselast_reasoningmessages	api_calls	completedturn_exit_reasonfailedpartialinterruptedresponse_transformedresponse_previewed_response_was_previewedr<   providerbase_urlinput_tokensoutput_tokenscache_read_tokenslast_prompt_tokens)
cache_write_tokensreasoning_tokensprompt_tokenscompletion_tokenstotal_tokensrV   estimated_cost_usdcost_statuscost_sourcer;   	guardrailcleanup_errorspending_steerinterrupt_messageskill_manage)original_user_messagerE   rM   rG   )messages_snapshotreview_memoryreview_skillson_session_end)r;   r>   r?   rI   rM   r<   r9   zon_session_end hook failed: %s)Nagent.conversation_loopr   max_iterationsiteration_budget	remainingstrbool_emit_status
quiet_mode_safe_print_handle_max_iterationsosenvironr$   
hermes_clir   connect_record_task_failureinfoclose	Exceptionwarning
startswith_save_trajectoryr   appendr   _cleanup_task_resources)_drop_trailing_empty_response_scaffoldingagent.message_sanitizationr   _persist_sessionreversedr"   r#   sumlenused	max_totalr<   r;   getattr_file_mutation_verifier_enabled$_format_file_mutation_failure_footerrstripdebug"_turn_completion_explainer_enabledstrip#_format_turn_completion_explanationhermes_cli.pluginsr7   listrQ   rR   session_input_tokenssession_output_tokenssession_cache_read_tokenssession_cache_write_tokenssession_reasoning_tokenssession_prompt_tokenssession_completion_tokenssession_total_tokenscontext_compressorsession_estimated_cost_usdsession_cost_statussession_cost_source_tool_guardrail_halt_decisionto_metadata_drain_pending_steerrP   _interrupt_messageclear_interrupt_stream_callback_skill_nudge_interval_iters_since_skillvalid_tool_names_sync_external_memory_for_turn_spawn_background_review)<agentrE   api_call_countrM   rK   rG   rB   effective_task_idr?   r@   rd   _should_review_memory_turn_exit_reasonr   r   r	   budget_fallback_eligiblecontinuation_budget_exhaustediteration_limit_fallbackpreserved_verification_fallback_kanban_task_kb_connnormal_text_responserI   _cleanup_errors	_save_err_cleanup_errr   
_tail_role_persist_err_last_msg_role_last_tool_name_m_tcs_turn_tool_count	_resp_len_budget_used_budget_max	_diag_msg
_diag_args_failedfooter_ver_err	_stripped_is_empty_terminal_is_partial_fragment_is_partial_stream_recovery_explanation_exp_err_response_transformed_invoke_hook_transform_results_hook_resultexcrF   msgresult_leftover_steer_should_review_skillss<                                                               r'   finalize_turnr      s   , /..... 	%.. 	1!+q0 
 	 	FO	FJ	F !""&EE	  	$ 	%/00	%$ "  %&+#$ ( 8^n^^uG[^^^#' *.''		$<	 _n^^uG[^^^,. , ,5CW , , ,	
 	
 	
  	, , ,%J^ , , ,   55hOO#'  / z~~&:;; $	#777777,,$) .) )161E) ) )
 !,&* $+9*/*>- - -   " KKO$ne6J  
$   $      K !       011<<=MNNd" 	
J	
 U11 $# ( O]x)H)V)VXabbbb ] ] ]>9>>???A9W[\\\\\\\\]
g%%&78888 g g gH,HHIIIH,aeffffffffg+`77AAA   	FRRRRRR++HnEEE  	R+ 	R"9AKXb\--f555t

 " " "!


"[(( P PQQQx)=>>>> ` ` `A<AABBBA<Z^________` 2:CXb\%%f---tNO8$$ 	 	Bvvf~~,,1E1E,,' OJtAw55 O&*2hll:r&B&B&F&Fv&N&NO       (6<N###1I272HO5)..aL6;6LS%(22RSK	D 
 	5;8Lk.)"F	J L)*	
 	
 )	
 	
 	
 	
 	
 	I+
++++"  Ok O	Oe%BDIIORG O5@@BB OCCGLL O%3%:%:%<%<v%E%NN 	O 	O 	OLLCXNNNNNNNN	O&  'K&	K7799 #+1r88::	%."_%N	Y8N"
 +* ];;] 122==oNNN] I",] ""##.\\ % )**.GG , '+ 3
 $)#L#L)$ $L $ - 
 .:NN !*F 2\ A +  	K 	K 	KLL?JJJJJJJJ	K "  Hk H	HFFFFFF!-&, +1rk 
D99?R" " " !3  lC00 \ %1N,0)E 	H 	H 	HNNA3GGGGGGGG	H  Ak A	AFFFFFFL +)2#1%)(^^k 
D99?R
 
 
 
 
  	A 	A 	ANN:C@@@@@@@@	A N!!  776??f$$E776??k))cggk.B.B) -NE.. 	H 	^	
 	Y 	- 	& 	5 	{ 	 5 	ge-FNN 	 	EN 	EN 	2  	4!" 	U<#$ $>!:4"<2%e&>@TVWXX]\]#>00&7  F: *6#AMMOO{  3#2  0022O 2"1$)E!  ?u/ ?&+&>"# 
 "E "#a''(E,GGG%"888 $#$  
((3%	 )     k /D H] 	**"&x..33 +    
  	 	 	D	>BBBBBB'%#+UJ55;		
 		
 		
 		
 		
  > > >7========> Msg  F< AF ,F  F< 
FF< FF< F8F('F8(
F52F84F55F88F< <"G! G!$I 
J0JJ
J   
K$*0KK$(-M= L6 5M= 6MM= M7M= =
O0N<<O(AV 
V-V((V-3B;Y/ /
Z9ZZ#A[9 9
\#\\#+A]. .
^8^^?%f% %
f21f264g+ +
h5hh)__doc__
__future__r   rs   agent.codex_responses_adapterr   r    r)   r'   <module>r      sm    , # " " " " " 				 I I I I I I$ $(v v v v v v vr)   