§
    ‰eîiRc  ã            )       óö  — 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mZ ddlm	Z	m
Z
mZmZmZ ddlmZ  ej        e¦  «        Zej                             d e ee¦  «        j        j        ¦  «        ¦  «         ddlmZmZmZmZmZmZmZm Z m!Z! g d¢Z"h d£Z#d	ed
efd„Z$d
ee
eef                  fd„Z%de
ee	f         d
efd„Z&dOdee         dee	         d
ee         fd„Z'dee
ee	f                  d
e(fd„Z)ddœdee	         de*d
ee         fd„Z+dee         d
ee         fd„Z,de
ee	f         d
e
ee	f         fd„Z-	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dPdedee         d	ee         dee         dee         d ee.         d!ee         d"e*dee         deee                  d#ee         d$ee         d%ee         d&ee         dee         d'eeeee         f                  d(eee                  d)ee         d*ed
ef(d+„Z/d,d-d.d/d0d1œd/d2d1œd/d3d1œd/d4d1œd/d5d1œd6d7d1œd/d8d1œd9d:d/id;d<œd.d=d/d>d1œd/d?d1œd@œd#gdAœd/dB e¦   «         › dC�d1œd9d:d/idDd<œd9d:d/idEd<œd/dFd1œdGœdgdHœdIœZ0d
e*fdJ„Z1ddKl2m3Z3m4Z4  e3j5        d,d,e0dL„ e1dM¬N¦  «         dS )QzÇ
Cron job management tools for Hermes Agent.

Expose a single compressed action-oriented tool to avoid schema/context bloat.
Compatibility wrappers remain for direct Python callers and legacy tests.
é    N)ÚPath)ÚAnyÚDictÚListÚOptionalÚUnion)Údisplay_hermes_home)	Ú
create_jobÚget_jobÚ	list_jobsÚparse_scheduleÚ	pause_jobÚ
remove_jobÚ
resume_jobÚtrigger_jobÚ
update_job)
)zJignore\s+(?:\w+\s+)*(?:previous|all|above|prior)\s+(?:\w+\s+)*instructionsÚprompt_injection)zdo\s+not\s+tell\s+the\s+userÚdeception_hide)zsystem\s+prompt\s+overrideÚsys_prompt_override)z<disregard\s+(your|all|any)\s+(instructions|rules|guidelines)Údisregard_rules)z?curl\s+[^\n]*\$\{?\w*(KEY|TOKEN|SECRET|PASSWORD|CREDENTIAL|API)Ú
exfil_curl)z?wget\s+[^\n]*\$\{?\w*(KEY|TOKEN|SECRET|PASSWORD|CREDENTIAL|API)Ú
exfil_wget)z0cat\s+[^\n]*(\.env|credentials|\.netrc|\.pgpass)Úread_secrets)Úauthorized_keysÚssh_backdoor)z/etc/sudoers|visudoÚsudoers_mod)zrm\s+-rf\s+/Údestructive_root_rm>
   õ   â€‹õ   â€Œõ   â€�õ   â€ªõ   â€«õ   â€¬õ   â€­õ   â€®õ   â� õ   ï»¿ÚpromptÚreturnc                 ó¸   — t           D ]}|| v rdt          |¦  «        d›d�c S Œt          D ]-\  }}t          j        || t          j        ¦  «        rd|› d�c S Œ.dS )zUScan a cron prompt for critical threats. Returns error string if blocked, else empty.z-Blocked: prompt contains invisible unicode U+Ú04Xz (possible injection).z(Blocked: prompt matches threat pattern 'zD'. Cron prompts must not contain injection or exfiltration payloads.Ú )Ú_CRON_INVISIBLE_CHARSÚordÚ_CRON_THREAT_PATTERNSÚreÚsearchÚ
