+
    „WÝj�K  ã            
      ó8  € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	H
t
 ^ RIHt ^ RIHtHt ]P                   ! ]4      tRtRt]! 0 RTm4      t]! RR	04      tR
tRt]! RR04      t]! 0 RUm4      tRRVRRWRRXRRW/tRRWRRWRRWRRXRRY/t]
 ! R R4      4       tR R lt]P@                  R R l4       t!RZR R llt"RR/R  R! llt#R" R# lt$R$ R% lt%R&R/R' R( llt&R[R) R* llt'R+ R, lt(R- R. lt)R&RR/R0/R1 R2 llt*R3R0/R4 R5 llt+R3R0/R6 R7 llt,]PZ                  ! 4       t.R8 R9 lt/R: R; lt0R< R= lt1R> R? lt2]P@                  R@ RA l4       t3RB RC lt4RD RE lt5RF RG lt6]P@                  RH RI l4       t7RJ RK lt8RL RM lt9RN RO lt:RP RQ lt;RR0/RR RS llt<R# )\a½  hermes.provider_setup.count: where connecting a model provider starts, succeeds, fails or is walked away from.

A flow is ``started`` once the user has picked a provider. Its end is recorded by the surface that
ran it (``completed`` / ``failed`` + a closed failure class). A flow nobody finished cannot record
itself, so ``started`` also drops a small marker under the owning profile's store dir (the
process-exit pattern): the finisher claims it by rename, and a marker whose process is gone (or that
has been pending longer than any real flow takes) is reported ``abandoned`` by the next setup start
or Hermes start in that profile. Whoever claims the marker records, so each flow ends exactly once.

Only the catalog provider name leaves (custom endpoints read ``custom``); never a key, token, base
URL or error text. Rows are saved synchronously: a setup killed right after ``started`` must still
have left its row, and none of this runs on a hot path.
)ÚannotationsN)Ú	dataclass)ÚPath)ÚAnyÚIteratorÚprovider_setup_markersi  Ú	AuthErrorÚSignInCopyErrorÚ_metrics_setup_flowÚ_metrics_setup_failureÚ	cancelledÚexpiredÚapprovedÚnoneÚ	abandonedÚdeniedÚuser_declinedÚ
supersededÚtimeoutÚaccount_retiredÚanon_unreachablec                  ó@   € ] tR t^:t$ R]R&   R]R&   R]R&   R]R&   RtR# )	Ú	SetupFlowÚstrÚhomeÚsurfaceÚproviderr   Úmarker© N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__annotations__Ú__static_attributes__r   ó    ÚaC:\Users\johnn\AppData\Local\hermes\hermes-agent\hermes_cli\observability\shared_metrics_setup.pyr   r   :   s   ‡ à
ƒIØƒLØƒMØ‡Lr%   r   c               ó    € V ^8„  d   QhRRRR/# )é   r   r   Úreturnr   )Úformats   "r&   Ú__annotate__r+   B   s   € ÷ Bñ B�dð B˜tñ Br%   c                ó8   € V R ,          R,          \         ,          # )Ú	telemetryÚshared_metrics)ÚMARKER_DIRNAME)r   s   &r&   Úmarkers_dirr0   B   s   € Ø�+ÕÐ 0Õ0´>ÕAÐAr%   c               ó    € V ^8„  d   QhRRRR/# )r(   Úhermes_homer   r)   úIterator[None]r   )r*   s   "r&   r+   r+   G   s   € ÷ .ñ .˜ð . ñ .r%   c              #  ó²   "  € R pV '       d   ^ RI Hp V! \        V 4      4      p R x € Ve   ^ RI Hp V! V4       R # R #   Te   ^ RI Hp T! T4       i i ; i5i)N)Úset_hermes_home_override)Úreset_hermes_home_override)Úhermes_constantsr5   r   r6   )r2   Útokenr5   r6   s   &   r&   Ú_boundr9   F   sS   é € à€EßÝ=á(¬¨[Ó)9Ó:ˆð.ÛàÒÝCá& uÖ-ñ øˆ5ÒÝCá& uÕ-ð üs   ‚"A¥? ©A¿AÁAc               ó    € V ^8„  d   QhRRRR/# )r(   r2   r   r)   Úboolr   )r*   s   "r&   r+   r+   V   s   € ÷ ñ  Cð °4ñ r%   c                ó¸   €  \        V 4      ;_uu_ 4        ^RIHp \        V! 4       4      uuRRR4       #   + '       g   i     R# ; i  \         d     R# i ; i)zYThe owning profile's shared-metrics gate (cheap; lets async callers skip the thread hop).©ÚenabledNF)r9   Úrelay_shared_metricsr>   r;   Ú	Exception)r2   r>   s   & r&   Úcollection_enabledrA   V   s@   € ðÜ�K× Õ Ý5ä™›	“?÷ !× × Ó ûô ô Úðús+   ‚A
 •6«
A
 ¶A	ÁA
 ÁA
 Á
