§
    ‰eîiáá  ã                  ó:  — U d Z ddlmZ ddlZddlZddlmZ ddlmZm	Z	m
Z
 ddlmZmZmZmZmZ ddlmZ ddlmZmZmZmZmZ  ej        e¦  «        Zd	Z ej        d
ej        ¦  «        Zdpd„Z dqd„Z! G d„ de	¦  «        Z"i d e"dd¦  «        “d e"dd¦  «        “d e"dd¦  «        “d e"dd¦  «        “d e"dd¦  «        “d e"dd¦  «        “d e"dd¦  «        “d  e"dd ¦  «        “d! e"dd!¦  «        “d" e"d#d"¦  «        “d$ e"d$d%¦  «        “d& e"d'd&¦  «        “d( e"d)d(¦  «        “d* e"d*d*¦  «        “d+ e"d+d+¦  «        “d, e"d-d,¦  «        “d. e"d/d.¦  «        “ e"d0d1¦  «         e"d2d3¦  «         e"d4d5¦  «         e"d6d7¦  «        d8œ¥Z#d9e$d:<    G d;„ d<e	¦  «        Z%i Z&d=e$d><   i a'd=e$d?<   drd@„Z(dsdB„Z)e G dC„ dD¦  «        ¦   «         Z*e G dE„ dF¦  «        ¦   «         Z+dtdI„Z,dudM„Z-dvdQ„Z.	 	 	 dwdxdX„Z/	 dydzd[„Z0	 	 	 	 d{d|dc„Z1	 	 	 	 	 	 d}d~dj„Z2	 	 	 	 	 dd€do„Z3dS )�u  Shared model-switching logic for CLI and gateway /model commands.

Both the CLI (cli.py) and gateway (gateway/run.py) /model handlers
share the same core pipeline:

  parse flags -> alias resolution -> provider resolution ->
  credential resolution -> normalize model name ->
  metadata lookup -> build result

This module ties together the foundation layers:

- ``agent.models_dev``            -- models.dev catalog, ModelInfo, ProviderInfo
- ``hermes_cli.providers``        -- canonical provider identity + overlays
- ``hermes_cli.model_normalize``  -- per-provider name formatting

Provider switching uses the ``--provider`` flag exclusively.
No colon-based ``provider:model`` syntax â€” colons are reserved for
OpenRouter variant suffixes (``:free``, ``:extended``, ``:fast``).
é    )ÚannotationsN)Ú	dataclass)ÚListÚ
NamedTupleÚOptional)Úcustom_provider_slugÚdetermine_api_modeÚ	get_labelÚis_aggregatorÚresolve_provider_full)Únormalize_model_for_provider)ÚModelCapabilitiesÚ	ModelInfoÚget_model_capabilitiesÚget_model_infoÚlist_provider_modelszöNous Research Hermes 3 & 4 models are NOT agentic and are not designed for use with Hermes Agent. They lack the tool-calling capabilities required for agent workflows. Consider using an agentic model instead (Claude, GPT, Gemini, DeepSeek, etc.).z&(?:^|[/:])hermes[-_ ]?[34](?:[-_.:]|$)Ú
model_nameÚstrÚreturnÚboolc                óX   — | sdS t          t                               | ¦  «        ¦  «        S )zþReturn True if *model_name* is a real Nous Hermes 3/4 chat model.

    Used to decide whether to surface the non-agentic warning at startup.
    Callers in :mod:`cli.py` and here should go through this single helper
    so the two sites don't drift.
    F)r   Ú_NOUS_HERMES_NON_AGENTIC_REÚsearch©r   s    ú9/home/div/.hermes/hermes-agent/hermes_cli/model_switch.pyÚis_nous_hermes_non_agenticr   K   s.   € ð ð ØˆuÝÕ+×2Ò2°:Ñ>Ô>Ñ?Ô?Ð?ó    c                ó2   — t          | ¦  «        rt          S dS )zHReturn a warning string if *model_name* is a Nous Hermes 3/4 chat model.Ú )r   Ú_HERMES_MODEL_WARNINGr   s    r   Ú_check_hermes_model_warningr!   W   s   € å! *Ñ-Ô-ð %Ý$Ð$Øˆ2r   c                  ó(   — e Zd ZU dZded<   ded<   dS )ÚModelIdentityz:Vendor slug and family prefix used for catalog resolution.r   ÚvendorÚfamilyN©Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__© r   r   r#   r#   c   s(   € € € € € € ØDÐDØ€K€K�KØ€K€K�K€K€Kr   r#   ÚsonnetÚ	anthropiczclaude-sonnetÚopuszclaude-opusÚhaikuzclaude-haikuÚclaudeÚgpt5Úopenaizgpt-5ÚgptÚcodexÚo3Úo4ÚgeminiÚgoogleÚdeepseekzdeepseek-chatÚgrokzx-aiÚllamaz
meta-llamaÚqwenÚminimaxÚnemotronÚnvidiaÚkimiÚ
moonshotaizz-aiÚglmÚstepfunÚstepÚxiaomiÚmimozarcee-aiÚtrinity)rC   rE   rG   rH   zdict[str, ModelIdentity]ÚMODEL_ALIASESc                  ó2   — e Zd ZU dZded<   ded<   ded<   dS )ÚDirectAliasz5Exact model mapping that bypasses catalog resolution.r   ÚmodelÚproviderÚbase_urlNr&   r,   r   r   rK   rK   ¥   s1   € € € € € € Ø?Ð?Ø€J€J�JØ€M€M�MØ€M€M�M€M€Mr   rK   údict[str, DirectAlias]Ú_BUILTIN_DIRECT_ALIASESÚDIRECT_ALIASESc                 ó   — t          t          ¦  «        } 	 ddlm}  |¦   «         }|                     d¦  «        }t          |t           ¦  «        r­|                     ¦   «         D ]˜\  }}t          |t           ¦  «        sŒ|                     dd¦  «        }|                     dd¦  «        }|                     dd¦  «        }|r9t          |||¬	¦  «        | |                     ¦   «          	                    ¦   «         <   Œ™n# t          $ r Y nw xY w| S )
ao  Load direct aliases from config.yaml ``model_aliases:`` section.

    Config format::

        model_aliases:
          qwen:
            model: "qwen3.5:397b"
            provider: custom
            base_url: "https://ollama.com/v1"
          minimax:
            model: "minimax-m2.7"
            provider: custom
            base_url: "https://ollama.com/v1"
    r   )Úload_configÚmodel_aliasesrL   r   rM   ÚcustomrN   )rL   rM   rN   )ÚdictrP   Úhermes_cli.configrS   ÚgetÚ
isinstanceÚitemsrK   ÚstripÚlowerÚ	Exception)	ÚmergedrS   ÚcfgÚuser_aliasesÚnameÚentryrL   rM   rN   s	            r   Ú_load_direct_aliasesrc   ³   s)  € õ Õ)Ñ*Ô*€FðØ1Ð1Ð1Ð1Ð1Ð1Øˆk‰mŒmˆØ—w’w˜Ñ/Ô/ˆÝ�l¥DÑ)Ô)ð 
	Ø+×1Ò1Ñ3Ô3ð 	ð 	‘��eÝ! %­Ñ.Ô.ð ØØŸ	š	 '¨2Ñ.Ô.�Ø Ÿ9š9 Z°Ñ:Ô:�Ø Ÿ9š9 Z°Ñ4Ô4�Øð Ý3>Ø#¨hÀð4ñ 4ô 4�F˜4Ÿ:š:™<œ<×-Ò-Ñ/Ô/Ñ0øøøõ ð ð ð Øˆðøøøà€Ms   –C'C> Ã>
