§
    ÷žyj  ã                  ó¼   — U d Z ddlmZ ddlZddlZddlmZmZmZ ddl	m
Z
  ej        e¦  «        Zi Zded<    ej        ¦   «         Zdd„Zdd„Zdd„Zdd„Zdd„ZdS )a°  
Video Generation Provider Registry
==================================

Central map of registered providers. Populated by plugins at import-time via
``PluginContext.register_video_gen_provider()``; consumed by the
``video_generate`` tool to dispatch each call to the active backend.

Active selection
----------------
The active provider is chosen by ``video_gen.provider`` in ``config.yaml``.
If unset, :func:`get_active_provider` applies fallback logic:

1. If exactly one *available* provider is registered, use it.
2. Otherwise return ``None`` (the tool surfaces a helpful error pointing
   the user at ``hermes tools``).

Mirrors ``agent/image_gen_registry.py`` so the two surfaces behave the
same: the unconfigured fallback is filtered by ``is_available()`` so a box
that has credentials for only one backend (e.g. DeepInfra, while the
``fal``/``xai`` plugins also register unconditionally) auto-selects it
instead of returning ``None``.
é    )ÚannotationsN)ÚDictÚListÚOptional)ÚVideoGenProviderzDict[str, VideoGenProvider]Ú
_providersÚproviderr   ÚreturnÚNonec                ó<  — t          | t          ¦  «        s$t          dt          | ¦  «        j        › �¦  «        ‚| j        }t          |t          ¦  «        r|                     ¦   «         st          d¦  «        ‚t          5  t                               |¦  «        }| t          |<   ddd¦  «         n# 1 swxY w Y   |�0t                               d|t          |¦  «        j        ¦  «         dS t                               d|t          | ¦  «        j        ¦  «         dS )uÙ   Register a video generation provider.

    Re-registration (same ``name``) overwrites the previous entry and logs
    a debug message â€” this makes hot-reload scenarios (tests, dev loops)
    behave predictably.
    z=register_provider() expects a VideoGenProvider instance, got z3Video gen provider .name must be a non-empty stringNz.Video gen provider '%s' re-registered (was %r)z'Registered video gen provider '%s' (%s))Ú
isinstancer   Ú	TypeErrorÚtypeÚ__name__ÚnameÚstrÚstripÚ
ValueErrorÚ_lockr   ÚgetÚloggerÚdebug)r	   r   Úexistings      ú>/home/ragecks/.hermes/hermes-agent/agent/video_gen_registry.pyÚregister_providerr   (   sJ  € õ �hÕ 0Ñ1Ô1ð 
Ýð-Ý˜‘>”>Ô*ð-ð -ñ
ô 
ð 	
ð Œ=€DÝ�d�CÑ Ô ð P¨¯
ª
©¬ð PÝÐNÑOÔOÐOÝ	ð $ð $Ý—>’> $Ñ'Ô'ˆØ#�
�4Ñð$ð $ð $ñ $ô $ð $ð $ð $ð $ð $ð $øøøð $ð $ð $ð $ð ÐÝ�ŠÐEÀtÍTÐRZÉ^Ì^ÔMdÑeÔeÐeÐeÐeå�ŠÐ>ÀÅdÈ8ÁnÄnÔF]Ñ^Ô^Ð^Ð^Ð^s   Â %B1Â1B5Â8B5úList[VideoGenProvider]c                 ó°   — t           5  t          t                               ¦   «         ¦  «        } ddd¦  «         n# 1 swxY w Y   t	          | d„ ¬¦  «        S )z0Return all registered providers, sorted by name.Nc                ó   — | j         S )N©r   )Úps    r   ú<lambda>z list_providers.<locals>.<lambda>D   s   €  q¤v€ ó    )Úkey)r   Úlistr   ÚvaluesÚsorted)Úitemss    r   Úlist_providersr(   @   s�   € å	ð *ð *Ý•Z×&Ò&Ñ(Ô(Ñ)Ô)ˆð*ð *ð *ñ *ô *ð *ð *ð *ð *ð *ð *øøøð *ð *ð *ð *å�%Ð-Ð-Ð.Ñ.Ô.Ð.s   ˆ';»?Á?r   r   úOptional[VideoGenProvider]c                óÊ   — t          | t          ¦  «        sdS t          5  t                               |                      ¦   «         ¦  «        cddd¦  «         S # 1 swxY w Y   dS )z5Return the provider registered under *name*, or None.N)r   r   r   r   r   r   r   s    r   Úget_providerr+   G   sš   € å�d�CÑ Ô ð ØˆtÝ	ð ,ð ,Ý�~Š~˜dŸjšj™lœlÑ+Ô+ð,ð ,ð ,ð ,ñ ,ô ,ð ,ð ,ð ,ð ,ð ,ð ,øøøð ,ð ,ð ,ð ,ð ,ð ,s   Ÿ,AÁAÁAc                 ó  ‡	— d} 	 ddl m}  |¦   «         }t          |t          ¦  «        r|                     d¦  «        nd}t          |t          ¦  «        rR|                     d¦  «        }t          |t
          ¦  «        r(|                     ¦   «         r|                     ¦   «         } n2# t          $ r%}t           	                    d|¦  «         Y d}~nd}~ww xY wt          5  t          t          ¦  «        }ddd¦  «         n# 1 swxY w Y   | r6|                     | ¦  «        }|�|S t           	                    d| ¦  «         dS dd„Š	ˆ	fd„|                     ¦   «         D ¦   «         }t          |¦  «        dk    r|d         S dS )zˆResolve the currently-active provider.

    Reads ``video_gen.provider`` from config.yaml; falls back per the
    module docstring.
    Nr   )Úload_config_readonlyÚ	video_genr	   z1Could not read video_gen.provider from config: %szEvideo_gen.provider='%s' configured but not registered; failing closedr    r   r
   Úboolc                ó¸   — 	 t          |                      ¦   «         ¦  «        S # t          $ r,}t                               d| j        |¦  «         Y d}~dS d}~ww xY w)zDWrap ``is_available()`` so a buggy provider doesn't kill resolution.z.video_gen provider %s.is_available() raised %sNF)r/   Úis_availableÚ	Exceptionr   r   r   )r    Úexcs     r   Ú_is_available_safez/get_active_provider.<locals>._is_available_safeo   se   € ð	Ý˜ŸšÑ(Ô(Ñ)Ô)Ð)øÝð 	ð 	ð 	Ý�LŠLÐIÈ1Ì6ÐSVÑWÔWÐWØ�5�5�5�5�5øøøøð	øøøs   ‚ # £
