+
    jHàjƒ  ã                  óø   € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIH	t	 ^ RI
Ht RtRt]P                  ! 4       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 R ltR R ltR# )u  Local index of what we've sent (and, for WhatsApp, received) keyed by ``(chat_id, message_id)``.

Telegram does NOT echo a rich message's content back in ``reply_to_message`` (``.text``/``.caption``
empty, ``.api_kwargs`` None), and WhatsApp quotes carry only the quoted message's id (Cloud API) or a
thumbnail stub (Baileys) â€” never the original bytes. So a reply to something we sent arrives with no
quotable text and no way to re-fetch a quoted attachment. We remember ``message_id -> text`` and
``message_id -> [(local_path, mime)]`` at send/receive time and look them up by ``reply_to_id`` on
inbound. Best-effort and dependency-free: every operation swallows errors and degrades to a no-op /
``None`` / ``[]`` so it can never break a send or an inbound message.
)ÚannotationsN)ÚOptional)Úatomic_json_writeiè  iÐ  c               ó   € V ^8„  d   QhRR/# )é   ÚreturnÚstr© )Úformats   "Ú</home/ubuntu/.hermes/hermes-agent/gateway/rich_sent_store.pyÚ__annotate__r       s   € ÷ Qñ Q�Sñ Qó    c                 ól   € ^ RI Hp  \        P                  P	                  \        V ! 4       4      RR4      # )é    ©Úget_hermes_homeÚstatezrich_sent_index.json)Úhermes_constantsr   ÚosÚpathÚjoinr   r   s    r   Ú_store_pathr       s%   € Ý0Ü�7‰7�<‰<œ™OÓ-Ó.°Ð9OÓPÐPr   c               ó    € V ^8„  d   QhRRRR/# )r   r   r   r   Údictr	   )r
   s   "r   r   r   %   s   € ÷ 2ñ 2�ð 2˜ñ 2r   c                óú   €  \        V R RR7      ;_uu_ 4       p\        P                  ! V4      pRRR4       \        X\        4      '       d   T# / #   + '       g   i     L*; i  \        \        3 d    / u # i ; i)Úrz	utf-8-sig)ÚencodingN)ÚopenÚjsonÚloadÚFileNotFoundErrorÚ
ValueErrorÚ
isinstancer   )r   ÚfhÚdatas   &  r   Ú_loadr%   %   sd   € ðÜ�$˜ k×2Õ2°bÜ—9’9˜R“=ˆD÷ 3ô ˜d¤D×)Ò)ˆ4Ð1¨rÐ1÷	 3×2ûäœzÐ*ô ØŠ	ðús-   ‚A$ ˜A¯A$ ÁA!	ÁA$ Á!A$ Á$A:Á9A:c               ó    € V ^8„  d   QhRRRR/# )r   Úfieldsr   r   ÚNoner	   )r
   s   "r   r   r   .   s   € ÷ ñ ¨ð °$ñ r   c                óº  € \        4       p\        ;_uu_ 4         \        P                  ! \        P                  P                  V4      RR7       \        V4      pV  RV 2pVP                  V4      p\        V\        4      '       d   TM/ p/ VCVCR\        \        P                  ! 4       4      /CWE&   \        V4      \        8”  dO   \        VP                  4       R R7      R\        V4      \        ,
            F  w  rxVP!                  VR4       K  	  \#        W4RR7        RRR4       R#   \$         d     RRR4       R# i ; i  + '       g   i     R# ; i)	zPMerge ``fields`` into the ``(chat_id, message_id)`` entry. No-op on any failure.T)Úexist_okÚ:Útsc                ó4   € V ^,          P                  R^ 4      # )é   r,   )Úget)Úkvs   &r   Ú<lambda>Ú_update.<locals>.<lambda>:   s   € ÀÀ1ÅÇ	Á	È$ÐPQÔ@Rr   )ÚkeyN)Úindent)r   Ú_LOCKr   Úmakedirsr   Údirnamer%   r/   r"   r   ÚintÚtimeÚlenÚ_MAX_ENTRIESÚsortedÚitemsÚpopr   Ú	Exception)	Úchat_idÚ
message_idr'   r   r$   r3   ÚentryÚkÚ_s	   &&&      r   Ú_updaterE   .   s
  € ä‹=€Dß	Žð	Ü�KŠKœŸ™Ÿ™¨Ó-¸Õ=Ü˜“;ˆDØ�I˜Q˜z˜lÐ+ˆCØ—H‘H˜S“MˆEÜ'¨¬t×4Ò4‘E¸"ˆEØC˜5ÐC FÐC¨D´#´d·i²i³kÓ2BÑCˆD‰IÜ�4‹yœ<Ô'Ü" 4§:¡:£<Ñ5RÔSÐTnÔVYÐZ^ÓV_ÔbnÕVnÓo‘D�AØ—H‘H˜Q Ö%ñ pä˜d°Ö6÷ 