DÄ
DÚNonec                 ó4   — t           st          ¦   «         a dS dS )z&Lazy-load direct aliases on first use.N)rQ   rc   r,   r   r   Ú_ensure_direct_aliasesrf   ×   s%   € õ ð 0Ý-Ñ/Ô/ˆˆˆð0ð 0r   c                  óÔ   — e Zd ZU dZded<   dZded<   dZded<   dZded	<   dZded
<   dZ	ded<   dZ
ded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dS )ÚModelSwitchResultz!Result of a model switch attempt.r   Úsuccessr   r   Ú	new_modelÚtarget_providerFÚprovider_changedÚapi_keyrN   Úapi_modeÚerror_messageÚwarning_messageÚprovider_labelÚresolved_via_aliasNzOptional[ModelCapabilities]ÚcapabilitiesúOptional[ModelInfo]Ú
model_infoÚ	is_global)r'   r(   r)   r*   r+   rj   rk   rl   rm   rN   rn   ro   rp   rq   rr   rs   ru   rv   r,   r   r   rh   rh   â   s   € € € € € € à+Ð+à€M€M�MØ€IÐÐÐÑØ€OÐÐÐÑØ"ÐÐ"Ð"Ð"Ñ"Ø€GÐÐÐÑØ€HÐÐÐÑØ€HÐÐÐÑØ€MÐÐÐÑØ€OÐÐÐÑØ€NÐÐÐÑØ ÐÐ Ð Ð Ñ Ø04€LÐ4Ð4Ð4Ñ4Ø&*€JÐ*Ð*Ð*Ñ*Ø€IÐÐÐÑÐÐr   rh   c                  óV   — e Zd ZU dZded<   dZded<   dZded<   dZded<   dZded	<   d
S )ÚCustomAutoResultz?Result of switching to bare 'custom' provider with auto-detect.r   ri   r   r   rL   rN   rm   ro   N)	r'   r(   r)   r*   r+   rL   rN   rm   ro   r,   r   r   rx   rx   ö   sa   € € € € € € àIÐIà€M€M�MØ€E€O€O€O�OØ€HÐÐÐÑØ€GÐÐÐÑØ€MÐÐÐÑÐÐr   rx   Úraw_argsútuple[str, str, bool]c                ó  — d}d}ddl }|                     dd| ¦  «        } d| v r*d}|                      dd¦  «                             ¦   «         } |                      ¦   «         }d}g }|t          |¦  «        k     rf||         d	k    r'|d
z   t          |¦  «        k     r||d
z            }|dz  }n |                     ||         ¦  «         |d
z  }|t          |¦  «        k     °fd                     |¦  «                             ¦   «         }|||fS )að  Parse --provider and --global flags from /model command args.

    Returns (model_input, explicit_provider, is_global).

    Examples::

        "sonnet"                         -> ("sonnet", "", False)
        "sonnet --global"                -> ("sonnet", "", True)
        "sonnet --provider anthropic"    -> ("sonnet", "anthropic", False)
        "--provider my-ollama"           -> ("", "my-ollama", False)
        "sonnet --provider anthropic --global" -> ("sonnet", "anthropic", True)
    Fr   r   Nz+[\u2012\u2013\u2014\u2015](provider|global)z--\1z--globalTz
--provideré   é   Ú )ÚreÚsubÚreplacer[   ÚsplitÚlenÚappendÚjoin)ry   rv   Úexplicit_providerÚ_reÚpartsÚiÚfilteredÚmodel_inputs           r   Úparse_model_flagsrŒ     s*  € ð €IØÐð ÐÐÐØ�wŠwÐEÀwÐPXÑYÔY€Hð �XÐÐØˆ	Ø×#Ò# J°Ñ3Ô3×9Ò9Ñ;Ô;ˆð �NŠNÑÔ€EØ	€AØ€HØ
�c�%‰jŒjŠ.ˆ.Ø�Œ8�|Ò#Ð#¨¨A©µ°E±
´
Ò(:Ð(:Ø % a¨!¡e¤ÐØ�‰FˆAˆAà�OŠO˜E !œHÑ%Ô%Ð%Ø�‰FˆAð �c�%‰jŒjŠ.ˆ.ð —(’(˜8Ñ$Ô$×*Ò*Ñ,Ô,€KØÐ*¨IÐ6Ð6r   Úmodel_idÚprefixÚtuplec                óœ  — | t          |¦  «        d…         }|                     d¦  «        r
|dd…         }|                     d¦  «                             ¦   «         }g }d}d}d}|D �]�}|dk    r0|dv rd}Œ|                     ¦   «         rd}||z  }Œ,|d	v rŒ1d
}||z  }Œ9|dk    �r|                     ¦   «         r||z  }ŒZ|dk    rTd|v rJ	 |                     t          |                     d¦  «        ¦  «        ¦  «         n# t          $ r Y nw xY wd}Œ®||z  }Œ´|d	v rO|rI	 |                     t          |                     d¦  «        ¦  «        ¦  «         n# t          $ r Y nw xY wd}d}�Œ|rI	 |                     t          |                     d¦  «        ¦  «        ¦  «         n# t          $ r Y nw xY wd}d
}||z  }�Œ[|dk    r1|                     ¦   «         rd}|}�Œ{|dv rd}�Œƒ|d	v r�Œ‰d
}||z  }�Œ’|d
k    r||z  }�ŒŸ|rM|dk    rG	 |                     t          |                     d¦  «        ¦  «        ¦  «         n# t          $ r Y nw xY w| 	                    ¦   «                              d	¦  «        }|                     ¦   «         }t          d„ |D ¦   «         ¦  «        }	dddddœ}
|
                     |d¦  «        }|	||fz   S )uS  Sort key for model version preference.

    Extracts version numbers after the family prefix and returns a sort key
    that prefers higher versions.  Suffix tokens (``pro``, ``omni``, etc.)
    are used as tiebreakers, with common quality indicators ranked.

    Examples (with prefix ``"mimo"``)::

        mimo-v2.5-pro   â†’ (-2.5, 0, 'pro')     # highest version wins
        mimo-v2.5       â†’ (-2.5, 1, '')          # no suffix = lower than pro
        mimo-v2-pro     â†’ (-2.0, 0, 'pro')
        mimo-v2-omni    â†’ (-2.0, 1, 'omni')
        mimo-v2-flash   â†’ (-2.0, 1, 'flash')
    Nú/r|   Ú-r   ÚstartÚvVÚ
in_versionz-_.Ú	in_suffixú.Úbetweenc              3  ó   K  — | ]}| V — Œd S ©Nr,   )Ú.0Úns     r   ú	<genexpr>z"_model_sort_key.<locals>.<genexpr>”  s$   è è € Ð)Ð)˜q˜˜Ð)Ð)Ð)Ð)Ð)Ð)r   r   )ÚproÚmaxÚplusÚturbo)rƒ   Ú
startswithÚlstripr[   Úisdigitr„   ÚfloatÚrstripÚ
ValueErrorr\   r�   rX   )r�   rŽ   ÚrestÚnumsÚ
suffix_bufÚstateÚnum_bufÚchÚsuffixÚversion_keyÚ_SUFFIX_RANKÚsuffix_ranks               r   Ú_model_sort_keyr²   3  s’  € ð  •C˜‘K”K�L�LÔ!€DØ‡‚�sÑÔð Ø�A�B�BŒxˆØ�;Š;�sÑÔ×!Ò!Ñ#Ô#€Dð €DØ€JØ€EØ€Gàð 6ñ 6ˆØ�GÒÐØ�TˆzˆzØ$��Ø—’‘”ð !Ø$�Ø˜2‘��Ø�u��Øà#�Ø˜bÑ �
�
Ø�lÒ"Ñ"Ø�zŠz‰|Œ|ð !Ø˜2‘��Ø�s’�Ø˜'�>�>ðØŸš¥E¨'¯.ª.¸Ñ*=Ô*=Ñ$>Ô$>Ñ?Ô?Ð?Ð?øÝ%ð ð ð Ø˜ðøøøà �G�Gà˜r‘M�G�GØ�u��Øð !ðØŸš¥E¨'¯.ª.¸Ñ*=Ô*=Ñ$>Ô$>Ñ?Ô?Ð?Ð?øÝ%ð ð ð Ø˜ðøøøà �GØ!�‘àð !ðØŸš¥E¨'¯.ª.¸Ñ*=Ô*=Ñ$>Ô$>Ñ?Ô?Ð?Ð?øÝ%ð ð ð Ø˜ðøøøà �GØ#�Ø˜bÑ �
‘
Ø�iÒÐØ�zŠz‰|Œ|ð 	!Ø$�Ø�‘Ø�t��Ø$�‘Ø�u��Ùà#�Ø˜bÑ �
‘
Ø�kÒ!Ð!Ø˜"ÑˆJùð ð �5˜LÒ(Ð(ð	Ø�KŠK�˜gŸnšn¨SÑ1Ô1Ñ2Ô2Ñ3Ô3Ð3Ð3øÝð 	ð 	ð 	ØˆDð	øøøð ×ÒÑÔ×%Ò% eÑ,Ô,€FØ�\Š\‰^Œ^€Fõ Ð)Ð) DÐ)Ñ)Ô)Ñ)Ô)€Kð  Q°¸AÐ>Ð>€LØ×"Ò" 6¨1Ñ-Ô-€Kà˜+ vÐ.Ñ.Ð.sH   Ã5DÄ
DÄDÄ#5EÅ
E&Å%E&Å25F(Æ(
F5Æ4F5È5I É
IÉIÚ	raw_inputÚcurrent_providerúOptional[tuple[str, str, str]]c                ó¸  ‡‡‡— |                       ¦   «                              ¦   «         }t          ¦   «          t                               |¦  «        }|�|j        |j        |fS t                               ¦   «         D ]3\  }}|j                             ¦   «         |k    r|j        |j        |fc S Œ4t                               |¦  «        }|€dS |\  }}t          |¦  «        }		 ddl
m}
 |
                     |g ¦  «        }|r<d„ |	D ¦   «         }|D ]-}|                     ¦   «         |vr|	                     |¦  «         Œ.n# t          $ r Y nw xY wt          |¦  «        }|r(|› d|› �                     ¦   «         Šˆfd„|	D ¦   «         }n"|                     ¦   «         Šˆfd„|	D ¦   «         }|sdS |r|› d|› �n|Š|                     ˆfd„¬	¦  «         ||d         |fS )
