Ë
    âß²jšb  ã                  óœ  — U d Z ddlmZ ddlZddlZddlZddlZddlZddl	m
Z
 ddlmZmZ ddlmZ ddlmZmZmZmZmZmZmZmZ ddlmZ dd	lmZ 	 ddlZ ej@                  d
«      Z!h d£Z"de#d<   h d£Z$de#d<   dZ%e&fe&fe'fe'fe'e(fe'e(fe)fe)fe*fe*fe+fe+fe&fdœZ,de#d<   d0d„Z-d1d„Z.d1d„Z/d2d„Z0d3d„Z1d4d„Z2d5d„Z3d6d„Z4d7d„Z5d8d„Z6d9d„Z7d:d„Z8d;d „Z9d<d=d!„Z:d>d"„Z;d<d?d#„Z<d@d$„Z=e G d%„ d&«      «       Z> ej~                  d'«      Z@dAd(„ZA ej~                  d)«      ZBdBd*„ZCdCd+„ZDdDd,„ZEdEd-„ZFdFd.„ZG	 	 	 	 	 	 	 	 	 	 dGd/„ZHy# e$ r dZY Œów xY w)Hz§Plugin manifest model and parsing (``plugin.yaml`` v1/v2, portable ``plugin.json``).

Split out of :mod:`hermes_cli.plugins`; validation warns and never fails a load.
é    )ÚannotationsN)Úsuppress)Ú	dataclassÚfield)ÚPath)ÚAnyÚCallableÚDictÚListÚMappingÚOptionalÚSetÚUnion)Úfast_safe_load)Úparse_declared_capabilitieszhermes_cli.plugins>   ÚbackendÚplatformÚ	exclusiveÚ
standaloneúmodel-providerzSet[str]Ú_VALID_PLUGIN_KINDS>   ÚkindÚnameÚtagsÚemitsÚhooksÚlabelÚauthorÚhermesÚdependsÚlicenseÚlistensÚversionÚhomepageÚ	platformsÚapi_versionÚdescriptionÚcapabilitiesÚoptional_envÚrequires_envÚconfig_schemaÚprovides_hooksÚprovides_toolsÚpython_runtimeÚrequires_hermesÚmanifest_versionÚpip_dependenciesÚrequires_pluginsÚpython_dependenciesÚexternal_dependenciesÚprovides_web_providersÚprovides_browser_providersÚ_KNOWN_MANIFEST_FIELDSé   )ÚstrÚstringÚintÚintegerÚfloatÚnumberÚboolÚbooleanÚlistÚarrayÚdictÚobjectÚsecretzDict[str, tuple]Ú_CONFIG_SCHEMA_TYPESc                 ó&   — ddl m}  | j                  S )Nr   )Úplugins)Ú
hermes_clirH   Ú_PLUGINS_DEBUG)Ú_origins    ú@/home/ubuntu/.hermes/hermes-agent/hermes_cli/plugins_manifest.pyÚ_plugins_debugrM   7   s   € Ý-Ø×!Ñ!Ð!ó    c                ó’   — t        | «      }t        j                  | j                  d«      «      j	                  «       dd }d|› d|› �S )zGReturn a readable, collision-resistant namespace for a portable plugin.úutf-8Né   zagent-plugin-ú-)Ú_portable_slugÚhashlibÚsha256ÚencodeÚ	hexdigest)ÚkeyÚslugÚdigests      rL   Ú_portable_skill_namespacer[   <   sF   € ä˜#Ó€DÜ�^‰^˜CŸJ™J wÓ/Ó0×:Ñ:Ó<¸R¸aÐ@€FØ˜4˜&  & Ð*Ð*rN   c                óx   — dj                  d„ | j                  «       D «       «      }|j                  d«      xs dS )NÚ c              3  ól   K  — | ],  }|j                  «       r|j                  «       s|d v r|nd–— Œ. y­w)z_-rR   N)ÚisasciiÚisalnum)Ú.0Úchs     rL   ú	<genexpr>z!_portable_slug.<locals>.<genexpr>D   s,   è ø€ ÒfÐTV˜Ÿ™œ¨2¯:©:¬<¸2À¹:‘2ÈCÓOÑfùs   ‚24z-_Úplugin)ÚjoinÚlowerÚstrip)rX   rY   s     rL   rS   rS   C   s4   € Ø�7‰7ÑfÐZ]×ZcÑZcÓZeÔfÓf€DØ�:‰:�dÓÒ'˜xÐ'rN   c                ó   — ~ t        |«      S )at  Internal name of a portable plugin's MCP server: exactly the name its ``mcp.json`` gives it, the same
    rule a user's own ``mcp_servers`` block in config.yaml follows. The plugin's skill namespace
    (``agent-plugin-<slug>-<digest>``) is NOT prepended: it keeps plugin-data and skill names collision-free
    without coordination, but here it cost ~40 chars of every ``mcp__<server>__<tool>`` name, which providers
    cap at 64, so the tool verb was hash-clamped away. A duplicate is refused at load (native config first,
    then first-loaded plugin) with a warning naming both owners; that beats hiding it behind a digest.)rS   )rX   Úservers     rL   Úportable_mcp_server_namerj   H   s   € ð 	Ü˜&Ó!Ð!rN   c                óv   ‡ — t        ‰ t        «      rdj                  ˆ fd„dD «       «      S ‰ €dS t        ‰ «      S )zFNormalize a manifest author value for the string PluginManifest field.ú, c              3  ó^   •K  — | ]$  }‰j                  |«      sŒt        ‰|   «      –— Œ& y ­w©N)Úgetr9   )ra   ÚfÚvalues     €rL   rc   z"_display_author.<locals>.<genexpr>V   s$   øè ø€ ÒY¨1ÈEÏIÉIÐVWÍLœ˜U 1™XŸÑYùs   ƒ-š-)r   ÚemailÚurlr]   )Ú
