+
    jHàjÁƒ  ã                  ó¦   € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIHtH	t	 ^ RI
Ht ^ RIHt ^ RIHt ]P"                  ! R4      tRt ! R	 R
4      tR# )zÐTransport layer of GatewayStreamConsumer: native frames, drafts, edit/send.

Mixin methods use only ``self`` state; see gateway/stream_consumer.py for the
state model and the drain loop that calls into these.)ÚannotationsN)ÚAnyÚOptional)ÚBasePlatformAdapter)Úensure_closed_code_fences)Ústops_reply_clockzgateway.stream_consumerg      >@c                  óÆ  € ] tR t^tRt^tRR/R R lltRR/R R llt]RR/R	 R
 l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/R R lltRRRRRR/R R l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+ R, ltR- R. ltR/ R0 ltR1R/R2 R3 lltR4 R5 lt]RRR1R/R6 R7 ll4       tR8 R9 ltR: R; ltR< R= lt R> R? lt!R@ RA lt"RB RC lt#RDt$R# )EÚStreamTransportMixinzGSend/edit/frame primitives and the transport-ordered ``_send_or_edit``.ÚfinalizeFc               ó$   € V ^8„  d   QhRRRRRR/# )é   Ú
message_idÚstrÚcontentr
   Úbool© )Úformats   "ÚF/home/ubuntu/.hermes/hermes-agent/gateway/stream_consumer_transport.pyÚ__annotate__Ú!StreamTransportMixin.__annotate__   s!   € ÷ 9ñ 9°ð 9¸sð 9Èdñ 9ó    c             ƒ  ó  "  € \        V P                  WVR7      pV P                  '       d¢    \        P                  ! V P
                  P                  4      P                  pRV9   gW   \        ;QJ d*    R VP                  4        4       F  '       g   K   RM	  RM! R VP                  4        4       4      '       d   V P                  VR&   V P
                  P                  ! R/ VB G Rj  x€L
 #   \        \        3 d     L7i ; i L5i)z>Edit via the adapter, passing routing metadata when supported.)Úchat_idr   r   r
   Úmetadatac              3  ól   "  € T F*  qP                   \        P                  P                  J x € K,  	  R # 5i)N)ÚkindÚinspectÚ	ParameterÚVAR_KEYWORD)Ú.0Úparams   & r   Ú	<genexpr>Ú5StreamTransportMixin._edit_message.<locals>.<genexpr>'   s'   é € ð /^ÙM\ÀE—J‘J¤'×"3Ñ"3×"?Ñ"?Õ?Ë_ùs   ‚24TFNr   )Údictr   r   r   Ú	signatureÚadapterÚedit_messageÚ
parametersÚanyÚvaluesÚ	TypeErrorÚ
ValueError)Úselfr   r   r
   ÚkwargsÚparamss   &$$$  r   Ú_edit_messageÚ"StreamTransportMixin._edit_message   sÙ   é € ô ˜dŸl™l°zØ'ô)ˆà�=�=ˆ=ðÜ ×*Ò*¨4¯<©<×+DÑ+DÓE×PÑP�Ø Ô'¯3«3ñ /^ØMSÏ]É]Ì_ó/^¯3¯3ª3ñ /^ØMSÏ]É]Ì_ó/^÷ ,^ò ,^à)-¯©�F˜:Ñ&ð —\‘\×.Ò.Ñ8°Ñ8×8Ð8øô œzÐ*ô Ùðúá8ùsG   ‚+D®AC2 Á4C2 Â(C2 Â?C2 ÃDÃ-D	Ã.DÃ2DÄDÄDÄDÚexc_infoc               ó$   € V ^8„  d   QhRRRRRR/# ©r   Úfail_logr   r1   r   Úreturnr   )r   s   "r   r   r   .   s'   € ÷ Hñ H¨cð HÀð HÐQUñ Hr   c             ƒ  ó¾   "  € V P                   P                  RV P                  V P                  V P                  R7      pV P                  W1VR7      G Rj  x€L
 #  L5i)zÌOpen a native stream with an empty seed frame (typing indicator before any token) as a
bool; a raise logs ``fail_log`` at DEBUG (error formatted in, or the traceback when
``exc_info``) and reads as False.Ú )r   Úreply_toÚturn_id©r1   N)r%   Úsend_stream_framer   Ú_initial_reply_to_idÚ_turn_idÚ
_try_frame)r,   r4   r1   Úseeds   &&$ r   Ú_try_seed_frameÚ$StreamTransportMixin._try_seed_frame.   sT   é € ð �|‰|×-Ñ-Ø˜Ÿ™¨t×/HÑ/HÐRV×R_ÑR_ð .ó aˆà—_‘_ T¸h�_ÓG×GÐGÑGùs   ‚AAÁAÁAc               ó$   € V ^8„  d   QhRRRRRR/# r3   r   )r   s   "r   r   r   7   s!   € ÷ 	ñ 	¨ð 	¸4ð 	ÈDñ 	r   c             ƒ  óÒ   "  €  \        V G Rj  x€L
 4      #  L  \         dA   pT'       d   \        P                  TRR7       M\        P                  Y4        Rp?R# Rp?ii ; i5i)zTAwait a frame send as a bool; a raise logs ``fail_log`` at DEBUG and reads as False.NTr:   F)r   Ú	ExceptionÚloggerÚdebug)Úcoror4   r1   Úes   &&$ r   r>   ÚStreamTransportMixin._try_frame6   sJ   é € ð	Ü˜dŸ
Ó#Ð#™
øÜô 	ßÜ—‘˜X°�Õ5ä—‘˜XÔ)Ýûð	üs6   ‚A'„
 Ž� –A'— ™A$¤5AÁA'ÁA$Á$A'c               ó    € V ^8„  d   QhRRRR/# )r   Útextr   r
   r   r   )r   s   "r   r   r   B   s   € ÷ #ñ # cð #¸ñ #r   c             ƒ  ó˜   "  € V P                   P                  WV P                  V P                  V P                  R7      G Rj  x€L
 #  L5i)zNOne native-stream frame; every frame carries the same chat/reply/turn routing.)r
   r   r8   r9   N)r%   r;   r   r<   r=   )r,   rK   r
   s   &&$r   Ú_send_frameÚ StreamTransportMixin._send_frameB   sC   é € à—\‘\×3Ñ3Ø¨T¯\©\ÀD×D]ÑD]Ø—M‘Mð 4ó #÷ #ð 	#ñ #ùs   ‚AA
