+
    „WÝj(7  ã                  ó¼  a € 0 t $ R t^ RIHt ^ RIt^ RIt^ RIt^ RIHt ^ RI	H	t	H
t
Ht ^ RIHt ^ RIHtHt ^RIHt RCtR	tRt^],          R
3^],          R3^x],          R3R],          R33tRDt]! 0 REm4      t]! ]P6                  ]P8                  04      tRt]P                  tR] R&   R R lt!R R lt"R R lt#R R lt$R R lt%R R lt&R R lt'R  R! lt(R" R# lt)R$ R% lt*R& R' lt+/ t,R(] R)&   ]PZ                  ! 4       t.R* R+ lt/R, R- lt0R. R/ lt1R0 R1 lt2R2RR3RR4RR5R6/R7 R8 llt3R9 R: lt4R; R< lt5] ! R= R>4      4       t6R? R@ lt7] ! RA RB4      4       t8R# )Faú  Daily engagement rollup, per-conversation session tally and turns-before-switch.

Engagement is accumulated locally per UTC day in the profile's metrics store and emitted once the
day closes (the first interaction of a later day): one ``hermes.engagement.surface_day.count`` row
per surface used, and one ``hermes.engagement.day.count`` row with the day's total active time, how
many surfaces it touched and the model that served most attended turns. Active time is the sum of
the gaps between consecutive interactions (a turn starting or ending), each capped at
``IDLE_CAP_MS``. Days-active-per-week and next-day/next-week return by model are derived
server-side from these daily rows and the package ``install_id``: nothing here keeps a weekly
window or any identifier of its own.

The day row also carries ``active_profile_count_bucket``: how many distinct profiles of this host
had a user turn that UTC day. Every profile's interactions are folded into ONE host accumulator,
the root (default) profile's day state, as opaque local hashes of the profile home (a set, so a
profile is counted once whichever process or multiplexed runtime served it). Only the root
profile's day row reports the count; every other profile's row carries ``0`` so no row claims the
host total twice. When the root profile has collection off, nothing is written to its store and
the count is not reported.