isinstancer   re   r9   )rq   s   `rL   Ú_display_authorru   S   s6   ø€ ä�%œÔ!Ø�y‰yÓYÐ0HÔYÓYÐYØ�ˆ2Ð.¤C¨£JÐ.rN   c                óv   — | j                  |«      }|�%t        ||«      st        j                  d|||«       y|S )zVReturn ``data[field_name]`` when absent or of ``typ``; warn and return None otherwise.Nz"Plugin %s: %s must be %s; ignoring)ro   rt   ÚloggerÚwarning)ÚdatarX   Ú
field_nameÚtypÚwhatÚraws         rL   Ú_manifest_field_of_typer~   Z   s9   € à
�(‰(�:Ó
€CØ
€œz¨#¨sÔ3Ü�‰Ð;¸SÀ*ÈdÔSØØ€JrN   c                ó¨   — g }t        | ||t        |«      xs g D ]5  } ||«      }|€t        j                  |||«       Œ%|j	                  |«       Œ7 |S )zbCoerce each item of list field ``field_name``; ``coerce`` returning None warns ``warn`` and skips.)r~   rA   rw   rx   Úappend)	ry   rX   rz   r|   ÚcoerceÚwarnÚoutÚitemÚcoerceds	            rL   Ú_manifest_listr†   c   sY   € à
€CÜ'¨¨c°:¼tÀTÓJÒPÈbò  ˆÙ˜“,ˆØˆ?Ü�N‰N˜4  dÕ+à�J‰J�wÕð ð €JrN   c                óæ   — t        | t        «      r| ddœS t        | t        «      rLt        | j                  d«      t        «      r-| d   r(| j                  d«      }| d   |�t        |«      dœS ddœS y)z]``{id, version_range}`` from a requires_plugins item (str shorthand ok); None when malformed.N)ÚidÚversion_rangerˆ   r‰   )rt   r9   r   ro   )r„   Úvrs     rL   Ú_dependency_entryr‹   o   si   € ä�$œÔØ¨TÑ2Ð2Ü�$œÔ ¤Z°·±¸³ÄÔ%DÈÈdÊØ�X‰X�oÓ&ˆØ˜4‘j¸b¸n´3°r³7ÑWÐWÐRVÑWÐWØrN   c                óv   — 	 t        | «      S # t        t        f$ r t        j	                  ||| «       |cY S w xY w)z]``int(raw)``; a non-integer warns ``warn`` (formatted with key, raw) and yields ``fallback``.)r;   Ú	TypeErrorÚ
ValueErrorrw   rx   )r}   rX   r‚   Úfallbacks       rL   Ú_manifest_intr�   y   s9   € ðÜ�3‹xˆøÜ”zÐ"ò Ü�‰�t˜S #Ô&ØŠðús   ‚
 �(8·8c                ó~  — t        | j                  dd«      |dd«      }|t        kD  rt        j	                  d||t        «       | j                  d«      }|€dnt        ||dd«      }t        | |dd	t        d
«      }t        | |ddd„ d«      }i }t        | |dt        d«      }|xs i j                  «       D ]«  \  }	}
t        |
t        «      st        j	                  d||	«       Œ.|
j                  d«      }|�Tt        |«      j                  «       t        vr5t        j	                  d||	|dj                  t        t        «      «      «       t!        |
«      |t        |	«      <   Œ­ t        | |dt"        d	«      xs g D �cg c]  }t        |«      ‘Œ }}t        t%        | j'                  «       «      t(        z
  «      }|r< |dk\  rt        j                  nt        j*                  d|dj                  |«      «       |||||t        | j                  d«      xs d«      t        | j                  d«      xs d«      |dœS c c}w )zrValidate/normalize manifest v2 fields into PluginManifest kwargs (warnings, never failures).

    See #64165.
    r0   é   z?Plugin %s: manifest_version %r is not an integer; treating as 1zrPlugin %s: manifest_version %d is newer than this Hermes supports (%d); loading anyway and ignoring unknown fieldsr&   Nz5Plugin %s: api_version %r is not an integer; ignoringr2   za listzjPlugin %s: requires_plugins entry %r must be a plugin id string or a {id, version_range} mapping; skippingr3   za list of requirement stringsc                óf   — t        | t        «      r | j                  «       r| j                  «       S d S rn   )rt   r9   rg   )r„   s    rL   ú<lambda>z+_parse_manifest_v2_fields.<locals>.<lambda>š   s"   € ¤Z°´cÔ%:¸t¿z¹z¼|�T—Z‘Z“\€ ÐQU€ rN   zXPlugin %s: python_dependencies entry %r must be a non-empty requirement string; skippingr+   z	a mappingzPPlugin %s: config_schema entry %r must be a mapping (e.g. {type: str}); skippingÚtypezgPlugin %s: config_schema key %r declares unknown type %r (known: %s); type check will be skipped for itrl   r   r8   zdPlugin %s: unknown manifest field(s) ignored: %s (newer manifest schema or typo; plugin still loads)r!   r]   r$   )r0   r&   r2   r3   r+   r!   r$   r   )r�   ro   ÚSUPPORTED_MANIFEST_VERSIONrw   rx   r†   r‹   r~   r   Úitemsrt   r9   rf   rF   re   ÚsortedrC   rA   ÚsetÚkeysr7   Údebug)ry   rX   ÚmvÚraw_apiÚapiÚdepsÚpydepsÚschemaÚ
raw_schemaÚskeyÚspecÚstypeÚtr   Úunknowns                  rL   Ú_parse_manifest_v2_fieldsr¨   ‚   s5  € ô 
�t—x‘xÐ 2°AÓ6¸ØXÐZ[ó
]€Bà	Ô&Ò&Ü�‰ðHØILÈbÔRlô	
ð �h‰h�}Ó%€GØ�/‰$¤}Ø�ÐMÈtó(U€CäØˆcÐ% xÔ1Bð	<ó€Dô ØˆcÐ(Ð*IÙUØbó€Fð  €FÜ(¨¨s°OÄWÈkÓZ€JØ!Ò' R×.Ñ.Ó0ò '‰
ˆˆdÜ˜$¤Ô(Ü�N‰NØbÐdgÐimôoàØ—‘˜Ó ˆØÐ¤ U£×!1Ñ!1Ó!3Ô;OÑ!OÜ�N‰NðAà�T˜5 $§)¡)¬FÔ3GÓ,HÓ"Iôô
 ! ›JˆŒs�4‹yÒð'ô 5°T¸3ÀÌÈhÓWÒ]Ð[]Ö_�qŒC��FÐ_€DÐ_ä”S˜Ÿ™›Ó%Ô(>Ñ>Ó?€GÙØ	4˜2 š7Œ�Š¬¯©ðBØCFÈÏ	É	ÐRYÓHZô	
ð
 ¨sÈÐekØ¬C°·±¸Ó0CÒ0IÀrÓ,JÜ˜Ÿ™ Ó,Ò2°Ó3¸Tñð ùò `s   Å<H:c                óD  — g }t        |t        «      rt        |t        «      s|S |j                  «       D ]è  \  }}t        |t        «      sŒ||vr.|j                  d«      rd|vr|j	                  d| › d|› d�«       ŒI|j                  d«      }|r,t
        j                  t        |«      j                  «       «      nd}|€Œ�||   }t        ||«      rt        |t        «      sŒ¯t        |vsŒ¸|j	                  d| › d|› d|› d	t        |«      j                  › d
