+
    jHàj•W  ã                  ó’   € R 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 ]P                  ! R4      t ! R R4      tR# )	z–Fallback delivery for GatewayStreamConsumer: continuation sends after edits
stop working, chunking, cursor cleanup, commentary and silence retraction.)ÚannotationsN)ÚAnyÚCallableÚOptional)ÚBasePlatformAdapter)Úensure_closed_code_fenceszgateway.stream_consumerc                  ó  € ] tR t^tRtRR/R R lltR R ltR R	 lt]]	3R
 R ll4       t
R R ltR R ltR R ltR R ltRR/R R lltR R lt]R R l4       tR R ltR R ltR  R! ltR" R# ltR$ R% ltR& R' ltR( R) ltR*tR# )+ÚStreamFallbackMixinzUNon-streaming delivery paths used once progressive edits fail or the turn ends oddly.ÚfinalFc               ó(   € V ^8„  d   QhRRRRRRRR/# )é   ÚtextÚstrÚreply_to_idúOptional[str]r
   ÚboolÚreturn© )Úformats   "ÚE/home/ubuntu/.hermes/hermes-agent/gateway/stream_consumer_fallback.pyÚ__annotate__Ú StreamFallbackMixin.__annotate__   s*   € ÷ ñ ¨#ð ¸Mð Ø%)ðØ6Cñó    c          
   ƒ  ó`  "  € V P                  V4      pVP                  4       '       g   V#  V P                  P                  V P                  WV P                  W3'       * R7      R7      G Rj  x€L
 pVP                  '       d   VP                  '       g
   RV n        V# \        VP                  4      V n
        V P                  V4       RV n        Wn        V P                  4        \        VP                  4      #  LŽ  \         d#   p\         P#                  RT4       Tu Rp?# Rp?ii ; i5i)zISend a new chunk threaded to ``reply_to_id``; returns the new message_id.)r
   Úexpect_edits©Úchat_idÚcontentÚreply_toÚmetadataNFTzStream send chunk error: %s)Ú_clean_for_displayÚstripÚadapterÚsendr   Ú_metadata_for_sendÚsuccessÚ
message_idÚ_edit_supportedr   Ú_message_idÚ_track_preview_ids_from_resultÚ_already_sentÚ_last_sent_textÚ_notify_new_messageÚ	ExceptionÚloggerÚerror)Úselfr   r   r
   ÚresultÚes   &&&$  r   Ú_send_new_chunkÚ#StreamFallbackMixin._send_new_chunk   s  é € ð ×&Ñ& tÓ,ˆØ�z‰z�|Š|ØÐð	ØŸ<™<×,Ñ,ØŸ™¨dØ×0Ñ0°uÌ9Ð0ÓUð -ó W÷ WˆFð —N—N�N v×'8×'8Ð'8Ø',�Ô$Ø"Ð"Ü" 6×#4Ñ#4Ó5ˆDÔØ×/Ñ/°Ô7Ø!%ˆDÔØ#'Ô Ø×$Ñ$Ô&Ü�v×(Ñ(Ó)Ð)ñWøô ô 	Ü�L‰LÐ6¸Ô:ØÕûð	üs`   ‚*D.­A C> Á-C<Á.C> ÂC> ÂC> ÂD.ÂAC> Ã;D.Ã<C> Ã>D+Ä	D&Ä D+Ä!D.Ä&D+Ä+D.c               ó   € V ^8„  d   QhRR/# )r   r   r   r   )r   s   "r   r   r   +   s   € ÷ /ñ / ñ /r   c                ó$  € V P                   ;'       g    RpV P                  P                  '       dO   VP                  V P                  P                  4      '       d$   VR\	        V P                  P                  4      )  pV P                  V4      # )z>Return the visible text already shown in the streamed message.Ú N)r+   ÚcfgÚcursorÚendswithÚlenr    )r0   Úprefixs   & r   Ú_visible_prefixÚ#StreamFallbackMixin._visible_prefix+   sf   € à×%Ñ%×+Ð+¨ˆØ�8‰8�?�?ˆ?˜vŸ™¨t¯x©x¯©×?Ò?ØÐ2œc $§(¡(§/¡/Ó2Ð2Ð3ˆFØ×&Ñ& vÓ.Ð.r   c               ó    € V ^8„  d   QhRRRR/# ©r   Ú
