+
    jHàjsT  ã                  óè  a € 0 t $ R t^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	H
t
 ^ RIHtHt ^ RIHtHtHt ^ RIHtHt ]P(                  ! ]4      tRsR]R&   ]P2                  ! 4       tR	 R
 ltR R ltRnR R lltR R ltR R ltRRRRRRRR/t Rot!RRRRRRRR/t"R R lt#R R  lt$R! R" lt%R#RR$R/R% R& llt&RpR' R( llt'R) R* lt(R#RR$R/R+ R, llt)R- R. lt*/ t+R/]R0&   R1 R2 lt,R#R/R3 R4 llt-].! R504      t/R6R/R7 R8 llt0R9 R: lt1R; R< lt2RqR#RR=R/R> R? lllt3R@ RA lt4Rrt5RBt6RCt7]
! 4       t8RD]RE&   ]
! 4       t9RF]RG&   ]P2                  ! 4       t:].! RH04      t;RI RJ lt<RK RL lt=RMRN/RO RP llt>RQ RR lt?RqRS RT llt@RU RV ltARW RX ltBRYtC]
! 4       tDRZ]R[&   ]E! 4       tFR\]R]&   ]P2                  ! 4       tG].! R^R_04      tHR` Ra ltIRb Rc ltJRd Re ltKRf Rg ltLRh Ri ltMRqRj Rk lltNRl Rm ltOR# )saé  Call-site API for messaging-gateway and cron shared metrics.

Platform connection health, outbound delivery outcomes, first-reply latency and cron runs happen on
the gateway event loop, adapter tasks or the cron ticker, never inside a model or tool call. Every
recorder takes RAW runtime objects, derives only closed classes / buckets / public platform names,
and hands the recording to one background worker so the caller's loop never waits on the first
runtime build or a config read. The worker runs in a copy of the caller's context, so the profile
the caller was scoped to (gateway multiplex, cron ``_profile_cron_scope``) owns the row.

This module is imported by ``gateway/platforms/base.py`` at class-definition time: keep imports lazy.
)ÚannotationsN)ÚOrderedDict)ÚFutureÚThreadPoolExecutor)ÚdatetimeÚtimezoneÚUTC)ÚAnyÚCallablezThreadPoolExecutor | NoneÚ	_executorc               ó(   € V ^8„  d   QhRRRRRRRR/# )é   ÚfnúCallable[..., Any]Úargsr	   ÚkwargsÚreturnzFuture | None© )Úformats   "ÚT/home/ubuntu/.hermes/hermes-agent/hermes_cli/observability/shared_metrics_gateway.pyÚ__annotate__r      s)   € ÷ 
ñ 
Ð"ð 
¨3ð 
¸#ð 
À-ñ 
ó    c                óN  €  \         ;_uu_ 4        \        f   \        ^RR7      sRRR4       \        P                  ! \        P
                  ! 4       P                  \        V .VO5/ VB #   + '       g   i     LM; i  \         d    \        P                  RRR7        R# i ; i)zZFire-and-forget: run ``fn`` on the metrics worker in the caller's context (profile scope).Nzhermes-gateway-metrics)Úmax_workersÚthread_name_prefixz#Gateway shared metric not scheduledT©Úexc_info)Ú_executor_lockr   r   ÚsubmitÚcontextvarsÚcopy_contextÚrunÚ_guardedÚ	ExceptionÚloggerÚdebug©r   r   r   s   &*,r   Ú_submitr'      s�   € ðßŽ^ÜÒ Ü.¸1ÐQiÔj�	÷ ô ×Ò¤× 8Ò 8Ó :× >Ñ >ÄÈ"Ð^ÈtÒ^ÐW]Ñ^Ð^÷ �^ûô ô Ü�‰Ð:ÀTˆÔJÚðús(   ‚A> �A+¦AA> Á+A;	Á6A> Á>"B$Â#B$c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   r   r   r   r	   r   r   ÚNoner   )r   s   "r   r   r   ,   s/   € ÷ Jñ JÐ#ð J¨Cð J¸3ð JÀ4ñ Jr   c                ój   €  V ! V/ VB  R#   \          d    \        P                  R RR7        R# i ; i)z"Gateway shared metric not recordedTr   N)r#   r$   r%   r&   s   &*,r   r"   r"   ,   s7   € ðJÙ
ˆDÐ�FÔøÜô JÜ�‰Ð9ÀDˆ×IðJús   ‚ Œ"2±2c               ó    € V ^8„  d   QhRRRR/# )r   ÚtimeoutÚfloatr   r)   r   )r   s   "r   r   r   3   s   € ÷ 'ñ '�5ð ' 4ñ 'r   c                óN   € \        R 4      pVe   VP                  V R7       R# R# )zGWait for queued recordings (tests and live probes; the worker is FIFO).c                 ó   € R # ©Nr   r   r   r   Ú<lambda>Údrain.<locals>.<lambda>5   s   € ™Tr   N)r,   )r'   Úresult)r,   Úfutures   & r   Údrainr5   3   s%   € ä‘\Ó"€FØÒØ�‰˜gˆÖ&ñ r   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   Ú	mark_nameÚstrÚbuildz$Callable[..., dict[str, str] | None]Úrawr	   r   r)   r   )r   s   "r   r   r   :   s*   € ÷ 5ñ 5�Sð 5Ð!Eð 5Ècð 5ÐVZñ 5r   c                óD   € ^RI Hp ^RIHp V! \	        W04      V3/ VB  R# )é   ©Úshared_metrics_contract)Ú_emitN)Ú r>   Úshared_metrics_eventsr?   Úgetattr)r7   r9   r:   ÚcontractÚemits   &&,  r   r?   r?   :   s   € Ý5Ý4áŒ�Ó	% uÑ4°Ô4r   c               ó    € V ^8„  d   QhRRRR/# )r   Úvaluer	   r   r8   r   )r   s   "r   r   r   A   s   € ÷ ?ñ ?�Sð ?˜Sñ ?r   c                ó4   € ^RI Hp V! \        V RV 4      4      # )r<   )Úadapter_platformÚplatform)r>   rH   rB   )rF   rH   s   & r   Ú	_platformrJ   A   s   € Ý9áœG E¨:°uÓ=Ó>Ð>r   é‘  Úauthé“  Ú	forbiddeni�  Útoo_longé­  Úrate_limitedÚnetworkÚ	transientc               ó    € V ^8„  d   QhRRRR/# )r   ÚexcúBaseException | Noner   z
int | Noner   )r   s   "r   r   r   W   s   € ÷ 
ñ 
Ð*ð 
¨zñ 
r   c                óì   € ^ RI Hp W! V RR4      3 F^  pR FU  pV! W#R4      p\        V\        4      '       g   K$  \        V\        4      '       d   K<  ^dTu;8:  d
   R8:  g   KM  M KQ  Vu u # 	  K`  	  R# )é    )Úgetattr_staticÚresponseNiW  )Ústatus_codeÚstatusÚcode)ÚinspectrY   Ú
