§
    øžyj¥  ã                  óº   — d Z ddlmZ ddlZddlmZ ddlmZmZmZ  ej	        d¦  «        Z
 ej	        d¦  «        Zddd„Zddd„Zddd„Zddd„Zddd„Zddd„ZdS ) 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)ÚAnyÚOptionalÚTuplezv^\[(?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_+\-/:]+))?\]\s*z)^\[(?P<iso>\d{4}-\d{2}-\d{2}T[^\]]+)\]\s*Úts_valuer   ÚreturnúOptional[float]c                ó"  — | €dS t          | t          t          f¦  «        rt          | ¦  «        S t          | d¦  «        r3	 t          |                      ¦   «         ¦  «        S # t
          $ r Y dS w xY wt          | t          ¦  «        �r|                      ¦   «         }|sdS t          ||¬¦  «        }|�|S 	 t          |¦  «        S # t          t          f$ r Y nw xY w	 t          j        |¦  «        }nG# t          t          f$ r3 	 t          j        |d¦  «        }n# t          t          f$ r Y Y dS w xY wY nw xY w|j        €-|�|                     |¬¦  «        }n|                     ¦   «         }t          |                     ¦   «         ¦  «        S dS )zõCoerce a timestamp-like value to Unix epoch seconds.

    Accepts Unix epoch numbers, datetime objects, ISO strings, and the gateway's
    bracketed human-readable timestamp format. Returns ``None`` when the value
    cannot be interpreted.
    NÚ	timestamp©Útzú%Y-%m-%dT%H:%M:%S%z©Útzinfo)Ú
isinstanceÚintÚfloatÚhasattrr   Ú	ExceptionÚstrÚstripÚ_parse_timestamp_prefixÚ	TypeErrorÚ
ValueErrorr   ÚfromisoformatÚstrptimer   ÚreplaceÚ
astimezone)r   r   ÚtextÚparsedÚdts        ú@/home/ragecks/.hermes/hermes-agent/gateway/message_timestamps.pyÚcoerce_message_timestampr$      sÔ  € ð ÐØˆtå�(�S¥%˜LÑ)Ô)ð Ý�X‰ŒÐåˆx˜Ñ%Ô%ð ð	Ý˜×+Ò+Ñ-Ô-Ñ.Ô.Ð.øÝð 	ð 	ð 	Ø�4�4ð	øøøõ �(�CÑ Ô ñ %Ø�~Š~ÑÔˆØð 	Ø�4Ý(¨°"Ð5Ñ5Ô5ˆØÐØˆMð	Ý˜‘;”;ÐøÝ�:Ð&ð 	ð 	ð 	ØˆDð	øøøð	ÝÔ'¨Ñ-Ô-ˆBˆBøÝ�:Ð&ð 	ð 	ð 	ðÝÔ& tÐ-BÑCÔC��øÝ�zÐ*ð ð ð Ø�t�t�tðøøøð �ð	øøøð
 Œ9ÐØˆ~Ø—Z’Z r�ZÑ*Ô*��à—]’]‘_”_�Ý�R—\’\‘^”^Ñ$Ô$Ð$àˆ4sZ   Á A" Á"