ÁAÁA
c               ó   € V ^8„  d   QhRR/# ©r   r5   ÚNoner   )r   s   "r   r   r   H   s   € ÷ )ñ ) Tñ )r   c                ó"   € RV n         ^ V n        R# )zDMark the native stream closed (next content re-seeds or falls back).FN)Ú_native_stream_openedÚ_native_last_pushed_len©r,   s   &r   Ú_close_native_stateÚ(StreamTransportMixin._close_native_stateH   s   € à%*ˆÔ"Ø'(ˆÖ$r   c               ó    € V ^8„  d   QhRRRR/# )r   r4   r   r5   rQ   r   )r   s   "r   r   r   M   s   € ÷ ,ñ ,¸ð ,Àñ ,r   c              ƒ  ó–   "  € V P                  V P                  RRR7      V4      G Rj  x€L
  V P                  4        RV n        R#  L5i)zRBest-effort empty finalize frame to close an open typing bubble, then mark closed.r7   T©r
   NF)r>   rM   rV   Ú_reopen_seeded_eagerly)r,   r4   s   &&r   Ú_close_empty_native_bubbleÚ/StreamTransportMixin._close_empty_native_bubbleM   sC   é € à�o‰o˜d×.Ñ.¨r¸DÐ.ÓAÀ8ÓL×LÐLØ× Ñ Ô"Ø&+ˆÖ#ñ 	Mùs   ‚'A	©AªA	c               ó   € V ^8„  d   QhRR/# rP   r   )r   s   "r   r   r   S   s   € ÷ $ñ $°$ñ $r   c                óV   € RV n         V P                  4        RV P                  n        R# )zŸLeave native mode; buffer_only so post-boundary output is ONE send() at got_done
(mid-stream flushes would create multiple messages on non-editable platforms).FTN)Ú_use_native_streamingrV   ÚcfgÚbuffer_onlyrU   s   &r   Ú _degrade_native_to_buffered_sendÚ5StreamTransportMixin._degrade_native_to_buffered_sendS   s$   € ð &+ˆÔ"Ø× Ñ Ô"Ø#ˆ�‰Ör   c               ó   € V ^8„  d   QhRR/# )r   r5   zdict | Noner   )r   s   "r   r   r   Z   s   € ÷ ñ  ñ r   c                óÈ   € V P                   '       d   \        V P                   4      M/ pV P                  '       d   VP                  RV P                  4       T;'       g    R# )z›Draft-frame metadata: same reply_to_message_id as the final send, because the
relay adapter keys draft/seal state on it (flat DMs have no thread metadata).Úreply_to_message_idN)r   r#   r<   Ú
setdefault)r,   Úmds   & r   Ú_draft_metadataÚ$StreamTransportMixin._draft_metadataZ   sI   € ð %)§M§M MŒT�$—-‘-Ô °rˆØ×$×$Ð$Ø�M‰MÐ/°×1JÑ1JÔKØ�zˆz�TÐr   Úsegment_onlyc               ó    € V ^8„  d   QhRRRR/# )r   rl   r   r5   Úsetr   )r   s   "r   r   r   b   s   € ÷ ñ °$ð À3ñ r   c               ó  € \        V'       d   V P                  MV P                  4      pV P                  '       dJ   V P                  R8w  d9   TP	                  V'       d   \        V P                  4      MV P                  4       V# )zPPreview ids a fresh final replaces; ``segment_only`` spares finalized preambles.Ú__no_edit__)rn   Ú_segment_preview_message_idsÚ_preview_message_idsÚ_message_idÚaddr   )r,   rl   Ú	stale_idss   &$ r   Ú_stale_preview_idsÚ'StreamTransportMixin._stale_preview_idsb   s_   € ä¿\˜×9Ò9Ø!×6Ñ6ó8ˆ	à××Ð × 0Ñ 0°MÔ AØ�M‰M·<œ#˜d×.Ñ.Ô/ÀT×EUÑEUÔVØÐr   ÚskipNÚretry_on_falseÚskip_sentinelTc               ó(   € V ^8„  d   QhRRRRRRRR/# )r   Úlabelr   ry   r   rz   r5   rQ   r   )r   s   "r   r   r   j   s1   € ÷ Wñ WÀSð WØ/3ðWØLPðWØ\`ñWr   c             ƒ  óÒ  "  € \        V P                  RR4      pVf   R# V F‰  pV'       d   Wr8X  g   V'       d
   VR8X  d   K"   V! V P                  V4      G Rj  x€L
 pV'       dD   VRJ d<   \        P                  ! R4      G Rj  x€L
  V! V P                  V4      G Rj  x€L
  K‡  K‰  K‹  	  R#  LU L+ L  \
         d#   p	\        P                  RY7T	4        Rp	?	K½  Rp	?	ii ; i5i)zMBest-effort delete of stale previews; never the message just sent (``skip``).Údelete_messageNrp   Fg      ð?z"%s preview cleanup failed (%s): %s)Úgetattrr%   r   ÚasyncioÚsleeprD   rE   rF   )
r,   ru   rx   r|   ry   rz   Ú	delete_fnÚstale_idÚdeletedrH   s
   &&$$$$    r   Ú_delete_previewsÚ%StreamTransportMixin._delete_previewsj   sÈ   é € ô ˜DŸL™LÐ*:¸DÓAˆ	ØÒÙÛ!ˆHß˜xÔ/·MÀhÐR_ÔF_Ùð