final_textr   r   r   )r   s   "r   r   r   2   s   € ÷ ñ ¨Sð °Sñ r   c                óà  € V P                   ;'       g    V P                  4       pV'       dÂ   VP                  V4      '       d«   \        V4      pV\        V4      8  d~   W,          P	                  4       '       gb   W^,
          ,          P	                  4       '       g?   \        VP                  R^ V4      VP                  R^ V4      4      pV^ 8¼  d
   V^,           pWR P                  4       # V# )zAReturn only the part of final_text the user has not already seen.Ú Ú
N)Ú_fallback_prefixr=   Ú
startswithr;   ÚisspaceÚmaxÚrfindÚlstrip)r0   rA   r<   ÚcutÚboundarys   &&   r   Ú_continuation_textÚ&StreamFallbackMixin._continuation_text2   sÉ   € à×&Ñ&×@Ð@¨$×*>Ñ*>Ó*@ˆß�j×+Ñ+¨F×3Ò3Ü�f“+ˆCð ”S˜“_Ô$¨Z­_×-DÑ-D×-FÒ-FÈzÐ`aÕZaÕOb×OjÑOj×OlÒOlÜØ×$Ñ$ S¨!¨SÓ1Ø×$Ñ$ T¨1¨cÓ2ó�ð ˜q”=Ø" Q�,�CØ˜dÐ#×*Ñ*Ó,Ð,ØÐr   c               ó(   € V ^8„  d   QhRRRRRRRR/# ©	r   r   r   ÚlimitÚintÚlen_fnzCallable[[str], int]r   z	list[str]r   )r   s   "r   r   r   J   s*   € ÷ ;ñ ; ð ;¨Sð ;Ð:Nð ;Ø )ñ;r   c                ó&   € ^ RI Hp V! WVRRR7      # )zOSplit text for fallback sends: newline-preferred, fence-balanced across chunks.)Úsplit_text_fence_awareFT)Úprefer_paragraphsÚbalance_fences)Úgateway.platforms.helpersrU   )r   rQ   rS   rU   s   &&& r   Ú_split_text_chunksÚ&StreamFallbackMixin._split_text_chunksI   s   € õ 	EÙ% d°6ÈUØ59ô;ð 	;r   c               ó(   € V ^8„  d   QhRRRRRRRR/# rP   r   )r   s   "r   r   r   Q   s*   € ÷ ñ ¨ð °Sð ÐBVð Ø"+ñr   c                óÂ  € \        V P                  RR4      p\        V4      '       g   V P                  WV4      # \	        V P                  \
        4      '       d   V! WVR7      pMV! W4      p\	        V\        \        34      '       d;   \        ;QJ d    R V 4       F  '       d   K   RM	  RM! R V 4       4      '       g   V P                  WV4      # \        V4      # )z—Split via the adapter's canonical truncate_message (platform-specific rules);
non-base test doubles / legacy adapters keep the two-argument call shape.Útruncate_messageN©rS   c              3  óB   "  € T F  p\        V\        4      x € K  	  R # 5i)N)Ú
isinstancer   )Ú.0Úcs   & r   Ú	<genexpr>Ú;StreamFallbackMixin._truncate_for_stream.<locals>.<genexpr>\   s   é € Ð;_ÑX^ÐST¼JÀqÌ#×<NÐ<NÓX^ùs   ‚FT)	Úgetattrr"   ÚcallablerY   r`   Ú_BasePlatformAdapterÚlistÚtupleÚall)r0   r   rQ   rS   ÚtruncateÚchunkss   &&&&  r   Ú_truncate_for_streamÚ(StreamFallbackMixin._truncate_for_streamQ   s­   € ô ˜4Ÿ<™<Ð);¸TÓBˆÜ˜×!Ò!Ø×*Ñ*¨4¸Ó?Ð?Ü�d—l‘lÔ$8×9Ò9Ù˜d°&Ô9‰Fá˜dÓ*ˆFÜ˜&¤4¬ -×0Ò0¿»Ñ;_ÑX^Ó;_¿¿ºÑ;_ÑX^Ó;_×8_Ò8_Ø×*Ñ*¨4¸Ó?Ð?Ü�F‹|Ðr   c               ó    € V ^8„  d   QhRRRR/# )r   r   r   r   ÚNoner   )r   s   "r   r   r   `   s   € ÷ B9ñ B9¨sð B9°tñ B9r   c              ƒ  ó  "  € \        V RR4      '       d   \        P                  R4       R# \        V P	                  V4      4      pV P                  V4      pRV n        VP                  4       '       g    V P                  V4      G Rj  x€L
 pVf   R# V P                  4       w  rEV P                  V\        RV^d,
          4      VR7      pV P                  pRpRp	Rp
