+
    iHàj9Q  ã                   ó’   € R 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 ]P                  ! R4      t ! R R4      tR# )	zóStreaming / interim-message delivery for ``AIAgent``.

Single-writer stream ownership, delta/reasoning hook fan-out, and interim assistant text dedup.
Extracted from ``run_agent.py``; every method resolves through ``AIAgent``'s MRO unchanged.
N)ÚAnyÚDictÚList)Úsanitize_context)Úflatten_message_text)Úvisible_commentaryÚ	run_agentc                   ó°  a € ] tR t^t o Rt]V 3R lR l4       tV 3R lR ltRR/V 3R lR	 lltV 3R
 lR lt	]
V 3R lR l4       t]P                  V 3R lR l4       tV 3R lR lt]V 3R lR l4       tV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltV 3R  lR! ltV 3R" lR# ltV 3R$ lR% ltV 3R& lR' ltV 3R( lR) ltV 3R* lR+ ltV 3R, lR- ltV 3R. lR/ ltV 3R0 lR1 ltV 3R2 lR3 ltV 3R4 lR5 ltV 3R6 lR7 lt V 3R8 lR9 lt!V 3R: lR; lt"V 3R< lR= lt#R>R?/V 3R@ lRA llt$V 3RB lRC lt%V 3RD lRE lt&RFt'V t(R# )GÚStreamDeliveryMixinz]Stream ownership, delta/reasoning hook fan-out and interim-text dedup (see module docstring).c                ó    <€ V ^8„  d   QhRS[ /# ©é   Úreturn©Úbool)ÚformatÚ__classdict__s   "€Ú:/home/ubuntu/.hermes/hermes-agent/agent/stream_delivery.pyÚ__annotate__Ú StreamDeliveryMixin.__annotate__   s   ø€ ÷ ñ ¡Dñ ó    c                óD   € V f   R#  V ! V!   R#   \          d     R# i ; i)zOCall ``cb(*args)`` if set, swallowing errors; True when it ran without raising.FT)Ú	Exception)ÚcbÚargss   &*r   Ú_call_quietlyÚ!StreamDeliveryMixin._call_quietly   s-   € ð Š:Ùð	Ù�ŠIÙøÜô 	Úð	ús   ˆ �žc                ó&   <€ V ^8„  d   QhRS[ RS[/# ©r   Útextr   ©Ústrr   )r   r   s   "€r   r   r   !   s   ø€ ÷ ñ ±ð ¹ñ r   c                óŒ   € V P                   V P                  3 Uu. uF  q P                  W!4      NK  	  pp\        V4      # u upi )zUSend ``text`` to the display + TTS delta callbacks; True if at least one accepted it.)Ústream_delta_callbackÚ_stream_callbackr   Úany)Úselfr   r   Úresultss   &&  r   Ú_deliver_to_stream_callbacksÚ0StreamDeliveryMixin._deliver_to_stream_callbacks!   sC   € à;?×;UÑ;UÐW[×WlÑWlÑ:mÓnÑ:m°B×%Ñ% bÖ/Ñ:mˆÐnÜ�7‹|Ðùò os   ›AÚlabelNc                ó>   <€ V ^8„  d   QhRS[ RS[ R,          RS[RR/# )r   Úeventr*   NÚfieldsr   )r!   r   )r   r   s   "€r   r   r   &   s5   ø€ ÷ Yñ Y©#ð Y¹¸t½ð YÑVYð YÐ^bñ Yr   c               ó®   €  ^ RI Hp V! V3/ V P                  4       BVB  R#   \         d'    \        P                  RT;'       g    TRR7        R# i ; i)zJBest-effort plugin stream hook enqueue; never raises into the stream path.)Úenqueue_plugin_stream_hookz%s plugin hook enqueue failedT©Úexc_infoN)Úagent.plugin_stream_hooksr/   Ú_stream_hook_base_payloadr   ÚloggerÚdebug)r&   r,   r*   r-   r/   s   &&$, r   Ú_enqueue_stream_hookÚ(StreamDeliveryMixin._enqueue_stream_hook&   sR   € ð	YÝLá& uÑ[°×0NÑ0NÓ0PÐ[ÐTZÔ[øÜô 	YÜ�L‰LÐ8¸%¿.¸.À5ÐSWˆL×Xð	Yús   ‚# £#AÁ	AÁAc                ó   <€ V ^8„  d   QhRR/# ©r   r   N© )r   r   s   "€r   r   r   /   s   ø€ ÷ !3ñ !3°ñ !3r   c                ó  a € \        S RR4      p\        S RR4      pRS n        RS n        R V 3R llpVe6   VP                  4       pT! V'       d   Ve   VP	                  V4      MT4       Ve   V! VP                  4       4       RS n        R# )z÷Reset tracking for text delivered during the current model response.