WÙ )¨$¯,©,¸Ó A×A�ß! g°Ó&6ô
 "Ÿ-š-¨Ó,×,Ð,Ù# D§L¡L°(Ó;×;Ò;ñ '7‘>ó "ñ Bñ -Ù;øÜô WÜ—‘ÐAÀ5ÐTU×VÒVûðWüsp   ‚8C'»	C'ÁB7ÁB1ÁB7Á(B7ÂB3ÂB7Â"B5Â#B7Â'
C'Â1B7Â3B7Â5B7Â7C$ÃCÃC'ÃC$Ã$C'c               ó   € V ^8„  d   QhRR/# ©r   r5   r   r   )r   s   "r   r   r      s   € ÷ ñ ¨$ñ r   c                óº  € V P                   P                  ;'       g    RP                  4       pVR9   g!   \        V P                  \
        4      '       g   R# \        V P                   P                  ;'       g    RV P                  R7      p  V P                  P                  ! RRV P                  /VB pT'       g=   TR	8X  d6   \        P                  R
T P                  T P                   P                  4       \        T4      #   \         d     T P                  P                  ! R/ TB p Lxi ; i  \         d    \        P                  RRR7       Rp L¢i ; i)uƒ   cfg.transport "draft"/"auto" â†’ the adapter's supports_draft_streaming probe
("draft" logs the downgrade); "edit"/"off" â†’ False.ÚeditFN©Ú	chat_typer   r   z%supports_draft_streaming probe raisedTr:   ÚdraftuU   Draft streaming requested but unsupported (chat=%s, type=%r) â€” falling back to edit)rŠ   Úoffr   )ra   Ú	transportÚlowerÚ
isinstancer%   Ú_BasePlatformAdapterr#   rŒ   r   Úsupports_draft_streamingr   r*   rD   rE   rF   r   )r,   r�   Úprobe_kwargsÚ	supporteds   &   r   Ú_resolve_draft_streamingÚ-StreamTransportMixin._resolve_draft_streaming   s"  € ð —X‘X×'Ñ'×1Ð1¨6×8Ñ8Ó:ˆ	à˜Ô'¬z¸$¿,¹,ÔH\×/]Ò/]ÙÜ d§h¡h×&8Ñ&8×&@Ð&@¸DÈ4Ï=É=ÔYˆð
	ðRð !ŸL™L×AÒAñ RÈ$Ï,É,ð RØDPñR�	÷ ˜Y¨'Ô1Ü�L‰Lð 0Ø15·±¸t¿x¹x×?QÑ?QôSä�I‹Ðøô ô RØ ŸL™L×AÒAÑQÀLÑQ’	ðRûäô 	Ü�L‰LÐ@È4ˆLÔPØŠIð	ús*   Â(D Ä'D0Ä-D3 Ä/D0Ä0D3 Ä3$EÅEc               ó   € V ^8„  d   QhRR/# rˆ   r   )r   s   "r   r   r   —   s   € ÷ ñ ¨4ñ r   c                ó–  € \        V P                  \        4      '       d'   \        \	        V P                  4      RR4      '       g   R# \        V P                  RR4      pVf   R#  \        T! V P                  P                  ;'       g    RV P                  R7      4      #   \         d    \        P                  RRR7        R# i ; i)	z£Native streaming (send_stream_frame for ALL frames): a BasePlatformAdapter with
class-level SUPPORTS_NATIVE_STREAMING and a truthy supports_native_streaming probe.ÚSUPPORTS_NATIVE_STREAMINGFÚsupports_native_streamingNr‹   z&supports_native_streaming probe raisedTr:   )r‘   r%   r’   r   Útyper   ra   rŒ   r   rD   rE   rF   )r,   Úprobes   & r   Ú_resolve_native_streamingÚ.StreamTransportMixin._resolve_native_streaming—   s�   € ô ˜4Ÿ<™<Ô)=×>Ò>ÜœD §¡Ó.Ð0KÈU×SÒSÙÜ˜Ÿ™Ð&AÀ4ÓHˆØŠ=Ùð	Ü™¨¯©×(:Ñ(:×(BÐ(B¸dÈTÏ]É]Ô[Ó\Ð\øÜô 	Ü�L‰LÐAÈDˆLÔQÚð	ús   Á'#B" ÂB" Â""CÃCc               ó    € V ^8„  d   QhRRRR/# ©r   rK   r   r5   r   r   )r   s   "r   r   r   ¦   s   € ÷ "ñ "¨Cð "°Dñ "r   c              ƒ  óH  "  € V P                   f
   RV n        R#  V P                  P                  V P                  V P                   VV P                  4       R7      G Rj  x€L
 p\        VRR4      '       d	   Wn        R# ^ RIH	p V! V4      '       d   \        P                  R4       RV n        \        P                  R\        VR	R
4      4       V ;P                  ^,          un        RV n        R#  L’  \         d!   p\        P                  RT4        Rp?LJRp?ii ; i5i)z˜Emit one draft frame; any failure permanently disables drafts for this run.
Drafts have no message_id and clear on the client when the final send lands.NF)r   Údraft_idr   r   ÚsuccessT©Údeclined_sendz”send_draft DECLINED by the connector's egress guard; suppressing every later send for this run (the destination is not approved for this connection)z@send_draft returned success=False, disabling draft transport: %sÚerrorÚunknownz=send_draft raised, disabling draft transport for this run: %s)Ú	_draft_idÚ_use_draft_streamingr%   Ú
send_draftr   rj   r   Ú_last_sent_textÚgateway.relay.egressr¦   rE   ÚwarningÚ_egress_declinedrF   rD   Ú_draft_failures)r,   rK   Úresultr¦   rH   s   &&   r   Ú_send_draft_frameÚ&StreamTransportMixin._send_draft_frame¦   s  é € ð �>‰>Ò!à(-ˆDÔ%Ùð	>ØŸ<™<×2Ñ2ØŸ™¨t¯~©~ÀtØ×-Ñ-Ó/ð 3ó 1÷ 1ˆFô �v˜y¨%×0Ò0Ø'+Ô$Ùõ
 ;á˜V×$Ò$Ü—‘ð;ôð
 )-�Ô%Ü�L‰LÐ[Ü  ¨°)Ó<ô>à×Ò Õ!ÕØ$)ˆÔ!Ùñ51øô ô 	]Ü�L‰LÐXÐZ[×\Ñ\ûð	]üsH   ‚D"›AC4 ÁC2Á C4 Á$.D"ÂAD"Ã2C4 Ã4DÃ?DÄD"ÄDÄD"c               ó   € V ^8„  d   QhRR/# rP   r   )r   s   "r   r   r   Ê   s   € ÷ Kñ K¨dñ Kr   c              ƒ  ó¸  "  € V P                   '       g   R# \        \        V P                  4      RR4      f   R#  V P                  P	                  V P
                  V P                  ;'       g    V P                  V P                  4      V P                  4       R7      G Rj  x€L
  R#  L  \         d"   p\        P                  RT4        Rp?R# Rp?ii ; i5i)zºSeal an orphaned draft stream on turn death (stale exit / cancel): else the live