Only closed enums, buckets, catalog-sanitized provider/model names and profile hashes are stored
in the state row; the hashes never leave it.
)ÚannotationsN)Ú	dataclass)ÚdatetimeÚtimezoneÚUTC)ÚPath)ÚAnyÚCallable)Úshared_metrics_contracti`ê  Úengagement_day_stateÚlt_5mÚ	5m_to_30mÚ	30m_to_2hih  Ú2h_to_6hÚ*zCallable[[], float]Ú_nowc               ó    € V ^8„  d   QhRRRR/# )é   Ú	active_msÚintÚreturnÚstr© )Úformats   "ÚfC:\Users\johnn\AppData\Local\hermes\hermes-agent\hermes_cli\observability\shared_metrics_engagement.pyÚ__annotate__r   9   s   € ÷ `ñ ` Sð `¨Sñ `ó    c                óL   € V ^ 8:  d   R# \         P                  ! V \        R4      # )é    Ú0Úgte_6h)ÚcontractÚ_bucketÚ_ACTIVE_THRESHOLDS)r   s   &r   Úactive_minutes_bucketr$   9   s$   € Ø˜q”.ˆ3Ð_¤h×&6Ò&6°yÔBTÐV^Ó&_Ð_r   c               ó    € V ^8„  d   QhRRRR/# )r   Úcountr   r   r   r   )r   s   "r   r   r   =   s   € ÷ 0ñ 0 ð 0¨ñ 0r   c                ó*   € V ^8  d   \        V 4      # R# )é   Úgte_4)r   )r&   s   &r   Úsurfaces_used_bucketr*   =   s   € Ø œŒ3ˆu‹:Ð/¨Ð/r   c               ó    € V ^8„  d   QhRRRR/# )r   Úturnsr   r   r   r   )r   s   "r   r   r   A   s   € ÷ Añ A cð A¨cñ Ar   c                ó:   € \         P                  ! V \        R 4      # )Úgte_31)r!   r"   Ú_SWITCH_THRESHOLDS)r,   s   &r   Úturns_before_switch_bucketr0   A   s   € Ü×Ò˜EÔ#5°xÓ@Ð@r   c               ó    € V ^8„  d   QhRRRR/# )r   Ú
classifiedzlist[tuple[str, dict, int]]r   ú
str | Noner   )r   s   "r   r   r   G   s   € ÷ ñ Ð$?ð ÀJñ r   c                óÊ   € V  F\  w  rpV\         9   g   K  VP                  R4      \        9   g   K/  VP                  RR4      pV\        P                  9   d   Vu # Ru # 	  R# )z>The engagement surface of a task start/end counter, else None.Ú
entrypointÚexecution_surfaceÚ N)Ú_INTERACTION_METRICSÚgetÚ_ENGAGED_ENTRYPOINTSr!   ÚENGAGEMENT_SURFACES)r2   Úmetric_nameÚ
dimensionsÚ_Úsurfaces   &    r   Úinteraction_surfacer@   G   sY   € ã&0Ñ"ˆ ØÔ.Ö.°:·>±>À,Ó3OÔSgÖ3gØ —n‘nÐ%8¸"Ó=ˆGØ%¬×)EÑ)EÔE�7ÒOÈ4ÒOñ '1ñ r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Ústart_fieldsúdict[str, str] | NoneÚ	user_turnÚboolr   r   )r   s   "r   r   r   P   s'   € ÷ Xñ XÐ4ð XÀð XÈ$ñ Xr   c                óZ   € T;'       d#    T ;'       g    / P                  R4      \        9   # )z`A turn a person sent on an engagement surface (its model counts toward the day's primary model).r5   )r9   r:   )rB   rD   s   &&r   Úengaged_turnrG   P   s)   € à×WÐW˜,×,Ð,¨"×1Ñ1°,Ó?ÔCWÑWÐWr   c               ó    € V ^8„  d   QhRRRR/# )r   Úeventr   r   útuple[str, str] | Noner   )r   s   "r   r   r   U   s   € ÷ ñ �cð Ð4ñ r   c                óZ  aa€ \         P                  ! V 3/ \         P                  B '       g   R# \         P                  ! V R4      \         P                  8w  d   R# \        V RR4      o\        S\        4      '       d   \        S4      RR08w  d   R# \         P                  o\        ;QJ d    . V3R lR
 4       F  NK  	  5M! V3R lR
 4       4      p\        ;QJ d)    V3R l\        R
