§
    ‰eîie!  ã                   óâ   — d Z ddlZddlmZ ddlmZ ddlmZ ddlmZm	Z	m
Z
mZ ddlmZ  ej        e¦  «        ZdZd	Zd
dlmZmZ d
dlmZ e G d„ d¦  «        ¦   «         Z G d„ d¦  «        ZdS )u0  
Delivery routing for cron job outputs and agent responses.

Routes messages to the appropriate destination based on:
- Explicit targets (e.g., "telegram:123456789")
- Platform home channels (e.g., "telegram" â†’ home channel)
- Origin (back to where the job was created)
- Local (always saved to files)
é    N)ÚPath)Údatetime)Ú	dataclass)ÚDictÚListÚOptionalÚAny)Úget_hermes_homei   iØ  é   )ÚPlatformÚGatewayConfig)ÚSessionSourcec                   ó¬   — e Zd ZU dZeed<   dZee         ed<   dZ	ee         ed<   dZ
eed<   dZeed<   edd	ed
ee         dd fd„¦   «         Zdefd„ZdS )ÚDeliveryTargetuý   
    A single delivery target.
    
    Represents where a message should be sent:
    - "origin" â†’ back to source
    - "local" â†’ save to local files
    - "telegram" â†’ Telegram home channel
    - "telegram:123456" â†’ specific Telegram chat
    ÚplatformNÚchat_idÚ	thread_idFÚ	is_originÚis_explicitÚtargetÚoriginÚreturnc                 óÆ  — |                      ¦   «                              ¦   «         }|dk    r7|r | |j        |j        |j        d¬¦  «        S  | t
          j        d¬¦  «        S |dk    r | t
          j        ¬¦  «        S d|v r�|                     dd¦  «        }|d	         }t          |¦  «        d
k    r|d
         nd}t          |¦  «        dk    r|d         nd}	 t          |¦  «        } | |||d¬¦  «        S # t          $ r  | t
          j        ¬¦  «        cY S w xY w	 t          |¦  «        } | |¬¦  «        S # t          $ r  | t
          j        ¬¦  «        cY S w xY w)uþ   
        Parse a delivery target string.
        
        Formats:
        - "origin" â†’ back to source
        - "local" â†’ local files only
        - "telegram" â†’ Telegram home channel
        - "telegram:123456" â†’ specific Telegram chat
        r   T)r   r   r   r   )r   r   Úlocal)r   ú:é   r   r   N)r   r   r   r   )
ÚstripÚlowerr   r   r   r   ÚLOCALÚsplitÚlenÚ
ValueError)Úclsr   r   ÚpartsÚplatform_strr   r   r   s           ú2/home/div/.hermes/hermes-agent/gateway/delivery.pyÚparsezDeliveryTarget.parse-   s°  € ð —’‘”×%Ò%Ñ'Ô'ˆà�XÒÐØð 	DØ�sØ#œ_Ø"œNØ$Ô.Ø"ð	ñ ô ð ð �s¥H¤N¸dÐCÑCÔCÐCà�WÒÐØ�3¥¤Ð/Ñ/Ô/Ð/ð �&ˆ=ˆ=Ø—L’L  aÑ(Ô(ˆEØ  œ8ˆLÝ"% e¡*¤*¨q¢. .�e˜A”h�h°dˆGÝ$'¨¡J¤J°¢N N˜˜aœ˜¸ˆIð4Ý# LÑ1Ô1�Ø�s H°gÈÐ`dÐeÑeÔeÐeøÝð 4ð 4ð 4à�s¥H¤NÐ3Ñ3Ô3Ð3Ð3Ð3ð4øøøð
	0Ý Ñ'Ô'ˆHØ�3 Ð)Ñ)Ô)Ð)øÝð 	0ð 	0ð 	0à�3¥¤Ð/Ñ/Ô/Ð/Ð/Ð/ð	0øøøs$   ÃC; Ã; DÄDÄ"D= Ä= E ÅE c                 óì   — | j         rdS | j        t          j        k    rdS | j        r%| j        r| j        j        › d| j        › d| j        › �S | j        r| j        j        › d| j        › �S | j        j        S )zConvert back to string format.r   r   r   )r   r   r   r   r   r   Úvalue)Úselfs    r&   Ú	to_stringzDeliveryTarget.to_string^   s�   € àŒ>ð 	Ø�8ØŒ=�HœNÒ*Ð*Ø�7ØŒ<ð 	L˜DœNð 	LØ”mÔ)ÐKÐK¨D¬LÐKÐK¸4¼>ÐKÐKÐKØŒ<ð 	;Ø”mÔ)Ð:Ð:¨D¬LÐ:Ð:Ð:ØŒ}Ô"Ð"ó    ©N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú__annotations__r   r   Ústrr   r   Úboolr   Úclassmethodr   r'   r+   © r,   r&   r   r      sÐ   € € € € € € ðð ð ÐÐÑØ!€GˆX�cŒ]Ð!Ð!Ñ!Ø#€Iˆx˜Œ}Ð#Ð#Ñ#Ø€IˆtÐÐÑØ€K�ÐÐÑàð.0ð .0˜3ð .0¨°Ô(?ð .0ÐK[ð .0ð .0ð .0ñ „[ð.0ð`