indicator stays forever and armed interception state leaks into the next turn.
Never sets delivery flags.NÚabandon_open_draft©r   z+abandon_open_draft failed (best-effort): %s)rª   r   rœ   r%   r¶   r   r¬   Ú_clean_for_displayÚ_accumulatedrj   rD   rE   rF   )r,   rH   s   & r   Ú_abandon_native_streamÚ+StreamTransportMixin._abandon_native_streamÊ   s²   é € ð ×(×(Ð(ÙÜ”4˜Ÿ™Ó%Ð';¸TÓBÒJÙð	KØ—,‘,×1Ñ1Ø—‘˜d×2Ñ2×`Ð`°d×6MÑ6MÈd×N_ÑN_Ó6`Ø×-Ñ-Ó/ð 2ó 1÷ 1ô 1øô ô 	KÜ�L‰LÐFÈ×JÒJûð	KüsF   ‚9C¼2B+ Á/3B+ Â"B)Â#B+ Â'CÂ)B+ Â+CÂ6CÃCÃCÃCc               ó   € V ^8„  d   QhRR/# rˆ   r   )r   s   "r   r   r   Ù   s   € ÷ Lñ L 4ñ Lr   c                óZ   € \        V P                  4      ;'       d    V P                  R8g  # )z=A real (editable, deletable) preview message id is on screen.rp   )r   rs   rU   s   &r   Ú_has_real_previewÚ&StreamTransportMixin._has_real_previewÙ   s&   € ä�D×$Ñ$Ó%×KÐK¨$×*:Ñ*:¸mÑ*KÐKr   c               ó   € V ^8„  d   QhRR/# rˆ   r   )r   s   "r   r   r   Ý   s   € ÷ Hñ H¨$ñ Hr   c                óð   € \        V P                  RR4      ;'       g    RpV^ 8:  g%   V P                  4       '       d   V P                  f   R# \        P
                  ! 4       V P                  ,
          V8¬  # )uz   True when fresh-final is enabled and a real preview has been visible â‰¥ threshold.

Ported from openclaw/openclaw#72038.
Úfresh_final_after_secondsg        F)r   ra   r¾   Ú_message_created_tsÚtimeÚ	monotonic)r,   Ú	thresholds   & r   Ú_should_send_fresh_finalÚ-StreamTransportMixin._should_send_fresh_finalÝ   s_   € ô
 ˜DŸH™HÐ&AÀ3ÓG×NÐNÈ3ˆ	Ø˜Œ> ×!7Ñ!7×!9Ò!9¸T×=UÑ=UÒ=]ÙÜ�~Š~Ó $×":Ñ":Õ:¸iÑGÐGr   c               ó    € V ^8„  d   QhRRRR/# )r   r   zOptional[str]r5   rQ   r   )r   s   "r   r   r   ç   s   € ÷ >ñ >¨Mð >¸dñ >r   c                ó®   € V'       dM   VR8w  dD   \        V4      pV P                  P                  V4       V P                  P                  V4       R# R# R# )z:Record a real preview message id for finalization cleanup.rp   N)r   rr   rt   rq   ©r,   r   s   &&r   Ú_track_preview_idÚ&StreamTransportMixin._track_preview_idç   sD   € ç˜*¨Ô5Ü˜Z›ˆJØ×%Ñ%×)Ñ)¨*Ô5Ø×-Ñ-×1Ñ1°*Ö=ñ 6‰:r   c               ó    € V ^8„  d   QhRRRR/# )r   r±   r   r5   rQ   r   )r   s   "r   r   r   î   s   € ÷ (ñ (°Sð (¸Tñ (r   c                ó  € \        VRR4      ;'       g    / p\        V\        4      '       d   VP                  R4      MRp\        VRR4      .\        VRR4      ;'       g    ROT;'       g    RO F  pV P	                  V4       K  	  R# )zHRecord the primary id plus any continuation ids from an oversized split.Úraw_responseNÚmessage_idsr   Úcontinuation_message_idsr   )r   r‘   r#   ÚgetrÌ   )r,   r±   ÚrawÚraw_idsÚmids   &&   r   Ú_track_preview_ids_from_resultÚ3StreamTransportMixin._track_preview_ids_from_resultî   s‰   € ä�f˜n¨dÓ3×9Ð9°rˆÜ,6°s¼D×,AÒ,A�#—'‘'˜-Ô(ÀtˆÜ˜F L°$Ó7ð bÜ˜fÐ&@À$ÓG×MÐMÈ2ðbØRY×R_ÐR_Ð]_óbˆCà×"Ñ" 3Ö'óbr   c               ó    € V ^8„  d   QhRRRR/# r¡   r   )r   s   "r   r   r   ö   s   € ÷ ñ °ð ¸ñ r   c                ó”  € \        V P                  RR4      pVe   V P                  4       '       g   R#   V! WP                  V P                  R7      pVRJ #   \
         d2     T! YP                  R7      p M  \
         d    T! T4      p  Mi ; ii ; iTRJ #   \         d"   p\        P                  RT4        Rp?R# Rp?ii ; i)z�Adapter's prefers_fresh_final_streaming hook (Telegram's richer send path);
