+
    -i-                         R t ^ RIt^ RIt^ RIt^ RIHtHtHtHt ^ RIH	t	 ^ RI
Ht ^ RIHt RtR.tRt]	! R	4      tR
RRRRRRRRRRR/tR tR tR tR tR tR tR tR tR tR tR t]R8X  d
   ]! 4        R# R# )a  Harvey's Calendar Tool - Uses Google Service Account with domain-wide delegation.

Usage:
  calendar.py agenda [--days N] [--cal CALENDAR]
  calendar.py today
  calendar.py tomorrow
  calendar.py week
  calendar.py add --cal CALENDAR --title TITLE --start "YYYY-MM-DD HH:MM" [--end "YYYY-MM-DD HH:MM"] [--duration MINUTES] [--desc DESCRIPTION] [--location LOCATION]
  calendar.py delete --cal CALENDAR --event-id EVENT_ID
  calendar.py search --query QUERY [--days N]
  calendar.py list-calendars
  calendar.py free --date YYYY-MM-DD

Calendars (shortcuts):
  work     = mike@nomorechores.com
  personal = mikeziarko@gmail.com
  schedule = Personal Schedule
  launch27 = Launch27
  all      = all calendars (default for agenda)
N)datetime	timedeltatimezonetzinfo)ZoneInfo)service_account)buildz7/Users/harvey/.openclaw/secrets/google-calendar-sa.jsonz(https://www.googleapis.com/auth/calendarzmike@nomorechores.comAmerica/Torontoworkbusinessnmcpersonalzmikeziarko@gmail.comschedulez6c_7b722nur02urvj6qi9sud2rgqc@group.calendar.google.comlaunch27z\c_e565aef4a3632aad141aa02956b4c5031a9d87257b10b54ef69356cf2eab4a3f@group.calendar.google.comc                      \         P                  P                  \        \        R 7      p V P                  \        4      p\        RRVRR7      # ))scopescalendarv3F)credentialscache_discovery)r   Credentialsfrom_service_account_fileSA_FILESCOPESwith_subjectSUBJECTr   )creds	delegateds     3/Users/harvey/.openclaw/workspace/tools/calendar.pyget_servicer   -   s?    ''AA'RXAYE""7+ITy%PP    c                 l    V '       d   V R 8X  d   R# \         P                  V P                  4       V 4      # )allN)CALENDAR_MAPgetlower)names   &r   resolve_calendarr'   2   s'    45=DJJL$//r    c                     V P                  4       P                  4       P                  4       pVP                  R . 4       Uu. uF  q"R,          NK  	  up# u upi )itemsid)calendarListlistexecuter$   )serviceresultcs   &  r   get_all_calendar_idsr1   7   sK    !!#((*224F#ZZ454dGG4555s   Ac                    V R ,          P                  RV R ,          P                  RR4      4      pV R,          P                  RV R,          P                  RR4      4      pV P                  RR4      pV P                  RR4      pV P                  RR4      p R	V9   dy   \        P                  ! V4      P                  \        4      p\        P                  ! V4      P                  \        4      pVP                  R
4       RVP                  R4       2pM,\        P                  ! VR4      pVP                  R4       R2p RV RV 2p	V'       d   V	RV 2,          p	V	RV R2,          p	V	#   \         d    Tp L:i ; i)startdateTimedate endsummaryz
(no title)locationr*   T%a %b %d %I:%M %p - %I:%M %p%Y-%m-%dz%a %b %dz
 (all day)  z | z @ z  [id:])r$   r   fromisoformat
astimezoneTZstrftimestrptime	Exception)
eventr3   r7   r8   r9   event_iddt_startdt_endtime_strlines
   &         r   format_eventrM   ;   sj   'Nz5>+=+=fb+IJE
,

