§
    ‰eîiÛÖ  ã                   óø  — d Z ddlZddlZddlZddlZddlZddlZddlZddl	Z		 ddl
Z
n # e$ r dZ
	 ddlZn# e$ r dZY nw xY wY nw xY wddlmZ ddlmZmZ e	j                             d e ee¦  «        j        j        ¦  «        ¦  «         ddlmZ ddlmZ ddlmZ  ej        e¦  «        Z de!d	e!d
e"e         dz  fd„Z# e$h d£¦  «        Z%dddddddddddddddœZ&ddiZ'ddl(m)Z)m*Z*m+Z+m,Z, dZ- e¦   «         Z.e.dz  Z/e/d z  Z0de!d
ee!         fd!„Z1d"ed
efd#„Z2de!d$ed
ee!         fd%„Z3de!d
ee!         fd&„Z4de!d
ee!         fd'„Z5 e$h d(£¦  «        Z6 e$h d)£¦  «        Z7 e$h d*£¦  «        Z8d+ed,e"d-e!dz  de!d
df
d.„Z9d?de!d/ed
ee         fd0„Z:d1Z;e;Z<d
e=fd2„Z>d3ed
e?e@ef         fd4„ZAd5ed
e@fd6„ZBd@de!d7ee?         d
efd8„ZCde!d
e?e@eeee         f         fd9„ZDdAd;e@d
e=fd<„ZEed=k    r eEd:¬>¦  «         dS dS )Ba  
Cron job scheduler - executes due jobs.

Provides tick() which checks for due jobs and runs them. The gateway
calls this every 60 seconds from a background thread.

Uses a file-based lock (~/.hermes/cron/.tick.lock) so only one tick
runs at a time if multiple processes overlap.
é    N©ÚPath)ÚListÚOptional©Úget_hermes_home)Úload_config)ÚnowÚjobÚcfgÚreturnc                 óÞ   — |                       d¦  «        }|r|S 	 ddlm} t           ||pi d¦  «        ¦  «        S # t          $ r&}t
                               d|¦  «         Y d}~dS d}~ww xY w)u>  Resolve the toolset list for a cron job.

    Precedence:
    1. Per-job ``enabled_toolsets`` (set via ``cronjob`` tool on create/update).
       Keeps the agent's job-scoped toolset override intact â€” #6130.
    2. Per-platform ``hermes tools`` config for the ``cron`` platform.
       Mirrors gateway behavior (``_get_platform_tools(cfg, platform_key)``)
       so users can gate cron toolsets globally without recreating every job.
    3. ``None`` on any lookup failure â€” AIAgent loads the full default set
       (legacy behavior before this change, preserved as the safety net).

    _DEFAULT_OFF_TOOLSETS ({moa, homeassistant, rl}) are removed by
    ``_get_platform_tools`` for unconfigured platforms, so fresh installs
    get cron WITHOUT ``moa`` by default (issue reported by Norbert â€”
    surprise $4.63 run).
    Úenabled_toolsetsr   )Ú_get_platform_toolsÚcronzHCron toolset resolution failed, falling back to full default toolset: %sN)ÚgetÚhermes_cli.tools_configr   ÚsortedÚ	ExceptionÚloggerÚwarning)r   r   Úper_jobr   Úexcs        ú0/home/div/.hermes/hermes-agent/cron/scheduler.pyÚ_resolve_cron_enabled_toolsetsr   ,   s¤   € ð" �gŠgÐ(Ñ)Ô)€GØð ØˆðØ?Ð?Ð?Ð?Ð?Ð?ÝÐ)Ð)¨#¨)°°VÑ<Ô<Ñ=Ô=Ð=øÝð ð ð Ý�ŠØVØñ	
ô 	
ð 	
ð ˆtˆtˆtˆtˆtøøøøðøøøs   › < ¼
A,ÁA'Á'A,>   ÚsmsÚemailÚqqbotÚslackÚwecomÚfeishuÚmatrixÚsignalÚweixinÚdiscordÚwebhookÚdingtalkÚtelegramÚwhatsappÚ
mattermostÚbluebubblesÚhomeassistantÚwecom_callbackÚMATRIX_HOME_ROOMÚTELEGRAM_HOME_CHANNELÚDISCORD_HOME_CHANNELÚSLACK_HOME_CHANNELÚSIGNAL_HOME_CHANNELÚMATTERMOST_HOME_CHANNELÚSMS_HOME_CHANNELÚEMAIL_HOME_ADDRESSÚDINGTALK_HOME_CHANNELÚFEISHU_HOME_CHANNELÚWECOM_HOME_CHANNELÚWEIXIN_HOME_CHANNELÚBLUEBUBBLES_HOME_CHANNELÚQQBOT_HOME_CHANNEL)r"   r(   r%   r   r#   r*   r   r   r'   r!   r    r$   r+   r   ÚQQ_HOME_CHANNEL)Úget_due_jobsÚmark_job_runÚsave_job_outputÚadvance_next_runz[SILENT]r   z
.tick.lockc                 ó˜   — |                       d¦  «        }|sdS |                      d¦  «        }|                      d¦  «        }|r|r|S dS )zFExtract origin info from a job, preserving any extra routing metadata.ÚoriginNÚplatformÚchat_id)r   )r   rB   rC   rD   s       r   Ú_resolve_originrE   }   s[   € à�WŠW�XÑÔ€FØð ØˆtØ�zŠz˜*Ñ%Ô%€HØ�jŠj˜Ñ#Ô#€GØð �Gð ØˆØˆ4ó    Úplatform_namec                 óö   — t                                |                      ¦   «         ¦  «        }|sdS t          j        |d¦  «        }|s1t
                               |¦  «        }|rt          j        |d¦  «        }|S )zGReturn the configured home target chat/room ID for a delivery platform.Ú )Ú_HOME_TARGET_ENV_VARSr   ÚlowerÚosÚgetenvÚ_LEGACY_HOME_TARGET_ENV_VARS)rG   Úenv_varÚvalueÚlegacys       r   Ú_get_home_target_chat_idrR   ‰   sx   € å#×'Ò'¨×(;Ò(;Ñ(=Ô(=Ñ>Ô>€GØð ØˆrÝŒI�g˜rÑ"Ô"€EØð *Ý-×1Ò1°'Ñ:Ô:ˆØð 	*Ý”I˜f bÑ)Ô)ˆEØ€LrF   Údeliver_valuec                 ó¢  — t          | ¦  «        }|dk    rdS |dk    r�|r2|d         t          |d         ¦  «        |                     d¦  «        dœS t          D ]_}t	          |¦  «        }|rLt
                               d|                      d	|                      d
d¦  «        ¦  «        |¦  «         ||ddœc S Œ`dS d|v r“|                     dd¦  «        \  }}|                     ¦   «         }ddl	m
}  |||¦  «        \  }}	}
|
r||	}}n|d}}	 ddlm}  |||¦  «        }|r |||¦  «        \  }}	}|r||	}}n|}n# t          $ r Y nw xY w|||dœS |}|rE|                     d¦  «        |k    r,|t          |d         ¦  «        |                     d¦  «        dœS |                     ¦   «         t          vrdS t	          |¦  «        }|sdS ||ddœS )z9Resolve one concrete auto-delivery target for a cron job.ÚlocalNrB   rC   rD   Ú	thread_id)rC   rD   rV   zJJob '%s' has deliver=origin but no origin; falling back to %s home channelÚnameÚidú?ú:é   r   )Ú_parse_target_ref)Úresolve_channel_name)rE   Ústrr   rJ   rR   r   ÚinfoÚsplitrK   Útools.send_message_toolr\   Úgateway.channel_directoryr]   r   Ú_KNOWN_DELIVERY_PLATFORMS)r   rS   rB   rG   rD   ÚrestÚplatform_keyr\   Úparsed_chat_idÚparsed_thread_idÚis_explicitrV   r]   ÚresolvedÚresolved_is_explicits                  r   Ú_resolve_single_delivery_targetrk   –   sÆ  € õ ˜SÑ!Ô!€Fà˜ÒÐØˆtà˜Ò Ð Øð 	à" :Ô.Ý˜v iÔ0Ñ1Ô1Ø#ŸZšZ¨Ñ4Ô4ðð ð õ 3ð 	ð 	ˆMÝ.¨}Ñ=Ô=ˆGØð 
Ý—’Ø`Ø—G’G˜F C§G¢G¨D°#Ñ$6Ô$6Ñ7Ô7Ø!ñô ð ð !.Ø&Ø!%ðð ð ð ð ð
ð ˆtà
ˆmÐÐØ+×1Ò1°#°qÑ9Ô9Ñˆ�tØ$×*Ò*Ñ,Ô,ˆà=Ð=Ð=Ð=Ð=Ð=à8IÐ8IÈ,ÐX\Ñ8]Ô8]Ñ5ˆÐ(¨+Øð 	,Ø!/Ð1A�YˆGˆGà!% t�YˆGð
	ØFÐFÐFÐFÐFÐFØ+Ð+¨L¸'ÑBÔBˆHØð 'ØIZÐIZÐ[gÐiqÑIrÔIrÑF�Ð 0Ð2FØ'ð 'Ø)7Ð9I˜Y�G�Gà&�GøøÝð 	ð 	ð 	ØˆDð	øøøð &ØØ"ð