False without a real preview / hook, or on any error.Úprefers_fresh_final_streamingNF)r   r   r·   z.prefers_fresh_final_streaming check failed: %sT)	r   r%   r¾   r   r   r*   rD   rE   rF   )r,   rK   Úfnr±   rH   s   &&   r   Ú_adapter_prefers_fresh_finalÚ1StreamTransportMixin._adapter_prefers_fresh_finalö   sÅ   € ô �T—\‘\Ð#BÀDÓIˆØŠ:˜T×3Ñ3×5Ò5Ùð	ð	&ñ ˜D¯=©=À$Ç,Á,ÔO�ð ˜ˆ~Ðøô ô &ð&Ù ¯}©}Ô=’FøÜ ô &Ù ›X“Fð&úð&úð ˜ˆ~Ðøô	 ô 	Ü�L‰LÐIÈ1ÔMÝûð	úsM   ¶A ÁBÁ$A9Á7B Á9BÂBÂB ÂBÂBÂB ÂCÂ&CÃCÚis_turn_finalc               ó$   € V ^8„  d   QhRRRRRR/# )r   rK   r   rß   r   r5   r   )r   s   "r   r   r     s"   € ÷  ñ  ¨3ð  À$ð  ÐRVñ  r   c             ƒ  óP  "  € V P                   '       d   R# V P                  4       p V P                  P                  V P                  WP                  RR7      R7      G Rj  x€L
 p\        TRR4      '       g   R# \        TRR4      pT P                  Y6R	R
7      G Rj  x€L
  \        4       T n        T P                  T4       RT n        Yn        T'       d   RT n        T P#                  T4       R#  L�  \         d"   p\        P                  RT4        Rp?R# Rp?ii ; i L„5i)aÌ  Send ``text`` fresh and best-effort delete the preview(s); False on any failure so
the caller falls back to edit.  ``is_turn_final=False`` leaves the delivery flag unset.

``is_turn_final`` is False when finalizing an interim segment at a tool boundary (a preamble) rather
than the turn-final answer; the final-delivery flag is then left unset so the gateway still delivers
the real answer from the next API call (#29346).
Ported from openclaw/openclaw#72038.
FT)Úfinal)r   r   r   Nz1Fresh-final send failed, falling back to edit: %sr¤   r   zFresh-final)rx   r|   )Ú_turn_split_deliveryrv   r%   Úsendr   Ú_metadata_for_sendrD   rE   rF   r   r…   rn   rr   Ú_adopt_message_idÚ_already_sentr¬   Ú_final_response_sentÚ_record_turn_final_payload)r,   rK   rß   ru   r±   rH   Únew_message_ids   &&$    r   Ú_try_fresh_finalÚ%StreamTransportMixin._try_fresh_final  s  é € ð ×$×$Ð$ÙØ×+Ñ+Ó-ˆ	ð	ØŸ<™<×,Ñ,ØŸ™¨d×=TÑ=TÐ[_Ð=TÓ=`ð -ó b÷ bˆFô
 �v˜y¨%×0Ò0ÙÜ  ¨°tÓ<ˆà×#Ñ# IÈ-Ð#ÓX×XÐXÜ$'£EˆÔ!Ø×Ñ˜~Ô.Ø!ˆÔØ#ÔßØ(,ˆDÔ%Ø×+Ñ+¨DÔ1Ùñ#bøäô 	Ü�L‰LÐLÈaÔPÝûð	úñ 	YùsM   ‚%D&¨:C5 Á"C3Á#C5 Á'8D&ÂD$Â AD&Ã3C5 Ã5D!Ä DÄD&ÄD!Ä!D&c               ó   € V ^8„  d   QhRR/# rP   r   )r   s   "r   r   r   /  s   € ÷ ,ñ ,¨tñ ,r   c                óv   € V'       d#   Wn         \        P                  ! 4       V n        R# RV n         RV n        R# )uV   Retarget edits at ``message_id``; None â†’ "__no_edit__" sentinel so we never edit it.rp   N)rs   rÄ   rÅ   rÃ   rË   s   &&r   ræ   Ú&StreamTransportMixin._adopt_message_id/  s*   € çØ)ÔÜ'+§~¢~Ó'7ˆDÖ$à,ˆDÔØ'+ˆDÖ$r   c               ó(   € V ^8„  d   QhRRRRRRRR/# ©r   rK   r   r
   r   rß   r5   r   )r   s   "r   r   r   9  s,   € ÷ :ñ :Øð:Ø&*ð:ØCGð:ØSWñ:r   c             ƒ  ó   "  € V P                  V4      pTp\        V4      pV P                  P                  '       d'   VP	                  V P                  P                  R4      MTP                  4       pV'       gp   V'       df   V P                  '       dT   V P                  '       dB   V P                  V P                  RRR7      R4      G Rj  x€L
 '       d   V P                  4        R# T;'       d    V'       * pV P                  f\   \        V4      V P                  8  dB   V'       g8   V P                  P                  '       d   V P                  P                  V9   d   R# V P                  '       d"   V P                  WVR7      G Rj  x€L
 pVe   V# V P                  '       d1   V P                  f#   V P!                  WVVR7      G Rj  x€L
 pVe   V# RV n         V P                  f7   V P$                  '       g   V'       g   R# V P'                  WR7      G Rj  x€L
 # V P$                  '       g   R# V P)                  WVR7      G Rj  x€L
 #  EL‡ LÊ LŠ L: L  \*         d"   p\,        P/                  R	T4        Rp?R# Rp?ii ; i5i)
uà   Send or edit the streaming message; True if delivered.  ``finalize`` marks the
last edit.  Transport order: native frame â†’ draft frame â†’ edit existing â†’ first
send; a transport returns None to fall through to the next.r7   u   âœ…TrZ   z Finalize empty stream failed: %sN©r
   rß   FzStream send/edit error: %s)r¸   r   ra   ÚcursorÚreplaceÚstripr`   rS   r>   rM   Ú_mark_final_deliveredrs   ÚlenÚ_MIN_NEW_MSG_CHARSÚ_native_pushrª   Ú_draft_pushÚ_last_edit_overflowedÚ_edit_supportedÚ_first_sendÚ_edit_existingrD   rE   r§   )	r,   rK   r
   rß   Úpre_fence_textÚvisible_strippedÚpreamble_finalizeÚokrH   s	   &&$$     r   Ú_send_or_editÚ"StreamTransportMixin._send_or_edit8  s)  é € ð ×&Ñ& tÓ,ˆð ˆÜ(¨Ó.ˆàAEÇÁÇÇÀ˜DŸL™L¨¯©¯©¸"Ô=ÐVZ×aÑaÓcÐß÷ ˜T×7×7Ð7¸D×<V×<VÐ<VØ"Ÿo™o¨d×.>Ñ.>¸uÈtÐ.>Ó.TØ.PóR÷ Rö Rà×*Ñ*Ô,Ùð %×:Ð:¨]Ô):ÐØ×ÑÒ$¬Ð-=Ó)>À×AXÑAXÔ)Xß&¨4¯8©8¯?¯?¨?¸t¿x¹x¿¹ÐRVÔ?Váð ×%×%Ð%Ø×(Ñ(¨ÐP]Ð(Ó^×^ˆBØŠ~Ø�	Ø×$×$Ð$¨×)9Ñ)9Ò)AØ×'Ñ'¨ÀxØ6Cð (ó E÷ EˆBàŠ~Ø�	Ø%*ˆÔ"ð	Ø×ÑÒ'Ø×+×+Ð+·Hñ !Ø!×-Ñ-¨dÐ-ÓF×FÐFØ×'×'Ð'ÙØ×,Ñ,¨TÐTaÐ,Ób×bÐbòMRñ( _ñEñ Gñ cøÜô 	Ü�L‰LÐ5°qÔ9Ýûð	üsê   ‚A8JÁ;JÂJÂJÂ'&JÃIÃ	JÃJÃ37JÄ+JÅ.JÅ6JÆIÆJÆ)%JÇIÇJÇ!I ÈI È	JÈI È IÈ!I È$JÈ%I È7JÈ9I ÉIÉI ÉJÉJÉJÉI ÉI ÉJÉ*JÊ JÊJÊJc               ó(   € V ^8„  d   QhRRRRRRRR/# )r   rK   r   r
   r   rß   r5   úOptional[bool]r   )r   s   "r   r   r   u  s)   € ÷ 5ñ 5 sð 5¸ð 5Èdð 5Ø .ñ5r   c             ƒ  óz  "  € V P                   '       g_   V'       dW   V P                  R4      G Rj  x€L
 '       g
   RV n        R# RV n         RV n        \        P                  RV P                  4       T;'       d    TpV'       g   WP                  8X  d   R# V'       d   V P                  VR7       V P                  V P                  WR7      R4      G Rj  x€L
 '       d8   RV n        Wn        \        V4      V n        V'       d   V P                  4        R# V'       d   RV n        RV n        RV n        RV n        V P                   '       d4    V P                  VRR7      G Rj  x€L
  \        P#                  R	4       R# R#  ELT L¯ L"  \$         d"   p\        P#                  R
