Ë
    âß²jîP  ã                   ó  — d Z ddlZddlZddlZddlmZmZ ddlmZm	Z	m
Z
mZ ddlmZ  ej                  e«      Zeee   ef   Ze
g df   Zde
dee   fd„Zdee   fd	„Ze G d
„ d«      «       Z G d„ d«      Z e«       Zy)a¹  Platform adapter registry.

Adapters (built-in and plugin) self-register here so the gateway can discover and
instantiate them without hardcoded if/elif chains. Plugins register via
``PluginContext.register_platform()``; ``GatewayRunner._create_adapter()`` consults the
registry first, then the legacy built-in path. Plugin side: ``platform_registry
.register(PlatformEntry(...))``; gateway side: ``create_adapter("irc", platform_config)``.
é    N)Ú	dataclassÚfield)ÚAnyÚ	AwaitableÚCallableÚOptional©Úhermes_home_keyÚcallbackÚreturnc                 ó\   — 	 ddl m} |j                  | «      S # t        t        f$ r Y yw xY w)zBInfer a plugin profile from code registered outside PluginContext.r   )ÚregistryN)Útools.registryr   Úplugin_scope_for_callableÚImportErrorÚAttributeError)r   Útool_registrys     ú>/home/ubuntu/.hermes/hermes-agent/gateway/platform_registry.pyÚ_plugin_scope_from_callabler      s2   € ðÝ<Ø×6Ñ6°xÓ@Ð@øÜœÐ(ò Ùðús   ‚ ™+ª+c                  ó¸   — 	 t        j                  d«      j                  j                  dd«      xs d} t        t        ddd| i«      «      S # t        $ r Y y w xY w)Né   Ú__name__Ú Ú_Caller© Ú
__module__)ÚsysÚ	_getframeÚ	f_globalsÚgetÚ	Exceptionr   Útype)Úmodule_names    r   Ú_caller_plugin_scoper$   !   s\   € ðÜ—m‘m AÓ&×0Ñ0×4Ñ4°ZÀÓDÒJÈˆô '¤t¨I°r¸LÈ+Ð;VÓ'WÓXÐXøô ò Ùðús   ‚3A Á	AÁAc                   ót  — 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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eege
e   f      ed<   dZeed<   dZ e
eege
e!ee
e   f      f      ed <   dZ"e
eegeez  f      ed!<   dZ#e
eeeeegef      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Úensure_deps_fnÚis_connected)Údefault_factoryÚrequired_envr   Ú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Úapply_yaml_config_fnÚcron_deliver_env_varÚparse_target_ref_fnÚvalidate_target_ref_fnÚsend_message_handler.Ústandalone_sender_fn)&r   r   Ú__qualname__Ú__doc__ÚstrÚ__annotations__r   r   Úboolr+   r   r,   r-   r   Úlistr/   r0   r1   r3   r4   r5   r6   r7   Úintr8   r9   r:   r;   r<   Údictr=   r>   r?   Útupler@   rA   rB   r   r   ó    r   r&   r&   )   sþ  … á=à
ƒIØƒJØ˜s˜e S˜jÑ)Ó)ð �r˜4�xÑ Ó Ø7;€O�X˜h¨ u¨d {Ñ3Ñ4Ó;ð 48€N�H˜X b¨$ hÑ/Ñ0Ó7ð 59€L�(˜8 S E¨4 KÑ0Ñ1Ó8Ù¨tÔ4€L�$Ó4Ø€L�#ÓØ-1€Hˆh�x  D Ñ)Ñ*Ó1Ø€FˆCÓØ€K�ÓØÐ�sÓØ€M�3ÓØÐ˜ÓØ€HˆdÓØ€Eˆ3ÓØ!%Ð˜$Ó%Ø€M�3Óð AEÐ�x ¨¨X°d©^Ð);Ñ <Ñ=ÓDð NRÐ˜( 8¨T°4¨L¸(À4¹.Ð,HÑ#IÑJÓQØ "Ð˜#Ó"ð [_Ð˜ (¨C¨5°(¸5ÀÀhÈsÁmÐASÑ;TÑ2UÐ+UÑ"VÑWÓ^àDHÐ˜H X¨s¨e°T¸C±ZÐ.?Ñ%@ÑAÓHð LPÐ˜( 8¨T°3¸¸SÐ,AÀ3Ð,FÑ#GÑHÓOð FJÐ˜( 8¨C°¸4±Ð,@Ñ#AÑBÔIrL   r&   c                   óx  — e Zd ZdZd#d„Zedefd„«       Zddœdee   d	e	de
eeef   eeef   f   fd
„Zddœdee   ded	e	de
ee   ee   f   fd„Zdee   ddfd„Zddœdededee   ddfd„Zddœdedee   de
ee   ee   f   fd„Zddœdede
ee   ee   f   de
ee   ee   f   dee   de	f
d„Zd$dedee   ddfd„Zddœdedee   de	fd„Zd#d„Zddœdedee   ddfd„Zddœdedee   de	fd„Zde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e   fd„Zdede	fd „Z ded!e!dee!   fd"„Z"y)%ÚPlatformRegistryzªCentral registry of platform adapters. Registrations are serialized; concurrent
    lazy lookups share an in-flight event while the loader runs outside the registry lock.r   Nc                 óÄ   — t        j                  «       | _        i | _        i | _        i | _        i | _        i | _        i | _        i | _	        t        «       | _        i | _        y ©N)Ú	threadingÚRLockÚ_lockÚ_entriesÚ_scoped_entriesÚ	_deferredÚ_scoped_deferredÚ	_inflightÚ_inflight_loadersÚ_inflight_ownersÚsetÚ_cancelled_inflightÚ_consumed_loaders©Úselfs    r   Ú__init__zPlatformRegistry.__init__l   s_   € Ü—_‘_Ó&ˆŒ
Ø24ˆŒð EGˆÔð .0ˆŒØ?AˆÔØ:<ˆŒØ:<ˆÔØ57ˆÔÜ25³%ˆÔ ð ;=ˆÕrL   c                  ó   — t        «       S rP   r	   r   rL   r   Úcurrent_scope_keyz"PlatformRegistry.current_scope_key   s   € äÓ Ð rL   F©ÚcreateÚscoperd   c                ó  — |€| j                   | j                  fS |r8| j                  j                  |i «      | j                  j                  |i «      fS | j                  j                  |i «      | j                  j                  |i «      fS rP   )rT   rV   rU   Ú
setdefaultrW   r    )r_   re   rd   s      r   Ú_scope_mapszPlatformRegistry._scope_mapsƒ   s„   € ð ˆ=Ø—=‘= $§.¡.Ð0Ð0ÙØ×'Ñ'×2Ñ2°5¸"Ó=¸t×?TÑ?T×?_Ñ?_Ð`eÐgiÓ?jÐjÐjØ×#Ñ#×'Ñ'¨¨rÓ2°D×4IÑ4I×4MÑ4MÈeÐUWÓ4XÐXÐXrL   r'   c                óú   — | j                  ||¬«      \  }}|j                  |«      }|j                  |«      }|€>|€<| j                  j                  ||f«      xs | j                  j                  ||f«      }||fS )zN(entry, loader) for *name*; the loader falls back to in-flight, then consumed.rc   )rh   r    rY   r]   )r_   re   r'   rd   ÚentriesÚdeferredÚentryÚloaders           r   Ú_registration_statez$PlatformRegistry._registration_stateŒ   s„   € ð !×,Ñ,¨U¸6Ð,ÓBÑˆ�Ø—‘˜DÓ!ˆØ—‘˜dÓ#ˆØˆ=˜V˜^Ø×+Ñ+×/Ñ/°¸°Ó>ÒkÀ$×BXÑBX×B\ÑB\Ð^cÐeiÐ]jÓBkˆFØ�fˆ}ÐrL   c                 óŽ   — |�| j                   | j                  fndD ]&  }|j                  |«      rŒ|j                  |d «       Œ( y )Nr   )rU   rW   r    Úpop)r_   re   Úmapss      r   Ú_prune_scopezPlatformRegistry._prune_scope—   sC   € ØEJÐEV�T×)Ñ)¨4×+@Ñ+@ÑAÐ\^ò 	&ˆDØ—8‘8˜E•?Ø—‘˜ Õ%ñ	&rL   )re   rm   c                óÀ   — | j                   5  | j                  |d¬«      \  }}| j                  j                  ||fd«       ||vr|||<   ddd«       y# 1 sw Y   yxY w)z£Register a lazy loader (imports the plugin module, which must call :meth:`register`);
        runs at most once, on first lookup; a concrete registration drops it.Trc   N)rS   rh   r]   rp   )r_   r'   rm   re   rj   rk   s         r   Úregister_deferredz"PlatformRegistry.register_deferredž   se   € ð �Z‰Zñ 	(Ø $× 0Ñ 0°¸tÐ 0Ó DÑˆG�XØ×"Ñ"×&Ñ&¨¨t }°dÔ;Ø˜7Ñ"Ø!'�˜‘÷		(÷ 	(ñ 	(ús   �>AÁAc                ój   — | j                   5  | j                  ||«      cddd«       S # 1 sw Y   yxY w)z²Concrete and deferred state for *name* without resolving it, so the plugin ledger can
        restore a deferred loader displaced by a concrete registration without importing it.N)rS   rn   ©r_   r'   re   s      r   Úsnapshot_registrationz&PlatformRegistry.snapshot_registration§   s0   € ð
 �Z‰Zñ 	9Ø×+Ñ+¨E°4Ó8÷	9÷ 	9ò 	9ús   �)©2ÚcurrentÚpreviousc                óÔ  — | j                   5  | j                  ||d¬«      \  }}||d   us||d   ur
	 ddd«       y||f}t        | j                  |«      |«      D ]  \  }}	|	€|j	                  |d«       Œ|	||<   Œ! || j
                  v r| j                  j                  |«       | j                  j	                  |d«       | j                  |«       	 ddd«       y# 1 sw Y   yxY w)z�Restore a registration if its full state is still *current* (CAS): a later
        registration is never removed, and deferred loaders are part of the state.Trc   r   é   NF)
