+
    iHàjû%  ã                  ó  € R t ^ RIHt ^ RIHt ^ RIt^ RIt^ RIt^ RIH	t	H
t
Ht ^ RIHt ^ RIHt ^ RIHtHtHtHt ]P*                  ! R4      t]P.                  ! R	4      t] ! R
 R4      4       tR R ltR R ltR R ltRR/R R lltR# )aq  Response intake for the conversation turn loop: normalize the raw provider response into
the assistant message, splice agent-as-provider projections, fire ``post_api_request``, relay
reasoning to the progress callback, and apply the incomplete-scratchpad / Codex-incomplete
continuation guards. Nothing here imports ``agent.conversation_loop`` at module level (cycle).
)Úannotations)Ú	dataclassN)ÚAnyÚDictÚOptional)Úsplice_provider_projection)Úhas_incomplete_scratchpad)ÚCODEX_FALLBACK_ACTIVATEDÚcontinue_codex_incompleteÚnormalize_response_for_agentÚpartial_resultzagent.conversation_loopz,</?(?:REASONING_SCRATCHPAD|think|reasoning)>c                  óV   € ] tR t^t$ RtR]R&   R]R&   R]R&   RtR]R	&   RtR]R
&   RtR# )ÚResponseIntakeVerdicta_  ``action``: ``"fallthrough"`` (process ``assistant_message``), ``"continue"`` (retry the
iteration: incomplete scratchpad / Codex continuation) or ``"return"`` (``result`` is the
turn's result dict). ``assistant_message``/``finish_reason`` are the normalized outputs;
``active_system_prompt`` is rebound after a Codex reasoning-only fallover (#67321).ÚstrÚactionr   Úassistant_messageÚfinish_reasonNúOptional[dict[str, Any]]ÚresultÚactive_system_prompt© )	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__annotations__r   r   Ú__static_attributes__r   ó    Ú?/home/ubuntu/.hermes/hermes-agent/agent/turn_response_intake.pyr   r      s1   ‡ ñ[ð
 ƒKØÓØÓØ'+€FÐ$Ó+Ø $Ð˜#×$r   r   c               ó    € V ^8„  d   QhRRRR/# )é   Úrawr   Úreturnr   r   )Úformats   "r   Ú__annotate__r%   (   s   € ÷ ñ ˜cð  cñ r   c                ó°  € \        V \        4      '       dK   V P                  RR4      ;'       g1    V P                  RR4      ;'       g    \        P                  ! V 4      # \        V \
        4      '       d×   . pV  F½  p\        V\        4      '       d   VP                  V4       K,  \        V\        4      '       d:   VP                  R4      R8X  d$   VP                  VP                  RR4      4       K{  \        V\        4      '       g   K“  RV9   g   Kœ  VP                  \        VR,          4      4       K¿  	  RP                  V4      # \        V 4      # )u¥   Some OpenAI-compatible servers (llama-server) return content as dict/list, which
crashes downstream ``.strip()``; normalize to str (multimodal lists â†’ text parts).ÚtextÚ ÚcontentÚtypeÚ
)	Ú
isinstanceÚdictÚgetÚjsonÚdumpsÚlistr   ÚappendÚjoin)r"   ÚpartsÚparts   &  r   Ú_coerce_content_textr6   (   sð   € ô �#”t×ÒØ�w‰w�v˜rÓ"×OÐO c§g¡g¨i¸Ó&<×OÐOÄÇ
Â
È3ÃÐOÜ�#”t×ÒØˆÛˆDÜ˜$¤×$Ò$Ø—‘˜TÖ"Ü˜D¤$×'Ò'¨D¯H©H°VÓ,<ÀÔ,FØ—‘˜TŸX™X f¨bÓ1Ö2Ü˜D¤$×'Ô'¨F°d®NØ—‘œS  f¥Ó.Ö/ñ ð �y‰y˜ÓÐÜˆs‹8€Or   c               óH   € 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!   Úagentr   Úresponser   r   Úapi_messagesÚapi_call_countÚapi_durationÚapi_start_timeÚapi_request_idÚeffective_task_idÚturn_idr#   ÚNoner   )r$   s   "r   r%   r%   :   sr   € ÷ *ñ *Øð*Øð*Ø25ð*ØFIð*Ø\_ð*àð*à'*ð*à<?ð*àQTð*ð ð*ð &)ð*ð 
ñ	*r   c               óÞ  € ^ RI Hp  ^ RIHpHp V! R4      '       Ed=   T! R"/ RV	bRV
bRVbRV P
                  ;'       g    RbR	V P                  ;'       g    RbR
