+
    kHàjò  ã                   ó”   € R t ^ RIt^ RIt^ RIt^ RIHt ^ RIHt ^ RI	H
t
Ht ]P                  ! ]4      tR tRR ltRRRRR	R
/R ltR# )a  Out-of-process Signal send (cron / ``hermes send`` / send_message without a live gateway): raw
signal-cli JSON-RPC with Signal formatting, attachment batching and the process-wide rate-limit
scheduler shared with the gateway adapter. Wired as the plugin's ``standalone_sender_fn``.N)Úsignal_rate_limit)Úmarkdown_to_signal)Ú_errorÚ_successc              ƒ  óÜ  "  € \        V4      VP                  r‡\        ^V^,           4       EF9  p	 VP                  V4      G Rj  x€L
  \        P
                  ! 4       p
V ! WV4      G Rj  x€L
 pRV9  d8   VP                  \        P
                  ! 4       V
,
          V4      G Rj  x€L
   R# VR,          pVP                  ! V4      '       g   \        RV^,            RV RV 24      u # VP                  ! V4      pVP                  W×4       V'       d   VR R2MRpW˜8¼  d#   \        P                  R	V^,           WGV4        R
# \        P                  RV^,           WIWŽ4       EK<  	  R#  EL' EL LÌ  \         dk   pY˜8¼  d0   \        P                  RT^,           YI\        T4      4        Rp? R
# \        P                  RT^,           YIT\        T4      4        Rp?EK¸  Rp?ii ; i5i)z©One Signal batch under the scheduler with rate-limit retries: None on success, False when
retries were exhausted (batch lost), error dict for a non-rate-limit RPC error.NÚerrorzSignal RPC error on batch Ú/z: z.0fÚsÚunknownz`Signal: rate-limit retries exhausted on batch %d/%d (%d attachments lost, server retry_after=%s)FziSignal: rate-limited on batch %d/%d (attempt %d/%d, server retry_after=%s); scheduler will pace the retryz7Signal: send error on batch %d/%d after %d attempts: %szFSignal: transient error on batch %d/%d (attempt %d/%d): %s; will retry)ÚlenÚSIGNAL_RATE_LIMIT_MAX_ATTEMPTSÚrangeÚacquireÚtimeÚ	monotonicÚreport_rpc_durationÚ_is_signal_rate_limit_errorr   Ú_extract_retry_after_secondsÚfeedbackÚloggerr   ÚwarningÚ	ExceptionÚstr)ÚpostÚ	schedulerÚrlÚidxÚ	n_batchesÚ	att_batchÚbatch_messageÚnÚmax_attemptsÚattemptÚ_rpc_t0ÚdataÚerrÚserver_retry_afterÚretry_after_labelÚes   &&&&&&&         ÚH/home/ubuntu/.hermes/hermes-agent/plugins/platforms/signal/standalone.pyÚ_signal_send_batchr*      s³  é € ô ˜)“n b×&GÑ&G€|Ü˜˜L¨1Õ,×-ˆð	NØ×#Ñ# AÓ&×&Ð&Ü—n’nÓ&ˆGÙ˜iÓ7×7ˆDØ˜dÔ"Ø×3Ñ3´D·N²NÓ4DÀwÕ4NÐPQÓR×RÐRÚØ�w•-ˆCØ×1Ò1°#×6Ò6ÜÐ :¸3À½7¸)À1ÀYÀKÈrÐRUÐQVÐWÓXÒXØ!#×!@Ò!@ÀÓ!EÐØ×ÑÐ1Ô5ß@RÐ#5°cÐ":¸!Ñ <ÐXaÐØÔ&Ü—‘ð 6Ø7:¸QµwÀ	ÐN_ôaâÜ�N‰Nð ;à �7 I¸÷Yó% .â&â7áRøô ô 	NØÔ&Ü—‘ÐVØ  1�W i¼#¸a»&ôBæÜ�N‰NÐcØ �7 I¸ÄcÈ!Ãf÷Nó Nûð	Nüs›   ‚.G,±E4ÁE,Á$E4Á*E/Á+:E4Â%E2Â&E4Â*G,Â- E4ÃE4Ã(G,Ã+AE4ÅG,ÅE4Å%G,Å,E4Å/E4Å2E4Å4G)Å?.G$Æ-G,Æ4)G$ÇG,Ç$G)Ç)G,c              ƒ  óX  aaaaaa"  €  ^ RI o T P                  RR4      P                  R4      T P                  RR4      uooS'       g   RR	/# T;'       g    . p. pT FS  w  rg\        P
                  P                  T4      '       d   TP                  T4       K=  \        P                  R
T4       KU  	  \        P                  p\        ^ \        T4      T4       U	u. uF  q•Y™T,            NK  	  up	;'       g    . .p
\        T
4      \        T4      upw  poTP                  R4      '       d   RTR,          /MRT./oRRRR/TTTTT3R lloT3R lp\        P                   ! 4       p\        P#                  RTP%                  4       \        T4      T4       . p\'        T
4       FÄ  w  pp\        T4      pT^ 8”  d`   TP)                  T4      ;p\        P*                  8¼  d:    S! R\        P,                  ! T4       RT^,            RT R2RRR7      G Rj  x€L
  \1        YÞ\        TTTT^ 8X  d   TMR4      G Rj  x€L
 pTRJ d   TP                  T^,           4       K¼  Tf   KÂ  Tu # 	  . p\        T4      \        T4      8  d   TP                  R4       T'       d8   TP                  R\        T4       RRP3                  R  T 4       4       R!24       T'       d    \        T4      T8X  d   \5        R"T R#24      # \7        R$\9        T4      P                  R4      '       d   R%T4      # TT4      #   \         d    RR/u # i ; iu up	i  EL6  \.         d"   p\        P                  RT4        Rp?EL[Rp?ii ; i ELC  \.         d   p\5        R&T 24      u Rp?# Rp?ii ; i5i)'z¾signal-cli JSON-RPC send; attachments go in SIGNAL_MAX_ATTACHMENTS_PER_MSG batches metered
