
    i'                        d Z ddlZddlZddlZddlZddlZddlZddlZddl	Z		 ddl
Z
n # e$ r dZ
	 ddlZn# e$ r dZY nw xY wY nw xY wddlmZ ddlmZmZ e	j                            d e ee          j        j                             ddlmZ ddlmZ ddlmZ  ej        e          Z de!d	e!d
e"e         dz  fdZ# e$h d          Z%dddddddddddddddZ&ddiZ'ddl(m)Z)m*Z*m+Z+m,Z, dZ- e            Z.e.dz  Z/e/d z  Z0de!d
ee!         fd!Z1d"ed
efd#Z2de!d$ed
ee!         fd%Z3d
efd&Z4de!d
ee!         fd'Z5de!d
ee!         fd(Z6 e$h d)          Z7 e$h d*          Z8	 d?d+ed,e"d-e!dz  de!d
df
d.Z9d@de!d/ed
ee         fd0Z:d1Z;e;Z<d
e=fd2Z>d3ed
e?e@ef         fd4ZAd5ed
e@fd6ZBd?de!d7ee?         d
efd8ZCde!d
e?e@eeee         f         fd9ZDdAd;e@d
e=fd<ZEed=k    r eEd:>           dS dS )Ba  
Cron job scheduler - executes due jobs.

Provides tick() which checks for due jobs and runs them. The gateway
calls this every 60 seconds from a background thread.

Uses a file-based lock (~/.hermes/cron/.tick.lock) so only one tick
runs at a time if multiple processes overlap.
    NPath)ListOptionalget_hermes_home)load_config)nowjobcfgreturnc                     |                      d          }|r|S 	 ddlm} t           ||pi d                    S # t          $ r&}t
                              d|           Y d}~dS d}~ww xY w)u>  Resolve the toolset list for a cron job.

    Precedence:
    1. Per-job ``enabled_toolsets`` (set via ``cronjob`` tool on create/update).
       Keeps the agent's job-scoped toolset override intact — #6130.
    2. Per-platform ``hermes tools`` config for the ``cron`` platform.
       Mirrors gateway behavior (``_get_platform_tools(cfg, platform_key)``)
       so users can gate cron toolsets globally without recreating every job.
    3. ``None`` on any lookup failure — AIAgent loads the full default set
       (legacy behavior before this change, preserved as the safety net).

    _DEFAULT_OFF_TOOLSETS ({moa, homeassistant, rl}) are removed by
    ``_get_platform_tools`` for unconfigured platforms, so fresh installs
    get cron WITHOUT ``moa`` by default (issue reported by Norbert —
    surprise $4.63 run).
    enabled_toolsetsr   )_get_platform_toolscronzHCron toolset resolution failed, falling back to full default toolset: %sN)gethermes_cli.tools_configr   sorted	Exceptionloggerwarning)r   r   per_jobr   excs        3/home/ubuntu/.hermes/hermes-agent/cron/scheduler.py_resolve_cron_enabled_toolsetsr   ,   s    " gg())G ??????))#)V<<===   V	
 	
 	
 ttttts    < 
A,A''A,>   smsemailqqbotslackwecomfeishumatrixsignalweixindiscordwebhookyuanbaodingtalktelegramwhatsapp
mattermostbluebubbleshomeassistantwecom_callbackMATRIX_HOME_ROOMTELEGRAM_HOME_CHANNELDISCORD_HOME_CHANNELSLACK_HOME_CHANNELSIGNAL_HOME_CHANNELMATTERMOST_HOME_CHANNELSMS_HOME_CHANNELEMAIL_HOME_ADDRESSDINGTALK_HOME_CHANNELFEISHU_HOME_CHANNELWECOM_HOME_CHANNELWEIXIN_HOME_CHANNELBLUEBUBBLES_HOME_CHANNELQQBOT_HOME_CHANNEL)r"   r)   r%   r   r#   r+   r   r   r(   r!   r    r$   r,   r   QQ_HOME_CHANNEL)get_due_jobsmark_job_runsave_job_outputadvance_next_runz[SILENT]r   z
.tick.lockc                     |                      d          }|sdS |                     d          }|                     d          }|r|r|S dS )zFExtract origin info from a job, preserving any extra routing metadata.originNplatformchat_id)r   )r   rC   rD   rE   s       r   _resolve_originrF   }   s[    WWXF tzz*%%Hjj##G G 4    platform_namec                     t                               |                                           }|sdS t          j        |d          }|s1t
                              |          }|rt          j        |d          }|S )zGReturn the configured home target chat/room ID for a delivery platform. )_HOME_TARGET_ENV_VARSr   lowerosgetenv_LEGACY_HOME_TARGET_ENV_VARS)rH   env_varvaluelegacys       r   _get_home_target_chat_idrS      sx    #''(;(;(=(=>>G rIgr""E *-11':: 	*Ifb))ELrG   deliver_valuec                    t          |           }|dk    rdS |dk    r|r2|d         t          |d                   |                    d          dS t          D ]_}t	          |          }|rLt
                              d|                     d	|                     d
d                    |           ||ddc S `dS d|v r|                    dd          \  }}|                                }ddl	m
}  |||          \  }}	}
|
r||	}}n|d}}	 ddlm}  |||          }|r |||          \  }}	}|r|}|	|	}n|}n# t          $ r Y nw xY w|||dS |}|rE|                    d          |k    r,|t          |d                   |                    d          dS |                                t          vrdS t	          |          }|sdS ||ddS )z9Resolve one concrete auto-delivery target for a cron job.localNrC   rD   rE   	thread_id)rD   rE   rW   zJJob '%s' has deliver=origin but no origin; falling back to %s home channelnameid?:   r   )_parse_target_ref)resolve_channel_name)rF   strr   rK   rS   r   infosplitrL   tools.send_message_toolr]   gateway.channel_directoryr^   r   _KNOWN_DELIVERY_PLATFORMS)r   rT   rC   rH   rE   restplatform_keyr]   parsed_chat_idparsed_thread_idis_explicitrW   r^   resolvedresolved_is_explicits                  r   _resolve_single_delivery_targetrl      s    S!!Ft   	":.vi011#ZZ44   3 	 	M.}==G 
`GGFCGGD#$6$677!   !.&!%    
 t
m+11#q99t$**,,======8I8I,X\8]8]5(+ 	,!/1AYGG!%tYG	FFFFFF++L'BBH 'IZIZ[giqIrIrF 02F' ',G'3$4	&G 	 	 	D	 &"
 
 	
 "M 
&**Z((M99%6),--K00
 
 	
 $===t&}55G t "  s   /D> >