W28X  d   V P                  MRpV Fˆ  pT P                  YÊ'       d   RMTRR	7      G Rj  x€L
 pV'       d   VP                  '       g   W n        W€n        W�n        RV n         R# R
p
Tp	VP&                  ;'       g    TpV P)                  4        KŠ  	  V'       d<   Wx8w  d6   V P*                  '       g$   W28X  d   V P-                  V.RRR7      G Rj  x€L
  W€n        R
V n        V P/                  VR7       VR,          V n        RV n        RV n        R#  ELv Lë LF5i)z[Send the final continuation after streaming edits stop working (one flood retry
per chunk).Ú_egress_declinedFzcsuppressing the fallback continuation: the connector already declined this destination for this runNiô  r^   r7   z1Flood control on fallback send, retrying in %.1fs©r   r   Ú	retry_logTzFallback partial)ÚlabelÚskip_sentinel©Úrecordéÿÿÿÿ)re   r.   Úwarningr   r    rM   Ú_fallback_final_sendr!   Ú_fallback_when_nothing_unseenÚ_fallback_len_budgetrY   rH   r(   Ú_initial_reply_to_idÚ_send_with_flood_retryr%   r*   r+   rE   r&   r,   Ú#_fallback_preserve_partial_messagesÚ_delete_previewsÚ_mark_final_delivered)r0   r   rA   ÚcontinuationÚ_len_fnÚ	raw_limitrl   Ústale_message_idÚlast_message_idÚlast_successful_chunkÚsent_any_chunkÚanchorÚchunkr1   s   &&            r   Ú_send_fallback_finalÚ(StreamFallbackMixin._send_fallback_final`   s	  é € ô �4Ð+¨U×3Ò3ô
 �N‰Nð9ôñ ô /¨t×/FÑ/FÀtÓ/LÓMˆ
Ø×.Ñ.¨zÓ:ˆØ$)ˆÔ!Ø×!Ñ!×#Ò#Ø!%×!CÑ!CÀJÓ!O×OˆLØÒ#Ùà!×6Ñ6Ó8ÑˆØ×(Ñ(¨´s¸3À	ÈCÅÓ7PÐY`Ð(Óaˆà×+Ñ+ÐØ)-ˆØ "ÐØˆð /;Ô.H�×*Ò*ÈdˆÛˆEØ×6Ñ6Ø¶©ÀFØMð 7ó O÷ OˆF÷  §§ ð
 &4Ô"Ø#2Ô Ø'<Ô$Ø(*�Ô%ÚØ!ˆNØ$)Ð!Ø$×/Ñ/×BÐB°?ˆOØ×$Ñ$Ö&ñ# ÷, Ð!1Ô!DØ×@×@Ð@À\ÔE_Ø×'Ñ'Ð)9Ð(:ÐBTØ6;ð (ó =÷ =ð =ð +ÔØ!ˆÔà×"Ñ"¨*Ð"Ô5Ø% b�zˆÔØ "ˆÔØ38ˆÖ0ò_ PñOñ.=ùsV   ‚BHÂ	G?Â
BHÄHÄHÄ#HÄ52HÅ(HÆHÆHÆ=HÆ>AHÈHÈHc               ó    € V ^8„  d   QhRRRR/# )r   rA   r   r   r   r   )r   s   "r   r   r   ¤   s   € ÷ -ñ -¸cð -Àmñ -r   c              ƒ  ó6  "  € V P                  4       pVP                  4       '       d–   W8X  d�   \        V P                  RR4      RJ du   V P	                  V4      G Rj  x€L
 pVR8X  d   R# RV n        RV n        RV n        VR9   V n        VR8X  d   V P                  V4       R# VR8X  d
   RV n
        R# RV n        R# VP                  4       '       d	   W8w  d   V# V P                  '       dù   V P                  '       dç   V P                  P                  '       dË   V P                  P!                  V P                  P                  4      '       d–   V P                  R\#        V P                  P                  4      )  p\$        P&                  ! \(        4      ;_uu_ 4        V P+                  V P                  VR	7      G Rj  x€L
 pVP,                  '       d   W@n        RRR4       RV n        V P/                  VR
