+
    iHàjZ#  ã                  óÖ   € R t ^ RIHt ^ RIt^ RIt^ RIHtHtHtH	t	H
t
HtHtHt ^ RIHtHt ]! R4      tR R lt ! R R	]
],          4      tR
]P(                  RR/R R lltR R ltR# )a�  Shared engine behind the ``agent.*_registry`` provider registries.

Every pluggable-backend registry has the same shape: a global name->provider map
plus per-profile *scoped* maps (multiplexed gateways), a lock, registration with
re-registration logging, and the snapshot/restore pair :mod:`hermes_cli.plugins`
uses to unwind a plugin. Each ``*_registry`` module instantiates one
:class:`ProviderRegistry` and re-exports its bound methods under the historical
module-level names via :meth:`ProviderRegistry.export`, so ``patch("agent.x_registry.get_provider")``
targets and the ``_providers`` / ``_scoped_providers`` / ``_lock`` test hooks are unchanged.
)ÚannotationsN)ÚAnyÚCallableÚDictÚ	FrozenSetÚGenericÚListÚOptionalÚTypeVar)Úhermes_home_keyÚnormalize_scopeÚPc               ó    € V ^8„  d   QhRRRR/# )é   ÚnameÚstrÚreturn© )Úformats   "Ú</home/ubuntu/.hermes/hermes-agent/agent/provider_registry.pyÚ__annotate__r      s   € ÷  ñ  �Cð  ˜Cñ  ó    c                ó>   € V P                  4       P                  4       # ©N)ÚstripÚlower©r   s   &r   Ú	lower_keyr      s   € Ø�:‰:‹<×ÑÓÐr   c                  ó  € ] tR t^tRtR]P                  R]! 4       RR/R R lltR R	 lt	R
 R lt
RR/R R lltR R R lltRR/R R lltRR/R R lltRR/R R lltRR/R R lltRR/R R lltR R ltR R ltRtR# )!ÚProviderRegistrya¬  Global + per-scope provider map with plugin snapshot/restore support.

