+
    „WÝj¯'  ã                  ó|  € R t ^ RIHt ^ RIt^ RIHtHtHtHt ^ RI	H
t
 ]
t]! 4       tR R ltR R ltR	 R
 ltR R ltR R ltR R ltR R ltR R ltR R ltR R ltR R ltR R ltR R ltR R  ltR! R" ltR# R$ ltR% R& lt/ ]PA                  R)]4      CR']/C]PA                  R*]4      CR(]/Ct!R# )+uÂ   hermes fallback â€” manage the fallback provider chain (tried in order when the primary fails).

Subcommands: ``list`` (default), ``add`` (same picker as `hermes model`), ``remove``, ``clear``.
)ÚannotationsN)ÚAnyÚDictÚListÚOptional)Úget_fallback_chainc               ó   € V ^8„  d   QhRR/# )é   Úentryúdict[str, Any]© )Úformats   "ÚKC:\Users\johnn\AppData\Local\hermes\hermes-agent\hermes_cli\fallback_cmd.pyÚ__annotate__r      s   € ÷ {ñ {�^ñ {ó    c                ó�   € ^ RI Hp VP                  V P                  R4      V P                  R4      V P                  R4      R7      # )z=BackendIdentity for a ``{provider, model, base_url?}`` entry.)ÚBackendIdentityÚproviderÚmodelÚbase_url)r   r   r   )Úagent.backend_identityr   ÚbuildÚget)r
   r   s   & r   Ú	_identityr      s=   € å6Ø× Ñ ¨%¯)©)°JÓ*?ÀuÇyÁyÐQXÓGYÐdi×dmÑdmÐnxÓdyÐ ÓzÐzr   c               ó$   € V ^8„  d   QhRRRRRR/# )r	   Úconfigr   Úchainúlist[dict[str, Any]]ÚreturnÚNoner   )r   s   "r   r   r      s"   € ÷ 'ñ '˜ð 'Ð0Dð 'Èñ 'r   c                ó2   € WR&   V P                  RR4       R# )zaPersist the chain to ``fallback_providers``; drop the legacy key so there is one source of truth.Úfallback_providersÚfallback_modelN)Úpop)r   r   s   &&r   Ú_write_chainr$      s   € à#(ÐÑ Ø
‡J�JÐ Ö&r   c               ó    € V ^8„  d   QhRRRR/# )r	   r
   r   r   Ústrr   )r   s   "r   r   r      s   € ÷ kñ k˜ð k¨Cñ kr   c                ó˜   € V P                  R4      pV P                  RR4       RV P                  RR4       RV'       d	   RV R2 2# R	 2# )
z6One-line human-readable rendering of a fallback entry.r   r   Ú?ú  (via r   Ú)z  [Ú]Ú )r   )r
   Úbases   & r   Ú_format_entryr.      sZ   € à�9‰9�ZÓ €DØ�i‰i˜ Ó%Ð& g¨e¯i©i¸
ÀCÓ.HÐ-IÈ×\`ÈSÐQUÐPVÐVWÈ=ÐJiÐjÐjÐfhÐJiÐjÐjr   c               ó    € V ^8„  d   QhRRRR/# )r	   Ú	model_cfgr   r   zOptional[dict[str, Any]]r   )r   s   "r   r   r   %   s   € ÷ 
ñ 
°ð 
Ð8Pñ 
r   c                óì  € \        V \        4      '       g   R# V P                  R4      ;'       g    RP                  4       pV P                  R4      ;'       g    V P                  R4      ;'       g    RP                  4       pV'       d	   V'       g   R# RVRV/pTP	                  R Uu/ uF7  q@P                  V4      ;'       g    RP                  4       ;p'       g   K5  WEbK9  	  up4       V# u upi )z^Pull the ``{provider, model, base_url?, api_mode?}`` dict from a ``config["model"]`` snapshot.Nr   r,   Údefaultr   )r   Úapi_mode)Ú
isinstanceÚdictr   ÚstripÚupdate)r0   r   r   r
   ÚkeyÚvalues   &     r   Ú _extract_fallback_from_model_cfgr:   %   sÈ   € ä�i¤×&Ò&ÙØ—‘˜jÓ)×/Ð/¨R×6Ñ6Ó8€HØ�]‰]˜9Ó%×EÐE¨¯©°wÓ)?×EÐEÀ2×LÑLÓN€EßŸ5ÙØ'¨°7¸EÐB€EØ	‡L�LÑ(@ÓrÑ(@ Ï}É}Ð]`ÓOa×OgÐOgÐeg×NnÑNnÓNpÐEpÀUÓEp”*�#’*Ñ(@ÑrÔsØ€Lùò ss   Â+C1ÃC1Ã"C1c               ó   € V ^8„  d   QhRR/# )r	   r   r   r   )r   s   "r   r   r   2   s   € ÷ Fñ F¨ñ Fr   c                 ó¨   € ^ RI Hp Hp V ! 4       ;_uu_ 4        V! 4       pVP                  R\        4      uuRRR4       #   + '       g   i     R# ; i)z4Return the current ``active_provider`` in auth.json.)Ú_auth_store_lockÚ_load_auth_storeÚactive_providerN)Úhermes_cli.authr=   r>   r   Ú_MISSING_ACTIVE_PROVIDER)r=   r>   Ústores      r   Ú_snapshot_auth_active_providerrC   2   s5   € çBá	×	Õ	Ù Ó"ˆØ�y‰yÐ*Ô,DÓE÷ 
