+
    jHàjJ:  ã                  óˆ  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	t
^ RIt
^ RIHt ^ RIHt ^ RIHt ^ RIHt ]P(                  ! ]4      tRtRGtR]R	&   ^t]R
,          tRt^tR]! 4       P<                   2tRs R]R&   Rs!R]R&   Rs"R]R&   R R lt#R R lt$R R lt%]3R R llt&R R lt'R R  lt(R! R" lt)]PT                  ! 4       t+],! 4       t-R#]R$&   R% R& lt.R' R( lt/R) R* lt0R+R,/R- R. llt1R/ R0 lt2R1 R2 lt3R3 R4 lt4R5 R6 lt5R7 R8 lt6R9 R: lt7R; R< lt8R= R> lt9R? R@ lt:RA RB lt;RC RD lt<RE RF lt=R# )Huy  Remote model catalog fetcher.

``get_catalog()`` returns the parsed manifest: in-process cache (TTL) â†’ disk cache at
``~/.hermes/cache/model_catalog.json`` â†’ master URL fetch; any fetch failure keeps the stale copy
(or ``{}``). ``get_curated_openrouter_models()`` / ``get_curated_nous_models()`` are thin accessors
whose callers fall back to the in-repo lists on ``None``.
)ÚannotationsN)ÚPath)ÚAny)Úget_version_info)Úatomic_json_writezAhttps://hermes-agent.nousresearch.com/docs/api/model-catalog.jsonútuple[str, ...]ÚDEFAULT_CATALOG_FALLBACK_URLSç      N@g       @zhermes-cli/údict[str, Any] | NoneÚ_catalog_cacheç        ÚfloatÚ_catalog_cache_source_mtimeÚ ÚstrÚ_catalog_cache_source_pathc               ó   € V ^8„  d   QhRR/# )é   Úreturnúdict[str, Any]© )Úformats   "Ú=/home/ubuntu/.hermes/hermes-agent/hermes_cli/model_catalog.pyÚ__annotate__r   1   s   € ÷ ]ñ ]˜nñ ]ó    c                 ó  €  ^ RI Hp  V ! 4       ;'       g    / pVP                  R4      p\	        V\
        4      '       g   / pVP                  R4      p VR
9  d   \        V4      M\        pV\        8X  d2   VP                  R4      '       d    \        VR,          4      R,          pV^ 8:  d   \        pR\        VP                  RR4      4      R\        VP                  R4      ;'       g    \        4      RVR,          R	\	        VP                  R	4      \
        4      '       d   VP                  R	4      /# / /#   \         d    / p EL3i ; i  \        \        3 d
    \        p Lýi ; i  \        \        3 d     LØi ; i)z@Load the ``model_catalog`` config block with defaults filled in.)Úload_configÚmodel_catalogÚttl_minutesÚ	ttl_hoursr	   ÚenabledTÚurlÚ	providers)Nr   )Úhermes_cli.configr   Ú	ExceptionÚgetÚ
isinstanceÚdictr   ÚDEFAULT_TTL_MINUTESÚ	TypeErrorÚ
ValueErrorÚboolr   ÚDEFAULT_CATALOG_URL)r   ÚcfgÚrawr   s       r   Ú_load_catalog_configr/   1   sk  € ðÝ1Ù‹m×!Ð!˜rˆð �'‰'�/Ó
"€CÜ�cœ4× Ò Øˆð —'‘'˜-Ó(€Kð*Ø,7¸zÔ,I”e˜KÔ(ÔObˆð Ô)Ô)¨c¯g©g°k×.BÒ.Bð	Ü  KÕ 0Ó1°DÕ8ˆKð �aÔÜ)ˆð 	”4˜Ÿ™ 	¨4Ó0Ó1ØŒs�3—7‘7˜5“>×8Ð8Ô%8Ó9Ø�[ 4Õ'Ø¬Z¸¿¹ÀÓ8LÌd×-SÒ-S�S—W‘W˜[Ó)ð	]ð ]ð Z\ð	]ð ]øô+ ô Ø‹ðûô ”zÐ"ô *Ü)Šð*ûô
 œ:Ð&ô 	Ùð	ús:   ‚D< –D< ÁE ÂE- Ä<EÅEÅE*Å)E*Å-FÆ Fc               ó   € V ^8„  d   QhRR/# )r   r   r   r   )r   s   "r   r   r   R   s   € ÷ >ñ >�Tñ >r   c                 ó8   € ^ RI Hp  V ! 4       R,          R,          # )z?Disk cache path; imported lazily so tests can monkeypatch home.©Úget_hermes_homeÚcachezmodel_catalog.json)Úhermes_constantsr3   r2   s    r   Ú_cache_pathr6   R   s   € å0ÙÓ˜wÕ&Ð)=Õ=Ð=r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r!   r   Útimeoutr   r   r
   r   )r   s   "r   r   r   X   s"   € ÷ ñ ˜ð  uð Ð1Fñ r   c                ó¦  €  \         P                  P                  V RRR\        /R7      p\         P                  P	                  W!R7      ;_uu_ 4       p\
        P                  ! VP                  4       P                  4       4      pRRR4       \#        X4      '       g   \        P                  R	T 4       R# T#   + '       g   i     L;; i  \         P                  P                  \        \
        P                  \        3 d"   p\        P                  RY4        Rp?R# Rp?i\          d"   p\        P                  RY4        Rp?R# Rp?ii ; i)