A0Á/A0Â7C ÃCÃCÃC3 Ã3D7ÄDÄD7ÄD1Ä,D7Ä0D1Ä1D7Ä6D7r   c                óà   — t          | |¬¦  «        }|€dS |�t          j        ||¬¦  «        }n&t          j        |¦  «                             ¦   «         }d|                     d¦  «        z   dz   S )z?Format a timestamp value as ``[Tue 2026-04-28 13:40:53 CEST]``.r   NÚ Ú[z%a %Y-%m-%d %H:%M:%S %ZÚ])r$   r   Úfromtimestampr   Ústrftime)r   r   Úepochr"   s       r#   Úformat_message_timestampr,   L   ss   € å$ X°"Ð5Ñ5Ô5€EØ€}ØˆrØ	€~ÝÔ# E¨bÐ1Ñ1Ô1ˆˆåÔ# EÑ*Ô*×5Ò5Ñ7Ô7ˆØ�—’Ð6Ñ7Ô7Ñ7¸#Ñ=Ð=ó    ÚcontentúTuple[str, Optional[float]]c                ó  — t          | t          ¦  «        r| s| dfS | }d}	 t                               |¦  «        pt                               |¦  «        }|sn2t          ||¬¦  «        }|�|}||                     ¦   «         d…         }Œi||fS )aw  Strip one or more leading gateway timestamp prefixes from ``content``.

    Returns ``(clean_content, embedded_epoch)``.  If multiple timestamp prefixes
    are present, the timestamp closest to the actual message text wins.  That
    preserves the original platform-send time for legacy contaminated rows like
    ``[processing time] [platform time] [sender] message``.
    NTr   )r   r   Ú_HUMAN_TIMESTAMP_REÚmatchÚ_ISO_TIMESTAMP_REÚ_parse_timestamp_matchÚend)r.   r   r    Úembedded_epochr2   r!   s         r#   Ú strip_leading_message_timestampsr7   X   s­   € õ �g�sÑ#Ô#ð ¨7ð Ø˜ˆ}Ðà€DØ&*€Nð"Ý#×)Ò)¨$Ñ/Ô/ÐPÕ3D×3JÒ3JÈ4Ñ3PÔ3PˆØð 	ØÝ'¨°"Ð5Ñ5Ô5ˆØÐØ#ˆNØ�E—I’I‘K”K�L�LÔ!ˆð"ð �ÐÐr-   c                óv   — t          | |¬¦  «        \  }}|�|n|}t          ||¬¦  «        }|s|S |r|› d|› �S |S )aY  Render a user message for LLM context with exactly one timestamp prefix.

    Existing leading timestamp prefixes are removed first.  If such a prefix was
    present, its parsed time wins over ``ts_value``; otherwise ``ts_value`` is
    formatted and prepended.  If no timestamp is available, the cleaned content is
    returned unchanged.
    r   NÚ )r7   r,   )r.   r   r   Úclean_contentr6   Úeffective_tsÚprefixs          r#   Ú"render_user_content_with_timestampr=   r   sl   € õ %EÀWÐQSÐ$TÑ$TÔ$TÑ!€M�>Ø%3Ð%?�>�>ÀX€LÝ% l°rÐ:Ñ:Ô:€FØð ØÐØð +ØÐ*Ð*˜=Ð*Ð*Ð*Ø€Mr-   r    c                ó”   — t                                | ¦  «        pt                               | ¦  «        }|sd S t          ||¬¦  «        S )Nr   )r1   r2   r3   r4   )r    r   r2   s      r#   r   r   „   sI   € Ý×%Ò% dÑ+Ô+ÐLÕ/@×/FÒ/FÀtÑ/LÔ/L€EØð ØˆtÝ! %¨BÐ/Ñ/Ô/Ð/r-   r2   úre.Matchc                ó  — d|                       ¦   «         v rÎ|                      d¦  «        r¹|                      d¦  «        }	 t          j        |¦  «        }n9# t          $ r, 	 t          j        |d¦  «        }n# t          $ r Y Y d S w xY wY nw xY w|j        €-|�|                     |¬¦  «        }n|                     ¦   «         }t          | 
                    ¦   «         ¦  «        S |                      d¦  «        }|                      d¦  «        }	 t          j        |› d|› �d¦  «        }n# t          $ r Y d S w xY w|�|                     |¬¦  «        }n|                     ¦   «         }t          | 
                    ¦   «         ¦  «        S )NÚisor   r   ÚdateÚtimer9   z%Y-%m-%d %H:%M:%S)Ú	groupdictÚgroupr   r   r   r   r   r   r   r   r   )r2   r   Úiso_textr"   Ú	date_partÚ	time_parts         r#   r4   r4   ‹   s   € Ø�—’Ñ!Ô!Ð!Ð! e§k¢k°%Ñ&8Ô&8Ð!Ø—;’;˜uÑ%Ô%ˆð	ÝÔ'¨Ñ1Ô1ˆBˆBøÝð 	ð 	ð 	ðÝÔ& xÐ1FÑGÔG��øÝð ð ð Ø�t�t�tðøøøð �ð	øøøð
 Œ9ÐØˆ~Ø—Z’Z r�ZÑ*Ô*��à—]’]‘_”_�Ý�R—\’\‘^”^Ñ$Ô$Ð$à—’˜FÑ#Ô#€IØ—’˜FÑ#Ô#€IðÝÔ )Ð9Ð9¨iÐ9Ð9Ð;NÑOÔOˆˆøÝð ð ð Øˆtˆtðøøøà	€~Ø�ZŠZ˜rˆZÑ"Ô"ˆˆà�]Š]‰_Œ_ˆÝ�—’‘”Ñ Ô Ð sH   ÁA Á
BÁ"A8Á7BÁ8
BÂBÂBÂBÂBÄD+ Ä+
D9Ä8D9)N)r   r   r	   r
   )r   r   r	   r   )r.   r   r	   r/   )NN)r.   r   r   r   r	   r   )r    r   r	   r
   )r2   r?   r	   r
   )Ú__doc__Ú
__future__r   Úrer   Útypingr   r   r   Úcompiler1   r3   r$   r,   r7   r=   r   r4   © r-   r#   ú<module>rO      s1  ððð ð #Ð "Ð "Ð "Ð "Ð "à 	€	€	€	Ø Ð Ð Ð Ð Ð Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'ð !�b”jð-ñô Ð ð �B”JØ0ñô Ð ð
,ð ,ð ,ð ,ð ,ð^	>ð 	>ð 	>ð 	>ð 	>ð ð  ð  ð  ð  ð4ð ð ð ð ð$0ð 0ð 0ð 0ð 0ð!ð !ð !ð !ð !ð !ð !r-   