
    i(                     l   d Z ddlZddlZddlmZ ddlmZmZmZ  ee	          j
        j
                                        Zej                            d ee                     ddlmZmZ ddeee                  deee                  fdZd	 ZddefdZd Zd Zd Zd ZdedededefdZd ZdS )z
Cron subcommand for hermes CLI.

Handles standalone cron management commands like list, create, edit,
pause/resume/run/remove, status, and tick.
    N)Path)IterableListOptional)Colorscolorskillsreturnc                     || d S | g}nt          |          }g }|D ]@}t          |pd                                          }|r||vr|                    |           A|S )N )liststrstripappend)single_skillr	   	raw_items
normalizeditemtexts         -/root/.hermes/hermes-agent/hermes_cli/cron.py_normalize_skillsr      s    ~4!N		LL	J $ $4:2$$&& 	$D
**d###    c                  B    ddl m} t          j         |di |           S )Nr   )cronjob )tools.cronjob_toolsr   jsonloads)kwargscronjob_tools     r   	_cron_apir!   #   s4    ;;;;;;:ll,,V,,---r   Fshow_allc           	      
   ddl m}  ||           }|sPt          t          dt          j                             t          t          dt          j                             dS t                       t          t          dt          j                             t          t          dt          j                             t          t          d	t          j                             t                       |D ]}|                    d
d          }|                    dd          }|                    d|                    di                               dd                    }|                    d|                    dd          rdnd          }|                    dd          }|                    di           }	|	                    d          }
|	                    dd          }|
r| d|
 nd}|                    ddg          }t          |t                    r|g}d
                    |          }|                    d          p|                    d           r	|d          gng }|dk    rt          d!t          j                  }nl|dk    rt          d"t          j                  }nK|                    dd          rt          d#t          j                  }nt          d$t          j                  }t          d%t          |t          j                   d&|            t          d'|            t          d(|            t          d)|            t          d*|            t          d+|            |r%t          d,d
                    |                      |                    d-          }|rt          d.|            |                    d/          }|r|                    d0d          }|d1k    rt          d1t          j                  }n3t          | d2|                    d3d           t          j                  }t          d4| d%|            |                    d5          }|r-t          d6t          d7t          j                   d&|            t                       dd8lm}  |            st          t          d9t          j                             t          t          d:t          j                             t          t          d;t          j                             t                       dS dS )<zList all scheduled jobs.r   	list_jobsinclude_disabledzNo scheduled jobs.zFCreate one with 'hermes cron create ...' or the /cron command in chat.Nu   ┌─────────────────────────────────────────────────────────────────────────┐uO   │                         Scheduled Jobs                                  │u   └─────────────────────────────────────────────────────────────────────────┘id?namez	(unnamed)schedule_displayschedulevaluestateenabledT	scheduledpausednext_run_atrepeattimes	completed/u   ∞deliverlocal, r	   skillz[paused]z[completed]z[active]z
