+
    jHàjb  ã                  óú   € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIHtHtH	t	 ^ RI
HtHtHt ^ RIHt ]P                   ! R4      tR R ltRR	 R
 lltRR R lltRR R lltRR R lltRR R lltRR R lltR# )a  Helpers for rendering gateway message timestamps exactly once.

Gateway messages need timestamps in the LLM context for temporal awareness, but
persisted message content should stay clean so replay does not accumulate
``[timestamp] [timestamp] ...`` prefixes across turns.
)ÚannotationsN)ÚdatetimeÚtimezoneÚUTC)ÚAnyÚOptionalÚTuple)Úsafe_strftimezœ^\[(?:(?P<dow>[A-Z][a-z]{2}) (?P<date>\d{4}-\d{2}-\d{2}) (?P<time>\d{2}:\d{2}:\d{2})(?: (?P<tz>[A-Za-z0-9_+\-/:]+))?|(?P<iso>\d{4}-\d{2}-\d{2}T[^\]]+))\]\s*c               ó    € V ^8„  d   QhRRRR/# )é   Údtr   ÚreturnúOptional[float]© )Úformats   "Ú?/home/ubuntu/.hermes/hermes-agent/gateway/message_timestamps.pyÚ__annotate__r   "   s   € ÷ ñ �(ð  ?ñ ó    c                óú  € V P                   RJ ;'       d    VRJ p V P                   f'   Ve   V P                  VR7      MV P                  4       p \        V P	                  4       4      #   \
        \        3 d     R# \         dô   p\        P                  R8X  d(   T'       d    TP                  \        P                  8X  g    Rp?R# T P                  4       p \        P                  ! T4      p^ Tu;8:  d   R8  dT   M Mm\        P                  ! T4      R,          TR,          8X  d(   \        YPP                   R,          ,           4      u Rp?# M  \        \
        \        3 d     Mi ; i Rp?R# Rp?ii ; i)zKEpoch for ``dt`` in ``tz`` or the local zone; None outside platform limits.N)ÚtzinfoÚwin32i€Q :Né   Ni@B )r   ÚreplaceÚ