isinstanceÚintÚbool)rU   rY   ÚholderÚattrrF   s   &    r   Ú_status_coderd   W   si   € õ 'à˜ s¨J¸Ó=Ó>ˆÛ5ˆDÙ" 6°Ó6ˆEÜ˜%¤×%Ô%¬j¸Ä×.EÔ.EÈ#ÐQVÖJ]ÐZ]×J]ÒJ]Ø”ó 6ñ ?ñ
 r   c               ó    € V ^8„  d   QhRRRR/# )r   r]   r	   r   ú
str | Noner   )r   s   "r   r   r   d   s   € ÷ eñ e�cð e˜jñ er   c                ó®   a€ \        T ;'       g    R 4      P                  4       P                  4       oS'       g   R# \        V3R l\         4       R4      # )r@   Nc              3  ó°   <"  € T FK  w  r\         ;QJ d    V3R  lV 4       F  '       g   K   RM	  RM! V3R  lV 4       4      '       g   KG  Vx € KM  	  R# 5i)c              3  ó,   <"  € T F	  qS9   x € K  	  R # 5ir0   r   )Ú.0ÚnÚtexts   & €r   Ú	<genexpr>Ú(_code_class.<locals>.<genexpr>.<genexpr>h   s   øé € Ð=YÑQXÈAÀ4¾iÓQXùó   ƒTFN©Úany)rj   ÚneedlesÚclsrl   s   &  €r   rm   Ú_code_class.<locals>.<genexpr>h   s4   øé € ÐZ©™˜¿#»#Ô=YÑQXÓ=Y¿#¿#º#Ô=YÑQXÓ=Y×:Y—’«ùó   ƒ&A¬AÁ
AÚother)r8   ÚstripÚlowerÚnextÚ_CODE_CLASSES)r]   rl   s   &@r   Ú_code_classr{   d   s>   ø€ Üˆt�zˆz�r‹?× Ñ Ó"×(Ñ(Ó*€DßÙÜÔZ­ÓZÐ\cÓdÐdr   c               ó    € V ^8„  d   QhRRRR/# )r   rU   rV   r   r8   r   )r   s   "r   r   r   k   s   € ÷ jñ jÐ.ð j°3ñ jr   c                óT  a€ V f   R# \        V 4      pVR9   d   R# VR8X  d   R# \        V \        4      '       d   R# \        V \        \        34      '       d   R# RP                  R	 \        V 4      P                  RR  4       4      o\        V3R
 l\        R,           4       R4      # )zZConnection error class from the exception's type and HTTP status only (never its message).Nrv   rL   rP   rQ   ÚconfigrR   r@   c              3  óT   "  € T F  qP                   P                  4       x € K   	  R # 5ir0   )Ú__name__rx   )rj   rs   s   & r   rm   Ú#_exception_class.<locals>.<genexpr>x   s    é € ÐKÑ4J¨S—L‘L×&Ñ&×(Ð(Ó4Jùs   ‚&(c              3  ó°   <"  € T FK  w  r\         ;QJ d    V3R  lV 4       F  '       g   K   RM	  RM! V3R  lV 4       4      '       g   KG  Vx € KM  	  R# 5i)c              3  ó,   <"  € T F	  qS9   x € K  	  R # 5ir0   r   )rj   rk   Únamess   & €r   rm   Ú-_exception_class.<locals>.<genexpr>.<genexpr>z   s   øé € ÐA^ÑV]ÐQRÀuÆ*ÓV]ùro   TFNrp   )rj   rr   rs   r„   s   &  €r   rm   r�   z   s6   øé € Ð_Ñ):™˜¿c»cÔA^ÑV]ÓA^¿c¿cºcÔA^ÑV]ÓA^×>^—’Ó):ùru   :r<   NN)rK   rM   éÿÿÿÿ)
rd   r_   ÚImportErrorÚTimeoutErrorÚConnectionErrorÚjoinÚtypeÚ__mro__ry   rz   )rU   r\   r„   s   & @r   Ú_exception_classr�   k   s�   ø€ à
‚{ÙÜ˜#Ó€FØ�ÔÙØ�„}ÙÜ�#”{×#Ò#ÙÜ�#œ¤oÐ6×7Ò7ÙØ�G‰GÑK´D¸³I×4EÑ4EÀcÀrÑ4JÓKÓK€EäÔ_¬°rÖ):Ó_ÐahÓiÐir   rU   Ú
fatal_codec               ó$   € V ^8„  d   QhRRRRRR/# )r   rU   rV   rŽ   r	   r   r8   r   )r   s   "r   r   r   }   s#   € ÷ !ñ !Ð 4ð !Èð !ÐX[ñ !r   c                óR   € V'       d   \        V4      ;'       g    R # \        V 4      # )rv   )r{   r�   ©rU   rŽ   s   $$r   Úconnect_error_classr’   }   s#   € ßÜ˜:Ó&×1Ð1¨'Ð1Ü˜CÓ Ð r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r3   r	   rU   rV   r   r8   r   )r   s   "r   r   r   ƒ   s(   € ÷ Iñ I 3ð IÐ4Hð IÐTWñ Ir   c           
     óv  € VeE   \         P                  \        V4      ;'       g    ^ 4      pVe   V# \        V4      pVR9   d   V# R# \	        V RR4      p\        V\        4      '       d"   VP                  RVP                  R4      4      MRp\        V\        4      '       d   V\         9   d   \         V,          # \	        V RR4      e   R# \	        V R	R4      pVf.   ^ R
IH	p T! R\        \	        V RR4      ;'       g    R4      4      pV\        9   d   \        V,          # \	        V RR4      '       d   R# R# )zZWhy an outbound delivery failed, from the SendResult's typed fields or the exception type.NrR   rQ   rv   Úraw_responser[   r\   Úretry_afterÚ
error_kind)Úclassify_send_errorÚerrorr@   Ú	retryableF>   rL   rR   rQ   )Ú_STATUS_CLASSESÚgetrd   r�   rB   r_   Údictr`   Úgateway.platforms.baser˜   r8   Ú_SEND_KIND_CLASSES)r3   rU   r\   rs   r:   Úkindr˜   s   &&     r   Údelivery_failure_classr¡   ƒ   s  € à
‚Ü ×$Ñ$¤\°#Ó%6×%;Ð%;¸!Ó<ˆØÒØˆMÜ˜sÓ#ˆØÐ@Ô@ˆsÐMÀgÐMÜ
�&˜.¨$Ó
/€CÜ:DÀSÌ$×:OÒ:OˆS�W‰W�] C§G¡G¨HÓ$5Ô6ÐUY€FÜ�&œ#×Ò 6¬_Ô#<Ü˜vÕ&Ð&Üˆv�} dÓ+Ò7ÙÜ�6˜<¨Ó.€DØ‚|Ý>á" 4¬¬W°V¸WÀbÓ-I×-OÐ-OÈRÓ)PÓQˆØÔ!Ô!Ü! $Õ'Ð'Ü ¨°U×;Ò;ˆ9ÐHÀÐHr   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   rI   r	   Úeventr8   Úerror_classr   zdict[str, str] | Noner   )r   s   "r   r   r   �   s)   € ÷ 
ñ 
¨ð 
°Cð 
Àcð 
ÐNcñ 
r   c                ó–   € ^RI Hp WP                  9  d   R# VR9   pRV'       d   RMW#P                  9   d   TMRRVR\	        V 4      /# )	r<   r=   Nr¤   Únonerv   r£   rI   >   Ú	reconnectÚ
connect_ok)r@   r>   ÚPLATFORM_HEALTH_EVENTSÚPLATFORM_ERROR_CLASSESrJ   )rI   r£   r¤   rC   Úoks   $$$  r   Úplatform_health_fieldsr¬   �   sO   € Ý5à×3Ñ3Ô3ÙØ	Ð-Ñ	-€Bà§‘v¸×GfÑGfÔ8f©ÐlsØ�Ø”I˜hÓ'ðð r   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r   rI   r	   r£   r8   rU   rV   rŽ   r   r)   r   )r   s   "r   r   r   ª   s9   € ÷ sñ s˜Sð s¨ð sÐ6Jð sÐ_bð sÐnrñ sr   c               óV   € VR9   d   RM\        W#R7      p\        R\        WVR7       R# )r¨   r¦   r‘   ÚPLATFORM_HEALTH_MARK)rI   r£   r¤   N>   r§   r¨   )r’   r?   r¬   )rI   r£   rU   rŽ   r¤   s   &&$$ r   Ú_record_healthr°   ª   s)   € à!Ð%@Ô@‘&ÔFYÐ^aÔFy€KÜ	Ð
 Ô"8À8Ðfq×rr   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r   Úhomer	   r   r   r   r   r   r)   r   )r   s   "r   r   r   °   s0   € ÷ *ñ *�3ð *Ð.ð *°sð *Àcð *Èdñ *r   c                ó�   € V f   V! V/ VB  R# ^ RI HpHp V! \        V 4      4      p V! V/ VB  V! V4       R#   T! T4       i ; i)zaRun ``fn`` scoped to ``home`` (the profile that owns the row), or the submitting context's scope.N)Úreset_hermes_home_overrideÚset_hermes_home_override)Úhermes_constantsr´   rµ   r8   )r²   r   r   r   r´   rµ   Útokens   &&*,   r   Ú_in_homer¸   °   sL   € à‚|Ù
ˆDÐ�FÒÙßUá$¤S¨£YÓ/€Eð*Ù
ˆDÐ�FÒá" 5Ö)øÑ" 5Õ)ús	   ©; »
Azdict[tuple[str, str], str]Ú_failing_connectsc               ó0   € V ^8„  d   QhRRRRRRRRRR	R
R/# )r   rI   r	   r£   r8   rU   rV   rŽ   Úterminalra   r   r)   r   )r   s   "r   r   r   Â   sB   € ÷ Hñ H˜cð H¨#ð HÐ7Kð HÐY\ð HÐhlð HÐquñ Hr   c               óÄ  € ^ RI Hp ^RIHp \	        V! 4       4      \	        \        V RV 4      4      3p\        P                  ! \        4      P                  4       P                  4       pVR8w  g	   V'       d   \        P                  VR4      V8H  p	M0V! 4       '       g   R# \        P                  V4      V8H  p	V\        V&   V	'       d   VR8X  g   \        WW#R7       R# R# )rX   ©Úget_hermes_home)ÚenabledrF   Úconnect_failedNr‘   )r¶   r¾   Úrelay_shared_metricsr¿   r8   rB   r   Únowr   ÚdateÚ	isoformatr¹   Úpoprœ   r°   )
rI   r£   rU   rŽ   r»   r¾   r¿   ÚkeyÚdayÚcounteds
   &&$$$     r   Ú_record_connectrÉ   Â   s°   € Ý0å-ô ‰Ó Ó!¤3¤w¨x¸À(Ó'KÓ#LÐ
M€CÜ
�,Š,”sÓ
×
 Ñ
 Ó
"×
,Ñ
,Ó
.€CØÐ Ô §HÜ#×'Ñ'¨¨TÓ2°cÑ9‰Ù�YŠYÙä#×'Ñ'¨Ó,°Ñ3ˆØ!$Ô˜#Ñß˜Ð!1Ô1Ü�x¨C×Gñ 2r   c               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )r   Úadapterr	   rI   Úis_reconnectra   r«   rU   rV   r   r)   r   )r   s   "r   r   r   Õ   sD   € ÷ 
añ 
aØð
aØð
aØ26ð
aØ<@ð
aØG[ð
aà	ñ
ar   c          	     ó  € V'       d   V'       d   RMRMRpV'       g   Ve   RM\        V RR4      pV'       * ;'       d2    VRJ ;'       d&    \        V4      ;'       d    \        V RR4      '       * p\        \        WWFVR7       R# )	ai  One adapter connect attempt (cold start or reconnect watcher), from the runner's single
connect seam. ``connect_failed`` counts a failed EPISODE once per profile, platform and UTC day:
the watcher's backoff retries are not new failures, so the next row is the success that ends
it (or the next day it is still failing). A non-retryable failure ends its episode.r§   r¨   rÀ   NÚfatal_error_codeÚfatal_error_retryableT)rU   rŽ   r»   )rB   ra   r'   rÉ   )rË   rI   rÌ   r«   rU   r£   rŽ   r»   s   &&$$$   r   Úrecord_platform_connectrÐ   Õ   sq   € ÷ @BŸL‰[©lÐGW€Eß˜sš‘´G¸GÐEWÐY]Ó4^€JØŒv×rÐr˜# ˜+×rÐr¬$¨zÓ*:×rÐrÄ7È7ÐTkÐmqÓCrÔ?r€HÜŒO˜X°#ÐW_×`r   Úrelay_disabledÚhermes_homec               ó$   € V ^8„  d   QhRRRRRR/# )r   rË   r	   rÒ   r   r)   r   )r   s   "r   r   r   æ   s&   € ÷ añ a¨ð a¸Sð aÈDñ ar   c          	     ól   € \        V RR4      pV\        9   d   R# \        \        V\        V RVR7       R# )z¼A live adapter lost its connection after startup (its fatal-error handler owned it).
``hermes_home``: the owning profile, for handlers that run outside its scope (multiplexed
secondaries).rÎ   NÚ
disconnect)rŽ   )rB   Ú_USER_CHOSEN_FATAL_CODESr'   r¸   r°   )rË   rÒ   rŽ   s   &$ r   Úrecord_platform_disconnectr×   æ   s2   € ô ˜Ð"4°dÓ;€JØÔ-Ô-ÙÜŒH�k¤>°7¸LÐU_×`r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   rI   r	   Úfailure_classr8   r   údict[str, str]r   )r   s   "r   r   r   ò   s!   € ÷ ñ  ð °Sð ¸^ñ r   c                óf   € ^RI Hp RWP                  9   d   TMRRVR8X  d   RMRR\        V 4      /# )	r<   r=   rÙ   rv   Úoutcomer¦   ÚsentÚfailedrI   )r@   r>   ÚDELIVERY_FAILURE_CLASSESrJ   )rI   rÙ   rC   s   $$ r   Údelivery_fieldsrà   ò   s<   € Ý5ð 	¨-×;\Ñ;\Ô*\™ÐbiØ˜]¨fÔ4‘6¸(Ø”I˜hÓ'ðð r   c               ó    € V ^8„  d   QhRRRR/# )r   Úsendr   r   r   )r   s   "r   r   r   ü   s   € ÷ ñ Ð-ð Ð2Dñ r   c                óL   a € \         P                  ! S 4      R V 3R ll4       pV# )z°Count one logical outbound delivery (all retries and the plain-text fallback included) per
call of the wrapped ``_send_with_retry`` (replies, busy acks, command replies alike).c               ó$   € V ^8„  d   QhRRRRRR/# ©r   r   r	   r   r   r   )r   s   "r   r   Ú&records_delivery.<locals>.__annotate__  s!   € ÷ ñ  3ð °#ð ¸#ñ r   c           
   Ÿ  ód  <"  € TP                  R V'       d
   V^ ,          MR4      p\        W4      p S! V .VO5/ VB G Rj  x€L
 p\        \        TRR4      \        4      '       d   \        \        T\
        YTR7       T#  L?  \         d   p\        \        T\
        YTR7       h Rp?ii ; i5i)Úchat_idN)rU   rè   Úsuccess)rè   )	rœ   Ú
