ó
    |¤jðW  ã                  ój  • S r SSKJr  SSKrSSKrSSKrSSKrSSKrSSKrSSK	J
r
Jr  SSKJrJr  SSKJr  SSKJr  \" 5       r\S-  r\
 " S	 S
5      5       r\
 " S S5      5       r\
 " S S5      5       r\R.                  " S5      rSS jrSS jrSS jrSS jrSS jr    SS jr " S S5      rg)a3  Cron-style task scheduler for periodic skill execution.

Supports three scheduling modes:
- interval: `every 5m` / `every 30s` / `every 2h`
- specific time: `at 14:30` (next occurrence) / `at 2026-06-12T09:00`
- cron expression: `cron "0 9 * * 1-5"`

Jobs persist across sessions in ~/.acli/cron_jobs.json.
é    )ÚannotationsN)Ú	dataclassÚfield)ÚdatetimeÚ	timedelta)ÚConsole)Ú
CONFIG_DIRzcron_jobs.jsonc                  óT   • \ rS rSr% S\S'   \" \S9rS\S'   SS jr\	SS j5       r
S	rg
)ÚSkillInvocationé$   ÚstrÚname)Údefault_factoryú	list[str]Úargsc                ó4   • U R                   U R                  S.$ )N©r   r   r   ©Úselfs    Ú¦C:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\dashscope/acli/scheduler.pyÚto_dictÚSkillInvocation.to_dict)   s   € ØŸ	™	¨4¯9©9Ñ5Ð5ó    c                ó6   • U " US   UR                  S/ 5      S9$ )Nr   r   r   ©Úget©ÚclsÚds     r   Ú	from_dictÚSkillInvocation.from_dict,   s   € á˜˜&™	¨¯©¨f°bÓ(9Ñ:Ð:r   © N©ÚreturnÚdict)r   r%   r$   r   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__annotations__r   Úlistr   r   Úclassmethodr    Ú__static_attributes__r"   r   r   r   r   $   s/   ‡ à
ƒIÙ¨DÑ1€Dˆ)Ó1ô6ð ó;ó ó;r   r   c                  ór   • \ rS rSr% S\S'   S\S'   SrS\S'   SrS\S	'   SrS
\S'   SS jr\	SS j5       r
Srg)ÚScheduleSpecé1   r   ÚkindÚrawNúfloat | NoneÚinterval_secondsú
str | NoneÚat_datetimezlist[str] | NoneÚcron_fieldsc                óv   • U R                   U R                  U R                  U R                  U R                  S.$ )N©r1   r2   r4   r6   r7   r9   r   s    r   r   ÚScheduleSpec.to_dict9   s5   € à—I‘IØ—8‘8Ø $× 5Ñ 5Ø×+Ñ+Ø×+Ñ+ñ
ð 	
r   c           	     ó|   • U " US   US   UR                  S5      UR                  S5      UR                  S5      S9$ )Nr1   r2   r4   r6   r7   r9   r   r   s     r   r    ÚScheduleSpec.from_dictB   sB   € áØ�6‘Ø�%‘ØŸU™UÐ#5Ó6ØŸ™˜mÓ,ØŸ™˜mÓ,ñ
ð 	
r   r"   r#   )r   r%   r$   r/   )r&   r'   r(   r)   r*   r4   r6   r7   r   r,   r    r-   r"   r   r   r/   r/   1   sE   ‡ à
ƒIØ	ƒHØ%)Ð�lÓ)Ø"€K�Ó"Ø$(€KÐ!Ó(ô
ð ó
ó ó
r   r/   c                  ó´   • \ rS rSr% S\S'   S\S'   S\S'   SrS	\S
'   SrS\S'   SrS\S'   SrS\S'   Sr	S	\S'   Sr
S	\S'   SrS\S'   SS jr\SS j5       rSrg)ÚCronJobéM   r   Úidr/   Úscheduleúlist[SkillInvocation]ÚskillsNr5   Ú	conditionTÚboolÚsubagentÚenabledÚ Ú
created_atÚlast_runÚlast_resultr   ÚintÚ	run_countc                óF  • U R                   U R                  R                  5       U R                   Vs/ s H  oR                  5       PM     snU R                  U R
                  U R                  U R                  U R                  U R                  U R                  S.
$ s  snf )N©
r@   rA   rC   rD   rF   rG   rI   rJ   rK   rM   )r@   rA   r   rC   rD   rF   rG   rI   rJ   rK   rM   )r   Úss     r   r   ÚCronJob.to_dictZ   su   € à—'‘'ØŸ™×-Ñ-Ó/Ø,0¯KªKÓ8ªK q—y‘y–{©KÑ8ØŸ™ØŸ™Ø—|‘|ØŸ/™/ØŸ™Ø×+Ñ+ØŸ™ñ
ð 	
ùò 9s   ³Bc                ó„  • U " US   [         R                  US   5      US    Vs/ s H  n[        R                  U5      PM     snUR                  S5      UR                  SS5      UR                  SS5      UR                  SS	5      UR                  S
5      UR                  S5      UR                  SS5      S9
$ s  snf )Nr@   rA   rC   rD   rF   TrG   rI   rH   rJ   rK   rM   r   rO   )r/   r    r   r   )r   r   rP   s      r   r    ÚCronJob.from_dicth   s«   € áØ�‰wÜ!×+Ñ+¨A¨j©MÓ:Ø:;¸Hº+ÓFº+°Q”O×-Ñ-¨aÖ0¹+ÑFØ—e‘e˜KÓ(Ø—U‘U˜: tÓ,Ø—E‘E˜) TÓ*Ø—u‘u˜\¨2Ó.Ø—U‘U˜:Ó&ØŸ™˜mÓ,Ø—e‘e˜K¨Ó+ñ
ð 	
ùò Gs   ¥B=r"   r#   )r   r%   r$   r>   )r&   r'   r(   r)   r*   rD   rF   rG   rI   rJ   rK   rM   r   r,   r    r-   r"   r   r   r>   r>   M   sr   ‡ àƒGØÓØ!Ó!Ø €IˆzÓ Ø€HˆdÓØ€GˆTÓØ€J�ÓØ€HˆjÓØ"€K�Ó"Ø€IˆsÓô
ð ó
ó ó
r   r>   z^(\d+)\s*([smh])$c                óü   • [         R                  U R                  5       R                  5       5      nU(       d  [	        SU  S35      e[        UR                  S5      5      UR                  S5      p2USSSS.U   -  $ )Nzcannot parse interval: z (formats: 30s, 5m, 2h)é   é   é<   i  )rP   ÚmÚh)Ú_INTERVAL_REÚmatchÚstripÚlowerÚ
ValueErrorrL   Úgroup)rP   rX   ÚvalÚunits       r   Úparse_intervalrb   }   sj   € Ü×Ñ˜1Ÿ7™7›9Ÿ?™?Ó,Ó-€AÞÜÐ2°1°#Ð5LÐMÓNÐNÜ�A—G‘G˜A“J“ §¡¨£ˆØ�q˜r¨Ñ-¨dÑ3Ñ3Ð3r   c                óŠ  • U R                  5       n SU ;   d  U R                  S5      S:¼  a  [        R                  " U 5      $ U R	                  S5      n[        U5      S:w  a  [        SU  S35      e[        US   5      [        US   5      p2[        R                  " 5       nUR                  X#SSS	9nXT::  a  U[        SS
9-  nU$ )NÚTÚ-rV   Ú:zcannot parse time: z# (formats: 14:30, 2026-06-12T09:00)r   rU   )ÚhourÚminuteÚsecondÚmicrosecond©Údays)r\   Úcountr   ÚfromisoformatÚsplitÚlenr^   rL   ÚnowÚreplacer   )rP   ÚpartsrY   rX   rq   Ú	candidates         r   Úparse_at_timeru   …   s¹   € Ø	�‰‹	€AØ
ˆaƒx�A—G‘G˜C“L AÓ%Ü×%Ò% aÓ(Ð(Ø�G‰G�C‹L€EÜ
ˆ5ƒz�QƒÜØ! ! Ð$GÐHó
ð 	
ô ˆu�Q‰x‹=œ#˜e A™h›-€qÜ
�,Š,‹.€CØ—‘ °QÀA�ÐF€IØÓØ”Y AÑ&Ñ&ˆ	ØÐr   c           	     ó0  • [        5       nU R                  S5       Hö  nUR                  5       nUS:X  a  UR                  [	        XS-   5      5        M8  UR                  S5      (       aB  [        USS  5      nUS::  a  [        SU 35      eUR                  [	        XS-   U5      5        M�  SU;   aF  UR                  SS5      u  pgUR                  [	        [        U5      [        U5      S-   5      5        MÜ  UR                  [        U5      5        Mø     U$ )	NÚ,Ú*rU   z*/rV   r   zcron step must be > 0: re   )	Úsetro   r\   ÚupdateÚrangeÚ
startswithrL   r^   Úadd)Ú	field_strÚloÚhiÚvaluesÚpartÚstepÚaÚbs           r   Ú_parse_cron_fieldr†   ™   sá   € Ü“u€FØ—‘ Ö$ˆØ�z‰z‹|ˆØ�3‹;Ø�M‰Mœ% ¨¡FÓ+Ö,Ø�_‰_˜T×"Ñ"Ü�t˜A˜B�x“=ˆDØ�q‹yÜ Ð#:¸4¸&Ð!AÓBÐBØ�M‰Mœ% ¨¡F¨DÓ1Ö2Ø�D‹[Ø—:‘:˜c 1Ó%‰DˆAØ�M‰Mœ%¤ A£¬¨A«°©
Ó3Ö4à�J‰J”s˜4“yÖ!ñ %ð €Mr   c                ó    • [        U SS5      n[        5       nU H0  nUS;   a  UR                  S5        M  UR                  US-
  5        M2     U$ )uI   cron day-of-week (0=Sun..6=Sat, 7=Sun) â†’ Python weekday
(0=Mon..6=Sun).r   é   )r   rˆ   é   rU   )r†   ry   r}   )r~   r2   Úpython_dowsr   s       r   Ú_expand_dowr‹   ¬   sN   € ô ˜I q¨!Ó
,€CÜ›E€KÛˆØ�‹;Ø�O‰O˜AÖà�O‰O˜A ™EÖ"ñ	 ð
 Ðr   c                ó  • [        [        U S   SS5      5      n[        [        U S   SS5      5      n[        U S   SS5      n[        U S   SS5      n[        U S	   5      nUR                  SSS
9[	        SS9-   nUn[        S5       H  n	UR                  U;   aR  UR                  U;   aB  UR                  5       U;   a.  U H(  n
U H  nUR                  X«S9nXÇ:¼  d  M  Us  s  s  $    M*     U[	        SS9-   R                  SSS9nM�     g )Nr   é;   rU   é   rV   é   é   é   é   )ri   rj   )ÚminutesiÞ  )rg   rh   rk   )	Úsortedr†   r‹   rr   r   r{   ÚmonthÚdayÚweekday)ÚfieldsÚafterr“   ÚhoursÚdomsÚmonthsÚdowsÚearliestr–   Ú_rg   rh   rt   s                r   Únext_cron_firer    ¹   s  € ÜÔ& v¨a¡y°!°RÓ8Ó9€GÜÔ$ V¨A¡Y°°2Ó6Ó7€EÜ˜V A™Y¨¨2Ó.€DÜ˜v a™y¨!¨RÓ0€FÜ�v˜a‘yÓ!€Dà�}‰} A°1ˆ}Ð5¼	È!Ñ8LÑL€HØ
€Cô �7Ž^ˆØ�9‰9˜Ó 3§7¡7¨d£?°s·{±{³}ÈÓ7LÛ�Û%�FØ #§¡° Ð E�IØ Õ,Ø(Ö(ó &ñ ð
 ”Y AÑ&Ñ&×/Ñ/°Q¸qÐ/ÐAŠñ ð r   c                ó\  • [         R                  " U [        R                  S:g  S9nS n/ nS nSnSnU[	        U5      :  GaÅ  X   nUS;   aÊ  US-   [	        U5      :¼  a  [        U S35      eXS-      nUS:X  a  [        U5      n	[        S	S
U 3U	S9nO}US:X  a(  [        U5      n
[        SSU 3U
R                  5       S9nOOUS:X  aI  UR                  5       R                  5       n[	        U5      S:w  a  [        SU 35      e[        SSU 3US9nUS-  nOßUS:X  a*  US-   [	        U5      :¼  a  [        S5      eXS-      nUS-  nO¯US:X  a  SnUS-  nO¡US:X  a�  US-  nU[	        U5      :¼  a  [        S5      eX   nUS-  n/ nU[	        U5      :  a9  X   S;  a1  UR                  X   5        US-  nU[	        U5      :  a
  X   S;  a  M1  UR                  [        XÍ5      5        O[        SU 35      eU[	        U5      :  a  GMÅ  U(       d  [        S5      eU(       d  [        S5      eX#XE4$ )NÚnt)ÚposixTr   )ÚeveryÚatÚcronrU   z requires an argumentr¤   Úintervalzevery )r1   r2   r4   r¥   zat )r1   r2   r6   r¦   é   z cron expression needs 5 fields: zcron )r1   r2   r7   rV   rD   zcondition requires an argumentúno-subagentFÚskillzskill requires a skill name)rª   r¤   r¥   r¦   rD   r©   zunknown argument: z*a schedule is required: every, at, or cronzat least one skill is required)Úshlexro   Úosr   rp   r^   rb   r/   ru   Ú	isoformatr\   Úappendr   )Úargs_strÚtokensrA   rC   rD   rF   ÚiÚtokr`   ÚsecsÚdtrs   r   Ú
skill_argss                 r   Úparse_cron_addr¶   Ò   ss  € ô �[Š[˜¬¯©°D©Ñ9€Fà$(€HØ$&€FØ €IØ€Hà	€AØ
Œc�&‹kŒ/Ø‰iˆØÐ)Ó)Ø�1‰uœ˜F›Ó#Ü  C 5Ð(=Ð!>Ó?Ð?Ø˜Q™‘-ˆCØ�g‹~Ü% cÓ*�Ü'Ø#Ø   ˜Ø%)ñ‘ð
 ˜“Ü" 3Ó'�Ü'ØØ˜c˜U˜Ø "§¡£ñ‘ð
 ˜“ØŸ	™	›×)Ñ)Ó+�Ü�u“: “?Ü$Ð'GÈÀuÐ%MÓNÐNÜ'ØØ ˜u˜Ø %ñ�ð
 �‰F‰AØ�KÓØ�1‰uœ˜F›Ó#Ü Ð!AÓBÐBØ 1™u™ˆIØ�‰F‰AØ�MÓ!ØˆHØ�‰F‰AØ�G‹^Ø�‰FˆAØ”C˜“KÓÜ Ð!>Ó?Ð?Ø‘9ˆDØ�‰FˆAØ$&ˆJØ”c˜&“k“/ f¡ið 8ó 'ð ×!Ñ! &¡)Ô,Ø�Q‘�ð ”c˜&“k“/ f¡ið 8õ 'ð �M‰Mœ/¨$Ó;Õ<äÐ1°#°Ð7Ó8Ð8ðs Œc�&‹kŽ/öv ÜÐEÓFÐFÞÜÐ9Ó:Ð:à˜YÐ0Ð0r   c                  óº   • \ rS rSrS rSS jrSS jr          SS jrSS jrSS jr	SS jr
SS	 jrSS
 jrSS jrSS jrSS jrSS jrSS jrSS jrSrg)Ú	Scheduleri#  c                óF   • Xl         X l        0 U l        0 U l        / U l        g ©N)ÚconfigÚagentÚjobsÚ_tasksÚ_pending_prompts)r   r»   r¼   s      r   Ú__init__ÚScheduler.__init__$  s"   € ØŒØŒ
Ø(*ˆŒ	Ø/1ˆŒØ+-ˆÕr   c              ƒ  óÒ  #   • [         R                  5       (       ac   [        R                  " [         R	                  SS95      nUR                  5        H'  u  p#[        R                  U5      U R                  U'   M)     U R                  R                  5        H)  u  p$UR                  (       d  M  U R                  U5        M+     g ! [        R                  [        4 a     Ndf = f7f)Núutf-8©Úencoding)Ú_PERSIST_PATHÚexistsÚjsonÚloadsÚ	read_textÚitemsr>   r    r½   ÚJSONDecodeErrorÚKeyErrorrG   Ú_start_job_task)r   ÚdataÚjidÚjdÚjobs        r   Úload_and_startÚScheduler.load_and_start+  s­   é € Ü×Ñ×!Ñ!ðÜ—z’z¤-×"9Ñ"9À7Ð"9Ð"KÓL�Ø#Ÿz™zž|‘G�CÜ%,×%6Ñ%6°rÓ%:�D—I‘I˜c“Nñ  ,ð
 Ÿ	™	Ÿ™Ö)‰HˆCØ�{�{‰{Ø×$Ñ$ SÖ)ò *øô ×(Ñ(¬(Ð3ó Ùðüs/   ‚C'�A"C Á?.C'Â1C'ÃC$Ã!C'Ã#C$Ã$C'c              ƒ  ó4  #   • U R                   R                  5        H  nUR                  5         M     U R                   (       a6  [        R                  " U R                   R                  5       SS06I S h  v•N   U R                   R                  5         g  N7f)NÚreturn_exceptionsT)r¾   r�   ÚcancelÚasyncioÚgatherÚclear)r   Útasks     r   ÚshutdownÚScheduler.shutdown8  sf   é € Ø—K‘K×&Ñ&Ö(ˆDØ�K‰KŽMñ )à�;�;Ü—.’. $§+¡+×"4Ñ"4Ó"6ÐOÈ$ÑO×OÐOØ�‰×ÑÕñ Pùs   ‚A4BÁ6BÁ7 Bc           
     ó  • [        [        R                  " S5      UUUUS[        R                  " 5       R                  5       S9nXPR                  UR                  '   U R                  5         U R                  UR                  5        U$ )Nr�   T)r@   rA   rC   rD   rF   rG   rI   )
r>   ÚsecretsÚ	token_hexr   rq   r­   r½   r@   Ú_persistrÎ   )r   rA   rC   rD   rF   rÒ   s         r   Úadd_jobÚScheduler.add_job?  so   € ô Ü× Ò  Ó#ØØØØØÜ—|’|“~×/Ñ/Ó1ñ
ˆð  �	‰	�#—&‘&ÑØ�‰ŒØ×Ñ˜SŸV™VÔ$Øˆ
r   c                óÄ   • XR                   ;  a  gU R                  R                  US 5      nU(       a  UR                  5         U R                   U	 U R	                  5         g©NFT)r½   r¾   Úpopr×   rá   ©r   Újob_idrÛ   s      r   Ú
remove_jobÚScheduler.remove_jobT  sG   € ØŸ™Ó"ØØ�{‰{�‰˜v tÓ,ˆÞØ�K‰KŒMØ�I‰I�fÐØ�‰ŒØr   c                óÒ   • XR                   ;  a  gSU R                   U   l        U R                  R                  US 5      nU(       a  UR	                  5         U R                  5         grå   )r½   rG   r¾   ræ   r×   rá   rç   s      r   Ú	pause_jobÚScheduler.pause_job^  sL   € ØŸ™Ó"ØØ$)ˆ�	‰	�&ÑÔ!Ø�{‰{�‰˜v tÓ,ˆÞØ�K‰KŒMØ�‰ŒØr   c                óŽ   • XR                   ;  a  gSU R                   U   l        U R                  U5        U R                  5         grå   )r½   rG   rÎ   rá   )r   rè   s     r   Ú
resume_jobÚScheduler.resume_jobh  s:   € ØŸ™Ó"ØØ$(ˆ�	‰	�&ÑÔ!Ø×Ñ˜VÔ$Ø�‰ŒØr   c                óX   • U R                   S S  nU R                   R                  5         U$ rº   )r¿   rÚ   )r   Úpromptss     r   Úget_pending_promptsÚScheduler.get_pending_promptsp  s)   € Ø×'Ñ'©Ð*ˆØ×Ñ×#Ñ#Ô%Øˆr   c           	     óÌ  • U R                   (       d+  [        R                  S5        [        R                  S5        g [        R                  S5        U R                   R                  5        GHt  nUR                  (       a  SOSnSR                  S UR                   5       5      n[        R                  SUR                   S	U S
UR                  R                   35        [        R                  SU 35        UR                  (       a"  [        R                  SUR                   35        UR                  (       a"  [        R                  SUR                   35        UR                  (       a8  UR                  S S R                  SS5      n[        R                  SU S35        [        R                  SUR                   35        [        R                  5         GMw     g )Nz[dim]No scheduled jobs[/dim]z;[dim]Usage: /cron add every 5m skill weather Hangzhou[/dim]u    [bold]ðŸ“‹ Scheduled jobs[/bold]z[green]running[/green]z[yellow]paused[/yellow]ú, c              3  ó8   #   • U  H  oR                   v •  M     g 7frº   ©r   )Ú.0rP   s     r   Ú	<genexpr>Ú'Scheduler.print_jobs.<locals>.<genexpr>…  s   é € Ð#?²J¨q§F¦F²Jùó   ‚z  [ú] z  z    skills: z    condition: z    last run: éP   Ú
Ú z    result: ú...z
    runs: )r½   ÚconsoleÚprintr�   rG   ÚjoinrC   r@   rA   r2   rD   rJ   rK   rr   rM   )r   rÒ   ÚstatusÚskill_namesÚresult_previews        r   Ú
print_jobsÚScheduler.print_jobsu  sW  € Ø�y�yÜ�M‰MÐ8Ô9Ü�M‰Mð)ôð ä�‰Ð8Ô9Ø—9‘9×#Ñ#×%ˆCð —;—;ñ )à.ð ð
 Ÿ)™)Ñ#?°C·J²JÓ#?Ó?ˆKÜ�M‰M˜C §¡˜x r¨&¨°°C·L±L×4DÑ4DÐ3EÐFÔGÜ�M‰M˜L¨¨Ð6Ô7Ø�}�}Ü—‘ °·±¨Ð?Ô@Ø�|�|Ü—‘ ¨s¯|©|¨nÐ=Ô>Ø��Ø!$§¡°°"Ð!5×!=Ñ!=¸dÀCÓ!H�Ü—‘ ¨^Ð,<¸CÐ@ÔAÜ�M‰M˜J s§}¡} oÐ6Ô7Ü�M‰M�Oò# &r   c                óö   ^ ^• TT R                   ;   a  T R                   T   R                  5         [        R                  " T R	                  T5      5      nUR                  UU 4S j5        UT R                   T'   g )Nc                ó(   >• TR                  TU 5      $ rº   )Ú_on_job_done)Útrè   r   s    €€r   Ú<lambda>Ú+Scheduler._start_job_task.<locals>.<lambda>˜  s   ø€ ¨×):Ñ):¸6À1Ô)Er   )r¾   r×   rØ   Úcreate_taskÚ	_job_loopÚadd_done_callbackrç   s   `` r   rÎ   ÚScheduler._start_job_task”  sZ   ù€ Ø�T—[‘[Ó Ø�K‰K˜Ñ×&Ñ&Ô(Ü×"Ò" 4§>¡>°&Ó#9Ó:ˆØ×ÑÕEÔFØ"ˆ�‰�FÒr   c                ó"  • UR                  5       (       a  g UR                  5       nUb(  [        SU S[        U5      R                   SU 35        g XR
                  ;   a/  U R
                  U   R                  (       a  [        SU S35        g g g )Nz
[CRON] job z exited unexpectedly: ú: z! ended (schedule may be one-shot))Ú	cancelledÚ	exceptionr  Útyper&   r½   rG   )r   rè   rÛ   Úexcs       r   r  ÚScheduler._on_job_done›  s‡   € Ø�>‰>×ÑØØ�n‰nÓˆØ‰?ÜØ ˜xÐ'=Ü˜“9×%Ñ%Ð& b¨¨ð/õð —y‘yÓ  T§Y¡Y¨vÑ%6×%>×%>Ü�M & Ð)JÐKÕLð &?Ð r   c           	   ƒ  ó  #   • U R                   U   n  U R                  U5      nUc  SUl        U R                  5         g [        R
                  " U5      I S h  v•N   UR                  (       d  g  [        R                  " U R                  U5      SS9I S h  v•N   UR"                  R,                  S:X  a  SUl        U R                  5         g M½   Nw N:! [        R                   aŸ    [        R                  " 5       R                  5       Ul        SUl        U=R                  S-  sl        U R                  5         [        SUR                    S35        [        SUR"                  R$                   S	UR                   35         Nê[&         aØ  n[        R                  " 5       R                  5       Ul        S
[)        U5      R*                   SU 3Ul        U=R                  S-  sl        U R                  5         [        SUR                    S[)        U5      R*                   SU 35        [        SUR"                  R$                   S	UR                   35         S nAGNÆS nAff = f! [        R.                   a     g f = f7f)NFg     Àr@©Útimeoutzexecution timed out (>300s)rU   ú
[CRON z/] timeout: job ran over 300s and was terminatedú  schedule: õ	    Â· run #zexecution error: r  z
] failed: r¥   )r½   Ú_seconds_until_next_firerG   rá   rØ   ÚsleepÚwait_forÚ_execute_jobÚTimeoutErrorr   rq   r­   rJ   rK   rM   r  r@   rA   r2   Ú	Exceptionr  r&   r1   ÚCancelledError)r   rè   rÒ   ÚdelayÚes        r   r  ÚScheduler._job_loop§  s4  é € Ø�i‰i˜Ñˆð2	ØØ×5Ñ5°cÓ:�Ø‘=Ø"'�C”KØ—M‘M”OØÜ—m’m EÓ*×*Ð*Ø—{—{Øð"ä!×*Ò*Ø×)Ñ)¨#Ó.Ø %ñ÷ ð ðB —<‘<×$Ñ$¨Ó,Ø"'�C”KØ—M‘M”OØñ_ ñ +ñ
øô ×+Ñ+ó Ü#+§<¢<£>×#;Ñ#;Ó#=�C”LØ&C�C”OØ—M’M QÑ&•MØ—M‘M”OÜØ" 3§6¡6 (ð +2ð 3ôô Ø& s§|¡|×'7Ñ'7Ð&8ð 9#Ø#&§=¡= /ð3öô !ó ä#+§<¢<£>×#;Ñ#;Ó#=�C”Là+¬D°«G×,<Ñ,<Ð+=¸RÀ¸sÐCð ”Oð —M’M QÑ&•MØ—M‘M”OÜØ" 3§6¡6 (¨*Ü ›7×+Ñ+Ð,¨B¨q¨cð3ôô Ø& s§|¡|×'7Ñ'7Ð&8ð 9#Ø#&§=¡= /ð3÷ò ûðûô( ×%Ñ%ó 	Ùð	üs•   ‚J“,I+ ¿JÁ I+ ÁCÁI+ Á/JÁ1'C ÂCÂC Â1I+ ÃJÃI+ ÃC ÃB0I(ÆI+ Æ	I(ÆCI#ÉI+ É#I(É(I+ É+JÉ?JÊJÊJc                ó�  • [         R                  " 5       nUR                  R                  nUS:X  a  UR                  R                  =(       d    S$ US:X  aŽ  UR                  R
                  (       d  g [         R                  " UR                  R
                  5      nUR                  b  UR                  5       R                  S S9nXB-
  R                  5       n[        SU5      $ US:X  a\  UR                  R                  (       d  g [        UR                  R                  U5      nUc  g [        SXb-
  R                  5       5      $ g )Nr§   g      N@r¥   )Útzinfog        r¦   )r   rq   rA   r1   r4   r6   rn   r,  Ú
astimezonerr   Útotal_secondsÚmaxr7   r    )r   rÒ   rq   r1   ÚtargetÚdeltaÚfires          r   r!  Ú"Scheduler._seconds_until_next_fireÝ  sþ   € Ü�lŠl‹nˆØ�|‰|× Ñ ˆà�:ÓØ—<‘<×0Ñ0×8°DÐ8à�4‹<Ø—<‘<×+×+ØÜ×+Ò+¨C¯L©L×,DÑ,DÓEˆFð �}‰}Ñ(Ø×*Ñ*Ó,×4Ñ4¸DÐ4ÐA�Ø‘\×0Ñ0Ó2ˆEÜ�s˜E“?Ð"à�6‹>Ø—<‘<×+×+ØÜ! #§,¡,×":Ñ":¸CÓ@ˆDØ‰|ØÜ�s˜T™Z×6Ñ6Ó8Ó9Ð9àr   c              ƒ  ó†  #   • [        SUR                   S35        [        U R                  SS5      (       an  SUl        [
        R                  " 5       R                  5       Ul        U=R                  S-  sl	        U R                  5         [        SUR                   S35        g UR                  (       aÑ   [        R                  " UR                  [        R                  R                  [        R                  R                  S	9I S h  v•N nUR!                  5       I S h  v•N nUS
:w  aY  SU S3Ul        [
        R                  " 5       R                  5       Ul        U=R                  S-  sl	        U R                  5         g  S
SKJnJn  UR*                   H×  nUR-                  UR.                  5      nU(       d  M'  UR0                  (       d  M:  S
SKJn	Jn
  UR0                  U
;  d  MT  [        SUR                   SUR0                   S35         [        R8                  " U	" UR0                  U R                  5      SS9I S h  v•N nU(       a  [        SUR                   SU 35        M×  MÙ     / nUR*                   GH]  nUR-                  UR.                  5      nU(       d   UR=                  SUR.                   35        MF  UR0                  (       aD  S
SKJn
  UR0                  U
;  a.  UR=                  SUR.                   SUR0                   S35        M›  U" X‡R>                  5      nU(       dE  SRA                  S URB                   5       5      nUR=                  SUR.                   SU 35        Mù  URD                  (       a%  S
SK#J$n  U" US UR.                   S!3S"S#9I S h  v•N nOU RJ                  R=                  U5        S$nUR=                  U5        GM`     [
        R                  " 5       R                  5       Ul        S%RA                  U5      S S& Ul        U=R                  S-  sl	        U R                  5         S'RA                  S( UR*                   5       5      nS)RA                  U5      n[        S*UR                   S+U 35        [        S,URL                  RN                   S-UR                   35        [        S.5        [        U5        [        S.5        g  GNá GNÌ! ["         aL  nSU 3Ul        [
        R                  " 5       R                  5       Ul        U R                  5          S nAg S nAff = f GN! [        R:                   a*    [        SUR                   SUR0                   35         GMï  ["         a'  n[        SUR                   SU 35         S nAGM  S nAff = f GN7f)/Nr  z] starting...Úprivacy_modeFzAskipped: privacy mode on, cron jobs do not run cloud capabilitiesrU   z[CRON z] skipped (privacy mode))ÚstdoutÚstderrr   zcondition not met (exit Ú)zcondition check error: )ÚBUILTIN_SKILLSÚrender_skill)Ú_connect_mcpÚ_mcp_clientsz] connecting MCP: r  g      >@r  z] MCP connect failed: z] MCP connect timeout: z] MCP connect error: zunknown skill: )r<  zskipped z: requires MCP service z (connect failed)r   c              3  ó.   #   • U  H  nS U S3v •  M     g7f)Ú<Ú>Nr"   )rù   r„   s     r   rú   Ú)Scheduler._execute_job.<locals>.<genexpr>S  s   é € Ð#F²o° a¨ s¨!¥H²oùs   ‚zmissing args: /skill )Ú_subagent_invokez>You are the execution agent for a scheduled job. Current job: z3. Output the result directly, no extra explanation.é   )ÚpromptÚsystem_promptÚ	max_turnsz!(queued to the main conversation)z
---
iô  rö   c              3  ó8   #   • U  H  oR                   v •  M     g 7frº   rø   )rù   Úinvs     r   rú   r@  q  s   é € Ð?²J¨S§¦²Jùrü   z

u   
â�° [CRON rý   r  r   u´   â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€)(r  r@   Úgetattrr»   rK   r   rq   r­   rJ   rM   rá   rD   rØ   Úcreate_subprocess_shellÚ
subprocessÚDEVNULLÚwaitr&  Údashscope.acli.skills.baser9  r:  rC   r   r   Úmcp_serviceÚdashscope.acli.clir;  r<  r#  r%  r®   r   r  Ú	argumentsrF   Údashscope.acli.agents.subagentrA  r¿   rA   r2   )r   rÒ   ÚprocÚ	exit_coder)  r9  r:  rG  rª   r;  r<  ÚerrÚresultsÚrenderedÚarg_hintrA  Úresultr  Úcontents                      r   r$  ÚScheduler._execute_jobù  sÈ  é € Ü�˜Ÿ™˜ Ð.Ô/ô
 �4—;‘; °×6Ñ6ð%ð ŒOô $Ÿ<š<›>×3Ñ3Ó5ˆCŒLØ�MŠM˜QÑ�MØ�M‰MŒOÜ�F˜3Ÿ6™6˜(Ð":Ð;Ô<Øð �=�=ðÜ$×<Ò<Ø—M‘MÜ"×-Ñ-×5Ñ5Ü"×-Ñ-×5Ñ5ñ÷ �ð
 #'§)¡)£+×-�	Ø “>Ø(@ÀÀÈ1Ð&M�C”OÜ#+§<¢<£>×#;Ñ#;Ó#=�C”LØ—M’M QÑ&•MØ—M‘M”OØð "÷ 	Là—:”:ˆCØ"×&Ñ& s§x¡xÓ0ˆEßˆu˜×*×*Ñ*ßIà×$Ñ$¨LÕ8ÜØ  §¡ Ð(:Ø ×,Ñ,Ð-¨Sð2ôðIÜ$+×$4Ò$4Ù(¨×):Ñ):¸D¿K¹KÓHØ$(ñ%÷ ˜ö Ü!Ø"(¨¯©¨ð 1+Ø+.¨%ð!1öñ ñ ð: ˆØ—:•:ˆCØ"×&Ñ& s§x¡xÓ0ˆEÞØ—‘ °·±°
Ð;Ô<Ùð × × Ý;à×$Ñ$¨LÓ8Ø—N‘NØ" 3§8¡8 *Ð,CØ ×,Ñ,Ð-Ð->ð@ôñ á# E¯8©8Ó4ˆHÞØŸ8™8Ñ#F°e·o²oÓ#FÓF�Ø—‘Ø+¨C¯H©H¨:°Q°x°jÐAôñ à�|�|ÝKá/Ø#ð-Ø-0¯X©X¨Jð 7AðBð !ñ ÷ ‘ð ×%Ñ%×,Ñ,¨XÔ6Ø<�à�N‰N˜6×"ñS ôV  —|’|“~×/Ñ/Ó1ˆŒØ#Ÿ.™.¨Ó1°$°3Ð7ˆŒØ�Š˜Ñ�Ø�‰Œð —i‘iÑ?°C·J²JÓ?Ó?ˆØ—+‘+˜gÓ&ˆÜ�˜SŸV™V˜H B { mÐ4Ô5Ü�˜SŸ\™\×-Ñ-Ð.¨i¸¿¹°ÐGÔHÜˆjÔÜˆgŒÜˆjÕòUò
 .øô ó Ø$;¸A¸3Ð"?�”Ü'Ÿ|š|›~×7Ñ7Ó9�”Ø—‘”Üûð	úò(øô #×/Ñ/ó ÜØ$ S§V¡V Hð -(Ø(-×(9Ñ(9Ð':ð<÷ð ô %ó IÜ  s§v¡v hÐ.CÀAÀ3ÐG×HÓHûðIúòBùs¿   ‚B5WÂ8AS2 ÄS,ÄS2 Ä#S/Ä$A"S2 Æ9WÇWÇWÇ0&WÈ3UÉ
UÉ&UÉ1D=WÎ.V>Î/D=WÓ,S2 Ó/S2 Ó2
UÓ<AUÔ>WÕUÕWÕUÕ9V;ÖWÖ	V;ÖV6Ö/WÖ6V;Ö;Wc                óN  • [         R                  " SSS9  U R                  R                  5        VVs0 s H  u  pXR	                  5       _M     nnn[
        R                  S5      nUR                  [        R                  " USSS9SS9  UR                  [
        5        g s  snnf )	NT)ÚparentsÚexist_okz	.json.tmpFrV   )Úensure_asciiÚindentrÃ   rÄ   )r	   Úmkdirr½   rË   r   rÆ   Úwith_suffixÚ
write_textrÈ   Údumpsrr   )r   rÐ   rÒ   rÏ   Útmps        r   rá   ÚScheduler._persisty  s†   € Ü×Ò °Ò5Ø37·9±9·?±?Ô3DÔEÒ3D¡x s�—[‘[“]Ò"Ñ3DˆÑEÜ×'Ñ'¨Ó4ˆØ�‰Ü�JŠJ�t¨%¸Ñ:Øð 	ñ 	
ð 	�‰”MÕ"ùó Fs   ³B!)r¿   r¾   r¼   r»   r½   N)r$   ÚNone)
rA   r/   rC   rB   rD   r5   rF   rE   r$   r>   )rè   r   r$   rE   )r$   r   )rè   r   r$   rf  )rè   r   rÛ   zasyncio.Taskr$   rf  )rÒ   r>   r$   r3   )rÒ   r>   r$   rf  )r&   r'   r(   r)   rÀ   rÓ   rÜ   râ   ré   rì   rï   ró   r  rÎ   r  r  r!  r$  rá   r-   r"   r   r   r¸   r¸   #  s�   † ò.ô*ôðàðð &ðð ð	ð
 ðð 
ôô*ôôôô
ô>#ô
Mô4ôlô8~÷@#r   r¸   )rP   r   r$   Úfloat)rP   r   r$   r   )r~   r   r   rL   r€   rL   r$   úset[int])r~   r   r$   rh  )r˜   r   r™   r   r$   zdatetime | None)r¯   r   r$   z<tuple[ScheduleSpec, list[SkillInvocation], str | None, bool]) Ú__doc__Ú
__future__r   rØ   rÈ   r¬   Úrerß   r«   Údataclassesr   r   r   r   Úrich.consoler   Údashscope.acli.configr	   r  rÆ   r   r/   r>   ÚcompilerZ   rb   ru   r†   r‹   r    r¶   r¸   r"   r   r   Ú<module>rp     sÚ   ðñõ #ã Û Û 	Û 	Û Û ß (ß (å  å ,á
‹)€àÐ-Ñ-€ð
 ÷	;ð 	;ó ð	;ð ÷
ð 
ó ð
ð6 ÷'
ð '
ó ð'
ðX �zŠzÐ.Ó/€ô4ôô(ô&
ôð2K1ØðK1àAôK1÷b^#ò ^#r   