+
    kHàjÂl  ã                  ó¬  a € 0 t $ R t^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
t
^ RIHt ^ RIHt ^ RIHtHtHtHt ^ RIHt ^ RIHt ]'       d   ^ RIHt ]	P6                  ! ]4      t]! ]4      P>                  t R	t!/ t"R
]#R&   RDt$R]#R&   R R lt%Rt&]PN                  t(]PR                  t*R R lt+R R lt,R R lt-R R lt.R R lt/R R lt0R R lt1R t2R  R! lt3R" R# lt4R$ R% lt5R& R' lt6R( R) lt7R*R/R+ R, llt8RER- R. llt9R/ R0 lt:RER1 R2 llt;R3 R4 lt<R*R5/R6 R7 llt=R*R5/R8 R9 llt> ! R: R;4      t?R< R= lt@R> R? ltARER@ RA lltBRB RC ltCR# )Fu6  Memory provider plugin discovery: bundled ``plugins/memory/<name>/``, user
``$HERMES_HOME/plugins/<name>/``, project ``./.hermes/plugins/<name>/`` (opt-in via
HERMES_ENABLE_PROJECT_PLUGINS), then ``hermes_agent.memory_providers`` entry points.
Precedence is deliberately the REVERSE of PluginManager's later-source-wins:
bundled wins, then user, project, entry point â€” a provider is activated by name
(``memory.provider``, one at a time), so a directory dropped into the working tree
must never shadow a shipped provider. Changing this order is a breaking change.
)ÚannotationsN)ÚPath)ÚSimpleNamespace)ÚListÚOptionalÚTupleÚTYPE_CHECKING)Úcfg_get)Úplugin_loader©ÚMemoryProviderzhermes_agent.memory_providerszdict[str, dict[str, Path]]Ú"_REGISTERED_MEMORY_PROVIDER_SKILLSztuple[str, ...]Ú_NATIVE_WARM_IMPORTSc               ó   € V ^8„  d   QhRR/# )é   Úreturnzdict[str, Path]© )Úformats   "Ú</home/ubuntu/.hermes/hermes-agent/plugins/memory/__init__.pyÚ__annotate__r   '   s   € ÷ Pñ P¨Oñ Pó    c                 óD   € ^ RI Hp  \        P                  V ! 4       / 4      # )é    ©Úhermes_home_key)Úhermes_constantsr   r   Ú
setdefaultr   s    r   Ú"_registered_skills_for_active_homer   '   s   € Ý0ä-×8Ñ8¹Ó9JÈBÓOÐOr   Ú_hermes_user_memoryc               ó   € V ^8„  d   QhRR/# ©r   r   úOptional[Path]r   )r   s   "r   r   r   3   s   € ÷ ñ  .ñ r   c                 óÎ   €  ^ RI Hp  V ! R4      '       g   R# \        P                  ! 4       R,          R,          pVP	                  4       '       d   V# R#   \
         d     R# i ; i)z¢``./.hermes/plugins/`` or None. Gated on HERMES_ENABLE_PROJECT_PLUGINS like the
PluginManager scan: a repo you merely ``cd`` into must not offer a memory backend.)Ú_env_enabledÚHERMES_ENABLE_PROJECT_PLUGINSNz.hermesÚplugins)Úhermes_cli.pluginsr#   r   ÚcwdÚis_dirÚ	Exception)r#   Úds     r   Ú_get_project_plugins_dirr+   3   sU   € ðÝ3áÐ;×<Ò<ÙÜ�HŠH‹J˜Õ" YÕ.ˆØ—H‘H—J’JˆqÐ( DÐ(øÜô Úðús"   ‚A ˜8A ÁA ÁA ÁA$Á#A$c               ó    € V ^8„  d   QhRRRR/# ©r   Úpathr   r   Úboolr   )r   s   "r   r   r   A   s   € ÷ ñ  $ð ¨4ñ r   c                ó"  € V R,          p VP                  4       '       g   R# VP                  RRR7      R,          pRV9   ;'       g    RV9   ;'       g    \        V 4      #   \         d"   p\        P                  R	Y4        R
p?R# R
p?ii ; i)z»Cheap text heuristic (no import): ``__init__.py`` mentions the memory provider contract.
A miss in the first 8 KB falls back to parsing, so a long module docstring cannot hide a provider.ú__init__.pyFÚreplaceú	utf-8-sig©ÚerrorsÚencoding:Ni    NÚregister_memory_providerr   z+Skipping unreadable plugin directory %s: %sN)ÚexistsÚ	read_textÚ_defines_memory_providerÚOSErrorÚloggerÚwarning)r.   Ú	init_fileÚsourceÚexcs   &   r   Ú_is_memory_provider_dirrA   A   s‰   € ð �}Õ$€IðØ×Ñ×!Ò!ÙØ×$Ñ$¨IÀÐ$ÓLÈUÕSˆØ)¨VÑ3×sÐsÐ7GÈ6Ñ7Q×sÐsÔUmÐnrÓUsÐsøÜô Ü�‰ÐDÀdÔPÝûðús(   ‹A" £%A" Á	A" ÁA" Á"BÁ-B	Â	Bc               ó    € V ^8„  d   QhRRRR/# r-   r   )r   s   "r   r   r   O   s   € ÷ ñ  4ð ¨Dñ r   c           
     óì  a€ \        V P                  R4      4       EF¯  p \        P                  ! VP	                  RRR7      4      pR0\        P                  ! T4       UUu0 uFj  p\        T\        P                  4      '       g   K%  TP                   F5  qDP                  R8X  g   K  TP                  '       g   K)  TP                  kK7  	  Kl  	  upp,          o\        P                  ! T4       FÔ  p\        T\        P                  4      '       d8   R\        TP                   RR4      \        TP                   R	R4      39   d     R
# \        T\        P"                  4      '       g   K|  \$        ;QJ d)    T3R lTP&                   4       F  '       g   K   R
M	  RM! T3R lTP&                   4       4      '       g   KÒ    R
# 	  EK²  	  R#   \
        \        \        3 d     EKÐ  i ; iu uppi )a	  Parse (never import) the package's top-level modules for what ``_load_provider_from_dir`` can load:
a ``register_memory_provider(...)`` call or a ``MemoryProvider`` subclass. Unlike the discovery
heuristic, a docstring or comment naming the contract does not count.z*.pyr2   r3   r4   r   r7   ÚattrNÚidTc              3  ón   <"  € T F*  p\        VR R4      ;'       g    \        VRR4      S9   x € K,  	  R# 5i)rD   NrE   )Úgetattr)Ú.0ÚbÚbasess   & €r   Ú	<genexpr>Ú+_defines_memory_provider.<locals>.<genexpr>^   s6   øé € ð 6gÙ[eÐVW”W˜Q ¨Ó-×GÐG´¸¸DÀ$Ó1GÈEÖQÓ[eùs   ƒ5œ5F)ÚsortedÚglobÚastÚparser9   r;   ÚSyntaxErrorÚ
ValueErrorÚwalkÚ
isinstanceÚ
ImportFromÚnamesÚnameÚasnameÚCallrG   ÚfuncÚClassDefÚanyrJ   )r.   ÚmoduleÚtreeÚnÚaÚnoderJ   s   &     @r   r:   r:   O   s‚  ø€ ô ˜Ÿ™ 6Ó*×+ˆð	Ü—9’9˜V×-Ñ-°YÈÐ-ÓUÓVˆDð "Ð"¼¿ºÀ¼ô &c¹°1Ì*ÐUVÔX[×XfÑXf×Jg¤hØ/0¯w¬w¨!¿&¹&ÐDTÑ:Tô '/ØYZ×YaÕYaô '/ a§h¤hÙ/6ñ '/¹ò &cõ cˆä—H’H˜T–NˆDÜ˜$¤§¡×)Ò)Ð.HÜ˜DŸI™I v¨tÓ4´g¸d¿i¹iÈÈtÓ6TðMVô /VãÜ˜$¤§¡×-Ô-·#³#ô 6gØ[_×[eÒ[eó6g·#·#²#ô 6gØ[_×[eÒ[eó6g÷ 3gô 3gãô #ñ ,ñ øô œ¤jÐ1ô 	Ûð	üó&cs)   ¡'GÁ#"G0
Â
G0
Â+G0
Â?G0
ÇG-Ç,G-c               ó    € V ^8„  d   QhRRRR/# )r   Úprovider_dirr   r   r/   r   )r   s   "r   r   r   d   s   € ÷ eñ e˜dð e tñ er   c                ó^   € \         V P                  9   ;'       g    V P                  \         8H  # ©N)Ú_MEMORY_PLUGINS_DIRÚparentsÚparent)rc   s   &r   Ú_is_bundledri   d   s'   € Ü ,×"6Ñ"6Ñ6×dÐd¸,×:MÑ:MÔQdÑ:dÐdr   c               ó$   € V ^8„  d   QhRRRRRR/# )r   rc   r   rW   Ústrr   r   )r   s   "r   r   r   h   s!   € ÷ 8ñ 8˜tð 8¨3ð 8°3ñ 8r   c                óê   € \        V 4      '       d   RV 2# \        P                  ! \        V P	                  4       4      P                  4       4      P                  4       R,          p\         RV RV 2# )zY``plugins.memory.<name>`` for bundled providers, else under the synthetic user namespace.zplugins.memory.:Né   NÚ.Ú	__source_)ri   ÚhashlibÚsha256rk   ÚresolveÚencodeÚ	hexdigestÚ_USER_NAMESPACE)rc   rW   Údigests   && r   Ú_module_namerw   h   se   € ä�<× Ò Ø   Ð'Ð'ä�^Š^œC × 4Ñ 4Ó 6Ó7×>Ñ>Ó@ÓA×KÑKÓMÈcÕR€FÜÐ˜a ˜v Y¨v¨hÐ7Ð7r   c               ó   € V ^8„  d   QhRR/# )r   r   z
list[Path]r   )r   s   "r   r   r   q   s   € ÷ Sñ S˜zñ Sr   c                 óf   € \        4       \        4       3 U u. uF  q '       g   K  V NK  	  up # u up i )z=User then project plugin roots that exist (precedence order).)Ú_get_user_plugins_dirr+   )r*   s    r   Ú_external_source_dirsr{   q   s-   € ä-Ó/Ô1IÓ1KÑLÓRÑL�!ÓPQ�AˆAÑLÑRÐRùÒRs   —	.¥.c               ó   € V ^8„  d   QhRR/# )r   r   zlist[tuple[str, Path]]r   )r   s   "r   r   r   v   s   € ÷ ñ Ð3ñ r   c                 óB  € \         P                  ! \        4       U u. uF  q P                  V 3NK  	  pp V UUu0 uF  w  r#VkK	  	  ppp\	        4        F¼  p\        VP                  4       4       Fœ  p V P                  4       '       g   K  V P                  P                  R4      '       d   K>  V P                  V9  g   KQ  \        V 4      '       g   Kd  VP                  V P                  4       VP                  V P                  V 34       Kž  	  K¾  	  V# u up i u uppi )zW``(name, path)`` for bundled, then user-installed, then project-local; first-seen wins.)Ú_rn   )Ú_loaderÚiter_plugin_dirsrf   rW   r{   rM   Úiterdirr(   Ú
startswithrA   ÚaddÚappend)ÚchildÚdirsrW   r~   ÚseenÚ
source_dirs         r   Ú_iter_provider_dirsr‰   v   sÒ   € ä-4×-EÒ-EÔFYÔ-ZÓ[Ñ-Z E�Z‰Z˜ÓÑ-Z€DÐ[Ù $Ô%¡‘W�T‹D¡€DÑ%Ü+Ö-ˆ
Ü˜J×.Ñ.Ó0Ö1ˆEà—‘—”ØŸ
™
×-Ñ-¨j×9Ô9Ø—J‘J dÖ*Ü+¨E×2Ô2à—‘˜Ÿ™Ô$Ø—‘˜UŸZ™Z¨Ð/Ö0ó 2ñ .ð €Kùò \ùÛ%s
   �DºDc                 óÆ  €  \         P                  P                  4       p \        V R4      '       d    \	        V P                  \        R7      4      # \        V \        4      '       d    \	        V P                  \        . 4      4      # V  Uu. uF  qP                  \        8X  g   K  VNK  	  up# u upi   \         d#   p\        P                  RT4       . u Rp?# Rp?ii ; i)z1Yield pip-installed memory provider entry points.Úselect)Úgroupz+Memory provider entry-point scan failed: %sN)Ú	importlibÚmetadataÚentry_pointsÚhasattrÚlistr‹   ÚENTRY_POINTS_GROUPrT   ÚdictÚgetrŒ   r)   r<   Údebug)ÚepsÚepr@   s      r   Ú_iter_entry_pointsr˜   ‡   sË   € ðÜ× Ñ ×-Ñ-Ó/ˆÜ�3˜×!Ò!Ü˜Ÿ
™
Ô);˜
Ó<Ó=Ð=Ü8BÀ3Ì×8MÒ8MŒt�C—G‘GÔ.°Ó3Ó4ð  	HÑadó  THÑadÐ[]×hpÑhpô  uGñ  iG×TVÐTVÑadñ  THð  	Hùò  THøÜô Ü�‰ÐBÀCÔHØ�	ûðúsB   ‚AB3 Á4B3 ÂB3 Â
B.Â%B.Â+B3 Â.B3 Â3C Â>CÃC ÃC c               ó    € V ^8„  d   QhRRRR/# )r   rW   rk   r   r!   r   )r   s   "r   r   r   “   s   € ÷ Eñ E˜Cð E Nñ Er   c                ó:  € \         V ,          pVP                  4       '       d    VR,          P                  4       '       d   V# \        4        F8  pW ,          pVP                  4       '       g   K#  \	        V4      '       g   K6  Vu # 	  \        \        V 4      4      # )a8  Provider name -> directory: bundled, user, project, then a pip entry point's
package dir. The entry-point case matters because ``config_schema.py`` and
``cli.py`` are read from disk, not imported; without a directory a pip-installed
provider silently loses its dashboard panel and ``hermes <provider>`` commands.r1   )rf   r(   r8   r{   rA   Ú_entry_point_package_dirÚfind_provider_entry_point)rW   Úbundledrˆ   Ú	candidates   &   r   Úfind_provider_dirrŸ   “   s{   € ô
 " DÕ(€GØ‡~�~×Ò˜W }Õ4×<Ñ<×>Ò>ØˆÜ+Ö-ˆ
ØÕ%ˆ	Ø×Ñ×ÔÔ"9¸)×"DÔ"DØÒñ .ô $Ô$=¸dÓ$CÓDÐDr   c               ó   € V ^8„  d   QhRR/# r    r   )r   s   "r   r   r   ¢   s   € ÷ ñ ¨^ñ r   c           	     ó~  € V f   R#  ^ RI Hp V P                  ;'       g    RP                  R4      ^ ,          P	                  4       pV! V4      pV'       g   R# \        V4      pVP                  R8X  d   VP                  # R#   \         d.   p\        P                  R\        T RR4      T4        Rp?R# Rp?ii ; i)	u8  Directory of an entry point's module, resolved WITHOUT importing it (discovery
runs from the dashboard/argparse before a provider is selected; importing every
candidate would run arbitrary code). Only package entry points yield a
directory â€” a bare ``module.py`` has nowhere for a sibling ``config_schema.py``.N)Úresolve_module_originÚ Ú:r1   z4Could not resolve directory for entry point '%s': %srW   Ú?)r&   r¢   ÚvalueÚsplitÚstripr   rW   rh   r)   r<   r•   rG   )Úentry_pointr¢   Úmodule_nameÚoriginr.   r@   s   &     r   r›   r›   ¢   s¤   € ð
 ÒÙðÝ<à"×(Ñ(×.Ð.¨B×5Ñ5°cÓ:¸1Õ=×CÑCÓEˆÙ& {Ó3ˆßÙÜ�F‹|ˆØ"Ÿi™i¨=Ô8ˆt�{‰{ÐB¸dÐBøÜô Ü�‰ÐKÜ˜[¨&°#Ó6¸ô	=åûðús(   ˆB ¡6B Á'B ÂB ÂB<Â"B7Â7B<c               ó   € V ^8„  d   QhRR/# )r   rW   rk   r   )r   s   "r   r   r   ¸   s   € ÷ Nñ N Cñ Nr   c                ó@   a € \        V 3R l\        4        4       R4      # )z;Resolve a provider name to a pip entry point, if installed.c              3  óL   <"  € T F  qP                   S8X  g   K  Vx € K  	  R # 5ire   ©rW   )rH   r—   rW   s   & €r   rK   Ú,find_provider_entry_point.<locals>.<genexpr>º   s   øé € ÐFÑ2˜·g±gÀ±o—’Ó2ùs   ƒ$š
$N)Únextr˜   r¯   s   fr   rœ   rœ   ¸   s   ø€ äÔFÔ0Ô2ÓFÈÓMÐMr   c               ó   € V ^8„  d   QhRR/# )r   r   z	list[str]r   )r   s   "r   r   r   ½   s   € ÷ ñ  Iñ r   c                 óž   € \        4        U Uu0 uF  w  rV kK	  	  pp pVP                  R \        4        4       4       \        V4      # u upp i )u˜   Cheap name-only listing (directory scan + entry-point enumeration, no import or
availability check) â€” safe at module-import time (dashboard dropdown).c              3  ó8   "  € T F  qP                   x € K  	  R # 5ire   r¯   )rH   r—   s   & r   rK   Ú-list_memory_provider_names.<locals>.<genexpr>Á   s   é € Ð8Ñ#7˜R—–Ó#7ùs   ‚)r‰   Úupdater˜   rM   )rW   r~   rV   s      r   Úlist_memory_provider_namesr·   ½   sD   € ô "5Ô!6Ô7Ñ!6‘g�d‹TÑ!6€EÑ7Ø	‡L�LÑ8Ô#5Ô#7Ó8Ô8Ü�%‹=Ðùó 8s   ŽA	c               ó   € V ^8„  d   QhRR/# )r   r   zlist[tuple[str, str, bool]]r   )r   s   "r   r   r   Å   s   € ÷ ñ Ð#>ñ r   c            
     óÌ  € \        4        U Uu. uF6  w  rV \        P                  ! V4      \        P                  ! V3R l4      3NK8  	  pp pV U Uu0 uF  w  p  q0kK
  	  pp p\	        4        Fg  pVP
                  V9  g   K  VP                  VP
                  4       VP                  VP
                  R\        P                  ! V3R l4      34       Ki  	  V# u upp i u upp i )zo``[(name, description, is_available), ...]``; bundled wins on name collisions,
then user directories, then pip.c                ó   € \        V R R7      # ©F©Úregister_skills)Ú_load_provider_from_dir)Úcs   &r   Ú<lambda>Ú+discover_memory_providers.<locals>.<lambda>Ê   s   € Ô4KÈAÐ_dÕ4er   r£   c                ó   € \        V R R7      # r»   )Ú_load_provider_from_entry_point)r—   s   &r   rÀ   rÁ   Ò   s   € Ô'FÀrÐ[`Õ'ar   )r‰   r   Úread_plugin_descriptionÚprobe_availabilityr˜   rW   rƒ   r„   )rW   r…   Úresultsr~   r‡   r©   s         r   Údiscover_memory_providersrÇ   Å   s×   € ô /Ô0ôñ 1‰KˆDð 
Œw×.Ò.¨uÓ5Ü	×	#Ò	#¨UÓ$eÓ	fó	há0ð ñ ñ
 $+Ô+¡7‘Z�T˜1˜aŠD¡7€DÑ+Ü)Ö+ˆØ×Ñ 4Ö'Ø�H‰H�[×%Ñ%Ô&Ø�N‰N˜K×,Ñ,¨b´'×2LÒ2LØ%Óaó3ð ö ñ ,ð €Nùóùó
 ,s   Ž<CÁC r½   c               ó$   € V ^8„  d   QhRRRRRR/# )r   rW   rk   r½   zOptional[bool]r   úOptional[MemoryProvider]r   )r   s   "r   r   r   ×   s'   € ÷ qñ q˜sð q¸ð qÐRjñ qr   c          	     ód  a aaa€ Sf   S \        4       8H  o\        S 4      oS'       d   RM