A­!AÁAc                ó*   •— g | ]} ‰|¦  «        ¯|‘ŒS © r6   )Ú.0r    r4   s     €r   ú
<listcomp>z'get_active_provider.<locals>.<listcomp>{   s*   ø€ ÐGÐGÐG�qÐ1CÐ1CÀAÑ1FÔ1FÐG�ÐGÐGÐGr"   é   )r    r   r
   r/   )Úhermes_cli.configr-   r   Údictr   r   r   r2   r   r   r   r   r%   Úlen)
Ú
configuredr-   ÚcfgÚsectionÚrawr3   Úsnapshotr	   Ú	availabler4   s
            @r   Úget_active_providerrC   O   sû  ø€ ð !%€Jð
OØ:Ð:Ð:Ð:Ð:Ð:à"Ð"Ñ$Ô$ˆÝ*4°S½$Ñ*?Ô*?ÐI�#—'’'˜+Ñ&Ô&Ð&ÀTˆÝ�g�tÑ$Ô$ð 	)Ø—+’+˜jÑ)Ô)ˆCÝ˜#�sÑ#Ô#ð )¨¯	ª	©¬ð )Ø ŸYšY™[œ[�
øøÝð Oð Oð OÝ�ŠÐHÈ#ÑNÔNÐNÐNÐNÐNÐNÐNøøøøðOøøøõ 
ð $ð $Ý�
Ñ#Ô#ˆð$ð $ð $ñ $ô $ð $ð $ð $ð $ð $ð $øøøð $ð $ð $ð $ð ð Ø—<’< 
Ñ+Ô+ˆØÐØˆOÝ�ŠØSØñ	
ô 	
ð 	
ð ˆtðð ð ð ð HÐGÐGÐG˜HŸOšOÑ-Ô-ÐGÑGÔG€IÝ
ˆ9�~„~˜ÒÐØ˜Œ|Ðàˆ4s*   …B#B) Â)
CÂ3CÃCÃ"DÄDÄ
Dc                 óx   — t           5  t                               ¦   «          ddd¦  «         dS # 1 swxY w Y   dS )z"Clear the registry. **Test-only.**N)r   r   Úclearr6   r"   r   Ú_reset_for_testsrF   ‚   s~   € å	ð ð Ý×ÒÑÔÐðð ð ñ ô ð ð ð ð ð ð ð øøøð ð ð ð ð ð s   ˆ/¯3¶3)r	   r   r
   r   )r
   r   )r   r   r
   r)   )r
   r)   )r
   r   )Ú__doc__Ú
__future__r   ÚloggingÚ	threadingÚtypingr   r   r   Úagent.video_gen_providerr   Ú	getLoggerr   r   r   Ú__annotations__ÚLockr   r   r(   r+   rC   rF   r6   r"   r   ú<module>rP      s  ððð ð ð0 #Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'à 5Ð 5Ð 5Ð 5Ð 5Ð 5à	ˆÔ	˜8Ñ	$Ô	$€ð +-€
Ð ,Ð ,Ð ,Ñ ,Øˆ	ŒÑÔ€ð_ð _ð _ð _ð0/ð /ð /ð /ð,ð ,ð ,ð ,ð0ð 0ð 0ð 0ðfð ð ð ð ð r"   