AÁAÚfailure_classc          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )r(   r   r   r   ÚeventrB   r)   údict[str, str] | Noner   )r*   s   "r&   r+   r+   a   s8   € ÷ vñ v cð v°Sð vÀð vÐUXð vÐf{ñ vr%   c                óò   € ^RI Hp ^RIHp WP                  9  g   W$P
                  9  d   R# RpVR8X  d   V\        9   d   RpM#VR8X  d   W4P                  R0,
          9   d   TMRpRVR	VR
V! V4      RV /# )é   )Úshared_metrics_contract©Úprovider_metric_nameNr   Úfailedr   ÚotherrD   rB   r   r   )Ú rH   Úshared_metrics_catalogrJ   ÚPROVIDER_SETUP_SURFACESÚPROVIDER_SETUP_EVENTSÚ_NOT_FAILURESÚPROVIDER_SETUP_FAILURE_CLASSES)r   r   rD   rB   ÚcontractrJ   Úfailures   $$$$   r&   Úprovider_setup_fieldsrU   a   s   € Ý5Ý<à×6Ñ6Ô6¸%×GeÑGeÔ:eÙØ€GØ�Ô˜]¬mÔ;Ø‰Ø	�(Ô	Ø#0×4[Ñ4[Ð_eÐ^fÕ4fÔ#f‘-ÐlsˆØ�U˜O¨W°jÑBVÐW_ÓB`ÐbkÐmtÐuÐur%   c               ó    € V ^8„  d   QhRRRR/# )r(   ÚexcÚBaseExceptionr)   r   r   )r*   s   "r&   r+   r+   o   s   € ÷ ñ ˜]ð ¨sñ r%   c                óà  € ^ RI HpHpHp \	        V 4      P
                   Uu0 uF  qDP                  kK  	  pp\        \        V RR4      \        4      '       d   V P                  # V! V 4      '       g   RV9   g   \        V RR4      R8X  d   R# V! V 4      '       g'   V P                  e   V! V P                  4      '       d   R	# V! V 4      '       d   R
# V\        ,          '       d   R# R# u upi )zµClosed class for an exception that ended a setup flow; inert (type checks only). ``cancelled``
and ``expired`` (the sign-in code ran out before approval) are recorded ``abandoned``.)Úis_cancelledÚis_device_code_expiredÚis_network_errorÚsetup_failure_classNÚ_SetupCancelledÚoauth_error_coderM   Úaccess_deniedr   Únetworkr   ÚauthrL   )Úhermes_cli.auth_error_copyrZ   r[   r\   ÚtypeÚ__mro__r   Ú
isinstanceÚgetattrr   r]   Ú	__cause__Ú_AUTH_ERROR_TYPES)rW   rZ   r[   r\   ÚclsÚnamess   &     r&   r]   r]   o   sÇ   € ÷ bÑaä%)¨#£Y×%6Ò%6Ó7Ñ%6˜c�\Œ\Ñ%6€EÐ7Ü”'˜#Ð4°dÓ;¼S×AÒAØ×&Ñ&Ð&á�C×ÒÐ-°Ô6¼'À#ÐGYÐ[]Ó:^ÐbqÔ:qÙá˜×Ò §¡Ò!:Ñ?OÐPS×P]ÑP]×?^Ò?^ÙÙ˜c×"Ò"ÙØÔ × Ô ÙÙùò 8s   ¢C+c               ó    € V ^8„  d   QhRRRR/# )r(   ÚfieldsrE   r)   r;   r   )r*   s   "r&   r+   r+   „   s   € ÷ <ñ <Ð+ð <°ñ <r%   c                ó@   € V f   R# ^RI Hp ^RIHp V! W3.4      ^8H  # )zVSave one row and wait for the store; a row the contract cannot build is settled as is.T)ÚPROVIDER_SETUP_MARK)Ú
emit_saved)rH   ro   Úshared_metrics_eventsrp   )rm   ro   rp   s   &  r&   Ú	_save_rowrr   „   s'   € à‚~ÙÝ<Ý1áÐ+Ð4Ð5Ó6¸!Ñ;Ð;r%   r2   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r(   r   r   r   r   r2   r)   úSetupFlow | Noner   )r*   s   "r&   r+   r+   Ž   s)   € ÷ ñ  #ð °ð Àcð ÐUeñ r%   c               ó   €  \        V4      ;_uu_ 4        ^RIHp V'       d   V\        9   g   V! 4       '       g    RRR4       R# \	        WRR7      pVf    RRR4       R# ^ RIHp ^ RIHp V! 4       p\        V4       \        V4      pVP                  RRR7       \        P                  ! 4       p	W€ R	V	 R	\        P                  ! 4        R
2,          p
RV	RV! V	4      R\        P                  ! 4       RV RVR,          /pV
P!                  RV
P"                   R24      pVP%                  \&        P(                  ! V4      RR7       \        P*                  ! WÊ4       \-        V4       \/        \1        V4      WR,          V
R7      uuRRR4       #   + '       g   i     R# ; i  \2         d    \4        P7                  RRR7        R# i ; i)z`Record ``started`` and drop the pending marker; None (no files, no rows) when collection is off.r=   NÚstarted©r   r   rD   )Úget_process_start_time©Úget_hermes_homeT)ÚparentsÚexist_okÚ-ú.jsonÚpidÚ
start_timeÚ
started_atr   r   Ú.z.tmpzutf-8©Úencoding)r   r   r   r   z!Provider setup start not recorded©Úexc_info)r9   r?   r>   Ú_NOT_A_PROVIDERrU   Úgateway.statusrx   r7   rz   Úreport_abandoned_setupsr0   ÚmkdirÚosÚgetpidÚtimeÚtime_nsÚ	with_nameÚnameÚ
write_textÚjsonÚdumpsÚreplacerr   r   r   r@   ÚloggerÚdebug)r   r   r2   r>   rm   rx   rz   r   Ú	directoryr   r   ÚrecordÚtmps   &&$          r&   Úbegin_provider_setuprš   Ž   su  € ðÜ�K× Õ Ý5ç˜x¬?Ô:Á'Ç)Â)Ø÷	 !Ñ ô
 +°7ÐU^Ô_ˆFØŠ~Ø÷ !Ñ õ >Ý8á"Ó$ˆDÜ# DÔ)Ü# DÓ)ˆIØ�O‰O D°4ˆOÔ8Ü—)’)“+ˆCØ 9¨A¨c¨U°!´D·L²L³NÐ3CÀ5Ð!IÕIˆFà�s˜LÑ*@ÀÓ*EÀ|ÔUY×U^ÒU^ÓU`Ø˜7 J°°zÕ0BðˆFð ×"Ñ" Q v§{¡{ m°4Ð#8Ó9ˆCØ�N‰Nœ4Ÿ:š: fÓ-¸ˆNÔ@Ü�JŠJ�sÔ#Ü�fÔÜ¤# d£)°WÈjÕGYÐbhÔi÷3 !× × Ó ûô4 ô Ü�‰Ð8À4ˆÔHÚðúsK   ‚F' •&F¼F½F' ÁFÁF' Á#D%FÆ