\        S 4      oS'       g   Sf   \        P	                  RS 4       R# Se,   \        S S4      '       d   \        P                  RS S 4       R# VV VV3R lp\        P                  ! S SVRR\        R7      # )a  Load a MemoryProvider by name (bundled, user, project, then pip entry point);
None if not found or failing to load. Skills register only for the configured
active provider unless ``register_skills`` is explicit, so inspecting inactive
providers leaves no registry side effects.NzHMemory provider '%s' not found in bundled, user plugins, or entry pointszpMemory provider '%s' is disabled via plugins.disabled; run `hermes plugins enable %s` or change memory.provider.c                ó¬   <€ S'       d   \        SSR 7      # ^ RIHp V! RS: 24      pV'       d   \        P	                  RV4       R# \        SSR 7      # )r¼   ©Úin_process_import_refusalzpip-installed memory provider z%sN)r¾   Úhermes_cli.plugin_isolationrÍ   r<   r=   rÃ   )Ú_dirrÍ   Úrefusalr©   rW   rc   r½   s   &  €€€€r   Ú_loadÚ#load_memory_provider.<locals>._loadë   sI   ø€ ßÜ*¨<ÈÔYÐYÝIÙ+Ð.LÈTÉHÐ,UÓVˆßÜ�N‰N˜4 Ô)ÙÜ.¨{ÈOÔ\Ð\r   zMemory providerÚprovider)ÚkindÚnounr<   )	Ú_get_active_memory_providerrŸ   rœ   r<   r•   Ú_explicitly_disabledr=   r   Ú
load_named)rW   r½   rÑ   r©   rc   s   fd @@r   Úload_memory_providerrÙ   ×   s¨   û€ ð
 ÒØÔ"=Ó"?Ñ?ˆä$ TÓ*€Lß&‘$Ô,EÀdÓ,K€Kß˜KÒ/Ü�‰Ð_ÐaeÔfÙØÒÔ$8¸¸|×$LÒ$Lô 	�‰ð 4Ø59¸4ô	Aá÷]ð ]ô ×Ò˜d L°%Ð>OÐV`ÔioÔpÐpr   c               ó    € V ^8„  d   QhRRRR/# )r   rW   úOptional[str]r   r/   r   )r   s   "r   r   r   ø   s   € ÷  ñ  ¨ð  Àñ  r   c                óP  € T ;'       g    \        4       p V '       g   R# ^ RIHpHp V! 4       V8X  d0   \	        \        V 4      ;'       g    \        R4      4      '       g   R# Rp \        V 4      ;p'       d   \        W@4      RJpM!\        V 4      ;pe   VP                  4        RpV'       d%   \         F  p \        P                  ! V4       K  	  V#   \         d    \        P                  RT RR7        LSi ; i  \         d    \        P                  RTRR7        Ko  i ; i)	u*  Import the provider's module (default: the configured ``memory.provider``) WITHOUT
constructing a provider â€” the later ``load_memory_provider`` then hits ``sys.modules``
instead of a fresh native extension load. Exists so ``hermes acp`` can pay the heavy
import (numpy / ML stack) on the main thread before any other thread starts: on Windows
a first-time native import racing another thread's import chain deadlocked
``session/new`` (#58083). False when no provider is configured, the provider is
unknown or its import fails (agent init reports that).F)ÚISOLATION_HOSTÚisolation_modeÚ/NTz*memory provider '%s' warm-up import failed)Úexc_infozwarm-up import of %s skipped)rÖ   rÎ   rÝ   rÞ   ri   rŸ   r   Ú_load_packagerœ   Úloadr)   r<   r•   r   r�   Úimport_module)rW   rÝ   rÞ   Úimportedrc   r©   r]   s   &      r   Úimport_memory_provider_modulerå   ø   s  € ð ×0Ð0Ô.Ó0€DßÙßJÙÓ˜>Ô)´+Ô>OÐPTÓ>U×>bÐ>bÔY]Ð^aÓYb×2cÒ2cÙØ€HðXÜ,¨TÓ2Ð2ˆ<Ö2Ü$ \Ó8ÀÐD‰HÜ6°tÓ<Ð<ˆkÒIØ×ÑÔØˆH÷ ÷ +ˆFðTÜ×'Ò'¨Ö/ñ +ð
 €Oøô ô XÜ�‰ÐAÀ4ÐRVˆÖWðXûô ô TÜ—‘Ð;¸VÈd�×SðTús*   Á% C Â!C Â9C>Ã#C;Ã:C;Ã>#D%Ä$D%c               ó    € V ^8„  d   QhRRRR/# )r   rc   r   rW   rk   r   )r   s   "r   r   r     s   € ÷ ñ  ð ¨Cñ r   c           	     óŠ   € \         P                  ! \        W4      T R\        \	        V 4      '       d   RR7      # \
        R7      # )z­Import the provider package at *provider_dir* under the module name the loader owns
(``plugins.memory.<name>`` bundled, synthetic user namespace otherwise); None on failure.N)rg   r<   Úsynthetic_namespace)r%   zplugins.memory)r   Úload_plugin_modulerw   r<   ri   ru   )rc   rW   s   &&r   rá   rá     sE   € ô ×%Ò%Ü�\Ó(¨,Ø-ÜÜ$/°×$=Ò$=˜Dô	ð ô DSô	ð r   c               ó    € V ^8„  d   QhRRRR/# )r   rW   rk   Ú	submodulerÛ   r   )r   s   "r   r   r   &  s   € ÷ `ñ ` ð `°ñ `r   c                óÜ   € \        V 4      pVf   \        RV : R24      h\        W 4      pVf   \        RV : R24      hV'       d&   \        P                  ! VP
                   RV 24      # T# )aa  The package (or ``<package>.<submodule>``) of whichever copy of provider *name* is installed.

Host-side code (dashboard host-block storage, OAuth routes, doctor, profile clone) used to
``import plugins.memory.<name>.<submodule>``, which only exists for the bundled copy; a
catalog install under ``$HERMES_HOME/plugins/`` loads under the synthetic user namespace,
so those surfaces 500'd/404'd the moment the bundled copy left core. Resolving through
``find_provider_dir`` makes bundled and user-dir copies behave identically. Raises
``ImportError`` when the provider is not installed or lacks the submodule.
úmemory provider z is not installedz failed to importrn   )rŸ   ÚImportErrorrá   r�   rã   Ú__name__)rW   rë   rc   Úpackages   &&  r   Úimport_provider_modulerñ   &  sz   € ô % TÓ*€LØÒÜÐ,¨T©HÐ4EÐFÓGÐGÜ˜LÓ/€GØ‚ÜÐ,¨T©HÐ4EÐFÓGÐGßIRŒ9×"Ò" g×&6Ñ&6Ð%7°q¸¸Ð#DÓEÐ_ÐX_Ð_r   c               ó   € V ^8„  d   QhRR/# )r   r   rÉ   r   )r   s   "r   r   r   9  s   € ÷ ñ Ð(@ñ r   c                óæ   € ^ RI Hp \        V 4       FI  p\        WR4      p\	        V\
        4      '       g   K'  \        W14      '       g   K:  W1Jg   KA   V! 4       u # 	  R#   \         d     K]  i ; i)zTFirst instantiable ``MemoryProvider`` subclass found among *namespace*'s attributes.r   N)Úagent.memory_providerr   ÚdirrG   rT   ÚtypeÚ
issubclassr)   )Ú	namespacer   Ú	attr_namerD   s   &   r   Ú_instantiate_subclassrú   9  s`   € å4ä˜–^ˆ	Ü�y¨TÓ2ˆÜ�dœD×!Ô!¤j°×&FÔ&FÈ4ÕKeðÙ“v’ñ	 $ñ øô ô Úðús   ÁA!Á!A0Á/A0Tc               ó    € V ^8„  d   QhRRRR/# )r   r½   r/   r   rÉ   r   )r   s   "r   r   r   G  s   € ÷ !ñ !ÀTð !ÐUmñ !r   c               óú  € ^ RI Hp V P                  4       p\        W24      '       d   V# \        V\        4      '       d   \        W24      '       d	    V! 4       # \        VR4      '       d^   \        V P                  VR7      pVP                  VP                  \        VRR4      R7       VP                  '       d   VP                  # \        V4      '       dQ    V! 4       p\        WR4      '       d   V#  \        V P                  VR7      pVP                  V4       VP                  # \!        V4      pVf!   \"        P%                  RV P                  4       V#   \         d     ELi ; i  \         d     L„i ; i)uØ   Import a provider entry point and extract the MemoryProvider instance: an
instance, a subclass, a module with ``register(ctx)``, a factory / ``register``
callable, or a namespace holding a subclass â€” in that order.r   Úregisterr¼   Ú__file__N©r?   z3Memory provider entry point '%s' loaded no provider)rô   r   râ   rT   rö   r÷   r)   r�   Ú_ProviderCollectorrW   Úcollectrý   rG   rÓ   ÚcallableÚ	TypeErrorrú   r<   r•   )r©   r½   r   ÚloadedÚ	collectorrÓ   s   &$    r   rÃ   rÃ   G  sL  € õ 5à×ÑÓ€FÜ�&×)Ò)ØˆÜ�&œ$×Ò¤J¨v×$FÒ$Fð	Ù“8ˆOô ˆv�z×"Ò"Ü& {×'7Ñ'7ÈÔYˆ	Ø×Ñ˜&Ÿ/™/´'¸&À*ÈdÓ2SÐÔTØ××ÐØ×%Ñ%Ð%Ü�×Òð	Ù“xˆHÜ˜(×3Ò3Ø�ð 4ô ' {×'7Ñ'7ÈÔYˆ	Ø×Ñ˜&Ô!Ø×!Ñ!Ð!ä$ VÓ,€HØÒÜ�‰ÐJÈK×L\ÑL\Ô]Ø€Oøô+ ô 	Úð	ûô ô 	Ùð	ús$   ÁE ÃE, ÅE)Å(E)Å,E:Å9E:c               ó$   € V ^8„  d   QhRRRRRR/# )r   rc   r   r½   r/   r   rÉ   r   )r   s   "r   r   r   k  s"   € ÷ &ñ &¨$ð &ÀDð &ÐTlñ &r   c               óZ  € V P                   p^ RIHp \        V 4      '       d   RMV! 4       pVe&   \	        W!R7      P                  W@\        W4      4      # \        W4      pVf   R# \        VR4      '       dS   \	        W!R7      p VP                  VP                  VP                  R7       VP                  '       d   VP                  # \#        V4      #   \         dJ   pTP                  f   \        P                  RY'4        Rp?L]\        P!                  RY'4        Rp?LxRp?ii ; i)zMImport a provider module; ``register(ctx)`` first, else a top-level subclass.)Úuser_plugin_hostNr¼   rý   rÿ   zregister() failed for %s: %suv   Memory provider '%s' raised after registering (%s) â€” using the registered provider; later registrations were skipped)rW   rÎ   r  ri   r   Úcollect_in_hostrw   rá   r�   r  rý   rþ   r)   rÓ   r<   r•   r=   rú   )rc   r½   rW   r  ÚhostÚmodr  Úes   &$      r   r¾   r¾   k  s	  € à×Ñ€DÝ<Ü˜|×,Ò,‰4Ñ2BÓ2D€DØÒÜ! $ÔH×XÑXØ¤¨\Ó @óBð 	Bä
˜Ó
+€CØ
‚{Ùäˆs�J×ÒÜ& tÔMˆ	ð	Ø×Ñ˜cŸl™l°3·<±<ÐÔ@ð ××ÐØ×%Ñ%Ð%ä  Ó%Ð%øô ô 	ð ×!Ñ!Ò)Ü—‘Ð;¸T×EÑEä—‘ðVà÷ñ ûð	ús   Â'C ÃD*Ã!$D%Ä
D%Ä%D*c                  ór   € ] tR tRtRtRR/R R lltRR/R	 ltR
 R ltR tR t	R t