``normalize`` is ``str.strip`` or ``lower_key`` (case-insensitive registries mirror
how their dispatcher normalizes the configured name). ``builtin_names`` are reserved
for in-tree implementations; a collision calls ``on_builtin_collision(key)`` and, if
that returns, skips registration. ``logger`` is the owning module's so record names
stay per-registry.
Ú	normalizeÚbuiltin_namesÚon_builtin_collisionNc               ó4   € V ^8„  d   QhRRRRRRRRR	R
RRRR/# )r   Úlabelr   Úprovider_clsÚtypeÚloggerúlogging.Loggerr    zCallable[[str], str]r!   zfrozenset[str]r"   zOptional[Callable[[str], None]]r   ÚNoner   )r   s   "r   r   ÚProviderRegistry.__annotate__%   sQ   € ÷ Uñ UØðUØ+/ðUØ9GðUà'ðUàDRðUð >ðUð 
ñ	Ur   c               	óJ  € Wn         W n        W0n        W@n        WPn        W`n        / V n        / V n        ^ V n        / V n	        \        P                  ! 4       V n        VP                  4       '       d	   Wn        R# V^ ,          P                  4       VR,          ,           V n        R# )é    :é   NNN)r$   r%   r'   r    r!   Ú_on_builtin_collisionÚ
_providersÚ_scoped_providersÚ_generationÚ_scoped_generationsÚ	threadingÚLockÚ_lockÚisupperr   Ú
_log_label)Úselfr$   r%   r'   r    r!   r"   s   &$$$$$$r   Ú__init__ÚProviderRegistry.__init__%   s|   € ð
 Œ
Ø(ÔØŒØ"ŒØ*ÔØ%9Ô"Ø(*ˆŒØ:<ˆÔØˆÔØ35ˆÔ Ü—^’^Ó%ˆŒ
à#(§=¡=§?¢?˜%Ž¸¸a½¿¹Ó8HÈ5ÐQSÍ9Õ8TˆŽr   c               ó$   € V ^8„  d   QhRRRRRR/# )r   ÚscopeúOptional[str]ÚcreateÚboolr   údict[str, P]r   )r   s   "r   r   r*   8   s!   € ÷ 5ñ 5˜]ð 5°tð 5Àñ 5r   c               	ó¸   € \        V4      pVf   V P                  # V'       d   V P                  P                  V/ 4      # V P                  P	                  V/ 4      # r   )r   r/   r0   Ú
setdefaultÚget)r8   r<   r>   s   &&$r   Ú_targetÚProviderRegistry._target8   sP   € Ü Ó&ˆØŠ=Ø—?‘?Ð"ßØ×)Ñ)×4Ñ4°U¸BÓ?Ð?Ø×%Ñ%×)Ñ)¨%°Ó4Ð4r   c               ó    € V ^8„  d   QhRRRR/# )r   r<   r=   r   r)   r   )r   s   "r   r   r*   @   s   € ÷ Yñ Y˜=ð Y¨Tñ Yr   c                	óº   € \        V4      pVf   V ;P                  ^,          un        R # V P                  P                  V^ 4      ^,           V P                  V&   R # r   )r   r1   r2   rC   ©r8   r<   s   &&r   Ú_bumpÚProviderRegistry._bump@   sL   € Ü Ó&ˆØŠ=Ø×Ò Õ!×à.2×.FÑ.F×.JÑ.JÈ5ÐRSÓ.TÐWXÕ.XˆD×$Ñ$ UÓ+r   r<   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úproviderr   r<   r=   r   r)   r   )r   s   "r   r   r*   G   s!   € ÷ ñ  ð ¨mð Àtñ r   c          
     óö  € \        WP                  4      '       gb   V P                  P                  ^ ,          R9   d   RMRp\        RV RV P                  P                   R\	        V4      P                   24      hVP
                  p\        V\        4      '       d   VP                  4       '       g   \        V P                   R24      hV P                  V4      pWPP                  9   d"   V P                  e   V P                  V4       R# V P                  ;_uu_ 4        V P                  VR	R
7      pVP                  V4      pWV&   V P!                  V4       RRR4       Xe@   V P"                  P%                  V P                   R2V\	        V4      P                  4       R# V P"                  P%                  RV P&                   R2V\	        V4      P                  4       R#   + '       g   i     L“; i)zGRegister a provider; same-name re-registration overwrites (hot reload).ÚAEIOUÚanÚazregister_provider() expects Ú z instance, got z* provider .name must be a non-empty stringNT©r>   z% provider '%s' re-registered (was %r)zRegistered z provider '%s' (%s))Ú
isinstancer%   Ú__name__Ú	TypeErrorr&   r   r   r   Ú
ValueErrorr$   r    r!   r.   r5   rD   rC   rI   r'   Údebugr7   )r8   rL   r<   ÚarticleÚraw_nameÚkeyÚtargetÚexistings   &&$     r   ÚregisterÚProviderRegistry.registerG   sš  € ä˜(×$5Ñ$5×6Ò6Ø"×/Ñ/×8Ñ8¸Õ;¸wÔF‘dÈCˆGÜØ.¨w¨i°q¸×9JÑ9J×9SÑ9SÐ8Tð U!Ü!% h£×!8Ñ!8Ð 9ð;óð ð —=‘=ˆÜ˜(¤C×(Ò(°·±×0@Ò0@Ü §
¡
˜|Ð+UÐVÓWÐWØ�n‰n˜XÓ&ˆØ×$Ñ$Ô$Ø×)Ñ)Ò5Ø×*Ñ*¨3Ô/ÙØ�Z�Z‹ZØ—\‘\ %°�\Ó5ˆFØ—z‘z #“ˆHØ"�3‰KØ�J‰J�uÔ÷	 ð
 ÒØ�K‰K×ÑØ—:‘:�,ÐCÐDÀcÌ4ÐPXË>×KbÑKböð �K‰K×ÑØ˜dŸo™oÐ.Ð.AÐBÀCÌÈhË×I`ÑI`ö÷ �Zús   Ä#:G(Ç(G8	c               ó    € V ^8„  d   QhRRRR/# )r   r<   r=   r   r@   r   )r   s   "r   r   r*   e   s   € ÷ ñ ˜Mð °\ñ r   c           	     óú   € V P                   ;_uu_ 4        \        V P                  4      pVP                  V P                  P                  \        V4      / 4      4       RRR4       V#   + '       g   i     X# ; i)zBGlobal map overlaid with the active profile's scoped map (a copy).N)r5   Údictr/   Úupdater0   rC   r   )r8   r<   Úmergeds   && r   rc   ÚProviderRegistry.mergede   sX   € à�Z�Z‹ZÜ˜$Ÿ/™/Ó*ˆFØ�M‰M˜$×0Ñ0×4Ñ4´_ÀUÓ5KÈRÓPÔQ÷ ð ˆ÷ ŽZð ˆús   •A
A)Á)A:	c               ó    € V ^8„  d   QhRRRR/# )r   r<   r=   r   zlist[P]r   )r   s   "r   r   r*   l   s   € ÷ Iñ I }ð IÀñ Ir   c               óX   € \        V P                  V4      P                  4       R R7      # )z0Return all registered providers, sorted by name.c                ó   € V P                   # r   r   )Úps   &r   Ú<lambda>Ú1ProviderRegistry.list_providers.<locals>.<lambda>n   s   € ÀÇÂr   )rZ   )Úsortedrc   ÚvaluesrH   s   &$r   Úlist_providersÚProviderRegistry.list_providersl   s"   € ä�d—k‘k %Ó(×/Ñ/Ó1Ñ7GÔHÐHr   c               ó$   € V ^8„  d   QhRRRRRR/# ©r   r   r   r<   r=   r   úOptional[P]r   )r   s   "r   r   r*   p   s!   € ÷ 	ñ 	 ð 	°ð 	Èñ 	r   c               ój  € \        V\        4      '       g   R# V P                  V4      pV P                  ;_uu_ 4        V P                  P                  \        V4      / 4      P                  V4      ;'       g    V P                  P                  V4       uuRRR4       #   + '       g   i     R# ; i)zDReturn the provider registered under *name* (scoped first), or None.N)rS   r   r    r5   r0   rC   r   r/   )r8   r   r<   rZ   s   &&$ r   Úget_providerÚProviderRegistry.get_providerp   s|   € ä˜$¤×$Ò$ÙØ�n‰n˜TÓ"ˆØ�Z�Z‹Zà×&Ñ&×*Ñ*¬?¸5Ó+AÀ2ÓF×JÑJÈ3ÓO÷ ,ð ,Ø—?‘?×&Ñ& sÓ+ð÷ �Z�Z‹Zús   ¾AB!Â!B2	c               ó    € V ^8„  d   QhRRRR/# )r   r<   r=   r   Útupler   )r   s   "r   r   r*   {   s   € ÷ Sñ S¨Mð SÀUñ Sr   c               óÎ   € \        V4      pV P                  ;_uu_ 4        V P                  V P                  P	                  V^ 4      3uuRRR4       #   + '       g   i     R# ; i)z=Cache fingerprint ``(global_generation, scoped_generation)``.N)r   r5   r1   r2   rC   )r8   r<   Úactive_scopes   &$ r   Úregistry_generationÚ$ProviderRegistry.registry_generation{   sC   € ä& uÓ-ˆØ�Z�Z‹ZØ×#Ñ# T×%=Ñ%=×%AÑ%AÀ,ÐPQÓ%RÐR÷ �Z�Z‹Zús    (AÁA$	c               ó$   € V ^8„  d   QhRRRRRR/# rp   r   )r   s   "r   r   r*   �   s'   € ÷ Oñ O¨#ð O¸ð OÐR]ñ Or   c               óÊ   € V P                   ;_uu_ 4        V P                  VRR7      P                  V P                  V4      4      uuRRR4       #   + '       g   i     R# ; i)zGExact-slot lookup (no global fallback) used to detect plugin ownership.FrR   N)r5   rD   rC   r    )r8   r   r<   s   &&$r   Úsnapshot_registrationÚ&ProviderRegistry.snapshot_registration�   s;   € à�Z�Z‹ZØ—<‘< ¨e�<Ó4×8Ñ8¸¿¹ÈÓ9MÓN÷ �Z�Z‹Zús   •1AÁA"	c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# )r   r   r   Úcurrentr   Úpreviousrq   r<   r=   r   r?   r   )r   s   "r   r   r*   †   s4   € ÷ ñ ØðØ"#ðØ/:ðØFSðà	ñr   c               ó®  € V P                  V4      p\        V4      pV P                  ;_uu_ 4        V P                  VRR7      pVP	                  V4      VJd    RRR4       R# Vf   VP                  VR4       MW6V&   V P                  V4       Ve%   V'       g   V P                  P                  VR4       RRR4       R#   + '       g   i     R# ; i)zGRestore *previous* only when *current* is still installed under *name*.TrR   NF)r    r   r5   rD   rC   ÚpoprI   r0   )r8   r   r€   r�   r<   rZ   r[   s   &&&&$  r   Úrestore_registrationÚ%ProviderRegistry.restore_registration†   s¯   € ð �n‰n˜TÓ"ˆÜ Ó&ˆØ�Z�Z‹ZØ—\‘\ %°�\Ó5ˆFØ�z‰z˜#‹ gÓ-Ø÷ ‰Zð ÒØ—
‘
˜3 Õ%à&�s‘Ø�J‰J�uÔØÒ ¯Ø×&Ñ&×*Ñ*¨5°$Ô7÷ ñ ÷ ŽZñ ús   ±*CÁ%7CÂCÃC	c               ó   € V ^8„  d   QhRR/# )r   r   r)   r   )r   s   "r   r   r*   ™   s   € ÷ "ñ " ñ "r   c                ó6  € V P                   ;_uu_ 4        V P                  P                  4        V P                  P                  4        V P                  P                  4        V ;P
                  ^,          un        RRR4       R#   + '       g   i     R# ; i)z(Clear every registration. **Test-only.**N)r5   r/   Úclearr0   r2   r1   )r8   s   &r   Úreset_for_testsÚ ProviderRegistry.reset_for_tests™   s\   € à�Z�Z‹ZØ�O‰O×!Ñ!Ô#Ø×"Ñ"×(Ñ(Ô*Ø×$Ñ$×*Ñ*Ô,Ø×Ò Õ!Õ÷	 �Z�ZŠZús   •A(BÂB	c               ó    € V ^8„  d   QhRRRR/# )r   Ú	namespacezdict[str, Any]r   r)   r   )r   s   "r   r   r*   ¡   s   € ÷ 	
ñ 	
 ð 	
°4ñ 	
r   c                ó  € VP                  V P                  V P                  V P                  V P                  V P
                  V P                  V P                  V P                  V P                  V P                  R7
       R# )z‹Bind the historical module-level API (+ ``_providers``/``_scoped_providers``/
``_lock`` test hooks) into a ``*_registry`` module namespace.)
r/   r0   r5   Úregister_providerrm   rs   r}   r„   ry   Ú_reset_for_testsN)rb   r/   r0   r5   r]   rm   rs   r}   r„   ry   r‰   )r8   rŒ   s   &&r   ÚexportÚProviderRegistry.export¡   si   € ð 	×ÑØ—‘¸$×:PÑ:PÐX\×XbÑXbØ"Ÿm™m¸D×<OÑ<OØ×*Ñ*À$×B\ÑB\Ø!%×!:Ñ!:Ø $× 8Ñ 8È4×K_ÑK_ð 	ö 	
r   )r1   r5   r7   r.   r/   r2   r0   r!   r$   r'   r    r%   r   )rT   Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r   Ú	frozensetr9   rD   rI   r]   rc   rm   rs   ry   r}   r„   r‰   r�   Ú__static_attributes__r   r   r   r   r      s¡   † ñðUà*-¯)©)ðUáU^ÓU`ðUð AE÷Uõ&5õYð¸d÷ ÷<ðI°t÷ Ið	À÷ 	ðS¸D÷ SðOÈ÷ Oð
ØVZ÷õ&"÷	
ñ 	
r   r   ÚlevelÚexc_infoFc               ó0   € V ^8„  d   QhRRRRRRRRR	R
RR
/# )r   rL   r   r'   r(   Úfmtr   r˜   Úintr™   r?   r   r   )r   s   "r   r   r   ­   s<   € ÷ ñ ØðØ)ðØ03ðØ?BðØ^bðà	ñr   c          	     ó¤   €  \        V P                  4       4      #   \         d*   pTP                  Y2T P                  YTR7        Rp?R# Rp?ii ; i)zP``bool(provider.is_available())`` that treats a raising provider as unavailable.)r™   NF)r?   Úis_availableÚ	ExceptionÚlogr   )rL   r'   r›   r˜   r™   Úexcs   &&&$$ r   Úis_available_safer¢   ­   sD   € ðÜ�H×)Ñ)Ó+Ó,Ð,øÜô Ø�
‰
�5˜xŸ}™}¨cˆ
ÔEÝûðús   ‚ ›A¦A
Á
Ac               ó$   € V ^8„  d   QhRRRRRR/# )r   Úsectionr   r'   r(   r   r=   r   )r   s   "r   r   r   ¸   s!   € ÷ ñ  cð °>ð Àmñ r   c                ó
  € Rp ^ RI Hp V! 4       p\        V\        4      '       d   VP	                  V 4      MRp\        V\        4      '       d   VP	                  R4      MRp\        V\
        4      '       d'   VP                  4       '       d   VP                  4       pT'       d!    ^ RI	H