#˜3ð 
#ð 
#ð 
#ð 
#ð 
#ð 
#r,   r   c                   ód  — e Zd ZdZddedeeef         fd„Z	 	 	 dde	de
e         dee	         d	ee	         d
eee	ef                  dee	ef         fd„Zde	dee	         d	ee	         d
eee	ef                  dee	ef         f
d„Zde	de	defd„Zdede	d
eee	ef                  dee	ef         fd„ZdS )ÚDeliveryRouterz¬
    Routes messages to appropriate destinations.
    
    Handles the logic of resolving delivery targets and dispatching
    messages to the right platform adapters.
    NÚconfigÚadaptersc                 óX   — || _         |pi | _        t          ¦   «         dz  dz  | _        dS )zº
        Initialize the delivery router.
        
        Args:
            config: Gateway configuration
            adapters: Dict mapping platforms to their adapter instances
        ÚcronÚoutputN)r9   r:   r
   Ú
output_dir)r*   r9   r:   s      r&   Ú__init__zDeliveryRouter.__init__s   s1   € ð ˆŒØ ˜ BˆŒÝ)Ñ+Ô+¨fÑ4°xÑ?ˆŒˆˆr,   ÚcontentÚtargetsÚjob_idÚjob_nameÚmetadatar   c              ƒ   ó`  K  — i }|D ]¦}	 |j         t          j        k    r|                      ||||¦  «        }n|                      |||¦  «        ƒ d{V —†}d|dœ||                     ¦   «         <   Œi# t          $ r1}	dt          |	¦  «        dœ||                     ¦   «         <   Y d}	~	ŒŸd}	~	ww xY w|S )a�  
        Deliver content to all specified targets.
        
        Args:
            content: The message/output to deliver
            targets: List of delivery targets
            job_id: Optional job ID (for cron jobs)
            job_name: Optional job name
            metadata: Additional metadata to include
        
        Returns:
            Dict with delivery results per target
        NT)ÚsuccessÚresultF)rF   Úerror)r   r   r   Ú_deliver_localÚ_deliver_to_platformr+   Ú	Exceptionr3   )
r*   r@   rA   rB   rC   rD   Úresultsr   rG   Úes
             r&   ÚdeliverzDeliveryRouter.deliver   sü   è è € ð* ˆàð 	ð 	ˆFðØ”?¥h¤nÒ4Ð4Ø!×0Ò0°¸&À(ÈHÑUÔU�F�Fà#'×#<Ò#<¸VÀWÈhÑ#WÔ#WÐWÐWÐWÐWÐWÐW�Fð  $Ø$ð/ð /�˜×(Ò(Ñ*Ô*Ñ+Ð+øõ ð ð ð à$Ý  ™VœVð/ð /�˜×(Ò(Ñ*Ô*Ñ+Ð+Ð+Ð+Ð+Ð+øøøøðøøøð ˆs   ŠA%A0Á0
B+Á:'B&Â&B+c                 ó�  — t          j        ¦   «                              d¦  «        }|r| j        |z  |› d�z  }n| j        dz  |› d�z  }|j                             dd¬¦  «         g }|r|                     d|› �¦  «         n|                     d¦  «         |                     d¦  «         |                     d	t          j        ¦   «                              d
¦  «        › �¦  «         |r|                     d|› �¦  «         |r5|                     ¦   «         D ] \  }}	|                     d|› d|	› �¦  «         Œ!|                     d¦  «         |                     d¦  «         |                     d¦  «         |                     |¦  «         |                     d 	                    |¦  «        ¦  «         t          |¦  «        |dœS )zSave content to local files.ú%Y%m%d_%H%M%Sz.mdÚmiscT©ÚparentsÚexist_okz# z# Delivery OutputÚ z**Timestamp:** z%Y-%m-%d %H:%M:%Sz**Job ID:** z**z:** z---ú
)ÚpathÚ	timestamp)r   ÚnowÚstrftimer>   ÚparentÚmkdirÚappendÚitemsÚ
write_textÚjoinr3   )
r*   r@   rB   rC   rD   rX   Úoutput_pathÚlinesÚkeyr)   s
             r&   rI   zDeliveryRouter._deliver_local©   sì  € õ ”L‘N”N×+Ò+¨OÑ<Ô<ˆ	àð 	GØœ/¨FÑ2¸	Ð5FÐ5FÐ5FÑFˆKˆKàœ/¨FÑ2¸	Ð5FÐ5FÐ5FÑFˆKàÔ× Ò ¨¸Ð Ñ=Ô=Ð=ð ˆØð 	.Ø�LŠL˜˜h˜˜Ñ)Ô)Ð)Ð)à�LŠLÐ,Ñ-Ô-Ð-à�Š�RÑÔÐØ�ŠÐU¥x¤|¡~¤~×'>Ò'>Ð?RÑ'SÔ'SÐUÐUÑVÔVÐVàð 	2Ø�LŠLÐ0¨Ð0Ð0Ñ1Ô1Ð1àð 	4Ø&ŸnšnÑ.Ô.ð 4ð 4‘
��UØ—’Ð2 #Ð2Ð2¨5Ð2Ð2Ñ3Ô3Ð3Ð3à�Š�RÑÔÐØ�Š�UÑÔÐØ�Š�RÑÔÐØ�Š�WÑÔÐà×Ò˜tŸyšy¨Ñ/Ô/Ñ0Ô0Ð0õ ˜Ñ$Ô$Ø"ð
ð 
ð 	
r,   c                 óè   — t          j        ¦   «                              d¦  «        }t          ¦   «         dz  dz  }|                     dd¬¦  «         ||› d|› d�z  }|                     |¦  «         |S )z7Save full cron output to disk and return the file path.rP   r<   r=   TrR   Ú_z.txt)r   rY   rZ   r
   r\   r_   )r*   r@   rB   rX   Úout_dirrW   s         r&   Ú_save_full_outputz DeliveryRouter._save_full_output×   sx   € å”L‘N”N×+Ò+¨OÑ<Ô<ˆ	Ý!Ñ#Ô# fÑ,¨xÑ7ˆØ�Š˜d¨TˆÑ2Ô2Ð2Ø˜FÐ4Ð4 YÐ4Ð4Ð4Ñ4ˆØ�Š˜Ñ Ô Ð Øˆr,   r   c              ƒ   óh  K  — | j                              |j        ¦  «        }|st          d|j        j        › �¦  «        ‚|j        st          d|j        j        › d�¦  «        ‚t          |¦  «        t          k    rm|pi                      dd¦  «        }|                      ||¦  «        }t           
                    dt          |¦  «        |¦  «         |dt          …         d|› d	�z   }t          |pi ¦  «        }|j        rd
|vr
|j        |d
<   |                     |j        ||pd¬¦  «        ƒ d{V —†S )z(Deliver content to a messaging platform.zNo adapter configured for zNo chat ID for z	 deliveryrB   Úunknownu4   Cron output truncated (%d chars) â€” full output: %sNz'

... [truncated, full output saved to ú]r   )rD   )r:   Úgetr   r"   r)   r   r!   ÚMAX_PLATFORM_OUTPUTrg   ÚloggerÚinfoÚTRUNCATED_VISIBLEÚdictr   Úsend)r*   r   r@   rD   ÚadapterrB   Ú
saved_pathÚsend_metadatas           r&   rJ   z#DeliveryRouter._deliver_to_platformà   sa  è è € ð ”-×#Ò# F¤OÑ4Ô4ˆàð 	SÝÐQ¸&¼/Ô:OÐQÐQÑRÔRÐRàŒ~ð 	QÝÐO¨v¬Ô/DÐOÐOÐOÑPÔPÐPõ ˆw‰<Œ<Õ-Ò-Ð-Ø�n "×)Ò)¨(°IÑ>Ô>ˆFØ×/Ò/°¸Ñ@Ô@ˆJÝ�KŠKÐNÕPSÐT[ÑP\ÔP\Ð^hÑiÔiÐiàÐ*Õ*Ð*Ô+ØK¸jÐKÐKÐKñLð õ
 ˜X˜^¨Ñ,Ô,ˆØÔð 	: °=Ð @Ð @Ø)/Ô)9ˆM˜+Ñ&Ø—\’\ &¤.°'ÀMÐDYÐUY�\ÑZÔZÐZÐZÐZÐZÐZÐZÐZr,   r-   )NNN)r.   r/   r0   r1   r   r   r   r	   r?   r3   r   r   r   rN   rI   r   rg   rJ   r6   r,   r&   r8   r8   k   sº  € € € € € ðð ð
@ð 
@˜}ð 
@¸¸XÀs¸]Ô8Kð 
@ð 
@ð 
@ð 
@ð  !%Ø"&Ø-1ð(ð (àð(ð �nÔ%ð(ð ˜”ð	(ð
 ˜3”-ð(ð ˜4  S œ>Ô*ð(ð 
ˆc�3ˆhŒð(ð (ð (ð (ðT,
àð,
ð ˜”ð,
ð ˜3”-ð	,
ð
 ˜4  S œ>Ô*ð,
ð 
ˆc�3ˆhŒð,
ð ,
ð ,
ð ,
ð\¨ð °cð ¸dð ð ð ð ð[àð[ð ð[ð ˜4  S œ>Ô*ð	[ð
 
ˆc�3ˆhŒð[ð [ð [ð [ð [ð [r,   r8   )r1   ÚloggingÚpathlibr   r   Údataclassesr   Útypingr   r   r   r	   Úhermes_cli.configr
   Ú	getLoggerr.   rm   rl   ro   r9   r   r   Úsessionr   r   r8   r6   r,   r&   ú<module>r|      sQ  ððð ð €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,à -Ð -Ð -Ð -Ð -Ð -à	ˆÔ	˜8Ñ	$Ô	$€àÐ ØÐ à +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ø "Ð "Ð "Ð "Ð "Ð "ð ðK#ð K#ð K#ð K#ð K#ñ K#ô K#ñ „ðK#ð\Q[ð Q[ð Q[ð Q[ð Q[ñ Q[ô Q[ð Q[ð Q[ð Q[r,   