×	×	Ó	ús   ˜A Á A	c               ó    € V ^8„  d   QhRRRR/# )r	   r9   r   r   r   r   )r   s   "r   r   r   ;   s   € ÷ 
 ñ 
 ¨ð 
 °ñ 
 r   c                óÒ   € ^ RI HpHpHp V! 4       ;_uu_ 4        V! 4       pV \        J d   VP                  RR4       MWR&   V! V4       RRR4       R#   + '       g   i     R# ; i)z>Write back a previously snapshotted ``active_provider`` value.)r=   r>   Ú_save_auth_storer?   N)r@   r=   r>   rF   rA   r#   )r9   r=   r>   rF   rB   s   &    r   Ú_restore_auth_active_providerrG   ;   sQ   € çTÑTá	×	Õ	Ù Ó"ˆØÔ,Ó,Ø�I‰IÐ'¨Õ.à',Ð#Ñ$Ù˜Ô÷ 
×	×	Ò	ús   š1AÁA&	c               ó    € V ^8„  d   QhRRRR/# )r	   Úmodel_beforer   r   r   r   )r   s   "r   r   r   H   s   € ÷ ñ  Sð ¨Tñ r   c                ó’   € ^ RI HpHp V! 4       pVP                  RR4       V e   \        P
                  ! V 4      VR&   V! V4       R# )z>Restore ``config["model"]`` to a previously-captured snapshot.©Úload_configÚsave_configr   N)Úhermes_cli.configrL   rM   r#   ÚcopyÚdeepcopy)rI   rL   rM   Úcfgs   &   r   Ú_restore_model_cfgrR   H   s:   € ç:Ù
‹-€CØ‡G�GˆG�TÔØÒÜ—}’} \Ó2ˆˆG‰Ù�Ör   c               ó$   € V ^8„  d   QhRRRRRR/# )r	   rI   r   Úactive_provider_beforer   r   r   )r   s   "r   r   r   R   s&   € ÷ cñ c¨ð cÀcð cÈdñ cr   c                óJ  € . p \        V 4        \        V4       V'       d/   RP	                  R V 4       4      p\        RV 24      V^ ,          hR#   \         d   pTP                  T4        Rp?LeRp?ii ; i  \         d   pTP                  T4        Rp?L‚Rp?ii ; i)z:Attempt both halves of temporary picker-route restoration.Nz; c              3  ó8   "  € T F  p\        V4      x € K  	  R # 5i©N)r&   )Ú.0Úexcs   & r   Ú	<genexpr>Ú)_restore_primary_route.<locals>.<genexpr>^   s   é € Ð7±¨œC ŸH˜H³ùs   ‚z+Could not fully restore the primary route: )rR   ÚBaseExceptionÚappendrG   ÚjoinÚRuntimeError)rI   rT   ÚerrorsrY   Údetailss   &&   r   Ú_restore_primary_routerb   R   s�   € à"$€FðÜ˜<Ô(ðÜ%Ð&<Ô=÷ Ø—)‘)Ñ7±Ó7Ó7ˆÜÐHÈÈ	ÐRÓSÐY_Ð`aÕYbÐbñ øô ô Ø�‰�c×Ñûðûô ô Ø�‰�c×Ñûðús.   „A �A< ÁA9ÁA4Á4A9Á<B"ÂBÂB"c               ó    € V ^8„  d   QhRRRR/# )r	   ÚnÚintr   r&   r   )r   s   "r   r   r   b   s   € ÷ 5ñ 5�ð 5˜ñ 5r   c                ó&   € T  R V ^8X  d   R 2# R 2# )Ú r
   Úentriesr   )rd   s   &r   Ú_entriesri   b   s%   € ØˆS�˜Q !œV�'Ð3Ð4Ð4¨Ð3Ð4Ð4r   c               ó$   € V ^8„  d   QhRRRRRR/# )r	   Úheadingr&   r   r   r   r   r   )r   s   "r   r   r   f   s'   € ÷ ]ñ ]˜#ð ]Ð&:ð ]¸tñ ]r   c           
     ó¤   € \        R V  R\        \        V4      4       R24       \        RP                  R \	        V^4       4       4      4       R# )z  z (z):r,   c              3  óJ   "  € T F  w  rR V R\        V4       R2x € K  	  R# 5i)z    z. Ú