_chat_homer#   r'   r¸   Ú_record_deliveryr_   rB   ra   )Úselfr   r   rè   r²   r3   rU   râ   s   &*,    €r   ÚwrapperÚ!records_delivery.<locals>.wrapper   sœ   øé € à—*‘*˜Y·4¨¨Q®¸TÓBˆô ˜$Ó(ˆð	Ù Ð6 tÒ6¨vÑ6×6ˆFô ”g˜f i°Ó6¼×=Ò=Ü”H˜dÔ$4°dÈGÕTØˆñ 7øÜô 	Ü”H˜dÔ$4°dÈWÕUØûð	üs:   ƒ/B0³B ÁBÁB Á;B0ÂB ÂB-ÂB(Â(B-Â-B0©Ú	functoolsÚwraps)râ   rí   s   f r   Úrecords_deliveryrò   ü   s'   ø€ ô ‡_‚_�TÓ÷ó ðð €Nr   rè   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r   rË   r	   r3   rU   rV   rè   r   r)   r   )r   s   "r   r   r     s4   € ÷ 'ñ 'Øð'Øð'Ø.Bð'ØTWð'à	ñ'r   c               ó„   € Vf   VP                   '       d   RM
\        W4      p\        R\        \	        W4      VR7       R # )Nr¦   ÚPLATFORM_DELIVERY_MARK)rI   rÙ   )ré   r¡   r?   rà   Ú_source_platform)rË   r3   rU   rè   rÙ   s   &&$$ r   rë   rë     s6   € ð "šk¨f¯n¯n¨n‘FÔBXÐY_ÓBe€MÜ	Ð
"¤OÔ>NÈwÓ>`Ø%÷'r   c               ó    € V ^8„  d   QhRRRR/# )r   Úsend_or_editr   r   r   )r   s   "r   r   r     s   € ÷ 
ñ 
Ð$6ð 
Ð;Mñ 
r   c                óL   a € \         P                  ! S 4      R V 3R ll4       pV# )zVStream consumer transport: the first delivered visible text (frame, draft or message).c               ó$   € V ^8„  d   QhRRRRRR/# rå   r   )r   s   "r   r   Ú'stops_reply_clock.<locals>.__annotate__  s!   € ÷ ñ  3ð °#ð ¸#ñ r   c              Ÿ  ó²   <"  € S! V .VO5/ VB G R j  x€L
 pVRJ d6   \        V RR 4      '       d#   \        \        V RR 4      \        V RR 4      4       V#  LA5i)NTÚ_last_sent_textrË   rè   )rB   Ústop_reply_clock)rì   r   r   r«   rø   s   &*, €r   rí   Ú"stops_reply_clock.<locals>.wrapper  sZ   øé € á Ð6 tÒ6¨vÑ6×6ˆØ�‹:œ' $Ð(9¸4×@Ò@ÜœW T¨9°dÓ;¼WÀTÈ9ÐVZÓ=[Ô\Øˆ	ñ 7ùs   ƒA“A”AArï   )rø   rí   s   f r   Ústops_reply_clockr     s'   ø€ ô ‡_‚_�\Ó"÷ó #ðð €Nr   i   g      ¬@z/OrderedDict[tuple[str, str], tuple[float, str]]Ú_reply_clocksz!OrderedDict[tuple[str, str], str]Ú_chat_homesÚrelayc               ó$   € V ^8„  d   QhRRRRRR/# )r   rË   r	   rè   r   r   )r   s   "r   r   r   6  s!   € ÷ 
ñ 
˜cð 
¨Cð 
°Cñ 
r   c                ó  € \        V RR4      p\        \        VRV4      ;'       g    R4      \        9  g   VR9   d   V # \        V RR4      p \        V4      '       d   V! \        V4      4      MR;'       g    T #   \         d    T u # i ; i)z»The platform a fronting adapter's chat really lives on (the relay connector learned it from
the inbound, else the one platform it fronts); the adapter's own platform otherwise. Read-only.rI   NrF   r@   Ú_metrics_platform©Nr@   )rB   r8   Ú_FRONTING_PLATFORMSÚcallabler#   )rË   rè   rI   Úresolves   &&  r   rö   rö   6  sŠ   € ô �w 
¨DÓ1€HÜ
Œ7�8˜W hÓ/×5Ð5°2Ó6Ô>QÔQÐU\Ð`jÔUjØˆÜ�gÐ2°DÓ9€GðÜ)1°'×):Ò):‘œ˜G›Ô%À×PÐPÈÐPøÜô ØŠðús   Á*A< Á9A< Á<BÂBc               ó$   € V ^8„  d   QhRRRRRR/# )r   rI   r	   rè   r   ztuple[str, str] | Noner   )r   s   "r   r   r   C  s'   € ÷ Rñ R˜ð R sð RÐ/Eñ Rr   c                ó~   € \        \        V R V 4      ;'       g    R4      pV'       d   VR9  d   V\        V4      3# R# )rF   r@   Nr  )r8   rB   )rI   rè   rF   s   && r   Ú
_clock_keyr  C  s:   € Ü”˜ '¨8Ó4×:Ð:¸Ó;€Eß$)¨g¸ZÔ.GˆE”3�w“<Ð ÐQÈTÐQr   ÚinternalFc               ó$   € V ^8„  d   QhRRRRRR/# )r   Úsourcer	   r  ra   r   r)   r   )r   s   "r   r   r   H  s!   € ÷ *ñ *˜cð *°ð *Àñ *r   c               óÄ  € V'       d   RM!\        \        V RR4      \        V RR4      4      pVf   R# ^ RIHp \	        V! 4       4      p\
        ;_uu_ 4        \        \        P                  ! 4       V33\        V33 FC  w  rVVP                  VR4       WeV&   \        V4      \        8”  g   K1  VP                  RR7       K*  	  RRR4       R#   + '       g   i     R# ; i)zUAn inbound user message was accepted as a new agent turn (internal events never are).NrI   rè   r½   F©Úlast)r  rB   r¶   r¾   r8   Ú_reply_lockr  ÚtimeÚ	monotonicr  rÅ   ÚlenÚ_REPLY_CLOCK_MAXÚpopitem)r  r  rÆ   r¾   r²   ÚtablerF   s   &$     r   Ústart_reply_clockr  H  s©   € ç‰$¤
¬7°6¸:ÀtÓ+LÌgÐV\Ð^gÐimÓNnÓ o€CØ
‚{ÙÝ0ä‰Ó Ó!€Dß	ŽÜ+¬d¯nªnÓ.>ÀÐ-EÐFÌÐVZÐH[Ó\‰LˆEØ�I‰I�c˜4Ô Ø�#‰JÜ�e“*Ô/Ö/Ø—‘ 5�Ö)ñ	 ]÷ 
��Šús   ÁACÂ.CÃC	c               ó$   € V ^8„  d   QhRRRRRR/# )r   rË   r	   rè   r   rf   r   )r   s   "r   r   r   X  s!   € ÷ ñ ˜ð  cð ¨jñ r   c           	     óÒ  € \        \        V RR4      V4      pVf   R# \        ;_uu_ 4        V\        9   d   \        V,          uuRRR4       # V^ ,          \        9   dd   \        P                  4        UUu. uF  w  r4V^,          V^,          8X  g   K  VNK   	  ppp\        V4      ^8X  d
   V^ ,          MRuuRRR4       #  RRR4       R# u uppi   + '       g   i     R# ; i)z|The home owning ``chat_id``'s latest turn (a fronting adapter matches the one fronted chat),
else None (the caller's scope).rI   N)r  rB   r  r  r  Úitemsr  )rË   rè   rÆ   Úkr²   Úfronteds   &&    r   rê   rê   X  sº   € ô ”W˜W j°$Ó7¸Ó
A€CØ
‚{Ùß	ŽØ”+ÔÜ˜sÕ#÷ 
Šð ˆq�6Ô(Ô(Ü+6×+<Ñ+<Ô+>ÔQÑ+>¡ À!ÀAÅ$È#ÈaÍ&Á.—t�tÑ+>ˆGÑQÜ!$ W£°Ô!2�7˜1–:¸÷ 
Šð )÷ 
ñ ùó R÷	 
Žñ ús)   ¬CÁ)CÁ8C
ÂC
ÂCÃCÃC&	c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   rË   r	   rè   r3   r   r)   r   )r   s   "r   r   r   g  s.   € ÷ vñ v˜cð v¨Cð v¸ð vÈñ vr   c                ó  € \        \        V RR4      V4      pVe   Ve   \        VRR4      RJd   R# \        ;_uu_ 4        \        P	                  VR4      TrTVf€   V^ ,          \
        9   dn   \         Uu. uF  qf^,          V^,          8X  g   K  VNK  	  pp\        V4      ^8X  d
   V^ ,          MTp\        V4      ^8X  d   \        P	                  V4      MRpRRR4       XeŽ   \        P                  ! 4       V^ ,          ,
          \        8:  d`   X^ ,          \
        9  d
   V^ ,          MRp\        \        V^,          \        WV\        P                  ! 4       V^ ,          ,
          4       R# R# R# u upi   + '       g   i     L¨; i)z¯First outbound text for the chat's pending turn (stream first chunk or the final reply; busy
acks and command replies never stop it). ``result``: a failed send is not a reply.rI   Nré   FT)r  rB   r  r  rÅ   r  r  r  r  Ú_REPLY_CLOCK_MAX_AGEr'   r¸   Ú_emit_reply_latency)	rË   rè   r3   rÆ   ÚstartedÚstarted_keyr  r   rI   s	   &&&      r   rþ   rþ   g  s7  € ô ”W˜W j°$Ó7¸Ó
A€CØ
‚{�vÒ)¬g°f¸iÈÓ.OÐW[Ó.[Ùß	ŽÜ,×0Ñ0°°dÓ;¸S�ØŠ?˜s 1�vÔ)<Ô<Ý"/ÓB¡-˜Q°Qµ4¸3¸q½6±>—q�q¡-ˆGÐBÜ(+¨G«¸Ô(9˜' !ž*¸sˆKÜ8;¸G»ÈÔ8I”m×'Ñ'¨Ô4ÈtˆG÷ 
ð ÒœtŸ~š~Ó/°'¸!µ*Õ<Ô@TÔTà%0°¥^Ô;NÔ%N�;˜q–>ÐTXˆÜ”˜' !�*Ô&9¸7ÈXÔW[×WeÒWeÓWgÐjqÐrsÕjtÕWtÖuñ  UÑùò C÷ 
�ús%   Á6E<Á7E7ÂE7ÂAE<Å7E<Å<F	c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r   rË   r	   rè   rI   Úsecondsr-   r   r)   r   )r   s   "r   r   r   {  s7   € ÷ Tñ T ð T¨sð T¸cð TÈEð TÐVZñ Tr   c                óR   € \        R \        T;'       g    \        W4      VR7       R# )ÚREPLY_LATENCY_MARK)rI   r(  N)r?   Úreply_latency_fieldsrö   )rË   rè   rI   r(  s   &&&&r   r$  r$  {  s$   € Ü	Ð
Ô 4Ø×AÐAÔ/°ÓAÈ7÷Tr   c               ó$   € V ^8„  d   QhRRRRRR/# )r   rI   r	   r(  r-   r   rÚ   r   )r   s   "r   r   r   €  s!   € ÷ ñ  cð °Eð ¸nñ r   c                óX   € ^RI Hp RV! \        RV4      \        R4      R\	        V 4      /# )r<   )Ú_bucketÚfirst_response_bucketç        Úgte_60srI   )r>   r.  ÚmaxÚ_REPLY_THRESHOLDSrJ   )rI   r(  r.  s   $$ r   r+  r+  €  s1   € Ý0ð 	 ¡¬¨S°'Ó):Ô<MÈyÓ!YØ”I˜hÓ'ðð r   i   zOrderedDict[str, str]Ú_cron_deliveryzset[str]Ú_cron_skippedÚlocalr@   c               ó    € V ^8„  d   QhRRRR/# )r   Újobr	   r   r8   r   )r   s   "r   r   r   “  s   € ÷ =ñ =˜Cð = Cñ =r   c                óö  € \        V \        4      '       g   R# V P                  R4      p\        V\        \        34      '       d   TM#\        T;'       g    R4      P                  R4      pV Uu0 uFA  p\        V4      P                  4       P                  4       P                  R^4      ^ ,          kKC  	  upR0,
          pV'       d   V\        8:  d   R# VRR0,          '       d   R# VR	08X  d   R	# R