a  Resolve a short alias against the current provider's catalog.

    Looks up *raw_input* in :data:`MODEL_ALIASES`, then searches the
    current provider's models.dev catalog for the model whose ID starts
    with ``vendor/family`` (or just ``family`` for non-aggregator
    providers) and has the **highest version**.

    Returns:
        ``(provider, resolved_model_id, alias_name)`` if a match is
        found on the current provider, or ``None`` if the alias doesn't
        exist or no matching model is available.
    Nr   )Ú_PROVIDER_MODELSc                ó6   — h | ]}|                      ¦   «         ’ŒS r,   )r\   )r›   Úms     r   ú	<setcomp>z resolve_alias.<locals>.<setcomp>Ë  s    € Ð/Ð/Ð/ !�A—G’G‘I”IÐ/Ð/Ð/r   r‘   c                ób   •— g | ]+}|                      ¦   «                              ‰¦  «        ¯)|‘Œ,S r,   ©r\   r¢   )r›   ÚmidrŽ   s     €r   ú
<listcomp>z!resolve_alias.<locals>.<listcomp>×  sE   ø€ ð 
ð 
ð 
ØØ�yŠy‰{Œ{×%Ò% fÑ-Ô-ð
Øð
ð 
ð 
r   c                ób   •— g | ]+}|                      ¦   «                              ‰¦  «        ¯)|‘Œ,S r,   r¼   )r›   r½   Úfamily_lowers     €r   r¾   z!resolve_alias.<locals>.<listcomp>Ý  sE   ø€ ð 
ð 
ð 
ØØ�yŠy‰{Œ{×%Ò% lÑ3Ô3ð
Øð
ð 
ð 
r   c                ó$   •— t          | ‰¦  «        S rš   )r²   )r¹   Úprefix_for_sorts    €r   ú<lambda>zresolve_alias.<locals>.<lambda>ç  s   ø€ �¨q°/ÑBÔB€ r   ©Úkey)r[   r\   rf   rQ   rX   rM   rL   rZ   rI   r   Úhermes_cli.modelsr·   r„   r]   r   Úsort)r³   r´   rÅ   ÚdirectÚ
alias_nameÚdaÚidentityr$   r%   Úcatalogr·   ÚstaticÚseenr¹   Ú
aggregatorÚmatchesrÀ   rŽ   rÂ   s                   @@@r   Úresolve_aliasrÑ   ž  sz  øøø€ ð  �/Š/Ñ
Ô
×
!Ò
!Ñ
#Ô
#€Cõ ÑÔÐÝ×Ò Ñ$Ô$€FØÐØ” ¤¨sÐ3Ð3õ
 )×.Ò.Ñ0Ô0ð 7ð 7‰ˆ
�BØŒ8�>Š>ÑÔ˜sÒ"Ð"Ø”K ¤¨:Ð6Ð6Ð6Ð6ð #õ × Ò  Ñ%Ô%€HØÐØˆtà�N€FˆFõ
 #Ð#3Ñ4Ô4€Gð	Ø6Ð6Ð6Ð6Ð6Ð6Ø!×%Ò%Ð&6¸Ñ;Ô;ˆØð 	&Ø/Ð/ wÐ/Ñ/Ô/ˆDØð &ð &�Ø—7’7‘9”9 DÐ(Ð(Ø—N’N 1Ñ%Ô%Ð%øøøÝð ð ð Øˆðøøøõ Ð/Ñ0Ô0€Jàð 
ØÐ%Ð%˜VÐ%Ð%×+Ò+Ñ-Ô-ˆð
ð 
ð 
ð 
Ø"ð
ñ 
ô 
ˆˆð
 —|’|‘~”~ˆð
ð 
ð 
ð 
Ø"ð
ñ 
ô 
ˆð
 ð Øˆtð /9ÐD˜Ð*Ð* &Ð*Ð*Ð*¸f€OØ‡L‚LÐBÐBÐBÐB€LÑCÔCÐCØ˜g aœj¨#Ð.Ð.s   Ã#AD> Ä>
EÅ
Er   Úuser_providersrV   Úcustom_providersúlist | Noneú	list[str]c                óf   — 	 t          | ||d¬¦  «        }d„ |D ¦   «         S # t          $ r g cY S w xY w)u¾   Return slugs of providers that have credentials.

    Uses ``list_authenticated_providers()`` which is backed by the models.dev
    in-memory cache (1 hr TTL) â€” no extra network cost.
    r   )r´   rÒ   rÓ   Ú
max_modelsc                ó   — g | ]
}|d          ‘ŒS )Úslugr,   )r›   Úps     r   r¾   z4get_authenticated_provider_slugs.<locals>.<listcomp>ü  s   € Ð-Ð-Ð-˜a��&”	Ð-Ð-Ð-r   )Úlist_authenticated_providersr]   )r´   rÒ   rÓ   Ú	providerss       r   Ú get_authenticated_provider_slugsrÝ   ë  sa   € ð	Ý0Ø-Ø)Ø-Øð	
ñ 
ô 
ˆ	ð .Ð- 9Ð-Ñ-Ô-Ð-øÝð ð ð Øˆ	ˆ	ˆ	ðøøøs   ‚! ¡0¯0r,   Úauthenticated_providersc                óD   — |pd}|D ]}t          | |¦  «        }|�|c S ŒdS )z×Try to resolve an alias on the user's authenticated providers.

    Falls back to ``("openrouter", "nous")`` only when no authenticated
    providers are supplied (backwards compat for non-interactive callers).
    )Ú
openrouterÚnousN)rÑ   )r³   rÞ   rÜ   rM   Úresults        r   Ú_resolve_alias_fallbackrã     sF   € ð (ÐAÐ+A€IØð ð ˆÝ˜y¨(Ñ3Ô3ˆØÐØˆMˆMˆMð àˆ4r   rL   rM   rN   rm   ru   rt   úOptional[int]c                ó¾   — 	 ddl m}  || |pd|pd|pd|¬¦  «        }|rt          |¦  «        S n# t          $ r Y nw xY w|�|j        rt          |j        ¦  «        S dS )u	  Resolve the context length to show in /model output.

    models.dev reports per-vendor context (e.g. gpt-5.5 = 1.05M on openai)
    but provider-enforced limits can be lower (e.g. Codex OAuth caps the
    same slug at 272k). The authoritative source is
    ``agent.model_metadata.get_model_context_length`` which already knows
    about Codex OAuth, Copilot, Nous, and falls back to models.dev for the
    rest.

    When ``custom_providers`` is provided, per-model ``context_length``
    overrides from ``custom_providers[].models.<id>.context_length`` are
    honored â€” this closes #15779 where ``/model`` switch ignored user-set
    overrides.

    Prefer the provider-aware value; fall back to ``model_info.context_window``
    only if the resolver returns nothing.
    r   )Úget_model_context_lengthr   N)rN   rm   rM   rÓ   )Úagent.model_metadataræ   Úintr]   Úcontext_window)rL   rM   rN   rm   ru   rÓ   ræ   Úctxs           r   Úresolve_display_context_lengthrë     sª   € ð2ØAÐAÐAÐAÐAÐAØ&Ð&ØØ�^ Ø�M˜rØÐ% Ø-ð