�	«       Œê |S )z©Return actionable warning strings for settings vs config_schema mismatches (never raises).

    Never raises; schema mismatches must not block plugin load (#64165).
    ÚrequiredÚdefaultzplugins.entries.z
.settings.z9 is required by the plugin's config_schema but is not setr•   Nz should be z (got ú))rt   r   r—   ro   r€   rF   r9   rf   r?   r•   Ú__name__)	Ú	plugin_idr¡   ÚsettingsÚwarningsr£   r¤   r¥   Úexpectedrq   s	            rL   Úvalidate_config_schemar²   ¼   s)  € ð
 €HÜ�fœgÔ&¬j¸Ä7Ô.KØˆØ—l‘l“nò ‰
ˆˆdÜ˜$¤Ô(ØØ�xÑØ�x‰x˜
Ô#¨	¸Ñ(=Ø—‘Ø& y k°¸D¸6ð BCð Côð Ø—‘˜Ó ˆÙCHÔ'×+Ñ+¬C°«J×,<Ñ,<Ó,>Ô?ÈdˆØÐØØ˜‘ˆä˜% Ô*¬z¸%ÄÕ/FÌ4ÐW_ÒK_Ø�O‰OØ" 9 +¨Z¸°v¸[Ø�'˜¤ U£× 4Ñ 4Ð5°Qð8õð#ð* €OrN   c                ó  — ddl }t        | j                  «       «      }i }|D ]1  }| |   j                  sŒ|j	                  | |   j                  |«       Œ3 |D �ci c]  }|t        «       “Œ }}|D ]ž  }| |   j                  D ]Š  }t        |t        «      r|j                  d«      nd}|sŒ)|| v r|n|j                  |«      }|€t        j                  d|||«       Œ[||k(  rt        j                  d|«       Œw||   j                  |«       ŒŒ Œ  |j                  |«      }		 |	j                  «        g }|	j'                  «       rJt        |	j)                  «       «      }|j+                  |«        |	j,                  |Ž  |	j'                  «       rŒJ|S c c}w # |j                  $ ra}
t!        |
j"                  «      dkD  r|
j"                  d   ng }t        j                  ddj%                  d	„ |D «       «      «       |cY d}
~
S d}
~
ww xY w)
a#  Return plugin keys in dependency order: B before A when A requires B; alphabetical ties. A cycle warns
    and falls back to alphabetical order for all; a missing dependency warns once but never removes the
    dependent plugin (loads never hard-fail on advisory deps).

    See #64165.
    r   Nrˆ   z´Plugin %s requires plugin '%s' which is not enabled/installed; loading anyway (probe availability at runtime via ctx.has_plugin). Run `hermes plugins enable %s` if it is installed.z3Plugin %s declares a dependency on itself; ignoringr’   z^Plugin dependency cycle detected (%s); falling back to alphabetical load order for all pluginsz -> c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wrn   )r9   ©ra   Úcs     rL   rc   z,resolve_plugin_load_order.<locals>.<genexpr>  s   è ø€ ÒBYÈaÄ3ÀqÇ6ÑBYùs   ‚)Úgraphlibr˜   rš   r   Ú