# u upi )zXWhere a job's output goes, as a closed kind; targets themselves never leave the machine.rv   Údeliverr@   Ú,Ú:r6  r¦   ÚoffÚwebhookrI   )
r_   r�   rœ   ÚlistÚtupler8   Úsplitrw   rx   Ú_LOCAL_DELIVERY)r8  r:  ÚpartsÚpÚkindss   &    r   Úcron_delivery_kindrF  “  sÊ   € ä�cœ4× Ò ÙØ�g‰g�iÓ €GÜ! '¬D´%¨=×9Ò9‰G¼sÀ7Ç=À=ÈbÓ?Q×?WÑ?WÐX[Ó?\€EÙ>CÓD¹e¸ŒS�‹V�\‰\‹^×!Ñ!Ó#×)Ñ)¨#¨qÓ1°!×4Ð4¹eÑDÈÀtÕK€Eß�Eœ_Ô,ÙØ�˜ˆ×ÔÙØ ) Ô,ˆ9Ð<°*Ð<ùò Es   Á0AC6c               ó    € V ^8„  d   QhRRRR/# ©r   r8  r	   r   r)   r   )r   s   "r   r   r   ¡  s   € ÷ /ñ /˜Sð / Tñ /r   c                óZ  € \        V \        4      '       d   V P                  R4      MRpV'       g   R# \        ;_uu_ 4        \	        V 4      \
        \        V4      &   \        \
        4      \        8”  d   \
        P                  RR7       K0   RRR4       R#   + '       g   i     R# ; i)zXRemember the delivery kind of an execution about to run (or be refused) in this process.Úexecution_idNFr  )