ñ 
ô 
ˆð ð 	Ý�s‘8”8ˆOð	øåð ð ð ØˆðøøøàÐ *Ô";ÐÝ�:Ô,Ñ-Ô-Ð-Øˆ4s   ‚,0 °
=¼=FÚcurrent_modelÚcurrent_base_urlÚcurrent_api_keyrv   r†   c	                ó’  ‡8— ddl m}	m}
m}m} ddlm} d}|                      ¦   «         Š8|}|�rt          |||¦  «        }|€[d|› d�}	 ddl	m
}  |¦   «         }|r|d	z  }|dd
…         D ]}|d|j        › �z  }Œn# t          $ r Y nw xY wt          d||¬¦  «        S |j        }‰8sr|j        rGddlm}  ||j        ¦  «        }|r|Š8nPt          d||j        |d|j        › d|j        › d|› �¬¦  «        S t          d||j        |d|j        › d|› �¬¦  «        S t%          ‰8|¦  «        }|�|\  }Š8}�nEt%          | |¦  «        }|�%|\  }Š8}t&                               d|‰8|¦  «         �nL|                      ¦   «                              ¦   «         }|t,          v r{t/          |||¬¦  «        }t1          | |¦  «        }|�$|\  }Š8}t&                               d|‰8|¦  «         nÕt,          |         }t          d|d|› d|j        › d|j        › d�¬¦  «        S |                      d¦  «        }|dk    r‡d| vrƒt9          |¦  «        rt| d|…                              ¦   «                              ¦   «         }| |dz   d…                              ¦   «         }|r%|r#|› d|› �Š8t&                               d| ‰8¦  «         t9          |¦  «        r†|s„t;          |¦  «        } | rs‰8                     ¦   «         }!| D ]}"|"                     ¦   «         |!k    r|"Š8 n?Œ| D ];}"d|"v r5|"                     dd¦  «        \  }}#|#                     ¦   «         |!k    r|"Š8 nŒ<|pd}$|dv pd |$v pd!|$v }%||k    r|%s|s |
‰8|¦  «        }|r|\  }Š8||k    }&t?          |¦  «        }'|                      d"¦  «        rt          |||¦  «        }(|(�|(j        }'|})|}*d}+|&s|r‚	  ||‰8¬#¦  «        },|, !                    d$d¦  «        })|, !                    d%d¦  «        }*|, !                    d&d¦  «        }+n«# t          $ r$}-t          d||'|d'|'› d(|-› �¬¦  «        cY d}-~-S d}-~-ww xY w	  ||‰8¬#¦  «        },|, !                    d)¦  «        d*k    rB|, !                    d$d¦  «        })|, !                    d%d¦  «        }*|, !                    d&d¦  «        }+n# t          $ r Y nw xY w|r>tE          ¦   «          tF           !                    |¦  «        }.|.�|.j        r|.j        }*d}+|)sd+})tI          ‰8|¦  «        Š8	  |‰8||)|*|+pd¬,¦  «        }/n$# t          $ r}-dddd-‰8› d.|-› �d/œ}/Y d}-~-nd}-~-ww xY w|/ !                    d0¦  «        s¹d}0|rl|D ]i}1tK          |1tL          ¦  «        rR|1 !                    d)¦  «        |k    r9|1 !                    d1g ¦  «        }2‰8|2v stO          ˆ8fd2„|2D ¦   «         ¦  «        rd3}0 nŒj|0rd3d3d|/ !                    d4d¦  «        d/œ}/n+|/ !                    d4d5¦  «        }3t          d‰8||'||3¬6¦  «        S |/ !                    d7¦  «        r|/d7         Š8|d8v r |	‰8|)¬9¦  «        }+|d:v r ||‰8¦  «        }+|+stQ          ||*¦  «        }+|+d;k    r1|d<v r-tK          |*tR          ¦  «        r|*rtU          j+        d=d|*¦  «        }*tY          |‰8¦  «        }4t[          |‰8¦  «        }5g }6|/ !                    d4¦  «        r|6 .                    |/d4         ¦  «         t_          ‰8¦  «        }7|7r|6 .                    |7¦  «         t          d3‰8||&|)|*|+|6rd> 0                    |6¦  «        nd|'||4|5|¬?¦  «        S )@a²  Core model-switching pipeline shared between CLI and gateway.

    Resolution chain:

      If --provider given:
        a. Resolve provider via resolve_provider_full()
        b. Resolve credentials
        c. If model given, resolve alias on target provider or use as-is
        d. If no model, auto-detect from endpoint

      If no --provider:
        a. Try alias resolution on current provider
        b. If alias exists but not on current provider -> fallback
        c. On aggregator, try vendor/model slug conversion
        d. Aggregator catalog search
        e. detect_provider_for_model() as last resort
        f. Resolve credentials
        g. Normalize model name for target provider

      Finally:
        h. Get full model metadata from models.dev
        i. Build result

    Args:
        raw_input: The model name (after flag parsing).
        current_provider: The currently active provider.
        current_model: The currently active model name.
        current_base_url: The currently active base URL.
        current_api_key: The currently active API key.
        is_global: Whether to persist the switch.
        explicit_provider: From --provider flag (empty = no explicit provider).
        user_providers: The ``providers:`` dict from config.yaml (for user endpoints).
        custom_providers: The ``custom_providers:`` list from config.yaml.

    Returns:
        ModelSwitchResult with all information the caller needs.
    r   )Úcopilot_model_api_modeÚdetect_provider_for_modelÚvalidate_requested_modelÚopencode_model_api_mode)Úresolve_runtime_providerr   NzUnknown provider 'z`'. Check 'hermes model' for available providers, or define it in config.yaml under 'providers:'.)Úvalidate_config_structureu1   

Run 'hermes doctor' â€” config issues detected:é   u   
  â€¢ F)ri   rv   ro   )Ú_auto_detect_local_modelzNo model detected on z (z@). Specify the model explicitly: /model <model-name> --provider )ri   rk   rq   rv   ro   z
Provider 'zN' has no base URL configured. Specify a model: /model <model-name> --provider zAlias '%s' resolved to %s on %s)r´   rÒ   rÓ   z,Alias '%s' resolved via fallback to %s on %szAlias 'z
' maps to r‘   z] but no matching model was found in any provider catalog. Try specifying the full model name.ú:r|   z3Converted vendor:model '%s' to aggregator slug '%s')rU   ÚlocalÚ	localhostz	127.0.0.1zcustom:)Ú	requestedÚtarget_modelrm   rN   rn   z,Could not resolve credentials for provider 'z': rM   rU   zno-key-required)rm   rN   rn   zCould not validate `z`: )ÚacceptedÚpersistÚ
recognizedÚmessagerý   Úmodelsc              3  ót   •K  — | ]2}t          |t          ¦  «        ¯|                     d ¦  «        ‰k    V — Œ3dS )ra   N)rY   rV   rX   )r›   r¹   rj   s     €r   r�   zswitch_model.<locals>.<genexpr>z  sW   øè è € ð 6ð 6Ø78Í*ÐUVÕX\ÑJ]ÔJ]ð6ØŸš˜f™œ¨Ò2ð6ð 6ð 6ð 6ð 6ð 6r   Tr   zInvalid model)ri   rj   rk   rq   rv   ro   Úcorrected_model>   úgithub-copilotÚcopilot)rm   >   Úopencodeúopencode-goúopencode-zenÚanthropic_messages>   r  r  z/v1/?$z | )ri   rj   rk   rl   rm   rN   rn   rp   rq   rr   rs   ru   rv   )1rÆ   rð   rñ   rò   ró   Úhermes_cli.runtime_providerrô   r[   r   rW   rõ   r   r]   rh   ÚidrN   r÷   ra   rÑ   ÚloggerÚdebugr\   rI   rÝ   rã   r$   r%   Úfindr   r   r‚   r
   r¢   rX   rf   rQ   r   rY   rV   Úanyr	   r   r   r€   r   r   r„   r!   r…   )9r³   r´   rì   rí   rî   rv   r†   rÒ   rÓ   rð   rñ   rò   ró   rô   Úresolved_aliasrk   ÚpdefÚ_switch_errrõ   Ú_cfg_issuesÚ_cir÷   ÚdetectedÚalias_resultÚ_rÅ   ÚauthedÚfallback_resultrË   Ú	colon_posÚleftÚrightrÌ   Únew_model_lowerr½   ÚbareÚ_baseÚ	is_customrl   rq   Úcustom_pdefrm   rN   rn   ÚruntimeÚeÚ_daÚ
