+
    jHàjtK  ã                   ó´  € R t ^ RIt^ RIt^ RIHt ^ RIHt ^ RIHt ^ RIH	t	H
t
HtHt ^ RIHt ^RIHtHtHt ^RIHt ^R	IHtHt ]P0                  ! ]4      tR
t]P8                  ! R]P:                  4      tR"tR R lt  ! R R]!4      t"]! RR7       ! R R4      4       t#R R lt$R R lt%R R lt&R R lt'] ! R R4      4       t(R R lt) ! R  R!4      t*R# )#zÈDelivery routing for cron job outputs and agent responses, by target: explicit ("telegram:123456789"),
platform home channel ("telegram"), origin (back to where the job was created), or local (files).N)ÚPath)Údatetime)Ú	dataclass)ÚDictÚListÚOptionalÚAny)Úget_hermes_home)ÚPlatformÚGatewayConfigÚPlatformConfig)ÚSessionSource)ÚDeadTargetRegistryÚclassify_dead_errori   zv^[\s*_~`]*\(?\s*(silent|silence|no\s+response|no\s+reply)\s*\.?\)?[\s*_~`]*$|^[\s*_~`]*[\U0001F507\.\u2026]+[\s*_~`]*$c                óF   € V ^8„  d   QhR\         \        ,          R\        /# )é   ÚcontentÚreturn©r   ÚstrÚbool)Úformats   "Ú5/home/ubuntu/.hermes/hermes-agent/gateway/delivery.pyÚ__annotate__r   !   s"   € ÷ _ñ _¤8¬C¥=ð _´Tñ _ó    c                óÄ   € V '       d   V P                  4       MRp\        V4      ;'       d5    \        V4      ^@8*  ;'       d    \        \        P	                  V4      4      # )zKTrue when ``content`` is *only* a silence-narration token (length-guarded).Ú )Ústripr   ÚlenÚ_SILENCE_NARRATIONÚmatch)r   Ústrippeds   & r   Ú_is_silence_narrationr"   !   sF   € ç")ˆw�}‰}Œ¨r€HÜ�‹>×^Ð^œc (›m¨rÑ1×^Ð^´dÔ;M×;SÑ;SÐT\Ó;]Ó6^Ð^r   c                   óB   a a€ ] tR t^'t oRtV3R lV 3R lltRtVtV ;t# )ÚPartialDeliveryErrorz¿A split send failed after earlier chunks were delivered (``raw_response["partial_overflow"]``).
Callers must not fall back to re-sending the whole payload: the recipient already has the head.c                ó&   <€ V ^8„  d   QhRS[ RS[/# )r   ÚmessageÚresult)r   r   )r   Ú__classdict__s   "€r   r   Ú!PartialDeliveryError.__annotate__+   s   ø€ ÷ ñ ¡ð ©Sñ r   c                ó2   <€ \         SV `  V4       W n        R # ©N)ÚsuperÚ__init__r'   )Úselfr&   r'   Ú	__class__s   &&&€r   r-   ÚPartialDeliveryError.__init__+   s   ø€ Ü‰Ñ˜Ô!ØŽr   )r'   )	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r-   Ú__static_attributes__Ú__classdictcell__Ú__classcell__)r/   r(   s   @@r   r$   r$   '   s   ù‡ € ñg÷÷ ó r   r$   T)Úfrozenc                   ó^   a € ] tR t^0t o Rt]V 3R lR l4       tV 3R lR ltV 3R ltRt	V t
R# )	ÚDeliveryTransportz:Resolved live transport for one logical delivery platform.c                ó    <€ V ^8„  d   QhRS[ /# ©r   r   ©r   )r   r(   s   "€r   r   ÚDeliveryTransport.__annotate__8   s   ø€ ÷ 9ñ 9™$ñ 9r   c                ó<   € V P                   \        P                  8H  # r+   )Útransport_platformr
   ÚRELAY©r.   s   &r   Úis_relayÚDeliveryTransport.is_relay7   s   € à×&Ñ&¬(¯.©.Ñ8Ð8r   c                ó^   <€ V ^8„  d   QhRS[ RS[RS[RS[S[S[S[3,          ,          RS[/# )r   Úlogical_platformÚchat_idr   Úmetadatar   )r
   r   r   Údictr   )r   r(   s   "€r   r   r?   ;   sF   ø€ ÷ dñ d©8ð d¹cð dÉCð dÙ%¡d©3±¨8¥nÕ5ðdÙ:=ñdr   c              ƒ  ó¶   "  € V P                   '       d   V P                  P                  WW4R7      MV P                  P                  W#VR7      G Rj  x€L
 #  L5i)zBSend through this transport while preserving the logical platform.©rI   N)rD   ÚadapterÚsend_for_platformÚsend)r.   rG   rH   r   rI   s   &&&&&r   rO   ÚDeliveryTransport.send;   sU   é € ð ŸŸ˜ð —l‘l×4Ñ4Ð5EÐPWÐ4ÔkØ,0¯L©L×,=Ñ,=¸gÐYaÐ,=Ó,b÷dð 	dñ dùs   ‚AAÁAÁAc                óN   <€ V ^8„  d   Qh/ S[ ;R&   S[S[,          ;R&   S[;R&   # )r   rM   ÚconfigrA   )r   r   r   r
   )r   r(   s   "€r   r   r?   0   s0   ø‡ ‚ ñ �Lñ ñ ‘^Õ$Ñ$ñ	 ñ
 !Ñ ò r   © N)r1   r2   r3   r4   r5   ÚpropertyrD   rO   Ú__annotate_func__r6   r7   ©r(   s   @r   r;   r;   0   s/   ø‡ € áDð
 ÷9ó ð9÷dð d÷ ƒ r   r;   c          	      ó–   € V ^8„  d   QhR\         R\        R\        \        \         \        3,          ,          R\        \
        ,          /# )r   ÚplatformrR   Úadaptersr   )r
   r   r   rJ   r   r;   )r   s   "r   r   r   B   s>   € ÷ ñ ¬ð ¼=ð Ü)1´$´xÄ°}Õ2EÕ)FðÜKSÔTeÕKfñr   c                ó  € T;'       g    / pVP                  V 4      VP                  P                  V 4      rTVe#   Ve   VP                  '       d   \        WEV 4      # VP                  \        P
                  4      VP                  P                  \        P
                  4      rv\        VRR4      pVeP   Ve   VP                  '       d:   \        V4      '       d)   V! V 4      '       d   \        Wg\        P
                  4      # R# )aH  Resolve a logical platform to its live delivery transport. A concrete native adapter always wins;
Relay is eligible only when its authenticated transport explicitly advertises that it fronts the
logical platform, so restart-time delivery is independent of per-chat caches without letting Relay
hijack unrelated platform targets.NÚfronts_platform)ÚgetÚ	platformsÚenabledr;   r
   rB   ÚgetattrÚcallable)	rX   rR   rY   Úlive_adaptersÚnativeÚnative_configÚrelayÚrelay_configr[   s	   &&&      r   Úresolve_delivery_transportrf   B   sÓ   € ð —N�N €MØ)×-Ñ-¨hÓ7¸×9IÑ9I×9MÑ9MÈhÓ9WˆMð Ò˜}Ò4¸×8M×8MÐ8MÜ  ¸ÓAÐAØ'×+Ñ+¬H¯N©NÓ;¸V×=MÑ=M×=QÑ=QÔRZ×R`ÑR`Ó=aˆ<Ü˜eÐ%6¸Ó=€OØÒ˜|Ò3°|×7K×7KÐ7KÜ˜×)Ò)©o¸h×.GÒ.GÜ  ´h·n±nÓEÐEÙr   c                óF   € V ^8„  d   QhR\         \        ,          R\        /# )r   rH   r   r   )r   s   "r   r   r   V   s   € ÷ ñ ´¼#µð Ä4ñ r   c                óP   €  \        V 4      ^ 8„  #   \        \        3 d     R# i ; i)u  True when ``chat_id`` is a positive int â€” Telegram's private-chat shape (groups/channels are negative).
Single source of truth, reused by the handoff seed path in ``gateway/run.py`` so handoff-created DM
topics key the same way as inbound DM-topic messages.F©ÚintÚ	TypeErrorÚ
ValueError)rH   s   &r   Ú#looks_like_telegram_private_chat_idrm   V   s-   € ðÜ�7‹|˜aÑÐøÜ”zÐ"ô Úðús   ‚ �%¤%c                óF   € V ^8„  d   QhR\         \        ,          R\        /# )r   Úvaluer   r   )r   s   "r   r   r   `   s   € ÷ ñ œ8¤C�=ð ¬Tñ r   c                 óN   €  \        V 4      R J#   \        \        3 d     R# i ; i)NFri   )ro   s   &r   Ú_looks_like_intrq   `   s-   € ðÜ�5‹z Ð%Ð%øÜ”zÐ"ô Úðús   ‚ �$£$c                óF   € V ^8„  d   QhR\         R\        \        ,          /# )r   r'   r   )r   r   r   )r   s   "r   r   r   g   s"   € ÷ Rñ Rœsð R¤x´¥}ñ Rr   c                ó¬   a € \        S \        4      '       d   S P                  MRV 3R llpV! RR4      RJd   R# \        V! R4      ;'       g    R4      # )	z`Error string of a failed SendResult object / plain result dict ("" if none), or None on success.Nc                 ó   <€ \        SW4      # r+   )r_   )ÚnameÚdefaultr'   s   &&€r   Ú<lambda>Ú$_send_result_error.<locals>.<lambda>i   s   ø€ ÔRYÐZ`ÐbfÔRpr   ÚsuccessTFÚerrorr   r+   )Ú
isinstancerJ   r\   r   )r'   r\   s   f r   Ú_send_result_errorr|   g   sE   ø€ ä" 6¬4×0Ò0ˆ&�*Š*Ö7p€CÙ�y $Ó'¨uÓ4ˆ4ÐQ¼#¹cÀ'»l×>PÐ>PÈbÓ:QÐQr   c                   óv   a € ] tR t^mt o RtRtRtRtRtRt	]
R
V 3R lR ll4       tV 3R lR ltV 3R ltR	tV tR# )ÚDeliveryTargetzWOne target: "origin", "local", "telegram" (home channel) or "telegram:123456[:thread]".NFc                ó:   <€ V ^8„  d   QhRS[ RS[S[,          RR/# )r   ÚtargetÚoriginr   r~   )r   r   r   )r   r(   s   "€r   r   ÚDeliveryTarget.__annotate__|   s(   ø€ ÷ ?ñ ?™3ð ?©±Õ(?ð ?ÐK[ñ ?r   c                ó   € VP                  4       pVP                  4       R8X  dK   V'       d+   V ! VP                  VP                  VP                  RR7      # V ! \
        P                  RR7      # VP                  R^4      p \        V^ ,          P                  4       4      p\        T4      ^8”  d,   T ! YC^,          \        T4      ^8”  d
   T^,          MRRR7      # T ! TR	7      #   \         d    T ! \
        P                  TR7      u # i ; i)
zOParse "origin" | "local" | "<platform>" | "<platform>:<chat_id>[:<thread_id>]".r�   T)rX   rH   Ú	thread_idÚ	is_origin)rX   r…   Ú:)rX   Úunknown_platformN)rX   rH   r„   Úis_explicit)rX   )
r   ÚlowerrX   rH   r„   r
   ÚLOCALÚsplitrl   r   )Úclsr€   r�   ÚpartsrX   s   &&&  r   ÚparseÚDeliveryTarget.parse{   sð   € ð —‘“ˆØ�<‰<‹>˜XÔ%çñ  §¡¸&¿.¹.ÐTZ×TdÑTdÐptÔuð QÙ#&´·±È$Ô#OðQð
 —‘˜S !Ó$ˆð	IÜ  a¥§¡Ó 0Ó1ˆHô �u“: ”>ñ ˜X°Q­xÌsÐSXËzÐ\]Ì~À5ÈÆ8ÐcgÐuyÔzð 	?Ù'*°HÔ'=ð	?øô ô 	IÙ¤§¡ÀÔHÒHð	Iús   Â C' Ã'#DÄDc                ó    <€ V ^8„  d   QhRS[ /# r=   )r   )r   r(   s   "€r   r   r‚   �   s   ø€ ÷ 	/ñ 	/™3ñ 	/r   c                óR  € V P                   '       d   R# V P                  e   V P                  # V P                  \        P                  8X  d   R# V P                  P
                  V P                  V P                  '       d   V P                  MR.pRP                  R V 4       4      # )zConvert back to string format.r�   NÚlocalr†   c              3   ó8   "  € T F  q'       g   K  Vx € K  	  R # 5ir+   rS   )Ú.0Úps   & r   Ú	<genexpr>Ú+DeliveryTarget.to_string.<locals>.<genexpr>–   s   é € Ð.¡5˜a«AŸš£5ùs   ‚	�
)	r…   r‡   rX   r
   rŠ   ro   rH   r„   Újoin)r.   r�   s   & r   Ú	to_stringÚDeliveryTarget.to_string�   sw   € à�>�>ˆ>ÙØ× Ñ Ò,Ø×(Ñ(Ð(Ø�=‰=œHŸN™NÔ*ÙØ—‘×$Ñ$ d§l¡lÀdÇlÇlÀl°D·N²NÐX\Ð]ˆØ�x‰xÑ.¡5Ó.Ó.Ð.r   c                ó’   <€ V ^8„  d   Qh/ S[ ;R&   S[S[,          ;R&   S[S[,          ;R&   S[;R&   S[;R&   S[S[,          ;R&   # )r   rX   rH   r„   r…   rˆ   r‡   )r
   r   r   r   )r   r(   s   "€r   r   r‚   m   s_   ø‡ ‚ ñ Ññ ñ ‘c�]Ñ!ñ	 ñ
 ™�}Ñ#ñ ñ Ññ ñ Ññ ñ ™s•mÑ*ò r   rS   r+   )r1   r2   r3   r4   r5   rH   r„   r…   rˆ   r‡   ÚclassmethodrŽ   r™   rU   r6   r7   rV   s   @r   r~   r~   m   sM   ø‡ € áaà!€GØ#€IØ€IØ€Kð
 '+Ðà÷?ñ ?ó ð?÷"	/ð 	/÷A ƒ r   r~   c          
      óT   € V ^8„  d   QhR\         R\        R\        R\        R\        /# )r   rM   rH   ru   Úrefreshr   )r   r   r   )r   s   "r   r   r   ™   s1   € ÷ ñ ¬#ð ¼ð Ä3ð ÔTXð Ô]`ñ r   c             ƒ  óè   "  € V'       d   RMR\        V RR4      rTVf   \        RV R24      hT! W3/ V'       d   RR/M/ B G Rj  x€L
 pV'       g   \        R	V R
V R24      h\        V4      #  L)5i)zSCreate (or force-recreate) a named Telegram private DM topic; return its thread id.rž   ÚcreateÚensure_dm_topicNzTelegram adapter cannot z named private DM topicsÚforce_createTz
Failed to z Telegram private DM topic 'Ú')r_   ÚRuntimeErrorr   )rM   rH   ru   rž   Úverbr¡   r„   s   &&&$   r   Ú_ensure_named_dm_topicr¦   ™   s‚   é € ç)0™I°hÄÈÐQbÐdhÓ@iˆ/ØÒÜÐ5°d°VÐ;SÐTÓUÐUÙ% gÑc×RY¸ÈÑ8NÐ_aÑc×c€IßÜ˜Z¨ vÐ-IÈ$ÈÈqÐQÓRÐRÜˆy‹>Ðñ dùs   ‚AA2ÁA0ÁA2ÁA2c                   ó®   a € ] tR t^¤t o RtRV 3R lR llt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	V 3R lR lt
RV 3R lR lltRtV tR# )ÚDeliveryRouterzGResolves delivery targets and dispatches messages to platform adapters.Nc                ó`   <€ V ^8„  d   QhRS[ RS[S[S[3,          R,          RS[S[,          /# )r   rR   rY   NÚdead_targets)r   rJ   r
   r   r   r   )r   r(   s   "€r   r   ÚDeliveryRouter.__annotate__§   s<   ø€ ÷ Añ A™}ð A¹¹XÁs¸]Õ8KÈdÕ8Rð AÙ'Ñ(:Õ;ñAr   c                ó    € Wn         T;'       g    / V n        \        4       R ,          R,          V n        T;'       g    \	        4       V n        R# )ÚcronÚoutputN)rR   rY   r	   Ú
output_dirr   rª   )r.   rR   rY   rª   s   &&&&r   r-   ÚDeliveryRouter.__init__§   s<   € àŒØ Ÿ˜ BˆŒÜ)Ó+¨fÕ4°xÕ?ˆŒØ(×@Ð@Ô,>Ó,@ˆÖr   c                óª   <€ V ^8„  d   QhRS[ RS[S[,          RS[S[ ,          RS[S[ ,          RS[S[S[ S[3,          ,          RS[S[ S[3,          /# )r   r   ÚtargetsÚjob_idÚjob_namerI   r   )r   Úlistr~   r   rJ   r   )r   r(   s   "€r   r   r«   ®   sd   ø€ ÷ "ñ "¡Sð "±4¹Õ3Gð "ÑQYÑZ]ÕQ^ð "Ù (©¥ð"Ù@HÉÉcÑSVÈhÍÕ@Xð"ÙdhÑilÑnqÐiqÕdrñ"r   c              ƒ  óú  "  € / pV EF»  pVP                   e&   RRRRVP                    2/WgP                  4       &   K7  VP                  \        P                  8g  ;'       d    VP
                  pV'       d�   V P                  P                  VP                  P                  VP
                  4      '       dP   \        P                  RVP                  P                  VP
                  4       RRRRRR	/WgP                  4       &   Kÿ   VP                  \        P                  8X  d   V P                  WWE4      p	MsV P                  WqV4      G Rj  x€L
 p	VP
                  '       dH   \        V	4      f;   V P                  P                  VP                  P                  VP
                  4       RR
RV	/WgP                  4       &   EK¾  	  V#  Lz  \         d£   p
T'       d   \!        \#        T
4      4      MRpT'       dR   T P                  P%                  TP                  P                  TP
                  T R\#        T
4      R,           2R7       RRR\#        T
4      /YgP                  4       &    Rp
?
EKl  Rp
?
ii ; i5i)zRDeliver content to all targets; returns per-target results keyed by target string.Nry   Frz   zunknown_platform: zHSkipping delivery to known-dead target %s:%s (send to it again to clear)ÚskippedÚdead_targetz'target previously confirmed unreachableTr'   z: :Néx   N)Úreason)r‡   r™   rX   r
   rŠ   rH   rª   Úis_deadro   ÚloggerÚinfoÚ_deliver_localÚ_deliver_to_platformr|   ÚclearÚ	Exceptionr   r   Ú	mark_dead)r.   r   r²   r³   r´   rI   Úresultsr€   Útrackedr'   ÚeÚ	dead_kinds   &&&&&&      r   ÚdeliverÚDeliveryRouter.deliver®   s  é € ð ˆÜˆFØ×&Ñ&Ò2à˜u gÐ1CÀF×D[ÑD[ÐC\Ð/]ð/_�×(Ñ(Ó*Ñ+áð —o‘o¬¯©Ñ7×JÐJ¸F¿N¹NˆGß˜4×,Ñ,×4Ñ4°V·_±_×5JÑ5JÈFÏNÉN×[Ò[Ü—‘ÐfØ"ŸO™O×1Ñ1°6·>±>ôCà/8¸%ÀÈMØ/6Ð8að/c�×(Ñ(Ó*Ñ+áðRØ—?‘?¤h§n¡nÔ4Ø!×0Ñ0°À(ÓU‘Fà#'×#<Ñ#<¸VÈhÓ#W×W�FØ—~—~�~Ô*<¸VÓ*DÒ*LØ×)Ñ)×/Ñ/°·±×0EÑ0EÀvÇ~Á~ÔVØ/8¸$ÀÈ&Ð.Q�×(Ñ(Ó*Ô+ñ- ð< ˆñ Xøô ô Rç;BÔ/´°A³Ô7È�	ßØ×%Ñ%×/Ñ/°·±×0EÑ0EÀvÇ~Á~Ø:C¸ÀBÄsÈ1ÃvÈdÅ|ÀnÐ7Uð 0ô Wà/8¸%ÀÌ#ÈaË&Ð.Q�×(Ñ(Ó*×+Ð+ûðRüsd   ‚AI;Á"I;Á7?I;Â7AI;ÄAGÅG	ÅGÅ%AGÇI;Ç	GÇI8Ç%I3Ç<A0I3É,I;É3I8É8I;c                ó”   <€ V ^8„  d   QhRS[ RS[S[ ,          RS[S[ ,          RS[S[S[ S[3,          ,          RS[S[ S[3,          /# )r   r   r³   r´   rI   r   )r   r   rJ   r   )r   r(   s   "€r   r   r«   Ò   sW   ø€ ÷ Bñ B¡cð B±8¹Cµ=ð BÉHÑUXÍMð BÙ!)©$©s±C¨x­.Õ!9ðBÙ>BÁ3ÉÀ8½nñBr   c           	     ód  € \         P                  ! 4       P                  R4      pV P                  T;'       g    R,          V R2,          pVP                  P                  RRR7       V'       d   RV 2MRRR	\         P                  ! 4       P                  R
4       2.pYr'       d   RV 2.M. ,          pYt;'       g    / P                  4        UU	u. uF  w  r‰RV RV	 2NK  	  up	pRRRV.,           ,          pVP                  RP                  V4      RR7       R\        V4      RV/# u up	pi )zSave content to local files.ú%Y%m%d_%H%M%SÚmiscz.mdT©ÚparentsÚexist_okz# z# Delivery Outputr   z**Timestamp:** z%Y-%m-%d %H:%M:%Sz**Job ID:** z**z:** z---Ú
úutf-8©ÚencodingÚpathÚ	timestamp)
r   ÚnowÚstrftimer¯   ÚparentÚmkdirÚitemsÚ
write_textr˜   r   )
r.   r   r³   r´   rI   rÕ   Úoutput_pathÚlinesÚkeyro   s
   &&&&&     r   r¾   ÚDeliveryRouter._deliver_localÒ   s!  € ô —L’L“N×+Ñ+¨OÓ<ˆ	Ø—o‘o¨×)9Ð)9°6Õ:À	¸{È#Ð=NÕNˆØ×Ñ× Ñ ¨¸Ð Ô=ß$,�2�h�Z‘Ð2EÀrØ"¤8§<¢<£>×#:Ñ#:Ð;NÓ#OÐ"PÐQðSˆà®f�L  Ð)Ñ*¸"Õ<ˆØ¿>¸>Àr×:PÑ:PÔ:RÔSÑ:R©J¨C�B�s�e˜4 ˜wÓ'Ñ:RÒSÐWYÐ[`ÐbdÐfmÐVnÕnÕnˆØ×Ñ˜tŸy™y¨Ó/¸'ÐÔBØœ˜KÓ(¨+°yÐAÐAùó Ts   ÃD,c                ó,   <€ V ^8„  d   QhRS[ RS[ RS[/# )r   r   r³   r   )r   r   )r   r(   s   "€r   r   r«   ß   s"   ø€ ÷ ñ ©ð ±cð ¹dñ r   c                óø   € \         P                  ! 4       P                  R4      p\        4       R,          R,          V RV R2,          pVP                  P                  RRR7       VP                  VRR	7       V# )
z7Save full cron output to disk and return the file path.rË   r­   r®   Ú_z.txtTrÍ   rÑ   rÒ   )r   rÖ   r×   r	   rØ   rÙ   rÛ   )r.   r   r³   rÕ   rÔ   s   &&&  r   Ú_save_full_outputÚ DeliveryRouter._save_full_outputß   sh   € ä—L’L“N×+Ñ+¨OÓ<ˆ	ÜÓ  6Õ)¨HÕ4¸&¸ÀÀ9À+ÈTÐ7RÕRˆØ�‰×Ñ $°ÐÔ6Ø�‰˜¨'ˆÔ2Øˆr   c                ó    <€ V ^8„  d   QhRS[ /# r=   r>   )r   r(   s   "€r   r   r«   ç   s   ø€ ÷ Lñ L±4ñ Lr   c                óB   € \        \        V P                  RR4      4      # )zMfilter silence narration based on gateway config without checking process envÚfilter_silence_narrationT)r   r_   rR   rC   s   &r   Ú!_filter_silence_narration_enabledÚ0DeliveryRouter._filter_silence_narration_enabledç   s   € ä”G˜DŸK™KÐ)CÀTÓJÓKÐKr   c                ó2   <€ V ^8„  d   QhRS[ RS[RS[RS[/# )r   rM   r   r³   r   )r   r   )r   r(   s   "€r   r   r«   ë   s0   ø€ ÷ Lñ L©Sð L¹3ð LÉð LÑPSñ Lr   c           	     ó  € \        V4      \        8:  d   V# Rp V P                  W#4      p\        VRR4      '       d+   V'       d!   \        P                  R\        V4      V4       V# T;'       g    V P                  W#4      pRV R2p\        P                  R\        V4      V4       VR\        ^ \        \        V4      ,
          4       V,           #   \         d+   p\        P                  R\        T4      Y54        Rp?LØRp?ii ; i)	uˆ  Audit-save oversized cron output; truncate it for non-chunking adapters. Above MAX_PLATFORM_OUTPUT
the full output is always written to disk as an audit trail, best-effort â€” a failed save (full disk,
permissions) never blocks delivery. Non-chunking adapters then get the content truncated with a
footer pointing to the saved file; ``splits_long_messages`` adapters receive the full payload.Nua   Audit save failed for cron output (%d chars, job=%s): %s â€” delivery proceeds without audit copyÚsplits_long_messagesFuQ   Cron output preserved for chunking adapter (%d chars) â€” full output saved to %sz'

... [truncated, full output saved to Ú]u4   Cron output truncated (%d chars) â€” full output: %s)	r   ÚMAX_PLATFORM_OUTPUTrã   ÚOSErrorr¼   Úwarningr_   r½   Úmax)r.   rM   r   r³   Ú
saved_pathÚexcÚfooters   &&&&   r   Ú_cap_oversized_outputÚ$DeliveryRouter._cap_oversized_outputë   s   € ô
 ˆw‹<Ô.Ô.ØˆNØ%)ˆ
ð	^Ø×/Ñ/°Ó@ˆJô �7Ð2°E×:Ò:ßÜ—‘ð 6Ü7:¸7³|ÀZôQàˆNð  ×JÐJ 4×#9Ñ#9¸'Ó#Jˆ
Ø<¸Z¸LÈÐJˆÜ�‰ÐJÌCÐPWËLÐZdÔeØÐAœ˜AÔ2´S¸³[Õ@ÓAÐBÀVÕKÐKøô ô 	^Ü�N‰Nð BÜCFÀwÃ<ÐQW÷^ñ ^ûð	^ús   šC ÃDÃ DÄDc                ó„   <€ V ^8„  d   QhRS[ RS[RS[S[S[S[3,          ,          RS[S[,          RS[S[S[3,          /# )r   r€   r   rI   Ú	transportr   )r~   r   r   rJ   r   r;   )r   r(   s   "€r   r   r«     sW   ø€ ÷ Jñ J±ð JÉ#ð JÙ-5±d¹3Á¸8µnÕ-EðJá.6Ñ7HÕ.IðJñ )-©S±#¨X­ñJr   c              ƒ  ó  a"  € Vf,   \        VP                  V P                  V P                  4      pVf#   \	        RVP                  P
                   24      hVP                  '       g$   \	        RVP                  P
                   R24      hVP                  pT P                  YRT;'       g    / P                  RR4      4      pRT;'       g    / 9   pV P                  4       '       d_   V'       gW   \        V4      '       dF   \        P                  RVP                  P
                  VP                  VR,          4       R	R
RRRR/# \        T;'       g    / 4      oVP                  '       d&   V P                  P!                  VP                  4      MRpVee   VP                  VP                  8X  dJ   SP#                  RVP$                  3RVP&                  33 UU	u/ uF  w  r‰V	'       g   K  W‰bK  	  up	p4       Rp
VP(                  pV'       dç   \*        ;QJ d#    V3R l\,         4       F  '       g   K   R
M	  RM! V3R l\,         4       4      '       gŸ   VSR&   VP                  \.        P0                  8X  d{   \3        VP                  4      '       d`   \5        V4      '       g,   Tp
\7        WQP                  VRR7      G Rj  x€L
 SR&   R
SR&   M#SP                  R4      f   \9        R4      hR
SR&   R Fœ  pTP;                  VP                  VP                  TS;'       g    RR7      G Rj  x€L
 p\=        V4      pV'       g"   Ve   V
'       d   RVP?                  4       9  d    M,\7        WQP                  V
R
R7      G Rj  x€L
 SR&   R
SR&   Kž  	  XeU   ^ RI H!p VPE                  X4      '       d   \G        Wí4      h\9        T;'       g    VP                  P
                   R24      hX# u up	pi  EL3 LÉ Lu5i)a‡  Deliver content to a messaging platform.

``transport`` carries an already-authorized transport past resolution:
the cron live lane resolved and authorized it per target (including the
SharedRouteAdapters satellite grant), and re-resolving from the plain
adapters dict cannot re-derive that grant under satellite config
(#115656). Omitted (None) preserves resolution for every other caller.
NzNo adapter configured for zNo chat ID for z	 deliveryr³   Úunknownz6Dropped silence-narration outbound to %s (chat=%s): %r:Né(   Nry   TÚfilteredÚsilence_narrationÚ	deliveredFÚuser_idÚscope_idc              3   ó,   <"  € T F	  qS9   x € K  	  R # 5ir+   rS   )r”   rÞ   Úsend_metadatas   & €r   r–   Ú6DeliveryRouter._deliver_to_platform.<locals>.<genexpr>/  s   øé € Ð VÑAU¸#¨Ö!5ÓAUùs   ƒr„   )rž   Ú"telegram_dm_topic_created_for_sendÚtelegram_reply_to_message_idzyTelegram private DM topic delivery requires telegram_reply_to_message_id; send to the bare chat or provide a reply anchorÚ telegram_dm_topic_reply_fallbackrL   zthread not found)ÚBasePlatformAdapterz delivery failed)FT)$rf   rX   rR   rY   rl   ro   rH   rM   rõ   r\   rè   r"   r¼   rð   rJ   rD   Úget_home_channelÚupdaterÿ   r   r„   ÚanyÚ_THREAD_ROUTING_KEYSr
   ÚTELEGRAMrm   rq   r¦   r¤   rO   r|   r‰   Úgateway.platforms.baser  Ú_is_partial_deliveryr$   )r.   r€   r   rI   rø   rM   Úis_cron_artifactÚhomeÚkÚvÚnamed_topicr„   Úretryr'   rz   r  r  s   &&&&&           @r   r¿   Ú#DeliveryRouter._deliver_to_platform  so  øé € ð ÒÜ2°6·?±?ÀDÇKÁKÐQU×Q^ÑQ^Ó_ˆIØÒÜÐ9¸&¿/¹/×:OÑ:OÐ9PÐQÓRÐRØ�~�~ˆ~Ü˜¨v¯©×/DÑ/DÐ.EÀYÐOÓPÐPØ×#Ñ#ˆØ×,Ñ,¨WÀÇÀÈB×?SÑ?SÐT\Ð^gÓ?hÓiˆð $¨¯¨°BÑ7ÐØ×1Ñ1×3Ò3×<LÔQfÐgn×QoÒQoÜ�N‰NÐSØ!Ÿ?™?×0Ñ0°&·.±.À'È#Å,ôPà˜t ZÐ1DÀkÐSXÐYÐYä˜XŸ^˜^¨Ó,ˆØ@I×@R×@RÐ@Rˆt�{‰{×+Ñ+¨F¯O©OÔ<ÐX\ˆØÒ §¡°·±Ô >Ø× Ñ °YÀÇÁÐ4MÐPZÐ\`×\iÑ\iÐOjÑ3kÔ!qÑ3k©4¨1Ôop¤$ !¢$Ñ3kÒ!qÔrð &*ˆØ×$Ñ$ˆ	ßŸS›SÔ VÕAUÓ VŸSŸSšSÔ VÕAUÓ V×VÒVØ)2ˆM˜+Ñ&Ø�‰¤(×"3Ñ"3Ô3Ô8[Ð\b×\jÑ\j×8kÒ8kÜ& y×1Ò1à"+�KÜ7MÈg×WeÑWeÐgpÐzô  8A÷  2A�M +Ñ.ØJN�MÐ"FÒGØ"×&Ñ&Ð'EÓFÒNô 'ðJóð ð
 IM�MÐ"DÑEã"ˆEØ$Ÿ>™>¨&¯/©/¸6¿>¹>È7Ð]j×]rÐ]rÐnr˜>Ós×sˆFÜ& vÓ.ˆEß˜š¯[Ð<NÐV[×VaÑVaÓVcÔ<cÙä/EÀgÏ~É~Ð_jÐtxÔ/y×)yˆM˜+Ñ&ØBFˆMÐ>Ó?ñ #ð ÒÝBØ"×7Ñ7¸×?Ò?Ü*¨5Ó9Ð9Ü˜u×RÐR¨6¯?©?×+@Ñ+@Ð*AÐAQÐ(RÓSÐSØˆùóI "rò 2Añ tñ
 *zùs§   ƒA'PÁ+APÂ/ PÃPÃ+PÃ3A#PÅPÅ0A0PÇ O7
Ç1O7
Ç7PÈ
PÈ PÈ;!PÉA-PË
O=ËAPÌ+PÌ6P Ì7"PÍ2PÎPÎ0PÎ>PÏ'PÐ PÐP)rY   rR   rª   r¯   )NN)NNNr+   )r1   r2   r3   r4   r5   r-   rÇ   r¾   rã   rè   rõ   r¿   r6   r7   rV   s   @r   r¨   r¨   ¤   s_   ø‡ € ÙQ÷Aò A÷"ò "÷HBð B÷ð ÷Lð L÷Lð L÷2J÷ Jð Jr   r¨   )r„   Úmessage_thread_idÚdirect_messages_topic_idÚ!telegram_direct_messages_topic_id)+r5   ÚloggingÚreÚpathlibr   r   Údataclassesr   Útypingr   r   r   r   Úhermes_cli.configr	   rR   r
   r   r   Úsessionr   rª   r   r   Ú	getLoggerr1   r¼   rî   ÚcompileÚ
IGNORECASEr   r  r"   r¤   r$   r;   rf   rm   rq   r|   r~   r¦   r¨   rS   r   r   Ú<module>r#     sâ   ðñeó Û 	Ý Ý Ý !ß ,Ó ,å -ç ;Ñ ;Ý "ß Aà	×	Ò	˜8Ó	$€ð
 Ð ð —Z’Zð2à‡M�MóÐ ð
 {Ð õ_ô˜<ô ñ �$Ô÷dð dó ðdõ"õ(õõRð ÷(/ð (/ó ð(/õV÷jó jr   