r_   r�   rœ   Ú
_cron_lockrF  r4  r8   r  Ú_CRON_NOTES_MAXr  ©r8  rJ  s   & r   Únote_cron_executionrN  ¡  sl   € ä.8¸¼d×.CÒ.C�3—7‘7˜>Ô*È€LßÙß	ŽÜ,>¸sÓ,CŒ”s˜<Ó(Ñ)Ü”.Ó!¤OÔ3Ü×"Ñ"¨Ð"Ö.ð 4÷ 
��Šús   ÁABÂB*	c               ó    € V ^8„  d   QhRRRR/# rH  r   )r   s   "r   r   r   ¬  s   € ÷ 5ñ 5˜3ð 5 4ñ 5r   c                ó.  € \        V \        4      '       d   V P                  R4      MRpV'       dP   \        ;_uu_ 4        \	        \
        4      \        8  d   \
        P                  \        V4      4       RRR4       R# R#   + '       g   i     R# ; i)z\A gate (pre-run script ``wakeAgent=false`` / no output) decided this run does no agent work.rJ  N)	r_   r�   rœ   rK  r  r5  rL  Úaddr8   rM  s   & r   Únote_cron_skippedrR  ¬  sZ   € ä.8¸¼d×.CÒ.C�3—7‘7˜>Ô*È€LßßŽZÜ”=Ó!¤OÔ3Ü×!Ñ!¤# lÓ"3Ô4÷ ‰Zñ ß�ZˆZús   Á 7BÂB	c               ó$   € V ^8„  d   QhRRRRRR/# )r   Ústartr	   Úendr   r-   r   )r   s   "r   r   r   µ  s!   € ÷ ñ ˜ð  #ð ¨%ñ r   c           	     óê   €  \        R \        P                  ! \        V4      4      \        P                  ! \        V 4      4      ,
          P	                  4       4      #   \
        \        3 d     R # i ; i)r0  )r2  r   Úfromisoformatr8   Útotal_secondsÚ	TypeErrorÚ