[disabled]   z    Name:      z    Schedule:  z    Repeat:    z    Next run:  z    Deliver:   z    Skills:    scriptz    Script:    last_statuslast_run_atokz: 
last_errorz    Last run:  last_delivery_errorz    u   ⚠ Delivery failed:find_gateway_pidsu@     ⚠  Gateway is not running — jobs won't fire automatically.z*     Start it with: hermes gateway installzI                    sudo hermes gateway install --system  # Linux servers)	cron.jobsr%   printr   r   DIMCYANget
isinstancer   joinYELLOWBLUEGREENREDhermes_cli.gatewayrD   )r"   r%   jobsjobjob_idr*   r,   r.   next_runrepeat_inforepeat_timesrepeat_completed
repeat_strr7   deliver_strr	   statusr=   r>   last_runstatus_displaydelivery_errrD   s                          r   	cron_listr^   )   s^   ######9h///D e(&*55666e\^d^hiijjj	GGG	%  t  v|  vA  B  B  C  C  C	%acicn
o
oppp	%  t  v|  vA  B  B  C  C  C	GGG 5 5s##wwv{++77-swwz2/F/F/J/J7TW/X/XYY	40H0H!VhWW77=#..ggh++"w//&??;::=IT(99<999u
'')gY//gs## 	 iGii((""R9I9I'QG~~rH:v}55FFk!!=&+66FFWWY%% 	5:v|44FF<44F:5//::&::;;;&&&'''***+++,
,,---***+++---... 	97DIIf$5$577888"" 	.,F,,--- ggm,, 	Bww}c22Hd""!&tV\!:!:!&+'U'Us9S9S'U'UW]Wa!b!b@H@@@@AAAww455 	XV5v}EEVVVVWWW444444 eVX^Xeffggge@&*MMNNNe_agakllmmm	 r   c                  *    ddl m}   | d           dS )zRun due jobs once and exit.r   tickT)verboseN)cron.schedulerra   r`   s    r   	cron_tickrd   y   s-    ######Dr   c            	         ddl m}  ddlm} t	                        |            }|r`t	          t          dt          j                             t	          dd                    t          t          |                                nqt	          t          dt          j                             t	                       t	          d           t	          d	           t	          d
           t	          d           t	                        | d          }|rNd |D             }t	          dt          |           d           |rt	          dt          |                      nt	          d           t	                       dS )zShow cron execution status.r   r$   rC   u<   ✓ Gateway is running — cron jobs will fire automaticallyz  PID: r9   u6   ✗ Gateway is not running — cron jobs will NOT firez   To enable automatic execution:z9    hermes gateway install    # Install as a user servicezS    sudo hermes gateway install --system  # Linux servers: boot-time system servicez4    hermes gateway            # Or run in foregroundFr&   c                 b    g | ],}|                     d           |                     d           -S )r2   )rI   ).0js     r   
<listcomp>zcron_status.<locals>.<listcomp>   s5    PPPa155;O;OPQUU=))PPPr   r;   z active job(s)  Next run: z  No active jobsN)rE   r%   rP   rD   rF   r   r   rN   rK   mapr   rO   lenmin)r%   rD   pidsrQ   	next_runss        r   cron_statusrp      s   ######444444	GGGD 	FeRTZT`aabbb3		#c4..11334444eLfjYYZZZ0111IJJJcdddDEEE	GGG9e,,,D "PP4PPP	,3t99,,,--- 	31Y11222 !!!	GGGGGr   c                    t          d| j        | j        t          | dd           t          | dd           t          | dd           t          | dd           t	          t          | dd           t          | dd                     t          | dd           	  	        }|                    d	          s@t          t          d
|                    dd           t          j	                             dS t          t          d|d          t          j
                             t          d|d                     t          d|d                     |                    d          r+t          dd                    |d                               |                    di           }|                    d          rt          d|d                     t          d|d                     dS )Ncreater*   r7   r3   r:   r	   r=   )	actionr,   promptr*   r7   r3   r:   r	   r=   successzFailed to create job: errorunknown error   zCreated job: rS     Name:   Schedule: r,   
  Skills: r9   rR   
  Script: rj   r2   r   )r!   r,   rt   getattrr   rI   rF   r   r   rO   rN   rK   )argsresultjob_datas      r   cron_creater      s   {T64((i..tXt,,dGT** w!=!=wtXW[?\?\]]tXt,,
 
 
F ::i   eSVZZ-Q-QSSU[U_``aaaq	%2x 022FL
A
ABBB	
%VF^
%
%&&&	
-
+
-
-...zz( :8499VH%56688999zz%$$H||H 1/8H-//000	
0.
0
01111r   c                 *  
 ddl m}  || j                  }|s1t          t	          d| j         t
          j                             dS t          |                    d          p,|                    d          sg n|                    d          g          }t          t          | dd           t          | dd                     }t          d t          | dd                     pg }t          t          d t          | dd                     pg           
d }t          | d	d
          rg }n5||}n0|s