zJHTTP GET the manifest URL and return a validated dict, or None on failure.ÚAcceptzapplication/jsonz
User-Agent)Úheaders)r8   Nz#model catalog fetch failed (%s): %sz$model catalog fetch errored (%s): %sz,model catalog at %s failed schema validation)ÚurllibÚrequestÚRequestÚ_HERMES_USER_AGENTÚurlopenÚjsonÚloadsÚreadÚdecodeÚerrorÚURLErrorÚTimeoutErrorÚJSONDecodeErrorÚOSErrorÚloggerÚinfor$   Ú_validate_manifest)r!   r8   ÚreqÚrespÚdataÚexcs   &&    r   Ú_fetch_manifestrQ   X   sê   € ð	Ü�n‰n×$Ñ$ S°8Ð=OÐQ]Ô_qÐ2rÐ$ÓsˆÜ�^‰^×#Ñ# CÐ#×9Ô9¸TÜ—:’:˜dŸi™i›k×0Ñ0Ó2Ó3ˆD÷ :ô ˜d×#Ò#Ü�‰ÐBÀCÔHÙØ€K÷ :×9ûä�L‰L×!Ñ!¤<´×1EÑ1EÄwÐOô Ü�‰Ð9¸3ÔDÝûÜô Ü�‰Ð:¸CÔEÝûðúsH   ‚AC Á3B9ÂC Â9C		ÃC Ã	C Ã9EÄD!Ä!EÄ.EÄ/EÅEc               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   Úprimary_urlr   r8   r   Úfallback_urlsr   r   r
   r   )r   s   "r   r   r   j   s,   € ÷ ñ ØðØ$ðØ5Dðàñr   c                ó¬   € \        W4      pVe   V# V F<  pV'       d   W@8X  d   K  \        WA4      pVf   K$  \        P                  RV4       Vu # 	  R# )z¼First manifest that fetches and validates from ``primary_url`` then ``fallback_urls`` (skipping