E
Ec                     | | dk    rdS t          | t          t          f          r%d | D             }|rd                    |          ndS t	          |           S )u  Normalize a stored/submitted ``deliver`` value to its canonical string form.

    The contract is that ``deliver`` is a string (``"local"``, ``"origin"``,
    ``"telegram"``, ``"telegram:-1001:17"``, or comma-separated combinations).
    Historically some callers — MCP clients passing an array, direct edits of
    ``jobs.json``, or stale code paths — have stored a list/tuple like
    ``["telegram"]``.  ``str(["telegram"])`` would serialize to the literal
    string ``"['telegram']"``, which is not a known platform and fails
    resolution silently.  Flatten lists/tuples into a comma-separated string
    so both forms work.  Returns ``"local"`` for anything falsy.
    NrJ   rV   c                     g | ]D}t          |                                          #t          |                                          ES  r_   strip.0ps     r   
<listcomp>z,_normalize_deliver_value.<locals>.<listcomp>   s9    CCCACFFLLNNCQCCCrG   ,)
isinstancelisttuplejoinr_   )deliverpartss     r   _normalize_deliver_valuer}      sd     'R--w'D%=)) 5CCCCC"'4sxxW4w<<rG   c                    t          |                     dd                    }|dk    rg S d |                    d          D             }t                      }g }|D ]}t	          | |          }|rq|d                                         t          |d                   |                    d          f}||vr*|                    |           |                    |           |S )z]Resolve all concrete auto-delivery targets for a cron job (supports comma-separated deliver).r{   rV   c                 ^    g | ]*}|                                 |                                 +S ro   rq   rr   s     r   ru   z-_resolve_delivery_targets.<locals>.<listcomp>  s-    @@@1aggii@QWWYY@@@rG   rv   rD   rE   rW   )	r}   r   ra   setrl   rL   r_   addappend)r   r{   r|   seentargetsparttargetkeys           r   _resolve_delivery_targetsr      s    &swwy''B'BCCG'	@@c 2 2@@@E55DG ' '0d;; 	'*%++--s6)3D/E/EvzzR]G^G^_C$v&&&NrG   c                 8    t          |           }|r|d         ndS )zAResolve the concrete auto-delivery target for a cron job, if any.r   N)r   )r   r   s     r   _resolve_delivery_targetr     s"    ',,G *71::d*rG   >   .3gp.avi.mkv.mov.mp4.webm>   .gif.jpg.png.jpeg.webprE   media_filesmetadatac                    ddl m} ddlm} |D ]\  }	}
	  ||	          j                                        }||nt          | dd          } ||||
          r|                     ||	|          }n\|t          v r| 	                    ||	|          }n:|t          v r|                     ||	|	          }n|                     ||	|
          }t          j        ||          }	 |                    d          }n## t           $ r |                                  w xY w|rQt          |dd          s@t$                              d|                    dd          |	t          |dd                     f# t*          $ r<}t$                              d|                    dd          |	|           Y d}~d}~ww xY wdS )u;  Send extracted MEDIA files as native platform attachments via a live adapter.

    Routes each file to the appropriate adapter method (send_voice, send_image_file,
    send_video, send_document) based on file extension — mirroring the routing logic
    in ``BasePlatformAdapter._process_message_background``.
    r   r   )should_send_media_as_audioNrD   )is_voice)rE   
audio_pathr   )rE   
video_pathr   )rE   
image_pathr   )rE   	file_pathr      timeoutsuccessTz&Job '%s': media send failed for %s: %srY   rZ   errorunknownz%Job '%s': failed to send media %s: %s)pathlibr   gateway.platforms.baser   suffixrL   getattr
send_voice_VIDEO_EXTS
send_video_IMAGE_EXTSsend_image_filesend_documentasynciorun_coroutine_threadsaferesultTimeoutErrorcancelr   r   r   r   )adapterrE   r   r   loopr   rD   r   r   
media_path	_is_voiceextroute_platformcorofuturer   es                    r   _send_media_via_adapterr     s:    AAAAAA!, g g
I	g$z"")//11C)1)=XX77T^`dCeCeN)).#	RRR g))'j[c)dd##))'j[c)dd##..w:`h.ii,,W
]e,ff5dDAAFr22     gfi>> <GGD#&&
GFGY4W4W    	g 	g 	gNNBCGGDRUDVDVXbdeffffffff	g1g gs1   CE5&C=<E5= DAE55
F;?1F66F;contentc                    t          |           }|sY|                     dd          dk    r=d|                     dd           }t                              d| d         |           |S dS ddlm} dd	lm}m} d
}		 t                      }
|
                    di                               dd
          }	n# t          $ r Y nw xY w|	rB|                     d| d                   }|                     dd          }d| d| d| d| d	}n|}ddlm} |                    |          \  }}	  |            }n@# t          $ r3}d| }t                              d| d         |           |cY d}~S d}~ww xY wg }|D ]}|d         }|d         }|                    d          }|                     d          pi }|                    d          }|r;|s9t                              d| d         ||                     dd          |           n&|r$t                              d| d         |||           	  ||                                          }nU# t"          t$          f$ rA d| d}t                              d| d         |           |                    |           Y 'w xY w|j                            |          }|r|j        s?d| d}t                              d| d         |           |                    |           |pi                     |          }d }|l|i t-          |d!d"                       rN|rd|ind}	 |                                }d
} |rt1          j        |                    |||#          |          }!	 |!                    d$%          }"n## t8          $ r |!                                  w xY w|"rHt-          |"d&d
          s7t-          |"d'd(          }#t                              d)| d         |||#           d } | r|rt=          |||||| |*           | r%t                              d+| d         ||           d
}n;# t          $ r.}t                              d,| d         |||           Y d}~nd}~ww xY w|s |||||||-          }$	 t1          j         |$          }%n# tB          $ r |$"                                 tF          j$        %                    d./          5 }&|&&                    t0          j          |||||||-                    }!|!                    d0%          }%ddd           n# 1 swxY w Y   Y nYt          $ rM}d1| d2| d3| }t                              d| d         |           |                    |           Y d}~-d}~ww xY w|%rY|%                    d'          rDd4|%d'          }t                              d| d         |           |                    |           t                              d5| d         ||           |rd6'                    |          S dS )7u  
    Deliver job output to the configured target(s) (origin chat, specific platform, etc.).

    When ``adapters`` and ``loop`` are provided (gateway is running), tries to
    use the live adapter first — this supports E2EE rooms (e.g. Matrix) where
    the standalone HTTP path cannot encrypt.  Falls back to standalone send if
    the adapter path fails or is unavailable.

    Returns None on success, or an error string on failure.
    r{   rV   z(no delivery target resolved for deliver=zJob '%s': %srY   Nr   )_send_to_platform)load_gateway_configPlatformTr   wrap_responserX   rJ   zCronjob Response: z

(job_id: z)
-------------