validationÚoverrideÚupÚ
cfg_modelsÚmsgrs   ru   ÚwarningsÚhermes_warnrj   s9                                                           @r   Úswitch_modelr,  A  s$  ø€ ð`ð ð ð ð ð ð ð ð ð ð ð ð EÐDÐDÐDÐDÐDà€NØ—’Ñ!Ô!€IØ&€Oð
 ñ Y6å$ØØØñ
ô 
ˆð
 ˆ<ð6Ð%6ð 6ð 6ð 6ð ðØGÐGÐGÐGÐGÐGØ7Ð7Ñ9Ô9�Øð @ØÐ#XÑX�KØ*¨2¨A¨2œð @ð @˜Ø#Ð'?°#´+Ð'?Ð'?Ñ?˜˜øøÝð ð ð Ø�ðøøøå$ØØ#Ø)ðñ ô ð ð œ'ˆð ð 	ØŒ}ð ØPÐPÐPÐPÐPÐPØ3Ð3°D´MÑBÔB�Øð Ø (�I�Iå,Ø %Ø(7Ø'+¤yØ"+ðp°D´Ið pð pÀÄð pð pØ\mðpð pð	ñ 	ô 	ð 	õ )Ø!Ø$3Ø#'¤9Ø'ð_ T¤Yð _ð _ØK\ð_ð _ð	ñ 	ô 	ð 	õ % Y°Ñ@Ô@ˆØÐ#Ø+7Ñ(ˆAˆy˜.ùõ % YÐ0@ÑAÔAˆàÐ#Ø9EÑ6ˆO˜Y¨Ý�LŠLØ1Ø 	¨?ñô ð ñ ð —/’/Ñ#Ô#×)Ò)Ñ+Ô+ˆCØ•mÐ#Ð#Ý9Ø%5Ø#1Ø%5ðñ ô �õ
 #:¸)ÀVÑ"LÔ"L�Ø"Ð.ØAPÑ>�O Y°Ý—L’LØFØ&¨	°?ñô ð ð õ
  -¨SÔ1�HÝ,Ø %Ø"+ðC cð Cð C°X´_ð Cð CÀxÄð Cð Cð Cð	ñ ô ð ð &ŸNšN¨3Ñ/Ô/�	Ø˜q’=�= S°	Ð%9Ð%9½mÐL\Ñ>]Ô>]Ð%9Ø$ Z i ZÔ0×6Ò6Ñ8Ô8×>Ò>Ñ@Ô@�DØ% i°!¡m n nÔ5×;Ò;Ñ=Ô=�EØð  ð à'+Ð$5Ð$5¨eÐ$5Ð$5˜	ÝŸšØQØ% yñô ð õ ˜Ñ)Ô)ð 	&°.ð 	&Ý*¨?Ñ;Ô;ˆGØð &Ø"+§/¢/Ñ"3Ô"3�Ø"ð 
&ð 
&�CØ—y’y‘{”{ oÒ5Ð5Ø$'˜	Ø˜ð 6ð  'ð &ð &˜Ø #˜:˜:Ø&)§i¢i°°QÑ&7Ô&7™G˜A˜tØ#Ÿzšz™|œ|¨Ò>Ð>Ø,/ 	Ø % øð !Ð& BˆØ$Ð(;Ð;ð 
Ø˜5Ð Ð8 K°5Ð$8ð 	ð
 Ð/Ò/Ð/Øð 0à"ð 0ð 1Ð0°Ð<LÑMÔMˆHØð 6Ø-5Ñ*� ð 'Ð*:Ò:ÐÝ˜Ñ/Ô/€NØ×!Ò! )Ñ,Ô,ð .Ý+ØØØñ
ô 
ˆð
 Ð"Ø(Ô-ˆNð €GØ€HØ€Hàð #Ð,ð #ð	Ø.Ð.Ø)Ø&ðñ ô ˆGð —k’k )¨RÑ0Ô0ˆGØ—{’{ :¨rÑ2Ô2ˆHØ—{’{ :¨rÑ2Ô2ˆHˆHøÝð 
	ð 
	ð 
	Ý$ØØ /Ø-Ø#ð/Ø&ð/ð /Ø+,ð/ð /ð	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøøð
	øøøð	Ø.Ð.Ø*Ø&ðñ ô ˆGð �{Š{˜:Ñ&Ô&¨(Ò2Ð2Ø!Ÿ+š+ i°Ñ4Ô4�Ø"Ÿ;š; z°2Ñ6Ô6�Ø"Ÿ;š; z°2Ñ6Ô6�øøÝð 	ð 	ð 	ØˆDð	øøøð ð ,ÝÑ Ô Ð Ý× Ò  Ñ0Ô0ˆØˆ?˜sœ|ˆ?Ø”|ˆHØˆHØð ,Ø+�õ -¨Y¸ÑHÔH€Ið
Ø-Ð-ØØØØØÐ% ð
ñ 
ô 
ˆ
ˆ
øõ ð 
ð 
ð 
àØØØ?¨iÐ?Ð?¸AÐ?Ð?ð	
ð 
ˆ
ˆ
ˆ
ˆ
ˆ
ˆ
øøøøð
øøøð �>Š>˜*Ñ%Ô%ð ØˆØð 	Ø$ð ð �Ý˜b¥$Ñ'Ô'ð ¨B¯FªF°:Ñ,>Ô,>À/Ò,QÐ,QØ!#§¢¨°"Ñ!5Ô!5�JØ  JÐ.Ð.µ#ð 6ð 6ð 6ð 6Ø<Fð6ñ 6ô 6ñ 3ô 3Ð.ð $(˜Ø˜øØð 	Ø&*°tÈ5Ð]g×]kÒ]kÐluÐwyÑ]zÔ]zÐ{Ð{ˆJˆJà—.’. ¨OÑ<Ô<ˆCÝ$ØØ#Ø /Ø-Ø#Ø!ðñ ô ð ð ‡~‚~Ð'Ñ(Ô(ð 2ØÐ0Ô1ˆ	ð Ð7Ð7Ð7Ø)Ð)¨)¸WÐEÑEÔEˆð ÐEÐEÐEØ*Ð*¨?¸IÑFÔFˆð ð AÝ% o°xÑ@Ô@ˆð 	Ð(Ò(Ð(ØÐ>Ð>Ð>Ý�x¥Ñ%Ô%ð ?àð ?õ ”6˜) R¨Ñ2Ô2ˆõ *¨/¸9ÑEÔE€Lõ   °Ñ;Ô;€Jð €HØ‡~‚~�iÑ Ô ð /Ø�Š˜
 9Ô-Ñ.Ô.Ð.Ý-¨iÑ8Ô8€KØð %Ø�Š˜Ñ$Ô$Ð$õ ØØØ'Ø)ØØØØ08Ð@˜Ÿ
š
 8Ñ,Ô,Ð,¸bØ%Ø)Ø!ØØðñ ô ð s\   Á	1A; Á;
BÂBÏAP Ð
QÐ P?Ð9QÐ?QÑA(R1 Ò1
R>Ò=R>ÔT% Ô%
UÔ/UÕUé   r×   rè   ú
List[dict]c                ó¬  ‡U— ddl ŠUddlm}m}m} ddlm} ddlm}	m	}
m
}m}m} g }t          ¦   «         }t          ¦   «         } |¦   «         }t          |
¦  «        }d„ |	D ¦   «         |d<   d|vr|d         |d<   d	|vrdd
lm}  |¦   «         |d	<   |                     ¦   «         D �]¼\  }}||v rŒ|                     |¦  «        }t%          |t          ¦  «        sŒ6|                     |¦  «        }|r|j        dk    rŒY|r|j        rt+          |j        ¦  «        }n,|                     dg ¦  «        }t%          |t*          ¦  «        sŒ£t-          ˆUfd„|D ¦   «         ¦  «        }|s>	 ddlm}  |¦   «         }|r||                     di ¦  «        v rd}n# t0          $ r Y nw xY w|s�Œ|                     |g ¦  «        }||v r |||¦  «        }t3          |¦  «        }|d|…         }|} ||¦  «        } | r| j        n|}!|                     ||!|| k    p|| k    d||ddœ¦  «         |                     |                     ¦   «         ¦  «         |                     |¦  «         �Œ¾ddlm}" ddlm}# d„ |                     ¦   «         D ¦   «         }$|"                     ¦   «         D �]!\  }%}&|%                     ¦   «         |v rŒ|$                     |%|%¦  «        }'|'                     ¦   «         |v rŒJd}|&j         r t-          ˆUfd„|&j         D ¦   «         ¦  «        }|sT|&j        dk    rI|%|'fD ]D}(|#                     |(¦  «        })|)r+|)j        r$t-          ˆUfd„|)j        D ¦   «         ¦  «        rd} nŒE|s…	 ddlm}  |¦   «         }|                     di ¦  «        }*|                     di ¦  «        }+|r|%|*v s|'|*v s|%|+v s|'|+v rd}n3# t0          $ r&},tB           "                    d|%|,¦  «         Y d},~,nd},~,ww xY w|s\	 ddl#m$}-  |-|'¦  «        }.|. %                    ¦   «         rd}n3# t0          $ r&},tB           "                    d|'|,¦  «         Y d},~,nd},~,ww xY w|s†|'dk    r€	 ddl&m'}/m(}0  |0¦   «         }1 |/¦   «         }2|1r|1                     d¦  «        s|2r|2                     d¦  «        rd}n2# t0          $ r%},tB           "                    d|,¦  «         Y d},~,nd},~,ww xY w|s�Œ:|'d v r ||'¦  «        }n<|                     |'g ¦  «        p|                     |%g ¦  «        }|'|v r ||'|¦  «        }t3          |¦  «        }|d|…         }|                     |'tS          |'¦  «        |'| k    p|%| k    d||d!dœ¦  «         |                     |%                     ¦   «         ¦  «         |                     |'                     ¦   «         ¦  «         �Œ#	 dd"lm*}3 n# tV          $ r g }3Y nw xY w|3D �]ž}4|4j,                             ¦   «         |v rŒ|#                     |4j,        ¦  «        }5d}6|5r'|5j        r t-          ˆUfd#„|5j        D ¦   «         ¦  «        }6|6sd	 ddlm}  |¦   «         }7|7                     di ¦  «        }8|7                     di ¦  «        }9|7r|4j,        |8v s	|4j,        |9v rd}6n# t0          $ r Y nw xY w|6s>	 ddl#m$}-  |-|4j,        ¦  «        }:|: %                    ¦   «         rd}6n# t0          $ r Y nw xY w|6s�Œ|                     |4j,        g ¦  «        };t3          |;¦  «        }<|;d|…         }=|                     |4j,        |4j-        |4j,        | k    d|=|<d$dœ¦  «         |                     |4j,                             ¦   «         ¦  «         �Œ t          ¦   «         }>|�rt%          |t          ¦  «        �rø|                     ¦   «         D �]â\  }?}@t%          |@t          ¦  «        sŒ|?                     ¦   «         |v rŒ3|@                     d%d&¦  «        p|?}!|@                     d'd&¦  «        p-|@                     d(d&¦  «        p|@                     d)d&¦  «        pd&}A|@                     d*d&¦  «        p|@                     d+d&¦  «        }Bg }C|Br|C                     |B¦  «         |@                     d,g ¦  «        }Dt%          |Dt          ¦  «        r!|DD ]}E|Er|E|Cvr|C                     |E¦  «         Œn5t%          |Dt*          ¦  «        r |DD ]}E|Er|E|Cvr|C                     |E¦  «         Œ|Cs_t]          |A¦  «         /                    ¦   «                              ¦   «         }Fd-|Fv r(|                     d.¦  «        pg }G|Grt+          |G¦  «        }C|                     |?|!|?| k    d|C|Crt3          |C¦  «        ndd/|Ad0œ¦  «         |                     |?                     ¦   «         ¦  «         |                     ta          |!¦  «                             ¦   «         ¦  «         t]          |!¦  «         /                    ¦   «                              ¦   «         t]          |A¦  «         /                    ¦   «          1                    d1¦  «                             ¦   «         f}H|Hd         r|Hd2         r|>                     |H¦  «         �Œä|�rœt%          |t*          ¦  «        �r†dd3l2m3}I  |I¦   «         }J|D �]…}Kt%          |Kt          ¦  «        sŒ|K                     d%¦  «        pd& /                    ¦   «         }L|K                     d'd&¦  «        p-|K                     d)d&¦  «        p|K                     d(d&¦  «        pd& /                    ¦   «          1                    d1¦  «        }A|Lr|AsŒ°|K                     d¦  «        pd& /                    ¦   «         }M|A|Mf}N|N|Jvr–|L}!d4D ]5}O|O|!v r/|! 4                    |O¦  «        d          /                    ¦   «         }! nŒ6|!s|L}!|r=|A| /                    ¦   «          1                    d1¦  «        k    r| pta          |!¦  «        }nta          |!¦  «        }||!|Ag d5œ|J|N<   |K                     d+¦  «        pd& /                    ¦   «         }B|Br1|B|J|N         d,         vr!|J|N         d,                              |B¦  «         |K                     d,i ¦  «        }Dt%          |Dt          ¦  «        r:|DD ]5}E|Er1|E|J|N         d,         vr!|J|N         d,                              |E¦  «         Œ6�Œ8t%          |Dt*          ¦  «        r8|DD ]5}E|Er1|E|J|N         d,         vr!|J|N         d,                              |E¦  «         Œ6�Œ‡t          ¦   «         }P|J 5                    ¦   «         D �]É}Q|Qd6         }|                     ¦   «         |v r|                     ¦   «         |PvrŒ8|                     ¦   «         |Pv rK|}Rd7}S|R› d8|S› �                     ¦   «         |v r |Sd2z  }S|R› d8|S› �                     ¦   «         |v ° |R› d8|S› �}||Qd6<   t]          |Qd%         ¦  «         /                    ¦   «                              ¦   «         t]          |Qd9         ¦  «         /                    ¦   «          1                    d1¦  «                             ¦   «         f}T|Td         r|Td2         r|T|>v r�Œ4|                     ||Qd%         || k    d|Qd,         t3          |Qd,         ¦  «        d/|Qd9         d0œ¦  «         |                     |                     ¦   «         ¦  «         |P                     |                     ¦   «         ¦  «         �ŒË| 6                    d:„ ¬;¦  «         |S )<uß  Detect which providers have credentials and list their curated models.

    Uses the curated model lists from hermes_cli/models.py (OPENROUTER_MODELS,
    _PROVIDER_MODELS) â€” NOT the full models.dev catalog.  These are hand-picked
    agentic models that work well as agent backends.

    Returns a list of dicts, each with:
      - slug: str â€” the --provider value to use
      - name: str â€” display name
      - is_current: bool
      - is_user_defined: bool
      - models: list[str] â€” curated model IDs (up to max_models)
      - total_models: int â€” total curated count
      - source: str â€” "built-in", "models.dev", "user-config"

    Only includes providers that have API keys set or are user-defined endpoints.
    r   N)ÚPROVIDER_TO_MODELS_DEVÚfetch_models_devÚget_provider_info)ÚPROVIDER_REGISTRY)ÚOPENROUTER_MODELSr·   Ú_MODELS_DEV_PREFERREDÚ_merge_with_models_devÚprovider_model_idsc                ó   — g | ]\  }}|‘ŒS r,   r,   )r›   r½   r  s      r   r¾   z0list_authenticated_providers.<locals>.<listcomp>ü  s   € ÐAÐAÐA¡V S¨!˜SÐAÐAÐAr   rà   rá   zollama-cloud)Úfetch_ollama_cloud_modelsrm   Úenvc              3  óL   •K  — | ]}‰j                              |¦  «        V — Œd S rš   ©ÚenvironrX   ©r›   ÚevÚoss     €r   r�   z/list_authenticated_providers.<locals>.<genexpr>   s1   øè è € Ð>Ð>¨r˜œ
Ÿš rÑ*Ô*Ð>Ð>Ð>Ð>Ð>Ð>r   )Ú_load_auth_storeÚcredential_poolTFzbuilt-in)rÙ   ra   Ú
is_currentÚis_user_definedr  Útotal_modelsÚsource)ÚHERMES_OVERLAYSc                ó   — i | ]\  }}||“Œ	S r,   r,   )r›   ÚkÚvs      r   ú
<dictcomp>z0list_authenticated_providers.<locals>.<dictcomp>M  s   € ÐGÐGÐG¡  1�q˜!ÐGÐGÐGr   c              3  óL   •K  — | ]}‰j                              |¦  «        V — Œd S rš   r<  r>  s     €r   r�   z/list_authenticated_providers.<locals>.<genexpr>[  s1   øè è € ÐPÐP°2˜BœJŸNšN¨2Ñ.Ô.ÐPÐPÐPÐPÐPÐPr   c              3  óL   •K  — | ]}‰j                              |¦  «        V — Œd S rš   r<  r>  s     €r   r�   z/list_authenticated_providers.<locals>.<genexpr>a  s1   øè è € ÐNÐN°"˜2œ:Ÿ>š>¨"Ñ-Ô-ÐNÐNÐNÐNÐNÐNr   rÜ   z"Auth store check failed for %s: %s)Ú	load_poolz'Credential pool check failed for %s: %sr.   )Úread_claude_code_credentialsÚread_hermes_oauth_credentialsÚaccessTokenz)Anthropic external creds check failed: %s>   úcopilot-acpr  Úhermes)ÚCANONICAL_PROVIDERSc              3  óL   •K  — | ]}‰j                              |¦  «        V — Œd S rš   r<  r>  s     €r   r�   z/list_authenticated_providers.<locals>.<genexpr>À  s1   øè è € ÐYÐY°r ¤
§¢¨rÑ 2Ô 2ÐYÐYÐYÐYÐYÐYr   Ú	canonicalra   r   rN   ÚapiÚurlÚdefault_modelrL   r  zapi.openai.comr3   zuser-config)rÙ   ra   rC  rD  r  rE  rF  Úapi_urlr‘   r|   )ÚOrderedDict)u   â€”z - )rÙ   ra   rZ  r  rÙ   r}   r’   rZ  c                ó&   — | d          | d          fS )NrC  rE  r,   )Úrs    r   rÃ   z.list_authenticated_providers.<locals>.<lambda>¹  s   €  A l¤OÐ 3°a¸Ô6GÐ5GÐH€ r   rÄ   )7r@  Úagent.models_devr0  r1  r2  Úhermes_cli.authr3  rÆ   r4  r·   r5  r6  r7  ÚsetrV   r9  rZ   rX   rY   Ú	auth_typeÚapi_key_env_varsÚlistr  rA  r]   rƒ   ra   r„   Úaddr\   Úhermes_cli.providersrG  Úextra_env_varsr  r  Úagent.credential_poolrN  Úhas_credentialsÚagent.anthropic_adapterrO  rP  r
   rT  ÚImportErrorrÙ   Úlabelr   r[   r   r¦   Úcollectionsr[  r‚   ÚvaluesrÇ   )Vr´   rí   rÒ   rÓ   r×   r0  r1  Ú_mdev_pinfor3  r4  r·   r5  r6  r7  ÚresultsÚ
seen_slugsÚseen_mdev_idsÚdataÚcuratedr9  Ú	hermes_idÚmdev_idÚpdataÚpconfigÚenv_varsÚ	has_credsrA  ÚstoreÚ	model_idsÚtotalÚtoprÙ   ÚpinfoÚdisplay_namerG  Ú_auth_registryÚ_mdev_to_hermesÚpidÚoverlayÚhermes_slugÚ_keyÚpcfgÚproviders_storeÚ
pool_storeÚexcrN  ÚpoolrO  rP  Úhermes_credsÚcc_credsÚ_canon_provsÚ_cpÚ
_cp_configÚ_cp_has_credsÚ	_cp_storeÚ_cp_providers_storeÚ_cp_pool_storeÚ_cp_poolÚ_cp_model_idsÚ	_cp_totalÚ_cp_topÚ_section3_emitted_pairsÚep_nameÚep_cfgrZ  rY  Úmodels_listr(  r¹   Ú	url_lowerÚfbÚ_pairr[  Úgroupsrb   Úraw_namerm   Ú	group_keyÚsepÚ_section4_emitted_slugsÚgrpÚ	base_slugrœ   Ú	_pair_keyr@  sV                                                                                        @r   rÛ   rÛ   Ð  sj  ø€ ð0 €I€I€Iðð ð ð ð ð ð ð ð ð ð
 2Ð1Ð1Ð1Ð1Ð1ðð ð ð ð ð ð ð ð ð ð ð ð ð ð
 €GÝ‘e”e€JÝ™œ€MàÐÑÔ€Dõ %)Ð)9Ñ$:Ô$:€GØAÐAÐ/@ÐAÑAÔA€GˆLÑà�WÐÐØ! ,Ô/ˆ�‰à˜WÐ$Ð$Ø?Ð?Ð?Ð?Ð?Ð?Ø";Ð";Ñ"=Ô"=ˆ�Ñð 5×:Ò:Ñ<Ô<ð >#ñ >#Ñˆ	�7ð �mÐ#Ð#ØØ—’˜Ñ!Ô!ˆÝ˜%¥Ñ&Ô&ð 	Øð
 $×'Ò'¨	Ñ2Ô2ˆð ð 	�wÔ(¨IÒ5Ð5ØØð 	�wÔ/ð 	Ý˜GÔ4Ñ5Ô5ˆHˆHà—y’y ¨Ñ+Ô+ˆHÝ˜h­Ñ-Ô-ð Øõ Ð>Ð>Ð>Ð>°XÐ>Ñ>Ô>Ñ>Ô>ˆ	Øð 	ðØ<Ð<Ð<Ð<Ð<Ð<Ø(Ð(Ñ*Ô*�Øð %˜Y¨%¯)ª)Ð4EÀrÑ*JÔ*JÐJÐJØ $�IøøÝð ð ð Ø�ðøøøàð 	Ùð —K’K 	¨2Ñ.Ô.ˆ	ØÐ-Ð-Ð-Ø.Ð.¨y¸)ÑDÔDˆIÝ�I‘”ˆØ˜˜˜Ô$ˆàˆØ�˜GÑ$Ô$ˆØ%*Ð7�u”z�z°ˆà�ŠØØ ØÐ"2Ò2ÐQ°gÐAQÒ6QØ$ØØ!Ø ð
ð 
ñ 	ô 	ð 	ð 	�Š�t—z’z‘|”|Ñ$Ô$Ð$Ø×Ò˜'Ñ"Ô"Ð"Ñ"ð 5Ð4Ð4Ð4Ð4Ð4ØCÐCÐCÐCÐCÐCð
 HÐGÐ(>×(DÒ(DÑ(FÔ(FÐGÑGÔG€Oà'×-Ò-Ñ/Ô/ð ^,ñ ^,‰ˆˆWØ�9Š9‰;Œ;˜*Ð$Ð$Øð &×)Ò)¨#¨sÑ3Ô3ˆØ×ÒÑÔ *Ð,Ð,Øð ˆ	ØÔ!ð 	QÝÐPÐPÐPÐP¸Ô9OÐPÑPÔPÑPÔPˆIàð 	˜WÔ.°)Ò;Ð;Ø˜kÐ*ð ð �Ø%×)Ò)¨$Ñ/Ô/�Øð ˜DÔ1ð ÝÐNÐNÐNÐN¸Ô8MÐNÑNÔNÑNÔNð Ø$(˜	Ø˜øð
 ð 	MðMØ<Ð<Ð<Ð<Ð<Ð<Ø(Ð(Ñ*Ô*�Ø"'§)¢)¨K¸Ñ"<Ô"<�Ø"ŸYšYÐ'8¸"Ñ=Ô=�
Øð %Ø˜?Ð*Ð*¨k¸_Ð.LÐ.LØ˜jÐ(Ð(¨K¸:Ð,EÐ,Eà $�IøøÝð Mð Mð MÝ—’ÐAÀ3ÈÑLÔLÐLÐLÐLÐLÐLÐLøøøøðMøøøð ð 	ZðZØ;Ð;Ð;Ð;Ð;Ð;Ø �y Ñ-Ô-�Ø×'Ò'Ñ)Ô)ð %Ø $�IøøÝð Zð Zð ZÝ—’ÐFÈÐUXÑYÔYÐYÐYÐYÐYÐYÐYøøøøðZøøøð ð 	O˜[¨KÒ7Ð7ðOðð ð ð ð ð ð ð ð  =Ð<Ñ>Ô>�Ø7Ð7Ñ9Ô9�Ø ð % \×%5Ò%5°mÑ%DÔ%Dð %Øð%Ø!)§¢¨mÑ!<Ô!<ð%à $�IøøÝð Oð Oð OÝ—’ÐHÈ#ÑNÔNÐNÐNÐNÐNÐNÐNøøøøðOøøøàð 	ÙàÐ4Ð4Ð4Ø*Ð*¨;Ñ7Ô7ˆIˆIð  Ÿš K°Ñ4Ô4ÐL¸¿ºÀCÈÑ8LÔ8LˆIàÐ3Ð3Ð3Ø2Ð2°;À	ÑJÔJ�	Ý�I‘”ˆØ˜˜˜Ô$ˆà�ŠØÝ˜kÑ*Ô*Ø%Ð)9Ò9ÐT¸SÐDTÒ=TØ$ØØ!Øð
ð 
ñ 	ô 	ð 	ð 	�Š�s—y’y‘{”{Ñ#Ô#Ð#Ø�Š�{×(Ò(Ñ*Ô*Ñ+Ô+Ð+Ñ+ðØIÐIÐIÐIÐIÐIÐIøÝð ð ð Øˆˆˆðøøøð ð 0)ñ 0)ˆØŒ8�>Š>ÑÔ˜zÐ)Ð)Øð $×'Ò'¨¬Ñ1Ô1ˆ
ØˆØð 	Z˜*Ô5ð 	ZÝÐYÐYÐYÐY¸ZÔ=XÐYÑYÔYÑYÔYˆMàð 	ðØ<Ð<Ð<Ð<Ð<Ð<Ø,Ð,Ñ.Ô.�	Ø&/§m¢m°KÀÑ&DÔ&DÐ#Ø!*§¢Ð/@À"Ñ!EÔ!E�Øð )Ø”HÐ 3Ð3Ð3Ø”x >Ð1Ð1à$(�MøøÝð ð ð Ø�ðøøøàð 	ðØ;Ð;Ð;Ð;Ð;Ð;Ø$˜9 S¤XÑ.Ô.�Ø×+Ò+Ñ-Ô-ð )Ø$(�MøøÝð ð ð Ø�ðøøøð ð 	ÙàŸš C¤H¨bÑ1Ô1ˆÝ˜Ñ&Ô&ˆ	Ø   Ô,ˆà�ŠØ”HØ”IØœ(Ð&6Ò6Ø$ØØ%Ø!ð
ð 
ñ 	ô 	ð 	ð 	�Š�s”x—~’~Ñ'Ô'Ñ(Ô(Ð(Ñ(õ $'¡5¤5ÐØñ D3�* ^µTÑ:Ô:ñ D3Ø-×3Ò3Ñ5Ô5ð C	3ñ C	3‰OˆG�VÝ˜f¥dÑ+Ô+ð Øð �}Š}‰Œ *Ð,Ð,ØØ!Ÿ:š: f¨bÑ1Ô1Ð<°WˆLð
 —
’
˜: rÑ*Ô*ð Ø—:’:˜e RÑ(Ô(ðà—:’:˜e RÑ(Ô(ðð ð	 ð #ŸJšJ ¸Ñ;Ô;ÐV¸v¿zºzÈ'ÐSUÑ?VÔ?VˆMð ˆKØð 2Ø×"Ò" =Ñ1Ô1Ð1ð
  Ÿš H¨bÑ1Ô1ˆJÝ˜*¥dÑ+Ô+ð .Ø#ð .ð .�AØð .˜Q kÐ1Ð1Ø#×*Ò*¨1Ñ-Ô-Ð-øð.õ ˜J­Ñ-Ô-ð .Ø#ð .ð .�AØð .˜Q kÐ1Ð1Ø#×*Ò*¨1Ñ-Ô-Ð-øð ð /Ý ™LœL×.Ò.Ñ0Ô0×6Ò6Ñ8Ô8�	Ø# yÐ0Ð0Ø Ÿš XÑ.Ô.Ð4°"�BØð /Ý&*¨2¡h¤h˜ð �NŠNØØ$Ø%Ð)9Ò9Ø#'Ø%Ø4?Ð F¥ KÑ 0Ô 0Ð 0ÀQØ'Ø"ð	ð 	ñ 	ô 	ð 	ð �NŠN˜7Ÿ=š=™?œ?Ñ+Ô+Ð+Ø�NŠNÕ/°Ñ=Ô=×CÒCÑEÔEÑFÔFÐFå�LÑ!Ô!×'Ò'Ñ)Ô)×/Ò/Ñ1Ô1Ý�G‘”×"Ò"Ñ$Ô$×+Ò+¨CÑ0Ô0×6Ò6Ñ8Ô8ðˆEð �QŒxð 3˜E !œHð 3Ø'×+Ò+¨EÑ2Ô2Ð2ùð  ñ p6�JÐ'7½Ñ>Ô>ñ p6Ø+Ð+Ð+Ð+Ð+Ð+ð
 .9¨[©]¬]ˆØ%ð >	>ñ >	>ˆEÝ˜e¥TÑ*Ô*ð ØàŸ	š	 &Ñ)Ô)Ð/¨R×6Ò6Ñ8Ô8ˆHà—	’	˜* bÑ)Ô)ð Ø—9’9˜U BÑ'Ô'ðà—9’9˜U BÑ'Ô'ðð ßŠe‰gŒg—f’f˜S‘k”kð ð ð  7ð ØØ—y’y Ñ+Ô+Ð1¨r×8Ò8Ñ:Ô:ˆGà  'Ð*ˆIØ Ð&Ð&ð
  (�Ø)ð ð �CØ˜lÐ*Ð*Ø'3×'9Ò'9¸#Ñ'>Ô'>¸qÔ'A×'GÒ'GÑ'IÔ'I˜Ø˜ð +ð $ð ,Ø#+�Lð
 %ð>àÐ#3×#9Ò#9Ñ#;Ô#;×#BÒ#BÀ3Ñ#GÔ#GÒGÐGà+ÐQÕ/CÀLÑ/QÔ/Q�D�Då/°Ñ=Ô=�Dà Ø(Ø&Ø ð	%ð %��yÑ!ð #ŸYšY wÑ/Ô/Ð5°2×<Ò<Ñ>Ô>ˆMØð B °f¸YÔ6GÈÔ6QÐ!QÐ!QØ�yÔ! (Ô+×2Ò2°=ÑAÔAÐAàŸš 8¨RÑ0Ô0ˆJÝ˜*¥dÑ+Ô+ð >Ø#ð >ð >�AØð >˜Q f¨YÔ&7¸Ô&AÐAÐAØ˜yÔ)¨(Ô3×:Ò:¸1Ñ=Ô=Ð=øñ>õ ˜J­Ñ-Ô-ð >Ø#ð >ð >�AØð >˜Q f¨YÔ&7¸Ô&AÐAÐAØ˜yÔ)¨(Ô3×:Ò:¸1Ñ=Ô=Ð=øùå'*¡u¤uÐØ—=’=‘?”?ð (	6ñ (	6ˆCØ�v”;ˆDð �zŠz‰|Œ|˜zÐ)Ð)¨d¯jªj©l¬lÐBYÐ.YÐ.YØð
 �zŠz‰|Œ|Ð6Ð6Ð6Ø �	Ø�Ø"Ð(Ð( QÐ(Ð(×.Ò.Ñ0Ô0°JÐ>Ð>Ø˜‘F�Að #Ð(Ð( QÐ(Ð(×.Ò.Ñ0Ô0°JÐ>Ð>à#Ð)Ð) aÐ)Ð)�Ø"��F‘õ �C˜”KÑ Ô ×&Ò&Ñ(Ô(×.Ò.Ñ0Ô0Ý�C˜	”NÑ#Ô#×)Ò)Ñ+Ô+×2Ò2°3Ñ7Ô7×=Ò=Ñ?Ô?ðˆIð ˜Œ|ð  	¨!¤ð °Ð>UÐ1UÐ1UÙØ�NŠNØØ˜FœØ"Ð&6Ò6Ø#'Ø˜hœ-Ý # C¨¤MÑ 2Ô 2Ø'Ø˜yœ>ð	ð 	ñ 	ô 	ð 	ð �NŠN˜4Ÿ:š:™<œ<Ñ(Ô(Ð(Ø#×'Ò'¨¯
ª
©¬Ñ5Ô5Ð5Ñ5ð ‡L‚LÐHÐH€LÑIÔIÐIà€Ns“   Å%,FÆ
FÆFÍ,AN=Î=
O-ÏO(Ï(O-Ï3'PÐ
QÐ%QÑQÑAR$Ò$
SÒ.SÓS×W ×W×WÙAZÚ
Z&Ú%Z&Ú,,[Û
[&Û%[&)r   r   r   r   )r   r   r   r   )r   rO   )r   rd   )ry   r   r   rz   )r�   r   rŽ   r   r   r�   )r³   r   r´   r   r   rµ   )r   NN)r´   r   rÒ   rV   rÓ   rÔ   r   rÕ   )r,   )r³   r   rÞ   rÕ   r   rµ   )r   r   NN)rL   r   rM   r   rN   r   rm   r   ru   rt   rÓ   rÔ   r   rä   )r   r   Fr   NN)r³   r   r´   r   rì   r   rí   r   rî   r   rv   r   r†   r   rÒ   rV   rÓ   rÔ   r   rh   )r   r   NNr-  )r´   r   rí   r   rÒ   rV   rÓ   rÔ   r×   rè   r   r.  )4r*   Ú
__future__r   Úloggingr   Údataclassesr   Útypingr   r   r   re  r   r	   r
   r   r   Úhermes_cli.model_normalizer   r^  r   r   r   r   r   Ú	getLoggerr'   r  r    ÚcompileÚ
IGNORECASEr   r   r!   r#   rI   r+   rK   rP   rQ   rc   rf   rh   rx   rŒ   r²   rÑ   rÝ   rã   rë   r,  rÛ   r,   r   r   ú<module>r¯     s²  ððð ð ð( #Ð "Ð "Ð "Ð "Ð "à €€€Ø 	€	€	€	Ø !Ð !Ð !Ð !Ð !Ð !Ø -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -ðð ð ð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð 
ˆÔ	˜8Ñ	$Ô	$€ð-ð ð  )˜bœjØ-Ø„Mñô Ð ð	@ð 	@ð 	@ð 	@ðð ð ð ðð ð ð ð �Jñ ô ð ð1+à��˜{¨OÑ<Ô<ð1+ð ��˜{¨MÑ:Ô:ð1+ð ��˜{¨NÑ;Ô;ð	1+ð
 ��˜{¨HÑ5Ô5ð1+ð ��˜x¨Ñ1Ô1ð1+ð 
��˜x¨Ñ/Ô/ð1+ð ��˜x¨Ñ1Ô1ð1+ð 	��˜x¨Ñ.Ô.ð1+ð 	��˜x¨Ñ.Ô.ð1+ð ��˜x¨Ñ2Ô2ð1+ð$ ��˜z¨?Ñ;Ô;ð%1+ð* ��˜v vÑ.Ô.ð+1+ð0 ��˜|¨WÑ5Ô5ð11+ð6 ��˜v vÑ.Ô.ð71+ð< ��˜y¨)Ñ4Ô4ð=1+ðB ��˜x¨Ñ4Ô4ðC1+ðH ��˜|¨VÑ4Ô4ðI1+ðN �˜v uÑ-Ô-ð �˜y¨&Ñ1Ô1ð �˜x¨Ñ0Ô0ð �˜z¨9Ñ5Ô5ða1+ð 1+ð 1+€ð 1ð 1ð 1ñ 1ðxð ð ð ð �*ñ ô ð ð 35Ð Ð 4Ð 4Ð 4Ñ 4ð *,€Ð +Ð +Ð +Ñ +ð!ð !ð !ð !ðH0ð 0ð 0ð 0ð ðð ð ð ð ñ ô ñ „ðð& ðð ð ð ð ñ ô ñ „ðð'7ð '7ð '7ð '7ð\h/ð h/ð h/ð h/ðVJ/ð J/ð J/ð J/ð\ ØØ$(ðð ð ð ð ð0 *,ðð ð ð ð ð( ØØ&*Ø$(ð(ð (ð (ð (ð (ðf ØØØØØ$(ðHð Hð Hð Hð Hð` ØØØ$(Øðkð kð kð kð kð kð kr   