F' ÆF$	ÆF' Æ$F' Æ'"GÇGc               ó(   € V ^8„  d   QhRRRRRRRR/# )r(   Úflowrt   rD   r   rB   r)   ÚNoner   )r*   s   "r&   r+   r+   °   s0   € ÷ Gñ GÐ 0ð G¸ð GÈSð GÐ^bñ Gr%   c           	     óZ  € V f   R#  ^RI Hp V P                  P                  V P                  P                   R\
        P                  ! 4        R24      p \
        P                  ! V P                  V4       \        T P                  4      ;_uu_ 4        \        T P                  T P                  YR7      pT! Y@P                  \        T4      4       RRR4       R#   \         d     R# i ; i  + '       g   i     R# ; i  \         d    \         P#                  RRR7        R# i ; i)	zQRecord the flow's end once: only if its marker is still unclaimed (never raises).N)Úsettle_claimr‚   ú
.reporting)r   r   rD   rB   zProvider setup end not recordedTr…   )Úshared_metrics_processrŸ   r   r�   r�   r‹   rŒ   r”   ÚOSErrorr9   r   rU   r   r   rr   r@   r•   r–   )rœ   rD   rB   rŸ   Úclaimedrm   s   &&&   r&   Úfinish_provider_setupr¤   °   sä   € à‚|ÙðGÝ8à—+‘+×'Ñ'¨4¯;©;×+;Ñ+;Ð*<¸A¼b¿iºi»k¸]È*Ð(UÓVˆð	Ü�JŠJ�t—{‘{ GÔ,ô �D—I‘I×ÕÜ*ØŸ™¨t¯}©}ÀEôˆFñ ˜§+¡+¬y¸Ó/@ÔA÷	 Ñøô ô 	Úð	úç×Ðûô
 ô GÜ�‰Ð6Àˆ×FðGúsT   ˆAD Á!C Á8D Â?C0ÃD ÃC-Ã)D Ã,C-Ã-D Ã0D	Ã;D ÄD Ä"D*Ä)D*c               ó    € V ^8„  d   QhRRRR/# )r(   r˜   r   r)   r;   r   )r*   s   "r&   r+   r+   Å   s   € ÷ 
2ñ 
2˜ð 
2 ñ 
2r%   c                óè   € ^ RI Hp ^RIHp \	        V \
        4      '       g   R# V! V P                  R4      4      pVe&   \        P                  ! 4       V,
          \        8”  d   R# V! V 4      '       * # )é    )Úruntime_status_pid_is_live)Ú_non_negative_numberTr�   )	rˆ   r¨   rH   r©   rf   ÚdictÚgetr�   ÚSTALE_AFTER_S)r˜   r¨   r©   rv   s   &   r&   Ú_reportabler­   Å   sS   € Ý9å=ä�fœd×#Ò#ÙÙ" 6§:¡:¨lÓ#;Ó<€GØ‚œ$Ÿ)š)›+¨Õ/´-Ô?ÙÙ)¨&Ó1Ô1Ð1r%   c               ó    € V ^8„  d   QhRRRR/# )r(   r   r   r)   r�   r   )r*   s   "r&   r+   r+   Ò   s   € ÷ ;ñ ; $ð ;¨4ñ ;r%   c                ó,  € ^RI HpHp \        V 4      pVP	                  4       '       g   R# \        VP                  4       4       EF�  pVP                  P                  R4      '       g   RVP                  9  d   K8  VP                  P                  R4      '       d   V! V4      '       d   Ki   \        P                  ! VP                  RR7      4      pVP                  P                  R4      '       g   \        V4      '       g   KÄ  VP!                  VP                  P#                  R4      ^ ,          R,           4      pVP!                  VP                   R\$        P&                  ! 4        R24      p \$        P(                  ! WG4       \+        T\,        4      '       d-   \/        TP1                  R4      TP1                  R	4      R
