+
    kHàj  ã                   ó~   € R t ^ RIt^ RIt^ RIt^ RIHt ^ RIHt ^ RIH	t	 ]P                  ! R4      t ! R R4      tR# )z¯Telegram held-inbound queue: events PTB already acked that cannot dispatch yet are held,
redispatched on reconnect, and handed to the adapter that replaces this one (#132829).N)ÚOptional)ÚMessageEvent)Úcancel_taskz"plugins.platforms.telegram.adapterc                   óœ   a € ] tR t^t o R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tV 3R lR lt	RV 3R lR llt
RtV tR# )ÚTelegramHeldInboundMixinzHHold / redispatch / hand-over of inbound events for ``TelegramAdapter``.c                ó   <€ V ^8„  d   QhRR/# )é   ÚreturnN© )ÚformatÚ__classdict__s   "€ÚU/home/ubuntu/.hermes/hermes-agent/plugins/platforms/telegram/telegram_held_inbound.pyÚ__annotate__Ú%TelegramHeldInboundMixin.__annotate__   s   ø€ ÷ Hñ H°4ñ Hó    c                óä  € V P                  4       '       g   V P                  4       '       d   R# \        V RR4      '       g   R#  \        P                  ! 4       p\        T RR4      p \        P                  ! 4       pTe   TP                  4       '       g   Y#Jd   R# TP                  T P                  Y#J d   RMTR7      4      T n
        R#   \
         d     R# i ; i  \
         d    Rp Lqi ; i)z¤Ensure a tracked drain runs when held events exist and delivery is live (no-op while
down or after permanent fatal; an in-flight drain schedules its own follow-up).NÚ_held_inbound_eventsÚ_held_inbound_redispatch_task)Úprior)Ú_is_permanent_fatalÚ_should_drop_delayed_deliveryÚgetattrÚasyncioÚget_running_loopÚRuntimeErrorÚcurrent_taskÚdoneÚcreate_taskÚ_redispatch_held_inboundr   )ÚselfÚloopr   Úcurrents   &   r   Ú!_schedule_held_inbound_redispatchÚ:TelegramHeldInboundMixin._schedule_held_inbound_redispatch   sæ   € ð ×#Ñ#×%Ò%¨×)KÑ)K×)MÒ)MÙÜ�tÐ3°T×:Ò:Ùð	Ü×+Ò+Ó-ˆDô ˜Ð=¸tÓDˆð	Ü×*Ò*Ó,ˆGð Ò U§Z¡Z§\¢\°eÓ6JÙØ-1×-=Ñ-=¸d×>[Ñ>[ÐjoÓjzÑbfð  AFÐ>[ó  ?Gó  .HˆÖ*øô ô 	Úð	ûô
 ô 	ØŠGð	ús$   ÁC Á(C ÃCÃCÃC/Ã.C/ÚscheduleTc                ó0   <€ V ^8„  d   QhRS[ RS[RS[RR/# ©r   ÚeventÚwherer$   r	   N©r   ÚstrÚbool)r   r   s   "€r   r   r   &   s+   ø€ ÷ #5ñ #5©ð #5Áð #5ÑPTð #5Ð`dñ #5r   c               óB  a€ V P                  4       '       d8   \        P                  RT\        \	        SRR4      ;'       g    R4      4       R# \	        V RR4      pVe   V! 4       MRpVe*   V P                  4        VP                  SV R2VR7       R# \	        V RR4      pVf
   . ;V n        p\        ;QJ d    V3R	 lV 4       F  '       g   K   R
M	  RM! V3R	 lV 4       4      '       d   R# \        \	        V R^@4      ;'       g    ^@4      p\        V4      V8¼  dI   VP                  ^ 4      p\        P                  RT\        \	        VRR4      ;'       g    R4      4       KX  VP                  S4       V P                  4        \        P                  RT\        \	        SRR4      ;'       g    R4      \        V4      V P                  4       '       d   RMV'       d   RMR4       V'       d+   V P                  4       '       g   V P                  4        R# R# R# )uø  Preserve an inbound event that cannot be dispatched now (PTB already acked the update, so dropping is silent loss).
Capped, identity-deduped; permanent fatal discards. ``schedule=False`` inside a drain avoids poison-event loops.

The disconnect drop-guard (#55971) correctly prevents dispatch into a torn-down session. Destroying
the event is wrong: by the time we reach enqueue/flush, python-telegram-bot has already acked the
update and advanced the offset â€” silent permanent loss, no log, no error.
zF[Telegram] Discarding inbound under non-retryable fatal (%s, %d chars)ÚtextNÚ Ú_held_inbound_successorz
-forwarded©r(   r$   r   c              3   ó*   <"  € T F  qSJ x € K
  	  R # 5i©Nr
   )Ú.0Úexistingr'   s   & €r   Ú	<genexpr>Ú?TelegramHeldInboundMixin._hold_inbound_event.<locals>.<genexpr>;   s   øé € Ð6± X˜5Õ ³ùs   ƒTFÚHELD_INBOUND_MAXzC[Telegram] Held-inbound queue full (%d); dropping oldest (%d chars)z5[Telegram] Holding inbound (%s, %d chars, queue=%d)%sz - will redispatch on reconnectz - scheduling redispatch)r   ÚloggerÚwarningÚlenr   Ú_accept_updateÚ_adopt_held_eventr   ÚanyÚintÚpopÚappendr   r"   )	r   r'   r(   r$   Ú	successorÚtargetÚheldÚmax_nÚdroppeds	   &f$$     r   Ú_hold_inbound_eventÚ,TelegramHeldInboundMixin._hold_inbound_event&   s  ø€ ð ×#Ñ#×%Ò%Ü�N‰NØXÐZ_ÔadÔelÐmrÐtzð  }Aó  fB÷  fHð  fHð  FHó  bIôJáÜ˜DÐ";¸TÓBˆ	Ø )Ò 5‘”¸4ˆØÒØ×ÑÔ!Ø×$Ñ$ U°U°G¸:Ð2FÐQYÐ$ÔZÙÜ�tÐ3°TÓ:ˆØŠ<Ø/1Ð1ˆDÔ%¨ß‹3Ô6±Ó6�3�3Š3Ô6±Ó6×6Ò6ÙÜ”G˜DÐ"4°bÓ9×?Ð?¸RÓ@ˆÜ�$‹i˜5Ô Ø—h‘h˜q“kˆGÜ�N‰NØUÐW\Ô^aÔbiÐjqÐsyÐ{ó  cA÷  cGð  cGð  EGó  _HöIà�‰�EÔØ×ÑÔÜ�‰ØCÀUÌCÔPWÐX]Ð_eÐgkÓPl×PrÐPrÐprÓLsÔuxÐy}Óu~Ø15×1SÑ1S×1UÒ1UÑ-÷  {CÑ\vð  IKô	M÷ ˜D×>Ñ>×@Ò@Ø×2Ñ2Ö4ñ A‰8r   c                ó"   <€ V ^8„  d   QhRRRR/# )r   Úpredecessorr   r	   Nr
   )r   r   s   "€r   r   r   K   s   ø€ ÷ 
1ñ 
1Ð.Hð 
1ÈTñ 
1r   c                ó  € RV n         \        P                  ! V 4      Vn         \        VRR4      ;'       g    . p\	        V4      pVP                  4        V F  pV P                  VRRR7       K  	  V P                  4        R# )z¶Take over the hold queue of the instance the runner just replaced with us (#132829): it only
drains on its own ``_mark_connected``, which never comes; later holds there forward here.Nr   ÚadoptedFr0   )r/   ÚweakrefÚrefr   ÚlistÚclearr<   r"   )r   rI   rC   Úeventsr'   s   &&   r   Úadopt_held_inboundÚ+TelegramHeldInboundMixin.adopt_held_inboundK   sq   € ð (,ˆÔ$Ü.5¯kªk¸$Ó.?ˆÔ+Ü�{Ð$:¸DÓA×GÐGÀRˆÜ�d“ˆØ�
‰
ŒÛˆEØ×"Ñ" 5°	ÀEÐ"ÖJñ à×.Ñ.Ö0r   c                ó0   <€ V ^8„  d   QhRS[ RS[RS[RR/# r&   r)   )r   r   s   "€r   r   r   W   s0   ø€ ÷ Hñ H¡|ð H¹sð HÉdð HÐW[ñ Hr   c               ó”   € \        VRR4      e&   \        P                  ! V 4      VP                  n        V P                  WVR7       R# )z_Hold a predecessor's event here; only the transport ref moves (profile/authz stay as resolved).ÚsourceNr0   )r   rL   rM   rU   Ú_transport_adapter_refrF   )r   r'   r(   r$   s   &&$$r   r<   Ú*TelegramHeldInboundMixin._adopt_held_eventW   s9   € ä�5˜( DÓ)Ò5Ü29·+²+¸dÓ2CˆE�L‰LÔ/Ø× Ñ  ¸hÐ ÖGr   c                ó0   <€ V ^8„  d   QhRS[ RS[RS[RR/# )r   rP   Úidxr(   r	   N)rN   r>   r*   )r   r   s   "€r   r   r   ]   s/   ø€ ÷ Hñ H¡4ð H©cð H¹#ð HÀ$ñ Hr   c                óB   € WR  F  pV P                  WCRR7       K  	  R# )zWRe-hold ``events[idx:]`` without rescheduling (drain interrupted / failed / cancelled).NFr0   )rF   )r   rP   rY   r(   Úrests   &&&& r   Ú_rehold_fromÚ%TelegramHeldInboundMixin._rehold_from]   s#   € à˜4“LˆDØ×$Ñ$ TÀÐ$ÖGó !r   Nc                óH   <€ V ^8„  d   QhRS[ S[P                  ,          RR/# )r   r   r	   N)r   r   ÚTask)r   r   s   "€r   r   r   b   s%   ø€ ÷ ,9ñ ,9±H¹W¿\¹\Õ4Jð ,9ÐVZñ ,9r   c              ƒ  ó–  "  € V\         P                  ! 4       Jd   \        V4      G Rj  x€L
  \        V RR4      pV P	                  4       '       d<   V'       d2   \        V4      pVP                  4        \        P                  RV4       R# V'       g   R# \        V4      pVP                  4        \        P                  R\        V4      4       Rp \        V4       F¿  w  rgV P	                  4       '       g   V P                  4       '       du   V P                  WFR4        V'       dX   \        V RR4      '       dC   V P                  4       '       g+   V P	                  4       '       g   V P                  4        R# R# R# R# R#  V P                  V4      G Rj  x€L
  KÁ  	  V'       dX   \        V RR4      '       dC   V P                  4       '       g+   V P	                  4       '       g   V P                  4        R# R# R# R# R#  ELÙ Ll  \         P                   d    T P                  YFR4       h \          d­    \        P#                  R\        \        TR	R4      ;'       g    R
4      4       T P                  YFR4       Rp  T'       dX   \        T RR4      '       dC   T P                  4       '       g+   T P	                  4       '       g   T P                  4        R# R# R# R# R# i ; i  T'       dT   \        T RR4      '       d@   T P                  4       '       g)   T P	                  4       '       g   T P                  4        i i i i i ; i5i)z§Drain the hold queue after reconnect or a connected-path hold; ``prior`` (previous
redispatch task) is cancelled+awaited here so ``_mark_connected`` stays synchronous.Nr   zR[Telegram] Redispatch aborted; discarded %d held inbound under non-retryable fatalz3[Telegram] Redispatching %d held inbound message(s)Tzredispatch-interruptedzredispatch-cancelledzC[Telegram] Failed to redispatch held inbound (%d chars); re-holdingr-   r.   zredispatch-failedF)r   r   r   r   r   r:   rO   r8   r9   rN   Ú	enumerater   r\   r"   Úhandle_messageÚCancelledErrorÚ	ExceptionÚ	exception)r   r   rC   ÚnrP   Úallow_followup_schedulerY   r'   s   &&      r   r   Ú1TelegramHeldInboundMixin._redispatch_held_inboundb   sæ  é € ð œ×,Ò,Ó.Ó.Ü˜eÓ$×$Ð$Ü�tÐ3°TÓ:ˆØ×#Ñ#×%Ò%ßÜ˜“I�Ø—
‘
”Ü—‘ÐsÐuvÔwÙßÙä�d“ˆØ�
‰
ŒÜ�‰ÐLÌcÐRXËkÔZØ"&Ðð	9Ü'¨Ö/‘
�Ø×+Ñ+×-Ò-°×1SÑ1S×1UÒ1UØ×%Ñ% fÐ3KÔLØ÷" (Ü˜DÐ"8¸$×?Ò?Ø×:Ñ:×<Ò<Ø×0Ñ0×2Ò2Ø×6Ñ6Ö8ñ 3ñ =ñ @ñ (ð!Ø×-Ñ-¨eÓ4×4Ò4ñ 0÷( (Ü˜DÐ"8¸$×?Ò?Ø×:Ñ:×<Ò<Ø×0Ñ0×2Ò2Ø×6Ñ6Ö8ñ 3ñ =ñ @ñ (òI %ñ* 5øÜ×-Ñ-ô Ø×%Ñ% fÐ3IÔJØÜ ô ô ×$Ñ$Ø]Ô_bÔcjÐkpÐrxÐz~Óc÷  dFð  dFð  DFó  `GôHà×%Ñ% fÐ3FÔGØ.3Ð+Ù÷ (Ü˜DÐ"8¸$×?Ò?Ø×:Ñ:×<Ò<Ø×0Ñ0×2Ò2Ø×6Ñ6Ö8ñ 3ñ =ñ @ñ (ðû÷ (Ü˜DÐ"8¸$×?Ò?Ø×:Ñ:×<Ò<Ø×0Ñ0×2Ò2Ø×6Ñ6Õ8ð 3ð =ð @ð (üs·   ‚(M	ªH«.M	Á:M	Â>M	Ã;K) ÄK) Ä#0M	ÅM	Å*M	ÆHÆHÆHÆK) Æ"0M	ÇM	Ç)M	ÈHÈ0K&È9)K&É#K&ÊK) Ê0M	Ê5M	ËM	Ë%K&Ë&K) Ë)1MÌMÌ1MÍM	)r   r   r/   r2   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r"   rF   rQ   r<   r\   r   Ú__static_attributes__Ú__classdictcell__)r   s   @r   r   r      sX   ø‡ € ÙR÷Hð Hð(#5ÐW[÷ #5ò #5÷J
1ð 
1÷Hð H÷Hð H÷
,9÷ ,9ð ,9r   r   )rm   r   ÚloggingrL   Útypingr   Úgateway.platforms.eventr   Úgateway.platforms.helpersr   Ú	getLoggerr8   r   r
   r   r   Ú<module>ru      s<   ðñZó Û Û Ý å 0Ý 1à	×	Ò	Ð?Ó	@€÷9ó 9r   