rS   rn   Úziprh   rp   rX   r\   Úaddr]   rr   )
r_   r'   rx   ry   re   rl   rm   Úload_keyÚmappingÚvalues
             r   Úrestore_registrationz%PlatformRegistry.restore_registration¯   sô   € ð �Z‰Zñ 	Ø ×4Ñ4°U¸DÈÐ4ÓN‰MˆE�6Ø˜G A™JÑ&¨&¸À¹
Ñ*BØ÷	ð 	ð ˜t�}ˆHÜ"% d×&6Ñ&6°uÓ&=¸xÓ"Hò *‘�˜Ø�=Ø—K‘K  dÕ+à$)�G˜D’Mð	*ð
 ˜4Ÿ>™>Ñ)Ø×(Ñ(×,Ñ,¨XÔ6Ø×"Ñ"×&Ñ& x°Ô6Ø×Ñ˜eÔ$Ø÷	÷ 	ñ 	ús   �'C½BCÃC'c                 ót  — d}d}| j                   5  |xs | j                  «       }| j                  |«      \  }}||f}d|f}	| j                  j	                  |«      }
|}|
€||vr|j                  |d«      }|
€A|€?||vr;|	}| j                  j	                  |	«      }
|
€| j                  j                  |d«      }|
€W|�Ut        j                  «       }
|
| j                  |<   || j                  |<   t        j                  «       | j                  |<   d}|
€
	 ddd«       y|sP| j                  j	                  |«      t        j                  «       k(  r t        j                  d|«       	 ddd«       yddd«       |s#
j                  «        | j                  |«       y	  |«        | j                   5  | j"                  v }| j                  |d   «      \  }}|s||vr||vr|| j$                  |<   | j                  j                  |d«       | j                  j                  |d«       | j                  j                  |d«       | j"                  j'                  |«       
j)                  «        ddd«       r| j                  |«       yy# 1 sw Y   �ŒxY w# t         $ r$}t        j                  d||d¬«       Y d}~�Œd}~ww xY w# 1 sw Y   Œ\xY w# | j                   5  | j"                  v }| j                  |d   «      \  }}|s||vr||vr|| j$                  |<   | j                  j                  |d«       | j                  j                  |d«       | j                  j                  |d«       | j"                  j'                  |«       
j)                  «        ddd«       w # 1 sw Y   w xY wxY w)z5Run the deferred loader for *name* if one is pending.NFTz:Deferred platform '%s' recursively requested while loadingz)Deferred load of platform '%s' failed: %s©Úexc_infor   )rS   rb   rh   rX   r    rp   rV   rQ   ÚEventrY   Ú	get_identrZ   ÚloggerÚwarningÚwaitÚ_resolver!   r\   r]   Údiscardr[   )r_   r'   re   rm   Ú	is_loaderÚactive_scoperj   rk   Ú
scoped_keyÚ
global_keyÚeventr~   ÚeÚwas_cancelleds                 r   rŠ   zPlatformRegistry._resolveÅ   s{  € à$(ˆØˆ	Ø�Z‰Zñ 	Ø Ò< D×$:Ñ$:Ó$<ˆLØ $× 0Ñ 0°Ó >ÑˆG�XØ&¨Ð-ˆJØ ˜ˆJØ—N‘N×&Ñ& zÓ2ˆEØ!ˆHØˆ} ¨WÑ!4Ø!Ÿ™ d¨DÓ1�Øˆ}  °DÀÑ4GØ%�ØŸ™×*Ñ*¨:Ó6�Ø�=Ø!Ÿ^™^×/Ñ/°°dÓ;�FØˆ} Ð!3Ü!Ÿ™Ó)�Ø+0�—‘˜xÑ(Ø39�×&Ñ& xÑ0Ü2;×2EÑ2EÓ2G�×%Ñ% hÑ/Ø �	Øˆ}Ø÷+	ð 	ñ,  ×!6Ñ!6×!:Ñ!:¸8Ó!DÌ	×H[ÑH[ÓH]Ò!]Ü—‘Ð[Ð]aÔbØ÷1	÷ 	ð 	ñ2 Ø�J‰JŒLð �M‰M˜$ Ô-Øð	ÙŒHð —‘ñ 	Ø (¨D×,DÑ,DÐ D�Ø$(×$4Ñ$4°X¸a±[Ó$AÑ!�˜Ù$¨°WÑ)<ÀÈXÑAUØ7=�D×*Ñ*¨8Ñ4Ø—‘×"Ñ" 8¨TÔ2Ø×&Ñ&×*Ñ*¨8°TÔ:Ø×%Ñ%×)Ñ)¨(°DÔ9Ø×(Ñ(×0Ñ0°Ô:Ø—	‘	”÷	ñ Ø�M‰M˜$ Õ-ð ÷]	ñ 	ûôB ò 	`Ü�N‰NÐFÈÈaÐZ^ˆN×_Ò_ûð	`ú÷	ð 	û�—‘ñ 	Ø (¨D×,DÑ,DÐ D�Ø$(×$4Ñ$4°X¸a±[Ó$AÑ!�˜Ù$¨°WÑ)<ÀÈXÑAUØ7=�D×*Ñ*¨8Ñ4Ø—‘×"Ñ" 8¨TÔ2Ø×&Ñ&×*Ñ*¨8°TÔ:Ø×%Ñ%×)Ñ)¨(°DÔ9Ø×(Ñ(×0Ñ0°Ô:Ø—	‘	”÷	÷ 	ñ 	ýsc   ‘DJÄA	JÆJ Æ2B>KÊJÊ	KÊ$KÊ=K ËKËK ËKËN7Ë$B>N+Î"	N7Î+N4Î0N7c                óf   — | j                   5  ||f| j                  v cddd«       S # 1 sw Y   yxY w)z9Whether ownership teardown cancelled an in-flight loader.N)rS   r\   rv   s      r   Úis_deferred_load_cancelledz+PlatformRegistry.is_deferred_load_cancelledú   s0   € à�Z‰Zñ 	=Ø˜4�= D×$<Ñ$<Ð<÷	=÷ 	=ò 	=ús   �'§0c                 ó®  — | j                  «       }| j                  5  | j                  |«      \  }}t        |«      }t        | j                  «      }| j
                  D ]0  \  }}||k(  r|j                  |«       Œ|�Œ |j                  |«       Œ2 	 ddd«       g t        «      ¢t        «      ¢­D ]  }| j                  ||«       Œ y# 1 sw Y   Œ:xY w)z„Run every pending deferred loader (only ``all_entries``/``plugin_entries`` call this;
        CLI chat never iterates the full set).N)	rb   rS   rh   r[   rV   rX   r}   ÚsortedrŠ   )r_   r�   rT   Úscoped_deferredÚscoped_namesÚglobal_namesÚinflight_scoper'   s           r   Ú_resolve_allzPlatformRegistry._resolve_allÿ   sÑ   € ð ×-Ñ-Ó/ˆØ�Z‰Zñ 	+Ø(,×(8Ñ(8¸Ó(FÑ%ˆH�oÜ˜Ó/ˆLÜ˜tŸ~™~Ó.ˆLØ(,¯©ò +Ñ$� Ø! \Ò1Ø ×$Ñ$ TÕ*Ø#Ñ+Ø ×$Ñ$ TÕ*ñ	+÷		+ð C”f˜\Ó*ÐB¬V°LÓ-AÑBò 	.ˆDØ�M‰M˜$ Õ-ñ	.÷	+ð 	+ús   �A CÁ>CÃCrl   c                ó¦  — | j                   5  |€G|j                  dk(  r8t        «       xs, t        |j                  «      xs t        |j
                  «      }| j                  |d¬«      \  }}| j                  j                  ||j                  fd«       |j                  |j                  d«       |j                  |j                  «      }|�6t        j                  d|j                  |j                  |j                  «       |||j                  <   t        j                  d|j                  |j                  «       ddd«       y# 1 sw Y   yxY w)zCRegister a platform adapter entry (last writer wins on name clash).Nr2   Trc   z,Platform '%s' re-registered (was %s, now %s)z$Registered platform adapter: %s (%s))rS   r3   r$   r   r)   r*   rh   r]   rp   r'   r    r‡   ÚinfoÚdebug)r_   rl   re   rj   rk   Úprevs         r   ÚregisterzPlatformRegistry.register  s  € à�Z‰Zñ 	[Øˆ} §¡°Ò!9ä(Ó*ò CÜ2°5×3HÑ3HÓIòCä2°5·>±>ÓBð ð !%× 0Ñ 0°¸tÐ 0Ó DÑˆG�XØ×"Ñ"×&Ñ&¨¨u¯z©zÐ':¸DÔAØ�L‰L˜Ÿ™ TÔ*Ø—;‘;˜uŸz™zÓ*ˆDØÐÜ—‘ÐJÈEÏJÉJÐX\×XcÑXcÐej×eqÑeqÔrØ"'ˆG�E—J‘JÑÜ�L‰LÐ?ÀÇÁÈUÏ\É\ÔZ÷	[÷ 	[ñ 	[ús   �D1EÅEc                ó¾  — | j                   5  |�|n	t        «       }|xs | j                  «       }| j                  |«      \  }}|€||v s||v rB|j	                  |d«       |j	                  |d«      du}| j                  |«       |cddd«       S | j                  j	                  |d«       | j                  j	                  |d«      ducddd«       S # 1 sw Y   yxY w)z4Remove a platform entry. Returns True if it existed.N)rS   r$   rb   rh   rp   rr   rV   rT   )r_   r'   re   Úinferred_scoper�   rj   rk   Úremoveds           r   Ú