by the process-wide SignalAttachmentScheduler (shared with the gateway adapter's rate-limit state).Nr   zhttpx not installedÚhttp_urlzhttp://127.0.0.1:8080r   ÚaccountÚ zSignal account not configuredz)Signal media file not found, skipping: %szgroup:ÚgroupId:é   NNÚ	recipientÚattachmentsÚstyledFc             “   ó  <"  € R SRV /SCpV'       dA   V '       d9   S'       d1   \        S4      ^8X  d
   S^ ,          MST\        S4      ^8X  d   RMR&   V'       d   W5R&   RRRRR	VR
V R\        \        P                  ! 4       R,          4       2/pS
P                  VR7      ;_uu_4       GRj  x€L
 pVP	                  S	 R2VR7      G Rj  x€L
 uuRRR4      GRj  x€L
  #  L4 L L	  + GRj  x€L 
 '       g   i     R# ; i5i)r-   ÚmessageÚ	textStyleÚ
textStylesr2   Újsonrpcz2.0ÚmethodÚsendÚparamsÚidÚ_iè  )ÚtimeoutNz/api/v1/rpc)Újson)r   Úintr   ÚAsyncClientr   )ÚtextÚ	id_prefixr>   r2   r3   r;   ÚpayloadÚclientr-   r,   Úhttpxr1   Útext_styless   &$$$$   €€€€€r)   Ú	_rpc_sendÚ_send_signal.<locals>._rpc_sendJ   sÝ   øé € Ø ¨)°TÐG¸YÐGˆFßŸ$§;ä&)¨+Ó&6¸!Ô&;�K –NÀð ¤c¨+Ó&6¸!Ô&;‘{ÀÑNçØ(3�}Ñ%Ø  %¨°6¸8ÀVØ 	˜{¨!¬C´·	²	³¸dÕ0BÓ,CÐ+DÐEðGˆGà×(Ñ(°Ð(×9×9Ô9¸VØ#Ÿ[™[¨H¨:°[Ð)AÈ˜[ÓP×P÷ :×9Ô9ÙP÷ :×9×9Ó9üsp   ƒDœD¤7DÁADÂ0C%Â1DÂ4C+ÃC'ÃC+ÃDÃC)Ã DÃ'C+Ã)DÃ+D	Ã1C4Ã2
D	Ã=D	Ã?	Dc              “   ó´   <"  € S! VR V R\         P                  ! \        V 4      4      R7      G Rj  x€L
 pVP                  4        VP	                  4       #  L$5i)r:   T)rC   r2   r3   r>   N)r   Ú_signal_send_timeoutr   Úraise_for_statusr?   )Úbatch_attachmentsr   ÚresprH   s   && €r)   Ú_postÚ_send_signal.<locals>._postV   sS   øé € Ù" =¸FÐPaÐjnÜ+-×+BÒ+BÄ3ÐGXÓCYÓ+Zô\÷ \ˆDà×!Ñ!Ô#Ø—9‘9“;Ðñ\ùs   ƒ.A±A²%AzIsend_message Signal: scheduler state=%s, %d attachment(s) in %d batch(es)u!   (More images coming â€” pausing ~z for Signal rate limit, batch z.)Únoticeg      >@)rC   r>   z Signal: inline notice failed: %sz1Some media files were skipped (not found on disk)zSignal rate-limited z batch(es) (#z, #c              3   ó8   "  € T F  p\        V4      x € K  	  R # 5i©N)r   )Ú.0Úbs   & r)   Ú	<genexpr>Ú_send_signal.<locals>.<genexpr>s   s   é € Ð+K¹N°q¬C°¯F¨F»Nùs   ‚Ú)zSignal: every batch (z*) hit rate limit; no attachments deliveredÚsignalz	group:***zSignal send failed: )rF   ÚImportErrorÚgetÚrstripÚosÚpathÚexistsÚappendr   r   r   ÚSIGNAL_MAX_ATTACHMENTS_PER_MSGr   r   r   Ú
startswithÚget_schedulerÚinfoÚstateÚ	enumerateÚestimate_waitÚ$SIGNAL_BATCH_PACING_NOTICE_THRESHOLDÚ_format_waitr   r*   Újoinr   r   r   )ÚextraÚchat_idr5   Úmedia_filesÚvalid_mediaÚattachment_pathsÚ
media_pathÚ	_is_voiceÚ	per_batchÚiÚatt_batchesr   Ú
plain_textrO   r   Úfailed_batchesr   r   r    Ú	estimatedÚ_eÚoutcomeÚwarningsr(   rH   r-   r,   rF   r1   rG   s   &&&&                    @@@@@@r)   Ú_send_signalr{   2   s¢  ýé € ð0Ûð@2Ø!ŸI™I jÐ2IÓJ×QÑQÐRUÓVÐX]×XaÑXaÐbkÐmoÓXpÐˆ�'ßØÐ<Ð=Ð=Ø!×'Ð' RˆØÐÛ%0Ñ!ˆJÜ�w‰w�~‰~˜j×)Ò)Ø ×'Ñ'¨
Ö3ä—‘ÐJÈJÖWñ	 &1ô ×5Ñ5ˆ	ÜBGÈÌ3ÐO_ÓK`ÐbkÔBlÓmÑBl¸Q¨¨i­-Ó8ÑBlÑm×uÐuÐrtÐquˆÜ/2°;Ó/?ÔASÐT[ÓA\Ð,ˆ	Ñ,�J Ø07×0BÑ0BÀ8×0LÒ0L�Y ¨¥Ñ,ÐS^ÐahÐ`iÐRjˆ	ð
	QÀTð 
	QÐRW÷ 
	Qó 
	Qõ	ô
 ×$Ò$Ó&ˆ	Ü�‰Ð_Ø—O‘OÓ%¤sÐ+;Ó'<¸iô	Ià$&ˆÜ'¨Ö4‰NˆC�Ü�I“ˆAØ�1Œu y×'>Ñ'>¸qÓ'AÐA˜)Äb×FmÑFmÔmðKÙ#Ð&GÌÏÊÐXaÓHbÐGcð dDØDGÈ!ÅGÀ9ÈAÈiÈ[ÐXZð%\ØgoÐy}ô÷ ð ô /¨uÄÀSÈ)ÐU^Ø=@ÀA¼X©zÈ2óO÷ OˆGà˜%ÓØ×%Ñ% c¨A¥gÖ.ØÔ$Ø’ñ 5ð ˆÜÐÓ ¤3 {Ó#3Ô3Ø�O‰OÐOÔPßØ�O‰OÐ2´3°~Ó3FÐ2Gð H!Ø!&§¡Ñ+K¹NÓ+KÓ!KÐ LÈAðOô Pçœc .Ó1°YÔ>ÜÐ1°)°Ð<fÐgÓhÐhä˜´°W³×1HÑ1HÈ×1RÒ1R +ÐaiÓjÐjÐX_ÐaiÓjÐjøôA ô 0ØÐ.Ð/Ò/ð0üò nò<øä ô KÜ—N‘NÐ#EÀr×JÒJûðKúòOøô  ô 2ÜÐ,¨Q¨CÐ0Ó1Õ1ûð2üsû   ˆN*ŠL5 �?N ÁN*ÁN ÁBN ÃM
Ã1	N Ã;C*N Ç&3MÈMÈMÈ N È>NÈ?%N É)N É,N*É-5N Ê#>N Ë"N Ì N*Ì,N Ì-N*Ì.N Ì4N*Ì5MÍN*ÍMÍN*Í
N ÍMÍM>ÍM9Í3N Í9M>Í>N ÎN'ÎN"ÎN'ÎN*Î"N'Î'N*Ú	thread_idrm   Úforce_documentFc             ƒ  ód   "  € \        \        V RR4      ;'       g    / WVR7      G Rj  x€L
 #  L5i)z‡``standalone_sender_fn``: attachments ride the JSON-RPC ``attachments`` param (thread_id and
force_document have no Signal equivalent).rk   N)rm   )r{   Úgetattr)Úpconfigrl   r5   r|   rm   r}   s   &&&$$$r)   Ústandalone_sendr�   |   s.   é € ô œg g¨w¸Ó=×CÐCÀÀWÐcnÔo×oÐoÑoùs   ‚'0©.ª0rS   )Ú__doc__Úloggingr]   r   Úplugins.platforms.signalr   r   Ú&plugins.platforms.signal.signal_formatr   Útools.send_message_sendersr   r   Ú	getLoggerÚ__name__r   r*   r{   r�   © ó    r)   Ú<module>r‹      s]   ðñ^ó Û 	Û å <Ý Eß 7à	×	Ò	˜8Ó	$€òNôDG2ðTpÀ$ð pÐTXð pÐinö prŠ   