setdefaultr™   r2   rt   r   ro   rw   rx   ÚaddÚTopologicalSorterÚprepareÚ
CycleErrorÚlenÚargsre   Ú	is_activeÚ	get_readyÚextendÚdone)Ú	manifestsr·   rš   Úby_nameÚkÚedgesÚdepÚdep_idÚresolvedÚsorterÚexcÚcycleÚorderedÚreadys                 rL   Úresolve_plugin_load_orderrÏ   Ü   sò  € ó Ü�)—.‘.Ó"Ó#€DØ €GØò 5ˆØ�Q‰<×ÓØ×Ñ˜y¨™|×0Ñ0°!Õ4ð5ð 59Ö!9¨q !¤S£U¡(Ð!9€EÐ!9Øò 'ˆØ˜Q‘<×0Ñ0ò 	'ˆCÜ&0°´gÔ&>�S—W‘W˜T”]ÀDˆFÙØØ!'¨9Ñ!4‘v¸'¿+¹+ÀfÓ:MˆHØÐÜ—‘ð^ð �v˜võ	ð ˜Q’Ü—‘ÐTÐVWÕXà�a‘—‘˜XÕ&ñ	'ð'ð" ×'Ñ'¨Ó.€FðØ�‰Ôð €GØ
×
Ñ
Ô
Ü�v×'Ñ'Ó)Ó*ˆØ�‰�uÔØˆ�‰�UÑð ×
Ñ
Õ
ð €NùòC ":øð* ×Ñò Ü" 3§8¡8›}¨qÒ0�—‘˜’°bˆÜ�‰ð6Ø7=·{±{ÑBYÐSXÔBYÓ7Yô	
ð �ûðús%   ÁFÄ#F ÆHÆ%AHÇ;HÈHc                óB   ‡ — t        ˆ fd„dD «       «      ryd‰ v rd‰ v ryy)a–  Kind implied by source markers (mirrors plugins/memory ``_is_memory_provider_dir`` and
    plugins/cron_providers ``_is_cron_provider_dir``): memory- or cron-provider markers -> ``exclusive``;
    ``register_provider`` + ``ProviderProfile`` -> ``model-provider``; else ``None``. Keeps these kinds out
    of the general manager's eager import (its PluginContext has no ``register_cron_scheduler``, #62951).c              3  ó&   •K  — | ]  }|‰v –— Œ
 y ­wrn   © )ra   ÚmarkerÚsource_texts     €rL   rc   z+_detect_kind_from_source.<locals>.<genexpr>  s   øè ø€ ò g Vˆ6�[Ô ñ gùs   ƒ)Úregister_memory_providerÚMemoryProviderÚregister_cron_schedulerÚCronSchedulerr   Úregister_providerÚProviderProfiler   N)Úany)rÔ   s   `rL   Ú_detect_kind_from_sourcerÜ     s9   ø€ ô
 ó gð 0fô gô gàØ˜kÑ)Ð.?À;Ñ.NØØrN   c                óì   — 	 | r0| j                  d«      rt        j                  j                  | «      } | r| j                  d«      syt	        | «      j                  dd¬«      d| S # t        $ r Y yw xY w)z\First ``limit`` chars of a module's source (``.pyc`` mapped back to ``.py``); "" on failure.)z.pycz.pyoú.pyr]   rP   Úreplace)ÚencodingÚerrorsN)ÚendswithÚ	importlibÚutilÚsource_from_cacher   Ú	read_textÚ	Exception)ÚoriginÚlimits     rL   Ú_read_source_from_originrê     sn   € ðÙ�f—o‘oÐ&6Ô7Ü—^‘^×5Ñ5°fÓ=ˆFÙ˜VŸ_™_¨UÔ3ØÜ�F‹|×%Ñ%¨w¸yÐ%ÓIÈ&È5ÐQÐQøÜò Ùðús   ‚AA' ÁA' Á'	A3Á2A3c                ó`  — | j                  d«      D �cg c]  }|sŒ|‘Œ	 }}|sy	 t        j                  j                  |d   «      }|�|j                  syt        |«      dk(  r|j                  S |j                  }|syt        |dd d¬«      D ]ˆ  \  }}dx}}t        t        |«      D ]R  }	|	|z  dz  |	|dz   z  }}