zI

To stop or manage this job, send me a new message (e.g. "stop reminder z").)BasePlatformAdapterzfailed to load gateway config: rD   rE   rW   rC   zUJob '%s': origin has thread_id=%s but delivery target lost it (deliver=%s, target=%s)z*Job '%s': delivering to %s:%s thread_id=%szunknown platform ''z
platform 'z' not configured/enabledF
is_runningc                      dS )NFro   ro   rG   r   <lambda>z!_deliver_result.<locals>.<lambda>  s    di rG   )r   <   r   r   r   r   zLJob '%s': live adapter send to %s:%s failed (%s), falling back to standalone)rD   z-Job '%s': delivered to %s:%s via live adapterzPJob '%s': live adapter delivery to %s:%s failed (%s), falling back to standalone)rW   r   r\   max_workersr   zdelivery to r[   z	 failed: zdelivery error: zJob '%s': delivered to %s:%sz; )(r   r   r   r   rb   r   gateway.configr   r   r	   r   r   r   extract_mediar   debugrL   
ValueErrorKeyErrorr   	platformsenabledr   rq   r   r   sendr   r   r   r   r`   runRuntimeErrorclose
concurrentfuturesThreadPoolExecutorsubmitrz   )'r   r   adaptersr   r   msgr   r   r   r   user_cfg	task_namejob_iddelivery_contentr   r   cleaned_delivery_contentconfigr   delivery_errorsr   rH   rE   rW   rC   origin_threadrD   pconfigruntime_adapter	deliveredsend_metadatatext_to_send
adapter_okr   send_resulterrr   r   pools'                                          r   _deliver_resultr   M  sV    (,,G 779g&&'11ZSWWYPW=X=XZZCNN>3t9c:::Jt999999<<<<<<<<
 M== VR0044_dKK     #GGFCI..	r""g g gg g g g Xa	g g g 	 # ;:::::,?,M,MN^,_,_)K)$$&&   333^SY444






 O p[ p[z*#JJ{++	 ""(b

;// 
	 
	NN*D	=#'')W*E*Ev   
  	LL<D	='9  	x 3 3 5 566HHH% 	 	 	7}777CNN>3t9c:::""3'''H		 "&&x00 	go 	F}FFFCNN>3t9c:::""3''' $>r..x88	&4+;@jl\i\i@j@j@l@l+;8AK[)44tM)7==??!
 +$=',,Wl],[[ F&,mmBm&?&?'    # +7;	4+P+P +%k7IFFjI}gs   &+
  	+ 	+'#%!)     %KK OQTUYQZ\ikrsss $I   fI}gq         	[$$XwAYen  }H  I  I  ID T** 7 7 7
 

'::q:II 7T![[6G6GRY[bd|  IR  `k  7l  7l  7l  m  mF#]]2]66F7 7 7 7 7 7 7 7 7 7 7 7 7 7 7    J]JJWJJqJJ^SY<<<&&s+++	  &**W-- :::^SY<<<&&s+++KK6D	=RYZZZ *yy)))4s   <8B5 5
CC*
D5 5
E2?(E-'E2-E21IAJ! J!	AQN$#Q$ OBQ
R$RR#R88>V+6AU<V+UV+UV+	V+AV&&V+x   c                  2   t           t          k    r[	 t          t          t                               } | dk    r| S n0# t          $ r# t
                              dt                      Y nw xY wt          j        dd          	                                }|rQ	 t          t          |                    } | dk    r| S n+# t          $ r t
                              d|           Y nw xY w	 t                      pi }t          |t                    r|                    di           ni }|                    d          }|$t          t          |                    } | dk    r| S n2# t          $ r%}t
                              d	|           Y d}~nd}~ww xY wt          S )
zOResolve cron pre-run script timeout from module/env/config with a safe default.r   z<Invalid patched _SCRIPT_TIMEOUT=%r; using env/config/defaultHERMES_CRON_SCRIPT_TIMEOUTrJ   z;Invalid HERMES_CRON_SCRIPT_TIMEOUT=%r; using config/defaultr   script_timeout_secondsNz2Failed to load cron script timeout from config: %s)_SCRIPT_TIMEOUT_DEFAULT_SCRIPT_TIMEOUTintfloatr   r   r   rM   rN   rq   r	   rw   dictr   r   )r   	env_valuer   cron_cfg
configuredr   s         r   _get_script_timeoutr     s   111	l%0011G{{  	l 	l 	lNNY[jkkkkk	l 	6;;AACCI e	e%	**++G{{  	e 	e 	eNNXZcddddd	e	Pmm!r*4S$*?*?G37762&&&R\\":;;
!%
++,,G{{ P P PI3OOOOOOOOP #"s:   (< *A)(A)#B; ;%C#"C#'A7E   
F*F

Fscript_pathc           	         ddl m}  |            dz  }|                    dd           |                                }t	          |                                           }|                                r|                                }n||z                                  }	 |                    |           n# t          $ r dd| d| fcY S w xY w|	                                sdd	| fS |
                                sdd
| fS t                      }	 t          j        t          j        t!          |          gdd|t!          |j                            }|j        pd                                }|j        pd                                }		 ddlm}
  |
|          } |
|	          }	n# t.          $ r Y nw xY w|j        dk    rVd|j         g}|	r|                    d|	            |r|                    d|            dd                    |          fS d|fS # t          j        $ r dd| d| fcY S t.          $ r}dd| fcY d}~S d}~ww xY w)u  Execute a cron job's data-collection script and capture its output.

    Scripts must reside within HERMES_HOME/scripts/.  Both relative and
    absolute paths are resolved and validated against this directory to
    prevent arbitrary script execution via path traversal or absolute
    path injection.

    Args:
        script_path: Path to a Python script.  Relative paths are resolved
            against HERMES_HOME/scripts/.  Absolute and ~-prefixed paths
            are also validated to ensure they stay within the scripts dir.

    Returns:
        (success, output) — on failure *output* contains the error message so the
        LLM can report the problem to the user.
    r   r   scriptsTparentsexist_okFz=Blocked: script path resolves outside the scripts directory (z): zScript not found: zScript path is not a file: )capture_outputtextr   cwdrJ   )redact_sensitive_textzScript exited with code zstderr:
zstdout:

zScript timed out after zs: zScript execution failed: N)hermes_constantsr   mkdirresolver   
expanduseris_absoluterelative_tor   existsis_filer   
subprocessr   sys
executabler_   parentstdoutrq   stderragent.redactr  r   
returncoder   rz   TimeoutExpired)r   r   scripts_dirscripts_dir_resolvedrawpathscript_timeoutr   r  r  r  r|   r   s                r   _run_job_scriptr  $  s8   " 100000!/##i/KdT222&..00
{


&
&
(
(C
 -{{}}c!**,,
-.... 
 
 
9$9 9)49 9
 	
 	
 	

 ;;== 2141111<<>> ;:D::::(**N 8^SYY'"DK  
 
 
 -%2,,..-%2,,..	::::::**622F**622FF 	 	 	D	 !!C0ACCDE 3111222 3111222$))E****V|$ J J JIII4IIIIII 8 8 87#7777777778sb   !B7 7CCA:H# F. -H# .
F;8H# :F;;A#H# H# #I>	IIIIscript_outputc                 F   | sdS d |                                  D             }|sdS |d                                         }	 t          j        |          }n# t          j        t
          f$ r Y dS w xY wt          |t                    sdS |                    dd          duS )u  Parse the last non-empty stdout line of a cron job's pre-check script
    as a wake gate.

    The convention (ported from nanoclaw #1232): if the last stdout line is
    JSON like ``{"wakeAgent": false}``, the agent is skipped entirely — no
    LLM run, no delivery. Any other output (non-JSON, missing flag, gate
    absent, or ``wakeAgent: true``) means wake the agent normally.

    Returns True if the agent should wake, False to skip.
    Tc                 :    g | ]}|                                 |S ro   r   )rs   lines     r   ru   z$_parse_wake_gate.<locals>.<listcomp>  s%    RRRtTZZ\\RdRRRrG   	wakeAgentF)	
splitlinesrq   jsonloadsJSONDecodeErrorr   rw   r   r   )r  stripped_lines	last_linegates       r   _parse_wake_gater,  u  s      tRR}'?'?'A'ARRRN tr"((**Iz)$$ *-   ttdD!! t88K&&e33s   A A10A1prerun_scriptc           
      ,   |                      dd          }|                      d          }|                      d          }|r5||\  }}nt          |          \  }}|r|r	d| d| }nd| }nd	| d| }|                      d
          }|r9ddlm} t	          |t
                    r|g}|D ]}	|	rt          d |	D                       st                              d|	           :	 ||	z  }
|
	                                sUt          |
                    d          d d          }|s~|d                             d                                          }d}t          |          |k    r|d|         dz   }|rd|	 d| d| }n݌# t          t           f$ r'}t                              d|	|           Y d}~d}~ww xY wd}||z   }||                      d          }|r|gng }d |D             }|s|S ddlm} g }g }|D ]}t'          j         ||                    }|                     d          st|                     d          pd | d!}t                              d"|                      d#|                      d$                    |           |                    |           t          |                     d%          pd                                          }|r|                    d           |                    d&| d'd|g           |rEd(d)                    |           d*d)                    |           d+}|                    d|           |r|                    dd,| g           d-                    |          S ).a  Build the effective prompt for a cron job, optionally loading one or more skills first.

    Args:
        job: The cron job dict.
        prerun_script: Optional ``(success, stdout)`` from a script that has
            already been executed by the caller (e.g. for a wake-gate check).
            When provided, the script is not re-executed and the cached
            result is used for prompt injection. When omitted, the script
            (if any) runs inline as before.
    promptrJ   skillsscriptNzq## Script Output
The following data was collected by a pre-run script. Use it as context for your analysis.

```
z
```

z3[Script ran successfully but produced no output.]

zQ## Script Error
The data-collection script failed. Report this to the user.

```
context_fromr   )
OUTPUT_DIRc              3      K   | ]}|d v V  	dS )0123456789abcdefNro   )rs   cs     r   	<genexpr>z$_build_job_prompt.<locals>.<genexpr>  s(      +[+[A1C,C+[+[+[+[+[+[rG   z(context_from: skipping invalid job_id %rz*.mdc                 4    |                                  j        S N)statst_mtime)fs    r   r   z#_build_job_prompt.<locals>.<lambda>  s    !&&(("3 rG   T)r   reverseutf-8encodingi@  z

[... output truncated ...]z## Output from job 'zo'
The following is the most recent output from a preceding cron job. Use it as context for your analysis.

```
z2context_from: failed to read output for job %r: %su  [IMPORTANT: You are running as a scheduled cron job. DELIVERY: Your final response will be automatically delivered to the user — do NOT use send_message or try to deliver the output yourself. Just produce your report/output as your final response and the system handles the rest. SILENT: If there is genuinely nothing new to report, respond with exactly "[SILENT]" (nothing else) to suppress delivery. Never combine [SILENT] with content — either report your findings normally, or say [SILENT] and nothing more.]

skillc                     g | ]D}t          |                                          #t          |                                          ES ro   rp   )rs   rX   s     r   ru   z%_build_job_prompt.<locals>.<listcomp>  s=    MMM3t99??;L;LM3t99??$$MMMrG   )
skill_viewr   r   zFailed to load skill 'r   u/   Cron job '%s': skill not found, skipping — %srX   rY   r   z&[IMPORTANT: The user has invoked the "zf" skill, indicating they want you to follow its instructions. The full skill content is loaded below.]ze[IMPORTANT: The following skill(s) were listed for this job but could not be found and were skipped: z, un   . Start your response with a brief notice so the user is aware, e.g.: '⚠️ Skill(s) not found and skipped: z']zPThe user has provided the following instruction alongside the skill invocation: r  )r   r  	cron.jobsr3  rw   r_   allr   r   r  r   glob	read_textrq   lenOSErrorPermissionErrortools.skills_toolrC  r&  r'  r   extendrz   insert)r   r-  r/  r0  r   r   r  r2  r3  source_job_idjob_output_diroutput_fileslatest_output_MAX_CONTEXT_CHARSr   	cron_hintrR   skill_namesrC  r|   skipped
skill_nameloadedr   r   notices                             r   _build_job_promptrY    s    WWXr""FWWXF ''(##K $%2"G]]%4[%A%A"G] 	   *    	         %     77>**L $g((((((lC(( 	*(>L)  	g  	gM  +[+[]+[+[+[([([ I=YYYg!+m!;%,,.. %"''//33      
 $  ,Q 9 97 9 K K Q Q S S%)"}%%(:::$12E3E2E$FIi$iM  	$} $ $ !.$ $ "	$ $ F   _- g g gSUbdeffffffffg	D  F~!!#+&MMMMMK ,,,,,,EG! 
 

JJz2233zz)$$ 	JJw''Q+QJ+Q+Q+QENNLcggV\^a^e^efj^k^kNlNlnstttNN:&&&fjj++1r2288:: 	LL l  l  l  l	
 	
 	
 	
   N!%7!3!3N N 8<yy7I7IN N N 	 	Q xbumsuuvwww99Us%   +F(F.AFGGGc                 *   ddl m} d}	 ddlm}  |            }nG# t          $ r:}t
                              d|                     dd          |           Y d}~nd}~ww xY w| d         }| d         }d}|                     d	          }|rwt          |          }|\  }	}