R7      MRpT! Yv\3        T4      4       EK   	  R#   \        \        3 d    Rp EL*i ; i  \         d     EKÍ  i ; i)z®Report every pending marker whose flow can no longer finish as ``abandoned``.

Callers bind ``home`` (the scan runs at a setup start or on the process-exit reporter thread).
)Ú_claimer_aliverŸ   Nr‚   r~   r    z	utf-8-sigrƒ   r   r   r   rw   )r¡   r°   rŸ   r0   Úis_dirÚsortedÚiterdirr�   Ú
startswithÚendswithr’   ÚloadsÚ	read_textr¢   Ú
ValueErrorr­   r�   Úsplitr‹   rŒ   r”   rf   rª   rU   r«   rr   )	r   r°   rŸ   r—   Úpathr˜   Úoriginalr£   rm   s	   &        r&   r‰   r‰   Ò   sš  € ÷
 Eä˜DÓ!€IØ×Ñ×ÒÙÜ�y×(Ñ(Ó*×+ˆØ�9‰9×Ñ ×$Ò$¨°t·y±yÔ(@ÙØ�9‰9×Ñ˜l×+Ò+±¸t×0DÒ0DÙð	Ü—Z’Z §¡¸ Ó DÓEˆFð �y‰y×!Ñ! ,×/Ò/¼ÀF×8KÒ8KÙØ—>‘> $§)¡)§/¡/°'Ó":¸1Õ"=ÀÕ"GÓHˆØ×$Ñ$¨¯© °a¼¿	º	»°}ÀJÐ%OÓPˆð	Ü�JŠJ�tÔ%ô
 ˜¤×%Ò%ô 'Ø—J‘J˜yÓ)°F·J±J¸zÓ4JÐR]õ
à+/ð 	ñ 	�W¬	°&Ó(9×:ó) ,øô œÐ$ô 	Ø‹Fð	ûô ô 	Ûð	ús$   Â/&G)Å6HÇ)H Ç?H ÈHÈHÚ
backgroundFc          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r(   r   r   r   r   r2   r¼   r;   r)   r�   r   )r*   s   "r&   r+   r+   ó   s8   € ÷ Cñ C¨ð C°sð CÈCð CÐdhð CÐuyñ Cr%   c               ó¼  a aa€  \        V4      ;_uu_ 4        ^RIHp S'       d   V! 4       '       g    RRR4       R# ^ RIHp \        V! 4       4      oRRR4       R VVV 3R llpV'       d*   \        P                  ! VRRR7      P                  4        R# V! 4        R#   + '       g   i     LU; i  \         d    \        P                  R	RR
7        R# i ; i)a  A setup that starts and lands in one action (an API key saved from a form): both rows at once.
``background`` keeps a request handler from waiting on a cold metrics runtime; the owning home is
captured here, since a thread does not inherit the profile binding.r=   Nry   c               ó   € V ^8„  d   QhRR/# ©r(   r)   r�   r   )r*   s   "r&   r+   Ú0record_provider_setup_done.<locals>.__annotate__  s   € ÷ 	jñ 	j�Tñ 	jr%   c                 ó8   <€ \        \        SSS R 7      R4       R# )©r2   Ú	completedN)r¤   rš   )r   r   r   s   €€€r&   ÚrunÚ'record_provider_setup_done.<locals>.run  s   ø€ Ü!Ô"6°wÀÐVZÔ"[Ð]hÖir%   zhermes-setup-metricsT)Útargetr�   ÚdaemonzProvider setup not recordedr…   )r9   r?   r>   r7   rz   r   Ú	threadingÚThreadÚstartr@   r•   r–   )r   r   r2   r¼   r>   rz   rÅ   r   s   ff$$   @r&   Úrecord_provider_setup_donerÌ   ó   s    ú€ ðCÜ�K× Õ Ý5ç¡7§9¢9Ø÷	 !Ñ õ
 9ä‘Ó(Ó)ˆD÷ !÷	jò 	j÷ Ü×Ò CÐ.DÈTÔR×XÑXÖZáŽE÷ !× ûô  ô CÜ�‰Ð2¸Tˆ×BðCúsC   …B5 ˜B"´B"µB5 ¿B"ÁB5 Á0'B5 ÂB5 Â"B2	Â-B5 Â5"CÃCÚ