|
j                  «       rt        |
«      |	|z  g}} n|j                  «       sŒGt        |«      } n |€ y|t        |«      k(  s|€|c S |}ŒŠ yc c}w # t        $ r Y yw xY w)	aY  Return a module's source path WITHOUT importing it, or ``None``. ``find_spec`` on a dotted name imports
    the parent package, so only the top-level name uses it; remaining segments are walked through
    ``submodule_search_locations`` by hand. Namespace/zipped/extension modules return ``None``. Shared with
    ``plugins/memory/__init__.py``.ú.Nr   r’   r8   )Ústartú__init__.pyrÞ   )Úsplitrã   rä   Ú	find_specrè   r½   Úsubmodule_search_locationsÚ	enumerateÚmapr   Úis_filer9   rç   )Úmodule_nameÚpÚpartsr¤   Úsearch_pathsÚiÚpartÚfound_originÚ
next_pathsÚbaseÚpkg_initÚmod_files               rL   Úresolve_module_originr   &  sU  € ð
 $×)Ñ)¨#Ó.Ö4�1²!ŠQÐ4€EÐ4ÙØðÜ�~‰~×'Ñ'¨¨a©Ó1ˆØˆ<˜tŸ{š{ØÜˆu‹:˜Š?Ø—;‘;ÐØ×6Ñ6ˆÙØÜ   q r °!Ô4ò 	&‰GˆAˆtØ(,Ð,ˆL˜:ÜœD ,Ó/ò �Ø%)¨D¡[°=Ñ%@À$È$ÐQVÉ,ÑBW˜(�Ø×#Ñ#Ô%Ü/2°8«}¸tÀd¹{¸m *�LÙØ×#Ñ#Õ%Ü#& x£=�LÙðð Ð#ÙØ”C˜“JŠ *Ð"4Ø#Ò#Ø%‰Lð	&ð ùò7 5øô8 ò Ùðús@   ”DœD¦0D! ÁD! Á1D! Â A0D! Ã1D! ÄD! ÄD! Ä!	D-Ä,D-c                ó,   — t        t        | «      |«      S )zWFirst ``limit`` chars of a module's source without importing it ("" when unresolvable).)rê   r   )rõ   ré   s     rL   Ú_resolve_module_sourcer  K  s   € ä#Ô$9¸+Ó$FÈÓNÐNrN   c                ó6   — | j                   xs | j                  S )zURegistry id of a manifest: the path-derived ``key`` when set, else the bare ``name``.)rX   r   )Úmanifests    rL   Úmanifest_keyr  P  s   € à�<‰<Ò(˜8Ÿ=™=Ð(rN   c                  óø  — e Zd ZU dZded<   dZded<   dZded<   dZded<    ee	¬«      Z