V4       4       F  '       d   K   RM	  R	M! V3R l\        R
V4       4       4      '       g   R# V# )z8(provider, model) of one validated engagement turn mark.NÚnameÚdataÚmodelÚproviderc              3  ó6   <"  € T F  pSV,          x € K  	  R # 5i©Nr   )Ú.0ÚkrM   s   & €r   Ú	<genexpr>Úturn_route.<locals>.<genexpr>_   s   øé € Ð9Ñ#8˜a�$�q—'’'Ó#8ùs   ƒc              3  óœ   <"  € T FA  w  r\        V\        4      ;'       d#    V\        P                  ! VSV,          R 7      8H  x € KC  	  R# 5i))Ú
max_lengthN)Ú
isinstancer   r!   Ú_metric_identifier)rR   rS   ÚvÚlimitss   &  €r   rT   rU   `   sE   øé € ð >Ù<‘4�1ô ˜!œSÓ!×_Ð_ a¬8×+FÒ+FÀqÐU[Ð\]ÕU^Ô+_Ñ&_Ô_Û<ùs
   ƒA¡+AFT)rO   rN   )r!   Ú_valid_shapeÚ_MARK_SHAPEÚ_event_textÚENGAGEMENT_TURN_MARKÚgetattrrX   ÚdictÚsetÚ_MODEL_ROUTE_MAX_LENGTHSÚtupleÚallÚzip)rI   ÚrouterM   r[   s   & @@r   Ú
turn_routerh   U   sà   ù€ ä× Ò  Ñ?¬(×*>Ñ*>×?Ð?ÙÜ×Ò˜E 6Ó*¬h×.KÑ.KÔKÙÜ�5˜& $Ó'€DÜ�dœD×!Ò!¤S¨£Y°7¸JÐ2GÔ%GÙÜ×.Ñ.€FßŒEÔ9Ñ#8Ó9�E‰EÔ9Ñ#8Ó9Ó9€Eß‹3ô >ÜÐ4°eÔ<ó>�3�3Š3ô >ÜÐ4°eÔ<ó>÷ >ò >áØ€Lr   c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# )r   Ústorer   Úresourceúdict[str, str]r?   r3   rg   rJ   r   ÚNoner   )r   s   "r   r   r   f   s1   € ÷ ñ �#ð  ð ¸Zð ÐPfð Ðkoñ r   c               ó€  aaaaa€ \        V P                  4      P                  P                  P                  p\        V4      pWT8H  oSe   \	        V4      MRoV P                  \        VVVVV3R l4       SeD   S'       g:   \        V4      '       d'   \        V4      P                  \        VV3R l4       R# R# R# R# )z»The clock is read inside each write transaction: writers then apply in clock order, so no
process closes a day another already closed. A busy store defers the interaction, never drops it.Nc           
     óX   <€ \        T \        4       SSSS'       d	   SSR7      # R SR7      # )N)Únow_msrk   r?   rg   ÚprofileÚowner©ÚapplyÚ_now_ms)Ústaterr   rq   rk   rg   r?   s   &€€€€€r   Ú<lambda>Úrecord.<locals>.<lambda>m   s(   ø€ ´uØ”g“i¨(¸GÈ5ß �°%õ8à&*°%õ8r   c                ó4   <€ \        V \        4       SSR R7      # )T)rp   rk   rq   rr   rs   )rv   rq   rk   s   &€€r   rw   rx   r   s   ø€ ÌEØœ'›)¨hÀÈtõM
r   )	r   Údatabase_pathÚparentÚ
_root_homeÚ_profile_hashÚupdate_rollup_stateÚ	STATE_KEYÚ	_collectsÚ_root_store)rj   rk   r?   rg   Úprofile_homeÚ	root_homerr   rq   s   &fdd  @@r   Úrecordr„   f   s�   ü€ ô ˜×+Ñ+Ó,×3Ñ3×:Ñ:×AÑA€LÜ˜<Ó(€IØÑ%€EØ-4Ò-@Œm˜LÔ)Àd€GØ	×Ñœi÷ *ð *ô ð Ò§5¬Y°y×-AÒ-AÜ�IÓ×2Ñ2´9õ ?
ö 	ñ .B¡5Ñr   c               ó   € V ^8„  d   QhRR/# )r   r   r   r   )r   s   "r   r   r   w   s   € ÷ ñ �ñ r   c                 ó6   € \        \        4       R ,          4      # )éè  )r   r   r   r   r   ru   ru   w   s   € ÜŒt‹v˜�}ÓÐr   c               ó    € V ^8„  d   QhRRRR/# )r   r‚   r   r   r   )r   s   "r   r   r   {   s   € ÷ &ñ &˜Tð & dñ &r   c                ó€   € ^ RI Hp  V! V R7      P                  4       #   \         d    T P                  4       u # i ; i)r   )Úget_default_hermes_root)Úhome)Úhermes_constantsrŠ   ÚresolveÚ	Exception)r‚   rŠ   s   & r   r|   r|   {   s<   € Ý8ð&Ù&¨LÔ9×AÑAÓCÐCøÜô &Ø×#Ñ#Ó%Ò%ð&ús   ˆ Ÿ=¼=c               ó    € V ^8„  d   QhRRRR/# )r   r‚   r   r   r   r   )r   s   "r   r   r   „   s   € ÷ Qñ Q ð Q¨ñ Qr   c                ó¢   € \         P                  ! \        V P                  4       4      P	                  4       4      P                  4       R ,          # ):Né   N)ÚhashlibÚsha256r   r�   ÚencodeÚ	hexdigest)r‚   s   &r   r}   r}   „   s6   € Ü�>Š>œ#˜l×2Ñ2Ó4Ó5×<Ñ<Ó>Ó?×IÑIÓKÈCÕPÐPr   c               ó    € V ^8„  d   QhRRRR/# )r   r‹   r   r   rE   r   )r   s   "r   r   r   ˆ   s   € ÷ Fñ F�Dð F˜Tñ Fr   c                ó~  € ^ RI HpHp V! \        V 4      4      p ^ RIHp V! 4       ;'       g    / p T! T4       R F,  p\        T\        4      '       d   TP                  T4      MRpK.  	  \        T\        4      ;'       d    TP                  R4      RJ #   \         d     T! T4       R# i ; i  T! T4       i ; i)zQThe root profile's own collection consent (read-only; never touches its runtime).)Úreset_hermes_home_overrideÚset_hermes_home_override)Úread_raw_config_readonlyFNÚenabledT)Ú	telemetryÚshared_metrics)
rŒ   r˜   r™   r   Úhermes_cli.configrš   rŽ   rX   ra   r9   )r‹   r˜   r™   Útokenrš   ÚconfigÚkeys   &      r   r€   r€   ˆ   s¤   € çUá$¤S¨£YÓ/€Eð*Ý>á.Ó0×6Ð6°B‰ñ 	# 5Ô)Û.ˆÜ$.¨v´t×$<Ò$<�—‘˜C”À$Šñ /ä�fœdÓ#×EÐE¨¯
©
°9Ó(=ÀÐ(EÐEøô ô Øá" 5Ö)ðûñ 	# 5Õ)ús#   ›B ÂB/Â#B2 Â.B/Â/B2 Â2
B<zdict[Path, Any]Ú_root_storesc               ó    € V ^8„  d   QhRRRR/# )r   r‹   r   r   r   r   )r   s   "r   r   r   ž   s   € ÷ "ñ "�dð "˜sñ "r   c                óô   € ^RI Hp \        ;_uu_ 4        V \        9  d/   V R,          R,          pV! VR,          VR,          4      \        V &   \        V ,          uuRRR4       #   + '       g   i     R# ; i)é   )ÚSharedMetricsStorerœ   r�   zmetrics.sqlite3ÚoutboxN)r�   r¦   Ú_root_stores_lockr¢   )r‹   r¦   Úroots   &  r   r�   r�   ž   sV   € Ý2ç	Ö	Ø”|Ô#Ø˜+Õ%Ð(8Õ8ˆDÙ!3°DÐ;LÕ4LÈdÐU]ÍoÓ!^ŒL˜ÑÜ˜DÕ!÷	 
×	×	Ó	ús   •AA&Á&A7	c               ó    € V ^8„  d   QhRRRR/# )r   rp   r   r   r   r   )r   s   "r   r   r   ª   s   € ÷ Lñ L�Sð L˜Sñ Lr   c                ó€   € \         P                  ! V R ,          \        R7      P                  4       P	                  4       # )r‡   )Útz)r   Úfromtimestampr   ÚdateÚ	isoformat)rp   s   &r   Ú_utc_dayr°   ª   s+   € Ü×!Ò! &¨4¥-´CÔ8×=Ñ=Ó?×IÑIÓKÐKr   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   Údayr   rk   rl   rr   rE   r   údict[str, Any]r   )r   s   "r   r   r   ®   s.   € ÷ lñ l�ð l˜~ð l°dð l¸~ñ lr   c                ó   € R V RVR/ R/ R. RV/# )r²   rk   ÚsurfacesÚmodelsÚprofilesrr   r   )r²   rk   rr   s   &&&r   Ú_freshr¸   ®   s$   € Ø�3˜
 H¨j¸"¸hÈÈJÐXZÐ\cÐejÐkÐkr   c               ó    € V ^8„  d   QhRRRR/# )r   rv   r   r   rE   r   )r   s   "r   r   r   ²   s   € ÷ ñ ˜ð  ñ r   c                ó  € \        V \        4      ;'       dn    \        V P                  R 4      \        4      ;'       dG    \        V P                  R4      \        4      ;'       d     \        V P                  R4      \        4      # )r²   rµ   r¶   )rX   ra   r9   r   )rv   s   &r   Ú_valid_stater»   ²   sn   € ä�5œ$Ó÷ 	^ð 	^¤J¨u¯y©y¸Ó/?ÄÓ$E÷ 	^ð 	^Ü�u—y‘y Ó,¬dÓ3÷	^ð 	^Ü8BÀ5Ç9Á9ÈXÓCVÔX\Ó8]ðr   r?   rg   rq   rr   Fc               ó8   € V ^8„  d   QhRRRRRRRRR	R
RRRRRR/# )r   rv   zdict[str, Any] | Nonerp   r   rk   rl   r?   r3   rg   rJ   rq   rr   rE   r   z8tuple[dict[str, Any], list[tuple[str, dict, dict, str]]]r   )r   s   "r   r   r   ¹   sP   € ÷ ñ Ø ðØ-0ðØ<Jðàðà'=ðàOYðð ðð >ñ	r   c          	     ó   € \        V4      . r‡V e   \        V 4      '       g   Rp V e   V R,          V8  d   \        V 4      RrT ;'       g    \        WrV4      p W`R&   V P	                  R. 4      p	Ve.   \        V	\        4      '       d   WY9  d   V	P                  V4       V\        P                  9   d’   V\        3 F…  p
V R,          P                  V
4      ;'       g    Rw  r¼\        V\        4      '       d(   V\        \        ^ W,
          4      \        4      ,          pT\        Y;'       g    ^ 4      .V R,          V
&   K‡  	  VeE   RP!                  V4      p\        V R,          P                  V^ 4      4      ^,           V R,          V&   W3# )	zÒFold one interaction (``surface``), attended turn (``route``) and/or a profile's user turn
(``profile``, host accumulator only) into the day's state; close the stored day first when the
clock has moved past it.Nr²   rr   r·   rµ   Ú r¶   )r   N)r°   r»   Ú	close_dayr¸   Ú
setdefaultrX   ÚlistÚappendr!   r;   Ú_ALLr9   r   ÚminÚmaxÚIDLE_CAP_MSÚjoin)rv   rp   rk   r?   rg   rq   rr   ÚtodayÚrowsr·   Ústreamr   Úlast_msr¡   s   &$$$$$$       r   rt   rt   ¹   s]  € ô ˜6Ó" Bˆ4ØÒ¤¨e×!4Ò!4ØˆØÒ˜U 5�\¨EÔ1ô   Ó&¨ˆeØ×3Ð3”V˜E¨UÓ3€EØˆ'�NØ×Ñ 
¨BÓ/€HØÒœz¨(´D×9Ò9¸gÔ>UØ�‰˜Ô Ø”(×.Ñ.Ô.Ø¤“oˆFØ!& zÕ!2×!6Ñ!6°vÓ!>×!KÐ!KÀ)ÑˆIÜ˜'¤3×'Ò'ØœS¤ Q¨Õ(8Ó!9¼;ÓGÕG�	Ø)2´C¸ÇÀÈ1Ó4MÐ(NˆE�*Õ˜fÓ%ñ	 &ð
 ÒØ�h‰h�u‹oˆÜ" 5¨¥?×#6Ñ#6°s¸AÓ#>Ó?À!ÕCˆˆh�˜ÑØˆ;Ðr   c               ó    € V ^8„  d   QhRRRR/# )r   r¶   r³   r   ztuple[str, str]r   )r   s   "r   r   r   Ù   s   € ÷ ñ �^ð ¨ñ r   c                ó*  € V P                  4        UUu. uFB  w  r\        V\        4      '       g   K  VP                  R 4      ^8X  g   K5  \        V4      V3NKD  	  pppV'       g   R# \	        V4      ^,          P                  R 4      w  rEWE3# u uppi )r¾   )ÚnonerÎ   )ÚitemsrX   r   r&   rÅ   Úsplit)r¶   r¡   ÚnÚcountedrO   rN   s   &     r   Ú_primaryrÓ   Ù   sy   € Ø+1¯<©<¬>Ôh©>¡ ¼ZÈÌ3×=OŒ}ÐTW×T]ÑT]Ð^aÓTbÐfgÑTgŒ}”�A“˜‹}©>€GÑhßØÐÜ˜'“l 1•o×+Ñ+¨CÓ0�O€HØˆ?Ðùó	 is   ”B³BÁBc               ó    € V ^8„  d   QhRRRR/# )r   rv   r³   r   z!list[tuple[str, dict, dict, str]]r   )r   s   "r   r   r   á   s   € ÷ ñ �^ð Ð(Iñ r   c                ó4  € V R,          V P                  R4      ;'       g    / r!V R,          P                  4        UUu/ uF1  w  r4\        V\        4      '       g   K  \	        V4      ^8X  g   K/  W4bK3  	  pppVP                  4        UUu/ uF  w  r4V\
        P                  9   g   K  W4bK   	  pppV P                  R4      RJ d   V P                  R4      MRp\        V\        4      '       d   \	        V4      M^ pV'       g   V'       g   . # \        VP                  4       4       U	Uu. uF5  w  r”\
        P                  R\        \        V^ ,          4      4      R	V	/W!3NK7  	  p
p	p\        V R
,          4      w  r¼T
P                  \
        P                  R\        \        VP                  \        4      ;'       g    ^ .^ ,          4      4      R\
        P                  ! V4      RVRVR\!        \	        V4      4      /W!34       V
# u uppi u uppi u upp	i )z¬The rows one closed day reports: none for a day with no engaged surface, except the root
profile's host row (0 minutes, 0 surfaces) carrying the day's active-profile count.r²   rk   rµ   rr   Tr·   Nr$   r?   r¶   Úactive_profile_count_bucketÚprimary_modelÚprimary_providerÚsurfaces_used_count)r9   rÏ   rX   rÁ   Úlenr!   r;   ÚsortedÚENGAGEMENT_SURFACE_METRICr$   r   rÓ   rÂ   ÚENGAGEMENT_DAY_METRICrÃ   Úsize_bucketr*   )rv   r²   rk   rS   rZ   Ústreamsrµ   r·   Úactive_profilesrL   rÉ   rO   rN   s   &            r   r¿   r¿   á   sÌ  € ð ˜%•L %§)¡)¨JÓ"7×"=Ð"=¸2ˆØ % jÕ 1× 7Ñ 7Ô 9ÔaÑ 9™˜¼ZÈÌ4×=PŒtÔUXÐYZÓU[Ð_`ÑU`ŒtˆqŠtÑ 9€GÑaØ!(§¡¤ÔV¡™˜°A¼×9UÑ9UÑ4U”�’¡€HÑVØ(-¯	©	°'Ó(:¸dÓ(Bˆu�y‰y˜Ô$È€HÜ'1°(¼D×'AÒ'A”c˜(”mÀq€OßŸOØˆ	ô ˜hŸn™nÓ.Ô/ôñ 0‰GˆDô 
×	+Ñ	+Ø
!Ô#8¼¸Q¸q½T»Ó#CÀYÐPTÐ	UÐW_ó	fá/ð 	ñ ô
 ˜u X�Ó/�O€HØ‡K�K”×/Ñ/ØÔ!6´s¸G¿K¹KÌÓ<M×<TÐ<TÐRSÐQTÐVWÕ;XÓ7YÓ!ZØ%¤x×';Ò';¸OÓ'LØ˜Ð 2°HØÔ3´C¸³MÓBð	2ð
 ðô ð €Kùó% bùÛVùó