Flushes the think scrubber's benign tail first, routed through the context scrubber (a span
straddling the boundary must still be caught), then the context scrubber's own tail.
Ú_stream_think_scrubberNÚ_stream_context_scrubberFc                ó(   € V ^8„  d   QhR\         RR/# )r   Útailr   N©r!   )r   s   "r   r   ÚIStreamDeliveryMixin._reset_stream_delivery_tracking.<locals>.__annotate__=   s   € ÷ 	;ñ 	;œ#ð 	; $ñ 	;r   c                 ó`   <€ V '       d%   SP                  V 4       SP                  V 4       R # R # ©N)r(   Ú_record_streamed_assistant_text)r?   r&   s   &€r   ÚdeliverÚDStreamDeliveryMixin._reset_stream_delivery_tracking.<locals>.deliver=   s'   ø€ ßØ×1Ñ1°$Ô7Ø×4Ñ4°TÖ:ñ r   Ú )ÚgetattrÚ_native_reasoning_streamedÚ_stream_reasoning_hooks_enabledÚflushÚfeedÚ _current_streamed_assistant_text)r&   Úthink_scrubberÚctx_scrubberrE   Ú
think_tails   f    r   Ú_reset_stream_delivery_trackingÚ3StreamDeliveryMixin._reset_stream_delivery_tracking/   s‘   ø€ ô ! Ð'?ÀÓFˆÜ˜tÐ%?ÀÓFˆð +0ˆÔ'à/3ˆÔ,÷	;ð 	;ð Ò%Ø'×-Ñ-Ó/ˆJÙ·ZÀLÒD\�L×%Ñ% jÔ1ÐblÔmØÒ#Ù�L×&Ñ&Ó(Ô)Ø02ˆÖ-r   c                ó    <€ V ^8„  d   QhRS[ /# r   r@   )r   r   s   "€r   r   r   S   s   ø€ ÷ /ñ /±#ñ /r   c                óR   € \        V RR4      pV'       d   RP                  V4      # R# )a  Visible assistant text streamed so far this turn. Backed by a list of pieces: ``+=`` on a string
attribute copies the whole reply on every delta (quadratic). Hot-path emptiness checks look at
``_streamed_assistant_text_parts`` so they do not join per token.Ú_streamed_assistant_text_partsNrG   )rH   Újoin)r&   Úpartss   & r   rM   Ú4StreamDeliveryMixin._current_streamed_assistant_textR   s(   € ô
 ˜Ð>ÀÓEˆß!&ˆr�w‰w�u‹~Ð.¨BÐ.r   c                ó$   <€ V ^8„  d   QhRS[ RR/# )r   Úvaluer   Nr@   )r   r   s   "€r   r   r   [   s   ø€ ÷ Gñ G±cð G¸dñ Gr   c                ó8   € V'       d   V.V n         R # . V n         R # rC   )rU   )r&   rZ   s   &&r   rM   rX   Z   s   € ç9>¨u¨gˆÖ+ÀBˆÖ+r   c                ó$   <€ V ^8„  d   QhRS[ RR/# ©r   r   r   Nr@   )r   r   s   "€r   r   r   ^   s   ø€ ÷ ñ ±Cð ¸Dñ r   c                óÎ   € \        V\        4      '       dO   V'       dE   V P                  4       '       g-   \        V RR4      pVf	   . ;q n        VP                  V4       R# R# R# R# )zaAccumulate visible assistant text emitted through stream callbacks (superseded writers excluded).rU   N)Ú
isinstancer!   Ú_stream_writer_supersededrH   rU   Úappend)r&   r   rW   s   && r   rD   Ú3StreamDeliveryMixin._record_streamed_assistant_text^   sU   € ä�dœC× Ò §T°$×2PÑ2P×2RÒ2RÜ˜DÐ"BÀDÓIˆEØŠ}Ø>@Ð@�Ô;Ø�L‰L˜Öñ	 3S¡TÑ r   c                ó&   <€ V ^8„  d   QhRS[ RS[ /# r   r@   )r   r   s   "€r   r   r   g   s   ø€ ÷ Rñ R©cð R±cñ Rr   c                ó~   € \        V \        4      '       d'   \        P                  ! R RV 4      P	                  4       # R# )z\s+Ú rG   )r_   r!   ÚreÚsubÚstrip)r   s   &r   Ú_normalize_interim_visible_textÚ3StreamDeliveryMixin._normalize_interim_visible_textf   s/   € ä4>¸tÄS×4IÒ4IŒr�vŠv�f˜c 4Ó(×.Ñ.Ó0ÐQÈrÐQr   c                ó<   <€ V ^8„  d   QhRS[ RS[S[ S[ 3,          /# ©r   Úcontentr   )r!   Útuple)r   r   s   "€r   r   r   j   s'   ø€ ÷ qñ q±Sð q¹UÁ3ÉÀ8½_ñ qr   c                ó¸   € V P                   p\        V RR4      ;'       g    RpT! T P                  T;'       g    R4      4      V! V P                  V4      4      3# )zP(visible content, streamed text), both think-stripped and whitespace-normalized.rM   rG   )ri   rH   Ú_strip_think_blocks)r&   rm   Ú	normalizeÚstreameds   &&  r   Ú_interim_visible_and_streamedÚ1StreamDeliveryMixin._interim_visible_and_streamedj   sV   € à×8Ñ8ˆ	Ü˜4Ð!CÀRÓH×NÐNÈBˆÙ˜×1Ñ1°'·-°-¸RÓ@ÓAÁ9ÈT×MeÑMeÐfnÓMoÓCpÐpÐpr   c                ó&   <€ V ^8„  d   QhRS[ RS[/# rl   r    )r   r   s   "€r   r   r   p   s   ø€ ÷ Kñ K±Sð K¹Tñ Kr   c                ó„   € V P                  V4      w  r#\        T;'       d    T4      ;'       d    VP                  V4      # rC   )rs   r   Ú
startswith©r&   rm   Úvisiblerr   s   &&  r   Ú_interim_content_was_streamedÚ1StreamDeliveryMixin._interim_content_was_streamedp   s=   € ð !×>Ñ>¸wÓGÑˆÜ�G×(Ð( Ó)×JÐJ¨g×.@Ñ.@ÀÓ.JÐJr   c                ó&   <€ V ^8„  d   QhRS[ RS[/# rl   r    )r   r   s   "€r   r   r   v   s   ø€ ÷ 5ñ 5±sð 5¹tñ 5r   c                óV   € V P                  V4      w  r#\        V4      ;'       d    W#8H  # )z¤Exact-match variant for the gateway interim path: a True verdict finalizes the bubble
as-is, so a truncated prefix must fall through to a full-text resend (#88954).)rs   r   rx   s   &&  r   Ú_interim_content_fully_streamedÚ3StreamDeliveryMixin._interim_content_fully_streamedv   s,   € ð !×>Ñ>¸wÓGÑˆÜ�G‹}×4Ð4 Ñ!4Ð4r   c                óL   <€ V ^8„  d   QhRS[ S[S[3,          RS[S[,          /# ©r   Úassistant_msgr   )Údictr!   r   Úlist)r   r   s   "€r   r   r   |   s*   ø€ ÷ ñ Á$ÁsÉCÀxÅ.ð ÑUYÑZ]ÕU^ñ r   c                ó|  € \        V RR4      '       d   VP                  R4      MRp. p\        V\        4      '       d   TMR Fõ  p\        V\        4      '       d   VP                  R4      R8w  d   K1  VP                  R4      VP                  R4      re\        V\
        4      '       d:   VP                  4       P                  4       R	8w  g   \        V\        4      '       g   K£  R
P                  R V 4       4      P                  4       pV P                  V4      pV'       g   Kä  VP                  V4       K÷  	  V# )zÕVisible Codex commentary (``phase=commentary`` items), one string per message item.

``phase=analysis`` stays hidden (scratchpad); with ``display.show_commentary=false``
commentary stays on the reasoning channel.
Úshow_commentaryTÚcodex_message_itemsNÚtypeÚmessageÚphaserm   Ú
commentaryrG   c              3   ó   "  € T F„  p\        V\        4      '       g   K  VP                  R 4      R8X  g   K3  \        VP                  R4      \        4      '       g   KZ  VR,          P	                  4       '       g   Ky  VR,          x € K†  	  R# 5i)rˆ   Úoutput_textr   N)r_   rƒ   Úgetr!   rh   )Ú.0Úparts   & r   Ú	<genexpr>ÚKStreamDeliveryMixin._extract_codex_interim_visible_parts.<locals>.<genexpr>Š   sk   é € ð Ù)6 Ü˜d¤D×)ô Ø.2¯h©h°vÓ.>À-Ñ.Oô ä˜tŸx™x¨Ó/´×5ô à:>¸v½,×:LÑ:L×:Nô ��V—’«ùs   ‚BŸB·"BÁBÁ=Br:   )rH   rŽ   r_   r„   rƒ   r!   rh   ÚlowerrV   Ú_visible_commentaryra   )r&   r‚   ÚitemsÚmessagesÚitemrŠ   Úcontent_partsry   s   &&      r   Ú$_extract_codex_interim_visible_partsÚ8StreamDeliveryMixin._extract_codex_interim_visible_parts|   s  € ô =DÀDÐJ[Ð]a×<bÒ<b�×!Ñ!Ð"7Ô8ÐhlˆØ ˆÜ'¨¬t×4Ò4‘E¸"Ò<ˆDÜ˜d¤D×)Ò)¨T¯X©X°fÓ-=ÀÔ-JÙØ#'§8¡8¨GÓ#4°d·h±h¸yÓ6I�=Ü˜e¤S×)Ò)¨U¯[©[«]×-@Ñ-@Ó-BÀlÔ-RÔZdÐerÔtx×ZyÒZyÙØ—g‘gñ Ù)6óó ÷ ‰e‹gð	 ð
 ×.Ñ.¨wÓ7ˆGß‰wØ—‘ Ö(ñ =ð ˆr   c                ó&   <€ V ^8„  d   QhRS[ RS[ /# r   r@   )r   r   s   "€r   r   r   ”   s   ø€ ÷ Qñ Q©ð Q±ñ Qr   c                ó.   € \        WP                  R7      # )zKThink-stripped, redacted commentary text ("" when nothing visible remains).)Ústrip_thinking)r   rp   )r&   r   s   &&r   r”   Ú'StreamDeliveryMixin._visible_commentary”   s   € ä! $×7OÑ7OÔPÐPr   c                ó<   <€ V ^8„  d   QhRS[ S[S[3,          RS[/# r�   ©rƒ   r!   r   )r   r   s   "€r   r   r   ˜   s(   ø€ ÷ ]ñ ]ÁÁcÉ3ÀhÅð ]ÑTWñ ]r   c                ó^   € RP                  V P                  V4      4      P                  4       # )z=All visible Codex commentary joined, for comparison/fallback.ú

)rV   r™   rh   ©r&   r‚   s   &&r   Ú#_extract_codex_interim_visible_textÚ7StreamDeliveryMixin._extract_codex_interim_visible_text˜   s%   € à�{‰{˜4×DÑDÀ]ÓSÓT×ZÑZÓ\Ð\r   c                ó<   <€ V ^8„  d   QhRS[ S[S[3,          RS[/# r�   r    )r   r   s   "€r   r   r   œ   s$   ø€ ÷ 
ñ 
¹TÁ#ÁsÀ(½^ð 
ÑPSñ 
r   c                ó¢   € V P                  V4      ;'       g8    V P                  \        VP                  R4      4      4      P	                  4       # )u  Assistant text eligible for interim delivery: structured Codex commentary first â€” a response can
hold commentary AND a partial final answer while tools are pending, and treating content as
progress leaks the answer early â€” else top-level content (may be a parts list).rm   )r¤   rp   r   rŽ   rh   r£   s   &&r   Ú_interim_assistant_visible_textÚ3StreamDeliveryMixin._interim_assistant_visible_textœ   sK   € ð
 ×4Ñ4°]ÓC÷ dð dØ×'Ñ'Ô(<¸]×=NÑ=NÈyÓ=YÓ(ZÓ[×aÑaÓcð	
r   c                ó&   <€ V ^8„  d   QhRS[ RS[/# r   r    )r   r   s   "€r   r   r   ¥   s   ø€ ÷ cñ c±ð c¹ñ cr   c                óz   € V P                  V4      p\        V4      ;'       d    V\        V R \        4       4      9   # )Ú_delivered_interim_texts)ri   r   rH   Úset©r&   r   Ú
normalizeds   && r   Ú_interim_text_was_deliveredÚ/StreamDeliveryMixin._interim_text_was_delivered¥   s8   € Ø×9Ñ9¸$Ó?ˆ
Ü�JÓ×bÐb J´'¸$Ð@ZÔ\_Ó\aÓ2bÑ$bÐbr   c                ó$   <€ V ^8„  d   QhRS[ RR/# r]   r@   )r   r   s   "€r   r   r   ©   s   ø€ ÷ :ñ :±3ð :¸4ñ :r   c                óÒ   € V P                  V4      pV'       dN   \        \        V R R4      \        4      '       g   \        4       V n        V P                  P                  V4       R# R# )r¬   N)ri   r_   rH   r­   r¬   Úaddr®   s   && r   Ú_record_delivered_interim_textÚ2StreamDeliveryMixin._record_delivered_interim_text©   sO   € Ø×9Ñ9¸$Ó?ˆ
ßÜœg dÐ,FÈÓMÌs×SÒSÜ03³�Ô-Ø×)Ñ)×-Ñ-¨jÖ9ñ r   c                ó@   <€ V ^8„  d   QhRS[ RS[RS[S[ ,          RR/# )r   ry   Úalready_streamedÚrecordr   N)r!   r   r„   )r   r   s   "€r   r   r   °   s7   ø€ ÷ 
Lñ 
L©ð 
LÁ$ð 
LÑPTÑUXÕPYð 
LÐ^bñ 
Lr   c               óÆ   € \        V RR4      pVf   R#  V! WR7       V F  pV P                  V4       K  	  R#   \         d    \        P	                  RRR7        R# i ; i)zkHand ``visible`` to ``interim_assistant_callback`` and mark ``record`` delivered; swallows callback errors.Úinterim_assistant_callbackN)r¸   z interim_assistant_callback errorTr0   )rH   rµ   r   r4   r5   )r&   ry   r¸   r¹   r   r�   s   &&$$  r   Ú_deliver_interimÚ$StreamDeliveryMixin._deliver_interim°   sa   € ä�TÐ7¸Ó>ˆØŠ:Ùð	LÙˆwÕ:Û�Ø×3Ñ3°DÖ9ó øäô 	LÜ�L‰LÐ;ÀdˆL×Kð	Lús   •#: º"A ÁA c                ó$   <€ V ^8„  d   QhRS[ RR/# r]   r@   )r   r   s   "€r   r   r   ¼   s   ø€ ÷ Qñ Q±Cð Q¸Dñ Qr   c                óð   € \        V RR4      e   \        V\        4      '       g   R# V P                  V4      pV'       d   VR8X  g   V P	                  V4      '       d   R# V P                  VRV.R7       R# )z>Deliver a completed live Codex commentary message immediately.r»   Nú(empty)F©r¸   r¹   )rH   r_   r!   r”   r°   r¼   )r&   r   ry   s   && r   Ú_fire_streamed_codex_commentaryÚ3StreamDeliveryMixin._fire_streamed_codex_commentary¼   sh   € ä�4Ð5°tÓ<ÒDÌJÐW[Ô]`×LaÒLaÙØ×*Ñ*¨4Ó0ˆß˜' YÔ.°$×2RÑ2RÐSZ×2[Ò2[ÙØ×Ñ˜g¸ÀwÀiÐÖPr   c                ó:   <€ V ^8„  d   QhRS[ S[S[3,          RR/# )r   r‚   r   Nr    )r   r   s   "€r   r   r   Å   s(   ø€ ÷ qñ q¹TÁ#ÁsÀ(½^ð qÐPTñ qr   c                ód  € \        V\        4      '       g   R# V P                  V4      p/ pV FC  pV P                  V4      pV'       g   K  WS9  g   K&  V P	                  V4      '       d   K?  WCV&   KE  	  \        VP                  4       4      pV'       d    RP                  V4      P                  4       MV P                  V4      pV'       d   VR8X  g   V P	                  V4      '       d   R# V P                  V4      pV P                  RWxR7       T P                  YxT;'       g    V.R7       R# )uÊ   Surface a real mid-turn assistant commentary message to the UI layer. Does NOT set
``_response_was_previewed`` ("the final response was shown") â€” the CLI would then suppress a
different final summary.Nr¢   rÀ   Úon_interim_message)r   r¸   rÁ   )r_   rƒ   r™   ri   r°   r„   ÚvaluesrV   rh   r¨   r~   r6   r¼   )	r&   r‚   Úcommentary_partsÚpendingr�   ÚkeyÚundelivered_partsry   r¸   s	   &&       r   Ú_emit_interim_assistant_messageÚ3StreamDeliveryMixin._emit_interim_assistant_messageÅ   s  € ô ˜-¬×.Ò.ÙØ×DÑDÀ]ÓSÐà"$ˆÛ$ˆDØ×6Ñ6°tÓ<ˆCß‰s�sÖ)°$×2RÑ2RÐSW×2XÔ2XØ#˜“ñ %ô ! §¡Ó!1Ó2Ðß<L�&—+‘+Ð/Ó0×6Ñ6Ô8ÐRV×RvÑRvð  xEó  SFˆß˜' YÔ.°$×2RÑ2RÐSZ×2[Ò2[ÙØ×?Ñ?ÀÓHÐØ×!Ñ!Ð"6¸WÐ!ÔhØ×Ñ˜gÐQb×QoÐQoÐgnÐfoÐÖpr   c                ó   <€ V ^8„  d   QhRR/# r9   r:   )r   r   s   "€r   r   r   Ú   s   ø€ ÷ 'ñ '¨Tñ 'r   c                óú   € \        V RR4      f   \        P                  ! 4       V n        \        V RR4      f   \        P                  ! 4       V n        R F"  p\        W4      '       d   K  \        W^ 4       K$  	  R# )aÑ  Lazily create the single-writer guard fields (#65991).

The fields are normally set unconditionally in ``agent_init`` (``_STREAM_STATE``), so every
``__init__``-built agent shares ONE lock from birth and the lazy path below is never taken by
two threads. Only agents constructed via ``AIAgent.__new__`` (test doubles, legacy/partially-
initialized instances) skip that path; claiming/checking the writer must not crash those, so
initialize the fields on first use.
Ú_stream_writer_lockNÚ_stream_writer_tls)Ú_stream_writer_tokenÚ_stream_writer_dropped)rH   Ú	threadingÚLockrÐ   ÚlocalrÑ   ÚhasattrÚsetattr)r&   Úattrs   & r   Ú_ensure_stream_writer_stateÚ/StreamDeliveryMixin._ensure_stream_writer_stateÚ   sb   € ô �4Ð.°Ó5Ò=Ü'0§~¢~Ó'7ˆDÔ$Ü�4Ð-¨tÓ4Ò<Ü&/§o¢oÓ&7ˆDÔ#ÛFˆDÜ˜4×&Ô&Ü˜ AÖ&ó Gr   c                ó    <€ V ^8„  d   QhRS[ /# r   )Úint)r   r   s   "€r   r   r   ë   s   ø€ ÷ ñ ¡cñ r   c                óÜ   € V P                  4        V P                  ;_uu_ 4        V P                  ^,           ;V n        pRRR4       XV P                  n        V#   + '       g   i     L#; i)a‚  Claim exclusive ownership of the delta sink for this stream attempt; returns its writer token.