ð 
ð 	
ð "€MØð 
�&—*’*˜ZÑ(Ô(¨MÒ9Ð9à%Ý˜6 )Ô,Ñ-Ô-ØŸš KÑ0Ô0ð
ð 
ð 	
ð ×ÒÑÔÕ$=Ð=Ð=ØˆtÝ& }Ñ5Ô5€GØð Øˆtð "ØØðð ð s   Ä-D< Ä<
E	ÅE	c                 óÊ  — |                       dd¦  «        }|dk    rg S d„ t          |¦  «                             d¦  «        D ¦   «         }t          ¦   «         }g }|D ]…}t	          | |¦  «        }|rq|d                              ¦   «         t          |d         ¦  «        |                      d¦  «        f}||vr*|                     |¦  «         |                     |¦  «         Œ†|S )z]Resolve all concrete auto-delivery targets for a cron job (supports comma-separated deliver).ÚdeliverrU   c                 ó^   — g | ]*}|                      ¦   «         ¯|                      ¦   «         ‘Œ+S © ©Ústrip)Ú.0Úps     r   ú
<listcomp>z-_resolve_delivery_targets.<locals>.<listcomp>ï   s-   € ÐEÐEÐE˜1¸1¿7º7¹9¼9ÐEˆQ�WŠW‰YŒYÐEÐEÐErF   Ú,rC   rD   rV   )r   r^   r`   Úsetrk   rK   ÚaddÚappend)r   rm   ÚpartsÚseenÚtargetsÚpartÚtargetÚkeys           r   Ú_resolve_delivery_targetsr   ê   sç   € à�gŠg�i Ñ)Ô)€GØ�'ÒÐØˆ	ØEÐE¥ G¡¤× 2Ò 2°3Ñ 7Ô 7ÐEÑEÔE€EÝ‰5Œ5€DØ€GØð 'ð 'ˆÝ0°°dÑ;Ô;ˆØð 	'Ø˜*Ô%×+Ò+Ñ-Ô-­s°6¸)Ô3DÑ/EÔ/EÀvÇzÂzÐR]ÑG^ÔG^Ð_ˆCØ˜$ˆˆØ—’˜‘”�Ø—’˜vÑ&Ô&Ð&øØ€NrF   c                 ó8   — t          | ¦  «        }|r|d         ndS )zAResolve the concrete auto-delivery target for a cron job, if any.r   N)r   )r   r{   s     r   Ú_resolve_delivery_targetr�   ü   s"   € å'¨Ñ,Ô,€GØ Ð*ˆ7�1Œ:ˆ: dÐ*rF   >   ú.m4aú.mp3ú.oggú.wavú.opus>   ú.3gpú.aviú.mkvú.movú.mp4ú.webm>   ú.gifú.jpgú.pngú.jpegú.webprD   Úmedia_filesÚmetadatac                 ó@  — ddl m} |D �]“\  }}	  ||¦  «        j                             ¦   «         }	|	t          v r|                      |||¬¦  «        }
n\|	t          v r|                      |||¬¦  «        }
n:|	t          v r|  	                    |||¬¦  «        }
n|  
                    |||¬¦  «        }
t          j        |
|¦  «        }	 |                     d¬¦  «        }n## t          $ r |                     ¦   «          ‚ w xY w|rQt!          |d	d
¦  «        s@t"                               d|                     dd¦  «        |t!          |dd¦  «        ¦  «         �ŒL# t(          $ r<}t"                               d|                     dd¦  «        ||¦  «         Y d}~�Œ�d}~ww xY wdS )u;  Send extracted MEDIA files as native platform attachments via a live adapter.

    Routes each file to the appropriate adapter method (send_voice, send_image_file,
    send_video, send_document) based on file extension â€” mirroring the routing logic
    in ``BasePlatformAdapter._process_message_background``.
    r   r   )rD   Ú
audio_pathr“   )rD   Ú
video_pathr“   )rD   Ú
image_pathr“   )rD   Ú	file_pathr“   é   ©ÚtimeoutÚsuccessTz&Job '%s': media send failed for %s: %srX   rY   ÚerrorÚunknownz%Job '%s': failed to send media %s: %sN)Úpathlibr   ÚsuffixrK   Ú_AUDIO_EXTSÚ
send_voiceÚ_VIDEO_EXTSÚ
send_videoÚ_IMAGE_EXTSÚsend_image_fileÚsend_documentÚasyncioÚrun_coroutine_threadsafeÚresultÚTimeoutErrorÚcancelÚgetattrr   r   r   r   )ÚadapterrD   r’   r“   Úloopr   r   Ú
media_pathÚ	_is_voiceÚextÚcoroÚfuturerª   Úes                 r   Ú_send_media_via_adapterr¶     sü  € ð ÐÐÐÐÐà!,ð gñ gÑˆ
�Ið	gØ�$�zÑ"Ô"Ô)×/Ò/Ñ1Ô1ˆCØ•kÐ!Ð!Ø×)Ò)°'ÀjÐ[cÐ)ÑdÔd��Ø�Ð#Ð#Ø×)Ò)°'ÀjÐ[cÐ)ÑdÔd��Ø�Ð#Ð#Ø×.Ò.°wÈ:Ð`hÐ.ÑiÔi��à×,Ò,°WÈ
Ð]eÐ,ÑfÔf�åÔ5°d¸DÑAÔAˆFðØŸš¨r˜Ñ2Ô2��øÝð ð ð Ø—’‘”�Øðøøøð ð �g f¨i¸Ñ>Ô>ð Ý—’Ø<Ø—G’G˜D #Ñ&Ô&¨
µG¸FÀGÈYÑ4WÔ4Wñô ð ùøõ ð 	gð 	gð 	gÝ�NŠNÐBÀCÇGÂGÈDÐRUÑDVÔDVÐXbÐdeÑfÔfÐfÐfÐfÐfÐfÑføøøøð	gøøøð/gð gs1   �B5EÃCÃEÃ C=Ã=AEÅ
FÅ1FÆFÚcontentc                 ó†  — t          | ¦  «        }|sY|                      dd¦  «        dk    r=d|                      dd¦  «        › �}t                               d| d         |¦  «         |S dS ddlm} dd	lm}m} i d
|j	        “d|j
        “d|j        “d|j        “d|j        “d|j        “d|j        “d|j        “d|j        “d|j        “d|j        “d|j        “d|j        “d|j        “d|j        “d|j        “d|j        “}	d}
	 t5          ¦   «         }|                     di ¦  «                             dd¦  «        }
n# t6          $ r Y nw xY w|
rB|                      d| d         ¦  «        }|                      dd¦  «        }d |› d!|› d"|› d#|› d$�	}n|}dd%lm} |                     |¦  «        \  }}	  |¦   «         }n@# t6          $ r3}d&|› �}t                               d| d         |¦  «         |cY d}~S d}~ww xY wg }|D �]¥}|d'         }|d(         }|                     d)¦  «        }|                      d*¦  «        pi }|                     d)¦  «        }|r;|s9t                               d+| d         ||                      dd¦  «        |¦  «         n&|r$t                                d,| d         |||¦  «         |	                     | !                    ¦   «         ¦  «        }|s?d-|› d.�}t                               d| d         |¦  «         | "                    |¦  «         �Œ|pi                      |¦  «        }d/}|��j|��g tG          |d0d1„ ¦  «        ¦   «         �rL|rd)|ind}	 | $                    ¦   «         }d} |r°tK          j&        | '                    |||¬2¦  «        |¦  «        }!	 |! (                    d3¬4¦  «        }"n## tR          $ r |! *                    ¦   «          ‚ w xY w|"rHtG          |"d5d¦  «        s7tG          |"d6d7¦  «        }#t                               d8| d         |||#¦  «         d/} | r|rtW          |||||| ¦  «         | r%t           ,                    d9| d         ||¦  «         d}n;# t6          $ r.}t                               d:| d         |||¦  «         Y d}~nd}~ww xY w|�sý|j-                             |¦  «        }$|$r|$j.        s?d;|› d<�}t                               d| d         |¦  «         | "                    |¦  «         �Œ
 |||$||||¬=¦  «        }%	 tK          j/        |%¦  «        }&nö# t`          $ r” |% 1                    ¦   «          td          j3         4                    d>¬?¦  «        5 }'|' 5                    tJ          j/         |||$||||¬=¦  «        ¦  «        }!|! (                    d@¬4¦  «        }&ddd¦  «         n# 1 swxY w Y   Y nYt6          $ rM}dA|› dB|› dC|› �}t                               d| d         |¦  «         | "                    |¦  «         Y d}~�Œd}~ww xY w|&rY|&                     d6¦  «        rDdD|&d6         › �}t                               d| d         |¦  «         | "                    |¦  «         �Œ‚t           ,                    dE| d         ||¦  «         �Œ§|rdF 6                    |¦  «        S dS )Guº  
    Deliver job output to the configured target(s) (origin chat, specific platform, etc.).

    When ``adapters`` and ``loop`` are provided (gateway is running), tries to
    use the live adapter first â€” this supports E2EE rooms (e.g. Matrix) where
    the standalone HTTP path cannot encrypt.  Falls back to standalone send if
    the adapter path fails or is unavailable.

    Returns None on success, or an error string on failure.
    rm   rU   z(no delivery target resolved for deliver=zJob '%s': %srX   Nr   )Ú_send_to_platform)Úload_gateway_configÚPlatformr(   r%   r   r)   r#   r"   r*   r,   r'   r!   r    r-   r$   r   r   r+   r   Tr   Úwrap_responserW   rI   zCronjob Response: z

(job_id: z)
-------------

zI