7       R#  EL£ LB  + '       g   i     L0; i5i)zÍFallback entered but the visible prefix already covers ``final_text``: returns the
continuation to send (the whole final when the prefix is from a *previous* segment)
or None when the turn is settled here.Ú%RESEND_FINAL_ON_EMPTY_STREAM_FALLBACKFTNÚ	deliveredr7   Ú	ambiguousÚpreview©r&   r   rw   >   r“   r’   )r=   r!   re   r"   Ú_send_empty_fallback_finalr*   rE   r€   Ú_final_content_deliveredÚ_record_turn_final_payloadÚ_delivery_ambiguousÚ_final_response_sentr(   r+   r8   r9   r:   r;   Ú
contextlibÚsuppressr-   Ú_edit_messager%   r‚   )r0   rA   ÚvisibleÚdeliveryÚ
clean_textr1   s   &&    r   r|   Ú1StreamFallbackMixin._fallback_when_nothing_unseen¤   sÂ  é € ð ×&Ñ&Ó(ˆð ×Ñ×Ò :Ô#8Ü˜DŸL™LÐ*QÐSXÓYÐ]aÓaØ!×<Ñ<¸ZÓH×HˆHØ˜;Ô&ÙØ!%ˆDÔØ$&ˆDÔ!Ø7<ˆDÔ4ð -5Ð8PÑ,PˆDÔ)Ø˜9Ô$ð
 ×/Ñ/°
Ô;ñ
 ð	 ˜[Ô(Ø+/�Ô(ñ ð -2�Ô)Ùð ×Ñ×Ò *Ô"7ØÐà××Ð ×!5×!5Ð!5¸$¿(¹(¿/¿/¸/Ø×(Ñ(×1Ñ1°$·(±(·/±/×BÒBØ×-Ñ-Ð.D´°D·H±H·O±OÓ0DÐ/DÐEˆJÜ×$Ò$¤Y×/Õ/Ø#×1Ñ1¸T×=MÑ=MÐWaÐ1Ób×b�Ø—>—>�>Ø+5Ô(÷ 0ð "ˆÔà×"Ñ"¨*Ð"Ô5ÙòI Iñ< c÷ 0×/üsb   ‚AHÁHÁA4HÃHÃ.HÄ HÄ4HÅAHÆ !HÇHÇHÇHÇ$HÈHÈH	ÈHc               ó   € V ^8„  d   QhRR/# )r   r   z tuple[Callable[[str], int], int]r   )r   s   "r   r   r   Ó   s   € ÷ "ñ "Ð&Fñ "r   c                óª  € \        V P                  RR4      p\        p\        V P                  \        4      '       de   V P                  P
                  p V P                  P                  V P                  4      pV P                  P                  V P                  4      pW!3# W!3#   \         d#   p\        P                  RT4        Rp?Y!3# Rp?ii ; i)uQ   (len_fn, raw_limit) for fallback chunking â€” per-chat cap/unit on base adapters.ÚMAX_MESSAGE_LENGTHé   z$per-chat limit resolution failed: %sN)re   r"   r;   r`   rg   Úmessage_len_fnÚmax_message_length_for_chatr   Úmessage_len_fn_for_chatr-   r.   Údebug)r0   r…   r„   r2   s   &   r   r}   Ú(StreamFallbackMixin._fallback_len_budgetÓ   s³   € ä˜DŸL™LÐ*>ÀÓEˆ	Ü(+ˆÜ�d—l‘lÔ$8×9Ò9Ø—l‘l×1Ñ1ˆGðHØ ŸL™L×DÑDÀTÇ\Á\ÓR�	ØŸ,™,×>Ñ>¸t¿|¹|ÓL�ð Ð!Ð!ˆwÐ!Ð!øô ô HÜ—‘ÐCÀQ×GÐGØÐ!Ð!ûðHús   ÁA
B% Â%CÂ0CÃCr   Nc               ó    € V ^8„  d   QhRRRR/# )r   r   r   rt   r   )r   s   "r   r   r   à   s   € ÷ ñ °sð Àsñ r   c             ƒ  ó2  "  € \        V P                  VV P                  RR7      R7      pVe   W4R&   Rp\        ^4       FÍ  pV P                  P
                  ! R
/ VB G Rj  x€L
 p\        VRR4      '       d    V# V P                  V4      pV'       g   Vf    V# \        VRR4      p\        V\         4      '       d   VP                  R	4      '       d    V# \        P                  W'4       \        P                  ! V4      G Rj  x€L
  KÏ  	  V#  L° L5i)zžadapter.send(final metadata) with ONE bounded flood retry; returns the last
SendResult.  Exceptions propagate (callers decide whether a raise is "ambiguous").T©r
   ©r   r   r   Nr   r%   FÚraw_responseÚpartial_overflowr   )Údictr   r$   Úranger"   r#   re   Ú_fallback_flood_retry_delayr`   Úgetr.   r¨   ÚasyncioÚsleep)	r0   r   rt   r   Úkwargsr1   ÚattemptÚretry_delayÚraws	   &$$$     r   r   Ú*StreamFallbackMixin._send_with_flood_retryà   s
  é € ô ˜dŸl™l°GØ#×6Ñ6¸TÐ6ÓBôDˆàÒØ!)�:ÑØˆÜ˜Q–xˆGØŸ<™<×,Ò,Ñ6¨vÑ6×6ˆFÜ�v˜y¨%×0Ò0Øð ˆð ×:Ñ:¸6ÓBˆKß˜+Ò-Øð ˆô ˜& .°$Ó7ˆCÜ˜#œt×$Ò$¨¯©Ð1C×)DÒ)DØð ˆô �L‰L˜Ô0Ü—-’- Ó,×,Ò,ñ  ð ˆñ 7ñ -ùs1   ‚A DÁ"DÁ#2DÂA DÃ1DÄDÄ	DÄDc               ó    € V ^8„  d   QhRRRR/# r@   r   )r   s   "r   r   r   ö   s   € ÷ #ñ #¸3ð #À3ñ #r   c              ƒ  óÚ  "  € V P                  RR7      p V P                  WP                  RR7      G Rj  x€L
 p\        TR	R
4      '       g5   T P                  T4      '       d   R# T P                  T4      '       d   R# R# \        TRR4      pT P                  Y%RRR7      G Rj  x€L
  \        4       T n        T;'       g    RT n        RT n        T P                  4        T P                  T4      T n        Yn        RT n        R
T n        T P)                  4        R#  Lç  \         d<   p\        P                  RT4       T P                  T4      '       d   RMRu Rp?# Rp?ii ; i LÂ5i)zÔCommit a completed answer after Telegram finalization fails: "delivered", "failed"
(gateway may retry), "ambiguous" (a timeout may have landed) or "preview" (flood
control; the complete preview is authoritative).T)Úsegment_onlyz=Flood control on empty fallback final send; retrying in %.1fsrs   Nz$Empty fallback final send failed: %sr’   Úfailedr%   Fr“   r&   zEmpty fallback)Úskipru   Úretry_on_falseÚ__no_edit__r7   r‘   )Ú_stale_preview_idsr   r~   r-   r.   r¨   Ú _send_failure_may_have_deliveredre   Ú_is_flood_errorr�   ÚsetÚ_segment_preview_message_idsr(   r*   r‚   Ú_display_payloadÚ_delivered_final_textr+   rE   r€   r,   )r0   rA   Ú	stale_idsr1   ÚexcÚnew_message_ids   &&    r   r•   Ú.StreamFallbackMixin._send_empty_fallback_finalö   sm  é € ð
 ×+Ñ+¸Ð+Ó>ˆ	ð	[Ø×6Ñ6Ø"×-FÑ-FØYð 7ó [÷ [ˆFô �v˜y¨%×0Ò0Ø×#Ñ# F×+Ò+Ù Ø"&×"GÑ"GÈ×"OÒ"O�;Ð]ÐU]Ð]ä  ¨°tÓ<ˆð ×#Ñ# IÐJZØ37ð $ó 9÷ 	9ð 	9ä,/«EˆÔ)Ø)×:Ð:¨]ˆÔØ!ˆÔØ×"Ñ"Ô$ð &*×%:Ñ%:¸:Ó%FˆÔ"Ø)ÔØ "ˆÔØ38ˆÔ0Ø× Ñ Ô"Ùñ9[øô ô 	[Ü�L‰LÐ?ÀÔEØ"&×"GÑ"GÈ×"LÒ"L‘;ÐRZÕZûð	[úñ	9ùsb   ‚E+– D  ¶D·D  »)E+Á%E+Á>(E+Â&E)Â'E+ÃAE+ÄD  Ä E&Ä+0E!ÅE&ÅE+Å!E&Å&E+c               ó    € V ^8„  d   QhRRRR/# )r   Úresult_or_excr   r   r   r   )r   s   "r   r   r     s   € ÷ Oñ O¸ð OÀñ Or   c                ó
  € \        V RR4      RJ d   R# \        \        V RR4      ;'       g    T 4      P                  4       pV P                  P                  P                  4       pRV9   ;'       g    RV9   ;'       g    RV9   # )z>Return True for timeout failures where retrying may duplicate.Ú	retryableNTFr/   Útimeoutz	timed out)re   r   ÚlowerÚ	__class__Ú__name__)rÎ   r/   Únames   &  r   rÃ   Ú4StreamFallbackMixin._send_failure_may_have_delivered  s{   € ô �= +¨tÓ4¸Ó<ÙÜ”G˜M¨7°DÓ9×JÐJ¸]ÓK×QÑQÓSˆØ×&Ñ&×/Ñ/×5Ñ5Ó7ˆØ˜EÑ!×NÐN [°EÑ%9×NÐN¸YÈ$Ñ=NÐNr   c               ó    € V ^8„  d   QhRRRR/# )r   r1   r   r   zfloat | Noner   )r   s   "r   r   r   $  s   € ÷ ñ °#ð ¸,ñ r   c                ó  € V P                  V4      '       g   R#  \        \        VRR4      ;'       g    R4      pW P
                  8”  d   \        P                  RV4       R# \        RV4      #   \        \        3 d    Rp LIi ; i)zCReturn a bounded retry delay for a fallback send, if safe to retry.NÚretry_afterg      @zCFlood control requests %.1fs; leaving final delivery to the gatewayg        )	rÄ   Úfloatre   Ú	TypeErrorÚ