:uU|'7'7'C
DCii	<0GyyR(Hyyr"H	%<--e4??CH++C0;;B?F"++,?@AV__U_E`DabH((
;H"++J78
CH zWI&D#hZ  fXJa  DK  s   A>E. +E. .E>=E>c           
      *   \        4       p\        P                  ! \        4      pV\	        V P
                  R 7      ,           p\        V P                  4      pV'       d   V.M
\        V4      p. pV F  p VP                  4       P                  VVP                  4       VP                  4       RR^2R7      P                  4       pVP                  R. 4       F  p	WyR&   VP                  V	4       K  	  K  	  R pVP'                  VR7       V'       g   \!        RV P
                   R24       R
# \!        RV P
                   R\)        V4       R24       R
pV F  p	V	R,          P                  RV	R,          P                  RR4      4      p RV9   d9   \        P*                  ! V4      P-                  \        4      P/                  4       pM%\        P0                  ! VR4      P/                  4       pW8w  d:   Tp\!        RR 24       \!        RVP3                  R4       24       \!        R 4       \!        \5        T	4      4       K  	  R
#   \         d/   p
\!        RT RT
 R2\"        P$                  R	7        R
p
?
EK  R
p
?
ii ; i  \         d     Lci ; i)daysT	startTime)
calendarIdtimeMintimeMaxsingleEventsorderBy
maxResultsr)   	_calendarz  (error reading z: )fileNc                 f    V R ,          P                  RV R ,          P                  RR4      4      pV# )r3   r4   r5   r6   )r$   )ess   & r   sort_keycmd_agenda.<locals>.sort_keyn   s*    gJNN:qz~~fb'ABr    )keyzNo events in the next z day(s).u
   📅 Next u    day(s) — z	 events:
r3   r4   r5   r6   r:   r>   
r?   	%A, %B %dux   ────────────────────────────────────────)r   r   nowrC   r   rP   r'   calr1   eventsr,   	isoformatr-   r$   appendrF   printsysstderrsortlenrA   rB   r5   rE   rD   rM   )argsr.   rd   r7   cal_idcal_ids
all_eventscidrf   r]   exr_   current_dater^   ds   &              r   
cmd_agendarv   T   s1   mG
,,r
C
	tyy)
)Cdhh'F vh&:7&CGJ	E^^%**!# +  gi  ZZ,!$+!!!$ - " OOO!&tyyk:;	Jtyykc*o->j
IJLgJNN:qz~~fb'AB	ax**1-88<AAC%%a499;  :,'(1::k2345& 	l1o   	E%cU"RD2DD	E6  		s,   5A=IB#JJ"I<<JJJc           	         \        4       p\        V P                  4      pV'       g   \        R ,          p\        P
                  ! V P                  R4      P                  \        R7      pV P                  '       d7   \        P
                  ! V P                  R4      P                  \        R7      pM)V P                  ;'       g    ^<pV\        VR7      ,           pRV P                  RRVP                  4       RR/R	RVP                  4       RR//pV P                  '       d   V P                  VR
&   V P                  '       d   V P                  VR&   VP!                  4       P#                  W&R7      P%                  4       p\'        RV P                   24       \'        RVP)                  R4       RVP)                  R4       24       \'        RV 24       \'        RVR,           24       R# )r   z%Y-%m-%d %H:%Mr   )minutesr8   r3   r4   timeZoner	   r7   descriptionr9   )rR   bodyu   ✅ Created: z   r;   r<   r=   z   Calendar: z   Event ID: r*   N)r   r'   re   r#   r   rE   r3   replacerC   r7   durationr   titlerg   descr9   rf   insertr-   ri   rD   )rn   r.   ro   start_dtend_dtr~   
event_bodyrG   s   &       r   cmd_addr      s   mGdhh'Fj)   -=>FFbFQHxxx""488-=>FFbFQ==&&BIh77 	4::*h002J@QR
F,,.
<MNJ
 yyy$(II
=!}}}!%
:NN##v#GOOQE	M$**
&'	C!!"567s6??:;V:W
XY	M&
"#	M%+
'(r    c                 \   \        4       p\        V P                  4      pV'       g2   \        R \        P
                  R7       \        P                  ! ^4       VP                  4       P                  W P                  R7      P                  4        \        RV P                   RV 24       R# )z Error: --cal required for deleterZ   )rR   eventIdu   ✅ Deleted event z from N)r   r'   re   ri   rj   rk   exitrf   deleterH   r-   )rn   r.   ro   s   &  r   
cmd_deleter      ss    mGdhh'F0szzBNNv}}EMMO	t}}oVF8
<=r    c           
         \        4       p\        P                  ! \        4      pV\	        V P
                  R 7      ,           p\        V4      p. pV F~  p VP                  4       P                  VVP                  4       VP                  4       V P                  RRR7      P                  4       pVP                  VP                  R. 4      4       K  	  V'       g)   \        RV P                   RV P
                   R24       R# \        R	\!        V4       R
V P                   R24       V F  p\        \#        V4      4       K  	  R#   \         d     EK  i ; i)rO   TrQ   )rR   rS   rT   qrU   rV   r)   zNo events matching 'z' in the next z days.Nu   🔍 Found z event(s) matching 'z':
)r   r   rd   rC   r   rP   r1   rf   r,   rg   queryr-   extendr$   rF   ri   rm   rM   )	rn   r.   rd   r7   rp   rq   rr   rf   r]   s	   &        r   
cmd_searchr      s    mG
,,r
C
	tyy)
)C"7+GJ	^^%****!# +  gi  fjj"56  $TZZLtyykPQ	KJ((<TZZL
MNl1o   		s   A:EEEc                   a \        4       pVP                  4       P                  4       P                  4       p\	        R 4       VP                  R. 4       Fp  o\        V3R l\        P                  4        4       R4      pV'       d   RV R2MRp\	        RSP                  RR	4       V 24       \	        R
SR,           24       Kr  	  R# )u   📋 Available calendars:
r)   c              3   L   <"   T F  w  rVSR ,          8X  g   K  Vx  K  	  R# 5i)r*   N ).0kvre   s   &  r   	<genexpr>%cmd_list_calendars.<locals>.<genexpr>   s!     N';tqqCI~';s   $
$Nz (shortcut: rY   r6   r?   r8   z	(unnamed)z    ID: r*   )	r   r+   r,   r-   ri   r$   nextr#   r)   )rn   r.   r/   shortcutlabelre   s   &    @r   cmd_list_calendarsr      s    mG!!#((*224F	
'(zz'2&N|'9'9';NPTU.6,xj*B3779k23E7;<T$%	 'r    c                >   \        4       p\        P                  ! V P                  R4      P	                  \
        R7      pVP	                  ^^ R7      pVP	                  ^^ R7      p\        V4      pRVP                  4       RVP                  4       RRRV Uu. uF  pR	V/NK	  	  up/pVP                  4       P                  VR
7      P                  4       p. p	VP                  R/ 4      P                  4        F  w  rVP                  R. 4       Fu  p\        P                  ! VR,          4      P                  \
        4      p\        P                  ! VR,          4      P                  \
        4      pV	P                  W34       Kw  	  K  	  V	P!                  4        \#        RVP%                  R4       R24       V	'       g   \#        R4       R# V	^ ,          .pV	R,           FZ  w  rWR,          ^,          8:  d0   VR,          ^ ,          \'        VR,          ^,          V4      3VR&   KH  VP                  W34       K\  	  \#        R4       V F4  w  r\#        RVP%                  R4       RVP%                  R4       24       K6  	  \#        R4       TpV FG  w  rVV8  d0   \#        RVP%                  R4       RVP%                  R4       24       \'        VV4      pKI  	  VV8  d2   \#        RVP%                  R4       RVP%                  R4       24       R# R# u upi )z'Show free/busy blocks for a given date.r>   rx   )hourminuterS   rT   rz   r	   r)   r*   )r|   	calendarsbusyr3   r7   u   📅 Free/Busy for rc   z (7am-10pm):
z  Completely free!N:   NNz  BUSY:z    r=   r<   z
  FREE:)r   r   rE   r5   r}   rC   r1   rg   freebusyr   r-   r$   r)   rA   rB   rh   rl   ri   rD   max)rn   r.   r5   	day_startday_endrp   rr   r|   r/   r   ro   dataperiodr^   r]   mergedcursors   &                r   cmd_freer      s   mGTYY
3;;2;FD!A.Ill1l-G"7+G9&&(7$$&%1#4+1	D %%4%088:F D

;399;hhvr*F&&vg7BB2FA&&ve}5@@DAKK + < 	IIK	k :;>
JK"# 1gYFRr
1 *Q-VBZ]A)>?F2JMM1&!	  
)QZZ
+,C

:0F/GHI  
+FA:D45SJ9O8PQRVQ  V__Z01W5E5Ej5Q4RST S 2s   Lc                     \         P                  ! R R7      p V P                  RR7      pVP                  R4      pVP	                  R\
        ^R7       VP	                  RRR	7       VP                  R
4       VP                  R4       VP                  R4       VP                  R4      pVP	                  RRR	7       VP	                  RRR7       VP	                  RRRR7       VP	                  RRR7       VP	                  R\
        RR7       VP	                  RRR7       VP	                  RRR7       VP                  R4      pVP	                  RRR7       VP	                  RRR7       VP                  R 4      pVP	                  R!RR7       VP	                  R\
        ^R7       VP                  R"4       VP                  R#4      pVP	                  R$RR%R7       V P                  4       pVP                  '       g'   V P                  4        \        P                  ! ^4       VP                  R
8X  d   ^Vn        RVn        \        V4       R&# VP                  R8X  d   ^Vn        RVn        \        V4       R&# VP                  R8X  d   ^Vn        RVn        \        V4       R&# VP                  R8X  d   \        V4       R&# VP                  R8X  d   \        V4       R&# VP                  R8X  d   \        V4       R&# VP                  R 8X  d   \!        V4       R&# VP                  R"8X  d   \#        V4       R&# VP                  R#8X  d   \%        V4       R&# R&# )'zHarvey Calendar Tool)r{   command)destagendaz--days)typedefaultz--calr"   )r   todaytomorrowweekaddr   z--titleT)requiredz--startzYYYY-MM-DD HH:MM)r   helpz--end)r   z
--durationz Duration in minutes (default 60))r   r   z--descDescriptionz
--locationLocationr   z
--event-idsearchz--queryzlist-calendarsfreez--datez
YYYY-MM-DDN)argparseArgumentParseradd_subparsers
add_parseradd_argumentint
parse_argsr   
print_helprj   r   rP   re   rv   r   r   r   r   r   )parsersubp_agendap_addp_delp_searchp_freern   s           r   mainr     s   $$1GHF


Y

/C ~~h'H(a8'51 NN7NN:NN6 NN5!E	w
3	y40	y46HI	w%78	|#4VW	xm4	|*5 NN8$E	w.	|d3 ~~h'H)d3(b9 NN#$ ^^F#F
4lCD<<< ||w	4		#	4			4		!4				!4		!4	)	)4 		 
 r    __main__)__doc__r   jsonrj   r   r   r   r   zoneinfor   google.oauth2r   googleapiclient.discoveryr   r   r   r   rC   r#   r   r'   r1   rM   rv   r   r   r   r   r   r   __name__r   r    r   <module>r      s   *   
 : :  ) +
C
4	5
!  #'	"&HnQ
0
623j)>>:&6UpGR zF r    