To stop or manage this job, send me a new message (e.g. "stop reminder z").)ÚBasePlatformAdapterzfailed to load gateway config: rC   rD   rV   rB   zUJob '%s': origin has thread_id=%s but delivery target lost it (deliver=%s, target=%s)z*Job '%s': delivering to %s:%s thread_id=%szunknown platform 'ú'FÚ
is_runningc                  ó   — dS )NFro   ro   rF   r   ú<lambda>z!_deliver_result.<locals>.<lambda>™  s   € Ðdi€ rF   )r“   é<   rš   rœ   r�   rž   zLJob '%s': live adapter send to %s:%s failed (%s), falling back to standalonez-Job '%s': delivered to %s:%s via live adapterzPJob '%s': live adapter delivery to %s:%s failed (%s), falling back to standalonez
platform 'z' not configured/enabled)rV   r’   r[   ©Úmax_workersr™   zdelivery to rZ   z	 failed: zdelivery error: zJob '%s': delivered to %s:%sz; )7r   r   r   r   ra   r¹   Úgateway.configrº   r»   ÚTELEGRAMÚDISCORDÚSLACKÚWHATSAPPÚSIGNALÚMATRIXÚ
MATTERMOSTÚHOMEASSISTANTÚDINGTALKÚFEISHUÚWECOMÚWECOM_CALLBACKÚWEIXINÚEMAILÚSMSÚBLUEBUBBLESÚQQBOTr	   r   Úgateway.platforms.baser½   Úextract_mediar�   ÚdebugrK   rx   r­   rq   r¨   r©   Úsendrª   r«   r¬   r¶   r_   Ú	platformsÚenabledÚrunÚRuntimeErrorÚcloseÚ
concurrentÚfuturesÚThreadPoolExecutorÚsubmitÚjoin)(r   r·   Úadaptersr¯   r{   Úmsgr¹   rº   r»   Úplatform_mapr¼   Úuser_cfgÚ	task_nameÚjob_idÚdelivery_contentr½   r’   Úcleaned_delivery_contentÚconfigrµ   Údelivery_errorsr}   rG   rD   rV   rB   Úorigin_threadrC   Úruntime_adapterÚ	deliveredÚsend_metadataÚtext_to_sendÚ
adapter_okr´   Úsend_resultÚerrÚpconfigr³   rª   Úpools(                                           r   Ú_deliver_resultrù   ,  s#	  € õ (¨Ñ,Ô,€GØð Ø�7Š7�9˜gÑ&Ô&¨'Ò1Ð1ØZ¸S¿WºWÀYÐPWÑ=XÔ=XÐZÐZˆCÝ�NŠN˜>¨3¨t¬9°cÑ:Ô:Ð:ØˆJØˆtà9Ð9Ð9Ð9Ð9Ð9Ø<Ð<Ð<Ð<Ð<Ð<Ð<Ð<ðØ�HÔ%ðà�8Ô#ðð 	�”ðð 	�HÔ%ð	ð
 	�(”/ðð 	�(”/ðð 	�hÔ)ðð 	˜Ô/ðð 	�HÔ%ðð 	�(”/ðð 	�”ðð 	˜(Ô1ðð 	�(”/ðð 	�”ðð 	ˆxŒ|ðð  	�xÔ+ð!ð" 	�”ð#€Lð. €MðÝ‘=”=ˆØ Ÿš V¨RÑ0Ô0×4Ò4°_ÀdÑKÔKˆˆøÝð ð ð Øˆðøøøð ð #Ø—G’G˜F C¨¤IÑ.Ô.ˆ	Ø—’˜˜rÑ"Ô"ˆðg ð gð gØðgð gð ðgð gð Xað	gð gð gð 	Ðð #Ðð ;Ð:Ð:Ð:Ð:Ð:Ø,?×,MÒ,MÐN^Ñ,_Ô,_Ñ)€KÐ)ðØ$Ð$Ñ&Ô&ˆˆøÝð ð ð Ø3°Ð3Ð3ˆÝ�Š�^ S¨¤Y°Ñ4Ô4Ð4Øˆ
ˆ
ˆ
ˆ
ˆ
ˆ
øøøøðøøøð
 €Oàð e[ñ e[ˆØ˜zÔ*ˆØ˜Ô#ˆØ—J’J˜{Ñ+Ô+ˆ	ð —’˜Ñ"Ô"Ð( bˆØŸ
š
 ;Ñ/Ô/ˆØð 
	 ð 
	Ý�NŠNð*à�D”	˜=¨#¯'ª'°)¸WÑ*EÔ*EÀvñô ð ð ð
 ð 	Ý�LŠLØ<Ø�D”	˜=¨'°9ñô ð ð
  ×#Ò# M×$7Ò$7Ñ$9Ô$9Ñ:Ô:ˆØð 	Ø7 }Ð7Ð7Ð7ˆCÝ�NŠN˜>¨3¨t¬9°cÑ:Ô:Ð:Ø×"Ò" 3Ñ'Ô'Ð'Ùð $˜> r×.Ò.¨xÑ8Ô8ˆØˆ	ØÑ&¨4Ñ+;Ð@jÅÈÈlÐ\iÐ\iÑ@jÔ@jÑ@lÔ@lÑ+;Ø8AÐK˜[¨)Ð4Ð4ÀtˆMð!à7×=Ò=Ñ?Ô?�Ø!�
Øð +Ý$Ô=Ø'×,Ò,¨W°lÈ]Ð,Ñ[Ô[Øñô �FðØ&,§m¢m¸B mÑ&?Ô&?˜˜øÝ'ð ð ð ØŸš™œ˜Øðøøøð #ð +­7°;À	È4Ñ+PÔ+Pð +Ý% k°7¸IÑFÔF˜ÝŸšØjØ œI }°g¸sñô ð ð &+˜
ð ð m +ð mÝ+¨O¸WÀkÐS`ÐbfÐhkÑlÔlÐlàð %Ý—K’KÐ OÐQTÐUYÔQZÐ\iÐkrÑsÔsÐsØ $�IøøÝð ð ð Ý—’ØfØ˜”I˜}¨g°qñô ð ð ð ð ð ð øøøøðøøøð ñ !	[ØÔ&×*Ò*¨8Ñ4Ô4ˆGØð  '¤/ð ØJ =ÐJÐJÐJ�Ý—’˜~¨s°4¬y¸#Ñ>Ô>Ð>Ø×&Ò& sÑ+Ô+Ð+Ùð %Ð$ X¨w¸ÐAYÐenð  }Hð  Iñ  Iô  IˆDðÝ œ TÑ*Ô*��øÝð 7ð 7ð 7ð
 —
’
‘”�ÝÔ'×:Ò:ÀqÐ:ÑIÔIð 7ÈTØ!Ÿ[š[­¬Ð6GÐ6GÈÐRYÐ[bÐd|ð  IRð  `kð  7lñ  7lô  7lñ  mô  m�FØ#Ÿ]š]°2˜]Ñ6Ô6�Fð7ð 7ð 7ñ 7ô 7ð 7ð 7ð 7ð 7ð 7ð 7øøøð 7ð 7ð 7ð 7øøõ ð ð ð ØJ ]ÐJÐJ°WÐJÐJÀqÐJÐJ�Ý—’˜^¨S°¬Y¸Ñ<Ô<Ð<Ø×&Ò& sÑ+Ô+Ð+Ø���‘øøøøð	øøøð ð ˜&Ÿ*š* WÑ-Ô-ð Ø:¨°¬Ð:Ð:�Ý—’˜^¨S°¬Y¸Ñ<Ô<Ð<Ø×&Ò& sÑ+Ô+Ð+Ùå�KŠKÐ6¸¸D¼	À=ÐRYÑZÔZÐZùàð *Ø�yŠy˜Ñ)Ô)Ð)Øˆ4s¦   Ä8D? Ä?
EÅEÆ4
F? Æ?
G<Ç	(G7Ç1G<Ç7G<Í%AQ-Î)O Î?Q-Ï  O Ï BQ-Ñ-
R%Ñ7$R Ò R%ÔT4Ô4>X'Õ2AWÖ8X'×W×X'×W×X'×	X'×AX"Ø"X'éx   c                  ó2  — t           t          k    r[	 t          t          t           ¦  «        ¦  «        } | dk    r| S n0# t          $ r# t
                               dt           ¦  «         Y nw xY wt          j        dd¦  «         	                    ¦   «         }|rQ	 t          t          |¦  «        ¦  «        } | dk    r| S n+# t          $ r t
                               d|¦  «         Y nw xY w	 t          ¦   «         pi }t          |t          ¦  «        r|                     di ¦  «        ni }|                     d¦  «        }|�$t          t          |¦  «        ¦  «        } | dk    r| S n2# t          $ r%}t
                               d	|¦  «         Y d}~nd}~ww xY wt          S )
zOResolve cron pre-run script timeout from module/env/config with a safe default.r   z<Invalid patched _SCRIPT_TIMEOUT=%r; using env/config/defaultÚHERMES_CRON_SCRIPT_TIMEOUTrI   z;Invalid HERMES_CRON_SCRIPT_TIMEOUT=%r; using config/defaultr   Úscript_timeout_secondsNz2Failed to load cron script timeout from config: %s)Ú_SCRIPT_TIMEOUTÚ_DEFAULT_SCRIPT_TIMEOUTÚintÚfloatr   r   r   rL   rM   rq   r	   Ú
isinstanceÚdictr   rÙ   )r›   Ú	env_valuer   Úcron_cfgÚ
configuredr   s         r   Ú_get_script_timeoutr  ë  sÏ  € åÕ1Ò1Ð1ð	lÝ�%¥Ñ0Ô0Ñ1Ô1ˆGØ˜Š{ˆ{Ø�ð øåð 	lð 	lð 	lÝ�NŠNÐYÕ[jÑkÔkÐkÐkÐkð	løøøõ ”	Ð6¸Ñ;Ô;×AÒAÑCÔC€IØð eð	eÝ�% 	Ñ*Ô*Ñ+Ô+ˆGØ˜Š{ˆ{Ø�ð øåð 	eð 	eð 	eÝ�NŠNÐXÐZcÑdÔdÐdÐdÐdð	eøøøð	PÝ‰mŒmÐ!˜rˆÝ*4°S½$Ñ*?Ô*?ÐG�3—7’7˜6 2Ñ&Ô&Ð&ÀRˆØ—\’\Ð":Ñ;Ô;ˆ
ØÐ!Ý�% 
Ñ+Ô+Ñ,Ô,ˆGØ˜Š{ˆ{Ø�øøÝð Pð Pð PÝ�ŠÐIÈ3ÑOÔOÐOÐOÐOÐOÐOÐOøøøøðPøøøõ #Ð"s:   ’(< ¼*A)Á(A)Â#B; Â;%C#Ã"C#Ã'A7E  Å 
FÅ*F
Æ
FÚscript_pathc           	      ó¶  — ddl m}  |¦   «         dz  }|                     dd¬¦  «         |                     ¦   «         }t	          | ¦  «                             ¦   «         }|                     ¦   «         r|                     ¦   «         }n||z                       ¦   «         }	 |                     |¦  «         n# t          $ r dd|› d| ›�fcY S w xY w| 	                    ¦   «         sdd	|› �fS | 
                    ¦   «         sdd
|› �fS t          ¦   «         }	 t          j        t          j        t!          |¦  «        gdd|t!          |j        ¦  «        ¬¦  «        }|j        pd                     ¦   «         }|j        pd                     ¦   «         }		 ddlm}
  |
|¦  «        } |
|	¦  «        }	n# t.          $ r Y nw xY w|j        dk    rVd|j        › �g}|	r|                     d|	› �¦  «         |r|                     d|› �¦  «         dd                     |¦  «        fS d|fS # t          j        $ r dd|› d|› �fcY S t.          $ r}dd|› �fcY d}~S d}~ww xY w)u¯  Execute a cron job's data-collection script and capture its output.

    Scripts must reside within HERMES_HOME/scripts/.  Both relative and
    absolute paths are resolved and validated against this directory to
    prevent arbitrary script execution via path traversal or absolute
    path injection.

    Args:
        script_path: Path to a Python script.  Relative paths are resolved
            against HERMES_HOME/scripts/.  Absolute and ~-prefixed paths
            are also validated to ensure they stay within the scripts dir.

    Returns:
        (success, output) â€” on failure *output* contains the error message so the
        LLM can report the problem to the user.
    r   r   ÚscriptsT©ÚparentsÚexist_okFz=Blocked: script path resolves outside the scripts directory (z): zScript not found: zScript path is not a file: )Úcapture_outputÚtextr›   ÚcwdrI   )Úredact_sensitive_textzScript exited with code zstderr:
zstdout:
Ú
zScript timed out after zs: zScript execution failed: N)Úhermes_constantsr   ÚmkdirÚresolver   Ú
expanduserÚis_absoluteÚrelative_toÚ
ValueErrorÚexistsÚis_filer  Ú
subprocessrÝ   ÚsysÚ
executabler^   ÚparentÚstdoutrq   ÚstderrÚagent.redactr  r   Ú
returncoderx   rä   ÚTimeoutExpired)r  r   Úscripts_dirÚscripts_dir_resolvedÚrawÚpathÚscript_timeoutrª   r   r!  r  ry   r   s                r   Ú_run_job_scriptr*    s8  € ð" 1Ð0Ð0Ð0Ð0Ð0à!�/Ñ#Ô# iÑ/€KØ×Ò˜d¨TÐÑ2Ô2Ð2Ø&×.Ò.Ñ0Ô0Ðå
ˆ{Ñ
Ô
×
&Ò
&Ñ
(Ô
(€CØ
‡‚ÑÔð -Ø�{Š{‰}Œ}ˆˆà˜cÑ!×*Ò*Ñ,Ô,ˆð
Ø×ÒÐ-Ñ.Ô.Ð.Ð.øÝð 
ð 
ð 
Øð9Ø$ð9ð 9Ø)4ð9ð 9ð
ð 	
ð 	
ð 	
ð
øøøð �;Š;‰=Œ=ð 2ØÐ1¨4Ð1Ð1Ð1Ð1Ø�<Š<‰>Œ>ð ;ØÐ:°DÐ:Ð:Ð:Ð:å(Ñ*Ô*€Nð 8Ý”ÝŒ^�S ™YœYÐ'ØØØ"Ý�D”KÑ Ô ð
ñ 
ô 
ˆð ”-Ð% 2×,Ò,Ñ.Ô.ˆØ”-Ð% 2×,Ò,Ñ.Ô.ˆð	Ø:Ð:Ð:Ð:Ð:Ð:Ø*Ð*¨6Ñ2Ô2ˆFØ*Ð*¨6Ñ2Ô2ˆFˆFøÝð 	ð 	ð 	ØˆDð	øøøð Ô Ò!Ð!ØC°Ô0AÐCÐCÐDˆEØð 3Ø—’Ð1¨Ð1Ð1Ñ2Ô2Ð2Øð 3Ø—’Ð1¨Ð1Ð1Ñ2Ô2Ð2Ø˜$Ÿ)š) EÑ*Ô*Ð*Ð*à�Vˆ|ÐøåÔ$ð Jð Jð JØÐI°ÐIÐIÀ4ÐIÐIÐIÐIÐIÐIÝð 8ð 8ð 8ØÐ7°#Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7øøøøð8øøøsb   Â!B7 Â7CÃCÄA:H# ÆF. Æ-H# Æ.
F;Æ8H# Æ:F;Æ;A#H# ÈH# È#IÈ>	IÉIÉIÉIÚscript_outputc                 óF  — | sdS d„ |                       ¦   «         D ¦   «         }|sdS |d                              ¦   «         }	 t          j        |¦  «        }n# t          j        t
          f$ r Y dS w xY wt          |t          ¦  «        sdS |                     dd¦  «        duS )u¿  Parse the last non-empty stdout line of a cron job's pre-check script
    as a wake gate.

    The convention (ported from nanoclaw #1232): if the last stdout line is
    JSON like ``{"wakeAgent": false}``, the agent is skipped entirely â€” no
    LLM run, no delivery. Any other output (non-JSON, missing flag, gate
    absent, or ``wakeAgent: true``) means wake the agent normally.

    Returns True if the agent should wake, False to skip.
    Tc                 ó:   — g | ]}|                      ¦   «         ¯|‘ŒS ro   rp   )rr   Úlines     r   rt   z$_parse_wake_gate.<locals>.<listcomp>j  s%   € ÐRÐRÐR˜tÀTÇZÂZÁ\Ä\ÐR�dÐRÐRÐRrF   éÿÿÿÿÚ	wakeAgentF)	Ú