IGNORECASE)r(   ÚcharÚpatternÚpids       ú5/home/div/.hermes/hermes-agent/tools/cronjob_tools.pyÚ_scan_cron_promptr7   <   s¦   € å%ð ið iˆØ�6ˆ>ˆ>ØhÅ3ÀtÁ9Ä9ÐhÐhÐhÐhÐhÐhÐhð å-ð Hð H‰ˆ�ÝŒ9�W˜f¥b¤mÑ4Ô4ð 	Hð H¸cð  Hð  Hð  Hð  Hð  Hð  Hð	Hàˆ2ó    c                  óÂ   — ddl m}   | d¦  «        } | d¦  «        }|r@|r> | d¦  «        pd }|rt                               d|||¦  «         || | d¦  «        pd |dœS d S )	Nr   )Úget_session_envÚHERMES_SESSION_PLATFORMÚHERMES_SESSION_CHAT_IDÚHERMES_SESSION_THREAD_IDz+Cron origin captured thread_id=%s for %s:%sÚHERMES_SESSION_CHAT_NAME)ÚplatformÚchat_idÚ	chat_nameÚ	thread_id)Úgateway.session_contextr:   ÚloggerÚdebug)r:   Úorigin_platformÚorigin_chat_idrB   s       r6   Ú_origin_from_envrH   G   s´   € Ø7Ð7Ð7Ð7Ð7Ð7Ø%�oÐ&?Ñ@Ô@€OØ$�_Ð%=Ñ>Ô>€NØð 
˜>ð 
Ø#�OÐ$>Ñ?Ô?ÐGÀ4ˆ	Øð 	Ý�LŠLØ=Ø˜?¨Nñô ð ð
 (Ø%Ø(˜Ð)CÑDÔDÐLÈØ"ð	
ð 
ð 	
ð ˆ4r8   Újobc                 óð   — |                       d¦  «        pi                       d¦  «        }|                       d¦  «        pi                       dd¦  «        }|€dS |dk    r
|dk    rdndS |r|› d	|› �n|› d
�S )NÚrepeatÚtimesÚ	completedr   Úforeveré   Úoncez1/1ú/z times)Úget)rI   rL   rM   s      r6   Ú_repeat_displayrS   [   s˜   € Ø�WŠW�XÑÔÐ$ "×)Ò)¨'Ñ2Ô2€EØ—’˜Ñ"Ô"Ð( b×-Ò-¨k¸1Ñ=Ô=€IØ€}ØˆyØ�‚z€zØ" aš˜ˆvˆv¨UÐ2Ø%.ÐDˆiÐ!Ð!˜%Ð!Ð!Ð!°uÐ4DÐ4DÐ4DÐDr8   ÚskillÚskillsc                 óô   — |€| r| gng }n(t          |t          ¦  «        r|g}nt          |¦  «        }g }|D ]@}t          |pd¦  «                             ¦   «         }|r||vr|                     |¦  «         ŒA|S )Nr,   )Ú
isinstanceÚstrÚlistÚstripÚappend)rT   rU   Ú	raw_itemsÚ
normalizedÚitemÚtexts         r6   Ú_canonical_skillsr`   e   s›   € Ø€~Ø$Ð,�U�G�G¨"ˆ	ˆ	Ý	�F�CÑ	 Ô	 ð !Ø�Hˆ	ˆ	å˜‘L”Lˆ	à€JØð $ð $ˆÝ�4�:˜2‰Œ×$Ò$Ñ&Ô&ˆØð 	$�D 
Ð*Ð*Ø×Ò˜dÑ#Ô#Ð#øØÐr8   Ú	model_objc                 ó¸  — | rt          | t          ¦  «        sdS |                      d¦  «        pd                     ¦   «         pd}|                      d¦  «        pd                     ¦   «         pd}|rf|sd	 ddlm}  |¦   «         }|                     di ¦  «        }t          |t          ¦  «        r|                     d¦  «        pd}n# t          $ r Y nw xY w||fS )a%  Resolve a model override object into (provider, model) for job storage.

    If provider is omitted, pins the current main provider from config so the
    job doesn't drift when the user later changes their default via hermes model.

    Returns (provider_str_or_none, model_str_or_none).
    ©NNÚmodelr,   NÚproviderr   )Úload_config)rW   ÚdictrR   rZ   Úhermes_cli.configrf   Ú	Exception)ra   Ú
model_nameÚprovider_namerf   ÚcfgÚ	model_cfgs         r6   Ú_resolve_model_overridern   w   s	  € ð ð �J yµ$Ñ7Ô7ð Øˆ|Ø—-’- Ñ(Ô(Ð.¨B×5Ò5Ñ7Ô7Ð?¸4€JØ—]’] :Ñ.Ô.Ð4°"×;Ò;Ñ=Ô=ÐEÀ€MØð 	˜-ð 	ð	Ø5Ð5Ð5Ð5Ð5Ð5Ø�+‘-”-ˆCØŸš ¨Ñ,Ô,ˆIÝ˜)¥TÑ*Ô*ð BØ )§¢¨jÑ 9Ô 9Ð A¸T�øøÝð 	ð 	ð 	ØˆDð	øøøà˜:Ð&Ð&s   Á5AC Ã
CÃCF©Ústrip_trailing_slashÚvaluerp   c                ó‚   — | €d S t          | ¦  «                             ¦   «         }|r|                     d¦  «        }|pd S )NrQ   )rX   rZ   Úrstrip)rq   rp   r_   s      r6   Ú_normalize_optional_job_valuert   �   sF   € Ø€}ØˆtÝˆu‰:Œ:×ÒÑÔ€DØð  Ø�{Š{˜3ÑÔˆØˆ<�4Ðr8   Úscriptc                 ó^  — | r|                       ¦   «         sdS ddlm} |                       ¦   «         }|                     d¦  «        st	          |¦  «        dk    r|d         dk    rd|›d	�S dd
lm}  |¦   «         dz  }|                     dd¬¦  «          |||z  |¦  «        }|rd|›�S dS )a3  Validate a cron job script path at the API boundary.

    Scripts must be relative paths that resolve within HERMES_HOME/scripts/.
    Absolute paths and ~ expansion are rejected to prevent arbitrary script
    execution via prompt injection.

    Returns an error string if blocked, else None (valid).
    Nr   )Úget_hermes_home)rQ   Ú~é   rO   ú:zXScript path must be relative to ~/.hermes/scripts/. Got absolute or home-relative path: z@. Place scripts in ~/.hermes/scripts/ and use just the filename.)Úvalidate_within_dirÚscriptsT)ÚparentsÚexist_okz9Script path escapes the scripts directory via traversal: )rZ   Úhermes_constantsrw   Ú
startswithÚlenÚtools.path_securityr{   Úmkdir)ru   rw   Úrawr{   Úscripts_dirÚcontainment_errors         r6   Ú_validate_cron_script_pathr‡   ™   s  € ð ð ˜Ÿš™œð Øˆtà0Ð0Ð0Ð0Ð0Ð0à
�,Š,‰.Œ.€Cð ‡~‚~�jÑ!Ô!ð 
¥c¨#¡h¤h°!¢m m¸¸A¼À#º¸ðNØ36ðNð Nð Nð	
ð 8Ð7Ð7Ð7Ð7Ð7à!�/Ñ#Ô# iÑ/€KØ×Ò˜d¨TÐÑ2Ô2Ð2Ø+Ð+¨K¸#Ñ,=¸{ÑKÔKÐØð 
àOÈÐOÐOð	
ð ˆ4r8   c           	      ó|  — |                       dd¦  «        }t          |                       d¦  «        |                       d¦  «        ¦  «        }i d| d         “d| d         “d|r|d         nd “d|“d	t          |¦  «        d
k    r|d d
…         dz   n|“d|                       d¦  «        “d|                       d¦  «        “d|                       d¦  «        “d|                       d¦  «        “dt          | ¦  «        “d|                       dd¦  «        “d|                       d¦  «        “d|                       d¦  «        “d|                       d¦  «        “d|                       d¦  «        “d|                       dd¦  «        “d|                       d|                       dd¦  «        rdnd¦  «        “|                       d¦  «        |                       d¦  «        dœ¥}|                       d ¦  «        r| d          |d <   |                       d!¦  «        r| d!         |d!<   |                       d"¦  «        r| d"         |d"<   |S )#Nr(   r,   rT   rU   Újob_idÚidÚnamer   Úprompt_previewéd   z...rd   re   Úbase_urlÚscheduleÚschedule_displayrK   ÚdeliverÚlocalÚnext_run_atÚlast_run_atÚlast_statusÚlast_delivery_errorÚenabledTÚstateÚ	scheduledÚpausedÚ	paused_atÚpaused_reason)r›   rœ   ru   Úenabled_toolsetsÚworkdir)rR   r`   r�   rS   )rI   r(   rU   Úresults       r6   Ú_format_jobr    À   s�  € Ø�WŠW�X˜rÑ"Ô"€FÝ˜sŸwšw wÑ/Ô/°·²¸Ñ1BÔ1BÑCÔC€FðØ�#�d”)ðà��F”ðð 	˜fÐ.�˜”�¨$ðð 	�&ð	ð
 	µ#°f±+´+ÀÒ2CÐ2C˜&  # œ,¨Ñ.Ð.Èðð 	�—’˜Ñ!Ô!ðð 	�C—G’G˜JÑ'Ô'ðð 	�C—G’G˜JÑ'Ô'ðð 	�C—G’GÐ.Ñ/Ô/ðð 	•/ #Ñ&Ô&ðð 	�3—7’7˜9 gÑ.Ô.ðð 	�s—w’w˜}Ñ-Ô-ðð 	�s—w’w˜}Ñ-Ô-ðð 	�s—w’w˜}Ñ-Ô-ðð 	˜sŸwšwÐ'<Ñ=Ô=ðð  	�3—7’7˜9 dÑ+Ô+ð!ð" 	�—’˜°·²¸ÀDÑ1IÔ1IÐ"W + +ÈxÑXÔXð#ð$ —W’W˜[Ñ)Ô)ØŸš Ñ1Ô1ð'ð ð €Fð* ‡w‚wˆxÑÔð )Ø˜xœ=ˆˆxÑØ
‡w‚wÐ!Ñ"Ô"ð =Ø%(Ð);Ô%<ˆÐ!Ñ"Ø
‡w‚wˆyÑÔð +Ø 	œNˆˆyÑØ€Mr8   Úactionr‰   r�   r‹   rK   r‘   Úinclude_disabledrd   re   rŽ   ÚreasonÚcontext_fromr�   rž   Útask_idc                 ó¦  — ~	 | pd                      ¦   «                              ¦   «         }|dk    �rÒ|st          dd¬¦  «        S t          ||	¦  «        }|s|st          dd¬¦  «        S |r"t	          |¦  «        }|rt          |d¬¦  «        S |r"t          |¦  «        }|rt          |d¬¦  «        S |rGddlm} t          |t          ¦  «        r|gn|}|D ]$} ||¦  «        st          d	|› d
�d¬¦  «        c S Œ%t          |pd||||t          ¦   «         |t          |
¦  «        t          |¦  «        t          |d¬¦  «        t          |¦  «        ||pdt          |¦  «        ¬¦  «        }t          j        d|d         |d         |                     d¦  «        |                     dg ¦  «        |d         t!          |¦  «        |                     dd¦  «        |d         t#          |¦  «        d|d         › d�dœd¬¦  «        S |dk    rAd„ t%          |¬¦  «        D ¦   «         }t          j        dt'          |¦  «        |dœd¬¦  «        S |st          d |› d!�d¬¦  «        S t          |¦  «        }|st          j        dd"|› d#�d$œd¬¦  «        S |d%k    rgt)          |¦  «        }|st          d&|› d!�d¬¦  «        S t          j        dd|d         › d'�||d         |                     d¦  «        d(œd)œd¬¦  «        S |d*k    r7t+          ||¬+¦  «        }t          j        dt#          |¦  «        d,œd¬¦  «        S |d-k    r5t-          |¦  «        }t          j        dt#          |¦  «        d,œd¬¦  «        S |d.v r5t/          |¦  «        }t          j        dt#          |¦  «        d,œd¬¦  «        S |d/k    �rTi }|�'t	          |¦  «        }|rt          |d¬¦  «        S ||d0<   |�||d<   |�||d<   |	€|�$t          ||	¦  «        }||d<   |r|d         nd|d<   |
�t          |
¦  «        |d1<   |�t          |¦  «        |d2<   |�t          |d¬¦  «        |d3<   |�:|r"t          |¦  «        }|rt          |d¬¦  «        S |rt          |¦  «        nd|d4<   |�ƒt          |t          ¦  «        r,|                      ¦   «         r|                      ¦   «         gng }nd5„ |D ¦   «         }|r-ddlm} |D ]$} ||¦  «        st          d	|› d
�d¬¦  «        c S Œ%|pd|d6<   |�|pd|d7<   |�t          |¦  «        pd|d8<   |�8|dk    rdn|}t1          |                     d9¦  «        pi ¦  «        } || d:<   | |d9<   |�Pt3          |¦  «        }!|!|d;<   |!                     d<|¦  «        |d<   |                     d=¦  «        d>k    r
d?|d=<   d|d@<   |st          dAd¬¦  «        S t5          ||¦  «        }t          j        dt#          |¦  «        d,œd¬¦  «        S t          dB| › d!�d¬¦  «        S # t6          $ r(}"t          t          |"¦  «        d¬¦  «        cY d}"~"S d}"~"ww xY w)Cz!Unified cron job management tool.r,   Úcreatezschedule is required for createF)Úsuccessz3create requires either prompt or at least one skillr   )r   zcontext_from job 'z>' not found. Use cronjob(action='list') to see available jobs.Tro   N)r(   r�   r‹   rK   r‘   ÚoriginrU   rd   re   rŽ   ru   r¤   r�   rž   rŠ   r‹   rT   rU   r�   r‘   r’   r“   z
Cron job 'z
' created.)r¨   r‰   r‹   rT   rU   r�   rK   r‘   r“   rI   Úmessagery   )ÚindentrY   c                 ó,   — g | ]}t          |¦  «        ‘ŒS © )r    )Ú.0rI   s     r6   ú
<listcomp>zcronjob.<locals>.<listcomp>;  s    € Ð]Ð]Ð]¨•K Ñ$Ô$Ð]Ð]Ð]r8   )r¢   )r¨   ÚcountÚjobszjob_id is required for action 'ú'zJob with ID 'z8' not found. Use cronjob(action='list') to inspect jobs.)r¨   ÚerrorÚremovezFailed to remove job 'z
' removed.)rŠ   r‹   r�   )r¨   rª   Úremoved_jobÚpause)r£   )r¨   rI   Úresume>   ÚrunÚrun_nowÚtriggerÚupdater(   rd   re   rŽ   ru   c                 ó’   — g | ]D}t          |¦  «                             ¦   «         ¯#t          |¦  «                             ¦   «         ‘ŒES r­   )rX   rZ   )r®   Újs     r6   r¯   zcronjob.<locals>.<listcomp>ˆ  s9   € ÐSÐSÐS¨qÅCÈÁFÄFÇLÂLÁNÄNÐS�C ™FœFŸLšL™NœNÐSÐSÐSr8   r¤   r�   rž   rK   rL   r�   Údisplayr˜   rš   r™   r—   zNo updates provided.zUnknown cron action ')rZ   ÚlowerÚ
tool_errorr`   r7   r‡   Ú	cron.jobsr   rW   rX   r
   rH   rt   ÚjsonÚdumpsrR   rS   r    r   r�   r   r   r   r   rg   r   r   ri   )#r¡   r‰   r(   r�   r‹   rK   r‘   r¢   rT   rU   rd   re   rŽ   r£   ru   r¤   r�   rž   r¥   r]   Úcanonical_skillsÚ
scan_errorÚscript_errorÚ_get_jobÚrefsÚref_idrI   r±   ÚremovedÚupdatedÚupdatesÚnormalized_repeatÚrepeat_stateÚparsed_scheduleÚes#                                      r6   ÚcronjobrÑ   á   s¤  € ð, 	ðu1Ø�l ×)Ò)Ñ+Ô+×1Ò1Ñ3Ô3ˆ
à˜Ò!Ñ!Øð TÝ!Ð"CÈUÐSÑSÔSÐSÝ0°¸Ñ?Ô?ÐØð hÐ"2ð hÝ!Ð"WÐafÐgÑgÔgÐgØð AÝ.¨vÑ6Ô6�
Øð AÝ% j¸%Ð@Ñ@Ô@Ð@ð ð CÝ9¸&ÑAÔA�Øð CÝ% l¸EÐBÑBÔBÐBð ð 	Ø9Ð9Ð9Ð9Ð9Ð9Ý)3°LÅ#Ñ)FÔ)FÐX˜�~�~ÈL�Ø"ð ð �FØ#˜8 FÑ+Ô+ð Ý)ðP°ð Pð Pð Pà$)ð ñ  ô  ð ð ð ðõ Ø�| Ø!ØØØÝ'Ñ)Ô)Ø'Ý3°EÑ:Ô:Ý6°xÑ@Ô@Ý6°xÐVZÐ[Ñ[Ô[Ý4°VÑ<Ô<Ø)Ø!1Ð!9°TÝ5°gÑ>Ô>ðñ ô ˆCõ  ”:à#Ø! $œiØ œKØ ŸWšW WÑ-Ô-Ø!Ÿgšg h°Ñ3Ô3Ø #Ð$6Ô 7Ý-¨cÑ2Ô2Ø"Ÿwšw y°'Ñ:Ô:Ø#& }Ô#5Ý& sÑ+Ô+ØC¨C°¬KÐCÐCÐCðð ð ðñ ô ð ð" ˜ÒÐØ]Ð]µ	ÐK[Ð0\Ñ0\Ô0\Ð]Ñ]Ô]ˆDÝ”:¨$½¸T¹¼ÈDÐQÐQÐZ[Ð\Ñ\Ô\Ð\àð 	^ÝÐMÀ
ÐMÐMÐMÐW\Ð]Ñ]Ô]Ð]å�f‰oŒoˆØð 	Ý”:Ø!Ð,|¸FÐ,|Ð,|Ð,|Ð}Ð}Øðñ ô ð ð
 ˜Ò!Ð!Ý  Ñ(Ô(ˆGØð UÝ!Ð"D¸6Ð"DÐ"DÐ"DÈeÐTÑTÔTÐTÝ”:à#ØC¨C°¬KÐCÐCÐCà$Ø # F¤Ø$'§G¢GÐ,>Ñ$?Ô$?ð$ð $ðð ð ðñ ô ð ð ˜Ò Ð Ý ¨vÐ6Ñ6Ô6ˆGÝ”:¨$µ{À7Ñ7KÔ7KÐLÐLÐUVÐWÑWÔWÐWà˜Ò!Ð!Ý  Ñ(Ô(ˆGÝ”:¨$µ{À7Ñ7KÔ7KÐLÐLÐUVÐWÑWÔWÐWàÐ6Ð6Ð6Ý! &Ñ)Ô)ˆGÝ”:¨$µ{À7Ñ7KÔ7KÐLÐLÐUVÐWÑWÔWÐWà˜Ò!Ñ!Ø&(ˆGØÐ!Ý.¨vÑ6Ô6�
Øð AÝ% j¸%Ð@Ñ@Ô@Ð@Ø$*�˜Ñ!ØÐØ"&�˜‘ØÐ"Ø%,�˜	Ñ"ØÐ! UÐ%6Ý#4°U¸FÑ#CÔ#CÐ Ø$4�˜Ñ!Ø:JÐ#TÐ#3°AÔ#6Ð#6ÐPT�˜Ñ ØÐ Ý#@ÀÑ#GÔ#G�˜Ñ ØÐ#Ý&CÀHÑ&MÔ&M�˜
Ñ#ØÐ#Ý&CÀHÐcgÐ&hÑ&hÔ&h�˜
Ñ#ØÐ!àð GÝ#=¸fÑ#EÔ#E�LØ#ð GÝ)¨,ÀÐFÑFÔFÐFØMSÐ$]Õ$AÀ&Ñ$IÔ$IÐ$IÐY]�˜Ñ!ØÐ'õ ˜l­CÑ0Ô0ð TØ5A×5GÒ5GÑ5IÔ5IÐQ˜L×.Ò.Ñ0Ô0Ð1Ð1Èr�D�DàSÐS°LÐSÑSÔS�DØð Ø=Ð=Ð=Ð=Ð=Ð=Ø"&ð ð ˜Ø'˜x¨Ñ/Ô/ð Ý#-ð!T°Vð !Tð !Tð !Tà(-ð$ñ $ô $ð ð ð ðð +/¨,°$�˜Ñ'ØÐ+Ø.>Ð.FÀ$�Ð*Ñ+ØÐ"õ &CÀ7Ñ%KÔ%KÐ%SÈt�˜	Ñ"ØÐ!à,2°aªK¨K D D¸VÐ!Ý# C§G¢G¨HÑ$5Ô$5Ð$;¸Ñ<Ô<�Ø(9�˜WÑ%Ø$0�˜Ñ!ØÐ#Ý"0°Ñ":Ô":�Ø&5�˜
Ñ#Ø.=×.AÒ.AÀ)ÈXÑ.VÔ.V�Ð*Ñ+Ø—7’7˜7Ñ#Ô# xÒ/Ð/Ø'2�G˜GÑ$Ø)-�G˜IÑ&Øð IÝ!Ð"8À%ÐHÑHÔHÐHÝ  ¨Ñ1Ô1ˆGÝ”:¨$µ{À7Ñ7KÔ7KÐLÐLÐUVÐWÑWÔWÐWåÐ;°&Ð;Ð;Ð;ÀUÐKÑKÔKÐKøåð 1ð 1ð 1Ý�#˜a™&œ&¨%Ð0Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0øøøøð1øøøs—   ƒAX Á$X Á*#X Â#X Â2AX Ã:D	X ÈAX ÉX É"-X Ê+X Ê<A X Ë=<X Ì::X Í58X Î.,X ÏBX Ñ:BX ÔCX ×5X Ø	X Ø
YØ(YÙYÙYrÑ   uü  Manage scheduled cron jobs with a single compressed tool.

Use action='create' to schedule a new job from a prompt or one or more skills.
Use action='list' to inspect jobs.
Use action='update', 'pause', 'resume', 'remove', or 'run' to manage an existing job.

To stop a job the user no longer wants: first action='list' to find the job_id, then action='remove' with that job_id. Never guess job IDs â€” always list first.

Jobs run in a fresh session with no current-chat context, so prompts must be self-contained.
If skills are provided on create, the future cron run loads those skills in order, then follows the prompt as the task instruction.
On update, passing skills=[] clears attached skills.

NOTE: The agent's final response is auto-delivered to the target. Put the primary
user-facing content in the final response. Cron jobs run autonomously with no user
present â€” they cannot ask questions or request clarification.

Important safety rule: cron-run sessions should not recursively schedule more cron jobs.ÚobjectÚstringz8One of: create, list, update, pause, resume, remove, run)ÚtypeÚdescriptionz+Required for update/pause/resume/remove/runz„For create: the full self-contained prompt. If skills are also provided, this becomes the task instruction paired with those skills.zCFor create/update: '30m', 'every 2h', '0 9 * * *', or ISO timestampzOptional human-friendly nameÚintegerzTOptional repeat count. Omit for defaults (once for one-shot, forever for recurring).a  Omit this parameter to auto-deliver back to the current chat and topic (recommended). Auto-detection preserves thread/topic context. Only set explicitly when the user asks to deliver somewhere OTHER than the current conversation. Values: 'origin' (same as omitting), 'local' (no delivery, save only), or platform:chat_id:thread_id for a specific destination. Examples: 'telegram:-1001234567890:17585', 'discord:#engineering', 'sms:+15551234567'. WARNING: 'platform:chat_id' without :thread_id loses topic targeting.ÚarrayrÔ   z‡Optional ordered list of skill names to load before executing the cron prompt. On update, pass an empty array to clear attached skills.)rÔ   ÚitemsrÕ   z†Optional per-job model override. If provider is omitted, the current main provider is pinned at creation time so the job stays stable.zYProvider name (e.g. 'openrouter', 'anthropic'). Omit to use and pin the current provider.z@Model name (e.g. 'anthropic/claude-sonnet-4', 'claude-sonnet-4'))re   rd   )rÔ   rÕ   Ú
propertiesÚrequiredzÉOptional path to a Python script that runs before each cron job execution. Its stdout is injected into the prompt as context. Use for data collection and change detection. Relative paths resolve under z1/scripts/. On update, pass empty string to clear.u™  Optional job ID or list of job IDs whose most recent completed output is injected into the prompt as context before each run. Use this to chain cron jobs: job A collects data, job B processes it. Each entry must be a valid job ID (from cronjob action='list'). Note: injects the most recent completed output â€” does not wait for upstream jobs running in the same tick. On update, pass an empty array to clear.uÎ  Optional list of toolset names to restrict the job's agent to (e.g. ["web", "terminal", "file", "delegation"]). When set, only tools from these toolsets are loaded, significantly reducing input token overhead. When omitted, all default tools are loaded. Infer from the job's prompt â€” e.g. use "web" if it calls web_search, "terminal" if it runs scripts, "file" if it reads files, "delegation" if it calls delegate_task. On update, pass an empty array to clear.u1  Optional absolute path to run the job from. When set, AGENTS.md / CLAUDE.md / .cursorrules from that directory are injected into the system prompt, and the terminal/file/code_exec tools use it as their working directory â€” useful for running a job inside a specific project repo. Must be an absolute path that exists. When unset (default), preserves the original behaviour: no project context files, tools use the scheduler's cwd. On update, pass an empty string to clear. Jobs with workdir run sequentially (not parallel) to keep per-job directories isolated.)r¡   r‰   r(   r�   r‹   rK   r‘   rU   rd   ru   r¤   r�   rž   )rÔ   rÙ   rÚ   )r‹   rÕ   Ú
parametersc                  ó”   — t          t          j        d¦  «        p't          j        d¦  «        pt          j        d¦  «        ¦  «        S )zû
    Check if cronjob tools can be used.

    Available in interactive CLI mode and gateway/messaging platforms.
    The cron system is internal (JSON file-based scheduler ticked by the gateway),
    so no external crontab executable is required.
    ÚHERMES_INTERACTIVEÚHERMES_GATEWAY_SESSIONÚHERMES_EXEC_ASK)ÚboolÚosÚgetenvr­   r8   r6   Úcheck_cronjob_requirementsrã     sJ   € õ Ý
Œ	Ð&Ñ'Ô'ð 	(ÝŒ9Ð-Ñ.Ô.ð	(åŒ9Ð&Ñ'Ô'ñô ð r8   )ÚregistryrÀ   c                 óf   ‡ ‡—  t          ‰                      d¦  «        ¦  «        fˆ ˆfd„	¦   «         S )Nrd   c           	      óV  •— t          di d‰                     dd¦  «        “d‰                     d¦  «        “d‰                     d¦  «        “d‰                     d¦  «        “d‰                     d¦  «        “d‰                     d¦  «        “d‰                     d¦  «        “d	‰                     d	d
¦  «        “d‰                     d¦  «        “d‰                     d¦  «        “d| d         “d| d         p‰                     d¦  «        “d‰                     d¦  «        “d‰                     d¦  «        “d‰                     d¦  «        “d‰                     d¦  «        “d‰                     d¦  «        “d‰                     d¦  «        “d‰                     d¦  «        “ŽS )Nr¡   r,   r‰   r(   r�   r‹   rK   r‘   r¢   TrT   rU   rd   rO   re   r   rŽ   r£   ru   r¤   r�   rž   r¥   r­   )rÑ   rR   )Ú_moÚargsÚkws    €€r6   ú<lambda>z<lambda>.<locals>.<lambda>.  s  ø€ ÕW^ð Xð Xð XØ�xŠx˜ "Ñ%Ô%Ð%ðXà�xŠx˜Ñ!Ô!Ð!ðXð �xŠx˜Ñ!Ô!Ð!ðXð —’˜*Ñ%Ô%Ð%ð	Xð
 �XŠX�fÑÔÐðXð �xŠx˜Ñ!Ô!Ð!ðXð —’˜Ñ#Ô#Ð#ðXð ŸšÐ"4°dÑ;Ô;Ð;ðXð �hŠh�wÑÔÐðXð �xŠx˜Ñ!Ô!Ð!ðXð �!ŒfˆfðXð �Q”Ð/˜4Ÿ8š8 JÑ/Ô/øðXð —’˜*Ñ%Ô%Ð%ðXð �xŠx˜Ñ!Ô!Ð!ðXð �xŠx˜Ñ!Ô!Ð!ðXð  —X’X˜nÑ-Ô-Ð-ð!Xð" ŸšÐ"4Ñ5Ô5Ð5ð#Xð$ —’˜Ñ#Ô#Ð#ð%Xð& —’�yÑ!Ô!Ð!ð'X€ r8   )rn   rR   )rè   ré   s   ``r6   rê   rê   .  sJ   øø€ ð !Õ+BÀ4Ç8Â8ÈGÑCTÔCTÑ+UÔ+Uð !ð !ð !ð !ð !ð !ñ  	ô  	€ r8   u   â�°)r‹   ÚtoolsetÚschemaÚhandlerÚcheck_fnÚemojirc   )NNNNNNFNNNNNNNNNNN)6Ú__doc__rÂ   Úloggingrá   r0   ÚsysÚpathlibr   Útypingr   r   r   r   r   r   r	   Ú	getLoggerÚ__name__rD   ÚpathÚinsertrX   Ú__file__ÚparentrÁ   r
   r   r   r   r   r   r   r   r   r/   r-   r7   rH   rS   r`   Útuplern   rà   rt   r‡   r    ÚintrÑ   ÚCRONJOB_SCHEMArã   Útools.registryrä   rÀ   Úregisterr­   r8   r6   ú<module>r      s§  ððð ð €€€Ø €€€Ø 	€	€	€	Ø 	€	€	€	Ø 