T4        Rp?R# Rp?ii ; i5i)u¬   Native streaming: every frame goes through send_stream_frame(); lazy re-seed after
a boundary.  None when native was disabled (seed/frame failure) â†’ caller falls through.z.Re-seed failed, disabling native streaming: %sNFTzR[latency] Re-opened native stream after boundary (turn=%s, waited for first delta))ÚrecordrZ   z8send_stream_frame raised, disabling native streaming: %sz5Native fallback: finalized stream (best-effort close)z.Native fallback: failed to finalize stream: %s)rS   r@   r`   Ú_awaiting_reopen_after_boundaryrE   Úinfor=   r¬   r÷   r>   rM   rç   rø   rT   rè   Ú_final_content_deliveredÚ_delivered_final_textrF   rD   )r,   rK   r
   rß   rH   s   &&$$ r   rú   Ú!StreamTransportMixin._native_pushu  sŠ  é € ð ×)×)Ð)¯dØ×-Ñ-Ð.^Ó_×_Ö_Ø-2�Ô*ÙØ)-ˆDÔ&Ø38ˆDÔ0ä�K‰Kð <Ø=A¿]¹]ôLð
 ×-Ð- ˆß˜D×$8Ñ$8Ô8Ù÷ Ø×&Ñ&¨dÐ&Ô3Ø—‘ ×!1Ñ!1°$Ð!1Ó!JØ![ó]÷ ]ö ]à!%ˆDÔØ#'Ô Ü+.¨t«9ˆDÔ(ßØ×*Ñ*Ô,Ù÷ Ø(-ˆDÔ%Ø,1ˆDÔ)Ø)-ˆDÔ&ð &+ˆÔ"ð ×%×%Ð%ðRØ×&Ñ& t°dÐ&Ó;×;Ð;Ü—‘ÐTÔUó òa `ñ*]ñ. <øäô RÜ—‘ÐMÈq×QÐQÙûðRüs…   ‚F;�F;±F²	F;¼?F;Á<