any equal to the primary so a raw-GitHub-configured operator doesn't double-fetch), or None.Nz3model catalog primary URL failed; using fallback %s)rQ   rJ   rK   )rS   r8   rT   rO   r!   s   &&&  r   Ú_fetch_manifest_with_fallbackrV   j   sW   € ô
 ˜;Ó0€DØÒØˆÛˆß�cÔ(ÙÜ˜sÓ,ˆØÔÜ�K‰KÐMÈsÔSØŠKñ ñ r   c               ó    € V ^8„  d   QhRRRR/# )r   rO   r   r   r+   r   )r   s   "r   r   r   |   s   € ÷ ñ ˜Sð  Tñ r   c                óN  € \        V \        4      '       g   R# V P                  R4      p\        V\        4      '       d   V\        8”  d   R# V P                  R4      p\        V\        4      '       g   R# VP                  4        F›  w  r4\        V\        4      '       d   \        V\        4      '       g    R# VP                  R4      p\        V\        4      '       g    R# \        ;QJ d    R V 4       F  '       d   K   RM	  RM! R V 4       4      '       d   Kš   R# 	  R# )z=Return True when ``data`` matches the minimum manifest shape.FÚversionr"   Úmodelsc              3  óÎ   "  € T F[  p\        V\        4      ;'       d?    \        VP                  R 4      \        4      ;'       d    VR ,          P	                  4       x € K]  	  R# 5i)ÚidN)r&   r'   r%   r   Ústrip)Ú.0Úms   & r   Ú	<genexpr>Ú%_validate_manifest.<locals>.<genexpr>Œ   sF   é € ÐlÑekÐ`a”:˜a¤Ó&×[Ð[¬:°a·e±e¸D³kÄ3Ó+G×[Ð[ÈAÈdÍGÏMÉMËOÔ[Óekùs   ‚A%ž&A%Á A%T)	r&   r'   r%   ÚintÚSUPPORTED_SCHEMA_VERSIONÚitemsr   ÚlistÚall)rO   rY   r"   ÚpnameÚpblockrZ   s   &     r   rL   rL   |   sÎ   € ä�dœD×!Ò!ÙØ�h‰h�yÓ!€GÜ�gœs×#Ò# wÔ1IÔ'IÙØ—‘˜Ó%€IÜ�i¤×&Ò&ÙØ"Ÿ™Ö*‰ˆÜ˜%¤×%Ò%¬Z¸Ä×-EÒ-EÚØ—‘˜HÓ%ˆÜ˜&¤$×'Ò'Úß‹sÑlÑekÓl�s�sŠsÑlÑekÓl×lÔlÚñ +ñ r   c               ó   € V ^8„  d   QhRR/# )r   r   z#tuple[dict[str, Any] | None, float]r   )r   s   "r   r   r   ‘   s   € ÷ Fñ FÐ=ñ Fr   c                 ó€  € \        4       p  V P                  4       P                  p \        T RR7      ;_uu_ 4       p\        P                  ! T4      pRRR4       \        X4      '       d   Y13# R#   \        \        3 d    Ru # i ; i  + '       g   i     L?; i  \        \        P                  3 d    Ru # i ; i)z@Return ``(data_or_none, mtime)``. mtime is 0 if file is missing.Nú	utf-8-sig©Úencoding)Nr   )
r6   ÚstatÚst_mtimerI   ÚFileNotFoundErrorÚopenrA   ÚloadrH   rL   )ÚpathÚmtimeÚfhrO   s       r   Ú_read_disk_cacherv   ‘   s£   € ä‹=€DðØ—	‘	“×$Ñ$ˆðÜ�$ ×-Õ-°Ü—9’9˜R“=ˆD÷ .ô /¨t×4Ò4ˆDˆ=ÐE¸+ÐEøô Ô&Ð'ô ØÒðú÷ .×-ûä”T×)Ñ)Ð*ô ØÒðús?   ŒA1 §B ¼B
ÁB Á1BÂBÂ
B	ÂB ÂB ÂB=Â<B=c               ó    € V ^8„  d   QhRRRR/# )r   rO   r   r   ÚNoner   )r   s   "r   r   r       s   € ÷ Añ A˜Nð A¨tñ Ar   c                óŽ   €  \        \        4       V 4       R#   \         d"   p\        P	                  R T4        Rp?R# Rp?ii ; i)z$model catalog cache write failed: %sN)r   r6   rI   rJ   rK   )rO   rP   s   & r   Ú_write_disk_cacherz       s8   € ðAÜœ+›-¨Ö.øÜô AÜ�‰Ð:¸C×@Ò@ûðAús   ‚ ˜A£?¿Azset[str]Ú_catalog_swr_inflightc               ó    € V ^8„  d   QhRRRR/# )r   r!   r   r   rx   r   )r   s   "r   r   r   ®   s   € ÷ jñ j Cð j¨Dñ jr   c                ót  a aaa€ \        \        4       4      o\        ;_uu_ 4        S\        9   d    RRR4       R# \        P	                  S4       RRR4       R VV 3R llo\
        P                  ! 4       o\        P                  ! VV3R lRRR7      P                  4        R#   + '       g   i     L]; i)zRRefresh the catalog manifest off-thread (fire-and-forget, deduped per cache path).Nc               ó   € V ^8„  d   QhRR/# ©r   r   rx   r   )r   s   "r   r   Ú0_spawn_catalog_swr_refresh.<locals>.__annotate__¶   s   € ÷ 	<ñ 	<�dñ 	<r   c            	     ó   <€  \        S\        4      p V e   \        V 4       \        ;_uu_ 4        \        P                  S4       R R R 4       R #   \         d    \        P                  RRR7        LRi ; i  + '       g   i     R # ; i  \        ;_uu_ 4        \        P                  S4       R R R 4       i   + '       g   i     i ; i; i)Nzcatalog SWR refresh failedT©Úexc_info)	rV   ÚDEFAULT_FETCH_TIMEOUTrz   r$   rJ   ÚdebugÚ_catalog_swr_lockr{   Údiscard)ÚfetchedÚinflight_keyr!   s    €€r   Ú_refreshÚ,_spawn_catalog_swr_refresh.<locals>._refresh¶   s”   ø€ ð	<Ü3°CÔ9NÓOˆGØÒ"Ü! 'Ô*÷ #Ö"Ü%×-Ñ-¨lÔ;÷ #Ñ"øô ô 	FÜ�L‰LÐ5ÀˆLÖEð	Fú÷ #×"Ð"û×"Ö"Ü%×-Ñ-¨lÔ;÷ #×"×"Ð"ýsF   ƒA °A8Á"A5Á2B Á4A5Á5B Á8B		ÂCÂB:	Â1	CÂ:C