unregisterzPlatformRegistry.unregister$  sÖ   € à�Z‰Zñ 
	=Ø&+Ð&7™UÔ=QÓ=SˆNØ)ÒE¨T×-CÑ-CÓ-EˆLØ $× 0Ñ 0°Ó >ÑˆG�XØÐ)¨T°W©_ÀÈÑ@PØ—‘˜T 4Ô(Ø!Ÿ+™+ d¨DÓ1¸Ð=�Ø×!Ñ! ,Ô/Ø÷
	=ñ 
	=ð �N‰N×Ñ˜t TÔ*Ø—=‘=×$Ñ$ T¨4Ó0¸Ð<÷
	=÷ 
	=ò 
	=ús   �A9CÂ9CÃCc                 óº   — | j                  |«      \  }}||v xsB || j                  vxr || j                  v xs" ||f| j                  v xs d|f| j                  v S )zJTrue when a lookup of *name* must run/await a deferred loader (lock held).N)rh   rT   rV   rX   )r_   re   r'   rT   rk   s        r   Ú_load_pendingzPlatformRegistry._load_pending2  so   € à!×-Ñ-¨eÓ4Ñˆ�(à�HÐò Q ¨T¯]©]Ð!:Ò!U¸tÀtÇ~Á~Ð?Uò QØ�tˆ} §¡Ð.òQØ37¸°,À$Ç.Á.Ð2Pð	