ValueErrorÚ!_max_fallback_flood_retry_secondsr.   r¨   rH   )r0   r1   Údelays   && r   r²   Ú/StreamFallbackMixin._fallback_flood_retry_delay$  s€   € à×#Ñ# F×+Ò+Ùð	Üœ' &¨-¸Ó>×EÐEÀ#ÓFˆEð ×9Ñ9Ô9Ü�L‰LÐ^Øô áÜ�3˜‹Ðøô œ:Ð&ô 	ØŠEð	ús   ›A/ ´A/ Á/BÂBc               ó   € V ^8„  d   QhRR/# )r   r   r   r   )r   s   "r   r   r   2  s   € ÷ Yñ Y¨ñ Yr   c                óŠ   € \        VRR4      ;'       g    RP                  4       pRV9   ;'       g    RV9   ;'       g    RV9   # )zFCheck if a SendResult failure is due to flood control / rate limiting.r/   r7   Úfloodzretry afterÚrate)re   rÒ   )r0   r1   Ú	err_lowers   && r   rÄ   Ú#StreamFallbackMixin._is_flood_error2  sF   € ä˜V W¨bÓ1×7Ð7°R×>Ñ>Ó@ˆ	Ø˜)Ñ#×XÐX }¸	Ñ'A×XÐXÀVÈyÑEXÐXr   c               ó   € V ^8„  d   QhRR/# ©r   r   rp   r   )r   s   "r   r   r   7  s   € ÷ Bñ B¸4ñ Br   c              ƒ  ó  "  € \        V RR4      '       d   R# V P                  '       g   V P                  4       G Rj  x€L
  V P                  ;'       g    V P	                  4       pV P
                  pV'       d4   VP                  V4      '       d   V\        V4      R P                  4       pV P                  V4      pVP                  4       '       g   R#  V P                  '       d   \        V P                  4      M/ pRVR&   V P                  P                  V P                  W#R7      G Rj  x€L
 pVP                   '       d
   RV n        R# R#  EL L$  \$         d"   p\&        P)                  RT4        Rp?R# Rp?ii ; i5i)zxBefore a segment reset, send the unseen tail as a new message (and best-effort
