
    Ki1E              !       |   d 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 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dHdee         dee         d	e
e         fdZ dddee         de!d	ee         fdZ"de	eef         d	e	eef         fdZ#	 	 	 	 	 	 	 	 	 	 	 	 	 	 dId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d	ef d#Z%	 	 	 	 	 	 	 dJdededee         dee$         dee         dee         dee         d ee         d"ed	efd$Z&dKde!d"ed	efd%Z'dLded"ed	efd&Z(d'd(d)d*d+d,d*d-d,d*d.d,d*d/d,d*d0d,d1d2d,d*d3d,d*d4d,d*d5d,d*d6d,d7d8d,d*d9d,d:d;d*id<d=d*d>d,d?dgd@dAZ)d	e!fdBZ*dC Z+ddDl,m-Z-  e-j.        d'd'e)dE e*dFG           dS )Mz
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)	
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       0/home/ubuntu/hermes-agent/tools/cronjob_tools.py_scan_cron_promptr5   7   s    % i i6>>h3t99hhhhhhh - H H9Wfbm44 	H Hc  H  H  H  H  H  H	H2    c                      t          j        d          } t          j        d          }| r-|r+| |t          j        d          t          j        d          dS d S )NHERMES_SESSION_PLATFORMHERMES_SESSION_CHAT_IDHERMES_SESSION_CHAT_NAMEHERMES_SESSION_THREAD_ID)platformchat_id	chat_name	thread_id)osgetenv)origin_platformorigin_chat_ids     r4   _origin_from_envrD   B   si    i 9::OY788N 
> 
'%#=>>#=>>	
 
 	
 4r6   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)rE   rH   rI   s      r4   _repeat_displayrO   O   s    WWX$"))'22E""(b--k1==I}yzz"avvU2%.Di!!%!!!u4D4D4DDr6   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)rP   rQ   	raw_items
normalizeditemtexts         r4   _canonical_skillsr\   Y   s    ~$,UGG"			FC	 	  !H		LL	J $ $4:2$$&& 	$D
**d###r6   Fstrip_trailing_slashvaluer^   c                    | d S t          |                                           }|r|                    d          }|pd S )NrM   )rT   rV   rstrip)r_   r^   r[   s      r4   _normalize_optional_job_valuerb   j   sF    }tu::D  {{3<4r6   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          rdnd          d|                      d          d|                      d          iS )Nr&   r*   rP   rQ   job_ididnamer   prompt_previewd   z...modelproviderbase_urlscheduleschedule_displayrG   deliverlocalnext_run_atlast_run_atlast_statusenabledTstate	scheduledpaused	paused_atpaused_reason)rN   r\   lenrO   )rE   r&   rQ   s      r4   _format_jobrz   t   s   WWXr""Fswww//1B1BCCF#d)F 	f.$ 	&	
 	#f++2C2C&#,.. 	!! 	CGGJ'' 	CGGJ'' 	CGG.// 	/#&& 	3779g.. 	sww}-- 	sww}-- 	sww}-- 	3779d++  	D1I1I"W++xXX!" 	SWW[))#$ 	11%  r6   actionrd   rl   rf   rG   rn   include_disabledri   rj   rk   reasontask_idc                 \
   ~	 | pd                                                                 }|dk    r]|st          j        dddd          S t	          ||	          }|s|st          j        dddd          S |r*t          |          }|rt          j        d|dd          S t          |pd||||t                      |t          |
          t          |          t          |d	
          
  
        }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          j        dd| ddd          S t          |          }|st          j        dd| ddd          S |dk    rot          |          }|st          j        dd | 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    ri }|/t          |          }|rt          j        d|dd          S ||d+<   |||d<   |||d<   |	|$t	          ||	          }||d<   |r|d,         nd*|d<   |
t          |
          |d-<   |t          |          |d.<   |t          |d	
          |d/<   |8|d,k    rd*n|}t'          |	                    d0          pi           }||d1<   ||d0<   |Pt)          |          }||d2<   |	                    d3|          |d<   |	                    d4          d5k    r
d6|d4<   d	|d7<   |st          j        dd8dd          S t+          ||          }t          j        d	t          |          d&d          S t          j        dd9|  ddd          S # t,          $ r0}t          j        dt/          |          dd          cY d*}~S d*}~ww xY w):z!Unified cron job management tool.r*   createFzschedule is required for create)successerror   )indentz3create requires either prompt or at least one skillTr]   )
r&   rl   rf   rG   rn   originrQ   ri   rj   rk   re   rf   rP   rQ   rm   rn   ro   rp   z
Cron job 'z
' created.)r   rd   rf   rP   rQ   rl   rG   rn   rp   rE   messagerU   c                 ,    g | ]}t          |          S  )rz   ).0rE   s     r4   
<listcomp>zcronjob.<locals>.<listcomp>   s     ]]]K$$]]]r6   )r|   )r   countjobszjob_id is required for action ''zJob with ID 'z8' not found. Use cronjob(action='list') to inspect jobs.removezFailed to remove job 'z
' removed.)re   rf   rl   )r   r   removed_jobpause)r}   )r   rE   resume>   runrun_nowtriggerupdateNr&   r   ri   rj   rk   rG   rH   rl   displayrt   rv   ru   rs   zNo updates provided.zUnknown cron action ')rV   lowerjsondumpsr\   r5   r   rD   rb   rN   rO   rz   r
   ry   r	   r   r   r   r   dictr   r   	ExceptionrT   )r{   rd   r&   rl   rf   rG   rn   r|   rP   rQ   ri   rj   rk   r}   r~   rY   canonical_skills