Every attempt (each provider path, each retry) claims right before consuming; claiming bumps
the shared token, so an earlier attempt still alive on another thread is superseded and its
late chunks fenced out. Stored per-thread: a thread that never claimed can never be fenced.

See #65991.
N)rÚ   rÐ   rÒ   rÑ   Útoken©r&   rß   s   & r   Ú_claim_stream_writerÚ(StreamDeliveryMixin._claim_stream_writerë   sU   € ð 	×(Ñ(Ô*Ø×%×%Ó%Ø04×0IÑ0IÈAÕ0MÐMˆDÔ%¨÷ &à(-ˆ×ÑÔ%Øˆ÷ &×%ús   ¥AÁA+	c                ó&   <€ V ^8„  d   QhRS[ RS[/# )r   rß   r   )rÝ   r   )r   r   s   "€r   r   r   ú   s   ø€ ÷ Eñ E©sð E±tñ Er   c                ó"   € V\        V RV4      8H  # )u½   True when ``token`` is still the active writer, so a stream loop can bail the instant it is superseded.

active writer â€” i.e. no newer stream attempt has claimed the sink since (#65991).
rÒ   ©rH   rà   s   &&r   Ú_stream_writer_is_currentÚ-StreamDeliveryMixin._stream_writer_is_currentú   s   € ð
 œ Ð&<¸eÓDÑDÐDr   c                ó    <€ V ^8„  d   QhRS[ /# r   r   )r   r   s   "€r   r   r     s   ø€ ÷ [ñ [©4ñ [r   c                ój   € \        \        V RR4      RR4      pVRJ;'       d    V\        V RV4      8g  # )uÞ   True when this thread claimed the sink but a newer attempt has since claimed it (never for a non-claimer).

stream attempt has since claimed it â€” i.e. this thread is a stale writer whose chunks must be
dropped (#65991).
rÑ   Nrß   rÒ   rå   rà   s   & r   r`   Ú-StreamDeliveryMixin._stream_writer_superseded  s?   € ô œ Ð&:¸DÓAÀ7ÈDÓQˆØ˜DÐ ×ZÐZ U¬g°dÐ<RÐTYÓ.ZÑ%ZÐZr   c                ó$   <€ V ^8„  d   QhRS[ RR/# )r   Úwherer   Nr@   )r   r   s   "€r   r   r   
  s   ø€ ÷ ñ ±ð ¸ñ r   c                óú   €  \        \        V R^ 4      4      ^,           V n        V P                  pV^8X  g   W"^,
          ,          ^ 8X  d   \        P                  RW4       R# R#   \         d    ^T n         LUi ; i)z<Record + log that a superseded stream's delta was discarded.rÓ   u™   Dropped delta from a superseded stream writer at %s (discarded=%d this turn) â€” a stale stream tried to write into the turn after a retry superseded it.N)rÝ   rH   rÓ   r   r4   Úwarning)r&   rì   Ú_ns   && r   Ú_note_dropped_stream_writerÚ/StreamDeliveryMixin._note_dropped_stream_writer
  sz   € ð	,Ü*-¬g°dÐ<TÐVWÓ.XÓ*YÐ\]Õ*]ˆDÔ'ð ×(Ñ(ˆØ�Œ7�r !�V•}¨Ô*Ü�N‰Nð8ð ö	ñ +øô	 ô 	,Ø*+ˆDÖ'ð	,ús   ‚"A% Á%A:Á9A:c                ó6   <€ V ^8„  d   QhRS[ S[S[3,          /# r   r    )r   r   s   "€r   r   r     s   ø€ ÷ 
ñ 
©4±±S°­>ñ 
r   c                ó$  € R \        V RR4      ;'       g    RR\        \        V R^ 4      ;'       g    ^ 4      RV P                  ;'       g    RRV P                  ;'       g    RRV P                  ;'       g    RRV P
                  ;'       g    R	/# )
Úturn_idÚ_current_turn_idrG   Ú	iterationÚ_api_call_countÚ
session_idÚmodelÚproviderÚsurfaceÚcli)rH   rÝ   rø   rù   rú   Úplatform©r&   s   &r   r3   Ú-StreamDeliveryMixin._stream_hook_base_payload  sƒ   € à”w˜tÐ%7¸Ó<×BÐBÀØœœW TÐ+<¸aÓ@×EÐEÀAÓFØ˜$Ÿ/™/×/Ð/¨RØ�T—Z‘Z×%Ð% 2Ø˜Ÿ™×+Ð+¨Ø�t—}‘}×-Ð-¨ð
ð 	
r   c                ó   <€ V ^8„  d   QhRR/# r9   r:   )r   r   s   "€r   r   r   $  s   ø€ ÷ 5ñ 5 Dñ 5r   c                ó(   € V P                  R 4       R# )Úon_stream_startN©r6   rþ   s   &r   Ú_emit_stream_startÚ&StreamDeliveryMixin._emit_stream_start$  s   € Ø×!Ñ!Ð"3Ö4r   c                ó>   <€ V ^8„  d   QhRS[ RS[RS[ R,          RR/# )r   Ú
final_textÚfinishedÚerrorNr   r    )r   r   s   "€r   r   r   '  s5   ø€ ÷ jñ j©cð j¹Tð jÉ#ÐPTÍ*ð jÐY]ñ jr   c               ó.   € V P                  R WVR7       R# )Úon_stream_end)r  r  r	  Nr  )r&   r  r  r	  s   &$$$r   Ú_emit_stream_endÚ$StreamDeliveryMixin._emit_stream_end'  s   € Ø×!Ñ! /¸jÐchÐ!Öir   c                ó$   <€ V ^8„  d   QhRS[ RR/# r]   r@   )r   r   s   "€r   r   r   *  s   ø€ ÷ $7ñ $7¡sð $7¨tñ $7r   c                óP  € V P                  4       '       d   V P                  R4       R# \        \        V RR4      ;'       d    T;'       d    VP	                  4       4      pV'       d   RV n        RV,           p\        V\        4      '       dÍ   \        V RR4      p\        V RR4      pVe   VP                  V4      MV P                  V4      pVe   VP                  MRpV'       d'   \        V R	R4      '       g   V P                  VR
R7       Ve   VP                  V4      M
\        V4      pV'       g%   \        V RR4      '       g   VP                  R4      pV'       g   R# V P                  V4      pV P                  RVRR7       V'       d   V P!                  V4       R# R# )z;Fire all registered stream delta callbacks (display + TTS).Ú_fire_stream_deltaNÚ_stream_needs_breakFr¢   r<   r=   rG   rI   T)ÚinlinerU   Ú
Úon_stream_deltar   )ÚdeltaÚkind)r`   rð   r   rH   rh   r  r_   r!   rL   rp   Úlast_hiddenÚ_fire_reasoning_deltar   Úlstripr(   r6   rD   )r&   r   Úprepended_breakrN   ÚscrubberÚhiddenÚ	delivereds   &&     r   r  Ú&StreamDeliveryMixin._fire_stream_delta*  sv  € ð ×)Ñ)×+Ò+à×,Ñ,Ð-AÔBÙô œw tÐ-BÀEÓJ×dÐdÈt×dÐdÐX\×XbÑXbÓXdÓeˆßØ',ˆDÔ$Ø˜D•=ˆDÜ�dœC× Ò ô % TÐ+CÀTÓJˆNä˜tÐ%?ÀÓFˆHØ0>Ò0J�>×&Ñ& tÔ,ÐPT×PhÑPhÐimÓPnˆDð 4BÒ3M�^×/Ò/ÐSUˆFßœg dÐ,HÈ%×PÒPØ×*Ñ*¨6¸$Ð*Ô?Ø*2Ò*>�8—=‘= Ô&ÔDTÐUYÓDZˆD÷ #¬7°4Ð9YÐ[_×+`Ò+`Ø—{‘{ 4Ó(�ßÙØ×5Ñ5°dÓ;ˆ	Ø×!Ñ!Ð"3¸4ÀfÐ!ÔMßØ×0Ñ0°Ö6ñ r   r  Fc                ó*   <€ V ^8„  d   QhRS[ RS[RR/# )r   r   r  r   Nr    )r   r   s   "€r   r   r   P  s'   ø€ ÷ zñ z©#ð z¹$ð zÈ4ñ zr   c               óˆ  € V'       g   RV n         V P                  4       '       d   V P                  R4       R# V P                  V P                  V4       \        V RR4      pVf    ^ RIHp V! 4       pY0n        V'       d   V P                  RR	VR
R7       R# R#   \         d    \        P                  RRR7        R# i ; i)a  Fire reasoning callback if registered; superseded writers are fenced like content deltas.

``inline`` marks text recovered from ``<think>`` blocks in content; any other call is a native
provider reasoning delta and stops inline forwarding for the rest of this model response.Tr  NrJ   )Ústream_reasoning_deltas_enabledz4reasoning on_stream_delta plugin hook enqueue failedr0   r  zreasoning on_stream_deltaÚ	reasoning)r*   r  r  )rI   r`   rð   r   Úreasoning_callbackrH   r2   r!  r   r4   r5   rJ   r6   )r&   r   r  Úenabledr!  s   &&$  r   r  Ú)StreamDeliveryMixin._fire_reasoning_deltaP  s¿   € ÷
 Ø.2ˆDÔ+Ø×)Ñ)×+Ò+ð ×,Ñ,Ð-DÔEÙØ×Ñ˜4×2Ñ2°DÔ9ô ˜$Ð AÀ4ÓHˆØŠ?ðÝUá9Ó;�ð 4;Ô0ßØ×%Ñ%Ð&7Ð?ZÐbfÐmxÐ%Öyñ øô	 ô Ü—‘ÐSÐ^b�ÔcÚðús   Á'B Â"CÃ Cc                ó$   <€ V ^8„  d   QhRS[ RR/# )r   Ú	tool_namer   Nr@   )r   r   s   "€r   r   r   l  s   ø€ ÷ >ñ >±ð >¸ñ >r   c                ó>   € V P                  V P                  V4       R# )zgNotify the display layer that the model is generating tool call arguments (spinner for large payloads).N)r   Útool_gen_callback)r&   r'  s   &&r   Ú_fire_tool_gen_startedÚ*StreamDeliveryMixin._fire_tool_gen_startedl  s   € à×Ñ˜4×1Ñ1°9Ö=r   c                ó    <€ V ^8„  d   QhRS[ /# r   r   )r   r   s   "€r   r   r   p  s   ø€ ÷ 	mñ 	m¡tñ 	mr   c                óÊ   €  ^ RI Hp V! 4       '       d   R#  V P
                  RJ;'       g    \        V RR4      RJ#   \         d    \        P	                  RRR7        LIi ; i)z4Return True if any streaming consumer is registered.)Úhas_stream_observer_hooksTz(plugin stream hook consumer check failedr0   Nr$   )r2   r.  r   r4   r5   r#   rH   )r&   r.  s   & r   Ú_has_stream_consumersÚ)StreamDeliveryMixin._has_stream_consumersp  sl   € ð	TÝKá(×*Ò*Ùð +ð ×)Ñ)°Ð5×lÐl¼ÀÐGYÐ[_Ó9`ÐhlÐ9lÐløô ô 	TÜ�L‰LÐCÈdˆLÖSð	Tús   ‚= ½"A"Á!A")
rM   r¬   rI   r  rJ   rÓ   rÐ   rÑ   rÒ   rU   ))Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ústaticmethodr   r(   r6   rQ   ÚpropertyrM   ÚsetterrD   ri   rs   rz   r~   r™   r”   r¤   r¨   r°   rµ   r¼   rÂ   rÌ   rÚ   rá   ræ   r`   rð   r3   r  r  r  r  r*  r/  Ú__static_attributes__Ú__classdictcell__)r   s   @r   r
   r
      s¦  ø‡ € Ùgà÷ó ð÷ð ð
YÀd÷ Yò Y÷!3ð !3ðF ÷/ó ð/ð &×,Ñ,÷Gó -ðG÷ð ð ÷Ró ðR÷qð q÷Kð K÷5ð 5÷ð ÷0Qð Q÷]ð ]÷
ð 
÷cð c÷:ð :÷
Lð 
L÷Qð Q÷qð q÷*'ð '÷"ð ÷Eð E÷[ð [÷ð ÷ 
ð 
÷5ð 5÷jð j÷$7ð $7ðLzÀ÷ zò z÷8>ð >÷	mö 	mr   r
   )r5  Úloggingrf   rÔ   Útypingr   r   r   Úagent.memory_contextr   Úagent.message_contentr   Úagent.history_commentaryr   Ú	getLoggerr4   r
   r:   r   r   Ú<module>rA     sD   ðñó
 Û 	Û ß "Ñ "å 1Ý 6Ý 7ð 
×	Ò	˜;Ó	'€÷fmó fmr   