|	rat          |
          sRt
          
                    d
||           d| d| dt                                          d           d}d|t          dfS t          | |          }t          |           }d| dt                                          d           }t
          
                    d||           t
          
                    d|dd                    d}dt           j        d<   ddlm}m}m}  ||r|d         nd|rt-          |d                   nd|r|                    dd          nd          }d }|D ]}||                             d           |                     d!          pd                                pd}|r?t3          |                                          st
                              d"||           d}t           j                            d#d$          }|r+|t           j        d#<   t
          
                    d%||           	 dd&lm} 	  |t-          t<          d'z            dd()           n3# t>          $ r&  |t-          t<          d'z            dd*)           Y nw xY wtA          |           }|r|d+                             |d                    |d,                             t-          |d                              |d-                             |                    d.          dnt-          |d.                              |                     d/          pt!          j!        d0          pd}i }	 ddl"}t-          t<          d1z            }t           j#        $                    |          rtK          |          5 }|&                    |          pi }ddd           n# 1 swxY w Y   |                    d/i           }|                     d/          sCtO          |t,                    r|}n+tO          |tP                    r|                    d2|          }n3# t          $ r&}t
                              d3||           Y d}~nd}~ww xY w	 dd4l)m*}  |                    d5i           }!tO          |!tP                    r!|!                    d6          r | d7           n# t          $ r Y nw xY wdd8l)m+}" t-          |                    d9i                               d:d                                                    }# |"|#          }$d}%t!          j!        d;d          p|                    d<d          }&|&rt3          |&          ,                                }'|'-                                s
t<          |'z  }'|'$                                r	 tK          |'d=d(>          5 }(t]          j/        |(          }%ddd           n# 1 swxY w Y   tO          |%t`                    sd}%n6# t          $ r)}t
                              d?||'|           d}%Y d}~nd}~ww xY w|                    d9i                               d@          p|                    d@          pdA})|                    dBi           }*ddCl1m2}+m3}, ddDl4m5}- 	 dE|                     dF          pt!          j!        dG          i}.|                     dH          r|                     dH          |.dI<    |+di |.}/n# |-$ r}}0t
                              dJ||0           |                    dK          p|                    dL          }1|1rtO          |1t`                    r|1n|1gng }2d}/|2D ]}3tO          |3tP                    s	 dE|3                    dF          i}4|3                    dH          r|3dH         |4dI<   |3                    dM          r|3dM         |4dN<    |+di |4}/t
          
                    dO||/                    dF                      nG# t          $ r:}5t
                              dP||3                    dF          |5           Y d}5~5d}5~5ww xY w|/tm           |,|0                    |0Y d}0~0n0d}0~0wt          $ r }6 |,|6          }7tm          |7          |6d}6~6ww xY w|                    dK          p|                    dL          pd}8d}9t-          |/                    dF          pd                                          7                                }:|:r	 ddQl8m9};  |;|:          }<|<:                                r>|<}9t
          
                    dR||:tw          |<<                                                     n4# t          $ r'}t
                              dS||:|           Y d}~nd}~ww xY w |di d/|dM|/                    dM          dH|/                    dH          dF|/                    dF          dT|/                    dT          dU|/                    dV          dW|/                    dX          dY|)dZ|$d[|%dL|8d\|9d]|*                    d^          d_|*                    d`          da|*                    db          dc|*                    dd          det{          | |          dfg dgdhddit}          |           djddkdddldm|dn|}t!          j!        dod                                          }=|=rE	 t          |=          }>n6# t          t          f$ r  t
                              dp|=           dq}>Y nw xY wdq}>|>dk    r|>nd}?dr}@t          jC        D                    dst          }At          jF                    }B|AG                    |BjH        |jI        |          }Cdu}D	 |?|CJ                                }End}E	 t          jC        K                    |Ch|@v          \  }F}G|Fr|CJ                                }EnXdw}Ht          |dx          r<	 |M                                }I|I                    dydw          }Hn# t          $ r Y nw xY w|H|?k    rd}Dnn&# t          $ r |AN                    dudz            w xY w|AN                    dudz           n# |AN                    dudz           w xY w|Dr"i }Jt          |dx          r&	 |M                                }Jn# t          $ r Y nw xY w|J                    d{d|          }K|J                    dyd          }L|J                    d}          }M|J                    d~d          }N|J                    dYd          }Ot
          O                    d||L|?|K|N|O|Mpd           t          |d          r|P                    d           t          d| dt          |L           dt          |?           d|K           tO          |EtP                    s'tm          dt          |E          jT         d|E          |E                    d          du s|E                    d          duu rO|E                    d          p*|E                    d          pd                                pd}Ptm          |P          |E                    dd          pd}Q|Q                                dk    rd}Q|Qr|Qnd}Rd| d| dt                                          d           d|                     dd           d| d|R d}St
          
                    d|           d|S|Qdf|r6|d$k    r!t           j        U                    d#d           n|t           j        d#<    ||           |D ]}||                             d           |r	 |V                    |d           n:# t          t          f$ r&}t
                              d||           Y d}~nd}~ww xY w	 |X                                 n:# t          t          f$ r&}t
                              d||           Y d}~nd}~ww xY w	 ||X                                 n:# t          t          f$ r&}t
                              d||           Y d}~nd}~ww xY w	 ddlYmZ}T  |T             S # t          $ r&}t
                              d||           Y d}~S d}~ww xY w# t          $ r7}t          |          jT         dt-          |           }Ut
          [                    d||U           d| d| dt                                          d           d|                     dd           d| d|U d}Sdu|Sd|UfcY d}~|r6|d$k    r!t           j        U                    d#d           n|t           j        d#<    ||           |D ]}||                             d           |r	 |V                    |d           n:# t          t          f$ r&}t
                              d||           Y d}~nd}~ww xY w	 |X                                 n:# t          t          f$ r&}t
                              d||           Y d}~nd}~ww xY w	 ||X                                 n:# t          t          f$ r&}t
                              d||           Y d}~nd}~ww xY w	 ddlYmZ}T  |T             S # t          $ r&}t
                              d||           Y d}~S d}~ww xY wd}~ww xY w# |r6|d$k    r!t           j        U                    d#d           n|t           j        d#<    ||           |D ]}||                             d           |r	 |V                    |d           n:# t          t          f$ r&}t
                              d||           Y d}~nd}~ww xY w	 |X                                 n:# t          t          f$ r&}t
                              d||           Y d}~nd}~ww xY w	 ||X                                 n:# t          t          f$ r&}t
                              d||           Y d}~nd}~ww xY w	 ddlYmZ}T  |T             w # t          $ r&}t
                              d||           Y d}~w d}~ww xY wxY w)z
    Execute a single cron job.
    
    Returns:
        Tuple of (success, full_output_doc, final_response, error_message)
    r   )AIAgentN)	SessionDBz0Job '%s': SQLite session store not available: %srY   rZ   rX   r1  z6Job '%s' (ID: %s): wakeAgent=false, skipping agent runz# Cron Job: z