strip the stuck cursor from the partial).rr   FNTÚ_interim_sendr­   z"Segment-break tail flush error: %s)re   r{   Ú_try_strip_cursorrE   r=   Ú_accumulatedrF   r;   rJ   r    r!   r   r°   r"   r#   r   r%   r*   r-   r.   r/   )r0   r�   ÚtailÚ_mdr1   r2   s   &     r   Ú#_flush_segment_tail_on_edit_failureÚ7StreamFallbackMixin._flush_segment_tail_on_edit_failure7  s5  é € ô �4Ð+¨U×3Ò3ÙØ×(×(Ð(Ø×(Ñ(Ó*×*Ð*Ø×'Ñ'×AÐA¨4×+?Ñ+?Ó+AˆØ× Ñ ˆß�t—‘ w×/Ò/Øœ˜G›˜Ð&×-Ñ-Ó/ˆDØ×&Ñ& tÓ,ˆØ�z‰z�|Š|Ùð	Bà)-¯¯¨”$�t—}‘}Ô%¸BˆCØ#'ˆC�Ñ ØŸ<™<×,Ñ,°T·\±\È4Ð,Ó^×^ˆFØ�~�~ˆ~Ø%)�Ö"ñ ò +ñ _øô ô 	BÜ�L‰LÐ=¸q×AÒAûð	Büsv   ‚'FªF½E¾FÁ$FÁ:FÂAFÃFÃE Ã)AE Ä/EÄ0E ÅE ÅFÅE ÅFÅ!E=Å7FÅ=FÆFc               ó   € V ^8„  d   QhRR/# rç   r   )r   s   "r   r   r   O  s   € ÷ .ñ .¨ñ .r   c              ƒ  óˆ  "  € V P                  4       pV P                  4       '       d   VP                  4       '       g   R# \        P                  ! \
        4      ;_uu_ 4        V P                  V P                  VR7      G Rj  x€L
 p\        VRR4      '       d   Wn	        RRR4       R#  L'  + '       g   i     R# ; i5i)zEBest-effort edit removing a stuck cursor when entering fallback mode.Nr”   r%   F)