splitlinesrq   ÚjsonÚloadsÚJSONDecodeErrorr  r  r  r   )r+  Ústripped_linesÚ	last_lineÚgates       r   Ú_parse_wake_gater8  ]  sÃ   € ð ð ØˆtØRÐR }×'?Ò'?Ñ'AÔ'AÐRÑRÔR€NØð ØˆtØ˜rÔ"×(Ò(Ñ*Ô*€IðÝŒz˜)Ñ$Ô$ˆˆøÝÔ ¥*Ð-ð ð ð Øˆtˆtðøøøå�d�DÑ!Ô!ð ØˆtØ�8Š8�K Ñ&Ô&¨eÐ3Ð3s   ÁA ÁA1Á0A1Úprerun_scriptc           
      ó,  — |                       dd¦  «        }|                       d¦  «        }|                       d¦  «        }|r5|�|\  }}nt          |¦  «        \  }}|r|r	d|› d|› �}nd|› �}nd	|› d|› �}|                       d
¦  «        }|�r9ddlm} t	          |t
          ¦  «        r|g}|D �]}	|	rt          d„ |	D ¦   «         ¦  «        st                               d|	¦  «         Œ:	 ||	z  }
|
 	                    ¦   «         sŒUt          |
                     d¦  «        d„ d¬¦  «        }|sŒ~|d                              d¬¦  «                             ¦   «         }d}t          |¦  «        |k    r|d|…         dz   }|rd|	› d|› d|› �}nŒÝŒÞ# t          t           f$ r'}t                               d|	|¦  «         Y d}~�Œd}~ww xY wd}||z   }|€|                       d¦  «        }|r|gng }d„ |D ¦   «         }|s|S ddlm} g }g }|D �]}t'          j         ||¦  «        ¦  «        }|                      d¦  «        st|                      d¦  «        pd |› d!�}t                               d"|                       d#|                       d$¦  «        ¦  «        |¦  «         |                     |¦  «         Œ©t          |                      d%¦  «        pd¦  «                             ¦   «         }|r|                     d¦  «         |                     d&|› d'�d|g¦  «         �Œ|rEd(d)                     |¦  «        › d*d)                     |¦  «        › d+�}|                     d|¦  «         |r|                     dd,|› �g¦  «         d-                     |¦  «        S ).aà  Build the effective prompt for a cron job, optionally loading one or more skills first.

    Args:
        job: The cron job dict.
        prerun_script: Optional ``(success, stdout)`` from a script that has
            already been executed by the caller (e.g. for a wake-gate check).
            When provided, the script is not re-executed and the cached
            result is used for prompt injection. When omitted, the script
            (if any) runs inline as before.
    ÚpromptrI   ÚskillsÚscriptNzq## Script Output
The following data was collected by a pre-run script. Use it as context for your analysis.

```
z
```

z3[Script ran successfully but produced no output.]

zQ## Script Error
The data-collection script failed. Report this to the user.

```
Úcontext_fromr   )Ú
OUTPUT_DIRc              3   ó   K  — | ]}|d v V — Œ	dS )Ú0123456789abcdefNro   )rr   Úcs     r   ú	<genexpr>z$_build_job_prompt.<locals>.<genexpr>ª  s(   è è € Ð+[Ð+[È¨AÐ1CÐ,CÐ+[Ð+[Ð+[Ð+[Ð+[Ð+[rF   z(context_from: skipping invalid job_id %rz*.mdc                 ó4   — |                       ¦   «         j        S ©N)ÚstatÚst_mtime)Úfs    r   rÁ   z#_build_job_prompt.<locals>.<lambda>³  s   €  !§&¢&¡(¤(Ô"3€ rF   T)r~   Úreverseúutf-8©Úencodingi@  z

[... output truncated ...]z## Output from job 'zo'
The following is the most recent output from a preceding cron job. Use it as context for your analysis.

```
z2context_from: failed to read output for job %r: %su  [IMPORTANT: You are running as a scheduled cron job. DELIVERY: Your final response will be automatically delivered to the user â€” do NOT use send_message or try to deliver the output yourself. Just produce your report/output as your final response and the system handles the rest. SILENT: If there is genuinely nothing new to report, respond with exactly "[SILENT]" (nothing else) to suppress delivery. Never combine [SILENT] with content â€” either report your findings normally, or say [SILENT] and nothing more.]

Úskillc                 ó’   — g | ]D}t          |¦  «                             ¦   «         ¯#t          |¦  «                             ¦   «         ‘ŒES ro   )r^   rq   )rr   rW   s     r   rt   z%_build_job_prompt.<locals>.<listcomp>Ý  s=   € ÐMÐMÐM¨½3¸t¹9¼9¿?º?Ñ;LÔ;LÐM•3�t‘9”9—?’?Ñ$Ô$ÐMÐMÐMrF   )Ú
skill_viewrœ   r�   zFailed to load skill 'r¾   u/   Cron job '%s': skill not found, skipping â€” %srW   rX   r·   z&[IMPORTANT: The user has invoked the "zf" skill, indicating they want you to follow its instructions. The full skill content is loaded below.]ze[IMPORTANT: The following skill(s) were listed for this job but could not be found and were skipped: z, un   . Start your response with a brief notice so the user is aware, e.g.: 'âš ï¸� Skill(s) not found and skipped: z']zPThe user has provided the following instruction alongside the skill invocation: r  )r   r*  Ú	cron.jobsr?  r  r^   Úallr   r   r  r   ÚglobÚ	read_textrq   ÚlenÚOSErrorÚPermissionErrorÚtools.skills_toolrO  r2  r3  rx   Úextendrä   Úinsert)r   r9  r;  r<  r  rœ   r+  r>  r?  Úsource_job_idÚjob_output_dirÚoutput_filesÚlatest_outputÚ_MAX_CONTEXT_CHARSrµ   Ú	cron_hintrQ   Úskill_namesrO  ry   ÚskippedÚ
skill_nameÚloadedr�   r·   Únotices                             r   Ú_build_job_promptre  w  s  € ð �WŠW�X˜rÑ"Ô"€FØ�WŠW�XÑÔ€Fð —'’'˜(Ñ#Ô#€KØð ØÐ$Ø%2Ñ"ˆG�]�]å%4°[Ñ%AÔ%AÑ"ˆG�]Øð 	Øð ð ð *ð ð  ð ð	 ð  ð �ð Øð ð  ð �ðà%ðð ð ðð ð ð —7’7˜>Ñ*Ô*€LØñ $gØ(Ð(Ð(Ð(Ð(Ð(Ý�l¥CÑ(Ô(ð 	*Ø(˜>ˆLØ)ð  	gñ  	gˆMà ð ­Ð+[Ð+[È]Ð+[Ñ+[Ô+[Ñ([Ô([ð Ý—’ÐIÈ=ÑYÔYÐYØðgØ!+¨mÑ!;�Ø%×,Ò,Ñ.Ô.ð ØÝ%Ø"×'Ò'¨Ñ/Ô/Ø3Ð3Ø ð ñ  ô  �ð
 $ð ØØ ,¨Q¤× 9Ò 9À7Ð 9Ñ KÔ K× QÒ QÑ SÔ S�à%)Ð"Ý�}Ñ%Ô%Ð(:Ò:Ð:Ø$1Ð2EÐ3EÐ2EÔ$FÐIiÑ$i�MØ ð 	ð$¨}ð $ð $ð !.ð$ð $ð "ð	$ð $ð �Fð ð øõ �_Ð-ð gð gð gÝ—’ÐSÐUbÐdeÑfÔfÐfÐfÐfÐfÐfÑføøøøðgøøøð	Dð ð ˜Ñ€FØ€~Ø—’˜Ñ!Ô!ˆØ#Ð+�&��¨ˆàMÐM°ÐMÑMÔM€KØð Øˆà,Ð,Ð,Ð,Ð,Ð,à€EØ€GØ!ð 
ñ 
ˆ
Ý”˜J˜J zÑ2Ô2Ñ3Ô3ˆØ�zŠz˜)Ñ$Ô$ð 	Ø—J’J˜wÑ'Ô'ÐQÐ+QÀJÐ+QÐ+QÐ+QˆEÝ�NŠNÐLÈcÏgÊgÐV\Ð^a×^eÒ^eÐfjÑ^kÔ^kÑNlÔNlÐnsÑtÔtÐtØ�NŠN˜:Ñ&Ô&Ð&Øå�f—j’j Ñ+Ô+Ð1¨rÑ2Ô2×8Ò8Ñ:Ô:ˆØð 	Ø�LŠL˜ÑÔÐØ�Šð l¸ð  lð  lð  lØØðñ	
ô 	
ð 	
ñ 	
ð ð  ðNØ!%§¢¨7Ñ!3Ô!3ðNð Nð 8<·y²yÀÑ7IÔ7IðNð Nð Nð 	ð 	�Š�Q˜ÑÔÐàð xØ�Š�bÐuÐmsÐuÐuÐvÑwÔwÐwØ�9Š9�UÑÔÐs%   Ã+FÄ(FÄ.AFÆGÆGÇGc                 ó´$  — ddl m} d}	 ddlm}  |¦   «         }nG# t          $ r:}t
                               d|                      dd¦  «        |¦  «         Y d}~nd}~ww xY w| d         }| d         }d}|                      d	¦  «        }|rwt          |¦  «        }|\  }	}
|	rat          |
¦  «        sRt
           
                    d