**Job ID:** z
**Run Time:** z%Y-%m-%d %H:%M:%Su<   

Script gate returned `wakeAgent=false` — agent skipped.
T)r-  cron__z%Y%m%d_%H%M%SzRunning job '%s' (ID: %s)z
Prompt: %sd   1HERMES_CRON_SESSION)set_session_varsclear_session_vars_VAR_MAPrD   rJ   rE   	chat_name)rD   rE   re  )!HERMES_CRON_AUTO_DELIVER_PLATFORM HERMES_CRON_AUTO_DELIVER_CHAT_ID"HERMES_CRON_AUTO_DELIVER_THREAD_IDworkdiruG   Job '%s': configured workdir %r no longer exists — running without itTERMINAL_CWD_UNSET_zJob '%s': using workdir %s)load_dotenvz.envr>  )overrider@  zlatin-1rf  rg  rh  rW   modelHERMES_MODELzconfig.yamldefaultz8Job '%s': failed to load config.yaml, using defaults: %s)apply_ipv4_preferencenetwork
force_ipv4)force)parse_reasoning_effortagentreasoning_effortHERMES_PREFILL_MESSAGES_FILEprefill_messages_filerr?  z8Job '%s': failed to parse prefill messages file '%s': %s	max_turnsZ   provider_routing)resolve_runtime_providerformat_runtime_provider_error)	AuthError	requestedproviderHERMES_INFERENCE_PROVIDERbase_urlexplicit_base_urlz3Job '%s': primary auth failed (%s), trying fallbackfallback_providersfallback_modelapi_keyexplicit_api_keyz!Job '%s': fallback resolved to %sz Job '%s': fallback %s failed: %s)	load_poolz@Job '%s': loaded credential pool for provider %s with %d entriesz3Job '%s': failed to load credential pool for %s: %sapi_modeacp_commandcommandacp_argsargsmax_iterationsreasoning_configprefill_messagescredential_poolproviders_allowedonlyproviders_ignoredignoreproviders_orderorderprovider_sortsortr   disabled_toolsets)cronjob	messagingclarify
quiet_modeskip_context_filesload_soul_identityskip_memoryr   
session_id
session_dbHERMES_CRON_TIMEOUTz2Invalid HERMES_CRON_TIMEOUT=%r; using default 600sg     @g      @r\   r   Fr   g        get_activity_summaryseconds_since_activity)waitcancel_futureslast_activity_descr   current_toolapi_call_countz_Job '%s' idle for %.0fs (inactivity limit %.0fs) | last_activity=%s | iteration=%s/%s | tool=%snone	interruptzCron job timed out (inactivity)z
Cron job 'z' idle for z	s (limit u   s) — last activity: z agent.run_conversation returned z instead of dict: failed	completedr   final_responsezagent reported failurez(No response generated)z
**Schedule:** schedule_displayzN/Az

## Prompt

z

## Response

r  zJob '%s' completed successfullycron_completez#Job '%s': failed to end session: %sz2Job '%s': failed to close SQLite session store: %sz-Job '%s': failed to close agent resources: %s)cleanup_stale_async_clientsz4Job '%s': failed to reap stale auxiliary clients: %sz: zJob '%s' failed: %sz (FAILED)

**Job ID:** z

## Error