scan_errorrE   r   removedupdatedupdatesnormalized_repeatrepeat_stateparsed_schedulees                              r4   cronjobr      s   $ 	@Il))++1133
!! lze>_"`"`ijkkkk0?? @"2 @ze>s"t"t}~ Y.v66
 Y:%*&M&MVWXXXX|!'))'3E::6x@@6xVZ[[[  C :#!$iK WWW--!ggh33 #$6 7-c22"wwy'::#&}#5&s++CCKCCC     " ]]	K[0\0\0\]]]D:$TDQQZ[\\\\ 	v:%:i\f:i:i:ijjstuuuufoo 	:!,|F,|,|,|}}   
 !! ((G mze>`W]>`>`>`"a"ajkllll:#CCKCCC$ #F$'GG,>$?$?$ $        v666G:${77K7KLLUVWWWW!! ((G:${77K7KLLUVWWWW666!&))G:${77K7KLLUVWWWW!!&(G!.v66
 Y:%*&M&MVWXXXX$*!"&"%,	"!U%6#4UF#C#C $4!:J#T#3A#6#6PT  #@#G#G #&CH&M&M
##&CHcg&h&h&h
#!,2aKKDDV!#CGGH$5$5$;<<(9W%$0!#"0":":&5
#.=.A.A)X.V.V*+777##x//'2GG$)-GI& aze>T"U"U^_```` 11G:${77K7KLLUVWWWWze6Wf6W6W6WXXabcccc I I Izec!ff==aHHHHHHHHHIs|   A	S1 ,S1 :+S1 &C(S1 AS1 S1 5-S1 #3S1 A S1 <S1 :S1 8S1 	4S1 >DS1 5S1 S1 1
T+;%T& T+&T+c	                 4    t          d| ||||||||
  
        S )Nr   )
r{   r&   rl   rf   rG   rn   ri   rj   rk   r~   r   )	r&   rl   rf   rG   rn   ri   rj   rk   r~   s	            r4   schedule_cronjobr   (  s9        r6   c                 &    t          d| |          S )NrU   )r{   r|   r~   r   )r|   r~   s     r4   list_cronjobsr   A  s    &3CWUUUUr6   c                 &    t          d| |          S )Nr   )r{   rd   r~   r   )rd   r~   s     r4   remove_cronjobr   E  s    (67CCCCr6   r   ub  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.

Jobs run in a fresh session with no current-chat context, so prompts must be self-contained.
If skill or 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/runzFor create: the full self-contained prompt. If skill or 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;  Delivery target: origin, local, telegram, discord, slack, whatsapp, signal, matrix, mattermost, homeassistant, dingtalk, feishu, wecom, email, sms, or platform:chat_id or platform:chat_id:thread_id for Telegram topics. Examples: 'origin', 'local', 'telegram', 'telegram:-1001234567890:17585', 'discord:#engineering'z;Optional per-job model override used when the cron job runszJOptional per-job provider override used when resolving runtime credentialszEOptional per-job base URL override paired with provider/model routingbooleanz'For list: include paused/completed jobszCOptional single skill name to load before executing the cron promptarrayr   zOptional ordered list of skills to load before executing the cron prompt. On update, pass an empty array to clear attached skills.)r   itemsr   zOptional pause reason)r{   rd   r&   rl   rf   rG   rn   ri   rj   rk   r|   rP   rQ   r}   )r   
propertiesrequired)rf   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)boolr@   rA   r   r6   r4   check_cronjob_requirementsr     sJ     
	&'' 	(9-..	(9&''  r6   c                      t           gS )z/Return tool definitions for cronjob management.)CRONJOB_SCHEMAr   r6   r4   get_cronjob_tool_definitionsr     s    r6   )registryc                 |   t          |                     dd          |                     d          |                     d          |                     d          |                     d          |                     d          |                     d          |                     d	d
          |                     d          |                     d          |                     d          |                     d          |                     d          |                     d          |                    d                    S )Nr{   r*   rd   r&   rl   rf   rG   rn   r|   FrP   rQ   ri   rj   rk   r}   r~   )r{   rd   r&   rl   rf   rG   rn   r|   rP   rQ   ri   rj   rk   r}   r~   )r   rN   )argskws     r4   <lambda>r     s    wxx"%%xx!!xx!!*%%XXfxx!!##"4e<<hhwxx!!hhw*%%*%%xx!!y!!      r6   u   ⏰)rf   toolsetschemahandlercheck_fnemoji)NN)NNNNNNFNNNNNNN)NNNNNNN)FN)N)/__doc__r   r@   r.   syspathlibr   typingr   r   r   r   pathinsertrT   __file__parent	cron.jobsr   r	   r
   r   r   r   r   r   r   r-   r+   r5   rD   rO   r\   r   rb   rz   intr   r   r   r   r   r   r   tools.registryr   registerr   r6   r4   <module>r      sz     				 				 



       , , , , , , , , , , , , 33ttH~~,344 5 5 5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
$      c c    
(4S>2 
 
 
 
Ec3h EC E E E E Xc] 8C= TXY\T]    " Y^   # QU bjknbo    T#s(^ S#X    6 ! " !""&"" TI TITISMTI SMTI sm	TI
 3-TI SMTI c]TI TI C=TI T#YTI C=TI smTI smTI SMTI TI  	!TI TI TI TI|  !""  3- SM	
 c] C= sm sm  	   2V VD V3 V# V V V VD D3 D D D D D D
 \   !Y 
 !L 
 !  o 
 !d 
 != 
 "u 
 !  ] 
 !\ 
 !k 
 !f 
 "H! !
 !d 
   (+  d  !6 m:
 :
v J{> >#P PfD       $ # # # # #  	 " (
-     r6   