
    
Bj="                         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y)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y)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                    |j                         }|j                         }|dk(  rD|r* | |j                  |j                  |j                  d      S  | t
        j                  d      S |dk(  r | t
        j                        S d|v rg|j                  dd      }|d	   j                         }t        |      d
kD  r|d
   nd}t        |      dkD  r|d   nd}	 t        |      }	 | |	||d      S 	 t        |      }	 | |	      S # t        $ r  | t
        j                        cY S w xY w# 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   target_strippedtarget_lowerpartsplatform_strr   r   r   s
             5/home/ubuntu/.hermes/hermes-agent/gateway/delivery.pyparsezDeliveryTarget.parse-   sI    !,,.&,,.8##__"NN$.."	  HNNdCC7"// /!#))#q1E 8>>+L"%e*q.eAhdG$'JNaI4#L1Hg`dee	0-H))  4HNN334  	0//	0s$   D 2D,  D)(D), EEc                 z   | j                   ry| j                  t        j                  k(  ry| j                  r>| j
                  r2| 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    >>==HNN*<<DNNmm))*!DLL>4>>:JKK<<mm))*!DLL>::}}"""    N)__name__
__module____qualname____doc__r   __annotations__r   r   strr   r   boolr   classmethodr   r)   r-    r.   r(   r   r      sy     !GXc]!#Ix}#ItK003 00(? 00K[ 00 00d
#3 
#r.   r   c                      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y)DeliveryRouterz
    Routes messages to appropriate destinations.
    
    Handles the logic of resolving delivery targets and dispatching
    messages to the right platform adapters.
    Nconfigadaptersc                 R    || _         |xs i | _        t               dz  dz  | _        y)z
        Initialize the delivery router.
        
        Args:
            config: Gateway configuration
            adapters: Dict mapping platforms to their adapter instances
        cronoutputN)r;   r<   r
   
output_dir)r,   r;   r<   s      r(   __init__zDeliveryRouter.__init__u   s*      B)+f4x?r.   contenttargetsjob_idjob_namemetadatar   c                 V  K   i }|D ]f  }	 |j                   t        j                  k(  r| j                  ||||      }n| j	                  |||       d{   }d|d||j                         <   h |S 7 # t        $ r)}	dt        |	      d||j                         <   Y d}	~	d}	~	ww xY ww)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)rH   error)r   r   r   _deliver_local_deliver_to_platformr-   	Exceptionr5   )
r,   rB   rC   rD   rE   rF   resultsr   rI   es
             r(   deliverzDeliveryRouter.deliver   s     *  	F??hnn4!00&(HUF#'#<#<VWh#WWF  $$/((*+	"  X  $ V/((*+sA   B)AA4A2A4.B)2A44	B&=B!B)!B&&B)c                 .   t        j                         j                  d      }|r| j                  |z  | dz  }n| j                  dz  | dz  }|j                  j                  dd       g }|r|j                  d|        n|j                  d       |j                  d       |j                  d	t        j                         j                  d
              |r|j                  d|        |r/|j                         D ]  \  }}	|j                  d| d|	         |j                  d       |j                  d       |j                  d       |j                  |       |j                  dj                  |             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joinr5   )
r,   rB   rD   rE   rF   rZ   output_pathlineskeyr+   s
             r(   rK   zDeliveryRouter._deliver_local   sq    LLN++O<	//F2	{#5FFK//F2	{#5FFK   = LL2hZ)LL,-Rx||~'>'>?R'S&TUVLL<x01&nn. 4
Ur#d5'234 	RURWtyy/0 $"
 	
r.   c                     t        j                         j                  d      }t               dz  dz  }|j	                  dd       || d| dz  }|j                  |       |S )z7Save full cron output to disk and return the file path.rR   r>   r?   TrT   _z.txt)r   r[   r\   r
   r^   ra   )r,   rB   rD   rZ   out_dirrY   s         r(   _save_full_outputz DeliveryRouter._save_full_output   sb    LLN++O<	!#f,x7dT2F81YKt44 r.   r   c                   K   | j                   j                  |j                        }|s"t        d|j                  j                         |j
                  s#t        d|j                  j                   d      t        |      t        kD  rX|xs i j                  dd      }| j                  ||      }t        j                  dt        |      |       |dt         d| d	z   }t        |xs i       }|j                  rd
|vr|j                  |d
<   |j                  |j
                  ||xs d       d{   S 7 w)z(Deliver content to a messaging platform.zNo adapter configured for zNo chat ID for z	 deliveryrD   unknownu4   Cron output truncated (%d chars) — full output: %sNz'

... [truncated, full output saved to ]r   )rF   )r<   getr   r"   r+   r   r!   MAX_PLATFORM_OUTPUTri   loggerinfoTRUNCATED_VISIBLEdictr   send)r,   r   rB   rF   adapterrD   
saved_pathsend_metadatas           r(   rL   z#DeliveryRouter._deliver_to_platform   s/     --##FOO49&//:O:O9PQRR~~v/D/D.EYOPP w<--n"))(I>F//@JKKNPST[P\^hi**+=j\KL 
 X^,= @)/)9)9M+&\\&..'MDYUY\ZZZZs   D6D?8D=9D?r/   )NNN)r0   r1   r2   r3   r   r   r   r	   rA   r5   r   r   r   rP   rK   r   ri   rL   r8   r.   r(   r:   r:   m   sE   
@} 
@Xs]8K 
@  !%"&-1(( n%( 	(
 3-( 4S>*( 
c3h(T,
,
 ,
 3-	,

 4S>*,
 
c3h,
\ c d [[ [ 4S>*	[
 
c3h[r.   r:   )r3   loggingpathlibr   r   dataclassesr   typingr   r   r   r	   hermes_cli.configr
   	getLoggerr0   ro   rn   rq   r;   r   r   sessionr   r   r:   r8   r.   r(   <module>r~      sp       ! , , -			8	$   + " M# M# M#`Q[ Q[r.   