d	ed
<    ee	¬«      Zded<    ee	¬«      Zded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<    ee	¬«      Zded<   dZded<   dZded<    ee	¬«      Zd ed!<    ee	¬«      Zded"<    ee¬«      Zd#ed$<   dZded%<   dZded&<    ee	¬«      Zded'<    ee	¬«      Zded(<    ee	¬«      Zded)<   y)*ÚPluginManifestz0Parsed representation of a plugin.yaml manifest.r9   r   r]   r#   r'   r   )Údefault_factoryz List[Union[str, Dict[str, Any]]]r*   ú	List[str]r-   r,   ÚsourceNúOptional[str]Úpathr   r   rX   r/   Fr?   ÚportableÚskill_namespacer(   r’   r;   r0   úOptional[int]r&   zList[Dict[str, Any]]r2   r3   úDict[str, Any]r+   r!   r$   r   r   r"   ) r­   Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r#   r'   r   r   rA   r*   r-   r,   r
  r  r   rX   r/   r  r  r(   r0   r&   r2   r3   rC   r+   r!   r$   r   r   r"   rÒ   rN   rL   r  r  U  s>  … á:à
ƒIØ€GˆSÓØ€K�ÓØ€FˆCÓÙ5:È4Ô5P€LÐ2ÓPÙ %°dÔ ;€N�IÓ;Ù %°dÔ ;€N�IÓ;Ø€FˆCÓØ€Dˆ-Óð
 €Dˆ#Óð €CˆƒMð €O�SÓØ€HˆdÓØ€O�SÓñ $°DÔ9€L�)Ó9ð Ð�cÓØ!%€K�Ó%á-2À4Ô-HÐÐ*ÓHñ &+¸4Ô%@Ð˜Ó@á$)¸$Ô$?€M�>Ó?Ø€GˆSÓØ€HˆcÓÙ¨DÔ1€Dˆ)Ó1ñ ¨TÔ2€Eˆ9Ó2Ù¨tÔ4€GˆYÔ4rN   r  z!^\s*(>=|<=|==|!=|>|<)\s*(.+?)\s*$c                 óˆ   — 	 ddl m}  | rt        | «      S 	 t        j
                  j                  d«      S # t        $ r Y Œ*w xY w)u‚  Version of the Hermes code that is running: ``hermes_cli.__version__``. Distribution metadata is only
    a fallback â€” on an editable/source install it is frozen at ``pip install -e`` time and drifts from the
    checkout after every ``git pull`` (dist said 0.21.0 while the code was 0.21.4), so gating on it skipped
    plugins that required exactly the release the user was running.r   ©Ú__version__zhermes-agent)rI   r  r9   rç   rã   Úmetadatar#   r  s    rL   Úrunning_hermes_versionr  �  sJ   € ð
Ý*ÙÜ�{Ó#Ð#ð ô ×Ñ×%Ñ% nÓ5Ð5øô ò Ùðús   ‚5 µ	AÁ Az^\d+c                ó˜  — t        j                  dt        | «      j                  «       j	                  d«      d«      d   j                  d«      }|dgdt        |«      z
  z  z  }g }|dd D ]R  }t        j                  |j                  «       «      }|€ y|j                  t        |j                  d«      «      «       ŒT t        |«      S )	u  ``v1.2.3-rc1`` / ``1.2.3rc1`` / ``1.2.3.post1`` â†’ ``(1, 2, 3)``; ``None`` when a segment has no
    leading digits. PEP 440 pre/post/dev suffixes glued to a segment (``0rc1``) are dropped so an rc
    *target* still gates and an rc *running* version does not disable every gate.z[-+]Úvr’   r   rì   Ú0é   N)Úrerï   r9   rg   Úlstripr½   Ú_VERSION_SEGMENT_REÚmatchr€   r;   ÚgroupÚtuple)r  r÷   rƒ   ÚxÚms        rL   Ú_version_tupler&  ž  s°   € ô �H‰H�Wœc !›fŸl™l›n×3Ñ3°CÓ8¸!Ó<¸QÑ?×EÑEÀcÓJ€EØ	ˆcˆU�aœ#˜e›*‘nÑ%Ñ%€EØ
€CØ�2�AˆYò $ˆÜ×%Ñ% a§g¡g£iÓ0ˆØˆ9ÙØ�
‰
”3�q—w‘w˜q“z“?Õ#ð	$ô
 �‹:ÐrN   c                ó®  — t        |«      }|€y|j                  |j                  |j                  |j                  |j
                  |j                  dœ}t        dd„ | j                  d«      D «       «      D ]]  }t        j                  |«      }|r"|j                  d«      |j                  d«      fnd|f\  }}t        |«      }|€ŒQ ||   |«      rŒ] y	 y)
u¶   ``>=``/``>``/``<=``/``<``/``==``/``!=`` clauses (comma = AND; bare version = ``>=``). Unparseable
    versions are permissive â€” no PEP 440 dependency for a one-field manifest gate.NT)ú>=z<=z==z!=ú>ú<c              3  ó<   K  — | ]  }|j                  «       –— Œ y ­wrn   )rg   rµ   s     rL   rc   z$version_satisfies.<locals>.<genexpr>´  s   è ø€ ÒC¨a §¡§	ÑCùs   ‚ú,r’   r8   r(  F)r&  Ú__ge__Ú__le__Ú__eq__Ú__ne__Ú__gt__Ú__lt__Úfilterrï   Ú_VERSION_COMPARATOR_REr!  r"  )	r¤   ÚcurrentÚcurÚopsÚclauser%  ÚopÚtargetÚtgts	            rL   Úversion_satisfiesr<  ­  sÃ   € ô ˜Ó
