§
    øžyj7_  ã                   ó¾  — 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lmZ ddeee                  deee                  fd	„Zd
„ Zdefd„Zdd„Zd defd„Zd„ Zd!dee         defd„Zd„ Zdd„Z d„ Z!d„ Z"dedededefd„Z#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)Ú"contains_gateway_lifecycle_commandÚ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         ú5/home/ragecks/.hermes/hermes-agent/hermes_cli/cron.pyÚ_normalize_skillsr      s‚   € Ø€~ØÐØ�4Ø!�Nˆ	ˆ	å˜‘L”Lˆ	à€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   € Ø;Ð;Ð;Ð;Ð;Ð;åŒ:�l�lÐ,Ð, VÐ,Ð,Ñ-Ô-Ð-r   c                  óT   — 	 ddl m}   | ¦   «         j        pdS # t          $ r Y dS w xY w)u8  Name of the resolved cron scheduler provider ('builtin', 'chronos', â€¦).

    Best-effort + offline (``resolve_cron_scheduler`` reads config and the
    provider's ``is_available()`` contract forbids network). Returns 'builtin'
    on any failure so callers fall back to the historical ticker-based checks.
    r   ©Úresolve_cron_schedulerÚbuiltin)Úcron.scheduler_providerr%   ÚnameÚ	Exceptionr$   s    r   Ú_active_cron_provider_namer*   3   sR   € ðØBÐBÐBÐBÐBÐBà%Ð%Ñ'Ô'Ô,Ð9°	Ð9øÝð ð ð Øˆyˆyðøøøs   ‚ ™
'¦'c                  ó°  — 	 t          ¦   «         dk    rdS ddlm}   | ¦   «         rdS n# t          $ r Y dS w xY wt	          t          dt          j        ¦  «        ¦  «         t	          t          dt          j        ¦  «        ¦  «         t	          t          dt          j        ¦  «        ¦  «         t	          t          dt          j        ¦  «        ¦  «         dS )	u  Warn that scheduled jobs won't fire unless the gateway is running.

    The cron ticker only runs inside the gateway (``_start_cron_ticker`` in
    gateway/run.py); there is no standalone cron daemon. Without a running
    gateway, ``next_run_at`` passes but jobs never fire and ``last_run_at``
    stays null â€” the most common cron support report (#51038). Surfacing this
    at create/list time, when the user is right there, prevents it.

    An external provider (e.g. Chronos) fires jobs via a NAS-mediated webhook,
    NOT the in-process ticker, so a momentarily-absent gateway process does not
    mean jobs won't fire â€” the warning would be a false alarm. Stay quiet for
    any non-builtin provider; the gateway-process heuristic only speaks to the
    built-in ticker's trigger.
    r&   Nr   ©Ú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 serversz&     Check status:  hermes cron status)	r*   Úhermes_cli.gatewayr-   r)   Úprintr   r   ÚYELLOWÚDIMr,   s    r   Ú_warn_if_gateway_not_runningr2   B   sä   € ð