ValueError)rT  rU  s   &&r   Ú_iso_secondsr[  µ  sZ   € ðÜ�3œ×/Ò/´°C³Ó9¼H×<RÒ<RÔSVÐW\ÓS]Ó<^Õ^×mÑmÓoÓpÐpøÜ”zÐ"ô Úðús   ‚AA ÁA2Á1A2c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   rÜ   r8   Údelivery_kindr(  r-   r   rÚ   r   )r   s   "r   r   r   ¼  s(   € ÷ ñ  ð °Cð À%ð ÈNñ r   c           	     ó¦   € ^RI Hp RWP                  9   d   TMRRVP                  \	        VR,          4      4      RWP
                  9   d   V /# R/# )r<   r=   r]  rv   Úduration_bucketiè  rÜ   rÞ   )r@   r>   ÚCRON_DELIVERY_KINDSr_  r`   ÚCRON_RUN_OUTCOMES)rÜ   r]  r(  rC   s   $$$ r   Úcron_run_fieldsrb  ¼  s^   € Ý5ð 	¨-×;WÑ;WÔ*W™Ð]dØ˜8×3Ñ3´C¸À$½Ó4GÓHØ˜g×)CÑ)CÔC�7ðð ð JRðð r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úrecordr	   Údelivery_outcomer   r)   r   )r   s   "r   r   r   Æ  s&   € ÷ Zñ Z˜sð Z°cð ZÀTñ Zr   c                óZ  € \        V \        4      '       d   V P                  R4      '       g   R# \        V R,          4      p\        ;_uu_ 4        \
        P                  VR4      pV\        9   p\        P                  V4       RRR4       V P                  R4      pV P                  R4      R8H  pX'       g   V'       g   V'       g   Vf   RpMV'       d   RMR	p\        \        R
\        TXV'       d   \        WPP                  R4      4      MRR7       R#   + '       g   i     L�; i)zäOne execution reached its (write-once) terminal row. A row that never started running was
refused before any side effect (claim lost, dispatch limit, executor shutdown): ``skipped``,
unless a failure notice was delivered for it.ÚidNrv   Ú
started_atr\   Ú	completedÚskippedré   rÞ   ÚCRON_RUN_MARKÚfinished_atr0  ©rÜ   r]  r(  )r_   r�   rœ   r8   rK  r4  rÅ   r5  Údiscardr'   r?   rb  r[  )rd  re  rJ  r]  Úgatedr%  ré   rÜ   s   &&      r   Úrecord_cron_finishrp  Æ  sÔ   € ô �fœd×#Ò#¨6¯:©:°d×+;Ò+;ÙÜ�v˜d•|Ó$€Lß	ŽÜ&×*Ñ*¨<¸ÓAˆØ¤Ñ-ˆÜ×Ñ˜lÔ+÷ 
ð �j‰j˜Ó&€GØ�j‰j˜Ó" kÑ1€Gß—W§WÐ1AÒ1IØ‰ç&‘)¨HˆÜŒE�?¤O¸WÐTaßHO”L ¯*©*°]Ó*CÔDÐUX÷Z÷ 
�ús   Á5DÄD*	c               ó    € V ^8„  d   QhRRRR/# rH  r   )r   s   "r   r   r   Û  s   € ÷ @ñ @˜Cð @ Dñ @r   c           	     óJ   € \        \        R\        R\        V 4      RR7       R# )zˆA scheduled occurrence the scheduler dropped without running it (catch-up disabled after
downtime, or a one-shot past its grace window).rk  Úmissedr0  rm  N)r'   r?   rb  rF  )r8  s   &r   Úrecord_cron_missedrt  Û  s   € ô ŒE�?¤O¸XÜ,¨SÓ1¸3÷@r   )ç      @)))ÚmissingÚ
dependencyÚnpmr~   ÚconflictÚlockÚbindr~   ))rL   Ú
credentialr·   ÚunauthorrN   ÚloginrL   ))Ú	ratelimitÚ
rate_limitÚfloodÚtoo_manyÚtoomanyÚ429rQ   ))	rR   Úconnectr,   ÚsocketÚdnsÚsslÚlostÚexitedÚstreamrR   )NNr0   ))g       @Últ_2s)ru  Ú2s_to_5s)g      .@Ú	5s_to_15s)g      N@Ú
15s_to_60s)PÚ__conditional_annotations__Ú__doc__Ú
__future__r   r   rð   ÚloggingÚ	threadingr  Úcollectionsr   Úconcurrent.futuresr   r   r   r   r   Útypingr	   r
   Ú	getLoggerr€   r$   r   Ú__annotations__ÚLockr   r'   r"   r5   r?   rJ   r›   rz   rŸ   rd   r{   r�   r’   r¡   r¬   r°   r¸   r¹   rÉ   rÐ   Ú	frozensetrÖ   r×   rà   rò   rë   r   r3  r  r#  r  r  r  r  rö   r  r  rê   rþ   r$  r+  rL  r4  Úsetr5  rK  rB  rF  rN  rR  r[  rb  rp  rt  )r�  s   @r   Ú<module>r�     s=  øðô
õ #ã Û Û Û Û Ý #ß 9ß ,Ñ ,ß  à	×	Ò	˜8Ó	$€à'+€	Ð$Ó +Ø—’Ó!€õ
õJ÷'õ5õ?ð ˜  [°#°zÀ3ÈÐW€ð€ð �
˜K¨°nÀnÐVaÐclðÐ õ

õeõjð$!°tð !Èt÷ !÷Iõ4
ðsÈTð sÐei÷ sõ*ð 13Ð Ð-Ó 2õHð&
aØ^b÷
añ %Ð&6Ð%7Ó8Ð ðaÀ4÷ aõõñ,'ØEIð'ØZ^÷'ð 'õ
ð cÐ ØÐ ØÐ ñ BMÃ€Ð>Ó Nñ 2=³€Ð.Ó >Ø�nŠnÓ€ñ    	Ó*Ð õ
õRð
*°u÷ *õ ÷võ(Tõ
ð €á(3«€Ð%Ó 5Ù›%€ˆxÓ Ø�^Š^Ó€
Ù˜W b˜MÓ*€õ=õ/õ5õõ÷Z÷*@r   