p TP                  4       T8X  d   RpT# T#   \         d   pTP                  RY4        Rp?LLRp?ii ; i  \         d     T# i ; i)z‘Read ``<section>.provider`` from config.yaml, mapping the managed Nous
selection to ``fal`` (the FAL plugin services it via the managed gateway).N)Úload_config_readonlyrL   z*Could not read %s.provider from config: %s)ÚNOUS_MANAGED_PROVIDERÚfal)Úhermes_cli.configr¦   rS   ra   rC   r   r   rŸ   rW   Útools.tool_backend_helpersr§   r   )	r¤   r'   Ú
configuredr¦   ÚcfgÚblockÚrawr¡   r§   s	   &&       r   Úconfigured_provider_namer¯   ¸   sä   € ð !%€JðQÝ:Ù"Ó$ˆÜ$.¨s´D×$9Ò$9�—‘˜Ô ¸tˆÜ'1°%¼×'>Ò'>ˆe�i‰i˜
Ô#ÀDˆÜ�cœ3×Ò C§I¡I§K¢KØŸ™›ˆJ÷ ð	ÝHØ×ÑÓ!Ð%:Ô:Ø"�
ð Ðˆ:Ðøô ô QØ�‰ÐAÀ7×PÑPûðQûô ô 	ØØÐð	ús0   „B
C	 ÂC	 Â(C3 Ã	C0ÃC+Ã+C0Ã3DÄD)r•   Ú
__future__r   Úloggingr3   Útypingr   r   r   r   r   r   r	   r
   Úhermes_constantsr   r   r   r   r   ÚDEBUGr¢   r¯   r   r   r   Ú<module>rµ      s`   ðñ	õ #ã Û ß S× SÓ Sç =áˆCƒL€õ ôO
�w˜q•zô O
ðdØELÇ]Á]ðØej÷÷r   