ÃCc                 ó&   <€ SP                  S 4      # ©N)Úrun)rŠ   Úcontexts   €€r   Ú<lambda>Ú,_spawn_catalog_swr_refresh.<locals>.<lambda>Ä   s   ø€  G§K¡K°Ô$9r   Tzmodel-catalog-swr)ÚtargetÚdaemonÚname)
r   r6   r†   r{   ÚaddÚcontextvarsÚcopy_contextÚ	threadingÚThreadÚstart)r!   rŠ   r�   r‰   s   f@@@r   Ú_spawn_catalog_swr_refreshr›   ®   s~   û€ ä”{“}Ó%€Lß	Ö	ØÔ0Ô0Ø÷ 
Ñ	ô 	×!Ñ! ,Ô/÷ 
÷
	<ñ 	<ô ×&Ò&Ó(€GÜ×ÒÕ9À$ÐM`Ôa×gÑgÖi÷' 
×	ús   ¦B'½B'Â'B7	c               ó$   € V ^8„  d   QhRRRRRR/# )r   rO   r   rt   r   r   r   )r   s   "r   r   r   Ç   s!   € ÷ ñ �Nð ¨5ð °^ñ r   c                ó4   € Wus s\        \        4       4      sV # r�   )r   r   r   r6   r   )rO   rt   s   &&r   Ú	_rememberrž   Ç   s   € à26Ð/€NÐ/Ü!$¤[£]Ó!3ÐØ€Kr   c               ó   € V ^8„  d   QhRR/# )r   r   r
   r   )r   s   "r   r   r   Î   s   € ÷ ñ Ð2ñ r   c                 óZ   € \         e#   \        \        \        4       4      8X  d   \         # R# )zOThe in-process copy when it mirrors the ACTIVE profile's cache file, else None.N)r   r   r   r6   r   r   r   Ú_in_process_catalogr¡   Î   s    € äÒ!Ô&@ÄCÌËÓDVÔ&VÜÐÙr   Úforce_refreshFc               ó    € V ^8„  d   QhRRRR/# )r   r¢   r+   r   r   r   )r   s   "r   r   r   Õ   s   € ÷ ñ  $ð °>ñ r   c                ó>  € \        4       pVR,          '       g   / # \        RVR,          R,          4      p\        4       w  r4\        P                  ! 4       pVRJ;'       d    WT,
          V8  pV '       gM   VeI   \	        4       pV'       d   Ve   V\
        8X  d   V# V'       g   \        VR,          4       \        W44      # \        VR,          \        4      pVe2   \        V4       \        4       w  ršV	e   \        Wš4      # \        W…4      # Ve   \        W44      # / # )u¦   Parsed model catalog manifest, or ``{}`` on failure â€” never raises, so the CLI works offline
(callers treat a missing provider/model as "use the in-repo fallback").r    r   r   ç      ¬@Nr!   )r/   Úmaxrv   Útimer¡   r   r›   rž   rV   r„   rz   )r¢   r-   Úttl_secondsÚ	disk_dataÚ
disk_mtimeÚnowÚ
disk_freshÚcachedrˆ   Únew_disk_dataÚ	new_mtimes   $          r   Úget_catalogr°   Õ   sý   € ô Ó
 €CØˆy�>Œ>Øˆ	Ü�c˜3˜{Õ+¨fÕ4Ó5€KÜ,Ó.Ñ€IÜ
�)Š)‹+€CØ $Ð&×KÐK¨CÕ,<ÀÑ+K€Jç˜YÒ2Ü$Ó&ˆß˜&Ò,°Ô?ZÔ1ZØˆMßô ' s¨5¥zÔ2Ü˜Ó/Ð/ä+¨C°­JÔ8MÓN€GØÒÜ˜'Ô"Ü#3Ó#5Ñ ˆØÒ$Ü˜]Ó6Ð6Ü˜Ó&Ð&ØÒÜ˜Ó/Ð/Ø€Ir   c               ó   € V ^8„  d   QhRR/# )r   r   r   r   )r   s   "r   r   r   ÷   s   € ÷ Cñ C %ñ Cr   c                 óF   € \        R\        4       R,          R,          4      # )zHReturn the configured catalog TTL in seconds (the gateway poll cadence).r	   r   r¥   )r¦   r/   r   r   r   Úrefresh_interval_secondsr³   ÷   s   € äˆtÔ)Ó+¨KÕ8¸6ÕAÓBÐBr   c               ó   € V ^8„  d   QhRR/# )r   r   r+   r   )r   s   "r   r   r   ü   s   € ÷ ñ ˜$ñ r   c                 óè   € \        4       R,          '       g   R# \        RR7      p  ^ RIHpHp V! RR7       V! RR7       \        V 4      #   \
         d    \        P                  RRR7        L/i ; i)zåForce-refresh every remote catalog the picker reads (manifest, OpenRouter live list, Nous Portal
recommendations), writing each disk cache so the next ``/model`` open in ANY process sees them.
Blocking; run it off the event loop.r    FT)r¢   )Úfetch_nous_recommended_modelsÚfetch_openrouter_modelszprovider catalog refresh failedr‚   )	r/   r°   Úhermes_cli.modelsr¶   r·   r$   rJ   r…   r+   )Úcatalogr¶   r·   s      r   Úrefresh_catalogsrº   ü   sh   € ô  Ó! )×,Ô,ÙÜ¨Ô-€GðGß\á¨dÕ3Ù%°DÕ9ô �‹=Ðøô ô GÜ�‰Ð6ÀˆÖFðGús   §A Á"A1Á0A1c               ó    € V ^8„  d   QhRRRR/# ©r   Úproviderr   r   r
   r   )r   s   "r   r   r     s   € ÷ Hñ H sð HÐ/Dñ Hr   c                óR  € \        4       pVR,          '       g   R# VR,          P                  V 4      p\        V\        4      '       g   R# VP                  R4      p\        V\        4      '       d   VP                  4       '       g   R# \        VP                  4       \        4      # )zEIf ``model_catalog.providers.<name>.url`` is set, fetch that instead.r    Nr"   r!   )r/   r%   r&   r'   r   r]   rQ   r„   )r½   r-   Úprovider_cfgÚoverride_urls   &   r   Ú_fetch_provider_overriderÁ     s€   € ä
Ó
 €CØˆy�>Œ>ÙØ�{Õ#×'Ñ'¨Ó1€LÜ�l¤D×)Ò)ÙØ×#Ñ# EÓ*€LÜ�l¤C×(Ò(°×0BÑ0B×0DÒ0DÙä˜<×-Ñ-Ó/Ô1FÓGÐGr   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úmanifestr
   r½   r   r   r   )r   s   "r   r   r     s#   € ÷ 6ñ 6Ð-ð 6¸ð 6ÐAVñ 6r   c                óŒ   € T ;'       g    / P                  R / 4      P                  V4      p\        V\        4      '       d   V# R# )r"   N)r%   r&   r'   )rÃ   r½   Úblocks   && r   Ú	_block_ofrÆ     s<   € Ø�^ˆ^˜× Ñ  ¨bÓ1×5Ñ5°hÓ?€EÜ˜u¤d×+Ò+ˆ5Ð5°Ð5r   c               ó    € V ^8„  d   QhRRRR/# r¼   r   )r   s   "r   r   r   !  s   € ÷ iñ i #ð iÐ*?ñ ir   c                ód   € \        \        V 4      V 4      ;'       g    \        \        4       V 4      # )zHReturn the provider's manifest block, respecting per-provider overrides.)rÆ   rÁ   r°   )r½   s   &r   Ú_get_provider_blockrÉ   !  s)   € äÔ-¨hÓ7¸ÓB×hÐhÄiÔP[ÓP]Ð_gÓFhÐhr   c               ó    € V ^8„  d   QhRRRR/# )r   rÅ   r
   r   z list[tuple[str, dict[str, Any]]]r   )r   s   "r   r   r   &  s    € ÷ iñ iÐ+ð iÐ0Pñ ir   c                ó  € T ;'       g    / P                  R. 4      pV Uu. uFZ  p\        V\        4      '       g   K  \        VP                  R4      ;'       g    R4      P	                  4       ;p'       g   KW  W23NK\  	  up# u upi )zG``(id, entry)`` for every model entry of ``block`` with a non-empty id.rZ   r\   r   )r%   r&   r'   r   r]   )rÅ   rZ   r_   Úmids   &   r   Ú
_block_idsrÍ   &  sk   € à�kˆk�r×Ñ˜x¨Ó,€FÙ$Óh™f˜¬
°1´d×(;ŒHÌÈAÏEÉEÐRVËK×L]ÐL]Ð[]ÓH^×HdÑHdÓHfÐAfÀÓAfŒHˆS‹H™fÑhÐhùÒhs   ¡B¾BÁBÁ:Bc               ó   € V ^8„  d   QhRR/# )r   r   zlist[tuple[str, str]] | Noner   )r   s   "r   r   r   ,  s   € ÷ Oñ OÐ'Cñ Or   c            
     ó¾   € \        \        R4      4      p V  UUu. uF+  w  rT\        VP                  R4      ;'       g    R4      3NK-  	  upp;'       g    R# u uppi )zDOpenRouter's curated ``[(id, description), ...]`` from the manifest.Ú
openrouterÚdescriptionr   N)rÍ   rÉ   r   r%   )ÚrowsrÌ   r_   s      r   Úget_curated_openrouter_modelsrÓ   ,  sO   € äÔ)¨,Ó7Ó8€DÙAEÔFÁ±v°sˆS”#�a—e‘e˜MÓ*×0Ð0¨bÓ1Ó2ÁÒF×NÐNÈ$ÐNùÓFs
   š$A¿Ac               ó   € V ^8„  d   QhRR/# )r   r   zlist[str] | Noner   )r   s   "r   r   r   2  s   € ÷ Oñ OÐ!1ñ Or   c                 ór   € \        \        R4      4       U Uu. uF  w  rV NK	  	  upp ;'       g    R# u upp i )z2Nous Portal's curated model ids from the manifest.ÚnousN)rÍ   rÉ   )rÌ   Ú_s     r   Úget_curated_nous_modelsrØ   2  s1   € ä(Ô)<¸VÓ)DÔEÔFÑE‘F�C‹CÑEÒF×NÐNÈ$ÐNùÓFs   ˜3c               ó    € V ^8„  d   QhRRRR/# )r   rÅ   r
   r   ú
str | Noner   )r   s   "r   r   r   7  s   € ÷ Qñ QÐ%:ð Q¸zñ Qr   c                ó:   € \        R \        V 4       4       R4      # )z;Id of the model entry labeled ``"default": true``, or None.c              3  ó\   "  € T F"  w  rVP                  R 4      '       g   K  Vx € K$  	  R# 5i)ÚdefaultN)r%   )r^   rÌ   r_   s   &  r   r`   Ú,_default_model_from_block.<locals>.<genexpr>9  s!   é € ÐIÑ#4™˜¸¿¹¸i×8H—’Ó#4ùs   ‚,¢
,N)ÚnextrÍ   )rÅ   s   &r   Ú_default_model_from_blockrà   7  s   € äÑI¤:¨eÔ#4ÓIÈ4ÓPÐPr   c               ó    € V ^8„  d   QhRRRR/# )r   r½   r   r   rÚ   r   )r   s   "r   r   r   <  s   € ÷ hñ h¨3ð h°:ñ hr   c                óª   € \        4       pVe   \        \        W4      4      MRpV'       d   V# \        4       w  r4Ve   \        \        W04      4      # R# )u§   The manifest's labeled default for ``provider`` (the model Hermes silently lands on when the
user never picked one) â€” in-process then disk cache only, never a fetch.N)r¡   rà   rÆ   rv   )r½   r­   Úfoundr©   Ú_mtimes   &    r   Úget_default_model_from_cacherå   <  sS   € ô !Ó"€FØFLÒFXÔ%¤i°Ó&AÔBÐ^b€EßØˆÜ(Ó*Ñ€IØHQÒH]Ô$¤Y¨yÓ%CÓDÐgÐcgÐgr   c               ó    € V ^8„  d   QhRRRR/# )r   Úproject_rootz
Path | strr   r+   r   )r   s   "r   r   r   G  s   € ÷ ñ ¨:ð ¸$ñ r   c                óÞ  € \        V 4      R,          R,          R,          R,          p \        VRR7      ;_uu_ 4       p\        P                  ! V4      pRRR4       \        X4      '       g   \        P                  R
T4       R	# \        T4       \        4        R#   + '       g   i     LP; i  \        \        P
                  3 d"   p\        P                  RY4        Rp?R	# Rp?ii ; i)a	  Overwrite the disk cache with the checkout's ``website/static/api/model-catalog.json``.