```
z
```
ro   )\	run_agentr[  hermes_stater\  r   r   r   r   r  r,  r`   _hermes_nowstrftimeSILENT_MARKERrY  rF   rM   environgateway.session_contextrb  rc  rd  r_   r   rq   r   is_dirr   dotenvrl  _hermes_homeUnicodeDecodeErrorr   rN   yamlr  r  open	safe_loadrw   r   r  rq  ru  r  r  r&  loadrx   hermes_cli.runtime_providerr~  r  hermes_cli.authr  r   rL   agent.credential_poolr  has_credentialsrH  entriesr   boolr   r   	TypeErrorr   r   r   contextvarscopy_contextr   r   run_conversationr   r  hasattrr  shutdownr   r  r   r   type__name__popend_sessionKeyboardInterruptr   agent.auxiliary_clientr  	exception)Vr   r[  _session_dbr\  r   r   job_namer-  r   _ran_ok_script_output
silent_docr/  rC   _cron_session_idrv  rb  rc  rd  _ctx_tokens_cron_delivery_vars	_var_name_job_workdir_prior_terminal_cwdrl  delivery_targetrn  _cfgr  	_cfg_path_f
_model_cfgrq  _net_cfgru  effortr  r  prefill_filepfpath_pfr  prr~  r  r  runtime_kwargsruntimeauth_excfbfb_listentry	fb_kwargsfb_excr   messager  r  runtime_providerr  r   _raw_cron_timeout_cron_timeout_cron_inactivity_limit_POLL_INTERVAL
_cron_pool_cron_context_cron_future_inactivity_timeoutr   doner^  
_idle_secs_act	_activity
_last_desc	_secs_ago	_cur_tool_iter_n	_iter_max	_err_textr  logged_responseoutputr  	error_msgsV                                                                                         r   run_jobr    s    "!!!!! K`******ikk ` ` `GQUWZI[I[]^________` YF6{H M''(##K 9'44"/ 	9+N;; 	9KKH&  
Nx N N%N N!,!7!78K!L!LN N N  ]D88s-@@@FS!!FQvQQ(>(>(O(OQQ
KK+Xv>>>
KKfTcTl+++E
 ),BJ$% WVVVVVVVVV""'-5
##2*08F9%&&&b17?&**["---R  K

 ) $ $	#### GGI&&,"3355=L D..5577  	UL	
 	
 	
 *..CC H%1
>"0&,GGGg\ 	'&&&&&	WKL6122TGTTTTT! 	W 	W 	WKL6122TIVVVVVV	W 3377 	89==oj>YZZZ78<<SQZA[=\=\]]]9:>>"&&{33; 566     CBIn$=$=C 	bKKKL=899Iw~~i(( A)__ 4>>"--3D4 4 4 4 4 4 4 4 4 4 4 4 4 4 4!XXgr22
www'' A!*c22 A *#J55 A *y% @ @ 	b 	b 	bNNUW]_`aaaaaaaa	b	>>>>>>xx	2..H(D)) 2hll<.H.H 2%%D1111 	 	 	D	 	<;;;;;TXXgr**../A2FFGGMMOO11&99  y!?DDmQhjlHmHm 	,,''2244F%%'' /%.}} ,,fcG<<< :+/9S>>(: : : : : : : : : : : : : : :%&6== 0+/(  , , ,NN#]_egmopqqq'+$$$$$$,
 '2..22;??^488KCXCX^\^ XX("--	
 	
 	
 	
 	
 	
 	
 	
 	.-----	1SWWZ00ZBI>Y4Z4ZN wwz"" J69ggj6I6I23..@@@@GG 	Z 	Z 	ZNNPRXZbccc.//M488<L3M3MB@BJZD11;rrttGG  l l!%.. 
l!,eii
.C.C DIyy,, K9>z9J	"56yy++ I8=i8H	"4566CCCCGKK CVW[[YcMdMdeeeE  l l lLL!CVUYYWaMbMbdjkkkkkkkkl"#@#@#J#JKKQYY  	1 	1 	133C88Gw''S0	1 "677]488DT;U;U]Y]w{{:66<"==CCEEKKMM 	qq;;;;;; y!122'')) &*OKKZ(DLLNN++	    q q qRTZ\lnoppppppppq  
 
 
%
KK	***
 [[,,,
 [[,,,	

 [[,,,
  I...
 [[(((
 *>
 .-
 .-
 *>
 ,O
 !ffVnnn
 !ffX...
 FF7OOO
  &&...!
" <CFFF#
$ BAAA%
& t'
0 $(#5#5551
2  $t3
4 5
6 V7
8 ('9
: #{;
P I&;R@@FFHH 
	"& %&7 8 8	* & & &H%   !&& "M2?!2C2C'::q:II
 $022!(():E<RTZ[[#	A%-%,,..(055% 6  GD!  !-!4!4!6!6!$Ju&<== !!#(#=#=#?#?D)-2JC)P)PJJ( ! ! ! D!!%;;;.2+#$  	 	 	U4@@@	 U4@@@@JU4@@@@ 	Iu455  % : : < <II    D"';YGGJ!&>BBI!n55Imm$4a88G!&6::ILLA)%;GY#V   uk** C ABBB3X 3 3y>>3 3,/0F,G,G3 3&03 3   &$'' 	f4<<3Hff\bff   ::h4''6::k+B+Be+K+K

7## ,JJ/006B==??,+ 
 y)))$4b99?R!!%>>>N -;Y..@Y(    }}%%&9::  ww)511	       	5x@@@V^T18  	A"i//
~t4444-@
>*;''', 	( 	(IY##B'''' 	^O''(8/JJJJ01 O O OBFANNNNNNNNO^!!####01 ^ ^ ^QSY[\]]]]]]]]^	U ,- 	U 	U 	ULLH&RSTTTTTTTT	U	\JJJJJJ'')))) 	\ 	\ 	\LLOQWYZ[[[[[[[[	\y  , , ,Aww'333q6633	.)DDD(    }}%%&9::  ww)511	        fb)++++++  	A"i//
~t4444-@
>*;''', 	( 	(IY##B'''' 	^O''(8/JJJJ01 O O OBFANNNNNNNNO^!!####01 ^ ^ ^QSY[\]]]]]]]]^	U ,- 	U 	U 	ULLH&RSTTTTTTTT	U	\JJJJJJ'')))) 	\ 	\ 	\LLOQWYZ[[[[[[[[	\y,4  	A"i//
~t4444-@
>*;''', 	( 	(IY##B'''' 	^O''(8/JJJJ01 O O OBFANNNNNNNNO^!!####01 ^ ^ ^QSY[\]]]]]]]]^	U ,- 	U 	U 	ULLH&RSTTTTTTTT	U	\JJJJJJ'')))) 	\ 	\ 	\LLOQWYZ[[[[[[[[	\sb   
A0AAAF	 #K1 0AF	 1-L!AF	  L!!CAF	 7A	S  Q$S $Q((S +Q(,A1S AF	 
T(T	AF	 	TAF	 AU% $AF	 %
U2/AF	 1U22CAF	 Z( $Z9Z( Z		Z( Z	Z( 'AF	 (
[2[AF	 [A'AF	 A ^% #AF	 %e+B d#,Bb<:d#<
d 0c;6d#;d  d#AF	 #e0eeA;AF	 A#h0 /AF	 0
i!:iAF	 i!!EAF	 ;o 
AF	 .o<9AF	 ;o<<A'AF	 $A(t *s8 7t 8
tt tt u #t66u 9AF	 u**AF	 v AF	 
v%"AF	 $v%%IAF	 AAA(A(ABA9ABBABB#AB8B8AC/C	AC*C*AC/C3AD
D
AEDAD<D<AEEAEE
AFE AFFAFF	AOFBAOH#AOH$AO JAJ%J%AKJ6AKKAKK AK5K5AL,LAL'L'AL,L0AMMAM>MAM9M9AM>NANN
AONAN>N>AOOAOOAO OA&AU-P5AQQAU-QARQAQ>Q9AU-Q>ARRAU-RARRAU-RASR-ASS	AU-SASSAU-SAS.S-AU-S.AT%S?AT TAU-T AT%T%AU-T)AT:T9AU-T:
AU*UAU%U AU-U%AU*U*AU-Tverbosec           	          t                               dd           d}	 t          t          d          }t          r-t	          j        |t          j        t          j        z             n9t          r2t          j	        |
                                t          j        d           nH# t          t          f$ r4 t                              d           ||                                 Y dS w xY w	 t#                      } r|st                              dt'                                          d	                     	 t          r t	          j        |t          j                   nRt          rK	 t          j	        |
                                t          j        d           n# t          t          f$ r Y nw xY w|                                 dS  rHt                              d
t'                                          d	          t/          |                     |D ]}t1          |d                    d}	 t3          j        dd                                          }|rt9          |          pd}n1# t:          t<          f$ r t                              d           Y nw xY w|u	 tA                      pi }tC          |tD                    r|#                    di           ni #                    d          }	|	t9          |	          pd}n# tH          $ r Y nw xY w r-t                              dt/          |          |r|nd           dtD          dtJ          f fd}
d |D             }d |D             }g }|D ]>}tM          j'                    }|(                    |)                    |
|                     ?|rtT          j+        ,                    |          5 }g }|D ]D}tM          j'                    }|(                    |-                    |j)        |
|                     E|.                    d |D                        ddd           n# 1 swxY w Y   	 ddl/m0}  |             n2# tH          $ r%}t                              d|           Y d}~nd}~ww xY wtc          |          t          r t	          j        |t          j                   nRt          rK	 t          j	        |
                                t          j        d           n# t          t          f$ r Y nw xY w|                                 S # t          r t	          j        |t          j                   nRt          rK	 t          j	        |
                                t          j        d           n# t          t          f$ r Y nw xY w|                                 w xY w)u  
    Check and run all due jobs.
    
    Uses a file lock so only one tick runs at a time, even if the gateway's
    in-process ticker and a standalone daemon or manual tick overlap.
    
    Args:
        verbose: Whether to print status messages
        adapters: Optional dict mapping Platform → live adapter (from gateway)
        loop: Optional asyncio event loop (from gateway) for live adapter sends
    
    Returns:
        Number of jobs executed (0 if another tick is already running)
    Tr   Nwr\   u0   Tick skipped — another instance holds the lockr   z%s - No jobs duez%H:%M:%Sz%s - %s job(s) duerY   HERMES_CRON_MAX_PARALLELrJ   z?Invalid HERMES_CRON_MAX_PARALLEL value; defaulting to unboundedr   max_parallel_jobsz.Running %d job(s) in parallel (max_workers=%s)	unboundedr   r   c                 v   	 t          |           \  }}}}t          | d         |          }rt                              d|           |r|n!d|                     d| d                    d| }t          |          }|rX|rVt          |                                                                v r)t                              d| d         t                     d}d}|r]	 t          | |	          }nH# t          $ r;}	t          |	          }t                              d