s#   ¾HÁHÁ/HÂHÂ)HÄ+;Hc                  óP   € ] tR t^üt$ RtRtR]R&   ^ tR]R&   R R ltR	 R
 lt	Rt
R# )ÚRouteRunzWConsecutive turns the conversation's current model served since the last /model switch.NrC   rg   r   r,   c               ó    € V ^8„  d   QhRRRR/# )r   rg   rl   r   rm   r   )r   s   "r   r   ÚRouteRun.__annotate__  s   € ÷ .ñ .˜^ð .°ñ .r   c                	óz   € WP                   8X  d   V ;P                  ^,          un        R# V^uV n         V n        R# )r¥   N©rg   r,   )Úselfrg   s   &&r   ÚobserveÚRouteRun.observe  s)   € Ø—J‘JÔØ�JŠJ˜!�O�Jà%*¨AÐ"ˆDŒJ˜ž
r   c               ó   € V ^8„  d   QhRR/# )r   r   z!tuple[dict[str, str], int] | Noner   )r   s   "r   r   rä   	  s   € ÷ ñ Ð7ñ r   c                ó˜   € V P                   e+   V P                  '       d   V P                   V P                  3MRpR^ uV n         V n        V# )zRThe model being left and its turn count; resets (the next model starts from zero).Nræ   )rç   Útakens   & r   ÚtakeÚRouteRun.take	  s=   € à,0¯J©JÒ,BÀtÇzÇzÀz�—‘˜TŸZ™ZÑ(ÐW[ˆØ!% qÐˆŒ
�D”JØˆr   ræ   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rg   Ú__annotations__r,   rè   rí   Ú__static_attributes__r   r   r   râ   râ   ü   s(   ‡ áaà#'€EÐ Ó'Ø€Eˆ3ƒNõ.÷ñ r   râ   c               ó$   € V ^8„  d   QhRRRRRR/# )r   rg   rl   r,   r   r   r   )r   s   "r   r   r     s&   € ÷ Vñ V˜~ð V°cð V¸nñ Vr   c                ó$   € / V CR \        V4      /C# ©r0   rø   ræ   s   &&r   Úswitch_after_fieldsrù     s   € ØUˆeÐUÐ1Ô3MÈeÓ3TÑUÐUr   c                  ó²   € ] tR tRt$ RtRtR]R&   ^ tR]R&   ^ tR]R&   R	t	R
]R&   ^ t
R]R&   ^ tR]R&   ^ tR]R&   ^ tR]R&   ^ tR]R&   R R ltR R ltRtR# )ÚSessionTallyi  z]A session summary that merges the segments compression rotation splits one conversation into.NrC   rB   r   r,   Úfailed_turnsÚunknownr   Úlast_outcomeÚfirst_turn_nsÚlast_turn_nsÚmodel_callsÚ
tool_callsÚrepliesc               ó    € V ^8„  d   QhRRRR/# )r   Úotherrû   r   rm   r   )r   s   "r   r   ÚSessionTally.__annotate__"  s   € ÷ &ñ &˜Lð &¨Tñ &r   c                	ó¨  € VP                   '       g   R # V P                   '       d   VP                  V P                  8  d$   VP                  VP                  uV n        V n        VP                  V P                  8¼  d$   VP                  VP                  uV n        V n        V ;P                   VP                   ,          un         V ;P
                  VP
                  ,          un        V ;P                  VP                  ,          un        V ;P                  VP                  ,          un        V ;P                  VP                  ,          un        R # rQ   )	r,   rÿ   rB   r   rþ   rü   r  r  r  )rç   r  s   &&r   ÚabsorbÚSessionTally.absorb"  sà   € Ø�{�{ˆ{ÙØ�z�zˆz˜U×0Ñ0°4×3EÑ3EÔEØ49×4FÑ4FÈ×H[ÑH[Ð1ˆDÔ˜tÔ1Ø×Ñ ×!2Ñ!2Ô2Ø38×3EÑ3EÀu×GYÑGYÐ0ˆDÔ˜tÔ0Ø�
Š
�e—k‘kÕ!�
Ø×Ò˜U×/Ñ/Õ/ÕØ×Ò˜E×-Ñ-Õ-ÕØ�Š˜5×+Ñ+Õ+�Ø�Š˜Ÿ™Õ%�r   c               ó   € V ^8„  d   QhRR/# )r   r   rC   r   )r   s   "r   r   r  /  s   € ÷ 
ñ 
Ð-ñ 
r   c                	ó   € V P                   '       d   V P                  f   R # ^RIHp / V! V P                  V P                   V P                  V P
                  \        ^ V P                  V P                  ,
          4      R,          R7      CR\        P                  ! V P                   V P                  ,           V P                  ,           4      R\        P                  ! V P                  4      R\        P                  ! V P                  4      /C# )N)Úsession_fieldsi@B )r,   rü   rþ   r   Úmessage_count_bucketÚmodel_call_count_bucketÚtool_call_count_bucket)r,   rB   Úshared_metrics_fieldsr  rü   rþ   rÅ   r   rÿ   r!   Úlong_size_bucketr  r  r  )rç   r  s   & r   ÚfieldsÚSessionTally.fields/  sÍ   € Ø�z�zˆz˜T×.Ñ.Ò6ÙÝ9ð	
ÙØ×!Ñ!¨¯©À$×BSÑBSÐbf×bsÑbsÜ˜a ×!2Ñ!2°T×5GÑ5GÕ!GÓHÈIÕUôð	
ð #¤H×$=Ò$=¸d¿j¹jÈ4Ï<É<Õ>WÐZ^×ZiÑZiÕ>iÓ$jØ%¤x×'@Ò'@À×AQÑAQÓ'RØ$¤h×&?Ò&?ÀÇÁÓ&Pñ	
ð 		
r   )rÿ   rþ   r   rB   )rï   rð   rñ   rò   ró   rB   rô   r,   rü   rþ   rÿ   r   r  r  r  r  r  rõ   r   r   r   rû   rû     sn   ‡ ágà*.€LÐ'Ó.Ø€Eˆ3ƒNØ€L�#ÓØ!€L�#Ó!Ø€M�3ÓØ€L�#ÓØ€K�ÓØ€J�ÓØ€GˆSÓõ&÷
ñ 
r   rû   ià“ ))r   Ú1)r(   Ú2_to_3)é   Ú4_to_10)é   Ú11_to_30>   Úone_shotÚinteractiveÚgateway_message)9Ú__conditional_annotations__ró   Ú
__future__r   r’   Ú	threadingÚtimeÚdataclassesr   r   r   r   Úpathlibr   Útypingr   r	   r7   r
   r!   rÆ   r   Ú
_MINUTE_MSr#   r/   Ú	frozensetr:   ÚTASK_STARTED_METRICÚTASK_FINISHED_METRICr8   rÃ   r   rô   r$   r*   r0   r@   rG   rh   r„   ru   r|   r}   r€   r¢   ÚLockr¨   r�   r°   r¸   r»   rt   rÓ   r¿   râ   rù   rû   )r  s   @r   Ú<module>r)     s“  øðôõ. #ã Û Û Ý !ß ,Ñ ,Ý ß  å 1ð €Ø"€	Ø€
àˆ…^�WÐ  Z¥°Ð=ÀÀjÕ@PÐR]Ð?^Øˆ:Õ�zÐ"ðÐ ð RÐ ñ
 !Ò!OÓPÐ Ù  (×">Ñ">À×@]Ñ@]Ð!^Ó_Ð Ø
€ð !ŸI™I€ÐÓ %õ`õ0õAõõXõ
õ"õ"õ&õQõFð$ !#€ˆoÓ "Ø—N’NÓ$Ð õ"õLõlõðàðà@Dðà\`ðð ÷õ@õð6 ÷ð ó ðõ&Vð ÷(
ð (
ó ò(
r   