€
€
€
Ø Ð Ð Ð Ð Ð Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3à 0Ð 0Ð 0Ð 0Ð 0Ð 0à	ˆÔ	˜8Ñ	$Ô	$€ð „‡‚��3�3�t�t˜H‘~”~Ô,Ô3Ñ4Ô4Ñ 5Ô 5Ð 5ð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð$ð ð Ð ðð ð Ð ð˜cð  cð ð ð ð ð˜( 4¨¨S¨¤>Ô2ð ð ð ð ð(E˜˜c 3˜hœð E¨Cð Eð Eð Eð Eðð ˜X cœ]ð ¸8ÀC¼=ð ÐTXÐY\ÔT]ð ð ð ð ð$' x°°S¸#°X´Ô'?ð 'ÀEð 'ð 'ð 'ð 'ð2 Y^ð ð ð ¨°#¬ð ÐQUð ÐbjÐknÔboð ð ð ð ð$ x°¤}ð $¸À#¼ð $ð $ð $ð $ðN�T˜#˜s˜(”^ð ¨¨S°#¨X¬ð ð ð ð ðF !Ø Ø"ØØ Ø!Ø"ØØ"&ØØ"Ø"Ø Ø Ø48Ø,0Ø!Øð'M1ð M1ØðM1à�SŒMðM1ð �SŒMðM1ð �sŒmð	M1ð
 �3Œ-ðM1ð �SŒMðM1ð �cŒ]ðM1ð ðM1ð �CŒ=ðM1ð �T˜#”YÔðM1ð �CŒ=ðM1ð �sŒmðM1ð �sŒmðM1ð �SŒMðM1ð �SŒMðM1ð  ˜5  d¨3¤i Ô0Ô1ð!M1ð" ˜t CœyÔ)ð#M1ð$ �cŒ]ð%M1ð& ð'M1ð( 	ð)M1ð M1ð M1ð M1ðd ð\ð$ ð !ØYðð ð
 !ØLðð ð
 !ð  fðð ð
 !Ødðð ð
 !Ø=ðð ð
 "Øuðð ð
 !ð  eðð ð
  Ø  (Ð+ð  iðð ð !ð  hð !)ð (Cð!ð !ð
 !)Ø'iðð ð	ð 	ð %˜Iðð ð  !ð  tð  lð  lñ  lAô  lAð   tð   tð   tðð ð
  Ø  (Ð+ð?ð	ð ð  Ø  (Ð+ð  @ð!ð !ð !ð  S	ðð ðOK
ð K
ðX �Jð]Oð Oð'cð c€ðL Dð ð ð ð ð  0Ð /Ð /Ð /Ð /Ð /Ð /Ð /à €Ô Ø	ØØð	ð 	ð* (Ø
ð5ñ ô ð ð ð r8   