rL   c                 ó¬  — | j                  «       }| j                  5  | j                  |«      \  }}||vxr | j                  ||«      }ddd«       r| j	                  ||«       | j                  5  | j                  |«      \  }}|j                  |«      xs | j                  j                  |«      cddd«       S # 1 sw Y   ŒuxY w# 1 sw Y   yxY w)z!Look up a platform entry by name.N)rb   rS   rh   r¦   rŠ   r    rT   )r_   r'   re   rj   rV   Úneeds_resolves         r   r    zPlatformRegistry.get:  sÏ   € à×&Ñ&Ó(ˆØ�Z‰Zñ 	TØ!%×!1Ñ!1°%Ó!8ÑˆG�YØ ¨Ð/ÒS°D×4FÑ4FÀuÈdÓ4SˆM÷	Tñ Ø�M‰M˜$ Ô&Ø�Z‰Zñ 	@Ø!%×!1Ñ!1°%Ó!8ÑˆG�YØ—;‘;˜tÓ$Ò?¨¯©×(9Ñ(9¸$Ó(?÷	@ñ 	@÷	Tð 	Tú÷
	@ð 	@ús   �-B>Á2AC
Â>CÃ
Cc                 ó  — | j                  «        | j                  5  t        i | j                  ¥| j                  j                  | j                  «       i «      ¥j                  «       «      cddd«       S # 1 sw Y   yxY w)z'Return all registered platform entries.N)r›   rS   rH   rT   rU   r    rb   Úvaluesr^   s    r   Úall_entrieszPlatformRegistry.all_entriesF  sk   € à×ÑÔØ�Z‰Zñ 	nÜÐc˜4Ÿ=™=Ðc¨D×,@Ñ,@×,DÑ,DÀT×E[ÑE[ÓE]Ð_aÓ,bÐc×jÑjÓlÓm÷	n÷ 	nò 	nús   �AA6Á6A?c                 óh   — | j                  «       D �cg c]  }|j                  dk(  sŒ|‘Œ c}S c c}w )z/Return only plugin-registered platform entries.r2   )r«   r3   )r_   r‘   s     r   Úplugin_entrieszPlatformRegistry.plugin_entriesL  s*   € à×+Ñ+Ó-ÖF�a°·±¸XÓ1E’ÒFÐFùÒFs   “/¨/c                 ó8  — | j                   5  | j                  | j                  «       «      \  }}|j                  «       |j                  «       z  | j                  j                  «       z  | j
                  j                  «       z  cddd«       S # 1 sw Y   yxY w)z€Concrete and deferred names (current profile scope AND process-global, like
        ``is_registered``) without loading adapters.N)rS   rh   rb   ÚkeysrT   rV   )r_   rj   rk   s      r   Úregistered_namesz!PlatformRegistry.registered_namesP  sz   € ð �Z‰Zñ 	cØ $× 0Ñ 0°×1GÑ1GÓ1IÓ JÑˆG�XØ—<‘<“> H§M¡M£OÑ3°d·m±m×6HÑ6HÓ6JÑJÈTÏ^É^×M`ÑM`ÓMbÑb÷	c÷ 	cò 	cús   �A9BÂBc                 óÞ   — | j                   5  | j                  «       }| j                  |«      \  }}||v xs" || j                  v xs | j	                  ||«      cd d d «       S # 1 sw Y   y xY wrP   )rS   rb   rh   rT   r¦   )r_   r'   re   rj   rV   s        r   Úis_registeredzPlatformRegistry.is_registeredW  sp   € ð �Z‰Zñ 	_Ø×*Ñ*Ó,ˆEØ!%×!1Ñ!1°%Ó!8ÑˆG�YØ˜7�?Ò^ d¨d¯m©mÐ&;Ò^¸t×?QÑ?QÐRWÐY]Ó?^÷	_÷ 	_ò 	_ús   �AA#Á#A,Úconfigc                 ó  ‡— | j                  |«      Š‰€ydt        g t        f   dt        dt        fˆfd„} |‰j
                  d«      }|s?‰j                  �3t        j                  d‰j                  «        |‰j                  d«      }|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)z¥Create an adapter instance for *name*; None when no entry exists, deps are missing
        and cannot be installed, ``validate_config`` fails, or the factory raises.NÚfnÚfailure_msgr   c                 ó”   •— 	 t         | «       «      S # t        $ r+}t        j                  |‰j                  |«       Y d }~yd }~ww xY w)NF)rG   r!   r‡   rˆ   r(   )rµ   r¶   r‘   rl   s      €r   Ú_probez/PlatformRegistry.create_adapter.<locals>._probee  s;   ø€ ðÜ™B›D“zÐ!øÜò Ü—‘˜{¨E¯K©K¸Ô;Üûðús   ƒ “	Aœ!AÁAz!Platform '%s' check_fn raised: %su<   Platform '%s' dependencies missing â€” attempting install...z+Platform '%s' dependency install raised: %sz (ú)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': %sTrƒ   )r    r   r   rE   rG   r*   r,   r‡   r�   r(   r0   rˆ   r+   r!   r)   Úerror)r_   r'   r³   r¸   Údeps_okÚhintr‘   rl   s          @r   Úcreate_adapterzPlatformRegistry.create_adapter_  sn  ø€ ð —‘˜“ˆØˆ=Øð	”x ¤C Ñ(ð 	´sð 	¼tõ 	ñ ˜Ÿ™Ð)LÓMˆÙ˜5×/Ñ/Ð;ô �K‰KÐVÐX]×XcÑXcÔdÙ˜U×1Ñ1Ð3`ÓaˆGÙØ16×1CÒ1C�R˜×*Ñ*Ð+¨1Ñ-ÈˆDÜ�N‰NÐAÀ5Ç;Á;ÐPTÔUØØ× Ñ Ð,ðØ×,Ñ,¨VÔ4Ü—N‘NÐ#KÈUÏ[É[ÔYØð 5ð	Ø×(Ñ(¨Ó0Ð0øô	 ò Ü—‘ÐJÈEÏKÉKÐYZÔ[Üûðûô
 ò 	Ü�L‰LÐIÈ5Ï;É;ÐXYÐdhˆLÔiÜûð	ús0   Ã1D ÄE Ä	EÄ(!EÅEÅ	FÅ#FÆF)r   NrP   )#r   r   rC   rD   r`   ÚstaticmethodrE   rb   r   rG   rK   rJ   r&   Ú_Loaderrh   rn   rr   rt   rw   r�   rŠ   r”   r›   r    r¤   r¦   r    rH   r«   r­   r[   r°   r²   r   r½   r   rL   r   rN   rN   h   sÍ  „ ñ^ó=ð& ð!˜sò !ó ð!ð 7<òYØ˜c‘]ðYØ/3ðYà	ˆt�C˜Ð&Ñ'¨¨c°7¨lÑ);Ð;Ñ	<óYð BGò	Ø˜c‘]ð	Ø*-ð	Ø:>ð	à	ˆx˜Ñ&¨°Ñ(9Ð9Ñ	:ó	ð& (¨3¡-ð &°Dó &ð W[ò ( cð (°7ð (ÀhÈsÁmð (Ð_có (ð 48ò9Øð9Ø#+¨C¡=ð9à	ˆx˜Ñ&¨°Ñ(9Ð9Ñ	:ó9ð `dòØðØ"'¨°Ñ(?ÀÈ'ÑARÐ(RÑ"Sðà˜ Ñ/°¸'Ñ1BÐBÑCðàOWÐX[É}ðð 
óñ,3.˜Sð 3.¨°#©ð 3.À$ó 3.ðj OSò =¨sð =¸hÀs¹mð =ÐW[ó =ó
.ð$ HLò [˜mð [°xÀ±}ð [ÐPTó [ð& ?Cò =˜sð =¨h°s©mð =Àtó =ð
 3ð 
¨cð 
°dó 
ð
@˜ð 
@ ¨Ñ 7ó 
@ðn˜T -Ñ0ó nðG  ]Ñ 3ó Gðc # c¡(ó cð_ #ð _¨$ó _ð" 3ð "°ð "¸À¹ô "rL   rN   )rD   Úloggingr   rQ   Údataclassesr   r   Útypingr   r   r   r   Úhermes_constantsr
   Ú	getLoggerr   r‡   rK   rE   Ú_LoadKeyr¿   r   r$   r&   rN   Úplatform_registryr   rL   r   ú<module>rÇ      s²   ðñó Û 
Û ß (ß 5Ó 5å ,à	ˆ×	Ñ	˜8Ó	$€à�˜#‘ Ð#Ñ$€Ø
�2�t�8Ñ
€ð¨(ð °xÀ±}ó ðY˜h s™mó Yð ÷;Jð ;Jó ð;J÷|Yñ Yñz %Ó&Ñ rL   