Ý%Ñ'Ô'¨9Ò4Ð4ØˆFà8Ð8Ð8Ð8Ð8Ð8àÐÑÔð 	ØˆFð	øåð ð ð àˆˆðøøøõ 
�%ÐRÕTZÔTaÑ
bÔ
bÑcÔcÐcÝ	�%Ð<½f¼jÑ
IÔ
IÑJÔJÐJÝ	�%Ð[Õ]cÔ]gÑ
hÔ
hÑiÔiÐiÝ	�%Ð8½&¼*Ñ
EÔ
EÑFÔFÐFÐFÐFs   ‚) –) ©
7¶7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
l m} |D �]á}|                     dd¦  «        }|                     dd¦  «        }|                     d|                     di ¦  «                             dd¦  «        ¦  «        } ||¦  «        }|                     dd¦  «        }	|                     d¦  «        pi }
|
                     d¦  «        }|
                     dd¦  «        }|r|› d|› �nd}|                     d¦  «        p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.¦  «        p|                     d/¦  «        }|rWt          d0|› d1�¦  «         |                     d2¦  «        pi }|                     d3¦  «        rt          d4|d3         › �¦  «         |                     d5¦  «        r+t          d6t          d7t          j        ¦  «        › d8�¦  «         |                     d9¦  «        }|rt          d:|› �¦  «         |                     d;¦  «        }|r|                     d<d¦  «        }|d=k    rt          d=t          j        ¦  «        }n3t          |› d>|                     d?d¦  «        › �t          j        ¦  «        }t          d@|› d$|› �¦  «         |                     dA¦  «        }|r=t          dB|                     dCd¦  «        › d$|                     dd¦  «        › �¦  «         |                     dD¦  «        }|r-t          dEt          dFt          j        ¦  «        › d%|› �¦  «         t          ¦   «          �Œãt!          ¦   «          dS )Gz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á   â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜)Úeffective_job_stateÚidú?r(   z	(unnamed)Úschedule_displayÚscheduleÚvalueÚnext_run_atÚrepeatÚtimesÚ	completedú/u   âˆžÚdeliverÚlocalú, r
   ÚskillÚpausedz[paused]z[completed]ÚenabledTz[active]z
[disabled]ú  Ú z    Name:      z    Schedule:  z    Repeat:    z    Next run:  z    Deliver:   z    Skills:    Úscriptz    Script:    Úmonitor_scriptÚmonitor_urlz    Monitor:   ú# (agent runs only on output change)Úmonitor_stateÚlast_changed_atz    Changed:   Úno_agentz    Mode:      zno-agentz# (script stdout delivered directly)Úworkdirz    Workdir:   Úlast_statusÚlast_run_atÚokz: Ú
last_errorz    Last run:  Úlatest_executionz    Execution: ÚstatusÚlast_delivery_errorú    u   âš  Delivery failed:)Ú	cron.jobsr6   r/   r   r   r1   ÚCYANr9   ÚgetÚ
isinstancer   Újoinr0   ÚBLUEÚGREENÚREDr2   )r3   r6   Újobsr9   ÚjobÚjob_idr(   r=   ÚstateÚnext_runÚrepeat_infoÚrepeat_timesÚrepeat_completedÚ
repeat_strrD   Údeliver_strr
   rY   rL   Úmonitor_sourceÚ	mon_staterS   rT   Úlast_runÚstatus_displayrX   Údelivery_errs                              r   Ú	cron_listrs   c   sO  € à#Ð#Ð#Ð#Ð#Ð#àˆ9 hÐ/Ñ/Ô/€Dàð Ý�eÐ(­&¬*Ñ5Ô5Ñ6Ô6Ð6Ý�eÐ\Õ^dÔ^hÑiÔiÑjÔjÐjØˆå	�G„G€GÝ	�%ð  tõ  v|ô  vAñ  Bô  Bñ  Cô  Cð  CÝ	�%ÐaÕciÔcnÑ
oÔ
oÑpÔpÐpÝ	�%ð  tõ  v|ô  vAñ  Bô  Bñ  Cô  Cð  CÝ	�G„G€Gà-Ð-Ð-Ð-Ð-Ð-àð Pñ PˆØ—’˜˜sÑ#Ô#ˆØ�wŠw�v˜{Ñ+Ô+ˆØ—7’7Ð-¨s¯wªw°zÀ2Ñ/FÔ/F×/JÒ/JÈ7ÐTWÑ/XÔ/XÑYÔYˆð $Ð# CÑ(Ô(ˆØ—7’7˜=¨#Ñ.Ô.ˆð
 —g’g˜hÑ'Ô'Ð-¨2ˆØ"—’ wÑ/Ô/ˆØ&Ÿ?š?¨;¸Ñ:Ô:ÐØ=IÐTÐ(Ð9Ð9¨<Ð9Ð9Ð9Èuˆ
ð —'’'˜)Ñ$Ô$Ð1¨¨	ˆÝ�g�sÑ#Ô#ð 	 Ø�iˆGØ—i’i Ñ(Ô(ˆà—’˜Ñ"Ô"ÐR¸¿ºÀÑ9IÔ9IÐ'Q¨¨G¬ ~ ~ÈrˆØ�HÒÐÝ˜:¥v¤}Ñ5Ô5ˆFˆFØ�kÒ!Ð!Ý˜=­&¬+Ñ6Ô6ˆFˆFØ�WŠW�Y Ñ%Ô%ð 	5Ý˜:¥v¤|Ñ4Ô4ˆFˆFå˜<­¬Ñ4Ô4ˆFåÐ:•5˜¥¤Ñ/Ô/Ð:Ð:°&Ð:Ð:Ñ;Ô;Ð;ÝÐ& Ð&Ð&Ñ'Ô'Ð'ÝÐ* Ð*Ð*Ñ+Ô+Ð+ÝÐ, 
Ð,Ð,Ñ-Ô-Ð-ÝÐ* Ð*Ð*Ñ+Ô+Ð+ÝÐ- Ð-Ð-Ñ.Ô.Ð.Øð 	9ÝÐ7 D§I¢I¨fÑ$5Ô$5Ð7Ð7Ñ8Ô8Ð8Ø—’˜Ñ"Ô"ˆØð 	.ÝÐ, FÐ,Ð,Ñ-Ô-Ð-ØŸšÐ!1Ñ2Ô2ÐL°c·g²g¸mÑ6LÔ6LˆØð 	HÝÐW NÐWÐWÐWÑXÔXÐXØŸš Ñ0Ô0Ð6°BˆIØ�}Š}Ð.Ñ/Ô/ð HÝÐF¨	Ð2CÔ(DÐFÐFÑGÔGÐGØ�7Š7�:ÑÔð 	hÝÐf¥E¨*µf´jÑ$AÔ$AÐfÐfÐfÑgÔgÐgØ—'’'˜)Ñ$Ô$ˆØð 	/ÝÐ- GÐ-Ð-Ñ.Ô.Ð.ð —g’g˜mÑ,Ô,ˆØð 	BØ—w’w˜}¨cÑ2Ô2ˆHØ˜dÒ"Ð"Ý!& t­V¬\Ñ!:Ô!:��å!&¨+Ð'UÐ'U¸¿ºÀÈsÑ9SÔ9SÐ'UÐ'UÕW]ÔWaÑ!bÔ!b�ÝÐ@ HÐ@Ð@°Ð@Ð@ÑAÔAÐAàŸ7š7Ð#5Ñ6Ô6ÐØð 	Ýð5Ð"2×"6Ò"6°xÀÑ"EÔ"Eð 5ð 5Ø#×'Ò'¨¨cÑ2Ô2ð5ð 5ñô ð ð
 —w’wÐ4Ñ5Ô5ˆØð 	XÝÐV�Ð5µv´}ÑEÔEÐVÐVÈÐVÐVÑWÔWÐWå‰Œˆ‰å Ñ"Ô"Ð"Ð"Ð"r   c                  ó*   — ddl m}   | d¬¦  «         dS )zRun due jobs once and exit.r   ©ÚtickT)ÚverboseN)Úcron.schedulerrv   ru   s    r   Ú	cron_tickry   Ë   s-   € à#Ð#Ð#Ð#Ð#Ð#Ø€D�ÐÑÔÐÐÐr   é   rf   Úlimitc                 óº  — ddl m}  || |¬¦  «        }|st          d¦  «         dS |D ]±}t          |                     dd¦  «        › d|                     d	d¦  «        d