connectingc               ó$   € V ^8„  d   QhRRRRRR/# )r(   Úenv_varr   rÍ   r;   r)   z
str | Noner   )r*   s   "r&   r+   r+     s&   € ÷ Zñ Z cð Z¸$ð ZÈ:ñ Zr%   c               óX  a € ^ RI Hp ^ RIHp S R8X  d   R# V'       gj   S \        9   g]   \
        ;QJ d-    V 3R lVP                  4        4       F  '       g   K   RM"	  RM! V 3R lVP                  4        4       4      '       d   R# \        V 3R	 lVP                  4        4       R4      # )
a;  The shipped provider whose own API key lives in ``env_var``; None for any other variable. A bare
key save cannot tell connecting a provider from configuring a tool, so unless the caller says it is
``connecting`` one, ecosystem tokens and keys a tool's settings panel (TTS, STT, image...) also asks
for are None too.)ÚPROVIDER_REGISTRY)ÚTOOL_CATEGORIESÚOPENROUTER_API_KEYÚ
openrouterc              3  óÀ   <"  € T FS  pVP                  R R4       F:  q"P                  R4      ;'       g    R F  pSVP                  R4      8H  x € K  	  K<  	  KU  	  R# 5i)Ú	providersÚenv_varsÚkeyNr   ©r«   )Ú.0ÚcategoryÚrowÚentryrÏ   s   &   €r&   Ú	<genexpr>Ú+provider_for_api_key_env.<locals>.<genexpr>  s]   øé € ð <Ù4L¨Ø—<‘< ¨RÖ0ˆC¿g¹gÀjÓ>Q×>WÐ>WÐUWÒ>W°Uð 	�5—9‘9˜UÓ#Ö#Ù>Wñ 	$Ù0ñ 	$Ó4Lùs
   ƒ0A´*ATFNc              3  óh   <"  € T F'  w  rS\        VR R4      ;'       g    R9   g   K#  Vx € K)  	  R# 5i)Úapi_key_env_varsNr   )rg   )rÚ   ÚslugÚpconfigrÏ   s   &  €r&   rÞ   rß     s7   øé € ð SÑ+D™-˜$Ø¤¨Ð1CÀTÓ J× PÐ PÈbÑQ÷ ’Ó+Dùs   ƒ2Ÿ2¨
2)	Úhermes_cli.authrÑ   Úhermes_cli.tools_configrÒ   Ú_SHARED_TOKENSÚanyÚvaluesÚnextÚitems)rÏ   rÍ   rÑ   rÒ   s   f$  r&   Úprovider_for_api_key_envrë     s�   ø€ õ
 2Ý7àÐ&Ô&Ùß˜7¤nÔ4¿»ô <Ø4C×4JÑ4JÔ4Ló<¿¿ºô <Ø4C×4JÑ4JÔ4Ló<÷ 9ò 9ñ Üô SÐ+<×+BÑ+BÔ+Dó SØTXóZð Zr%   c               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )r(   rÏ   r   ÚvalueÚpreviousr   r   rÍ   r;   r)   r�   r   )r*   s   "r&   r+   r+     s@   € ÷ Bñ B #ð B¨cð B¸Sð BÈ3ð BÐ_cð BÐptñ Br%   c               ó2  €  ^RI Hp \        V\        4      '       d   VP	                  4       '       d   W8X  d   R# V! 4       '       d&   \        WR7      ;p'       d   \        W6RR7       R# R# R#   \         d    \        P                  RRR7        R# i ; i)z®Count a provider API key saved from a settings form: only a new or changed non-empty value (a