N)r.   )rX   Úir
   s   &  r   rZ   Ú_print_chain.<locals>.<genexpr>h   s)   é € Ð[ÑGZ¹8¸1�D˜˜˜2œm¨EÓ2Ð3°2Õ6ÓGZùs   ‚!#N)Úprintri   Úlenr^   Ú	enumerate)rk   r   s   &&r   Ú_print_chainrt   f   sC   € Ü	ˆBˆwˆi�rœ(¤3 u£:Ó.Ð/¨rÐ
2Ô3Ü	ˆ"�'‰'Ñ[ÄyÐQVÐXYÔGZÓ[Ó
[Ö\r   c               ó   € V ^8„  d   QhRR/# )r	   Úempty_messager&   r   )r   s   "r   r   r   k   s   € ÷ !ñ !˜sñ !r   c                óz   € ^ RI Hp V! 4       p\        V4      pV'       g   \        RV  R24       Y#;'       g    R3# )z\Load config + chain; print ``empty_message`` block and return ``(config, None)`` when empty.)rL   rn   N)rN   rL   Ú_read_chainrq   )rv   rL   r   r   s   &   r   Ú_load_chainry   k   s9   € å-Ù‹]€FÜ˜Ó€EßÜ��=�/ Ð$Ô%Ø—=�=˜DÐ Ð r   c               ó    € V ^8„  d   QhRRRR/# )r	   r   r   r   zOptional[str]r   )r   s   "r   r   r   u   s   € ÷ Mñ M˜nð M°ñ Mr   c                óÂ  € V P                  R4      p\        V\        4      '       dˆ   VP                  R4      ;'       g    RP                  4       ;'       g    RpVP                  R4      ;'       g    VP                  R4      ;'       g    RP                  4       ;'       g    RpV RV R2# \        V\        4      '       d   VP                  4       ;'       g    R# R# )z?One-line description of the primary model for display purposes.r   r   r(   r2   r)   r*   N)r   r4   r5   r6   r&   )r   r0   r   r   s   &   r   Ú_describe_primaryr|   u   s¶   € à—
‘
˜7Ó#€IÜ�)œT×"Ò"Ø—M‘M *Ó-×4Ð4°×;Ñ;Ó=×DÐDÀˆØ—‘˜yÓ)×JÐJ¨Y¯]©]¸7Ó-C×JÐJÀs×QÑQÓS×ZÐZÐWZˆØ�˜ ˜z¨Ð+Ð+Ü(2°9¼c×(BÒ(Bˆ9�?‰?Ó×$Ð$ ÐLÈÐLr   c               ó   € V ^8„  d   QhRR/# ©r	   r   r   r   )r   s   "r   r   r      s   € ÷ iñ i˜tñ ir   c                óÞ   € \        R4      w  rVf   \        R4       R# \        4        \        V4      ;p'       d   \        RV R24       \        RV4       \        R4       \        R4       R# )	z!Print the current fallback chain.z#  No fallback providers configured.Nz%  Add one with:  hermes fallback add
z  Primary:   rn   zFallback chainzM  Tried in order when the primary fails (rate-limit, 5xx, connection errors).zZ  Docs: https://hermes-agent.nousresearch.com/docs/user-guide/features/fallback-providers
)ry   rq   r|   rt   )Úargsr   r   Úprimarys   &   r   Úcmd_fallback_listr‚      sc   € äÐ EÓF�M€FØ‚}ÜÐ6Ô7ÙÜ	„GÜ# FÓ+Ð+€wÖ+Ü�˜g˜Y bÐ)Ô*ÜÐ! 5Ô)Ü	Ð
YÔZÜ	Ð
gÖhr   c               ó   € V ^8„  d   QhRR/# r~   r   )r   s   "r   r   r   �   s   € ÷ 5Zñ 5Z˜dñ 5Zr   c                óV  aa€ ^ RI HpHp ^ RIHpHp V! R4       \        P                  ! V! 4       P                  R4      4      p\        4       p\        R4        V! V R7       V! 4       pVP                  R4      p\        V4      p	\        YV4       T	'       g   \        R	4       R# ^ R
IHo \%        T	4      o\        T4      pT'       d>   S! \%        T4      S4      '       d&   \        R\'        T	4       R24       \        R4       R# T! 4       p\)        T4      p\*        ;QJ d     TT3R lT 4       F  '       g   K   RM	  RM! TT3R lT 4       4      '       d   \        R\'        T	4       R24       R# TP-                  T	4       \/        YÞ4       T! T4       \        R\'        T	4       24       \        R\1        \3        T4      4       R24       \        R4       R#   \         d?   p
 \        YV4       h   \         d   pT