r,
fd|D             }|D ]}||vr|                    |           t          d| j        t          | dd           t          | dd           t          | dd           t          | dd           t          | dd           |t          | dd           	  	        }|                    d          s@t          t	          d|                    dd           t
          j                             dS |d         }	t          t	          d|	d          t
          j                             t          d|	d                     t          d|	d                     |	                    d          r,t          dd                    |	d                               nt          d           |	                    d          rt          d |	d                     dS )!Nr   )get_jobzJob not found: rx   r	   r:   
add_skillsremove_skillsclear_skillsFc                     g | ]}|v|	S r   r   )rg   r:   r   s     r   ri   zcron_edit.<locals>.<listcomp>   s#    YYY%e=>X>X>X>X>Xr   updater,   rt   r*   r7   r3   r=   )	rs   rS   r,   rt   r*   r7   r3   r	   r=   ru   zFailed to update job: rv   rw   rR   zUpdated job: rS   ry   rz   r{   r9   z  Skills: noner|   )rE   r   rS   rF   r   r   rO   r   rI   r   r}   setr   r!   rN   rK   )r~   r   rR   existing_skillsreplacement_skillsr   final_skillsr:   r   updatedr   s             @r   	cron_editr      sI   !!!!!!
'$+

C e3dk33VZ@@AAAq3778,,d3777;K;K1cRURYRYZaRbRbQceeO*74$+G+GQUW_aeIfIfgg"4|T)J)JKKQrJ)$ot0T0TUU[Y[\\MLt^U++ +		')	 +} +YYYY?YYY 	+ 	+EL((##E***{z400tXt,,T64((i..tXt,,tXt,,
 
 
F ::i   eSVZZ-Q-QSSU[U_``aaaqUmG	%3 133V\
B
BCCC	
&WV_
&
&'''	
.,
.
.///{{8  9499WX%67799::::{{8 0.78,..///1r   rs   rS   success_verbc                 x   t          | |          }|                    d          sCt          t          d|  d|                    dd           t          j                             dS |                    d          p|                    d	          pi }t          t          | d|                    d
|           d| dt          j                             | dv rG|                    di                               d          rt          d|d         d                     | dk    rt          d           dS )N)rs   rS   ru   z
Failed to z job: rv   rw   rx   rR   removed_jobr*   z ()>   runresumer2   rj   r   z)  It will run on the next scheduler tick.r   )r!   rI   rF   r   r   rO   rN   )rs   rS   r   r   rR   s        r   _job_actionr      s:   fV444F::i   eUUUvzz'?/S/SUUW]Wabbcccq
**U


>vzz-88
>BC	%<KKswwvv'>'>KK&KKKV\
Z
Z[[["""vzz%'<'<'@'@'O'O";VE]=9;;<<<9:::1r   c                 j   t          | dd          }||dk    r"t          | dd          }t          |           dS |dk    rt                       dS |dk    rt                       dS |d	v rt	          |           S |d
k    rt          |           S |dk    rt          d| j        d          S |dk    rt          d| j        d          S |dk    rt          d| j        d          S |dv rt          d| j        d          S t          d|            t          d           t          j
        d           dS )zHandle cron subcommands.cron_commandNr   allFr   rZ   ra   >   addrr   editpausePausedr   Resumedr   	Triggered>   rmdeleteremover   RemovedzUnknown cron command: zIUsage: hermes cron [list|create|edit|pause|resume|run|remove|status|tick]rx   )r}   r^   rp   rd   r   r   r   rS   rF   sysexit)r~   subcmdr"   s      r   r   r      s[   T>400F~6))4..(qqq"""4   7DK:::8T[)<<<5$+{;;;+++8T[)<<<	
+6
+
+,,,	
UVVVHQKKKKKr   )NN)F)__doc__r   r   pathlibr   typingr   r   r   __file__parentresolvePROJECT_ROOTpathinsertr   hermes_cli.colorsr   r   r   r!   boolr^   rd   rp   r   r   intr   r   r   r   r   <module>r      s     



       + + + + + + + + + +tH~~$+3355 33|$$ % % % + + + + + + + + (3-1H T\]abe]fTg     . . .M M M M M M`    B  61 1 1h S      % % % % %r   