F;ÂF;Â!7F;ÃFÃ	F;Ã#>F;Ä"-F;ÅF Å'F
Å(F ÆF;ÆF;Æ
F ÆF8ÆF3Æ-F;Æ3F8Æ8F;c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r   rK   r   r   r
   r   rß   r5   r  r   )r   s   "r   r   r   ¬  s8   € ÷ Jñ J cð J¸3ð JÈTð JØ)-ðJØ2@ñJr   c             ƒ  ó¸  "  € V P                  4       pV'       d   V'       d	   V'       d   R# V'       d   TMTpV P                  P                  '       dO   VP                  V P                  P                  4      '       d$   VR\	        V P                  P                  4      )  pW`P
                  8X  d   R# V P                  V4      G Rj  x€L
 '       d   R# R#  L5i)a*  Draft frame while no message_id exists; None = not applicable / drafts just failed.
Skipped when finalizing (the real send clears the draft), EXCEPT stream-is-the-message
adapters keep ONE stream per turn: a segment-break finalize must not become a real
send (it would seal at every tool boundary).NT)Ú_stream_is_messagera   rô   Úendswithrø   r¬   r²   )r,   rK   r   r
   rß   Ústream_is_msgÚ
frame_texts   &&&$$  r   rû   Ú StreamTransportMixin._draft_push¬  sž   é € ð ×/Ñ/Ó1ˆßŸ]·=Ùß'4‘^¸$ˆ
ð �8‰8�?�?ˆ?˜z×2Ñ2°4·8±8·?±?×CÒCØ#Ð$;¤s¨4¯8©8¯?©?Ó';Ð&;Ð<ˆJØ×-Ñ-Ô-Ùð "×3Ñ3°JÓ?×?Ö?ˆtÐIÀTÐIÑ?ùs3   ‚ C£C«	CµCÁ*CÂ A	CÃ	CÃ
	CÃCc               ó$   € V ^8„  d   QhRRRRRR/# )r   rK   r   r
   r   r5   r   )r   s   "r   r   r   Á  s!   € ÷ ñ  cð ¸ð Àñ r   c          
   ƒ  ó>  "  € \        V RR4      '       d   \        P                  R4       R# V P                  P	                  V P
                  WP                  V P                  W"'       * R7      R7      G Rj  x€L
 pVP                  '       g
   RV n	        R# RV n
        Wn        VP                  '       d.   V P                  VP                  4       V P                  V4       M&V P                  V P!                  4       4       RV n        V P%                  4        R#  L£5i)	zBFirst send, threaded to the user's message (correct topic/thread).r¯   Fzasuppressing the plain-send fallback: the connector already declined this destination for this run)râ   Úexpect_edits)r   r   r8   r   NTrp   )r   rE   r®   r%   rä   r   r<   rå   r¤   rý   rç   r¬   r   ræ   r×   Ú_enter_fallback_modeÚ_visible_prefixrs   Ú_notify_new_message)r,   rK   r
   r±   s   &&$ r   rþ   Ú StreamTransportMixin._first_sendÁ  s÷   é € ä�4Ð+¨U×3Ò3ô �N‰Nð9ôñ Ø—|‘|×(Ñ(Ø—L‘L¨$×9RÑ9RØ×,Ñ,°8Ì,Ð,ÓWð )ó Y÷ Yˆð �~�~ˆ~Ø#(ˆDÔ ÙØ!ˆÔØ#ÔØ××ÐØ×"Ñ" 6×#4Ñ#4Ô5Ø×/Ñ/°Õ7ð ×%Ñ% d×&:Ñ&:Ó&<Ô=Ø,ˆDÔØ× Ñ Ô"Ùñ!Yùs   ‚A5DÁ7DÁ8DÂBDc               ó(   € V ^8„  d   QhRRRRRRRR/# rñ   r   )r   s   "r   r   r   Þ  s*   € ÷ -ñ -¨ð -¸4ð -ÐPTð -ÐY]ñ -r   c             ƒ  óH  "  € WP                   8X  d   V'       d   V P                  '       g   R# \        \        V P                  4      R4      ;'       g    R\        V P                  R/ 4      9   pV P                  V4      pV'       dI   V'       g   V'       g9   V P                  4       '       d#   V P                  WR7      G Rj  x€L
 '       d   R# V P                  V P                  VVR7      G Rj  x€L
 pVP                  '       g   V P                  WaVVR7      G Rj  x€L
 # \        VRR4      p\        V\        4      '       d   VP                  R	4      '       d   R# RV n        V P#                  V4       \        VR
R4      '       g	   R'       dx   VP$                  '       df   VP$                  V P                  8w  dK   RV n        RV n        V P+                  \-        VP$                  4      4       RV n         V P/                  4        MWn         ^ V n        R#  ELV EL+ Lÿ5i)zFEdit the live preview (or replace it via fresh-final when finalizing).TrÛ   Ú__dict__)rß   N)r   r   r
   ró   rÐ   ÚskippedrÒ   r7   r   )r¬   Ú_adapter_requires_finalizeÚhasattrrœ   r%   r   rÝ   rÇ   rë   r/   rs   r¤   Ú_on_edit_failurer‘   r#   rÓ   rç   r×   r   rü   rã   ræ   r   r  Ú_flood_strikes)r,   rK   r
   rß   Úhas_prefers_hookÚprefers_freshr±   rÐ   s   &&$$    r   rÿ   Ú#StreamTransportMixin._edit_existingÞ  sÒ  é € ð ×'Ñ'Ô'·¸d×>]×>]Ð>]Ùô ”D˜Ÿ™Ó&Ð(GÓH÷ Xð XØ.´'¸$¿,¹,È
ÐTVÓ2WÑWð 	ð ×9Ñ9¸$Ó?ˆßß×"2°t×7TÑ7T×7VÒ7VØ×)Ñ)¨$Ð)ÓL×LÖLÙØ×)Ñ)°T×5EÑ5EÈtØ3;ð *ó =÷ =ˆà�~�~ˆ~Ø×.Ñ.¨vÀhØ=Jð /ó L÷ Lð Lä˜v ~°tÓ<ˆÜ�l¤D×)Ò)¨l×.>Ñ.>¸y×.IÒ.Iñ Ø!ˆÔØ×+Ñ+¨FÔ3ô �VÐ7¸×<Ò<ÇØ×%×%Ð%¨&×*;Ñ*;¸t×?OÑ?OÔ*OØ)-ˆDÔ&Ø(,ˆDÔ%Ø×"Ñ"¤3 v×'8Ñ'8Ó#9Ô:Ø#%ˆDÔ Ø×$Ñ$Õ&à#'Ô ØˆÔÙò9 Mò=ñLùs|   ‚H"›H"­'H"Á3H"Â	H"ÂH"ÂH"Â/H"ÃHÃ	H"Ã#H"Ã2HÃ3H"Ä	H"Ä H Ä!=H"Å4H"ÆH"Æ&A5H"ÈH"È H"c               ó    € V ^8„  d   QhRRRR/# )r   Úprefixr   r5   rQ   r   )r   s   "r   r   r     s   € ÷ "ñ "¨3ð "°4ñ "r   c                ó<   € Wn         RV n        RV n        RV n        R# )zGEdits are over for this stream: send only the missing tail at got_done.TFN)Ú_fallback_prefixÚ_fallback_final_sendrý   rç   )r,   r)  s   &&r   r  Ú)StreamTransportMixin._enter_fallback_mode  s    € à &ÔØ$(ˆÔ!Ø$ˆÔØ!ˆÖr   c               ó(   € V ^8„  d   QhRRRRRRRR/# rñ   r   )r   s   "r   r   r     s0   € ÷ Nñ N°3ð NÀTð NÐZ^ð NØ$(ñNr   c             ƒ  óv  "  € ^ RI Hp V! V4      '       d&   \        P                  R4       RV n        RV n        R# T;'       d    TpV'       d   V P                  P                  '       dc   V P                  P                  V P                  P                  4      '       d.   V P                  4       V8X  d   RV n        V P                  V4       \        VRR4      p\        V\        4      '       Ed   VP!                  R4      '       dð   \#        VP!                  R4      ;'       g!    VP$                  ;'       g    V P&                  4      V n        VP!                  R	4      p\        V\"        4      '       d7   V'       d/   W€n        VP)                  V4      V n        V P-                  V4       M&RV n        V P-                  V P                  4       4       \        VR
R4      '       d   V P/                  4        R# Rp	V P1                  V4      '       EdE   V ;P2                  ^,          un        \5        V P6                  ^,          R4      p
\        VRR4      p\        V\8        \:        34      '       d+   V^ 8”  d$   \=        V
\5        \;        V4      \>        4      4      p
W n        \        PA                  RV P2                  V PB                  V P6                  4       T;'       d    \        V PD                  RR4      RJ p	V P2                  V PB                  8  d%   V	'       g   \F        PH                  ! 4       V n%        R# V	'       d   \        PA                  R4       \        PA                  RV P2                  4       V P-                  V P                  4       4       V	'       g   V PM                  4       G Rj  x€L
  R#  L5i)z�Classify a failed edit: partial overflow, flood backoff, or fallback mode.  Always
False; the caller's finalize path may still deliver the tail.r¥   zŽedit DECLINED by the connector's egress guard; suppressing every later send for this run (the destination is not approved for this connection)TFrÐ   NÚpartial_overflowÚlast_message_idÚdelivered_prefixrÒ   g      $@Úretry_afteru@   Flood control on edit (strike %d/%d), backoff interval â†’ %.1fsÚFALLBACK_ON_FINAL_EDIT_FLOODz@Turn-final edit hit flood control; entering fallback immediatelyz0Edit failed (strikes=%d), entering fallback moder   )'r­   r¦   rE   r®   r¯   rý   ra   rô   r¬   r  r  r  ré   r   r‘   r#   rÓ   r   r   rs   Ú
startswithÚ#_fallback_preserve_partial_messagesr  r  Ú_is_flood_errorr$  ÚminÚ_current_edit_intervalÚintÚfloatÚmaxÚ_MAX_EDIT_BACKOFF_SECSrF   Ú_MAX_FLOOD_STRIKESr%   rÄ   rÅ   Ú_last_edit_timeÚ_try_strip_cursor)r,   r±   rK   r
   rß   r¦   Ú
turn_finalrÐ   r2  Úimmediate_final_fallbackÚbackoffr3  s   &&&$$       r   r#  Ú%StreamTransportMixin._on_edit_failure  sï  é € õ 	7á˜× Ò Ü�N‰Nð0ôð
 %)ˆDÔ!Ø#(ˆDÔ ÙØ×/Ð/ -ˆ
ß˜4Ÿ8™8Ÿ?Ÿ?˜?¨t×/CÑ/C×/LÑ/LÈTÏXÉXÏ_É_×/]Ò/]Ø×(Ñ(Ó*¨dÔ2ð -1ˆDÔ)Ø×+Ñ+¨DÔ1ô
 ˜v ~°tÓ<ˆÜ�l¤D×)Ó)¨l×.>Ñ.>Ð?Q×.RÒ.Rô  # <×#3Ñ#3Ð4EÓ#F÷ $7ð $7È&×J[ÑJ[÷ $7ð $7Ø&*×&6Ñ&6ó 8ˆDÔà+×/Ñ/Ð0BÓCÐÜÐ*¬C×0Ò0×5EØ'7Ô$Ø;?¿?¹?ÐK[Ó;\�Ô8Ø×)Ñ)Ð*:Õ;à;@�Ô8Ø×)Ñ)¨$×*>Ñ*>Ó*@ÔAÜ�vÐ9¸2×>Ò>Ø×(Ñ(Ô*Ùð $)Ð Ø×Ñ ×'Ó'Ø×Ò 1Õ$ÕÜ˜$×5Ñ5¸Õ9¸4Ó@ˆGÜ! &¨-¸Ó>ˆKÜ˜+¬¬U |×4Ò4¸Àq¼Ü˜g¤s¬5°Ó+=Ô?UÓ'VÓW�Ø*1Ô'Ü�L‰LÐ[Ø×,Ñ,¨d×.EÑ.EÀt×GbÑGbôdð ×cÐcœw t§|¡|Ð5SÐUZÓ[Ð_cÐcð %à×"Ñ" T×%<Ñ%<Ô<×E]Ü'+§~¢~Ó'7�Ô$Ùß'Ü—‘Ð_Ô`ä�‰ÐGÈ×I\ÑI\Ô]Ø×!Ñ! $×"6Ñ"6Ó"8Ô9÷ (Ø×(Ñ(Ó*×*Ð*Ùñ +ùse   ‚AN9Á