||¦  «         d|› d|› dt          ¦   «                              d¦  «        › d�}d|t          dfS t          | |¬¦  «        }t          | ¦  «        }d|› dt          ¦   «                              d¦  «        › �}t
           
                    d||¦  «         t
           
                    d|dd…         ¦  «         dt           j        d<   ddlm}m}m}  ||r|d         nd|rt-          |d         ¦  «        nd|r|                     dd¦  «        nd¬¦  «        }|                      d ¦  «        pd                     ¦   «         pd}|r?t1          |¦  «                             ¦   «         st
                               d!||¦  «         d}t           j                             d"d#¦  «        }|r+|t           j        d"<   t
           
                    d$||¦  «         	 dd%lm} 	  |t-          t:          d&z  ¦  «        dd'¬(¦  «         n3# t<          $ r&  |t-          t:          d&z  ¦  «        dd)¬(¦  «         Y nw xY wt?          | ¦  «        }|r’|d*                               |d         ¦  «         |d+                               t-          |d         ¦  «        ¦  «         |                     d,¦  «        �.|d-                               t-          |d,         ¦  «        ¦  «         |                      d.¦  «        pt!          j!        d/¦  «        pd}i }	 ddl"}t-          t:          d0z  ¦  «        }t           j#         $                    |¦  «        r¬tK          |¦  «        5 }| &                    |¦  «        pi }ddd¦  «         n# 1 swxY w Y   |                     d.i ¦  «        }|                      d.¦  «        sCtO          |t,          ¦  «        r|}n+tO          |tP          ¦  «        r|                     d1|¦  «        }n3# t          $ r&}t
                               d2||¦  «         Y d}~nd}~ww xY w	 dd3l)m*} |                     d4i ¦  «        }tO          |tP          ¦  «        r!|                     d5¦  «        r |d¬6¦  «         n# t          $ r Y nw xY wdd7l)m+} t-          |                     d8i ¦  «                             d9d¦  «        ¦  «                             ¦   «         }  || ¦  «        }!d}"t!          j!        d:d¦  «        p|                     d;d¦  «        }#|#ràt1          |#¦  «         ,                    ¦   «         }$|$ -                    ¦   «         s
t:          |$z  }$|$ $                    ¦   «         r�	 tK          |$d<d'¬=¦  «        5 }%t]          j/        |%¦  «        }"ddd¦  «         n# 1 swxY w Y   tO          |"t`          ¦  «        sd}"n6# t          $ r)}t
                               d>||$|¦  «         d}"Y d}~nd}~ww xY w|                     d8i ¦  «                             d?¦  «        p|                     d?¦  «        pd@}&|                     dAi ¦  «        }'ddBl1m2}(m3}) ddCl4m5}* 	 dD|                      dE¦  «        pt!          j!        dF¦  «        i}+|                      dG¦  «        r|                      dG¦  «        |+dH<    |(d—i |+¤Ž},�n®# |*$ �r}}-t
                               dI||-¦  «         |                     dJ¦  «        p|                     dK¦  «        }.|.rtO          |.t`          ¦  «        r|.n|.gng }/d},|/D ]ï}0tO          |0tP          ¦  «        sŒ	 dD|0                     dE¦  «        i}1|0                     dG¦  «        r|0dG         |1dH<   |0                     dL¦  «        r|0dL         |1dM<    |(d—i |1¤Ž},t
           
                    dN||,                     dE¦  «        ¦  «          nG# t          $ r:}2t
                               dO||0                     dE¦  «        |2¦  «         Y d}2~2Œèd}2~2ww xY w|,€tm           |)|-¦  «        ¦  «        |-‚Y d}-~-n0d}-~-wt          $ r }3 |)|3¦  «        }4tm          |4¦  «        |3‚d}3~3ww xY w|                     dJ¦  «        p|                     dK¦  «        pd}5d}6t-          |,                     dE¦  «        pd¦  «                             ¦   «          7                    ¦   «         }7|7r™	 ddPl8m9}8  |8|7¦  «        }9|9 :                    ¦   «         r>|9}6t
           
                    dQ||7tw          |9 <                    ¦   «         ¦  «        ¦  «         n4# t          $ r'}t
                               dR||7|¦  «         Y d}~nd}~ww xY w |d—i d.|“dL|,                     dL¦  «        “dG|,                     dG¦  «        “dE|,                     dE¦  «        “dS|,                     dS¦  «        “dT|,                     dU¦  «        “dV|,                     dW¦  «        “dX|&“dY|!“dZ|"“dK|5“d[|6“d\|'                     d]¦  «        “d^|'                     d_¦  «        “d`|'                     da¦  «        “db|'                     dc¦  «        “ddt{          | |¦  «        “deg df¢“dgd“dht}          |¦  «         “did“ddj“dk|“dl|“Ž}:t          t!          j!        dmdn¦  «        ¦  «        };|;dk    r|;nd}<do}=t€          jA         B                    dp¬q¦  «        }>t‡          jD        ¦   «         }?|> E                    |?jF        |:jG        |¦  «        }@dr}A	 |<€|@ H                    ¦   «         }Bn—d}B	 t€          jA         I                    |@h|=¬s¦  «        \  }C}D|Cr|@ H                    ¦   «         }BnXdt}Et•          |:du¦  «        r<	 |: K                    ¦   «         }F|F                     dvdt¦  «        }En# t          $ r Y nw xY w|E|<k    rd}AnŒ”n&# t          $ r |> L                    drd¬w¦  «         ‚ w xY w|> L                    drd¬w¦  «         n# |> L                    drd¬w¦  «         w xY w|A�r"i }Gt•          |:du¦  «        r&	 |: K                    ¦   «         }Gn# t          $ r Y nw xY w|G                     dxdy¦  «        }H|G                     dvd¦  «        }I|G                     dz¦  «        }J|G                     d{d¦  «        }K|G                     dXd¦  «        }Lt
           M                    d|||I|<|H|K|L|Jpd}¦  «         t•          |:d~¦  «        r|: N                    d¦  «         tŸ          d€|› d�t¡          |I¦  «        › d‚t¡          |<¦  «        › dƒ|H› �¦  «        ‚tO          |BtP          ¦  «        s'tm          d„t£          |B¦  «        jR        › d…|B›�¦  «        ‚|B                     d†d¦  «        pd}M|M                     ¦   «         d‡k    rd}M|Mr|Mnd‡}Nd|› d|› dt          ¦   «                              d¦  «        › dˆ|                      d‰dŠ¦  «        › d‹|› dŒ|N› d��}Ot
           
                    dŽ|¦  «         d|O|Mdf|r6|d#k    r!t           j         S                    d"d¦  «         n|t           j        d"<    ||¦  «         |r¢	 | T                    |d�¦  «         n:# t          tª          f$ r&}t
                               d�||¦  «         Y d}~nd}~ww xY w	 | V                    ¦   «          S # t          tª          f$ r&}t
                               d‘||¦  «         Y d}~S d}~ww xY wS # t          $ �r�}t£          |¦  «        jR        › d’t-          |¦  «        › �}Pt
           W                    d“||P¦  «         d|› d”|› dt          ¦   «                              d¦  «        › dˆ|                      d‰dŠ¦  «        › d‹|› d•|P› d–�}Odr|Od|PfcY d}~|r6|d#k    r!t           j         S                    d"d¦  «         n|t           j        d"<    ||¦  «         |r¢	 | T                    |d�¦  «         n:# t          tª          f$ r&}t
                               d�||¦  «         Y d}~nd}~ww xY w	 | V                    ¦   «          S # t          tª          f$ r&}t
                               d‘||¦  «         Y d}~S d}~ww xY wS d}~ww xY w# |r6|d#k    r!t           j         S                    d"d¦  «         n|t           j        d"<    ||¦  «         |r¢	 | T                    |d�¦  «         n:# t          tª          f$ r&}t
                               d�||¦  «         Y d}~nd}~ww xY w	 | V                    ¦   «          w # t          tª          f$ r&}t
                               d‘||¦  «         Y d}~w d}~ww xY ww xY w)˜z�
    Execute a single cron job.
    
    Returns:
        Tuple of (success, full_output_doc, final_response, error_message)
    r   )ÚAIAgentN)Ú	SessionDBz0Job '%s': SQLite session store not available: %srX   rY   rW   r=  z6Job '%s' (ID: %s): wakeAgent=false, skipping agent runz# Cron Job: z

**Job ID:** z
**Run Time:** z%Y-%m-%d %H:%M:%Su<   

Script gate returned `wakeAgent=false` â€” agent skipped.
T)r9  Úcron_Ú_z%Y%m%d_%H%M%SzRunning job '%s' (ID: %s)z
Prompt: %séd   Ú1ÚHERMES_CRON_SESSION)Úset_session_varsÚclear_session_varsÚ_VAR_MAPrC   rI   rD   Ú	chat_name)rC   rD   rq  ÚworkdiruG   Job '%s': configured workdir %r no longer exists â€” running without itÚTERMINAL_CWDÚ_UNSET_zJob '%s': using workdir %s)Úload_dotenvz.envrJ  )ÚoverriderL  zlatin-1Ú!HERMES_CRON_AUTO_DELIVER_PLATFORMÚ HERMES_CRON_AUTO_DELIVER_CHAT_IDrV   Ú"HERMES_CRON_AUTO_DELIVER_THREAD_IDÚmodelÚHERMES_MODELzconfig.yamlÚdefaultz8Job '%s': failed to load config.yaml, using defaults: %s)Úapply_ipv4_preferenceÚnetworkÚ
force_ipv4)Úforce)Úparse_reasoning_effortÚagentÚreasoning_effortÚHERMES_PREFILL_MESSAGES_FILEÚprefill_messages_fileÚrrK  z8Job '%s': failed to parse prefill messages file '%s': %sÚ	max_turnséZ   Úprovider_routing)Úresolve_runtime_providerÚformat_runtime_provider_error)Ú	AuthErrorÚ	requestedÚproviderÚHERMES_INFERENCE_PROVIDERÚbase_urlÚexplicit_base_urlz3Job '%s': primary auth failed (%s), trying fallbackÚfallback_providersÚfallback_modelÚapi_keyÚexplicit_api_keyz!Job '%s': fallback resolved to %sz Job '%s': fallback %s failed: %s)Ú	load_poolz@Job '%s': loaded credential pool for provider %s with %d entriesz3Job '%s': failed to load credential pool for %s: %sÚapi_modeÚacp_commandÚcommandÚacp_argsÚargsÚmax_iterationsÚreasoning_configÚprefill_messagesÚcredential_poolÚproviders_allowedÚonlyÚproviders_ignoredÚignoreÚproviders_orderÚorderÚprovider_sortÚsortr   Údisabled_toolsets)ÚcronjobÚ	messagingÚclarifyÚ
quiet_modeÚskip_context_filesÚskip_memoryr   Ú
session_idÚ
session_dbÚHERMES_CRON_TIMEOUTiX  g      @r[   rÃ   Frš   g        Úget_activity_summaryÚseconds_since_activity)ÚwaitÚcancel_futuresÚlast_activity_descrž   Úcurrent_toolÚapi_call_countz_Job '%s' idle for %.0fs (inactivity limit %.0fs) | last_activity=%s | iteration=%s/%s | tool=%sÚnoneÚ	interruptzCron job timed out (inactivity)z
Cron job 'z' idle for z	s (limit u   s) â€” last activity: z agent.run_conversation returned z instead of dict: Úfinal_responsez(No response generated)z
**Schedule:** Úschedule_displayzN/Az

## Prompt

z

## Response

r  zJob '%s' completed successfullyÚcron_completez#Job '%s': failed to end session: %sz2Job '%s': failed to close SQLite session store: %sz: zJob '%s' failed: %sz (FAILED)

**Job ID:** z

## Error

