
    Yjg                    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                  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!           t?          | d"d          }tA          |          r ||           | !                    ||           nG# t(          $ r:}|                    d#|            |                    d$|d	           Y d}~nd}~ww xY w|r|d                             d          nd} d}!| d%k    rtE          |          D ]}"|"                    d          d k    rk|"                    d&          rV|"d&         }#|#rJtG          |#d         tH                    r/|#d                             d'i                               d(          }! ntK          d) |D                       }$|rtM          |          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	 t?          | d.d          pi }*|*rE| +                                r1| ,                    |*          }+|+r|-                                d/z   |+z   }n-# t(          $ r },|.                    d0|,           Y d},~,nd},~,ww xY w|s	 | /                                r|pd10                                }-|-d1k    p|-d2k    }.|. oD| oAt          |                              d3           otM          |-          d4k    o|-dd         d5v}/t          |          d6k    }0|.s|/s|0r$| 1                    |          }1|1r|.r|1}n|-d/z   |1z   }n-# t(          $ r }2|.                    d7|2           Y d}2~2nd}2~2ww xY wd}3|r|s	 dd8l2m3}4  |4d9|| j*        pd1| j)        t?          | d:d          pd1;          }5|5D ]}6tG          |6t
                    r|6r|6}d	}3 n n-# t(          $ r }7|                    d<|7           Y d}7~7nd}7~7ww xY w|rs|sq	 dd8l2m3}4  |4d=| j*        |||
|ti          |          | j)        t?          | d:d          pd1>	  	         n-# t(          $ r }7|                    d?|7           Y d}7~7nd}7~7ww xY wd}8tE          |          D ]U}9|9                    d          d@k    r n9|9                    d          d k    r|9                    dA          r
|9dA         }8 nVi dB|dC|8dD|dE|dF|dG|dH|dIddJ|dK|3dLt?          | dMd          dN| j)        dO| j5        dP| j6        dQ| j7        dR| j8        dS| j9        | j:        | j;        | j<        | j=        | j>        t?          | j?        dTd          pd| j@        | jA        | jB        t?          | dUi           pi                     dV          pi                     dW          | j*        dX}:| jC        | jC        D                                |:dY<   |r||:dZ<   | E                                };|;r|;|:d[<   d| _F        |r| jG        r
| jG        |:d\<   | H                                 d| _I        d}<| jJ        dk    r"| jK        | jJ        k    rd]| jL        v r	d	}<d| _K        | M                    |
|||^           |r=|s;|s|<r7	 | N                    ti          |          ||<_           n# t(          $ r Y nw xY w	 dd8l2m3}4  |4d`| j*        ||||| j)        t?          | d:d          pd1a           n-# t(          $ r }7|                    db|7           Y d}7~7nd}7~7ww xY w|:S )czRun 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   content$_apply_persist_user_message_overridez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     IC:\Users\server\AppData\Local\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modelr:   z$transform_llm_output hook failed: %spost_llm_call)r<   task_idturn_iduser_messageassistant_responseconversation_historyr=   r:   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request_overrides
extra_bodyservice_tier)cache_write_tokensreasoning_tokensprompt_tokenscompletion_tokenstotal_tokensrW   estimated_cost_usdcost_statuscost_sourcerZ   r<   	guardrailcleanup_errorspending_steerinterrupt_messageskill_manage)original_user_messagerF   rN   rH   )messages_snapshotreview_memoryreview_skillson_session_end)r<   r?   r@   rJ   rN   r=   r:   zon_session_end hook failed: %s)O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   getattrcallable_persist_sessionreversedr#   r$   sumlenused	max_totalr=   r<   _file_mutation_verifier_enabled$_format_file_mutation_failure_footerrstripdebug"_turn_completion_explainer_enabledstrip#_format_turn_completion_explanationhermes_cli.pluginsr8   listrR   rS   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_steerrQ   _interrupt_messageclear_interrupt_stream_callback_skill_nudge_interval_iters_since_skillvalid_tool_names_sync_external_memory_for_turn_spawn_background_review)=agentrF   api_call_countrN   rL   rH   rC   effective_task_idr@   rA   rh   _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_responserJ   _cleanup_errors	_save_err_cleanup_errr   
_tail_role_apply_override_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excrG   msgresult_leftover_steer_should_review_skillss=                                                                r(   finalize_turnr      sg   , /..... 	%.. 	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4`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 "%)OQUVVO$$ 	&OH%%%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 U/44:??MMSQS
#n

&A! ! !FD *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========> Msh  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$(-N( L6 5N( 6MN( MA"N( (
O,20O''O,AV. .
W8WWB;Z 
[$Z??[A\$ $
].]		]A^ 
_#^>>_$%h
 

hh4i 
i:i55i:)__doc__
__future__r   rw   agent.codex_responses_adapterr   r    r*   r(   <module>r      sm    , # " " " " " 				 I I I I I I$ $(D D D D D D Dr*   