R tR R ltR tRtR# )r   i�  zâPlugin context for memory providers: captures ``register_memory_provider``
(the one call the activation path owns) and delegates other ``register_*``
calls to a real ``PluginContext`` so providers have the full plugin surface.r½   Tc               ó    € V ^8„  d   QhRRRR/# )r   rW   rk   r½   r/   r   )r   s   "r   r   Ú_ProviderCollector.__annotate__’  s   € ÷ !ñ !˜Sð !°dñ !r   c               	óH   € Wn         R V n        W n        R V n        R V n        R # re   )rW   rÓ   Ú_register_skillsÚ_contextÚ_hook_source)ÚselfrW   r½   s   &&$r   Ú__init__Ú_ProviderCollector.__init__’  s#   € ØŒ	ØˆŒØ /ÔØˆŒØ ˆÖr   r?   Nc               óš  € ^ RI Hp \        P                  P	                  \        VRR4      4      pT! V P                  V'       d   \        VR7      MT4      V n        V P                  4       P                  pVP                  ;_uu_ 4        VP                  V P                  4       V! V 4       RRR4       R#   + '       g   i     R# ; i)z Run ``register`` with this collector; hooks it registers form the fallback group that
general discovery of the same source replaces (see ``PluginLedgerMixin``).©Ú_hook_source_ofÚ
__module__r£   ©rþ   N)Úhermes_cli.plugins_ledgerr  ÚsysÚmodulesr”   rG   rW   r   r  Ú_plugin_contextÚ_managerÚ_discovery_lockÚ_drop_fallback_hooks)r  rý   r?   r  r]   Úmanagers   &&$   r   r  Ú_ProviderCollector.collect™  s‹   € õ 	>ä—‘—‘¤¨°<ÀÓ!DÓEˆÙ+¨D¯I©I×[a´ÐPVÕ7WÐgmÓnˆÔØ×&Ñ&Ó(×1Ñ1ˆØ×$×$Ó$Ø×(Ñ(¨×):Ñ):Ô;Ù�TŒN÷ %×$×$Ò$ús   Â$B9Â9C
	c               ó    € V ^8„  d   QhRRRR/# )r   rc   r   rª   rk   r   )r   s   "r   r   r  ¥  s   € ÷ ñ °$ð ÀSñ r   c           	     ó  a a€ ^ RI Hp V! S P                  \        \	        VR,          4      R7      4      S n        S P                  4       P                  oR VV 3R llpV! 4        VP                  W#RRS VR7      S n	        S P                  # )	u
  ``collect`` for a provider whose code runs in the plugin host: the host captures the
provider and forwards every other registration here. The discovery lock is NOT held across
the host call â€” its registrations arrive on another thread and take the lock themselves.r  r1   r  c               ó   € V ^8„  d   QhRR/# )r   r   ÚNoner   )r   s   "r   r   Ú8_ProviderCollector.collect_in_host.<locals>.__annotate__®  s   € ÷ 	@ñ 	@˜Dñ 	@r   c                 ó    <€ S P                   ;_uu_ 4        S P                  SP                  4       R R R 4       R #   + '       g   i     R # ; ire   )r!  r"  r  )r#  r  s   €€r   Ú
drop_hooksÚ6_ProviderCollector.collect_in_host.<locals>.drop_hooks®  s2   ø€ Ø×(×(Ó(Ø×,Ñ,¨T×->Ñ->Ô?÷ )×(×(Ò(ús	   –<¼A	r7   z$agent.memory_provider:MemoryProvider)rª   ÚcaptureÚbase_refÚctxÚbefore_reload)
r  r  rW   r   rk   r  r  r   Úload_instancerÓ   )r  r
  rc   rª   r  r+  r#  s   f&&&  @r   r	  Ú"_ProviderCollector.collect_in_host¥  s†   ù€ õ 	>á+¨D¯I©I´ÔPSÐT`ÐcpÕTpÓPqÔ7rÓsˆÔØ×&Ñ&Ó(×1Ñ1ˆ÷	@ñ 	@ñ 	ŒØ×*Ñ*ØÐ;UØ;ÀÐU_ð +ó aˆŒð �}‰}Ðr   c                	óè   € V P                  4       pVP                  P                  ;_uu_ 4        VP                  P                  W0P                  W4      uuR R R 4       #   + '       g   i     R # ; ire   )r  r   r!  Ú_register_fallback_hookr  )r  Ú	hook_nameÚcallbackÚcontexts   &&& r   Úregister_hookÚ _ProviderCollector.register_hook¸  sN   € Ø×&Ñ&Ó(ˆØ×Ñ×-×-Ó-Ø×#Ñ#×;Ñ;¸G×EVÑEVÐXaÓl÷ .×-×-Ó-ús   ¯&A Á A1	c                	ó   € Wn         R # re   )rÓ   )r  rÓ   s   &&r   r7   Ú+_ProviderCollector.register_memory_provider½  s   € Ø Žr   c                ó¤  € V P                   '       g   R#  V P                  4       P                  ! V/ VB  V P                   RV'       d
   V^ ,          MVP	                  R4       2p^ RIHp V! 4       P                  V4      pVe   V\        4       V&   R# R#   \         d-   p\        P                  RT P                  T4        Rp?R# Rp?ii ; i)zâForward skills to the plugin registry, tracking qualified name + path so
switching the active provider can retract the previous one's skills. Gated
on ``register_skills`` so inspecting an inactive provider has no side effects.Nr¤   rW   ©Úget_plugin_managerz1Memory provider '%s' failed to register skill: %s)r  r  Úregister_skillrW   r”   r&   r>  Úfind_plugin_skillr   r)   r<   r•   )r  ÚargsÚkwargsÚqualified_namer>  Úregistered_pathr@   s   &*,    r   r?  Ú!_ProviderCollector.register_skillÀ  sµ   € ð ×$×$Ð$Ùð
	^Ø× Ñ Ó"×1Ò1°4ÐB¸6ÒBØ $§	¡	˜{¨!·t¨D°®GÀÇÁÈFÓASÐ+TÐUˆNå=á0Ó2×DÑDÀ^ÓTˆOØÒ*ØGVÔ2Ó4°^ÓDñ +øäô 	^Ü�L‰LÐLÈdÏiÉiÐY\×]Ò]ûð	^ús   –4B ÁA	B ÂCÂ#!C
Ã
Cc                	ó   € R # re   r   )r  rA  rB  s   &*,r   Úregister_cli_commandÚ'_ProviderCollector.register_cli_commandÒ  s   € Ùr   c               ó   € V ^8„  d   QhRR/# )r   rD   rk   r   )r   s   "r   r   r  Õ  s   € ÷ ñ  ñ r   c                ó\   a a€ SP                  R4      '       g   \        S4      hVV 3R lpV# )zÛDelegate any other ``register_*`` call to a real ``PluginContext`` (a
hand-maintained stub drifted: unknown calls raised and cost the provider).
Non-``register_*`` attributes raise normally so a typo still fails loudly.Ú	register_c                 óÆ   <€  SP                  4       P                  S4      ! V / VB #   \         d.   p\        P	                  R SP
                  ST4        Rp?R# Rp?ii ; i)z%Memory provider '%s' failed to %s: %sN)r  Ú__getattribute__r)   r<   r=   rW   )rA  rB  r@   rD   r  s   *, €€r   Ú_forwardÚ0_ProviderCollector.__getattr__.<locals>._forwardÜ  sX   ø€ ðØ×+Ñ+Ó-×>Ñ>¸tÔDÀdÐUÈfÑUÐUøÜô ä—‘ÐFÈÏ	É	ÐSWÐY\Ô]Ýûðús   ƒ$( ¨A ³"AÁA )r‚   ÚAttributeError)r  rD   rN  s   ff r   Ú__getattr__Ú_ProviderCollector.__getattr__Õ  s+   ù€ ð �‰˜{×+Ò+Ü  Ó&Ð&ö	ð ˆr   c                óª   € V P                   f;   ^ RIHpHpHp V! V P
                  V P
                  R7      pV! WC! 4       4      V n         V P                   # )zŸA real ``PluginContext``, built once on demand: the common provider that only