V P                  bRV P                  bRV P                  bRV P                  bRVbRVbRVbRWv,           bR\        V RR4      bRVbR\        V4      bR\        VR
R4      bRV P                  WVR7      bRV P                  V4      bR\        \        V RR4      RR4      bRVbR\        VP                  ;'       g    R4      bR\        \        VR R4      ;'       g    . 4      bR!V! V 4      b  R# R#   \          d     R# i ; i)#é    )Ú_moa_reference_metrics_for_hook)Úhas_hookÚinvoke_hookÚpost_api_requestÚtask_idr@   r>   Ú
session_idr(   ÚplatformÚmodelÚproviderÚbase_urlÚapi_moder;   r<   Ú
started_atÚended_atÚfirst_chunk_atÚ_last_api_first_chunk_atNr   Úmessage_countÚresponse_modelr9   )r   ÚusageÚcontext_lengthÚcontext_compressorr   Úassistant_content_charsÚassistant_tool_call_countÚ
tool_callsÚmoa_references)rG   )Úagent.conversation_looprD   Úhermes_cli.lifecyclerE   rF   rI   rJ   rK   rL   rM   rN   ÚgetattrÚlenÚ_api_response_payload_for_hookÚ#_usage_summary_for_api_request_hookr)   Ú	Exception)r8   r9   r   r   r:   r;   r<   r=   r>   r?   r@   rD   rE   Ú_invoke_hooks   &&&&$$$$$$$   r   Ú_fire_post_api_request_hookrd   :   sÚ  € õ
 Hð#ßNÙÐ&×'Ó'Ùò á)ðñ  ðñ  .ð	ð
 !×+Ñ+×1Ð1¨røðð Ÿ™×-Ð-¨2øðð —k’kðð Ÿšðð Ÿšðð Ÿšðñ  .ðñ *ðñ *ðð (Ö6ðô"  ' uÐ.HÈ$ÔOð#ñ$ ,ð%ô& " ,Ô/ð'ô(  ' x°¸$Ô?ð)ð* ×=Ñ=Ø¸}ð >ô ð+ð0 ×?Ñ?ÀÔIð1ô2  '¤w¨uÐ6JÈDÓ'QÐScÐeiÔjð3ñ4 #4ð5ô6 ),Ð,=×,EÑ,E×,KÐ,KÈÔ(Lð7ô8 +.¬gÐ6GÈÐW[Ó.\×.bÐ.bÐ`bÔ*cð9ñ:  ?¸uÔEó;ñ (øô@ ô Úðús)   ˆE Ÿ E Á E ÁC/E ÅE ÅE,Å+E,c               ó$   € V ^8„  d   QhRRRRRR/# )r!   r8   r   r)   r   r#   rA   r   )r$   s   "r   r%   r%   g   s!   € ÷ ñ ˜3ð ¨ð °ñ r   c                ó®  € \         P                  RVP                  4       4      P                  4       pV'       d    VP                  R4      ^ ,          R,          MRpV'       d(   \	        V R^ 4      ^ 8”  d    V P                  RV4       R# V'       d    V P                  RRVR,          R4       R# R#   \         d     R# i ; i  \         d     R# i ; i)	z¨Relay the model's text to the progress callback: subagents send the first line to