P                  RT 24        Rp?h Rp?ii ; iRp
?
ii ; i)zQLaunch the same picker as `hermes model`, then append the selection to the chain.)Ú_require_ttyÚselect_provider_and_modelrK   zfallback addr   u’   
  Adding a fallback provider.  The picker below is the same one used by
  `hermes model` â€” select the provider + model you want as a fallback.
)r€   zKCould not fully restore the primary route after fallback selection failed: Nz
  No fallback added.)Úsame_deploymentz/
  Selected model matches the current primary (z).u;     A provider cannot be a fallback for itself â€” no change.c              3  óH   <"  € T F  pS! \        V4      S4      x € K  	  R # 5irW   )r   )rX   ÚexistingÚ	new_identr‡   s   & €€r   rZ   Ú#cmd_fallback_add.<locals>.<genexpr>º   s    øé € Ð
QÉ5¸x‰?œ9 XÓ.°	×:Ð:Ë5ùs   ƒ"TFz
  u.    is already in the fallback chain â€” skipped.z
  Added fallback: ú  Chain is now ú long.
zL  Run `hermes fallback list` to view, or `hermes fallback remove` to delete.)Úhermes_cli.mainr…   r†   rN   rL   rM   rO   rP   r   rC   rq   r:   r\   rb   Ú	ExceptionÚadd_noter   r‡   r   r.   rx   Úanyr]   r$   ri   rr   )r€   r…   r†   rL   rM   rI   rT   Ú	after_cfgÚmodel_afterÚ	new_entryÚpicker_errorÚrestore_errorÚprimary_entryÚ	final_cfgr   rŠ   r‡   s   &              @@r   Úcmd_fallback_addr™   �   sÝ  ù€ çGß:Ù�Ô ô —=’=¡£×!2Ñ!2°7Ó!;Ó<€LÜ;Ó=ÐÜ	ð Wô XðÙ! tÕ,Ù“Mˆ	Ø—m‘m GÓ,ˆÜ4°[ÓAˆ	ô ˜<Ô@çÜÐ&Ô'Ùå6Ü˜)Ó$€IÜ4°\ÓB€Mß™¬°=Ó)AÀ9×MÒMÜÐ@ÄÈyÓAYÐ@ZÐZ\Ð]Ô^ÜÐKÔLÙñ “€IÜ˜	Ó"€Eß
ƒsÕ
QÉ5Ó
Q‡s‡s‚sÕ
QÉ5Ó
Q×QÒQÜ�”] 9Ó-Ð.Ð.\Ð]Ô^ÙØ	‡L�L�ÔÜ�Ô"Ù�	ÔÜ	Ð ¤¨yÓ!9Ð :Ð
;Ô<Ü	ˆOœH¤S¨£ZÓ0Ð1°Ð
:Ô;Ü	Ð
XÖYøôI ô ð	Ü" <ÔHð 	øô ô 	Ø×!Ñ!ð%Ø%2 Oð5÷ð ð 	ûð	þðús<   Á,G ÇH(Ç+G7Ç6H#Ç7H ÈHÈH#ÈH È H#È#H(c               ó   € V ^8„  d   QhRR/# r~   r   )r   s   "r   r   r   Å   s   € ÷ mñ m ñ mr   c           	     óÌ  € ^ RI Hp \        R4      w  r#Vf   R# ^ RIHp T! RV Uu. uF  p\        V4      NK  	  upR.,           ^ 4      pVe   V^ 8  g   V\        V4      8¼  d   \        R4       R# VP                  V4      p\        W#4       V! V4       \        R\        V4       24       \        V'       d   R	\        \        V4      4       R
24       R# R4       R# u upi )z+Pick an entry from the chain and remove it.©rM   u9     No fallback providers configured â€” nothing to remove.N)Ú_curses_prompt_choicezSelect a fallback to remove:ÚCancelu   
  Cancelled â€” no change.z
  Removed fallback: rŒ   r�   z  Fallback chain is now empty.
)rN   rM   ry   Úhermes_cli.setupr�   r.   rr   rq   r#   r$   ri   )r€   rM   r   r   r�   ÚeÚidxÚremoveds   &       r   Úcmd_fallback_remover£   Å   sÏ   € å-ÜÐ [Ó\�M€FØ‚}Ùõ 7Ù
Ð >Ñ[`Ó@aÑ[`ÐVWÄÈqÖAQÑ[`Ñ@aÐemÐdnÕ@nÐpqÓ
r€CØ
‚{�c˜A”g ¬¨E«
Ô!2ÜÐ,Ô-ÙØ�i‰i˜‹n€GÜ�ÔÙ�ÔÜ	Ð"¤=°Ó#9Ð":Ð
;Ô<Ü	¿eˆOœH¤S¨£ZÓ0Ð1°Ð
:ÖlÐIkÖlùò Abs   §C!
c               ó   € V ^8„  d   QhRR/# r~   r   )r   s   "r   r   r   Ù   s   € ÷ +ñ + ñ +r   c                ó`  € ^ RI Hp \        R4      w  r#Vf   R# \        4        \	        RV4        \        R4      P                  4       P                  4       pTR	9  d   \        R4       R# \        T. 4       T! T4       \        R4       R#   \        \        3 d    \        R4        R# i ; i)
z0Remove all fallback entries (with confirmation).rœ   u8     No fallback providers configured â€” nothing to clear.NzCurrent fallback chainz  Clear all entries? [y/N]: z
  Cancelled.u     Cancelled â€” no change.z
  Fallback chain cleared.
>   ÚyÚyes)rN   rM   ry   rq   rt   Úinputr6   ÚlowerÚKeyboardInterruptÚEOFErrorr$   )r€   rM   r   r   Úresps   &    r   Úcmd_fallback_clearr­   Ù   sŸ   € å-ÜÐ ZÓ[�M€FØ‚}ÙÜ	„GÜÐ)¨5Ô1ðÜÐ3Ó4×:Ñ:Ó<×BÑBÓDˆð �<ÔÜÐ*Ô+ÙÜ�˜ÔÙ�ÔÜ	Ð
)Ö*øô œxÐ(ô ÜÐÔÚðús   ±'B ÂB-Â,B-c               ó   € V ^8„  d   QhRR/# r~   r   )r   s   "r   r   r   î   s   € ÷ ñ ˜$ñ r   c                óª   € \        V RR4      p\        P                  V4      pVf%   \        RV 24       \        R4       \	        ^4      hV! V 4       R# )z:Top-level dispatcher for ``hermes fallback [subcommand]``.Úfallback_commandNzUnknown fallback subcommand: z$Use one of: list, add, remove, clear)ÚgetattrÚ_SUBCOMMANDSr   rq   Ú
SystemExit)r€   ÚsubÚhandlers   &  r   Úcmd_fallbackr¶   î   sP   € ä
�$Ð*¨DÓ
1€CÜ×Ñ˜sÓ#€GØ‚ÜÐ-¨c¨UÐ3Ô4ÜÐ4Ô5Ü˜‹mÐÙˆD†Mr   ÚaddÚclear)Nr,   ÚlistÚls)ÚremoveÚrm)"Ú__doc__Ú
__future__r   rO   Útypingr   r   r   r   Úhermes_cli.fallback_configr   rx   ÚobjectrA   r   r$   r.   r:   rC   rG   rR   rb   ri   rt   ry   r|   r‚   r™   r£   r­   r¶   r5   Úfromkeysr²   r   r   r   Ú<module>rÃ      sÒ   ðñõ #ã ß ,Ó ,å 9ð !€ñ "›8Ð õ{õ'õkõ
õFõ
 õõcõ 5õ]õ
!õMõiõ5Zõpmõ(+õ*ðØ
‡m�mÐ,Ð.?Ó@ðØBGÐIYñà
‡m�mÐ$Ð&9Ó:ðà<CÐEWñ‚r   