```
z
```
ro   )XÚ	run_agentrg  Úhermes_staterh  r   r   rÙ   r   r*  r8  r_   Ú_hermes_nowÚstrftimeÚSILENT_MARKERre  rE   rL   ÚenvironÚgateway.session_contextrn  ro  rp  r^   rq   r   Úis_dirr   Údotenvru  Ú_hermes_homeÚUnicodeDecodeErrorr�   rv   rM   Úyamlr(  r  ÚopenÚ	safe_loadr  r  r  r}  r�  r  r  r2  ÚloadÚlistÚhermes_cli.runtime_providerrŠ  r‹  Úhermes_cli.authrŒ  rÞ   rK   Úagent.credential_poolr–  Úhas_credentialsrT  Úentriesr   Úboolr  rà   rá   râ   ÚcontextvarsÚcopy_contextrã   rÝ   Úrun_conversationrª   r´  Úhasattrr²  Úshutdownr�   rº  r«   r   ÚtypeÚ__name__ÚpopÚend_sessionÚKeyboardInterruptrß   Ú	exception)Qr   rg  Ú_session_dbrh  rµ   rê   Újob_namer9  r  Ú_ran_okÚ_script_outputÚ
silent_docr;  rB   Ú_cron_session_idrn  ro  rp  Ú_ctx_tokensÚ_job_workdirÚ_prior_terminal_cwdru  Údelivery_targetrz  Ú_cfgrÉ  Ú	_cfg_pathÚ_fÚ
_model_cfgr}  Ú_net_cfgr�  Úeffortr�  rž  Úprefill_fileÚpfpathÚ_pfrœ  ÚprrŠ  r‹  rŒ  Úruntime_kwargsÚruntimeÚauth_excÚfbÚfb_listÚentryÚ	fb_kwargsÚfb_excr   Úmessager“  rŸ  Úruntime_providerr–  rø   r‚  Ú_cron_timeoutÚ_cron_inactivity_limitÚ_POLL_INTERVALÚ
_cron_poolÚ_cron_contextÚ_cron_futureÚ_inactivity_timeoutrª   Údonerj  Ú
_idle_secsÚ_actÚ	_activityÚ
_last_descÚ	_secs_agoÚ	_cur_toolÚ_iter_nÚ	_iter_maxr»  Úlogged_responseÚoutputÚ	error_msgsQ                                                                                    r   Úrun_jobr    ss  € ð "Ð!Ð!Ð!Ð!Ð!ð €Kð`Ø*Ð*Ð*Ð*Ð*Ð*Ø�i‘k”kˆˆøÝð `ð `ð `Ý�ŠÐGÈÏÊÐQUÐWZÑI[ÔI[Ð]^Ñ_Ô_Ð_Ð_Ð_Ð_Ð_Ð_øøøøð`øøøð �ŒY€FØ�6Œ{€Hð €MØ—'’'˜(Ñ#Ô#€KØð 9Ý'¨Ñ4Ô4ˆØ"/Ñˆ�Øð 	9Õ+¨NÑ;Ô;ð 	9Ý�KŠKØHØ˜&ñô ð ð
N˜xð Nð NØ%ðNð Nå!,¡¤×!7Ò!7Ð8KÑ!LÔ!LðNð Nð Nð ð ˜¥]°DÐ8Ð8å˜s°-Ð@Ñ@Ô@€FÝ˜SÑ!Ô!€FØQ˜vÐQÐQ­©¬×(>Ò(>¸Ñ(OÔ(OÐQÐQÐå
‡K‚KÐ+¨X°vÑ>Ô>Ð>Ý
‡K‚K�˜f T c TœlÑ+Ô+Ð+ð
 ),…B„JÐ$Ñ%ð WÐVÐVÐVÐVÐVÐVÐVÐVÐVà"Ð"Ø'-Ð5�˜
Ô#Ð#°2Ø*0Ð8•�F˜9Ô%Ñ&Ô&Ð&°bØ17Ð?�&—*’*˜[¨"Ñ-Ô-Ð-¸Rðñ ô €Kð  —G’G˜IÑ&Ô&Ð,¨"×3Ò3Ñ5Ô5Ð=¸€LØð �D Ñ.Ô.×5Ò5Ñ7Ô7ð õ 	�ŠØUØ�Lñ	
ô 	
ð 	
ð ˆÝœ*Ÿ.š.¨¸ÑCÔCÐØð HØ%1�Œ
�>Ñ"Ý�ŠÐ0°&¸,ÑGÔGÐGðt^ð 	'Ð&Ð&Ð&Ð&Ð&ð	WØˆK��L¨6Ñ1Ñ2Ô2¸TÈGÐTÑTÔTÐTÐTøÝ!ð 	Wð 	Wð 	WØˆK��L¨6Ñ1Ñ2Ô2¸TÈIÐVÑVÔVÐVÐVÐVð	Wøøøõ 3°3Ñ7Ô7ˆØð 	fØÐ8Ô9×=Ò=¸oÈjÔ>YÑZÔZÐZØÐ7Ô8×<Ò<½SÀÐQZÔA[Ñ=\Ô=\Ñ]Ô]Ð]Ø×"Ò" ;Ñ/Ô/Ð;ØÐ=Ô>×BÒBÅ3ÀÐWbÔGcÑCdÔCdÑeÔeÐeà—’˜Ñ Ô ÐC¥B¤I¨nÑ$=Ô$=ÐCÀˆð ˆð	bØˆKˆKˆKÝ�L¨=Ñ8Ñ9Ô9ˆIÝŒw�~Š~˜iÑ(Ô(ð AÝ˜)‘_”_ð 4¨ØŸ>š>¨"Ñ-Ô-Ð3°�Dð4ð 4ð 4ñ 4ô 4ð 4ð 4ð 4ð 4ð 4ð 4øøøð 4ð 4ð 4ð 4à!ŸXšX g¨rÑ2Ô2�
Ø—w’w˜wÑ'Ô'ð AÝ! *­cÑ2Ô2ð AØ *˜˜Ý# JµÑ5Ô5ð AØ *§¢¨y¸%Ñ @Ô @˜øøÝð 	bð 	bð 	bÝ�NŠNÐUÐW]Ð_`ÑaÔaÐaÐaÐaÐaÐaÐaøøøøð	bøøøð	Ø>Ð>Ð>Ð>Ð>Ð>Ø—x’x 	¨2Ñ.Ô.ˆHÝ˜(¥DÑ)Ô)ð 2¨h¯lªl¸<Ñ.HÔ.Hð 2Ø%Ð%¨DÐ1Ñ1Ô1Ð1øøÝð 	ð 	ð 	ØˆDð	øøøð 	<Ð;Ð;Ð;Ð;Ð;Ý�T—X’X˜g rÑ*Ô*×.Ò.Ð/AÀ2ÑFÔFÑGÔG×MÒMÑOÔOˆØ1Ð1°&Ñ9Ô9Ðð  ÐÝ”yÐ!?ÀÑDÔDÐmÈÏÊÐQhÐjlÑHmÔHmˆØð 	,Ý˜,Ñ'Ô'×2Ò2Ñ4Ô4ˆFØ×%Ò%Ñ'Ô'ð /Ý%¨Ñ.�Ø�}Š}‰Œð ,ð,Ý˜f c°GÐ<Ñ<Ô<ð :ÀÝ+/¬9°S©>¬>Ð(ð:ð :ð :ñ :ô :ð :ð :ð :ð :ð :ð :øøøð :ð :ð :ð :å%Ð&6½Ñ=Ô=ð 0Ø+/Ð(øøÝ ð ,ð ,ð ,Ý—N’NÐ#]Ð_eÐgmÐopÑqÔqÐqØ'+Ð$Ð$Ð$Ð$Ð$Ð$øøøøð,øøøð
 Ÿš '¨2Ñ.Ô.×2Ò2°;Ñ?Ô?Ð^À4Ç8Â8ÈKÑCXÔCXÐ^Ð\^ˆð �XŠXÐ(¨"Ñ-Ô-ˆð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	.Ð-Ð-Ð-Ð-Ð-ð	1à˜SŸWšW ZÑ0Ô0ÐZµB´IÐ>YÑ4ZÔ4ZðˆNð �wŠw�zÑ"Ô"ð JØ69·g²g¸jÑ6IÔ6I�Ð2Ñ3Ø.Ð.Ð@Ð@°Ð@Ð@ˆG‰GøØð 	Zñ 	Zð 	Zå�NŠNÐPÐRXÐZbÑcÔcÐcØ—’Ð.Ñ/Ô/ÐM°4·8²8Ð<LÑ3MÔ3MˆBØ@BÐJ�Z¨­DÑ1Ô1Ð;�r�r¸°t°tÈˆGØˆGØ ð lð l�Ý! %­Ñ.Ô.ð Øð
lØ!,¨e¯iªi¸
Ñ.CÔ.CÐ D�IØ—y’y Ñ,Ô,ð KØ9>¸zÔ9J˜	Ð"5Ñ6Ø—y’y Ñ+Ô+ð IØ8=¸iÔ8H˜	Ð"4Ñ5Ø6Ð6ÐCÐC¸ÐCÐC�GÝ—K’KÐ CÀVÈWÏ[Ê[ÐYcÑMdÔMdÑeÔeÐeØ�EøÝ ð lð lð lÝ—L’LÐ!CÀVÈUÏYÊYÐWaÑMbÔMbÐdjÑkÔkÐkÐkÐkÐkÐkÐkøøøøðløøøàˆÝ"Ð#@Ð#@ÀÑ#JÔ#JÑKÔKÐQYÐYð ˆˆˆˆøøøøåð 	1ð 	1ð 	1Ø3Ð3°CÑ8Ô8ˆGÝ˜wÑ'Ô'¨SÐ0øøøøð	1øøøð ŸšÐ"6Ñ7Ô7Ð]¸4¿8º8ÐDTÑ;UÔ;UÐ]ÐY]ˆØˆÝ˜wŸ{š{¨:Ñ6Ô6Ð<¸"Ñ=Ô=×CÒCÑEÔE×KÒKÑMÔMÐØð 	qðqØ;Ð;Ð;Ð;Ð;Ð;Ø �yÐ!1Ñ2Ô2�Ø×'Ò'Ñ)Ô)ð Ø&*�OÝ—K’KØZØØ(Ý˜DŸLšL™NœNÑ+Ô+ñ	ô ð øøõ ð qð qð qÝ—’ÐRÐTZÐ\lÐnoÑpÔpÐpÐpÐpÐpÐpÐpøøøøðqøøøð �ð 
ð 
ð 
Ø�%ð
à—K’K 	Ñ*Ô*Ð*ð
ð —[’[ Ñ,Ô,Ð,ð
ð —[’[ Ñ,Ô,Ð,ð	
ð
 —[’[ Ñ,Ô,Ð,ð
ð  Ÿš IÑ.Ô.Ð.ð
ð —[’[ Ñ(Ô(Ð(ð
ð *˜>ð
ð .Ð-ð
ð .Ð-ð
ð *˜>ð
ð ,˜Oð
ð !Ÿfšf V™nœn˜nð
ð !Ÿfšf XÑ.Ô.Ð.ð
ð ŸFšF 7™OœO˜Oð
ð  Ÿ&š& ™.œ.˜.ð!
õ" <¸CÀÑFÔFÐFð#
ð$ BÐAÐAÐAð%
ð& �tð'
õ. $(¨Ñ#5Ô#5Ð5Ð5ð/
ð0 ˜ð1
ð2 �Vð3
ð4 (Ð'ð5
ð6 #�{ð7
ˆõL �bœiÐ(=¸sÑCÔCÑDÔDˆØ2?À!Ò2CÐ2C  ÈÐØˆÝÔ'×:Ò:ÀqÐ:ÑIÔIˆ
õ $Ô0Ñ2Ô2ˆØ!×(Ò(¨Ô):¸EÔ<RÐTZÑ[Ô[ˆØ#Ðð	AØ%Ð-à%×,Ò,Ñ.Ô.��à�ðÝ(Ô0×5Ò5Ø%˜°ð 6ñ ô ‘G�D˜!ð ð Ø!-×!4Ò!4Ñ!6Ô!6˜Øà!$�JÝ˜uÐ&<Ñ=Ô=ð !ð!Ø#(×#=Ò#=Ñ#?Ô#?˜DØ)-¯ªÐ2JÈCÑ)PÔ)P˜J˜JøÝ(ð !ð !ð !Ø ˜Dð!øøøà!Ð%;Ò;Ð;Ø.2Ð+Øð#øøõ$ ð 	ð 	ð 	Ø×Ò U¸4ÐÑ@Ô@Ð@Øð	øøøð ×Ò U¸4ÐÑ@Ô@Ð@Ð@øˆJ×Ò U¸4ÐÑ@Ô@Ð@Ð@øøøàñ 	àˆIÝ�uÐ4Ñ5Ô5ð ðØ %× :Ò :Ñ <Ô <�I�IøÝ ð ð ð Ø�Dðøøøà"ŸšÐ';¸YÑGÔGˆJØ!ŸšÐ&>ÀÑBÔBˆIØ!Ÿš nÑ5Ô5ˆIØ—m’mÐ$4°aÑ8Ô8ˆGØ!ŸšÐ&6¸Ñ:Ô:ˆIå�LŠLðAà˜)Ð%;Ø˜G YØÐ#˜Vñô ð õ �u˜kÑ*Ô*ð CØ—’Ð AÑBÔBÐBÝð3˜Xð 3ð 3Ý�y‘>”>ð3ð 3Ý,/Ð0FÑ,GÔ,Gð3ð 3à&0ð3ð 3ñô ð õ ˜&¥$Ñ'Ô'ð 	ÝØfµ4¸±<´<Ô3HÐfÐfÐ\bÐfÐfñô ð ð  ŸšÐ$4°bÑ9Ô9Ð?¸Rˆà×ÒÑ!Ô!Ð%>Ò>Ð>ØˆNð -;ÐY˜.˜.Ð@Yˆð (ð ð àðð õ ‰}Œ}×%Ò%Ð&9Ñ:Ô:ðð ð �wŠwÐ)¨5Ñ1Ô1ð	ð ð ðð ð ðð ð ˆõ 	�ŠÐ5°xÑ@Ô@Ð@Ø�V˜^¨TÐ1ð8 ð 	AØ" iÒ/Ð/Ý”
—’˜~¨tÑ4Ô4Ð4Ð4à-@•”
˜>Ñ*àÐ˜;Ñ'Ô'Ð'Øð 	^ðOØ×'Ò'Ð(8¸/ÑJÔJÐJÐJøÝÕ0Ð1ð Oð Oð OÝ—’ÐBÀFÈAÑNÔNÐNÐNÐNÐNÐNÐNøøøøðOøøøð^Ø×!Ò!Ñ#Ô#Ð#Ð#øÝÕ0Ð1ð ^ð ^ð ^Ý—’ÐQÐSYÐ[\Ñ]Ô]Ð]Ð]Ð]Ð]Ð]Ð]øøøøð^øøøð	^øõC ð ,ñ ,ð ,Ý˜A‘w”wÔ'Ð3Ð3­3¨q©6¬6Ð3Ð3ˆ	Ý×ÒÐ.°¸)ÑDÔDÐDð (ð ð àðð õ ‰}Œ}×%Ò%Ð&9Ñ:Ô:ðð ð �wŠwÐ)¨5Ñ1Ô1ð	ð ð ðð ð ðð ð ˆð  �f˜b )Ð+Ð+Ð+Ð+Ð+Ð+ð ð 	AØ" iÒ/Ð/Ý”
—’˜~¨tÑ4Ô4Ð4Ð4à-@•”
˜>Ñ*àÐ˜;Ñ'Ô'Ð'Øð 	^ðOØ×'Ò'Ð(8¸/ÑJÔJÐJÐJøÝÕ0Ð1ð Oð Oð OÝ—’ÐBÀFÈAÑNÔNÐNÐNÐNÐNÐNÐNøøøøðOøøøð^Ø×!Ò!Ñ#Ô#Ð#Ð#øÝÕ0Ð1ð ^ð ^ð ^Ý—’ÐQÐSYÐ[\Ñ]Ô]Ð]Ð]Ð]Ð]Ð]Ð]øøøøð^øøøð	^øøøøðC,øøøøð4 ð 	AØ" iÒ/Ð/Ý”
—’˜~¨tÑ4Ô4Ð4Ð4à-@•”
˜>Ñ*àÐ˜;Ñ'Ô'Ð'Øð 	^ðOØ×'Ò'Ð(8¸/ÑJÔJÐJÐJøÝÕ0Ð1ð Oð Oð OÝ—’ÐBÀFÈAÑNÔNÐNÐNÐNÐNÐNÐNøøøøðOøøøð^Ø×!Ò!Ñ#Ô#Ð#Ð#øÝÕ0Ð1ð ^ð ^ð ^Ý—’ÐQÐSYÐ[\Ñ]Ô]Ð]Ð]Ð]Ð]Ð]Ð]øøøøð^øøøð	^øøøs   Š ›
A¥0AÁAÊ" Ê)#K Ë Ë-K=Ë: Ë<K=Ë=C ÏA	R8 ÐP>Ð2R8 Ð>QÑR8 ÑQÑA1R8 Ò7 Ò8
S(ÓS#Ó Ó#S(Ó( Ó,AT? Ô> Ô?
UÕ	 ÕUÕC Ø,Z Ø>YÙZ ÙY#Ù#Z Ù&Y#Ù'Z Ú Ú
Z5ÚZ0Ú+ Ú0Z5Ú5A' ÜA ]? Ý= Ý?d*ÞB c=àBbâc=â
câ 0cãc=ãcãc=ã8 ã=d*ä
d%ä%d*ä*A; æ&A#h
 è	 è

h;èh6è1 è6h;è;F1 ï-A(r ñ*r ò r ò
ròr òròr òs ò#r?ò?s ó ós3ó3 ôt! ô  ô!
t.ô+ ô-t.ô.G	 ü=}ý~ý%~þ~þ~$þ$þ5ÿÿAE+ÿ*BAE&ÁA9AE+ÁA:AE. ÁCACÁCADÁC,ADÁDADÁDAD+ÁD+AE"ÁD<AEÁEAE"ÁE&AE+ÁE+AE. ÁE.AAIÁF5AGÁGAIÁGAHÁGAG>ÁG9AIÁG>AHÁHAIÁHAHÁHAIÁHAIÁH-AIÁI	AIÁIAIÁIAITÚverbosec           	      ó
  ‡ ‡‡— t                                dd¬¦  «         d}	 t          t          d¦  «        }t          r-t	          j        |t          j        t          j        z  ¦  «         n9t          r2t          j	        | 
                    ¦   «         t          j        d¦  «         nH# t          t          f$ r4 t                               d¦  «         |�|                     ¦   «          Y dS w xY w	 t#          ¦   «         }‰ rÌ|sÊt                               dt'          ¦   «                              d	¦  «        ¦  «         	 t          r t	          j        |t          j        ¦  «         nRt          rK	 t          j	        | 
                    ¦   «         t          j        d¦  «         n# t          t          f$ r Y nw xY w|                     ¦   «          dS ‰ rHt                               d
t'          ¦   «                              d	¦  «        t/          |¦  «        ¦  «         |D ]}t1          |d         ¦  «         Œd}	 t3          j        dd¦  «                             ¦   «         }|rt9          |¦  «        pd}n1# t:          t<          f$ r t                               d¦  «         Y nw xY w|€u	 tA          ¦   «         pi }tC          |tD          ¦  «        r| #                    di ¦  «        ni  #                    d¦  «        }	|	�t9          |	¦  «        pd}n# tH          $ r Y nw xY w‰ r-t                               dt/          |¦  «        |r|nd¦  «         dtD          dtJ          fˆˆˆ fd„}
d„ |D ¦   «         }d„ |D ¦   «         }g }|D ]>}tM          j'        ¦   «         }| (                    | )                    |
|¦  «        ¦  «         Œ?|r tT          j+         ,                    |¬¦  «        5 }g }|D ]D}tM          j'        ¦   «         }| (                    | -                    |j)        |
|¦  «        ¦  «         ŒE| .                    d„ |D ¦   «         ¦  «         ddd¦  «         n# 1 swxY w Y   t_          |¦  «        t          r t	          j        |t          j        ¦  «         nRt          rK	 t          j	        | 
                    ¦   «         t          j        d¦  «         n# t          t          f$ r Y nw xY w|                     ¦   «          S # t          r t	          j        |t          j        ¦  «         nRt          rK	 t          j	        | 
                    ¦   «         t          j        d¦  «         n# t          t          f$ r Y nw xY w|                     ¦   «          w xY w)u÷  
    Check and run all due jobs.
    
    Uses a file lock so only one tick runs at a time, even if the gateway's
    in-process ticker and a standalone daemon or manual tick overlap.
    
    Args:
        verbose: Whether to print status messages
        adapters: Optional dict mapping Platform â†’ live adapter (from gateway)
        loop: Optional asyncio event loop (from gateway) for live adapter sends
    
    Returns:
        Number of jobs executed (0 if another tick is already running)
    Tr  NÚwr[   u0   Tick skipped â€” another instance holds the lockr   z%s - No jobs duez%H:%M:%Sz%s - %s job(s) duerX   ÚHERMES_CRON_MAX_PARALLELrI   z?Invalid HERMES_CRON_MAX_PARALLEL value; defaulting to unboundedr   Úmax_parallel_jobsz.Running %d job(s) in parallel (max_workers=%s)Ú	unboundedr   r   c                 óv  •— 	 t          | ¦  «        \  }}}}t          | d         |¦  «        }‰rt                               d|¦  «         |r|n!d|                      d| d         ¦  «        › d|› �}t          |¦  «        }|rX|rVt          |                     ¦   «                              ¦   «         v r)t                               d| d         t          ¦  «         d}d}|r]	 t          | |‰‰¬	¦  «        }nH# t          $ r;}	t          |	¦  «        }t                               d
