
    i                         d Z ddlZddlmZmZ ddlmZmZmZ  ej	        e
          Ze G d d                      Z G d d          Z e            ZdS )	a  
Platform Adapter Registry

Allows platform adapters (built-in and plugin) to self-register so the gateway
can discover and instantiate them without hardcoded if/elif chains.

Built-in adapters continue to use the existing if/elif in _create_adapter()
for now.  Plugin adapters register here via PluginContext.register_platform()
and are looked up first -- if nothing is found the gateway falls through to
the legacy code path.

Usage (plugin side):

    from gateway.platform_registry import platform_registry, PlatformEntry

    platform_registry.register(PlatformEntry(
        name="irc",
        label="IRC",
        adapter_factory=lambda cfg: IRCAdapter(cfg),
        check_fn=check_requirements,
        validate_config=lambda cfg: bool(cfg.extra.get("server")),
        required_env=["IRC_SERVER"],
        install_hint="pip install irc",
    ))

Usage (gateway side):

    adapter = platform_registry.create_adapter("irc", platform_config)
    N)	dataclassfield)AnyCallableOptionalc                      e Zd ZU dZeed<   eed<   eegef         ed<   eg ef         ed<   dZ	e
eegef                  ed<   dZe
eegef                  ed<    ee	          Zeed
<   dZeed<   dZe
eg df                  ed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dS )PlatformEntryz3Metadata and factory for a single platform adapter.namelabeladapter_factorycheck_fnNvalidate_configis_connected)default_factoryrequired_env install_hintsetup_fnpluginsourceplugin_nameallowed_users_envallow_all_envr   max_message_lengthFpii_safeu   🔌emojiTallow_update_commandplatform_hint)__name__
__module____qualname____doc__str__annotations__r   r   boolr   r   r   r   listr   r   r   r   r   r   r   r   intr   r   r   r        >/home/ubuntu/.hermes/hermes-agent/gateway/platform_registry.pyr	   r	   &   s        == III JJJ
 seSj)))) r4x    
 8<OXhud{34;;;
 59L(8SE4K01888 t444L$444 L# .2HhxD)*111 FC
 K  sM3   Hd E3 "&$%%%
 M3r)   r	   c                       e Zd ZdZddZdeddfdZdedefdZ	dede
e         fd	Zdee         fd
Zdee         fdZdedefdZdedede
e         fdZdS )PlatformRegistryzCentral registry of platform adapters.

    Thread-safe for reads (dict lookups are atomic under GIL).
    Writes happen at startup during sequential discovery.
    returnNc                     i | _         d S N_entriesselfs    r*   __init__zPlatformRegistry.__init__y   s    24r)   entryc                    |j         | j        v r>| j        |j                  }t                              d|j         |j        |j                   || j        |j         <   t                              d|j         |j                   dS )zRegister a platform adapter entry.

        If an entry with the same name exists, it is replaced (last writer
        wins -- this lets plugins override built-in adapters if desired).
        z,Platform '%s' re-registered (was %s, now %s)z$Registered platform adapter: %s (%s)N)r
   r1   loggerinfor   debug)r3   r5   prevs      r*   registerzPlatformRegistry.register|   sz     :&&=,DKK>
	   %*ej!;UZVVVVVr)   r
   c                 <    | j                             |d          duS )z5Remove a platform entry.  Returns True if it existed.N)r1   popr3   r
   s     r*   
unregisterzPlatformRegistry.unregister   s    }  t,,D88r)   c                 6    | j                             |          S )z!Look up a platform entry by name.)r1   getr>   s     r*   rA   zPlatformRegistry.get   s    }  &&&r)   c                 N    t          | j                                                  S )z'Return all registered platform entries.)r&   r1   valuesr2   s    r*   all_entrieszPlatformRegistry.all_entries   s    DM((**+++r)   c                 H    d | j                                         D             S )z/Return only plugin-registered platform entries.c                 (    g | ]}|j         d k    |S )r   )r   ).0es     r*   
<listcomp>z3PlatformRegistry.plugin_entries.<locals>.<listcomp>   s$    JJJaQX5I5I5I5I5Ir)   )r1   rC   r2   s    r*   plugin_entrieszPlatformRegistry.plugin_entries   s$    JJ4=//11JJJJr)   c                     || j         v S r/   r0   r>   s     r*   is_registeredzPlatformRegistry.is_registered   s    t}$$r)   configc                 l   | j                             |          }|dS |                                s7|j        rd|j         dnd}t                              d|j        |           dS |j        r	 |                    |          s"t                              d|j                   dS n9# t          $ r,}t                              d|j        |           Y d}~dS d}~ww xY w	 |	                    |          }|S # t          $ r.}t          
                    d|j        |d	
           Y d}~dS d}~ww xY w)a  Create an adapter instance for the given platform name.

        Returns None if:
        - No entry registered for *name*
        - check_fn() returns False (missing deps)
        - validate_config() returns False (misconfigured)
        - The factory raises an exception
        Nz ()r   z$Platform '%s' requirements not met%sz&Platform '%s' config validation failedz)Platform '%s' config validation error: %sz.Failed to create adapter for platform '%s': %sT)exc_info)r1   rA   r   r   r7   warningr   r   	Exceptionr   error)r3   r
   rM   r5   hintrH   adapters          r*   create_adapterzPlatformRegistry.create_adapter   s    !!$''=4~~ 	161CK-*----DNN6  
 4 ,,,V44  NN@    4     ?K  
 ttttt
	++F33GN 	 	 	LL@	     44444	s0   25B* *
C 4!CC $C; ;
D3#D..D3)r-   N)r   r    r!   r"   r4   r	   r;   r#   r%   r?   r   rA   r&   rD   rJ   rL   r   rV   r(   r)   r*   r,   r,   r   s7        5 5 5 5Wm W W W W W"9s 9t 9 9 9 9' ' 7 ' ' ' ',T-0 , , , ,K] 3 K K K K%# %$ % % % %03 0 0 0 0 0 0 0 0r)   r,   )r"   loggingdataclassesr   r   typingr   r   r   	getLoggerr   r7   r	   r,   platform_registryr(   r)   r*   <module>r\      s    <  ( ( ( ( ( ( ( ( * * * * * * * * * *		8	$	$ H H H H H H H HV^ ^ ^ ^ ^ ^ ^ ^D %$&&   r)   