calls ``register_memory_provider`` must not pay for importing the plugin manager.)ÚPluginContextÚPluginManifestr>  )rW   Úkey)r  r&   rT  rU  r>  rW   )r  rT  rU  r>  Úmanifests   &    r   r  Ú"_ProviderCollector._plugin_contextæ  sD   € ð �=‰=Ò ß\Ñ\á%¨4¯9©9¸$¿)¹)ÔDˆHÙ)¨(Ð4FÓ4HÓIˆDŒMØ�}‰}Ðr   )r  r  r  rW   rÓ   )rï   r  Ú__qualname__Ú__firstlineno__Ú__doc__r  r  r	  r8  r7   r?  rG  rQ  r  Ú__static_attributes__r   r   r   r   r   �  sE   † ñTð!¸T÷ !ð
¨$ô 
õò&mò
!ò^ò$õö"r   r   c               ó   € V ^8„  d   QhRR/# )r   r   rÛ   r   )r   s   "r   r   r   ñ  s   € ÷ ñ  ]ñ r   c                 óp   €  ^ RI Hp  V ! 4       p\        VRR4      ;'       g    R#   \         d     R# i ; i)zXActive provider name from config.yaml (``memory.provider``), or None. Reads config only.©Úload_configÚmemoryrÓ   N)Úhermes_cli.configr`  r	   r)   )r`  Úconfigs     r   rÖ   rÖ   ñ  s:   € ðÝ1Ù“ˆÜ�v˜x¨Ó4×<Ð<¸Ð<øÜô Úðús   ‚ & £& ¦5´5c               ó$   € V ^8„  d   QhRRRRRR/# )r   rW   rk   rc   r   r   r/   r   )r   s   "r   r   r   û  s&   € ÷ Eñ E˜sð E°$ð E¸4ñ Er   c           
     ó€  € \         VP                  9   d   R#  ^ RIHp \	        V! 4       RR4      p\        T\        4      '       g   R# YP                  0p ^ RI	p\        TR,          RR7      ;_uu_ 4       pTP                  \        TP                  T4      ;'       g    / P                  R	4      ;'       g    R
