
    
Bj#                         d Z ddlZddlmZmZ ddlmZmZmZm	Z	  ej                  e      Ze G d d             Z G d d      Z e       Zy)	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	Awaitable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Ze
eg e
e   f      ed<   dZeed<   dZe
edee   f      ed<   y) 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env_enablement_fncron_deliver_env_var.standalone_sender_fn) __name__
__module____qualname____doc__str__annotations__r   r   boolr   r   r   r   listr   r   r   r   r   r   r   r   intr   r   r   r   r    dictr!   r"   r        >/home/ubuntu/.hermes/hermes-agent/gateway/platform_registry.pyr
   r
   &   sd   = I J
 seSj)) r4x  
 8<OXhud{34;
 59L(8SE4K018 t4L$4 L# .2HhxD)*1 FC
 K  sM3   Hd E3 "&$%
 M3 AExXd^); <=D !##"" FJ(8C4,@#ABIr.   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y)PlatformRegistryzCentral registry of platform adapters.

    Thread-safe for reads (dict lookups are atomic under GIL).
    Writes happen at startup during sequential discovery.
    returnNc                     i | _         y N_entriesselfs    r/   __init__zPlatformRegistry.__init__   s	    24r.   entryc                 Z   |j                   | j                  v rO| j                  |j                      }t        j                  d|j                   |j                  |j                         || j                  |j                   <   t        j                  d|j                   |j                         y)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   r6   loggerinfor   debug)r8   r:   prevs      r/   registerzPlatformRegistry.register   sw     ::&==,DKK>

	 %*ejj!;UZZVr.   r   c                 >    | j                   j                  |d      duS )z5Remove a platform entry.  Returns True if it existed.N)r6   popr8   r   s     r/   
unregisterzPlatformRegistry.unregister   s    }}  t,D88r.   c                 8    | j                   j                  |      S )z!Look up a platform entry by name.)r6   getrC   s     r/   rF   zPlatformRegistry.get   s    }}  &&r.   c                 H    t        | j                  j                               S )z'Return all registered platform entries.)r*   r6   valuesr7   s    r/   all_entrieszPlatformRegistry.all_entries   s    DMM((*++r.   c                 |    | j                   j                         D cg c]  }|j                  dk(  s| c}S c c}w )z/Return only plugin-registered platform entries.r   )r6   rH   r   )r8   es     r/   plugin_entrieszPlatformRegistry.plugin_entries   s.    ==//1JaQXX5IJJJs   99c                     || j                   v S r4   r5   rC   s     r/   is_registeredzPlatformRegistry.is_registered   s    t}}$$r.   configc                 f   | j                   j                  |      }|y|j                         s@|j                  rd|j                   dnd}t        j                  d|j                  |       y|j                  4	 |j                  |      s!t        j                  d|j                         y	 	 |j                  |      }|S # t        $ r+}t        j                  d|j                  |       Y d}~yd}~ww xY w# t        $ r-}t        j                  d|j                  |d	
       Y d}~y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)r6   rF   r   r   r<   warningr   r   	Exceptionr   error)r8   r   rO   r:   hintrK   adapters          r/   create_adapterzPlatformRegistry.create_adapter   s'    !!$'=~~161C1CR**+1-DNN6
   ,,,V4NN@   5
	++F3GN  ?KK
   	LL@	   	s0   <1C 0C: 	C7!C22C7:	D0#D++D0)r2   N)r#   r$   r%   r&   r9   r
   r@   r'   r)   rD   r   rF   r*   rI   rL   rN   r   rX   r-   r.   r/   r1   r1      s    5Wm W W"9s 9t 9' ' 7 ',T-0 ,K] 3 K%# %$ %03 0 0 0r.   r1   )r&   loggingdataclassesr   r   typingr   r   r   r   	getLoggerr#   r<   r
   r1   platform_registryr-   r.   r/   <module>r^      sb   <  ( 5 5			8	$ hJ hJ hJV^ ^D %& r.   