clear or a same-value re-save connects nothing; other variables are not setups).r=   N)rÍ   T)r¼   zAPI key setup not recordedr…   )
r?   r>   rf   r   Ústriprë   rÌ   r@   r•   r–   )rÏ   rí   rî   r   rÍ   r>   r   s   &&&&$  r&   Úrecord_api_key_savedrñ     su   € ðBÝ1ä˜%¤×%Ò%¨U¯[©[¯]ª]¸eÔ>OÙÙ�9Š9Ô&>¸wÔ&^Ð^˜(Ö^Ü& wÀT×Jñ _‰9øäô BÜ�‰Ð1¸Dˆ×AðBús!   ‚1A0 ´A0 ¼A0 Á	!A0 Á0"BÂBc               ó   € V ^8„  d   QhRR/# rÀ   r   )r*   s   "r&   r+   r+   2  s   € ÷ ñ  4ñ r%   c                 ó>   € \        \        RR4      p V e   RV R&   R# R# )zSA CLI flow persisted the provider/model choice (called by the shared save helpers).ÚhintsNTÚsaved)rg   Ú_cli)rô   s    r&   Únote_provider_setup_savedr÷   2  s$   € ä”D˜' 4Ó(€EØÒØˆˆg‹ñ r%   c               ó    € V ^8„  d   QhRRRR/# )r(   rB   r   r)   r�   r   )r*   s   "r&   r+   r+   9  s   € ÷ )ñ )¨sð )°tñ )r%   c                óf   € \        \        RR4      pVe   VP                  R4      f   WR&   R# R# R# )zXA CLI flow reported a failure it then returned from instead of raising (first one wins).rô   NrT   )rg   rö   r«   )rB   rô   s   & r&   Únote_provider_setup_failurerú   9  s4   € ä”D˜' 4Ó(€EØÒ˜UŸY™Y yÓ1Ò9Ø(ˆiÓñ :Ñr%   c               ó    € V ^8„  d   QhRRRR/# )r(   rW   rX   r)   r�   r   )r*   s   "r&   r+   r+   @  s   € ÷ >ñ >˜mð >°ñ >r%   c                ó¬   € \         P                  ! \        4      ;_uu_ 4        \        \	        V 4      4       R R R 4       R #   + '       g   i     R # ; i©N)Ú
contextlibÚsuppressr@   rú   r]   ©rW   s   &r&   Únote_sign_in_failurer  @  s0   € Ü	×	Ò	œY×	'Õ	'Ü#Ô$7¸Ó$<Ô=÷ 
(×	'×	'Ò	'ús   £AÁA	c               ó   € V ^8„  d   QhRR/# )r(   r)   ztuple[Any, ...]r   )r*   s   "r&   r+   r+   E  s   € ÷ Pñ P�oñ Pr%   c                 óÒ   a€ ^ RI Hp  V ! 4       P                  R4      o\        S\        4      '       g   S3# \
        ;QJ d    . V3R lR 4       F  NK  	  5# ! V3R lR 4       4      # )r§   )Úload_configÚmodelc              3  óF   <"  € T F  pSP                  V4      x € K  	  R # 5irý   rÙ   )rÚ   rØ   r  s   & €r&   rÞ   Ú_model_route.<locals>.<genexpr>K  s   øé € ÐOÑ+N C�—‘˜3—�Ó+Nùs   ƒ!)r   ÚdefaultÚbase_url)Úhermes_cli.configr  r«   rf   rª   Útuple)r  r  s    @r&   Ú_model_router  E  sP   ø€ Ý-á‹M×Ñ˜gÓ&€EÜ�eœT×"Ò"ØˆxˆßŒ5ÔOÑ+NÓO�5ÐOˆ5ÔOÑ+NÓOÓOÐOr%   c               ó    € V ^8„  d   QhRRRR/# )r(   r   r   r)   r3   r   )r*   s   "r&   r+   r+   O  s   € ÷  ñ   Cð  ¨Nñ  r%   c              #  óú   "  € \        \        RR4      pV \        n         Rx € \        4         T\        n        R#   \         d"   p\        T4      '       g   \        4        h Rp?ii ; i  T\        n        i ; i5i)zºName the surface whose provider picker runs inside (``hermes model``, the setup wizard, the
first-run chat prompt). The picker is shared, so only these entry points know which one it is.r   N)rg   rö   r   Ú_close_backed_outrX   Ú_is_go_back)r   rî   rW   s   &  r&   Úprovider_setup_surfacer  N  sb   é € ô ”t˜Y¨Ó-€HØ„D„Lð	 Ûô 	ÕàŒŽøô ô Ü˜3×ÒÜÔØûðûð  Œ�üs6   ‚A; < ¤
A+ ¯A;¼A(ÁA#Á#A(Á(A+ Á+A8Á8A;c               ó    € V ^8„  d   QhRRRR/# )r(   rW   rX   r)   r;   r   )r*   s   "r&   r+   r+   `  s   € ÷ Lñ L�]ð L tñ Lr%   c                ó¶   € \         ;QJ d/    R  \        V 4      P                   4       F  '       g   K   R# 	  R# ! R  \        V 4      P                   4       4      # )c              3  ó>   "  € T F  qP                   R 8H  x € K  	  R# 5i)Ú_SetupGoBackN)r   )rÚ   rj   s   & r&   rÞ   Ú_is_go_back.<locals>.<genexpr>a  s   é € ÐKÑ9J°#�|‰|˜~Ö-Ó9Jùs   ‚TF)rç   rd   re   r   s   &r&   r  r  `  s?   € ß‹3ÑK¼¸c»×9JÒ9JÓK�3Œ3ÐKŠ3ÐKˆ3ÑK¼¸c»×9JÒ9JÓKÓKÐKr%   c               ó   € V ^8„  d   QhRR/# rÀ   r   )r*   s   "r&   r+   r+   d  s   € ÷ 7ñ 7˜4ñ 7r%   c                 ór   € \        \        RR4      Rup \        n        V e   \        V ^ ,          R4       R# R# )zVThe user went Back out of a provider flow and never resumed it: it ends ``abandoned``.Ú
backed_outNr   )rg   rö   r  r¤   )Úpendings    r&   r  r  d  s2   € ä&¤t¨\¸4Ó@À$Ð€GŒTŒ_ØÒÜ˜g a�j¨+Ö6ñ r%   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r(   rœ   r   r   r   r   r)   r;   r   )r*   s   "r&   r+   r+   k  s(   € ÷ ñ �9ð  sð °cð ¸dñ r%   c                óš   €  ^RI Hp V\        9  ;'       d#    V P                  V P                  3W! V4      38H  #   \
         d     R# i ; i)rG   rI   F)rN   rJ   r‡   r   r   r@   )rœ   r   r   rJ   s   &&& r&   Ú_resumesr  k  sN   € ðÝ@àœÑ.×}Ð}°D·L±LÀ$Ç-Á-Ð3PÐU\Ð^rÐs{Ó^|ÐT}Ñ3}Ð}øÜô Úðús   ‚; ˜"; »A