r=   Ú_has_real_previewr!   rš   r›   r-   rœ   r(   re   r+   )r0   r<   r1   s   &  r   rê   Ú%StreamFallbackMixin._try_strip_cursorO  sŠ   é € à×%Ñ%Ó'ˆØ×%Ñ%×'Ò'¨v¯|©|¯~ª~ÙÜ× Ò ¤×+Õ+Ø×-Ñ-¸×9IÑ9IÐSYÐ-ÓZ×ZˆFÜ�v˜y¨%×0Ò0Ø'-Ô$÷ ,Ñ+ÙZ÷ ,×+Ð+üs4   ‚<C¿$CÁ#!B.ÂB,ÂB.Â"
CÂ,B.Â.B?	Â9	Cc               ó    € V ^8„  d   QhRRRR/# )r   r   r   r   r   r   )r   s   "r   r   r   Y  s   € ÷ ñ ¨3ð °4ñ r   c              ƒ  óÜ  "  € V P                  V4      pVP                  4       '       g   R#  V P                  RR7      ;'       g    / pRVR&   \        \        V P                  RR4      RR4      p\        T;'       g    \        V P                  RR	4      4      P                  4       pVR9   pV P                  P                  V P                  TV'       d   V P                  MRVR
7      G Rj  x€L
 pVP                  '       d,   V P                  4        V P                  P                  V4       VP                  #  LM  \         d"   p\        P!                  RT4        Rp?R# Rp?ii ; i5i)z6Send a completed interim assistant commentary message.Fr¬   Tré   ÚplatformNÚvaluerÕ   r7   r   zCommentary send error: %s)ÚbuzzÚslackÚ