astimezoneÚfloatÚ	timestampÚOverflowErrorÚ
ValueErrorÚOSErrorÚsysÚplatformÚerrnoÚEINVALÚ	timetupleÚtimeÚmktimeÚ	localtimeÚmicrosecond)r   ÚtzÚnaive_localÚexcÚ	wall_timeÚepochs   &&    r   Ú	_localizer-   "   s  € à—)‘)˜tÐ#×2Ð2¨¨d¨
€KðØ�9‰9ÒØ*,ª.�—‘ 2�Ô&¸b¿m¹m»oˆBÜ�R—\‘\“^Ó$Ð$øÜœ:Ð&ô ÚÜô Ü—‘ Ô'¯K¸C¿I¹IÌÏÉÔ<UÝð —L‘L“Nˆ	ð	Ü—K’K 	Ó*ˆEØ�EÖ"˜F×"¤t§~¢~°eÓ'<¸RÕ'@ÀIÈbÅMÔ'QÜ˜U§^¡^°iÕ%?Õ?Ó@Õ@ùÜœ¬
Ð3ô 	Ùð	úåûðúsg   œAA) Á)E:Á=E:ÂE:ÂE5Â$E5Ã	E5Ã'EÄE5ÄA
EÅE:ÅE5ÅE,Å)E5Å+E,Å,E5Å5E:c               ó    € V ^8„  d   QhRRRR/# )r   ÚtextÚstrr   r   r   )r   s   "r   r   r   ;   s   € ÷ ñ �Sð  oñ r   c                ó�   € \         P                  R 3 F  p \        V! V 4      V4      u # 	  R#   \        \        3 d     K0  i ; i)zIParse an ISO-8601 string (incl. ``+0200`` offsets fromisoformat rejects).c                ó0   € \         P                  ! V R 4      # )z%Y-%m-%dT%H:%M:%S%z)r   Ústrptime)Úts   &r   Ú<lambda>Ú_parse_iso.<locals>.<lambda>=   s   € ´H×4EÒ4EÀaÐI^Ô4_r   N)r   Úfromisoformatr-   Ú	TypeErrorr   )r/   r(   Úparses   && r   Ú
_parse_isor:   ;   sM   € ä×(Ñ(Ñ*_Ó`ˆð	Ü™U 4›[¨"Ó-Ò-ñ añ
 øô œ:Ð&ô 	Úð	ús   ˜0°AÁAc               ó    € V ^8„  d   QhRRRR/# )r   Úmatchzre.Matchr   r   r   )r   s   "r   r   r   E   s   € ÷ ñ  (ð ¸ñ r   c                ó  € V P                  R 4      '       d   \        V P                  R 4      V4      #  \        P                  ! V P                  R4       RV P                  R4       2R4      p\        Y!4      #   \         d     R# i ; i)ÚisoÚdateÚ r$   z%Y-%m-%d %H:%M:%SN)Úgroupr:   r   r3   r   r-   )r<   r(   r   s   && r   Ú_parse_timestamp_matchrB   E   s   € Ø‡{�{�5×ÒÜ˜%Ÿ+™+ eÓ,¨bÓ1Ð1ðÜ×Ò %§+¡+¨fÓ"5Ð!6°a¸¿¹ÀFÓ8KÐ7LÐMÐObÓcˆô �RÓÐøô ô Úðús   ´:A9 Á9BÂBc               ó    € V ^8„  d   QhRRRR/# )r   Úts_valuer   r   r   r   )r   s   "r   r   r   O   s   € ÷ $ñ $ sð $¸ñ $r   c                óæ  € \        V \        \        34      '       d   \        V 4      # \        V R4      '       d    \        V P	                  4       4      # \        V \        4      '       d   V P                  4       MRpV'       g   R# \        P                  V4      pVe   \        W1R7      MRpVe   V#  \        V4      #   \
         d     R# i ; i  \        \        3 d    \        Y!4      u # i ; i)ztEpoch seconds from a number, datetime, ISO string, or the gateway's bracketed
format; ``None`` when uninterpretable.r   NÚ ©r(   )Ú
isinstanceÚintr   Úhasattrr   Ú	Exceptionr0   ÚstripÚ_TIMESTAMP_PREFIX_REr<   rB   r8   r   r:   )rD   r(   r/   r<   Úparseds   &&   r   Úcoerce_message_timestamprO   O   s×   € ô �(œS¤%˜L×)Ò)Ü�X‹ÐÜˆx˜×%Ò%ð	Ü˜×+Ñ+Ó-Ó.Ð.ô  *¨(´C×8Ò8ˆ8�>‰>Ô¸b€DßÙÜ ×&Ñ& tÓ,€EØ5:Ò5FÔ# EÕ1ÈD€FØÒØˆð$Ü�T‹{Ðøô ô 	Úð	ûô ”zÐ"ô $Ü˜$Ó#Ò#ð$ús#   »B? Â4
C Â?CÃCÃC0Ã/C0c               ó    € V ^8„  d   QhRRRR/# )r   rD   r   r   r0   r   )r   s   "r   r   r   f   s   € ÷ ?ñ ? sð ?¸ñ ?r   c                ó  € \        WR7      pVf   R#  Ve   \        P                  ! W!R7      M)\        P                  ! V\        R7      P	                  4       pR\        TR4       R2#   \
        \        \        3 d     R# i ; i)z?Format a timestamp value as ``[Tue 2026-04-28 13:40:53 CEST]``.rG   rF   Ú[z%a %Y-%m-%d %H:%M:%S %ZÚ])	rO   r   Úfromtimestampr   r   r   r   r   r	   )rD   r(   r,   r   s   &&  r   Úformat_message_timestamprU   f   s~   € ä$ XÔ5€EØ‚}Ùðð 68²^ŒX×#Ò# EÕ1Ì×I_ÒI_Ð`eÔjmÔIn×IyÑIyÓI{ˆð Œ}˜RÐ!:Ó;Ð<¸AÐ>Ð>øô ”]¤JÐ/ô Úðús   ”AA) Á)BÂBc               ó    € V ^8„  d   QhRRRR/# )r   Úcontentr0   r   ztuple[str, Optional[float]]r   )r   s   "r   r   r   t   s   € ÷  ñ  ¨cð  Ð?Zñ  r   c                óÐ   € \        V \        4      '       d	   V '       g   V R3# T Rr2\        P                  V4      ;pe'   \	        WAR7      pVe   TpW$P                  4       R pK?  W#3# )u÷   Strip leading gateway timestamp prefixes â†’ ``(clean_content, embedded_epoch)``.
With several prefixes the one closest to the text wins, preserving the platform-send
time of legacy rows like ``[processing time] [platform time] [sender] message``.NrG   )rH   r0   rM   r<   rB   Úend)rW   r(   r/   Úembedded_epochr<   rN   s   &&    r   Ú strip_leading_message_timestampsr[   t   sh   € ô �gœs×#Ò#¯7Ø˜ˆ}ÐØ" Dˆ.Ü(×.Ñ.¨tÓ4Ð4ˆ5Ò
AÜ'¨Ô5ˆØÒØ#ˆNØ—I‘I“K�LÐ!ŠØÐÐr   c               ó$   € V ^8„  d   QhRRRRRR/# )r   rW   r0   rD   r   r   r   )r   s   "r   r   r   ƒ   s'   € ÷ bñ b°ð b¸sð bÐWZñ br   c                óŠ   € \        WR7      w  r4\        Vf   TMTVR7      pV'       d   V'       d   V RV 2# T;'       g    T# )z“Render a user message for LLM context with exactly one timestamp prefix; an
existing prefix is stripped and its parsed time wins over ``ts_value``.rG   r@   )r[   rU   )rW   rD   r(   Úclean_contentrZ   Úprefixs   &&&   r   Ú"render_user_content_with_timestampr`   ƒ   sI   € ô %EÀWÔ$TÑ!€MÜ%°.Ò2H¡hÈnÐacÔd€Fß*0·]ˆfˆX�Q�}�oÐ&ÐaÈ×I`ÐI`ÐS`Ðar   )N)NN)Ú__doc__Ú
__future__r   r!   Úrer   r$   r   r   r   Útypingr   r   r   Úhermes_timer	   ÚcompilerM   r-   r:   rB   rO   rU   r[   r`   r   r   r   Ú<module>rg      sj   ðñõ #ã Û 	Û 
Û ß ,Ñ ,ß 'Ñ 'å %ð —z’zðóÐ õ÷2÷÷$÷.?÷ ÷bñ br   