After ``hermes update`` that file IS the newest catalog, so the picker stays current even when
the remote fetch is bot-gated. Validated, then written via the same atomic writer.ÚwebsiteÚstaticÚapizmodel-catalog.jsonrk   rl   Nz1model catalog seed from checkout skipped (%s): %sFz@model catalog seed from checkout skipped: invalid manifest at %sT)r   rq   rA   rr   rI   rH   rJ   r…   rL   rz   Úreset_cache)rç   Úsrcru   rO   rP   s   &    r   Úseed_cache_from_checkoutrî   G  s®   € ô ˆ|Ó
˜yÕ
(¨8Õ
3°eÕ
;Ð>RÕ
R€CðÜ�# ×,Õ,°Ü—9’9˜R“=ˆD÷ -ô
 ˜d×#Ò#Ü�‰ÐWÐY\Ô]ÙÜ�dÔÜ„MÙ÷ -×,ûä”T×)Ñ)Ð*ô Ü�‰ÐHÈ#ÔSÝûðús4   ©B0 ¾BÁB0 ÂB-	Â(B0 Â-B0 Â0C,ÃC'Ã'C,c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r   Z  s   € ÷ $ñ $�Tñ $r   c                 ó   € Rs RsRsR# )zIClear the in-process cache. Used by tests and ``hermes model --refresh``.Nr   r   )r   r   r   r   r   r   rì   rì   Z  s   € ð €NØ"%ÐØ!#Òr   )zfhttps://raw.githubusercontent.com/NousResearch/hermes-agent/main/website/static/api/model-catalog.json)>Ú__conditional_annotations__Ú__doc__Ú
__future__r   r–   rA   Úloggingr˜   r§   Úurllib.errorr<   Úurllib.requestÚpathlibr   Útypingr   Úhermes_cli.version_infor   Úutilsr   Ú	getLoggerÚ__name__rJ   r,   r   Ú__annotations__r(   ÚDEFAULT_TTL_HOURSr„   rc   Úbase_versionr?   r   r   r   r/   r6   rQ   rV   rL   rv   rz   ÚLockr†   Úsetr{   r›   rž   r¡   r°   r³   rº   rÁ   rÆ   rÉ   rÍ   rÓ   rØ   rà   rå   rî   rì   )rñ   s   @r   Ú<module>r     s`  øðôõ #ã Û Û Û Û Û Û Ý Ý å 4Ý #à	×	Ò	˜8Ó	$€ð Hð ð2Ð ˜ó ð Ð à'¨$Õ.Ð ØÐ ØÐ à"Ñ#3Ó#5×#BÑ#BÐ"CÐDÐ ð
 )-€Ð%Ó ,Ø%(Ð ˜UÓ (Ø"$Ð ˜CÓ $õ]õB>õð& He÷õ$õ*FõAð —N’NÓ$Ð Ù"%£%Ð �xÓ 'õjõ2õð¨÷ õDCõ
õ"Hõ6õ
iõ
iõOõOõ
Qõ
hõ÷&$r   