| d         |	           Y d}	~	nd}	~	ww xY w|r|sd}d}t          | d         |||           dS # t          $ rQ}
t                              d| d         |
           t          | d         dt          |
                     Y d}
~
dS d}
~
ww xY w)z9Run one due job end-to-end: execute, save, deliver, mark.rY   zOutput saved to: %su   ⚠️ Cron job 'rX   z
' failed:
u1   Job '%s': agent returned %s — skipping deliveryFN)r   r   zDelivery failed for job %s: %szWAgent completed but produced empty response (model error, timeout, or misconfiguration))delivery_errorTzError processing job %s: %s)r  r@   r   r`   r   r  r  rq   upperr   r   r_   r   r?   )r   r   r  r  r   output_filedeliver_contentshould_deliverr  der   r   r   r  s              r   _process_jobztick.<locals>._process_job3  s,   %9@6-c$i@@ DKK 5{CCC
 5<  #D..  BDUXU\U\]cehimenUoUo  BD  BD  }B  BD  BD!%o!6!6! +g +-?CXCXCZCZC`C`CbCb2b2bKK SUXY]U^`mnnn%*N!%! VV)8oX`gk)l)l)l$ V V V),R%Es4yRTUUUUUUUUV  v> v#GuESY~VVVVt   :CIqIIISYs1vv666uuuuusC   CE C2 1E 2
D7<1D2-E 2D77$E 
F8'AF33F8c                 d    g | ]-}|                     d           pd                                +|.S ri  rJ   r   rq   rs   js     r   ru   ztick.<locals>.<listcomp>`  s:    PPPai0@0@0FB/M/M/O/OPPPPrG   c                 d    g | ]-}|                     d           pd                                +|.S r  r  r  s     r   ru   ztick.<locals>.<listcomp>a  s:    UUUqQUU95E5E5K4R4R4T4TUUUUrG   r   c              3   >   K   | ]}|                                 V  d S r9  )r   )rs   r<  s     r   r7  ztick.<locals>.<genexpr>q  s*      ==q

======rG   )_kill_orphaned_mcp_childrenz'Post-tick MCP orphan cleanup failed: %s)2	_LOCK_DIRr	  r  
_LOCK_FILEfcntlflockLOCK_EXLOCK_NBmsvcrtlockingfilenoLK_NBLCKrI  IOErrorr   r   r   r>   r`   r  r  LOCK_UNLK_UNLCKrH  rA   rM   rN   rq   r   r   r  r   r	   rw   r   r   r   r  r  r  r   r   r   r   r   r   rL  tools.mcp_toolr#  sum)r  r   r   lock_fddue_jobsr   _max_workers_env_par_ucfg_cfg_parr  workdir_jobsparallel_jobs_results_ctx
_tick_pool_futuresr#  _es   ```                r   tickr@    sb    OOD4O000 G
z3'' 	AK!>???? 	AN7>>++V_a@@@W   GHHHMMOOOqq	~>> 	8 	KK*KMM,B,B:,N,NOOOd  	K//// 	w~~//!DDDDW%   o  	aKK,kmm.D.DZ.P.PRUV^R_R_```  	( 	(CSY'''' '+	^y!;R@@FFHHH 5"8}}4I& 	^ 	^ 	^NN\]]]]]	^#+-7t-D-DLEIIfb)))"#)**  '#&x==#8DL     	KK@H ,=+  '	d '	t '	 '	 '	 '	 '	 '	 '	 '	Z QP8PPPUUHUUU   	9 	9C+--DOODHH\3778888  	>#66<6PP >T^( T TC&355DOOJ$5$5dhc$R$RSSSS==H======> > > > > > > > > > > > > > >	HBBBBBB'')))) 	H 	H 	HLLBBGGGGGGGG	H 8}} 	K//// 	w~~//!DDDDW%     	K//// 	w~~//!DDDDW%   s  BB& &AC+*C+/AT7 +2F F21F2A&T7 2:I- ,T7 -+JT7 JT7 !A#L T7 
LT7 LCT7 A)Q T7 QT7 QT7 Q) (T7 )
R3RT7 RT7 2TTT7/W'2VWV.+W-V..W__main__)r  r9  )NN)TNN)F__doc__r   concurrent.futuresr   r  r&  loggingrM   r  r  r&  ImportErrorr*  r   r   typingr   r   r  rM  r_   __file__r  r  r   hermes_cli.configr	   hermes_timer
   r  	getLoggerr  r   r   rx   r   	frozensetrd   rK   rO   rD  r>   r?   r@   rA   r  r  r$  r%  rF   rS   rl   r}   r   r   r   r   r   r   r   r   r   r   ry   r  r  r,  rY  r  r@  ro   rG   r   <module>rL     s_               				     



LLLL   E   	       ! ! ! ! ! ! ! !
 33ttH~~,344 5 5 5 , , , , , , ) ) ) ) ) ) * * * * * *		8	$	$ 4 DI<L    @ &I ' ' '    !'%!#+!'#!#-!  , +   T S S S S S S S S S S S
     6!	%
	 	(4. 	 	 	 	
C 
C 
 
 
 
S Sc Shtn S S S Sl    (4 DJ    $+$ +8D> + + + + iIIIJJiBBBCC ,g ,g,g ,g Tk	,g 
,g 
,g ,g ,g ,g^n n n n(SV- n n n nb  )#S # # # #BN8 N8tSy)9 N8 N8 N8 N8b4C 4D 4 4 4 44L L4 L L3 L L L L^I\ I\%c3 => I\ I\ I\ I\X] ]$ ]C ] ] ] ]@ zD s-   ) A6AA AA  AA