| d         |	¦  «         Y d}	~	nd}	~	ww xY w|r|sd}d}t          | d         |||¬¦  «         dS # t          $ rQ}
t                               d| d         |
¦  «         t          | d         dt          |
¦  «        ¦  «         Y d}
~
dS d}
~
ww xY w)z9Run one due job end-to-end: execute, save, deliver, mark.rX   zOutput saved to: %su   âš ï¸� Cron job 'rW   z
' failed:
u1   Job '%s': agent returned %s â€” skipping deliveryFN)rå   r¯   zDelivery failed for job %s: %szWAgent completed but produced empty response (model error, timeout, or misconfiguration))Údelivery_errorTzError processing job %s: %s)r  r?   r   r_   r   rÓ  rÂ  rq   Úupperrù   r   r^   r�   r>   )r   rœ   r  r»  r�   Úoutput_fileÚdeliver_contentÚshould_deliverr  Úderµ   rå   r¯   r  s              €€€r   Ú_process_jobztick.<locals>._process_jobß  s,  ø€ ð%Ý9@À¹¼Ñ6�˜ °å-¨c°$¬i¸Ñ@Ô@�Øð DÝ—K’KÐ 5°{ÑCÔCÐCð
 5<ð  #D . .ð  BDÐUX×U\ÒU\Ð]cÐehÐimÔenÑUoÔUoð  BDð  BDð  }Bð  BDð  BD�Ý!% oÑ!6Ô!6�Ø!ð + gð +µ-À?×CXÒCXÑCZÔCZ×C`ÒC`ÑCbÔCbÐ2bÐ2bÝ—K’KÐ SÐUXÐY]ÔU^Õ`mÑnÔnÐnØ%*�Nà!%�Ø!ð VðVÝ)8¸¸oÐX`ÐgkÐ)lÑ)lÔ)l˜˜øÝ$ð Vð Vð VÝ),¨R©¬˜ÝŸšÐ%EÀsÈ4ÄyÐRTÑUÔUÐUÐUÐUÐUÐUÐUøøøøðVøøøð ð v >ð vØ#�GØu�Eå˜S œY¨°À~ÐVÑVÔVÐVØ�tøåð ð ð Ý—’Ð:¸CÀ¼IÀqÑIÔIÐIÝ˜S œY¨­s°1©v¬vÑ6Ô6Ð6Ø�u�u�u�u�uøøøøðøøøsC   ƒCE ÃC2 Ã1E Ã2
D7Ã<1D2Ä-E Ä2D7Ä7$E Å
F8Å'AF3Æ3F8c                 ód   — g | ]-}|                      d ¦  «        pd                     ¦   «         ¯+|‘Œ.S ©rr  rI   ©r   rq   ©rr   Újs     r   rt   ztick.<locals>.<listcomp>  s:   € ÐPÐPÐP˜a°·²°iÑ0@Ô0@Ð0FÀB×/MÒ/MÑ/OÔ/OÐP˜ÐPÐPÐPrF   c                 ód   — g | ]-}|                      d ¦  «        pd                     ¦   «         °+|‘Œ.S r   r!  r"  s     r   rt   ztick.<locals>.<listcomp>  s:   € ÐUÐUÐU˜q°Q·U²U¸9Ñ5EÔ5EÐ5KÈ×4RÒ4RÑ4TÔ4TÐU˜ÐUÐUÐUrF   rÃ   c              3   ó>   K  — | ]}|                      ¦   «         V — Œd S rE  )rª   )rr   rH  s     r   rC  ztick.<locals>.<genexpr>  s*   è è € Ð=Ð=¨q §¢¡
¤
Ð=Ð=Ð=Ð=Ð=Ð=rF   )0Ú	_LOCK_DIRr  rÊ  Ú
_LOCK_FILEÚfcntlÚflockÚLOCK_EXÚLOCK_NBÚmsvcrtÚlockingÚfilenoÚLK_NBLCKrU  ÚIOErrorr   rÙ   rß   r=   r_   rÀ  rÁ  ÚLOCK_UNÚLK_UNLCKrT  r@   rL   rM   rq   r   r  Ú	TypeErrorr   r	   r  r  r   r   rÓ  rÔ  rÕ  rx   rÝ   rà   rá   râ   rã   rX  Úsum)r  rå   r¯   Úlock_fdÚdue_jobsr   Ú_max_workersÚ_env_parÚ_ucfgÚ_cfg_parr  Úworkdir_jobsÚparallel_jobsÚ_resultsÚ_ctxÚ
_tick_poolÚ_futuress   ```              r   ÚtickrA  –  sñ  øøø€ õ ‡O‚O˜D¨4€OÑ0Ô0Ð0ð €Gð
Ý•z 3Ñ'Ô'ˆÝð 	AÝŒK˜¥¤µ´Ñ!>Ñ?Ô?Ð?Ð?Ýð 	AÝŒN˜7Ÿ>š>Ñ+Ô+­V¬_¸aÑ@Ô@Ð@øøÝ•WÐð ð ð Ý�ŠÐGÑHÔHÐHØÐØ�MŠM‰OŒOˆOØˆqˆqð	øøøðsÝ‘>”>ˆàð 	˜8ð 	Ý�KŠKÐ*­K©M¬M×,BÒ,BÀ:Ñ,NÔ,NÑOÔOÐOØõN ð 	ÝŒK˜¥¤Ñ/Ô/Ð/Ð/Ýð 	ðÝ”˜wŸ~š~Ñ/Ô/µ´À!ÑDÔDÐDÐDøÝ�WÐ%ð ð ð Ø�ðøøøà�Š‰ŒˆˆˆðY ð 	aÝ�KŠKÐ,­k©m¬m×.DÒ.DÀZÑ.PÔ.PÕRUÐV^ÑR_ÔR_Ñ`Ô`Ð`ð ð 	(ð 	(ˆCÝ˜S œYÑ'Ô'Ð'Ð'ð '+ˆð	^Ý”yÐ!;¸RÑ@Ô@×FÒFÑHÔHˆHØð 5Ý" 8™}œ}Ð4°�øøÝ�IÐ&ð 	^ð 	^ð 	^Ý�NŠNÐ\Ñ]Ô]Ð]Ð]Ð]ð	^øøøàÐðÝ#™œÐ+¨�å-7¸½tÑ-DÔ-DÐL�E—I’I˜f bÑ)Ô)Ð)È"ß’#Ð)Ñ*Ô*ð ð Ð'Ý#& x¡=¤=Ð#8°D�LøøÝð ð ð Ø�ðøøøð ð 	Ý�KŠKØ@Ý�H‘”Ø ,Ð=��°+ñô ð ð'	�dð '	¥tð '	ð '	ð '	ð '	ð '	ð '	ð '	ð '	ðZ QÐP 8ÐPÑPÔPˆØUÐU HÐUÑUÔUˆàˆð  ð 	9ð 	9ˆCÝÔ+Ñ-Ô-ˆDØ�OŠO˜DŸHšH \°3Ñ7Ô7Ñ8Ô8Ð8Ð8ð ð 	>ÝÔ#×6Ò6À<Ð6ÑPÔPð >ÐT^Ø�Ø(ð Tð T�CÝ&Ô3Ñ5Ô5�DØ—O’O J×$5Ò$5°d´hÀÈcÑ$RÔ$RÑSÔSÐSÐSØ—’Ð=Ð=°HÐ=Ñ=Ô=Ñ=Ô=Ð=ð>ð >ð >ñ >ô >ð >ð >ð >ð >ð >ð >øøøð >ð >ð >ð >õ �8‰}Œ}åð 	ÝŒK˜¥¤Ñ/Ô/Ð/Ð/Ýð 	ðÝ”˜wŸ~š~Ñ/Ô/µ´À!ÑDÔDÐDÐDøÝ�WÐ%ð ð ð Ø�ðøøøà�Š‰Œˆˆøõ ð 	ÝŒK˜¥¤Ñ/Ô/Ð/Ð/Ýð 	ðÝ”˜wŸ~š~Ñ/Ô/µ´À!ÑDÔDÐDÐDøÝ�WÐ%ð ð ð Ø�ðøøøà�Š‰ŒˆˆøøøsÞ   £BB& Â&AC+Ã*C+Ã/AS3 Å+2F ÆF2Æ1F2ÇA&S3 È2:I- É,S3 É-+JÊS3 ÊJÊS3 Ê!A#L ÌS3 Ì
LÌS3 ÌLÌCS3 ÏA)QÑ S3 ÑQÑS3 ÑQÑS3 Ò2SÓSÓSÓ3/VÔ#2UÕVÕU*Õ'VÕ)U*Õ*VÚ__main__)r  )NNrE  )TNN)FÚ__doc__r¨   Úconcurrent.futuresrà   rÔ  r2  ÚloggingrL   r  r  r(  ÚImportErrorr,  rŸ   r   Útypingr   r   r(  rY  r^   Ú__file__r  r  r   Úhermes_cli.configr	   Úhermes_timer
   rÀ  Ú	getLoggerrÚ  r   r  rÍ  r   Ú	frozensetrc   rJ   rN   rP  r=   r>   r?   r@   rÂ  rÇ  r&  r'  rE   rR   rk   r   r�   r¡   r£   r¥   r¶   rù   rÿ   rþ   r   r  ÚtuplerÓ  r*  r8  re  r  rA  ro   rF   r   ú<module>rN     sG  ððð ð €€€Ø Ð Ð Ð Ø Ð Ð Ð Ø €€€Ø €€€Ø 	€	€	€	Ø Ð Ð Ð Ø 
€
€
€
ðØ€L€L€L€LøØð ð ð Ø€EðØˆˆˆˆøØð ð ð Øˆˆˆðøøøøøð	øøøð Ð Ð Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !Ð !Ð !ð
 „‡‚��3�3�t�t˜H‘~”~Ô,Ô3Ñ4Ô4Ñ 5Ô 5Ð 5à ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø )Ð )Ð )Ð )Ð )Ð )Ø *Ð *Ð *Ð *Ð *Ð *à	ˆÔ	˜8Ñ	$Ô	$€ð¨ð °4ð ¸DÀ¼IÈÑ<Lð ð ð ð ð@ &˜Ið 'ð 'ð 'ñ ô Ð ð !Ø'Ø%Ø!Ø#Ø+ØØ!Ø'Ø#Ø!Ø#Ø-Ø!ðð Ð ð, Ð+ð Ð ð TÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ Sð
 €ð ˆÑ Ô €ð ˜6Ñ!€	Ø˜Ñ%€
