
    0j>3                       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J	r	J
r
  S SKJrJr  S SKJr  S SKJr  \" \5      R%                  5       R&                  r\S-  r\S-  r\S	-  r\" S
5      rSrSr\" S5      rS'S(S jjrS)S*S j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%S0S jr&S1S jr'S2S jr(S2S jr)S3S4S jjr*S5S jr+S6S jr,S6S jr-S7S  jr.S8S! jr/S9S:S" jjr0S;S# jr1S<S$ jr2S=S% jr3\4S&:X  a  \3" 5         gg)>    )annotationsN)parserequest)datetime	timedelta)Path)ZoneInfoz
morning.mdzcoros_snapshot.jsonzcalendar_snapshot.jsonzAmerica/Los_Angeles92627-   z]C:\Users\valle\.codex\plugins\cache\personal\oura-ring\0.2.0+codex.20260605\scripts\server.pyc                   [         R                  " 5       n U(       a  [        R                  " U5        [        R
                  R                  X5      nUb  UR                  c  [        SU 35      e[        R
                  R                  U5      nUR                  R                  U5        U[        R                  " U5        $ ! [        R                  " U5        f = f)NzCannot load )r   cwdoschdir	importlibutilspec_from_file_locationloaderRuntimeErrormodule_from_specexec_module)namepathr   old_cwdspecmodules         .\generate_dashboard.pyload_moduler      s    hhjG
HHSM~~55dA<4;;.dV455006'
s   BC Cc                .    U b  U S:X  a  U$ [        U 5      $ )N )str)valuefallbacks     r   valr#   (   s    }8CUC    c                j     [        [        [        U 5      5      5      $ ! [        [        4 a     g f = fN)introundfloat	TypeError
ValueErrorr!   s    r   scorer-   ,   s2    5u&''z" s    22c            
         [        S[        5      n U R                  SSS9nUR                  S5      =(       d    / nU(       a  US   O0 nSUR                  S5      =(       d    UR                  S5      UR                  S	5      =(       d    UR                  S
5      UR                  S5      =(       d    UR                  S5      UR                  S5      =(       d    UR                  S5      UR                  S5      =(       d    UR                  S5      UR                  SS5      S.$ ! [         a  nS[        U5      S.s S nA$ S nAff = f)Noura_server   T)daysliver1   readiness_scoreaverage_readinesssleep_scoreaverage_sleep_scoreaverage_sleep_hrvresting_heart_rateaverage_resting_hrsleep_hoursaverage_sleep_hourssourceoura)ok	readinesssleephrvrhrr;   r=   Fr?   error)r   OURA_SERVERsummarize_recovery_trendsget	Exceptionr    )r>   summaryr1   latestexcs        r   	load_ourarM   3   s   0=+600ad0C{{6"(b!br$56Z'++FY:ZZZ.T'++>S2T::12VgkkBU6V::23Xw{{CW7X!::m4ZDY8Zkk(F3
 	
  0c#h//0s   D$D' '
E	1E>E	E	c                J    / SQn[         R                  " USSSS9nUR                  S:w  a?  [        UR                  =(       d    UR
                  R                  5       =(       d    S5      e[        R                  " UR
                  =(       d    S5      n[        U[        5      (       a  UOUR                  S/ 5      n/ nUS S	  H}  nUR                  S
5      =(       d    UR                  S5      =(       d    Sn[        UR                  S5      5      n[        UR                  S5      5      n	UR                  XxU	S.5        M     SUS.$ ! [         aM  n
[        5       nUR                  S5      (       a  [!        U
5      US'   Us S n
A
$ S[!        U
5      S.s S n
A
$ S n
A
ff = f)N)gogcalendareventsprimaryz--todayz--max=5z--jsonz--results-onlyT   )capture_outputtexttimeoutr   zgog calendar failedz[]rQ      rJ   display_titleEventstartend)titlerZ   r[   )r?   rQ   r?   warningFrD   )
subprocessrun
returncoder   stderrstdoutstripjsonloads
isinstancelistrH   
event_timeappendrI   load_calendar_snapshotr    )nowcmd	completedpayloadrQ   compacteventr\   rZ   r[   rL   r"   s               r   load_calendarrq   F   sY   0	
 NN3t$PRS	1$	 0 0 DI4D4DKKMfQfgg**Y--56&w557;;xQS;TBQZEIIi(QEIIo,FQ'Euyy12EUYYu-.CNNU3GH	  
 g.. 0)+<<"%c(HYOc#h//0s*   EE 
F"/FF"
FF"F"c                 $    [         R                  " [        5      n SU  S3n[        R                  " USS0S9n[        R
                  " USS9 n[        R                  " UR                  5       R                  S5      5      nS S S 5        WR                  S	5      =(       d    0 /S
   nUR                  S5      =(       d    0 /S
   nUR                  S5      =(       d    / nU(       a  [        S U 5       5      OS nSUR                  S5      UR                  S5      UR                  S5      =(       d    0 /S
   R                  S5      UR                  S5      US.$ ! , (       d  f       N= f! [         a  n	S[        U	5      S.s S n	A	$ S n	A	ff = f)Nzhttps://wttr.in/z
?format=j1z
User-AgentzeInk-dashboard/1.0)headers   )rV   utf-8current_conditionr   weatherhourlyc              3  h   #    U  H(  n[        UR                  S 5      =(       d    S5      v   M*     g7f)chanceofrainr   N)r'   rH   ).0hours     r   	<genexpr>load_weather.<locals>.<genexpr>q   s-      
 (-A..s   02Ttemp_F
FeelsLikeFweatherDescr!   windspeedMiles)r?   temp_ffeels_f	conditionwind_mphrain_chanceFrD   )r   quoteWEATHER_LOCATIONr   Requesturlopenrd   re   readdecoderH   maxrI   r    )
queryurlreqresponsern   currenttodayrx   r   rL   s
             r   load_weatherr   f   sa   0,- z2oocL:N+OP__S"-jj!7!7!@AG . ;;23;tQ?Y'/B438$*   

 
  	 kk(+{{<0!++m4<a@DDWM$45&
 	
 .-&  0c#h//0s7   AE- 4ECE- 
E*&E- -
F7F
F
Fc           
     R   U R                  S5      (       d  S/$ U R                  S5      nUb  SU S3OSnS[        U R                  S5      5       S	[        U R                  S
5      5       S[        U R                  S5      5       3S[        U R                  S5      5       SU 3/$ )Nr?   zWeather: unavailabler   z | rain %r   z	Weather: r   zF feels r   zF | r   zWind: r   z mph)rH   r#   )rw   rain	rain_texts      r   weather_linesr      s    ;;t&'';;}%D&*&6(4&"BI
CH-./ 0gkk),-. /'++k*+,	. W[[,-.d9+>	 r$   c                    [         R                  5       (       d  SSS.$  [        R                  " [         R	                  SS95      n U R                  S5      =(       d    / nSUSS	.$ ! [         a  nS[        U5      S.s S nA$ S nAff = f)
NFzno calendar_snapshot.jsonrD   ru   encodingrQ   Tsnapshot)r?   rQ   r=   )CALENDAR_SNAPSHOTexistsrd   re   	read_textrH   rI   r    )datarQ   rL   s      r   rj   rj      s~    ##%%&ABB0zz+55w5GH(#)rf
CC 0c#h//0s   AA' '
B	1B>B	B	c                    [        U [        5      (       a)  U R                  S5      =(       d    U R                  S5      $ U $ )NdateTimedate)rf   dictrH   r,   s    r   rh   rh      s1    %yy$9		&(99Lr$   c                     [         R                  5       (       d  SSS.$  [        R                  " [         R	                  SS95      n SU S'   U $ ! [
         a  nS[        U5      S.s S nA$ S nAff = f)NFzno coros_snapshot.jsonrD   ru   r   Tr?   )SNAPSHOTr   rd   re   r   rI   r    )r   rL   s     r   
load_corosr      si    ??&>??0zz(,,g,>?T
 0c#h//0s   -A 
A0A+%A0+A0c                |    U (       d  g  [         R                  " U 5      R                  5       $ ! [         a     g f = fr&   )r   fromisoformatr   r+   r,   s    r   
parse_dater      s9    %%e,1133 s   #. 
;;c                |   U R                  S5      n[        U[        5      (       aB  U Vs/ s H4  n[        U[        5      (       d  M  UR                  S5      (       d  M2  UPM6     sn$ / nU R                  S5      (       aK  UR	                  [
        R                  " [        5      R                  5       R                  5       U S   S.5        U R                  S5      (       aU  UR	                  [
        R                  " [        5      R                  5       [        SS9-   R                  5       U S   S.5        U$ s  snf )Nworkoutsr   today_workout)r   r\   next_workout   )r1   )rH   rf   rg   r   ri   r   rk   TZr   	isoformatr   )corosr   itemlegacys       r   coros_workoutsr      s    yy$H(D!!!)YZd-CQWHXYY Fyy!!x||B/446@@BUSbMcdeyy  R 0 5 5 7):K KVVXchiwcxyzM Zs   D9D9 D9c                l    [        U 5       H%  n[        UR                  S5      5      U:X  d  M#  Us  $    g Nr   )r   r   rH   )r   target_dateworkouts      r   workout_for_dater      s1    !%(gkk&)*k9N ) r$   c                    [        U 5       Vs/ s H/  n[        UR                  S5      5      =n(       d  M&  X1:  d  M-  UPM1     nn[        US S S9$ s  snf )Nr   c                    [        U S   5      $ r   )r   )r   s    r   <lambda>$next_workout_after.<locals>.<lambda>   s    
4<(@r$   )keydefault)r   r   rH   min)r   r   r   parsedfutures        r   next_workout_afterr      sd     &e,,G V!455F5 	;A;O 	,  
 v@$OOs   %AAAc                    U (       d  U$ U R                  S5      =(       d    U R                  S5      =(       d    UnU R                  S5      nU(       a  U SU S3$ U$ )Nr\   r   distance_mi (z mi))rH   )r   r"   r\   distances       r   workout_titler      sT    KK CGKK$7C8E{{=)H8*D))Lr$   c                    U (       d  g [         R                  " U R                  SS5      5      R                  [        5      R                  S5      R                  S5      $ ! [         a     gf = f)N?Zz+00:00%I:%M %p0)r   r   replace
astimezoner   strftimelstriprI   )iso_texts    r   
short_timer      sa    %%h&6&6sH&EFQQRTU^^_ijqqruvv s   AA! !
A.-A.c                B    U R                  S5      R                  S5      $ )Nr   r   )r   r   dts    r   
local_timer      s    ;;z"))#..r$   c                B    U R                  S5       SU R                   3$ )Nz%a %b )r   dayr   s    r   	local_dayr      s!    kk'"#1RVVH--r$   c           
         U R                  S5      (       d  gU R                  S5      =(       d    / nU(       d  gUS   nSUS    S[        UR                  S	5      5       S
[        UR                  S5      5       3$ )Nr?   zCalendar: unavailablerQ   zCalendar: open dayr   z
Calendar: r\   r   rZ   -r[   )rH   r   )rP   rQ   rp   s      r   first_calendar_liner      sv    <<&\\(#)rF#1IEg'qEIIg4F)G(H*UZU^U^_dUeJfIghhr$   c                2   [        U R                  S5      5      n[        UR                  S5      5      nUR                  S5      n[        X5      n[        X5      n[	        U5      nU(       dO  U(       aG  [        UR                  S5      5      n	U	(       a  U	R                  S5      OSn
SSU
 S	[	        U5       34$ g
Ub  US:  a  SU S34$ Ub  US:  a  SU S34$ [        U[        [        45      (       a  US:  a  SU S34$ Uc  Uc  gS[        U5      4$ )Nr@   recovery
load_ratior   z%alaterNO COROS PLANzNext: r   )r   zNo scheduled COROS workoutA   REDUCEz; keep it easy<   z; cap effortg?z; no hero pace)CHECKzmissing recovery inputsKEEP)r-   rH   r   r   r   r   r   rf   r'   r)   r    )r>   r   r   r@   r   r   r   r   planned	next_datelabels              r   run_decisionr      s'   dhh{+,IUYYz*+H<(J$U8M%e9LM*G"<#3#3F#;<I09I&&t,wE"fUG1]<5P4Q$RRR<RG9N3332G9L111*sEl++
S0@G9N333X-13w<r$   c                V    [        U 5      U::  a  U $ U S US-
   R                  5       S-   $ )Nr   .)lenrstrip)rU   limits     r   	trim_liner     s1    t9%4K4%!)+<+C+C+E+KKr$   c                P   / nU  H  nU(       a  [        U5      [        ::  a  UR                  U5        M0  UR                  S5      (       a-  UR	                  [
        R                  " U[        SSSS95        Ms  UR	                  [
        R                  " U[        SSS95        M     U$ )N- z  F)widthsubsequent_indentbreak_long_wordsbreak_on_hyphens)r   r   r   )r   
LINE_WIDTHri   
startswithextendtextwrapwrap)lineswrappedlines      r   wrap_dashboard_linesr    s    Gs4yJ.NN4 ??4  NN$&*%*%* MM !&!&		
# 2 Nr$   c                 
   [         R                  " [        5      n U R                  5       nU [	        SS9-   n[        5       n[        5       n[        U 5      n[        5       n[        X6U5      u  pxS[        U 5       3S[        U 5       S[        U5       3/[        U5      QSPSPS[        [        UR                  S	5      5      5       S
[        [        UR                  S5      5      5       S[        [        UR                  S5      5      5       S[        [        UR                  S5      5      5       3PS[        UR                  S5      5       S[        UR                  S5      5       3PS[        UR                  S5      5       S[        UR                  S5      5       S[        UR                  S5      5       S[        UR                  S5      5       S3	PS[        UR                  S5      5       3P[!        U5      PSPSPS U 3PS![#        U5       3PS"PS#PSPS$Pn	UR                  S%5      (       ab  UR                  S&5      (       aL  US&   S S'  H?  n
U	R%                  S(['        U
R                  S)5      5       S*[#        U
S+   S,5       35        MA     OU	R%                  S-5        [)        Xa5      nU(       a`  [+        UR                  S.5      5      nU(       a  UR-                  S/5      OS0nU	R/                  SS1U S2[#        [1        U5      S35       3/5        / nS4U4S5U4S6U4S7U44 H2  u  nnUR%                  UR                  S%5      (       a  UOU S835        M4     U	R/                  SS9S:S*R3                  U5      -   /5        UR                  S%5      (       d.  U	R%                  S;[#        UR                  S<S=5      S>5       35        UR                  S%5      (       d.  U	R%                  S?[#        UR                  S<S=5      S>5       35        UR                  S%5      (       d/  U	R%                  S@[#        UR                  S<S=5      S>5       35        OCUR                  SA5      (       a-  U	R%                  SB[#        UR                  SA5      S>5       35        UR                  S%5      (       d.  U	R%                  SC[#        UR                  S<S=5      S>5       35        [5        U	 Vs/ s H  nUR7                  5       PM     sn5      $ s  snf )DNr   )hoursz# zUpdated z | next r   z	## StatuszOura: R r@   z	 | Sleep rA   z | HRV rB   z | RHR rC   zSleep: r;   z hr | Oura source r=   zCOROS: Rec r   z	% | Load 
short_load/	long_loadr   r   )zCOROS state: recovery_levelz## RunzRun: zPlan: z1Route: Back Bay easy; Crystal Cove only if trailsz1Fuel: carbs before; water/electrolytes after workz## Todayr?   rQ   rW   r   rZ   r   r\       z- Calendar unavailable or emptyr   z%a %b %dNextz## Upcomingz: r   WeatherOuraCalCOROS!z
## Sourcesz	Sources: zWeather issue: rE   unknownP   zOura issue: zCalendar issue: r]   zCalendar fallback: zCOROS issue: )r   rk   r   r   r   rM   r   rq   r   r   r   r   r   r#   r-   rH   r   r   ri   r   r   r   r   r   r   joinr  r   )rk   r   next_updater>   rw   rP   r   callplanr  rp   r   r   r   source_bitsr   r   r  s                     r   build_linesr  3  s9   
,,r
CHHJE	**K;DnGS!HLEd51JD Ys^
:c?#8J{,C+DE 
w	 		
 	 3uTXXk2345Ys5RYIZC[?\>]]dehinosowowx}o~i  fA  eB  BI  JM  NS  TX  T\  T\  ]b  Tc  Nd  Je  If  	g #dhh}-.//A#dhhxFXBYAZ[ c%))J/013uyy?V;W:XXYZ]^c^g^ghs^tZuYvvxy|  ~C  ~G  ~G  HT  ~U  zV  yW  WX  	Y EII&6789: 	H% 	 	 v 4!" 	<  	<!" 	#$ 	%E* ||Dhll844h'+ELL2j7);<=QywY[?\>]^_ , 	67%e3L|//78	2;	"":.b-E7"Y}\?Z\^5_4`)abcK!7+fd^eX=NQXZ_P`a
d488D>>4$qzB b	LL"lK#((;2G$GHI;;tyWi1PRT'U&VWX88D>>|Idhhw	.JB$O#PQR<<'	(,,w	2RTV(W'XYZ	i	 	 *9X\\)5Lb+Q*RST99T??}Yuyy)/Lb%Q$RST5 A545 ABB As   )T
c                     [        5       n [        R                  SR                  U 5      S-   SS9  [	        S[         S[        U 5       S35        g )N
ru   r   zWrote r   z lines))r  OUTPUT
write_textr  printr   )r  s    r   mainr   p  sE    ME
dii&-@	F6("SZL
01r$   __main__r&   )r   r    r   r   r   zPath | None)r   )r"   r    returnr    )r"  z
int | None)r"  r   )rk   r   r"  r   )rw   r   r"  	list[str])r"  
str | None)r!   r$  )r   r   r"  z
list[dict])r   r   r"  dict | None)zplanned run)r   r%  r"   r    r"  r    )r   r$  r"  r    )r   r   r"  r    )rP   r   r"  r    )r>   r   r   r   r"  ztuple[str, str])r   )rU   r    r   r'   r"  r    )r  r#  r"  r#  )r"  r#  )r"  None)5
__future__r   importlib.utilr   rd   r   r^   r   urllibr   r   r   r   pathlibr   zoneinfor	   __file__resolveparentROOTr  r   r   r   r   r   rF   r   r#   r-   rM   rq   r   r   rj   rh   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r   __name__ r$   r   <module>r2     s   "   	   ! (   H~&&		''33 #$ 
dD0&0@08
00P/.i 4L<:Cz2 zF r$   