‰øô ô 	Ø÷ 
‰ð	ú÷ 
�ˆús)   ™E	›D	D/Ä/EÄ:E	ÅEÅE	Å	E	c               ó    € V ^8„  d   QhRRRR/# ©r   ÚtextúOptional[str]r   r(   r	   )r
   s   "r   r   r   A   s   € ÷ @ñ @ mð @¸ñ @r   c                óT   € V'       d	   Ve   V f   R# \        WRVR\         /4       R# )zEPersist ``text`` for ``(chat_id, message_id)``. No-op on any failure.NÚt)rE   Ú_MAX_TEXT_CHARS©r@   rA   rH   s   &&&r   ÚrecordrN   A   s(   € ç�:Ò%¨ªÙÜˆG # tÐ,<¬_Ð'=Ð!>Ö?r   c               ó    € V ^8„  d   QhRRRR/# ©r   Úmediaúlist[tuple[str, str]]r   r(   r	   )r
   s   "r   r   r   H   s   € ÷ [ñ [Ð-Bð [Àtñ [r   c                óÊ   € V'       d	   Ve   V f   R# \        YRV UUu. uF/  w  r4V'       g   K  \        V4      \        T;'       g    R4      .NK1  	  upp/4       R# u uppi )zNPersist local attachment ``(path, mime)`` pairs for ``(chat_id, message_id)``.NÚmÚ )rE   r   )r@   rA   rQ   ÚpÚmts   &&&  r   Úrecord_mediarX   H   sM   € ç�JÒ&¨'ª/ÙÜˆG #ÉUÔ'XÉUÁEÀAÔVWÔ(?¬¨Q«´°R·X°X¸2³Ó(?ÉUÒ'XÐ!YÖZùÓ'Xs   ŸA°AÁAc               ó    € V ^8„  d   QhRRRR/# rG   r	   )r
   s   "r   r   r   O   s   € ÷ ?ñ ?°-ð ?ÀDñ ?r   c              ƒ  óZ   "  € \         P                  ! \        WV4      G Rj  x€L
  R#  L5i)z”``record`` for coroutine callers: the read-modify-write + ``os.replace``
runs on a worker thread so the event loop is not stalled by the filesystem.N)ÚasyncioÚ	to_threadrN   rM   s   &&&r   Úrecord_asyncr]   O   s   é € ô ×
Ò
œF G¸Ó
>×>Ô>ùó   ‚ +¢)£+c               ó    € V ^8„  d   QhRRRR/# rP   r	   )r
   s   "r   r   r   U   s    € ÷ Fñ FÐ9Nð FÐSWñ Fr   c              ƒ  óZ   "  € \         P                  ! \        WV4      G Rj  x€L
  R#  L5i)z=``record_media`` for coroutine callers; see ``record_async``.N)r[   r\   rX   )r@   rA   rQ   s   &&&r   Úrecord_media_asyncra   U   s   é € ä
×
Ò
œL¨'¸uÓ
E×EÔEùr^   c               ó   € V ^8„  d   QhRR/# )r   r   r   r	   )r
   s   "r   r   r   Z   s   € ÷ 4ñ 4 4ñ 4r   c                ó˜   € Ve   V f   / # \        \        4       4      P                  V  RV 24      p\        V\        4      '       d   V# / # )Nr+   )r%   r   r/   r"   r   )r@   rA   rB   s   && r   Ú_entryrd   Z   sJ   € ØÒ˜Wš_Øˆ	Ü”+“-Ó ×$Ñ$¨ y°°*°Ð%>Ó?€EÜ˜u¤d×+Ò+ˆ5Ð3°Ð3r   c               ó   € V ^8„  d   QhRR/# )r   r   rI   r	   )r
   s   "r   r   r   a   s   € ÷ 8ñ 8 =ñ 8r   c                óJ   € \        W4      P                  R4      ;'       g    R# )z=Return stored text for ``(chat_id, message_id)`` or ``None``.rK   N)rd   r/   )r@   rA   s   &&r   Úlookuprg   a   s    € ä�'Ó&×*Ñ*¨3Ó/×7Ð7°4Ð7r   c               ó   € V ^8„  d   QhRR/# )r   r   rR   r	   )r
   s   "r   r   r   f   s   € ÷ Tñ TÐ)>ñ Tr   c                ó  € \        W4      P                  R4      ;'       g    . pV UUu. uFG  w  r4\        V\        4      '       g   K  \        P
                  P                  V4      '       g   KD  W43NKI  	  upp# u uppi )z]Return stored ``(path, mime)`` pairs whose file still exists (attachments may be temp files).rT   )rd   r/   r"   r   r   r   Úisfile)r@   rA   ÚpairsrV   rW   s   &&   r   Úlookup_mediarl   f   sX   € ä�7Ó'×+Ñ+¨CÓ0×6Ð6°B€EÙ!&ÔS¡™˜¬*°Q¼×*<ŒGÄÇÁÇÁÐPQ×ARŒGˆQ‹G¡ÒSÐSùÓSs   ªA;Á	"A;Á0A;)Ú__doc__Ú
__future__r   r[   r   r   Ú	threadingr9   Útypingr   Úutilsr   r;   rL   ÚLockr5   r   r%   rE   rN   rX   r]   ra   rd   rg   rl   r	   r   r   Ú<module>rs      ss   ðñ	õ #ã Û Û 	Û Û Ý Ý #à€Ø€ð 	�ŠÓ€õQõ
2õõ&@õ[õ?õFõ
4õ8÷
Tr   