Á	A
c               ó    € V ^8„  d   QhRRRR/# )r(   r   r   r)   r3   r   )r*   s   "r&   r+   r+   u  s   € ÷ *1ñ *1 ð *1¨ñ *1r%   c              #  ó  "  € \        \        RR4      p\        \        RR4      Rup\        n        Ve/   \        V^ ,          W4      '       g   \	        V^ ,          R4       RpT;'       g    V'       d   \        W4      MRR3w  r4Vf   Rx € R# Vf6   \        P                  ! \        4      ;_uu_ 4        \        4       pRRR4       RRRR/pV\        n
         Rx € R\        n
        TR,          pT'       gE   \        P                  ! \        4      ;_uu_ 4        TRJ;'       d    \        4       T8g  pRRR4       T'       d   \	        TR	4       R# TR,          '       d   \	        TRTR,          4       R# \	        TR4       R#   + '       g   i     LÏ; i  \         dF   pR\        n
        \        T4      '       d   Y43\        n        h \	        TR\        T4      4       h Rp?ii ; i  + '       g   i     L¿; i5i)
a  Track one CLI provider flow under the entry point's surface. Without one (fallback picking,
tests driving the picker directly) nothing is tracked.

Completed when the flow saved a choice or changed the model route; a flow that returns without
either failed with the class it reported, else the user backed out (``abandoned``). Back (Left
arrow) leaves the flow open: the replayed picker re-entering the same provider continues it (one
``started``); picking another provider, or leaving the entry point, ends it ``abandoned``.
r   Nr  r   rõ   FrT   rK   rÄ   )rg   rö   r  r  r¤   rš   rþ   rÿ   r@   r  rô   rX   r  r]   )r   r   r  rœ   Úbeforerô   rW   Úlandeds   &       r&   Úcli_provider_setupr"  t  s�  é € ô ”d˜I tÓ,€GÜ&¤t¨\¸4Ó@À$Ð€GŒTŒ_ØÒ¤8¨G°A­J¸×#JÒ#JÜ˜g a�j¨+Ô6ØˆØ×bÐbÏ'Ô3°GÔFÐW[Ð]aÐb�L€DØ‚|ÛÙØ‚Ü× Ò ¤×+Õ+Ü!“^ˆF÷ ,à$ e¨Y¸Ð=€EØ„D„JðÛð „D„JØ�7�^€FßÜ× Ò ¤×+Õ+Ø 4Ð'×DÐD¬L«N¸fÑ,DˆF÷ ,çÜ˜d KÖ0Ø	ˆy×	Ô	Ü˜d H¨e°IÕ.>Ö?ä˜d KÖ0÷/ ,×+ûô ô ØŒŒ
Ü�s×ÒØ#˜nŒDŒOð 	ô " $¨Ô2EÀcÓ2JÔKØûðú÷ ,×+üsz   ‚A)HÁ,HÁ5AHÂ6FÃHÃF ÃHÃ;"HÄG.Ä7HÅHÅ$$HÆF	ÆHÆG+Æ&A G&Ç&G+Ç+HÇ.G>	Ç9Hc               ó   € V ^8„  d   QhRR/# )r(   r)   r   r   )r*   s   "r&   r+   r+   ¤  s   € ÷ Dñ D˜3ñ Dr%   c                 ó0   € ^ RI Hp  V ! 4       '       d   R# R# )r§   ©Úis_desktop_owned_backendÚdesktopÚ	dashboard)Úhermes_cli.process_identityr&  r%  s    r&   Úweb_setup_surfacer*  ¤  s   € ÝDá0×2Ò2ˆ9ÐC¸ÐCr%   c               ó$   € V ^8„  d   QhRRRRRR/# )r(   r   r   r2   r   r)   rt   r   )r*   s   "r&   r+   r+   ª  s"   € ÷ ñ  ð °#ð Ð:Jñ r%   c                ó€   €  \        \        4       WR 7      #   \         d    \        P	                  RRR7        R# i ; i)rÃ   zOAuth setup start not recordedTr…   N)rš   r*  r@   r•   r–   )r   r2   s   &&r&   Úbegin_oauth_setupr-  ª  s;   € ðÜ#Ô$5Ó$7¸Ô[Ð[øÜô Ü�‰Ð5ÀˆÔEÚðús   ‚ —"=¼=c               ó$   € V ^8„  d   QhRRRRRR/# )r(   Úsessúdict[str, Any] | Nonerœ   rt   r)   r�   r   )r*   s   "r&   r+   r+   ²  s#   € ÷ (ñ (Ð2ð (Ð:Jð (Ètñ (r%   c                óR   € Ve#   \        V \        4      '       d   W\        &   R # R # R # rý   )rf   rª   Ú_OAUTH_SESSION_KEY)r/  rœ   s   &&r&   Úattach_oauth_setupr3  ²  s%   € ØÒœJ t¬T×2Ò2Ø#'ÔÓ ñ 3Ñr%   c               ó$   € V ^8„  d   QhRRRRRR/# )r(   r/  r0  rW   rX   r)   r�   r   )r*   s   "r&   r+   r+   ·  s'   € ÷ @ñ @Ð2ð @¸ð @È4ñ @r%   c                óÔ   € \         P                  ! \        4      ;_uu_ 4        \        V \        4      '       d   \        V4      V \        &   RRR4       R#   + '       g   i     R# ; i)z¢A sign-in poller died with ``exc``: keep its closed class for the settle (the status alone is
``error`` for a lapsed code, a dropped network and a refusal alike).N)rþ   rÿ   r@   rf   rª   r]   Ú_OAUTH_FAILURE_KEY)r/  rW   s   &&r&   Únote_oauth_failurer7  ·  sA   € ô 
×	Ò	œY×	'Õ	'Ü�dœD×!Ò!Ü':¸3Ó'?ˆDÔ#Ñ$÷ 
(×	'×	'Ò	'ús   £)AÁA'	c               ó$   € V ^8„  d   QhRRRRRR/# )r(   r/  r0  r   r;   r)   r�   r   )r*   s   "r&   r+   r+   ¿  s(   € ÷ Dñ DÐ2ð DÀ$ð DÐSWñ Dr%   c               ó®  €  \        V \        4      '       d   V P                  \        4      f   R# V P                  R4      '       d   RM#\	        V P                  R4      ;'       g    R4      pVR9   d8   \
        P                  \	        V P                  R4      ;'       g    R4      4      MRpT;'       g    \        P                  V4      pVf)   VR8X  d"   RV P                  \        4      ;'       g    R3pVf   V'       g   R# RpV P                  \        R4      p\        V.VO5!   R#   \         d    \        P                  R	R