the parent display; any agent with a structured callback gets ``reasoning.available``.r(   r+   :NéP   NÚ_delegate_depthÚ	_thinkingzreasoning.available:Niô  NN)Ú_REASONING_TAG_REÚsubÚstripÚsplitr^   Útool_progress_callbackrb   )r8   r)   Ú_think_textÚ
first_lines   &&  r   Ú_relay_thinkingrq   g   s¾   € ô $×'Ñ'¨¨G¯M©M«OÓ<×BÑBÓD€Kß4?�×"Ñ" 4Ó(¨Õ+¨CÖ0ÀR€Jß”g˜eÐ%6¸Ó:¸QÔ>ð	Ø×(Ñ(¨°jÖA÷ 
ð	Ø×(Ñ(Ð)>ÀÈ[ÐY]ÕM^Ð`dÖeñ 
øô ô 	Úð	ûô
 ô 	Úð	ús$   Á7B3 ÂC Â3CÃCÃCÃCr   c               óL   € 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!   r8   r   r9   Úmessagesr:   Úconversation_historyr;   r<   r=   r>   r?   r@   r   r#   r   r   )r$   s   "r   r%   r%   x   s�   € ÷ M#ñ M#ØðM#Ø ðM#Ø,/ðM#Ø?BðM#ØZ]ðM#àðM#à'*ðM#à<?ðM#àQTðM#ð ðM#ð &)ðM#ð ADðM#ð ñ	M#r   c               óÀ  aaa€ \        W4      oSP                  oRR VVV3R lllpSP                  e;   \        SP                  \        4      '       g   \        SP                  4      Sn        \        WV4       \        WSSVWVVW‰V
R7       ^ RIH	p V! WS4       SP                  pV'       d�   V P                  '       go   V P                  '       d"   V P                  V P                   RV 24       M;T P                  V P                   RVR,           \        V4      ^d8”  d   RMR 24       V'       d   V P                  '       d   \!        W4       \#        T;'       g    R4      '       dá   V ;P$                  ^,          un        V P'                  R	4       V P$                  ^8:  d(   V P'                  R
V P$                   R24       V! R4      # V P)                  4        V P                  V P                   R2RRR7       ^ V n        V P+                  V4      pV P-                  V	4       V P/                  W$4       V! R\1        WõR4      4      # ^ V n        V P2                  R8X  dO   SR8X  dH   \5        V SSVWEVR7      pV\6        J d   ^ RIHp V! WS4      oV! R4      # Ve
   V! RV4      # V! R4      # \=        V R4      '       d   ^ V n        ^ V n         V! R4      # )z Normalize ``response`` into ``assistant_message`` (str content, never dict/list) and run
the post-response hooks and continuation guards, in the original order.c               ó$   € V ^8„  d   QhRRRRRR/# )r!   r   r   r   r   r#   r   r   )r$   s   "r   r%   Ú.normalize_model_response.<locals>.__annotate__‚   s#   € ÷ 
ñ 
˜ð 
Ð&>ð 
ÐJ_ñ 
r   c                ó$   <€ \        V SSVSR 7      # ))r   r   r   r   r   )r   )r   r   r   r   r   s   &&€€€r   Ú_verdictÚ*normalize_model_response.<locals>._verdict‚   s   ø€ Ü$ØÐ->ÈmØÐ0Dô
ð 	
r   )r:   r;   r<   r=   r>   r?   r@   )Úrecord_reply_contentu   ðŸ¤– Assistant: :Néd   Nz...r(   uL   âš ï¸�  Incomplete <REASONING_SCRATCHPAD> detected (opened but never closed)u   ðŸ”„ Retrying API call (z/2)...ÚcontinueuA   â�Œ Max retries (2) for incomplete scratchpad. Saving as partial.T)ÚforceÚ
diagnosticr#   z/Incomplete REASONING_SCRATCHPAD after 2 retriesÚcodex_responsesÚ
incomplete)rs   rt   r;   r9   )Ú_sync_failover_system_messageÚ_codex_incomplete_retriesÚfallthrough)N)!r   r   r)   r,   r   r6   r   rd   Ú/hermes_cli.observability.shared_metrics_harnessr{   Ú
quiet_modeÚverbose_loggingÚ_vprintÚ
log_prefixr_   rn   rq   r   Ú_incomplete_scratchpad_retriesÚ_buffer_vprintÚ_flush_status_bufferÚ"_get_messages_up_to_last_assistantÚ_cleanup_task_resourcesÚ_persist_sessionr   rN   r
   r	   r\   r‚   Úhasattrrƒ   Ú_codex_reasoning_only_streak)r8   r9   rs   r:   rt   r;   r<   r=   r>   r?   r@   r   ry   r{   r)   Úrolled_back_messagesÚ_codex_resultr‚   r   r   s   &$$$$$$$$$$d      @@r   Únormalize_model_responser”   x   sÈ  ú€ ô 5°UÓEÐØ%×3Ñ3€M÷
ô 
ð × Ñ Ò,´ZÐ@Q×@YÑ@YÔ[^×5_Ò5_Ü$8Ð9J×9RÑ9RÓ$SÐÔ!ô ˜u°Ô9äØÐ*¨MÈØ%ÐQ_Ø%ÐT[õõ
 UÙ˜Ð*;Ô<à×'Ñ'€Gß�u×'×'Ð'Ø× × Ð Ø�M‰M˜U×-Ñ-Ð.Ð.>¸w¸iÐHÕIà�M‰M˜U×-Ñ-Ð.Ð.>¸wÀt½}¸oÔWZÐ[bÓWcÐfiÔWiÉeÐoqÐMrÐsÔtß�5×/×/Ð/Ü˜Ô'ô ! § ¨B×/Ò/Ø×,Ò,°Õ1Õ,Ø×ÑÐkÔlØ×/Ñ/°1Ô4Ø× Ñ Ð#;¸E×<`Ñ<`Ð;aÐagÐ!hÔiÙ˜JÓ'Ð'Ø×"Ñ"Ô$Ø�‰˜×)Ñ)Ð*Ð*kÐlÐtxð  FJˆô  	KØ/0ˆÔ,Ø$×GÑGÈÓQÐØ×%Ñ%Ð&7Ô8Ø×Ñ˜xÔ>Ù˜¤.Ø Ð2có#
ó ð 	ð ,-€EÔ(à‡~�~Ð*Ô*¨}ÀÔ/LÜ1ØÐ$ m¸hØ!5Øô
ˆð
 Ô4Ó4õ NÙ#@ÀÐVjÓ#kÐ Ù˜JÓ'Ð'ØÒ$Ù˜H mÓ4Ð4Ù˜
Ó#Ð#ÜˆuÐ1×2Ò2Ø*+ˆÔ'Ø-.ˆÔ*Ù�MÓ"Ð"r   )r   Ú
__future__r   Údataclassesr   r/   ÚloggingÚreÚtypingr   r   r   Úagent.provider_projectionr   Úagent.trajectoryr   Úagent.turn_truncationr	   r
   r   r   Ú	getLoggerÚloggerÚcompilerj   r   r6   rd   rq   r”   r   r   r   Ú<module>r       s–   ðñõ #å !Û Û Û 	ß &Ñ &å @Ý 6÷ó ð 
×	Ò	Ð4Ó	5€à—J’JÐNÓOÐ ð ÷
%ð 
%ó ð
%õõ$*õZð"M#ð GK÷M#ñ M#r   