§
    øžyjË  ã                  óJ   — d Z ddlmZ ddlmZ dd„Zdd„Zdd„Zdd„Zdd„Z	dS )zFHelpers for reading the effective fallback provider chain from config.é    )Úannotations)ÚAnyÚvaluer   ÚreturnÚstrc                ó~   — t          | t          ¦  «        sdS |                      ¦   «                              d¦  «        S )NÚ ú/)Ú
isinstancer   ÚstripÚrstrip)r   s    ú@/home/ragecks/.hermes/hermes-agent/hermes_cli/fallback_config.pyÚ_normalized_base_urlr      s5   € Ý�e�SÑ!Ô!ð ØˆrØ�;Š;‰=Œ=×Ò Ñ$Ô$Ð$ó    Úentryúdict[str, Any] | Noneú
str | Nonec                ó�  — t          | t          ¦  «        sdS t          |                      d¦  «        pd¦  «                             ¦   «         }|r|S t          |                      d¦  «        p|                      d¦  «        pd¦  «                             ¦   «         }|r'ddlm}  ||¦  «        pd                     ¦   «         pdS dS )u^  API key for one fallback entry: inline ``api_key``, else ``key_env``.

    Mirrors the custom-provider convention (``key_env`` names the env var
    holding the key; ``api_key_env`` accepted as an alias). Returns None when
    neither yields a non-empty value, letting ``resolve_runtime_provider``
    fall through to the provider's standard credential resolution.

    ``key_env`` is resolved through ``agent.secret_scope.get_secret`` rather
    than a raw ``os.getenv`` â€” in a multiplexed gateway a bare env read would
    ignore the active profile's scope and can return another profile's
    credential. ``get_secret`` already implements the right fallback: it
    reads ``os.environ`` when there's no active multiplexed scope (matching
    prior single-profile behavior), and fails closed only when multiplexing
    is active with no scope installed.
    NÚapi_keyr	   Úkey_envÚapi_key_envr   )Ú
get_secret)r   Údictr   Úgetr   Úagent.secret_scoper   )r   Úinliner   r   s       r   Úresolve_entry_api_keyr      sÒ   € õ  �e�TÑ"Ô"ð ØˆtÝ�—’˜9Ñ%Ô%Ð+¨Ñ,Ô,×2Ò2Ñ4Ô4€FØð ØˆÝ�%—)’)˜IÑ&Ô&ÐH¨%¯)ª)°MÑ*BÔ*BÐHÀbÑIÔI×OÒOÑQÔQ€GØð ;Ø1Ð1Ð1Ð1Ð1Ð1à�
˜7Ñ#Ô#Ð) r×0Ò0Ñ2Ô2Ð:°dÐ:Øˆ4r   Úrawúlist[dict[str, Any]]c                ó6  — t          | t          ¦  «        r| g}nt          | t          ¦  «        r| }ng S g }|D ]à}t          |t          ¦  «        sŒt          |                     d¦  «        pd¦  «                             ¦   «         }t          |                     d¦  «        pd¦  «                             ¦   «         }|r|sŒ‰t          |¦  «        }||d<   ||d<   t          |                     d¦  «        ¦  «        }|r||d<   |                     |¦  «         Œá|S ©NÚproviderr	   ÚmodelÚbase_url)r   r   Úlistr   r   r   r   Úappend)r   Ú
candidatesÚentriesr   r"   r#   Ú
normalizedr$   s           r   Ú_iter_fallback_entriesr*   +   s.  € Ý�#•tÑÔð Ø�Uˆ
ˆ
Ý	�C�Ñ	Ô	ð Øˆ
ˆ
àˆ	à$&€GØð #ð #ˆÝ˜%¥Ñ&Ô&ð 	ØÝ�u—y’y Ñ,Ô,Ð2°Ñ3Ô3×9Ò9Ñ;Ô;ˆÝ�E—I’I˜gÑ&Ô&Ð,¨"Ñ-Ô-×3Ò3Ñ5Ô5ˆØð 	˜uð 	Øå˜%‘[”[ˆ
Ø!)ˆ
�:ÑØ#ˆ
�7Ñå'¨¯	ª	°*Ñ(=Ô(=Ñ>Ô>ˆØð 	.Ø%-ˆJ�zÑ"à�Š�zÑ"Ô"Ð"Ð"Ø€Nr   údict[str, Any]útuple[str, str, str]c                óˆ  — t          |                      d¦  «        pd¦  «                             ¦   «                              ¦   «         t          |                      d¦  «        pd¦  «                             ¦   «                              ¦   «         t	          |                      d¦  «        ¦  «                             ¦   «         fS r!   )r   r   r   Úlowerr   )r   s    r   Ú_entry_identityr/   H   s—   € åˆE�IŠI�jÑ!Ô!Ð' RÑ(Ô(×.Ò.Ñ0Ô0×6Ò6Ñ8Ô8ÝˆE�IŠI�gÑÔÐ$ "Ñ%Ô%×+Ò+Ñ-Ô-×3Ò3Ñ5Ô5Ý˜UŸYšY zÑ2Ô2Ñ3Ô3×9Ò9Ñ;Ô;ðð r   Úconfigc                óþ   — | pi } g }t          ¦   «         }dD ]e}t          |                      |¦  «        ¦  «        D ]@}t          |¦  «        }||v rŒ|                     |¦  «         |                     |¦  «         ŒAŒf|S )an  Return the effective fallback chain merged across old and new config keys.

    ``fallback_providers`` remains the primary source of truth and keeps its
    order. Legacy ``fallback_model`` entries are appended afterwards unless
    they target the same provider/model/base_url route as an earlier entry.
    The returned list always contains fresh dict copies.
    )Úfallback_providersÚfallback_model)Úsetr*   r   r/   Úaddr&   )r0   ÚchainÚseenÚkeyr   Úidentitys         r   Úget_fallback_chainr:   P   s™   € ð ˆ\�r€FØ"$€EÝ&)¡e¤e€Dà7ð  ð  ˆÝ+¨F¯JªJ°s©O¬OÑ<Ô<ð 	 ð 	 ˆEÝ& uÑ-Ô-ˆHØ˜4ÐÐØØ�HŠH�XÑÔÐØ�LŠL˜ÑÔÐÐð	 ð €Lr   N)r   r   r   r   )r   r   r   r   )r   r   r   r   )r   r+   r   r,   )r0   r   r   r   )
Ú__doc__Ú
__future__r   Útypingr   r   r   r*   r/   r:   © r   r   ú<module>r?      s�   ðØ LÐ Là "Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ð Ð ð%ð %ð %ð %ðð ð ð ð:ð ð ð ð:ð ð ð ðð ð ð ð ð r   