!€CØ
€{ØØ—‘ 3§:¡:°S·Z±ZÀsÇzÁzÐX[×XbÑXbÐil×isÑisÑ
t€CÜ˜ÑC°4·:±:¸c³?ÔCÓDò ˆÜ"×(Ñ(¨Ó0ˆÙ12�a—g‘g˜a“j !§'¡'¨!£*Ñ-¸¸v¸‰
ˆˆFÜ˜VÓ$ˆØ‰? 7 3 r¡7¨3¥<Ùðð rN   c                ó‚   — | j                   syt        «       }t        | j                   |«      ryd| j                   › d|› �S )zYLoad-blocking reason when the manifest's ``requires_hermes`` rejects the running version.Nzrequires hermes z
, running )r/   r  r<  )r  r5  s     rL   Úrequires_hermes_errorr>  ½  sC   € à×#Ò#ØÜ$Ó&€GÜ˜×1Ñ1°7Ô;ØØ˜h×6Ñ6Ð7°zÀ'ÀÐKÐKrN   c                óh  — ddl m}  || «      \  }}|D ]#  }t        j                  d| |j                  «       Œ% |r|› d| j
                  › �n|d   }t        |d   |j                  dd«      |j                  dd«      t        |j                  d	d«      «      |t        | «      |d
t        |«      ¬«	      S )z]Build the manifest for a portable Agent Plugin directory (``plugin.json``); diagnostics warn.r   )Úread_agent_plugin_manifestzAgent Plugin '%s': %sú/r   r#   r]   r'   r   T)	r   r#   r'   r   r
  r  rX   r  r  )Úhermes_cli.agent_pluginsr@  rw   rx   Úmessager   r  ro   ru   r9   r[   )Úchildr
  Úprefixr@  ry   ÚdiagnosticsÚ
diagnosticrX   s           rL   Úportable_plugin_manifestrH  Ç  s²   € åCÙ2°5Ó9Ñ€Dˆ+Ø!ò Kˆ
Ü�‰Ð.°°z×7IÑ7IÕJðKá&,ˆVˆH�A�e—j‘j�\Ñ
"°$°v±,€CÜØ�&‰\ 4§8¡8¨I°rÓ#:ÈÏÉÐQ^Ð`bÓHcÜ˜tŸx™x¨°"Ó5Ó6¸vÌCÐPUËJÐ\_ØÔ'@ÀÓ'Eôð rN   c           
     ó
  — | j                  dd«      }t        |t        «      r|j                  «       j	                  «       nd}|t
        vr6t        j                  d||dj                  t        t
        «      «      «       d}|dz  }|dk(  rkd| vrg|j                  «       rWt        t        «      5  |j                  dd¬«      d	d
 }t        |«      }|r|}t        j                  d|||«       d	d	d	«       |S |S # 1 sw Y   |S xY w)z¥Normalize ``kind``; undeclared memory/model providers are auto-detected from ``__init__.py`` so they
    route to their own discovery instead of the general manager.r   r   zBPlugin %s: unknown kind '%s' (valid: %s); treating as 'standalone'rl   rî   rß   rP   )rá   rà   Né    z-Plugin %s: detected %s, treating as kind='%s')ro   rt   r9   rg   rf   r   rw   rx   re   r˜   Úexistsr   rç   ræ   rÜ   r›   )ry   rX   Ú
