+
    i                     ~    R t ^ RIHtHtHt ^ RIHtHt RR R lltR R ltR R lt	R	 R
 lt
R R ltRR R lltR# )z$Date utilities for last30days skill.)datetime	timedeltatimezone)OptionalTuplec                R    V ^8  d   QhR\         R\        \        \        3,          /# )   daysreturn)intr   str)formats   "Q/Users/bowang/.openclaw/workspace/skills/last30days-official/scripts/lib/dates.py__annotate__r      s"     4 4 4eCHo 4    c                    \         P                  ! \        P                  4      P	                  4       pV\        V R7      ,
          pVP                  4       VP                  4       3# )zjGet the date range for the last N days.

Returns:
    Tuple of (from_date, to_date) as YYYY-MM-DD strings
)r	   )r   nowr   utcdater   	isoformat)r	   today	from_dates   &  r   get_date_ranger      sI     LL&++-E	t,,I %//"333r   c                \    V ^8  d   QhR\         \        ,          R\         \        ,          /# r   date_strr
   )r   r   r   )r   s   "r   r   r      s#      # 8H+= r   c                T   V '       g   R#  \        V 4      p\        P                  ! V\        P                  R7      #   \
        \        3 d     Mi ; i. ROpT FJ  p \        P                  ! Y4      P                  \        P                  R7      u #   \
         d     KH  i ; i	  R# )zXParse a date string in various formats.

Supports: YYYY-MM-DD, ISO 8601, Unix timestamp
Ntz)tzinfo)%Y-%m-%dz%Y-%m-%dT%H:%M:%Sz%Y-%m-%dT%H:%M:%SZz%Y-%m-%dT%H:%M:%S%zz%Y-%m-%dT%H:%M:%S.%f%z)	floatr   fromtimestampr   r   
ValueError	TypeErrorstrptimereplace)r   tsformatsfmts   &   r   
parse_dater*      s    
 8_%%bX\\::	" G 	$$X3;;8<<;PP 		  s!   0= AA3BB#"B#c                \    V ^8  d   QhR\         \        ,          R\         \        ,          /# )r   r'   r
   )r   r!   r   )r   s   "r   r   r   3   s"      (5/ hsm r   c                    V f   R#  \         P                  ! V \        P                  R7      pVP	                  4       P                  4       #   \        \        \        3 d     R# i ; i)z,Convert Unix timestamp to YYYY-MM-DD string.Nr   )	r   r"   r   r   r   r   r#   r$   OSError)r'   dts   & r   timestamp_to_dater/   3   sS    	z##B8<<8wwy""$$	7+ s   AA A&%A&c                ^    V ^8  d   QhR\         \        ,          R\        R\        R\        /# )r   r   r   to_dater
   )r   r   )r   s   "r   r   r   >   s-      (3- C # RU r   c                R   V '       g   R#  \         P                  ! V R4      P                  4       p\         P                  ! VR4      P                  4       p\         P                  ! VR4      P                  4       pYCu;8:  d
   V8:  d    R#  W48  d   R# R#   \         d     R# i ; i)zDetermine confidence level for a date.

Args:
    date_str: The date to check (YYYY-MM-DD or None)
    from_date: Start of valid range (YYYY-MM-DD)
    to_date: End of valid range (YYYY-MM-DD)

Returns:
    'high', 'med', or 'low'
lowr    high)r   r%   r   r#   )r   r   r1   r.   startends   &&&   r   get_date_confidencer7   >   s     x499;!!)Z8==?499;# Z  s   A>B B B&%B&c                \    V ^8  d   QhR\         \        ,          R\         \        ,          /# r   r   r   r   )r   s   "r   r   r   ]   s"      x} # r   c                   V '       g   R#  \         P                  ! V R4      P                  4       p\         P                  ! \        P
                  4      P                  4       pW!,
          pVP                  #   \         d     R# i ; i)zTCalculate how many days ago a date is.

Returns None if date is invalid or missing.
Nr    )r   r%   r   r   r   r   r	   r#   )r   r.   r   deltas   &   r   days_agor<   ]   sh    
 x499;X\\*//1
zz s   A*A7 7BBc                R    V ^8  d   QhR\         \        ,          R\        R\        /# )r   r   max_daysr
   r9   )r   s   "r   r   r   n   s%     + +HSM +S +# +r   c                    \        V 4      pVf   ^ # V^ 8  d   ^d# W!8  d   ^ # \        ^d^W!,          ,
          ,          4      # )zOCalculate recency score (0-100).

0 days ago = 100, max_days ago = 0, clamped.
)r<   r   )r   r>   ages   && r   recency_scorerA   n   s?    
 8
C
{
Qw
sa#.()**r   N)   )__doc__r   r   r   typingr   r   r   r*   r/   r7   r<   rA    r   r   <module>rF      s5    * 2 2 "4B>"+ +r   