N9ÁN9Á,4N9Â!A'N9Ä	N9Ä&N9Ä:AN9Å?BN9ÈCN9Ë <N9Ì#N9ÍAN9ÎN9Î0N7Î1N9)rç   r
  r9  r  rý   r¯   r,  r+  r6  r  rè   r$  rü   r?  r¬   rÃ   rs   rT   rS   rr   r[   rã   rª   r`   )%Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rù   r/   r@   Ústaticmethodr>   rM   rV   r\   rc   rj   rv   r…   r–   rž   r²   rº   r¾   rÇ   rÌ   r×   rÝ   rë   ræ   r   r  rú   rû   rþ   rÿ   r  r#  Ú__static_attributes__r   r   r   r	   r	      s  † ÙQàÐð9ÐUZ÷ 9ðHÀu÷ Hð ð	À%ö 	ó ð	õ#õ)õ
,õ$õð¸÷ ðW¸ð WØ6;ðWØSW÷Wõ*õ0õ"õHKõLõHõ>õ(õð. È÷  õD,ð ð:Ø-2ð:ØJNö:ó ð:õx5õnJõ*õ:-õ^"÷Nñ Nr   r	   )rI  Ú
__future__r   r€   r   ÚloggingrÄ   Útypingr   r   Úgateway.platforms.baser   r’   Úgateway.stream_consumer_fencesr   Ú/hermes_cli.observability.shared_metrics_gatewayr   Ú	getLoggerrE   r=  r	   r   r   r   Ú<module>rS     sL   ðñ9õ
 #ã Û Û Û ß  å NÝ DÝ Mà	×	Ò	Ð4Ó	5€ð
 Ð ÷H	ó H	r   