ð	˜ð 	 (¨4¤.ð 	ð 	ð 	ð 	ð
¨Cð 
°Cð 
ð 
ð 
ð 
ðQ¨ð Q¸cð QÀhÈtÄnð Qð Qð Qð Qðh 4ð ¨D°¬Jð ð ð ð ð$+ $ð +¨8°D¬>ð +ð +ð +ð +ð ˆiÐAÐAÐAÑBÔB€ØˆiÐIÐIÐIÑJÔJ€ØˆiÐBÐBÐBÑCÔC€ð!g¨cð !gÀð !gÐPTÐW[ÑP[ð !gÐhlð !gÐquð !gð !gð !gð !gðHwð w˜ð w¨ð wÈ(ÐSVÌ-ð wð wð wð wðt Ð à)€ð#˜Sð #ð #ð #ð #ðBN8 ð N8¨¨t°S¨yÔ)9ð N8ð N8ð N8ð N8ðb4 Cð 4¨Dð 4ð 4ð 4ð 4ð4Lð L˜4ð L°¸´ð LÈ3ð Lð Lð Lð Lð^M^�ð M^˜%  c¨3°¸´Ð =Ô>ð M^ð M^ð M^ð M^ð`Rð R�$ð R¸Cð Rð Rð Rð Rðj ˆzÒÐØ€D�ÐÑÔÐÐÐð Ðs-   ¤) ©A±6µA¶A ½A¿A Á AÁA