R7        R# i ; i)zYEnd an OAuth session's flow from its status (no-op while pending, or when already ended).Nr   ÚstatusrM   ÚerrorÚreasonrK   rL   zOAuth setup end not recordedTr…   >   r;  r   ©r   r   )rf   rª   r«   r2  r   Ú_OAUTH_REASONSÚ_OAUTH_ENDINGSr6  Úpopr¤   r@   r•   r–   )r/  r   r:  Úendingrœ   s   &$   r&   Úsettle_oauth_setuprB  ¿  s  € ðDÜ˜$¤×%Ò%¨¯©Ô2DÓ)EÒ)MÙØ $§¡¨× 5Ò 5‘¼3¸t¿x¹xÈÓ?Q×?WÐ?WÐUWÓ;XˆØFLÐPcÔFc”×#Ñ#¤C¨¯©°Ó(:×(@Ð(@¸bÓ$AÔBÐimˆØ×5Ð5œ>×-Ñ-¨fÓ5ˆØŠ>˜f¨Ô/Ø §¡Ô);Ó <× GÐ GÀÐHˆFØŠ>ßÙØ*ˆFØ�x‰xÔ*¨DÓ1ˆÜ˜dÐ, VÖ,øÜô DÜ�‰Ð3¸dˆ×CðDús:   ‚-D. ±D. ÁD. Á'9D. Â!D. Â7=D. Ã5D. Ä%D. Ä."EÅE>   ÚcancelÚ	reasoningú
aux-configúremove-custom>   ÚGH_TOKENÚHF_TOKENÚGITHUB_TOKEN)rÄ   r   r=  )rK   rb   )rK   ra   rý   )r   )=Ú__doc__Ú
__future__r   rþ   r’   Úloggingr‹   rÉ   r�   Údataclassesr   Úpathlibr   Útypingr   r   Ú	getLoggerr   r•   r/   r¬   Ú	frozensetr‡   ri   r2  r6  rQ   ræ   r?  r>  r   r0   Úcontextmanagerr9   rA   rU   r]   rr   rš   r¤   r­   r‰   rÌ   rë   rñ   Úlocalrö   r÷   rú   r  r  r  r  r  r  r"  r*  r-  r3  r7  rB  r   r%   r&   Ú<module>rT     s  ðñõ #ã Û Û Û 	Û Û Ý !Ý ß  ð 
×	Ò	˜8Ó	$€à)€à€áÒRÓS€Ù˜{Ð,=Ð>Ó?Ð Ø*Ð Ø-Ð á˜;¨	Ð2Ó3€áÒCÓD€ð Ð%ØÐ&ØÐ ØÐ$ð	€ð Ð*ØÐ'ØÐ$ØÐ)ØÐ-ð€ð ÷ð ó ðõBð ×Ñô.ó ð.÷ðvÐ[a÷ võõ*<ðÈD÷ ÷DGõ*
2õ;ðBCÐRVð CÐkp÷ Cð2ZÀ÷ Zð&BÐfk÷ Bð  ‡‚Ó€õõ)õ>õ
Pð ×Ñô ó ð õ"Lõ7õð ×Ñô*1ó ð*1õ^Dõõ(õ
@ðDÈ÷ Dñ Dr%   