plugin_dirÚraw_kindr   Ú	init_filerÔ   Údetecteds           rL   Ú_manifest_kindrP  Õ  sÿ   € ð �x‰x˜ Ó-€HÜ'1°(¼CÔ'@ˆ8�>‰>Ó×!Ñ!Ô#Àl€DØÔ&Ñ&Ü�‰ØPØ�˜4Ÿ9™9¤VÔ,?Ó%@ÓAô	
ð ˆØ˜]Ñ*€IØˆ|Ò ¨dÑ 2°y×7GÑ7GÔ7IÜ”iÓ ñ 	gØ#×-Ñ-°YÈÐ-ÓQÐRWÐSWÐXˆKÜ/°Ó<ˆHÙØ�Ü—‘ÐLÈcÐS[Ð]eÔf÷	gð €Kˆ4€K÷	gð €Kús   Â.>C8Ã8Dc                óH  — 	 t         €t        j                  d| «       yt        | j	                  d¬«      «      xs i }t        |t        «      s+t        j                  d| t        |«      j                  «       y|j                  d|j                  «      }|r|› d|j                  › �n|}t        |||«      }t        j                  d|||||«       t        d|t        |j                  d	d
«      «      |j                  dd
«      t        |j                  dd
«      «      |j                  dg «      |j                  dg «      |j                  d|j                  dg «      «      |t        |«      ||t        |j                  d«      xs d
«      j!                  «       t#        |j                  d«      |«      dœt%        ||«      ¤|j                  d«      xs g |j                  d«      xs g dœ¤ŽS # t&        $ r+}t        j                  d| |t)        «       ¬«       Y d}~yd}~ww xY w)zWParse one ``plugin.yaml`` into a :class:`PluginManifest`; ``None`` (warned) on failure.Nu'   PyYAML not installed â€“ cannot load %srP   )rà   z@Failed to parse %s: top level must be a mapping, got %s (#14066)r   rA  z9Parsed manifest: key=%s name=%s kind=%s source=%s path=%sr#   r]   r'   r   r*   r-   r,   r   r/   r(   )r   r#   r'   r   r*   r-   r,   r
  r  r   rX   r/   r(   r   r"   )r   r"   zFailed to parse %s: %s)Úexc_inforÒ   )Úyamlrw   rx   r   ræ   rt   r   r•   r­   ro   r   rP  r›   r  r9   ru   rg   Ú_parse_declared_capabilitiesr¨   rç   rM   )	Úmanifest_filerL  r
  rE  ry   r   rX   r   rË   s	            rL   Úparse_manifest_filerV  ë  sì  € ðÜˆ<Ü�N‰NÐDÀmÔTØÜ˜m×5Ñ5¸wÐ5ÓGÓHÒNÈBˆÜ˜$¤Ô(Ü�N‰NÐ]Ø(¬$¨t«*×*=Ñ*=ô?àØ�x‰x˜ 
§¡Ó0ˆÙ/5��˜˜*Ÿ/™/Ð*Ñ+¸4ˆÜ˜d C¨Ó4ˆÜ�‰ØGÈÈdÐTXÐZ`Ðblô	näð 
Øœs 4§8¡8¨I°rÓ#:Ó;ØŸ™ °Ó3¼OÈDÏHÉHÐU]Ð_aÓLbÓ<cØŸ™ .°"Ó5ØŸ8™8Ð$4°bÓ9ð  Ÿ8™8Ð$4°d·h±h¸wÈÓ6KÓLÐU[ÔbeÐfpÓbqØ˜3´°D·H±HÐ=NÓ4OÒ4UÐSUÓ0V×0\Ñ0\Ó0^Ü5°d·h±h¸~Ó6NÐPTÓUñ
ô (¨¨cÓ2ð
ð ;?¿(¹(À7Ó:KÒ:QÈrØ—H‘H˜YÓ'Ò-¨2ó
ð 	
øô ò Ü�‰Ð/°ÀÌnÓN^ˆÔ_Üûðús$   ‚G- ŸAG- Á9E3G- Ç-	H!Ç6!HÈH!)Úreturnr?   )rX   r9   rW  r9   )rX   r9   ri   r9   rW  r9   )rq   rD   rW  r9   )ry   r   rX   r9   rz   r9   r|   r9   )ry   r   rX   r9   rz   r9   r|   r9   r�   r	   r‚   r9   rW  rA   )r„   rD   rW  zOptional[Dict[str, Any]])
r}   rD   rX   r9   r‚   r9   r�   r  rW  r  )ry   r   rX   r9   rW  r  )r®   r9   r¡   r   r¯   r   rW  r	  )rÃ   zMapping[str, 'PluginManifest']rW  r	  )rÔ   r9   rW  r  )rJ  )rè   r  ré   r;   rW  r9   )rõ   r9   rW  r  )rõ   r9   ré   r;   rW  r9   )r  ú'PluginManifest'rW  r9   )rW  r9   )r  r9   rW  zOptional[tuple])r¤   r9   r5  r9   rW  r?   )r  rX  rW  r  )rD  r   r
  r9   rE  r9   rW  r  )ry   r   rX   r9   rL  r   rW  r9   )
rU  r   rL  r   r
  r9   rE  r9   rW  zOptional[PluginManifest])Ir  Ú
__future__r   rT   Úimportlib.metadatarã   Úimportlib.utilÚloggingr  Ú
contextlibr   Údataclassesr   r   Úpathlibr   Útypingr   r	   r
   r   r   r   r   r   Úutilsr   Úhermes_cli.plugin_capabilitiesr   rT  rS  ÚImportErrorÚ	getLoggerrw   r   r  r7   r–   r9   r;   r=   r?   rA   rC   rF   rM   r[   rS   rj   ru   r~   r†   r‹   r�   r¨   r²   rÏ   rÜ   rê   r   r  r  r  Úcompiler4  r  r   r&  r<  r>  rH  rP  rV  rÒ   rN   rL   ú<module>rf     sÈ  ðòõ
 #ã Û Û Û Û 	Ý ß (Ý ß K× KÓ Kå  Ý fðÛð 
ˆ×	Ñ	Ð/Ó	0€â dÐ �XÓ dò
$Ð ˜ó ð Ð ð ˆ6˜c˜V¨S¨FÀ¸vÐQTÐV[ÐP\Ø�Eˆl T G¸¸È$ÈÐ\`Ð[bØˆG ˜wð ˆfñ*Ð Ð&ó ó"ó
+ó(ó
"ó/óó	óóó7ótó@.ób
ô	ó"ôJOó
)ð
 ÷05ð 05ó ð05ðh $˜Ÿ™Ð$HÓIÐ ó6ð !�b—j‘j Ó)Ð óóó Lóóð,!Øð!Ø%)ð!Ø36ð!Ø@Cð!àô!øði ò Ø‚Dðús   ÁE ÅEÅ
E