›d|                     dd¦  «        › d|                     dd¦  «        › d|                     dd¦  «        › �	¦  «         |                     d¦  «        rt          d|d         › �¦  «         Œ²dS )z,Show indexed durable cron execution history.r   )Úlist_executions)rf   r{   z$No cron execution attempts recorded.Nr:   r;   rJ   rY   z<9z  job=rf   z	  source=ÚsourceÚ
claimed_atÚerrorr[   )Úcron.executionsr}   r/   r^   )rf   r{   r}   ÚrecordsÚrecords        r   Ú	cron_runsr„   Ñ   s*  € à/Ð/Ð/Ð/Ð/Ð/àˆo V°5Ð9Ñ9Ô9€GØð ÝÐ4Ñ5Ô5Ð5ØˆØð ,ð ,ˆÝØ�zŠz˜$ Ñ$Ô$ð /ð /¨¯
ª
°8¸SÑ(AÔ(AÐHð /ð /Ø—:’:˜h¨Ñ,Ô,ð/ð /Ø7=·z²zÀ(ÈCÑ7PÔ7Pð/ð /à�zŠz˜,¨Ñ,Ô,ð/ð /ñ	
ô 	
ð 	
ð
 �:Š:�gÑÔð 	,ÝÐ*˜ œÐ*Ð*Ñ+Ô+Ð+øð,ð ,r   c            	      ó  — ddl m}  ddlm} t	          ¦   «          t          ¦   «         }|dk    r‰t	          t          d|› d�t          j        ¦  «        ¦  «         t	          t          dt          j	        ¦  «        ¦  «         t	          ¦   «          t           | d¬	¦  «        ¦  «         t	          ¦   «          d