mattermostÚfeishu)r    r!   r$   re   r"   r   rÒ   r#   r   r~   r%   r,   Ú_delivered_commentary_textsÚappendr-   r.   r/   )r0   r   rí   Ú_platÚ_platform_nameÚ_needs_reply_anchorr1   r2   s   &&      r   Ú_send_commentaryÚ$StreamFallbackMixin._send_commentaryY  s9  é € à×&Ñ& tÓ,ˆØ�z‰z�|Š|Ùð	ð ×)Ñ)°Ð)Ó6×<Ð<¸"ˆCØ#'ˆC�Ñ ô œG D§L¡L°*¸dÓCÀWÈdÓSˆEÜ  ×!KÐ!K¬'°$·,±,ÀÈÓ*KÓL×RÑRÓTˆNØ"0Ð4]Ñ"]ÐØŸ<™<×,Ñ,ØŸ™¨dß6I˜×2Ò2ÈtÐ^að -ó c÷ cˆFð
 �~�~ˆ~Ø×(Ñ(Ô*ð
 ×0Ñ0×7Ñ7¸Ô=Ø—>‘>Ð!ñcøô ô 	Ü�L‰LÐ4°aÔ8Ýûð	üsM   ‚*E,­D= ÁB'D= Ã-D;Ã.D= Ä6D= Ä:E,Ä;D= Ä=E)ÅE$ÅE,Å$E)Å)E,c               ó   € V ^8„  d   QhRR/# )r   r   rR   r   )r   s   "r   r   r   z  s   € ÷ ñ  Cñ r   c                óî  € \        V P                  RR4      p\        V P                  \        4      '       d`    V P                  P	                  V P
                  4      p V P                  P                  4       p\        V\        4      '       d	   W18”  d   V# V#   \         d!   p\        P                  RT4        Rp?LaRp?ii ; i  \         d#   p\        P                  RT4       Rp Rp?LvRp?ii ; i)zÏPer-chat length budget (``message_len_fn`` units) before overflow splits; rich
adapters may raise it via ``streaming_overflow_limit`` so a reply that fits one rich
message isn't fragmented at the edit limit.r£   r¤   z&max_message_length_for_chat failed: %sNz)streaming_overflow_limit check failed: %s)re   r"   r`   rg   r¦   r   r-   r.   r¨   Ústreaming_overflow_limitrR   )r0   Úbaser2   Úcaps   &   r   Ú_raw_message_limitÚ&StreamFallbackMixin._raw_message_limitz  sÆ   € ô �t—|‘|Ð%9¸4Ó@ˆä�d—l‘lÔ$8×9Ò9ðJØ—|‘|×?Ñ?ÀÇÁÓM�ðØ—l‘l×;Ñ;Ó=�ô ˜#œs×#Ò#¨¬
Ø�
Øˆøô ô JÜ—‘ÐEÀq×IÑIûðJûô ô Ü—‘ÐHÈ!ÔLØ•ûðús/   ¹%B ÁC ÂCÂ$B?Â?CÃC4ÃC/Ã/C4c               ó   € V ^8„  d   QhRR/# rç   r   )r   s   "r   r   r   �  s   € ÷ ^ñ ^°ñ ^r   c              ƒ  ó‚  "  € V P                   '       d   V P                  R4      G Rj  x€L
  V P                  V P                  4       RR7      G Rj  x€L
  \	        4       V n        RV n        R;V n        ;V n        V n	        RV n
        V P                  4        \        P                  RV P                  4       R#  L‘ Lj5i)zÜRetract any streamed preview when the final reply is a bare silence marker.  Flags
stay False so the gateway's whole-response filter owns what goes out next: "" for a
machinery turn, the visible fallback for a human one.z-Silence-marker native stream close failed: %sNzSilence-marker)ru   r7   Fz8Suppressed streamed intentional-silence marker (chat=%s))Ú_native_stream_openedÚ_close_empty_native_bubbler�   rÂ   rÅ   Ú_preview_message_idsr(   rë   Ú_stream_ledgerr+   r*   Ú_clear_turn_final_flagsr.   Úinfor   )r0   s   &r   Ú_suppress_silence_markerÚ,StreamFallbackMixin._suppress_silence_marker�  s¨   é € ð ×%×%Ð%Ø×1Ñ1Ð2aÓb×bÐbà×#Ñ# D×$;Ñ$;Ó$=ÐEUÐ#ÓV×VÐVÜ$'£EˆÔ!ØˆÔØIKÐKˆÔÐK˜DÔ/°$Ô2FØ"ˆÔØ×$Ñ$Ô&Ü�‰ÐNÐPT×P\ÑP\Ö]ñ cáVùs"   ‚'B?©B;ª(B?ÁB=ÁA)B?Â=B?)rë   r*   rÈ   r˜   r'   r{   rE   r€   r–   r™   r+   r(   r  rÆ   r  )rÔ   Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r3   r=   rM   Ústaticmethodr;   rY   rm   rŒ   r|   r}   r   r•   rÃ   r²   rÄ   rî   rê   r  r  r  Ú__static_attributes__r   r   r   r	   r	      s    † Ù_ðØ,1÷õ./õð. ØQTö ;ó ð;õõB9õH-õ^"ðÐUY÷ õ,#ðJ ôOó ðOõõYõ
Bõ0.õõB÷,^ñ ^r   r	   )r  Ú
__future__r   r´   rš   ÚloggingÚtypingr   r   r   Úgateway.platforms.baser   rg   Úgateway.stream_consumer_fencesr   Ú	getLoggerr.   r	   r   r   r   Ú<module>r      sD   ðñNõ #ã Û Û ß *Ñ *å NÝ Dà	×	Ò	Ð4Ó	5€÷N^ó N^r   