4      4       RRR4       \        YC Uu0 uF  p\        T\        4      '       g   K  TkK  	  up,          4      #   \
         d     R# i ; i  + '       g   i     L[; i  \
         d     Lki ; iu upi )z±True when a NON-bundled provider is parked in ``plugins.disabled`` under any spelling the
plugin commands write: the provider name, its directory name or its manifest ``name:``.Fr_  r%   ÚdisabledNzplugin.yamlr3   )r6   rW   r£   )rf   rg   rb  r`  r	   r)   rT   r‘   rW   Úhermes_yamlÚopenrƒ   rk   Ú	safe_loadr”   r/   )rW   rc   r`  rf  rV   ÚyamlÚfÚvs   &&      r   r×   r×   û  s  € ô ˜l×2Ñ2Ô2ÙðÝ1Ü™;›=¨)°ZÓ@ˆô �h¤×%Ò%ÙØ×$Ñ$Ð%€EðÛ"Ü�, Õ.¸×EÕEÈØ�I‰I”c˜4Ÿ>™>¨!Ó,×2Ð2°×7Ñ7¸Ó?×EÐEÀ2ÓFÔG÷ Fô � HÓC¡H˜q´
¸1¼c×0BŸ˜¡HÑCÕCÓDÐDøô ô Úðú÷ F×Eûäô ÙðüâCsT   ™D Á D* Á7ADÂ9DÃD* ÃD;
Ã2D;
ÄDÄDÄD'	Ä"D* Ä'D* Ä*D8Ä7D8c               ó    € V ^8„  d   QhRRRR/# )r   Úactive_providerrÛ   r   r(  r   )r   s   "r   r   r     s   € ÷ -ñ -¸Mð -ÐUYñ -r   c                óD  € V f   \        4       p ^ RIHp V! 4       p\        4       p\	        VP                  4       4       F]  w  rEVP                  R4      ^ ,          V 8X  d   K$  VP                  V4      V8X  d   VP                  V4       VP                  VR4       K_  	  R# )zCRemove tracked skills that no longer belong to the active provider.Nr=  r¤   )
rÖ   r&   r>  r   r‘   ÚitemsÚ	partitionr@  Úremove_plugin_skillÚpop)rn  r>  r#  Ú
registeredrC  rD  s   &     r   Ú&_prune_inactive_memory_provider_skillsru    s‰   € àÒÜ5Ó7ˆå5á Ó"€GÜ3Ó5€JÜ+/°
×0@Ñ0@Ó0BÖ+CÑ'ˆØ×#Ñ# CÓ(¨Õ+¨Ô>ÙØ×$Ñ$ ^Ó4¸ÔGØ×'Ñ'¨Ô7Ø�‰�~ tÖ,ó ,Dr   c               ó   € V ^8„  d   QhRR/# )r   r   z
list[dict]r   )r   s   "r   r   r   "  s   € ÷ -ñ - jñ -r   c                 óp  € \         P                  4       '       d   \        4       MRp V '       d   \        V 4      MRpV'       d   VR,          P	                  4       '       g   . # \        W4      R,           p\        V4      '       g   ^ RIHp V! RV : R24      '       d   . #  \        P                  P                  V4      pVfÚ   \        V4      '       g0   \        \        . 4       \        \        W4      \        V4      .4       \        P                   P#                  V\        VR,          4      4      pV'       d   VP$                  '       g   . # \        P                   P'                  V4      pV\        P                  V&   VP$                  P)                  V4       \+        VRR4      p\-        V4      '       g   . # \.        P0                  ! V4      pRT R	T;'       g    R
V  R2RT;'       g    RRVR\+        W@ R2R4      RV /.#   \2         d#   p\4        P7                  RY4       . u Rp?# Rp?ii ; i)zòCLI commands for the **active** memory plugin only. Imports just its ``cli.py``
(``register_cli(subparser)``), never the provider module, so it is safe during
argparse setup. At most one dict: name/help/description/setup_fn/handler_fn/plugin.Nzcli.pyz.clirÌ   rí   z CLI commandsÚregister_clirW   ÚhelpzManage z memory pluginÚdescriptionr£   Úsetup_fnÚ
handler_fnÚ_commandÚpluginz-Failed to scan CLI for memory plugin '%s': %s)rf   r(   rÖ   rŸ   r8   rw   ri   rÎ   rÍ   r  r  r”   Ú_register_synthetic_packageru   rk   r�   ÚutilÚspec_from_file_locationÚloaderÚmodule_from_specÚexec_modulerG   r  r   rÄ   r)   r<   r•   )	rn  Ú
plugin_dirrª   rÍ   Úcli_modÚspecrx  Údescr  s	            r   Údiscover_plugin_cli_commandsr‰  "  sÚ  € ô 8K×7QÑ7Q×7SÒ7SÔ1Ô3ÐY]€Oß7FÔ" ?Ô3ÈD€Jß˜j¨8Õ3×;Ñ;×=Ò=Øˆ	ä˜zÓ;¸fÕD€KÜ�z×"Ò"ÝIÙ$Ð'7¸Ñ7JÈ-Ð%X×YÒYØˆIðÜ—+‘+—/‘/ +Ó.ˆØŠ?Ü˜z×*Ò*ô
 ,¬O¸RÔ@Ü+¬L¸Ó,UÔX[Ð\fÓXgÐWhÔiÜ—>‘>×9Ñ9¸+ÄsÈ:ÐX`ÕK`ÓGaÓbˆDß˜tŸ{Ÿ{˜{Ø�	Ü—n‘n×5Ñ5°dÓ;ˆGØ'.ŒC�K‰K˜Ñ$Ø�K‰K×#Ñ# GÔ,ä˜w¨¸Ó=ˆÜ˜×%Ò%ØˆIÜ×.Ò.¨zÓ:ˆà�OØ�D×EÐE˜g oÐ%6°nÐEØ˜4Ÿ:˜: 2Ø˜Øœ' 'Ð->¸hÐ+GÈÓNØ�oð
ð ð 	øô ô Ü�‰ÐDÀoÔYØ�	ûðús>   Â"B,H ÅH ÅA,H Æ>!H Ç H Ç0H ÈH5ÈH0È*H5È0H5)Únumpyre   )DÚ__conditional_annotations__r[  Ú
__future__r   rO   rp   Úimportlib.metadatar�   Úimportlib.utilÚloggingr  Úpathlibr   Útypesr   Útypingr   r   r   r   rb  r	   r%   r
   r   rô   r   Ú	getLoggerrï   r<   rþ   rh   rf   r’   r   Ú__annotations__r   r   ru   Úregister_synthetic_packager  Úuser_plugins_dirrz   r+   rA   r:   ri   rw   r{   r‰   r˜   rŸ   r›   rœ   r·   rÇ   rÙ   rå   rá   rñ   rú   rÃ   r¾   r   rÖ   r×   ru  r‰  )r‹  s   @r   Ú<module>r—     sF  øðôõ #ã 
Û Û Û Û Û 
Ý Ý !ß 7Ó 7å %Ý ,çÝ4à	×	Ò	˜8Ó	$€á˜8“n×+Ñ+Ð Ø4Ð ð BDÐ "Ð$>Ó Cà(2Ð �oÓ 2õPð (€à%×@Ñ@Ð Ø×0Ñ0Ð õõõõ*eõ8õSõ
ò"	õEõõ,Nõ
õð$qÈ÷ q÷B õF÷`õ&ð!ÈD÷ !ðH&È4÷ &÷Dañ aõHõE÷,-÷"-r   