S  |¦   «         }|�rddl m}m}m}m} |dz  dz   } |¦   «         }	 |¦   «         }
|	�‡|	|k    r�t	          t          dt          |	¦  «        › d�t          j        ¦  «        ¦  «         t	          dd                     t%          t&          |¦  «        ¦  «        › �¦  «         t	          d¦  «         �nÞ|	�é|
�ç|
|k    rát	          t          dt          |
¦  «        › d�t          j        ¦  «        ¦  «         t	          dd                     t%          t&          |¦  «        ¦  «        › �¦  «          |¦   «         }|rUt	          t          d|› �t          j        ¦  «        ¦  «         d|v r't	          t          dt          j        ¦  «        ¦  «         t	          d¦  «         nót	          t          dt          j        ¦  «        ¦  «         t	          dd                     t%          t&          |¦  «        ¦  «        › �¦  «         |	� t	          dt          |	¦  «        › d�¦  «         nqt	          t          dt          j        ¦  «        ¦  «         t	          ¦   «          t	          d¦  «         t	          d¦  «         t	          d¦  «         t	          d ¦  «         t	          ¦   «          t           | d¬	¦  «        ¦  «         t	          ¦   «          d
S )!zShow cron execution status.r   r5   r,   r&   u   âœ“ Cron provider: uD    â€” jobs fire via the managed scheduler, not the in-process ticker.zq  (No ticker heartbeat is expected for an external provider; due jobs are delivered by an authenticated webhook.)Fr7   N)Úget_ticker_heartbeat_ageÚget_ticker_last_errorÚget_ticker_success_ageÚTICKER_INTERVAL_SECONDSé   rz   uN   âš  Gateway is running but the cron ticker looks STALLED â€” no heartbeat for zs (expected every ~60s).z  PID: rF   z>  Cron jobs may NOT be firing. Restart: hermes gateway restartuF   âš  Gateway and cron ticker are running, but no tick has succeeded in u   s â€” ticks may be failing.z  Last tick error: zPermission deniedzÁ  Hint: jobs.json may be owned by another user (e.g. rewritten by a root `docker exec hermes hermes cron ...`). Fix ownership to match the gateway user, and prefer `docker exec -u <uid>:<gid>`.z.  Check the gateway log for 'Cron tick error'.u<   âœ“ Gateway is running â€” cron jobs will fire automaticallyz  Ticker heartbeat: zs agou6   âœ— 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 foreground)r\   r6   r.   r-   r/   r*   r   r   rb   r1   Ú_print_active_jobs_summaryr†   r‡   rˆ   r‰   Úintr0   r`   Úmapr   rc   )r6   r-   ÚproviderÚpidsr†   r‡   rˆ   r‰   ÚSTALE_AFTERÚhb_ageÚok_agerW   s               r   Úcron_statusr“   ã   s   € à#Ð#Ð#Ð#Ð#Ð#Ø4Ð4Ð4Ð4Ð4Ð4å	�G„G€Gå)Ñ+Ô+€HØ�9ÒÐõ 	�eð) (ð )ð )ð )åŒLñ
ô 
ñ 	ô 	ð 	õ
 	�eðCåŒJñ
ô 
ñ 	ô 	ð 	õ
 	‰ŒˆÝ" 9 9¸eÐ#DÑ#DÔ#DÑEÔEÐEÝ‰ŒˆØˆàÐÑÔ€DØñ @Fð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð .°Ñ1°BÑ6ˆØ)Ð)Ñ+Ô+ˆØ'Ð'Ñ)Ô)ˆàÐ &¨;Ò"6Ð"6å•%ðJÝ$'¨¡K¤KðJð Jð Jå”ñô ñ ô ð õ
 Ð7˜DŸIšI¥c­#¨t¡n¤nÑ5Ô5Ð7Ð7Ñ8Ô8Ð8ÝÐRÑSÔSÐSÑSØÐ FÐ$6¸6ÀKÒ;OÐ;Oõ •%ðIÝ # F¡¤ðIð Ið Iå”ñô ñ ô ð õ
 Ð7˜DŸIšI¥c­#¨t¡n¤nÑ5Ô5Ð7Ð7Ñ8Ô8Ð8Ø.Ð.Ñ0Ô0ˆJØð õ •eÐ>°*Ð>Ð>ÅÄ
ÑKÔKÑLÔLÐLØ&¨*Ð4Ð4Ý�%ðQõ œñô ñ ô ð õ ÐBÑCÔCÐCÐCå•%ÐVÕX^ÔXdÑeÔeÑfÔfÐfÝÐ7˜DŸIšI¥c­#¨t¡n¤nÑ5Ô5Ð7Ð7Ñ8Ô8Ð8ØÐ!ÝÐ?­S°©[¬[Ð?Ð?Ð?Ñ@Ô@Ð@øå�eÐLÍfÌjÑYÔYÑZÔZÐZÝ‰ŒˆÝÐ0Ñ1Ô1Ð1ÝÐIÑJÔJÐJÝÐcÑdÔdÐdÝÐDÑEÔEÐEå	�G„G€Gå˜y˜y¸%Ð@Ñ@Ô@ÑAÔAÐAå	�G„G€G€G€Gr   c                 óÊ   — | rQd„ | D ¦   «         }t          dt          | ¦  «        › d�¦  «         |r!t          dt          |¦  «        › �¦  «         dS dS t          d¦  «         dS )zvPrint the '<N> active job(s)' + next-run line shared by every status
    path (built-in ticker AND external provider).c                 ób   — g | ],}|                      d ¦  «        ¯|                      d ¦  «        ‘Œ-S )r?   )r^   )Ú.0Újs     r   ú
<listcomp>z._print_active_jobs_summary.<locals>.<listcomp>P  s5   € ÐPÐPÐP¨a¸1¿5º5ÀÑ;OÔ;OÐP�Q—U’U˜=Ñ)Ô)ÐPÐPÐPr   rJ   z active job(s)ú  Next run: z  No active jobsN)r/   ÚlenÚmin)rd   Ú	next_runss     r   r‹   r‹   L  s‹   € ð ð "ØPÐP°4ÐPÑPÔPˆ	ÝÐ,•3�t‘9”9Ð,Ð,Ð,Ñ-Ô-Ð-Øð 	3ÝÐ1¥ Y¡¤Ð1Ð1Ñ2Ô2Ð2Ð2Ð2ð	3ð 	3õ 	Ð Ñ!Ô!Ð!Ð!Ð!r   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 ¦  «        t          | dd ¦  «        t          | d	d ¦  «        t          | d
d ¦  «        t          | dd¦  «        p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         › �¦  «         |                     d¦  «        rt          d|d         › d�¦  «         |                     d¦  «        rt          d|d         › d�¦  «         |                     d¦  «        rt          d ¦  «         |                     d¦  «        rt          d!|d         › �¦  «         t          d"|d#         › �¦  «         t          ¦   «          d$S )%NÚcreater(   rD   r@   rG   r
   rL   rS   ÚmodelÚmodel_providerrR   FrM   rN   )Úactionr=   Úpromptr(   rD   r@   rG   r
   rL   rS   rŸ   rŽ   rR   rM   rN   ÚsuccesszFailed to create job: r€   úunknown erroré   zCreated job: rf   ú  Name: ú  Schedule: r=   ú
  Skills: rF   re   ú
  Script: ú  Monitor: rO   ú3  Mode: no-agent (script stdout delivered directly)ú  Workdir: r™   r?   r   )r"   r=   r¢   Úgetattrr   r^   r/   r   r   rc   rb   r`   r2   )ÚargsÚresultÚjob_datas      r   Úcron_creater±   X  s  € õ ØØ”ØŒ{Ý�T˜6 4Ñ(Ô(Ý˜˜i¨Ñ.Ô.Ý�t˜X tÑ,Ô,Ý�d˜G TÑ*Ô*Ý ¥¨¨w¸Ñ!=Ô!=½wÀtÈXÐW[Ñ?\Ô?\Ñ]Ô]Ý�t˜X tÑ,Ô,Ý˜˜i¨Ñ.Ô.Ý�d˜G TÑ*Ô*Ý˜Ð/°Ñ6Ô6Ý˜˜z¨5Ñ1Ô1Ð9°TÝ˜tÐ%5°tÑ<Ô<Ý˜D -°Ñ6Ô6ðñ ô €Fð" �:Š:�iÑ Ô ð Ý�eÐS¨V¯ZªZ¸ÀÑ-QÔ-QÐSÐSÕU[ÔU_Ñ`Ô`ÑaÔaÐaØˆqÝ	�%Ð2  xÔ 0Ð2Ð2µF´LÑ
AÔ
AÑBÔBÐBÝ	Ð
%�V˜F”^Ð
%Ð
%Ñ&Ô&Ð&Ý	Ð
-˜ 
Ô+Ð
-Ð
-Ñ.Ô.Ð.Ø‡z‚z�(ÑÔð :ÝÐ8˜4Ÿ9š9 V¨HÔ%5Ñ6Ô6Ð8Ð8Ñ9Ô9Ð9Ø�zŠz˜% Ñ$Ô$€HØ‡|‚|�HÑÔð 1ÝÐ/˜8 HÔ-Ð/Ð/Ñ0Ô0Ð0Ø‡|‚|Ð$Ñ%Ô%ð ]ÝÐ[˜HÐ%5Ô6Ð[Ð[Ð[Ñ\Ô\Ð\Ø‡|‚|�MÑ"Ô"ð ZÝÐX˜H ]Ô3ÐXÐXÐXÑYÔYÐYØ‡|‚|�JÑÔð EÝÐCÑDÔDÐDØ‡|‚|�IÑÔð 3ÝÐ1˜H YÔ/Ð1Ð1Ñ2Ô2Ð2Ý	Ð
0˜ Ô.Ð
0Ð
0Ñ1Ô1Ð1Ý Ñ"Ô"Ð"Øˆ1r   c                 óL	  ‡— ddl m}m} 	  || j        ¦  «        }n€# |$ rx}t	          t          t          |¦  «        t          j        ¦  «        ¦  «         |j	        D ]1}t	          d|d         › d| 
                    d¦  «        ›d�¦  «         Œ2Y d }~dS d }~ww xY w|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 ¦  «        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¦  «        rt	          d+|d         › d,�¦  «         | 
                    d¦  «        rt	          d+|d         › d,�¦  «         | 
                    d¦  «        rt	          d-¦  «         | 
                    d¦  «        rt	          d.|d         › �¦  «         dS )/Nr   )ÚAmbiguousJobReferenceÚresolve_job_refrJ   r:   z	  (name: r(   ú)r¥   zJob not found: r
   rG   Ú
add_skillsÚremove_skillsÚclear_skillsFc                 ó   •— g | ]}|‰v¯|‘Œ	S r   r   )r–   rG   r·   s     €r   r˜   zcron_edit.<locals>.<listcomp>¡  s#   ø€ ÐYÐYÐY %¸eÈ=Ð>XÐ>X˜Ð>XÐ>XÐ>Xr   Úupdater=   r¢   rD   r@   rL   rS   rŸ   r    rR   rM   rN   )r¡   rf   r=   r¢   r(   rD   r@   r
   rL   rS   rŸ   rŽ   rR   rM   rN   r£   zFailed to update job: r€   r¤   re   zUpdated job: rf   r¦   r§   r¨   rF   z  Skills: noner©   rª   rO   r«   r¬   )r\   r³   r´   rf   r/   r   r   r   rc   Úmatchesr^   r   r   r­   Úsetr   r"   rb   r`   )r®   r³   r´   re   ÚexcÚmÚexisting_skillsÚreplacement_skillsr¶   Úfinal_skillsrG   r¯   Úupdatedr·   s                @r   Ú	cron_editrÃ   ˆ  s  ø€ Ø@Ð@Ð@Ð@Ð@Ð@Ð@Ð@ðØˆo˜dœkÑ*Ô*ˆˆøØ ð ð ð Ý�e•C˜‘H”H�fœjÑ)Ô)Ñ*Ô*Ð*Ø”ð 	=ð 	=ˆAÝÐ;�q˜”wÐ;Ð;¨¯ª¨v©¬Ð;Ð;Ð;Ñ<Ô<Ð<Ð<Øˆqˆqˆqˆqˆqøøøøð	øøøð
 ð Ý�eÐ3 d¤kÐ3Ð3µV´ZÑ@Ô@ÑAÔAÐAØˆqå˜3Ÿ7š7 8Ñ,Ô,Ðd¸3¿7º7À7Ñ;KÔ;KÐ1c°°ÐRU×RYÒRYÐZaÑRbÔRbÐQcÑeÔe€OÝ*­7°4¸À$Ñ+GÔ+GÍÐQUÐW_ÐaeÑIfÔIfÑgÔgÐÝ" 4­°°|ÀTÑ)JÔ)JÑKÔKÐQÈr€JÝÕ)¨$µ¸¸oÈtÑ0TÔ0TÑUÔUÐ[ÐY[Ñ\Ô\€Mà€LÝˆt�^ UÑ+Ô+ð +ØˆˆØ	Ð	'Ø)ˆˆØ	ð +�}ð +ØYÐYÐYÐY¨?ÐYÑYÔYˆØð 	+ð 	+ˆEØ˜LÐ(Ð(Ø×#Ò# EÑ*Ô*Ð*øåØØŒ{Ý˜˜z¨4Ñ0Ô0Ý�t˜X tÑ,Ô,Ý�T˜6 4Ñ(Ô(Ý˜˜i¨Ñ.Ô.Ý�t˜X tÑ,Ô,ØÝ�t˜X tÑ,Ô,Ý˜˜i¨Ñ.Ô.Ý�d˜G TÑ*Ô*Ý˜Ð/°Ñ6Ô6Ý˜˜z¨4Ñ0Ô0Ý˜tÐ%5°tÑ<Ô<Ý˜D -°Ñ6Ô6ðñ ô €Fð" �:Š:�iÑ Ô ð Ý�eÐS¨V¯ZªZ¸ÀÑ-QÔ-QÐSÐSÕU[ÔU_Ñ`Ô`ÑaÔaÐaØˆqà�UŒm€GÝ	�%Ð3 ¨Ô 1Ð3Ð3µV´\Ñ
BÔ
BÑCÔCÐCÝ	Ð
&�W˜V”_Ð
&Ð
&Ñ'Ô'Ð'Ý	Ð
.˜ Ô,Ð
.Ð
.Ñ/Ô/Ð/Ø‡{‚{�8ÑÔð  ÝÐ9˜4Ÿ9š9 W¨XÔ%6Ñ7Ô7Ð9Ð9Ñ:Ô:Ð:Ð:åÐÑÔÐØ‡{‚{�8ÑÔð 0ÝÐ.˜7 8Ô,Ð.Ð.Ñ/Ô/Ð/Ø‡{‚{Ð#Ñ$Ô$ð \ÝÐZ˜GÐ$4Ô5ÐZÐZÐZÑ[Ô[Ð[Ø‡{‚{�=Ñ!Ô!ð YÝÐW˜G MÔ2ÐWÐWÐWÑXÔXÐXØ‡{‚{�:ÑÔð EÝÐCÑDÔDÐDØ‡{‚{�9ÑÔð 2ÝÐ0˜G IÔ.Ð0Ð0Ñ1Ô1Ð1Øˆ1s   ‹ œB¡A-BÂBr¡   Úsuccess_verbc                 ó„  — 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•|                     di ¦  «        }|                     d¦  «        r-|                     d¦  «        rdnd}t          d|› d�¦  «         n=|                     d¦  «        rt          d|d         › �¦  «         nt          d¦  «         dS )N)r¡   rf   r£   z
Failed to z job: r€   r¤   r¥   re   Úremoved_jobr(   z (rµ   >   ÚrunÚresumer?   r™   rÇ   ÚexecutedÚexecution_successÚ	succeededÚfailedz  Ran now: ú.Úexecution_skippedrJ   z)  It will run on the next scheduler tick.r   )r"   r^   r/   r   r   rc   rb   )r¡   rf   rÄ   r¯   re   Úoutcomes         r   Ú_job_actionrÐ   Ð  sÎ  € Ý˜f¨VÐ4Ñ4Ô4€FØ�:Š:�iÑ Ô ð Ý�eÐU ÐUÐU¨v¯zªz¸'À?Ñ/SÔ/SÐUÐUÕW]ÔWaÑbÔbÑcÔcÐcØˆqØ
�*Š*�UÑ
Ô
Ð
>˜vŸzšz¨-Ñ8Ô8Ð
>¸B€CÝ	�%�<ÐKÐK s§w¢w¨v°vÑ'>Ô'>ÐKÐKÀ&ÐKÐKÐKÍVÌ\Ñ
ZÔ
ZÑ[Ô[Ð[ØÐ"Ð"Ð" v§z¢z°%¸Ñ'<Ô'<×'@Ò'@ÀÑ'OÔ'OÐ"ÝÐ;˜V Eœ]¨=Ô9Ð;Ð;Ñ<Ô<Ð<Ø�‚€Ø�jŠj˜ Ñ#Ô#ˆØ�7Š7�:ÑÔð 	?Ø%(§W¢WÐ-@Ñ%AÔ%AÐO�k�kÀxˆGÝÐ* Ð*Ð*Ð*Ñ+Ô+Ð+Ð+Ø�WŠWÐ(Ñ)Ô)ð 	?ÝÐ1�sÐ.Ô/Ð1Ð1Ñ2Ô2Ð2Ð2åÐ=Ñ>Ô>Ð>Øˆ1r   c                 ór  — ddl m} t          t          | dd¦  «        pd¦  «        }t          | dd¦  «        pd}t          | dd¦  «        }t          | d	d¦  «        }|s)t	          t          d
t          j        ¦  «        ¦  «         dS 	 |dk    rt|�|€)t	          t          dt          j        ¦  «        ¦  «         dS |                     |||¦  «         t	          t          d|› d|› d�t          j	        ¦  «        ¦  «         dS |dk    r„|€)t	          t          dt          j        ¦  «        ¦  «         dS | 
                    ||¦  «        }|€0t	          t          d|› d|› d�t          j        ¦  «        ¦  «         dS t	          |¦  «         dS |dk    r¡|€)t	          t          dt          j        ¦  «        ¦  «         dS |                     ||¦  «        r0t	          t          d|› d|› d�t          j	        ¦  «        ¦  «         dS t	          t          d|› d|› d�t          j        ¦  «        ¦  «         dS |                     |¦  «        }|s-t	          t          d|› d�t          j        ¦  «        ¦  «         dS |D ]{}t	          dt          |d         t          j        ¦  «        › d|d	         › �¦  «         t	          dt          dt          |d         ¦  «        z   t          j        ¦  «        › �¦  «         Œ|dS # t          $ r5}	t	          t          d|	› �t          j        ¦  «        ¦  «         Y d}	~	dS d}	~	ww xY w)uU  Handle ``hermes cron notepad <job_id> [get|set|delete|list]``.

    The per-job durable KV scratchpad (``cron/notepad.py``). This CLI is the
    write path â€” a running cron agent updates its own notepad by invoking
    these commands via its terminal tool; the scheduler injects non-empty
    notepads into the job prompt on each run.
    r   )Únotepadrf   r   Únotepad_actionNr   Úkeyr>   zA job ID is required.r¥   r¼   z5Usage: hermes cron notepad <job_id> set <key> <value>zSet notepad key 'z
' for job rÍ   r^   z-Usage: hermes cron notepad <job_id> get <key>zNo notepad key 'Údeletez0Usage: hermes cron notepad <job_id> delete <key>zDeleted notepad key 'zNotepad for job z
 is empty.rJ   z = r[   z	updated: Ú
updated_atzNotepad error: )ÚcronrÒ   r   r­   r/   r   r   rc   Úset_noterb   Úget_noter0   Údelete_noteÚ
list_notesr1   Ú
ValueError)
r®   rÒ   rf   r¡   rÔ   r>   ÚstoredÚnotesÚnoter½   s
             r   Úcron_notepadrà   å  sl  € ð ÐÐÐÐÐå•˜˜x¨Ñ,Ô,Ð2°Ñ3Ô3€FÝ�TÐ+¨TÑ2Ô2Ð<°f€FÝ
�$˜˜tÑ
$Ô
$€CÝ�D˜' 4Ñ(Ô(€Eàð Ý�eÐ+­V¬ZÑ8Ô8Ñ9Ô9Ð9Øˆqð)Ø�UŠ?ˆ?Øˆ{˜e˜mÝ•eÐSÕU[ÔU_Ñ`Ô`ÑaÔaÐaØ�qØ×Ò˜V S¨%Ñ0Ô0Ð0Ý•%ÐD¨CÐDÐD¸6ÐDÐDÐDÅfÄlÑSÔSÑTÔTÐTØ�1à�UŠ?ˆ?Øˆ{Ý•eÐKÍVÌZÑXÔXÑYÔYÐYØ�qØ×%Ò% f¨cÑ2Ô2ˆFØˆ~Ý•eÐG¨sÐGÐG¸fÐGÐGÐGÍÌÑWÔWÑXÔXÐXØ�qÝ�&‰MŒMˆMØ�1à�XÒÐØˆ{Ý•eÐNÕPVÔPZÑ[Ô[Ñ\Ô\Ð\Ø�qØ×"Ò" 6¨3Ñ/Ô/ð Ý•eÐL°CÐLÐLÀ6ÐLÐLÐLÍfÌlÑ[Ô[Ñ\Ô\Ð\Ø�qÝ•%ÐC¨3ÐCÐC¸&ÐCÐCÐCÅVÄ]ÑSÔSÑTÔTÐTØ�1ð ×"Ò" 6Ñ*Ô*ˆØð 	Ý•%Ð=¨6Ð=Ð=Ð=½v¼zÑJÔJÑKÔKÐKØ�1Øð 	Uð 	UˆDÝÐL•u˜T %œ[­&¬-Ñ8Ô8ÐLÐL¸TÀ'¼]ÐLÐLÑMÔMÐMÝÐS�˜{­S°°lÔ1CÑ-DÔ-DÑDÅfÄjÑQÔQÐSÐSÑTÔTÐTÐTØˆqøÝð ð ð Ý�eÐ+ cÐ+Ð+­V¬ZÑ8Ô8Ñ9Ô9Ð9ØˆqˆqˆqˆqˆqøøøøðøøøsS   Â1K7 Â;AK7 Ä/K7 Ä3AK7 Å;K7 Æ/K7 Æ=AK7 È.K7 È3AK7 É7A>K7 Ë7
L6Ì*L1Ì1L6c                 óü  — 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 r0t	          t          | d
d¦  «        t          | dd¦  «        ¦  «         dS |dk    rt          | ¦  «        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   rY   rv   >   ÚrunsÚhistoryrf   r{   rz   rÒ   >   Úaddrž   ÚeditÚpauseÚPausedrÈ   ÚResumedrÇ   Ú	Triggered>   ÚrmrÕ   Úremoverí   ÚRemovedzUnknown cron command: zNUsage: hermes cron [list|create|edit|pause|resume|run|remove|status|runs|tick]r¥   )r­   rs   r“   ry   r„   rà   r±   rÃ   rÐ   rf   r/   ÚsysÚexit)r®   Úsubcmdr3   s      r   râ   râ   $  s­  € å�T˜>¨4Ñ0Ô0€Fà€~˜ 6Ò)Ð)Ý˜4 ¨Ñ.Ô.ˆÝ�(ÑÔÐØˆqà�ÒÐÝ‰ŒˆØˆqà�ÒÐÝ‰ŒˆØˆqàÐ$Ð$Ð$Ý•'˜$ ¨$Ñ/Ô/µ¸¸wÈÑ1KÔ1KÑLÔLÐLØˆqà�ÒÐÝ˜DÑ!Ô!Ð!àÐ"Ð"Ð"Ý˜4Ñ Ô Ð à�ÒÐÝ˜‰ŒÐà�ÒÐÝ˜7 D¤K°Ñ:Ô:Ð:à�ÒÐÝ˜8 T¤[°)Ñ<Ô<Ð<à�‚€Ý˜5 $¤+¨{Ñ;Ô;Ð;àÐ+Ð+Ð+Ý˜8 T¤[°)Ñ<Ô<Ð<å	Ð
+ 6Ð
+Ð
+Ñ,Ô,Ð,Ý	Ð
ZÑ[Ô[Ð[Ý„HˆQ�K„K€K€K€Kr   )NN)r   N)F)Nrz   )&Ú__doc__r   rï   Úpathlibr   Útypingr   r   r   Ú__file__ÚparentÚresolveÚPROJECT_ROOTÚpathÚinsertr   Úhermes_cli.colorsr   r   Úcron.lifecycle_guardr	   Ú#_contains_gateway_lifecycle_commandr   r"   r*   r2   Úboolrs   ry   rŒ   r„   r“   r‹   r±   rÃ   rÐ   rà   râ   r   r   r   ú<module>rÿ      sX  ððð ð €€€Ø 
€
€
€
Ø Ð Ð Ð Ð Ð Ø +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +àˆt�H‰~Œ~Ô$Ô+×3Ò3Ñ5Ô5€Ø „‡‚��3�3�|Ñ$Ô$Ñ %Ô %Ð %à +Ð +Ð +Ð +Ð +Ð +Ð +Ð +ðð ð ð ð ð ð
ð °¸(À3¼-Ô1Hð ÐT\Ð]aÐbeÔ]fÔTgð ð ð ð ð .ð .ð .ð Cð ð ð ð ðGð Gð Gð GðBe#ð e#˜ð e#ð e#ð e#ð e#ðPð ð ð,ð ,�h˜s”mð ,°3ð ,ð ,ð ,ð ,ð$fð fð fðR	"ð 	"ð 	"ð 	"ð-ð -ð -ð`Eð Eð EðP˜ð  Sð ¸ð Àð ð ð ð ð*<˜#ð <ð <ð <ð <ð~,ð ,ð ,ð ,ð ,r   