+
    jHàjîå ã                  óà  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t^ RIt^ RIt^ RIt^ RIHt ^ RIHtHt ^ RIHtHt ^ RIHt ^ RIHtHtHtHtHtHtH t H!t!H"t" ^ RI#H$t$H%t%H&t& ^ R	I'H(t( ^ R
I)H*t* ^ RI+H,t, ^ RI-H.t. ^ RI/H0t0 ^ RI1H2t2H3t3 ^ RI4H5t5H6t6H7t7H8t8H9t9H:t:H;t;H<t<H=t= ^ RI>H?t?H@t@HAtAHBtBHCtCHDtDHEtEHFtFHGtG ^ RIHHItIHJtJHKtKHLtLHMtMHNtNHOtOHPtP ^ RIQHRtRHStSHTtTHUtUHVtVHWtWHXtXHYtYHZtZH[t[H\t\H]t]H^t^H_t_H`t`HataHbtbHctcHdtdHete ^ RIfHgtgHhth ^ RIiHjtjHktk ^ RIlHmtmHntnHotoHptpHqtqHrtrHsts R R ltt ! R R]u4      tv]Pî                  ! ]x4      ty]*! R4      szRs{RÕR R llt|]|! 4        0 RkRkR kR!kR"kR#kR$kR%kR&kR'kR(kR)kR*kR+kR,kR-kR.kR/kR0kR1kR2kR3kR4kR5kR6kR7kR8kR9kR:kR;kR<kR=kR>kR?kR@kRAkRBkRCkRDkREkRFkRGkRHkRIkRJkRKkt}RL]~RM&   R/0tRL]~RN&   ]*t€]�! 4       t‚] ! RO RP4      4       tƒ ! RQ RR4      t„RS t…]k F  t†]‡! ]„]†^ ,          ]…! ]†!  4       K  	  A†RT tˆ]‰! ]Š! ]„4      EP                  4       4       FG  w  tŒt�]Ž! ]�4      '       g   K  ]ŒEP                  RU4      '       g
   ]ŒRÖ9   g   K7  ]‡! ]„]Œ]ˆ! ]�4      4       KI  	  AŒA�RV RW lt� ! RX RY]I]_]g4      t‘Rs’RZ]~R[&   / t“R\]~R]&   ]EP(                  ! 4       t•Rs–R^]~R_&   ]EP.                  ! 4       t˜Rs™R^]~R`&   ]EP.                  ! 4       tšRa Rb lt›Rc Rd ltœRe Rf lt�Rg Rh ltžRi Rj ltŸRk Rl lt Rm Rn lt¡Ro Rp lt¢Rq Rr lt£Rs Rt lt¤Ru Rv lt¥Rw Rx lt¦RÕRy Rz llt§Rs¨R{]~R|&   ]EP.                  ! 4       t©R} R~ ltªR×R R€ llt«R� R‚ lt¬Rƒ R„ lt­R… R† lt®R‡ Rˆ lt¯R‰ RŠ lt°R‹ RŒ lt±R� RŽ lt²R� R� lt³R‘ R’ lt´R“ R” ltµR• R– lt¶R— R˜ lt·R™ Rš lt¸R›RRœR/R� Rž llt¹]EPt                  ! 4       t»]! RŸR 7       ! R¡ R¢4      4       t¼RØR£ R¤ llt½R¥ R¦ lt¾RÙR¨ R© llt¿Rª R« ltÀR¬ R­ ltÁR® R¯ ltÂR°R§R±R§R²R§/R³ R´ lltÃRµ R¶ ltÄR²R§RœR§R·R§R¸RR¹^ RºR§R»R/R¼ R½ lltÅR¾R§R·R§R¿RRÀR§RÁR§RÂR§RÃRRÄRRÅ^ RÆ^ RÇ^ /RÈ RÉ lltÆRÕRÊ RË lltÇRÌ tÈRÍ RÎ ltÉRÏ RÐ ltÊRÑ RÒ ltËRÓ RÔ ltÌR# )ÚuŠ  Hermes Plugin System â€” discovers, loads, and manages plugins.

Sources, later overriding earlier on key collision: bundled ``<repo>/plugins/<name>/`` (``memory/``
and ``context_engine/`` have their own discovery), user ``~/.hermes/plugins/<name>/``, project
``./.hermes/plugins/<name>/`` (opt-in via ``HERMES_ENABLE_PROJECT_PLUGINS``), and pip packages in
the ``hermes_agent.plugins`` entry-point group. A directory plugin needs a ``plugin.yaml`` manifest
and an ``__init__.py`` exposing ``register(ctx)``. Plugins register callbacks for ``VALID_HOOKS``
(core fires ``invoke_hook(name, **kwargs)``) and tools via ``PluginContext.register_tool()``.
)ÚannotationsN)Úsuppress)Ú	dataclassÚfield)Úcached_propertyÚwraps)ÚPath)	ÚAnyÚCallableÚDictÚListÚMappingÚOptionalÚSetÚTupleÚUnion)Úget_hermes_homeÚget_process_hermes_homeÚhermes_home_key)Úreplacement_coordinator)Úenv_var_enabled)Úload_config_readonly)ÚVALID_MIDDLEWARE)Úplugin_capability_granted)ÚRELAY_PLUGINS_CONFIG_ENVÚlegacy_relay_plugin_keys)	Ú_CONFIG_SCHEMA_TYPESÚSUPPORTED_MANIFEST_VERSIONÚPluginManifestÚ_portable_skill_namespaceÚmanifest_keyÚparse_manifest_fileÚresolve_module_originÚresolve_plugin_load_orderÚvalidate_config_schema)	ÚENTRY_POINTS_GROUPÚ_get_disabled_pluginsÚ_get_enabled_pluginsÚcollect_directory_manifestsÚdiscover_entrypoint_manifestsÚgate_manifestÚplugin_discovery_suppressedÚresolve_manifest_winnersÚscan_directory)ÚPluginLoaderMixinÚ_BARE_MODULE_SCOPEÚ_MODULE_NAMESPACE_LOCKÚ
_NS_PARENTÚ_evict_modulesÚ_plugin_home_scopeÚ_serialized_replacementÚin_plugin_load_worker)Ú'DEFAULT_SYSTEM_PROMPT_SECTION_MAX_CHARSÚHERMES_EVENT_NAMESPACEÚMAX_SYSTEM_PROMPT_SECTION_CHARSÚ&MAX_SYSTEM_PROMPT_SECTIONS_TOTAL_CHARSÚPLUGIN_SECTIONS_ENDÚPLUGIN_SECTIONS_STARTÚSYSTEM_PROMPT_SECTION_POSITIONSÚ_EVENT_EMIT_DEPTH_CAPÚ_EVENT_PENDING_CAPÚ_HOOK_CALLBACK_TIMEOUT_SECSÚ!_HOOK_TIMEOUT_SUPPRESSION_SECONDSÚ_MAX_HOOK_CALLBACK_TIMEOUT_SECSÚ$_PRE_TOOL_CALL_TIMEOUT_BLOCK_MESSAGEÚPluginDispatchMixinÚPluginSystemPromptSectionÚ!RenderedPluginSystemPromptSectionÚ_EventSubscriptionÚformat_system_prompt_sectionsÚ!is_valid_system_prompt_section_idÚresolve_plugin_command_result)ÚPluginLedgerMixinÚPluginRegistration)Ú_NAME_NORMALIZERSÚ_SCOPED_PROVIDER_REGISTRARS)ÚPluginStateÚ_locked_plugin_stateÚ_nested_plugin_mappingÚ_nested_plugin_valueÚ_plugin_relative_segmentsÚ_plugin_settings_entryÚsave_plugin_settingc               ó   € V ^8„  d   QhRR/# ©é   Úreturnr   © )Úformats   "Ú7/home/ubuntu/.hermes/hermes-agent/hermes_cli/plugins.pyÚ__annotate__r\   D   s   € ÷ >ñ > ñ >ó    c                 óÄ   € \         P                  ! R4      p V '       d   \        V 4      # \        \        4      P	                  4       P
                  P
                  R,          # )z‹Bundled ``plugins/`` dir: ``HERMES_BUNDLED_PLUGINS`` (Nix wrapper / packaged installs, read-only
store paths) first, else the in-repo path.ÚHERMES_BUNDLED_PLUGINSÚplugins)ÚosÚgetenvr   Ú__file__ÚresolveÚparent)Úenv_overrides    r[   Úget_bundled_plugins_dirrg   D   sE   € ô —9’9Ð5Ó6€LßÜ�LÓ!Ð!Ü”‹>×!Ñ!Ó#×*Ñ*×1Ñ1°IÕ=Ð=r]   c                  ó   € ] tR t^MtRtRtR# )ÚPluginToolOverrideErrorz^Plugin tried to override a built-in tool without ``plugins.entries.<id>.allow_tool_override``.rY   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__static_attributes__rY   r]   r[   ri   ri   M   s   † Ýhr]   ri   ÚHERMES_PLUGINS_DEBUGFc               ó    € V ^8„  d   QhRRRR/# ©rW   ÚforceÚboolrX   ÚNonerY   )rZ   s   "r[   r\   r\   Y   s   € ÷ Xñ X¨ð X¸$ñ Xr]   c                óä  € V '       d   \        R4      s\        '       d   \        '       d   R# \        P                  ! \
        P                  4      pVP                  \        P                  4       VP                  \        P                  ! R4      4       \        P                  V4       \        P                  \        P                  4       R\        n        Rs\        P                  R4       R# )zWWhen HERMES_PLUGINS_DEBUG is on, tee plugin logs to stderr at DEBUG (once per process).rp   Nz#[plugins] %(levelname)s %(message)sTuC   HERMES_PLUGINS_DEBUG=1 â€” verbose plugin discovery logging enabled)r   Ú_PLUGINS_DEBUGÚ_DEBUG_HANDLER_INSTALLEDÚloggingÚStreamHandlerÚsysÚstderrÚsetLevelÚDEBUGÚsetFormatterÚ	FormatterÚloggerÚ
addHandlerÚ	propagateÚdebug)rs   Úhandlers   & r[   Ú_install_plugin_debug_handlerr†   Y   s™   € ÷ Ü(Ð)?Ó@ˆß‹>×5Ó5ÙÜ×#Ò#¤C§J¡JÓ/€GØ×Ñ”W—]‘]Ô#Ø×Ñœ×*Ò*Ð+PÓQÔRÜ
×Ñ�gÔÜ
‡O�O”G—M‘MÔ"Ø„FÔØ#ÐÜ
‡L�LÐVÖWr]   Úpre_tool_callÚpost_tool_callÚtransform_terminal_outputÚtransform_tool_resultÚtransform_llm_outputÚpre_llm_callÚpost_llm_callÚon_stream_startÚon_stream_deltaÚon_stream_endÚon_interim_messageÚ
pre_verifyÚpre_api_requestÚpost_api_requestÚapi_request_errorÚpre_auxiliary_callÚpost_auxiliary_callÚ"transform_api_error_classificationÚon_session_startÚon_session_endÚon_session_finalizeÚon_session_resetÚon_session_deleteÚon_skill_lifecycleÚsubagent_startÚsubagent_stopÚpre_gateway_dispatchÚpost_gateway_admissionÚagent_loop_stoppedÚpre_approval_requestÚpost_approval_responseÚon_human_input_requestÚon_human_input_resolvedÚon_room_member_activityÚpre_transcriptionÚkanban_task_claimedÚkanban_task_completedÚkanban_task_blockedÚon_kanban_worker_spawnedÚon_kanban_worker_exitedÚon_kanban_worker_stale_claimÚon_kanban_task_updatedÚon_kanban_dispatch_tickÚgateway_platform_eventÚpre_commandÚpost_compactionúset[str]ÚVALID_HOOKSÚSHELL_UNSUPPORTED_HOOKSc                  óÎ   € ] tR t^Õt$ RtR]R&   RtR]R&   ]! ]R7      t	R]R	&   ]! ]R7      t
R]R
&   ]! ]R7      tR]R&   ]! ]R7      tR]R&   RtR]R&   RtR]R&   RtR]R&   RtR# )ÚLoadedPluginz)Runtime state for a single loaded plugin.r   ÚmanifestNzOptional[types.ModuleType]Úmodule)Údefault_factoryú	list[str]Útools_registeredÚhooks_registeredÚmiddleware_registeredÚcommands_registeredFrt   ÚenabledúOptional[str]ÚerrorÚdeferredrY   )rj   rk   rl   rm   rn   Ú__annotations__r»   r   Úlistr¾   r¿   rÀ   rÁ   rÂ   rÄ   rÅ   ro   rY   r]   r[   r¹   r¹   Õ   st   ‡ á3àÓØ)-€FÐ&Ó-Ù"'¸Ô"=Ð�iÓ=Ù"'¸Ô"=Ð�iÓ=Ù',¸TÔ'BÐ˜9ÓBÙ%*¸4Ô%@Ð˜Ó@Ø€GˆTÓØ€Eˆ=Óà€Hˆd×r]   r¹   c                  ó  € ] tR t^åtRtR R ltR R lt]R R l4       tR R	 lt	R
 R lt
R�R R lltR R lt]R R l4       t]R 4       tR�R R lltR R ltRR/R R lltR R lt]3R R  lltR!]/R" R# lltR$RR%R& R'RR(R/R) R* llt]R+ R, l4       t]R- R. l4       t]R/ R0 l4       t]R1 R2 l4       tR3 R4 ltR5 R6 ltR7R/R8 R9 lltR: R; lt] R‘R< R= ll4       t!R> R? lt"R’R@ RA llt#RBt$]%RC RD l4       t&]'RE RF l4       t(RG RH lt)R“RIRRJR/RK RL lllt*RM RN lt+RO RP lt,RQ RR lt-RS RT lt.RU RV lt/RW RX lt0] R”RY RZ ll4       t1] R•R[ R\ ll4       t2R] R^ lt3] R_ R` l4       t4Ra Rb lt5Rc Rd lt6] Re Rf l4       t7] R–Rg Rh ll4       t8Ri Rj lt9Rk Rl lt:Rm Rn lt;] RoRRpR/Rq Rr ll4       t<Rs Rt lt=RuRRvRRwRx/Ry Rz llt>R{R/R| R} llt?R~ R lt@R€ R� ltAR‚ Rƒ ltBR„R…R†]C/R‡ Rˆ lltDR�R‰ RŠ lltER‹ RŒ ltF^ R�IGHHtHHItI RŽtJR# )—ÚPluginContextz=Facade given to plugins so they can register tools and hooks.c               ó    € V ^8„  d   QhRRRR/# )rW   rº   r   ÚmanagerÚPluginManagerrY   )rZ   s   "r[   r\   ÚPluginContext.__annotate__è   s   € ÷ %ñ % ð %¸-ñ %r]   c                	ó:   € Wn         W n        R V n        RV n        R # )NF)rº   Ú_managerÚ_llmÚ_load_abandoned)Úselfrº   rË   s   &&&r[   Ú__init__ÚPluginContext.__init__è   s   € Ø ŒØŒØˆŒ	ð  %ˆÖr]   c               ó   € V ^8„  d   QhRR/# ©rW   rX   ru   rY   )rZ   s   "r[   r\   rÍ   ð   s   € ÷ $ñ $˜tñ $r]   c                ó   € RV n         R# )z_Mark this load as timed out; every later ``register_*``/``subscribe``/``on_unload`` is ignored.TN)rÑ   ©rÒ   s   &r[   Ú_abandon_loadÚPluginContext._abandon_loadð   s
   € à#ˆÖr]   c               ó   € V ^8„  d   QhRR/# ©rW   rX   ÚstrrY   )rZ   s   "r[   r\   rÍ   õ   s   € ÷ +ñ +˜3ñ +r]   c                ó,   € \        V P                  4      # )zCReturn the effective registry id used for this plugin's namespaces.)r    rº   rØ   s   &r[   Ú	plugin_idÚPluginContext.plugin_idô   s   € ô ˜DŸM™MÓ*Ð*r]   c               ó    € V ^8„  d   QhRRRR/# )rW   rß   rÝ   rX   rt   rY   )rZ   s   "r[   r\   rÍ   ù   s   € ÷ 
ñ 
 Cð 
¨Dñ 
r]   c                ó   a€ \         ;QJ dA    V3R lV P                  P                  P                  4        4       F  '       g   K   R# 	  R# ! V3R lV P                  P                  P                  4        4       4      # )zšReturn True when another plugin is loaded and enabled (runtime probe for advisory
``requires_plugins``, #64165). Matches on registry key or manifest name.c              3  óœ   <"  € T FA  w  rVP                   ;'       d'    VS8H  ;'       g    VP                  P                  S8H  x € KC  	  R # 5i©N)rÂ   rº   Úname)Ú.0ÚkeyÚloadedrß   s   &  €r[   Ú	<genexpr>Ú+PluginContext.has_plugin.<locals>.<genexpr>ü   sE   øé € ð 
á=‘�ð �N‰N×VÐV  yÑ 0× UÐ U°F·O±O×4HÑ4HÈIÑ4UÔVÛ=ùs   ƒA�Aª"ATF)ÚanyrÏ   Ú_pluginsÚitems)rÒ   rß   s   &fr[   Ú
has_pluginÚPluginContext.has_pluginù   sf   ø€ ÷ ‹sô 
à#Ÿ}™}×5Ñ5×;Ñ;Ô=ó
�sŒsð 	
Šsð 	
ˆsô 
à#Ÿ}™}×5Ñ5×;Ñ;Ô=ó
ó 
ð 	
r]   c               ó    € V ^8„  d   QhRRRR/# )rW   rç   rÝ   rX   ztuple[str, ...]rY   )rZ   s   "r[   r\   rÍ     s   € ÷ ñ ˜Sð  _ñ r]   c                óz   €  \        V4      #   \         d#    \        P                  RYP                  4       h i ; i)zGValidated plugin-relative settings path (warn + re-raise on rejection).z&Rejected config path %r from plugin %s)rR   Ú
ValueErrorr�   Úwarningrß   )rÒ   rç   s   &&r[   Ú	_segmentsÚPluginContext._segments  s7   € ð	Ü,¨SÓ1Ð1øÜô 	Ü�N‰NÐCÀSÏ.É.ÔYØð	ús   ‚
 �-:Nc               ó$   € V ^8„  d   QhRRRRRR/# )rW   rç   rÝ   Údefaultr	   rX   rY   )rZ   s   "r[   r\   rÍ   	  s&   € ÷ 
Lñ 
L˜cð 
L¨Cð 
L¸3ñ 
Lr]   c                ó  € V P                  V4      p\        \        4       ;'       g    / V P                  4      pVf   V# \	        VP                  R4      V\        4      pV\        Jd   V# \	        VP                  R4      W24      # )zŽRead plugin-relative ``plugins.entries.<plugin_id>.settings.<key>`` (falls back to the
legacy ``config`` subtree for migration compatibility).ÚsettingsÚconfig)rô   rS   r   rß   rQ   ÚgetÚ_UNSET)rÒ   rç   r÷   ÚsegmentsÚentryÚvalues   &&&   r[   Ú
get_configÚPluginContext.get_config	  sr   € ð —>‘> #Ó&ˆÜ&Ô';Ó'=×'CÐ'CÀÀTÇ^Á^ÓTˆØŠ=ØˆNÜ$ U§Y¡Y¨zÓ%:¸HÄfÓMˆØœÓØˆLÜ# E§I¡I¨hÓ$7¸ÓKÐKr]   c               ó$   € V ^8„  d   QhRRRRRR/# )rW   rç   rÝ   rÿ   r	   rX   ru   rY   )rZ   s   "r[   r\   rÍ     s&   € ÷ Hñ H˜cð H¨#ð H°$ñ Hr]   c                óR   € \        V P                  V P                  V4      V4       R# )zAAtomically write one value in this plugin's ``settings`` subtree.N)rT   rß   rô   )rÒ   rç   rÿ   s   &&&r[   Ú
set_configÚPluginContext.set_config  s   € ä˜DŸN™N¨D¯N©N¸3Ó,?ÀÖGr]   c               ó   € V ^8„  d   QhRR/# )rW   rX   rN   rY   )rZ   s   "r[   r\   rÍ     s   € ÷ Jñ J�{ñ Jr]   c                óV   € \        V P                  V P                  P                  4      # )z7This plugin's profile-scoped durable JSON state facade.)rN   rß   rº   Úskill_namespacerØ   s   &r[   ÚstateÚPluginContext.state  s   € ô ˜4Ÿ>™>¨4¯=©=×+HÑ+HÓIÐIr]   c                ó2   € ^ RI Hp V! V P                  4      # )u<  Capability-gated platform action facade (``add_reaction``, ``set_thread_title``). Every call
re-checks ``gateway.platform_actions`` (legacy ``plugins.entries.<id>.allow_platform_actions``,
default OFF) and returns ``{"ok": bool, ...}`` â€” verbs never raise into hook dispatch; no adapter
handles or raw SDK objects.)ÚPlatformActions)Úhermes_cli.platform_actionsr  rß   )rÒ   r  s   & r[   Úplatform_actionsÚPluginContext.platform_actions  s   € õ 	@Ù˜tŸ~™~Ó.Ð.r]   Úac          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
rW   Úobjr	   Ú
base_classÚtypeÚlabelrÝ   ÚarticlerX   rt   rY   )rZ   s   "r[   r\   rÍ   '  s0   € ÷ ñ ˜sð °ð ¸Sð È3ð ÐY]ñ r]   c                ó˜   € \        W4      '       d   R# \        P                  RV P                  P                  WCVP
                  4       R# )zJWarn-and-ignore gate shared by every registrar that requires a base class.FzLPlugin '%s' tried to register %s %s that does not inherit from %s. Ignoring.T)Ú
isinstancer�   ró   rº   rå   rj   )rÒ   r  r  r  r  s   &&&&&r[   Ú_wrong_typeÚPluginContext._wrong_type'  s:   € ä�c×&Ò&ÙÜ�‰ÐeØ—}‘}×)Ñ)¨7¸:×;NÑ;Nô	Pár]   c               ó    € V ^8„  d   QhRRRR/# )rW   ÚwhatrÝ   rX   rò   rY   )rZ   s   "r[   r\   rÍ   /  s   € ÷ Vñ V˜Cð V Jñ Vr]   c                óN   € \        RV P                  P                   RV R24      # )zY``ValueError`` for a malformed registration (``what`` completes "tried to register ...").úPlugin 'z' tried to register Ú.)rò   rº   rå   )rÒ   r  s   &&r[   Ú_refuseÚPluginContext._refuse/  s)   € ä˜H T§]¡]×%7Ñ%7Ð$8Ð8LÈTÈFÐRSÐTÓUÐUr]   Ú
persistentFc          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
rW   ÚkindrÝ   rç   ÚreleaseúCallable[[], None]r"  rt   rX   rK   rY   )rZ   s   "r[   r\   rÍ   3  s;   € ÷ kñ kØðkØ!ðkØ,>ðkØOSðkà	ñkr]   c               óR   € V P                   P                  V P                  WW4R7      # )z[Record host-owned cleanup for a registration (``persistent``: see ``_track_registration``).©r"  )rÏ   Ú_track_registrationrº   )rÒ   r$  rç   r%  r"  s   &&&&$r[   Ú_trackÚPluginContext._track3  s$   € ð �}‰}×0Ñ0°·±ÀÈ7Ð0ÓjÐjr]   c               ó4   € V ^8„  d   QhRRRRRRRRRRR	R
RR/# )rW   r$  rÝ   rç   ÚslotÚtupleÚcurrentr	   ÚpreviousÚrestorezCallable[[Any], bool]rX   rK   rY   )rZ   s   "r[   r\   rÍ   9  sF   € ÷ 5ñ 5Øð5Ø!ð5Ø,1ð5Ø<?ð5ØKNð5à&ð5ð 
ñ5r]   c               ój   € \         P                  ! W4WVR7      pV P                  WVP                  4      # )zFTrack one generation in a replaceable manager-local registration slot.)r/  r0  r1  )r   Úacquirer*  Údispose)rÒ   r$  rç   r-  r/  r0  r1  Úleases   &&&$$$$ r[   Ú_track_replacementÚ PluginContext._track_replacement9  s,   € ô
 (×/Ò/°ÐPXÔjˆØ�{‰{˜4 e§m¡mÓ4Ð4r]   c               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )rW   r$  rÝ   rç   Úmappingúdict[str, Any]rþ   r	   r0  rX   rK   rY   )rZ   s   "r[   r\   rÍ   A  s<   € ÷ 
ñ 
Øð
Ø!ð
Ø,:ð
ØCFð
ØRUð
à	ñ
r]   c                óž   a aaa€ V\         J d   SP                  S4      pSSS&   S P                  VSR\        S4      S3SVVVVV 3R lR7      # )zÃStore ``entry`` under ``key`` in a manager-local mapping and lease the slot; unload restores
``previous`` (default: the displaced entry, or removes the key) only while ``entry`` is still
current.Úmanager_mappingc                ó@   <€ SP                   P                  SSSV 4      # rä   )rÏ   Ú_restore_mapping)Úreplacementrþ   rç   r9  rÒ   s   &€€€€r[   Ú<lambda>Ú4PluginContext._track_mapping_entry.<locals>.<lambda>L  s   ø€ ¨¯©×(FÑ(FÀwÐPSÐUZÐ\gÔ(hr]   ©r-  r/  r0  r1  )rü   rû   r6  Úid)rÒ   r$  rç   r9  rþ   r0  s   f&fff&r[   Ú_track_mapping_entryÚ"PluginContext._track_mapping_entryA  sW   û€ ð ”vÓØ—{‘{ 3Ó'ˆHØˆ�‰Ø×&Ñ&Ø�#Ð.´°7³¸SÐAÈ5Ð[cßhð 'ó 
ð 	
r]   r0  c               ó8   € V ^8„  d   QhRRRRRRRRRRR	RR
RRR/# )rW   r$  rÝ   rç   r9  r:  rþ   r	   Úlog_fmtÚlog_argsr0  rX   rK   rY   )rZ   s   "r[   r\   rÍ   O  sN   € ÷ ñ ØðØ!ðØ,:ðØCFðØQTðØadðàðð 
ñr]   c               ó„   € V P                  WW4V4      p\        P                  ! WPP                  P                  .VO5!   V# )z]Store + lease a manager-mapping entry, then debug-log ``log_fmt % (plugin name, *log_args)``.)rD  r�   r„   rº   rå   )	rÒ   r$  rç   r9  rþ   rG  r0  rH  Úhandles	   &&&&&&$* r[   Ú_register_entryÚPluginContext._register_entryO  s8   € ð
 ×*Ñ*¨4°gÀhÓOˆÜ�Š�WŸm™m×0Ñ0Ð<°8Ô<Øˆr]   r  Ú	normalizec                	ó"   € V P                  4       # rä   )Ústrip)Úns   &r[   r@  ÚPluginContext.<lambda>Z  s   € ÐRS×RYÑRYÔR[r]   ÚregisterÚreject_messagec               ó@   € V ^8„  d   QhRRRRRRRRRRR	RR
RRRRRRR/
# )rW   Úproviderr	   r$  rÝ   r  r  Úregistryr  r  rM  zOptional[Callable[[str], str]]rR  zOptional[Callable[..., Any]]rS  rÃ   rX   úOptional[PluginRegistration]rY   )rZ   s   "r[   r\   rÍ   X  sd   € ÷ ñ ØðØ&)ðØ7;ðØGJðØSVðàðà'Eðð /ðð HUðð 
&ñ	r]   c               óˆ  € V P                  WWV4      '       d   R# Vf   VP                  MV! VP                  4      p
V P                  P                  pVP	                  W«R7      p T;'       g    VP
                  ! WR7      pTe	   T'       d   TP	                  Y«R7      TJd   R# T P                  P                  T P                  Y*YAT4      p\        P                  RT P                  P                  YZ4       T#   \         d;   pT	f   h \        P                  Y�P                  P                  T4        Rp?R# Rp?ii ; i)a9  Shared body of the ``register_<category>_provider`` methods: type-check (warn + ignore),
register in the scope-keyed ``registry``, lease the slot so unload restores the displaced entry.
``None`` when the registry refused/replaced the provider (``ValueError`` with ``reject_message``
set, or a falsy ``register``).N©ÚscopezPlugin '%s' registered %s: %s)r  rå   rÏ   Ú	scope_keyÚsnapshot_registrationÚregister_providerrò   r�   ró   rº   Ú_track_scoped_registrationÚinfo)rÒ   rU  r$  r  rV  r  r  rM  rR  rS  Úregistry_namerZ  r0  ÚacceptedÚexcrJ  s   &&$$$$$$$$      r[   Ú_register_scoped_providerÚ'PluginContext._register_scoped_providerX  s  € ð ×Ñ˜H°%×AÒAÙØ)2Ò):˜ŸšÁ	È(Ï-É-Ó@XˆØ—‘×'Ñ'ˆØ×1Ñ1°-Ð1ÓMˆð	Ø ×>Ð> H×$>Ñ$>Ð>ÀÔVˆHð Ò ¯°h×6TÑ6TØð 7Uó 7
àó7ñ Ø—‘×9Ñ9Ø�M‰M˜4°ÀHó
ˆô 	�‰Ð3°T·]±]×5GÑ5GÈÔ^Øˆøô ô 	ØÒ%ØÜ�N‰N˜>¯=©=×+=Ñ+=¸sÔCÝûð		ús   Á&C< Á/C< Ã<EÄ/D<Ä<Ec               ó   € V ^8„  d   QhRR/# ©rW   rX   r	   rY   )rZ   s   "r[   r\   rÍ   x  s   € ÷ ñ �Sñ r]   c                ór   € V P                   f   ^ RIHp V! V P                  R7      V n         V P                   # )zÎHost-owned :class:`agent.plugin_llm.PluginLlm` facade: completions on the user's active
model/auth. Overrides (model, agent id, auth profile) are fail-closed, gated by
``plugins.entries.<plugin_id>.llm.*``.)Ú	PluginLlm)rß   )rÐ   Úagent.plugin_llmrh  rß   )rÒ   rh  s   & r[   ÚllmÚPluginContext.llmw  s+   € ð
 �9‰9ÒÝ2Ù!¨D¯N©NÔ;ˆDŒIØ�y‰yÐr]   c               ó   € V ^8„  d   QhRR/# rf  rY   )rZ   s   "r[   r\   rÍ   ‚  s   € ÷ Dñ D Cñ Dr]   c                ó"   € ^ RI HpHp V! V4      # )z}Plugin-safe subagent lifecycle service: serializable handles and immutable snapshots,
never a live agent or private registry.)ÚSubagentLifecycleServiceÚget_active_subagent_parent)Úagent.subagent_lifecyclern  ro  )rÒ   rn  ro  s   &  r[   Úsubagent_lifecycleÚ PluginContext.subagent_lifecycle�  s   € ÷ 	bÙ'Ð(BÓCÐCr]   c               ó   € V ^8„  d   QhRR/# rf  rY   )rZ   s   "r[   r\   rÍ   ‰  s   € ÷ $ñ $ Sñ $r]   c                ó   € ^ RI Hp V! 4       # )zÆ``agent.delegation_backends.DelegationBackends``: list delegation backends and switch them per session or
globally (a ``/delegation`` command); a host remote facade, so it acts on the owner process.)ÚDelegationBackends)Úagent.delegation_backendsru  )rÒ   ru  s   & r[   Údelegation_backendsÚ!PluginContext.delegation_backendsˆ  s   € õ 	AÙ!Ó#Ð#r]   c               ó   € V ^8„  d   QhRR/# rÜ   rY   )rZ   s   "r[   r\   rÍ   �  s   € ÷ ñ ˜cñ r]   c                óB   €  ^ RI Hp V! 4       #   \         d     R# i ; i)uæ   Active profile name (``"default"``, the ``~/.hermes/profiles/<name>`` id, or ``"custom"``),
derived from ``HERMES_HOME`` â€” not ``_cli_ref``, which is None outside the interactive CLI â€”
so gateway and kanban workers get it too.)Úget_active_profile_namer÷   )Úhermes_cli.profilesr{  Ú	Exception)rÒ   r{  s   & r[   Úprofile_nameÚPluginContext.profile_name�  s%   € ð
	ÝCÙ*Ó,Ð,øÜô 	Úð	ús   ‚ ��c               ó   € V ^8„  d   QhRR/# rf  rY   )rZ   s   "r[   r\   rÍ   š  s   € ÷ (ñ (¨ñ (r]   c                ó   € ^ RI Hp V! 4       # )zVThe cron run executing now (``cron.execution_identity.CronExecution``), else ``None``.)Úcurrent_cron_execution)Úcron.execution_identityr‚  )rÒ   r‚  s   & r[   r‚  Ú$PluginContext.current_cron_executionš  s   € åBÙ%Ó'Ð'r]   c               ó    € V ^8„  d   QhRRRR/# )rW   Úcallbackr&  rX   rK   rY   )rZ   s   "r[   r\   rÍ   Ÿ  s   € ÷ ñ Ð"4ð Ð9Kñ r]   c                óÎ   € \        V4      '       g   \        R4      hV P                  R\        VRR4      V4      p\        P                  RV P                  P                  4       V# )zšRegister a cleanup callback for unload: runs in reverse acquisition order interleaved
with registration teardown; exceptions are logged, never propagated.z#on_unload callback must be callableÚ	on_unloadrj   r†  z'Plugin %s registered on_unload callback)ÚcallableÚ	TypeErrorr*  Úgetattrr�   r„   rº   rå   )rÒ   r†  rJ  s   && r[   rˆ  ÚPluginContext.on_unloadŸ  sU   € ô ˜×!Ò!ÜÐAÓBÐBØ—‘˜[¬'°(¸JÈ
Ó*SÐU]Ó^ˆÜ�‰Ð>ÀÇÁ×@RÑ@RÔSØˆr]   rå   c               ó    € V ^8„  d   QhRRRR/# )rW   rå   rÃ   rX   zasyncio.TaskrY   )rZ   s   "r[   r\   rÍ   ¨  s   € ÷ 
ñ 
¨ð 
Àñ 
r]   c               óˆ  aa€ \         P                  ! V4      '       g   \        R4      h\         P                  ! 4       pT;'       g    RV P                   R2pVP                  WR7      oV P                  RVV3R l4      oSP                  V3R l4       \        P                  RV P                  P                  V4       S# )	zVSpawn a supervised asyncio task; unload/force reload cancels it. Needs a running loop.zspawn_task expects a coroutineúplugin:z:task)rå   Úbackground_taskc                 óT   <€ S P                  4       ;'       g    S P                  4       # rä   )ÚdoneÚcancel)Útasks   €r[   r@  Ú*PluginContext.spawn_task.<locals>.<lambda>¯  s    ø€ À4Ç9Á9Ã;×C_ÐC_ÐRV×R]ÑR]ÓR_ÐC_r]   c                ó$   <€ SP                  4       # rä   )r4  )Ú_trJ  s   &€r[   r@  r•  °  s   ø€ ¨&¯.©.Ô*:r]   z%Plugin %s spawned supervised task: %s)ÚasyncioÚiscoroutinerŠ  Úget_running_looprß   Úcreate_taskr*  Úadd_done_callbackr�   r„   rº   rå   )rÒ   Úcororå   ÚloopÚ	task_namerJ  r”  s   &&$  @@r[   Ú
spawn_taskÚPluginContext.spawn_task¨  s    ù€ ä×"Ò" 4×(Ò(ÜÐ<Ó=Ð=Ü×'Ò'Ó)ˆØ×;Ð;˜g d§n¡nÐ%5°UÐ;ˆ	Ø×Ñ ÐÓ5ˆØ—‘Ð.°	Ô;_Ó`ˆØ×ÑÔ:Ô;Ü�‰Ð<¸d¿m¹m×>PÑ>PÐR[Ô\Øˆr]   c               ó$   € V ^8„  d   QhRRRRRR/# )rW   rå   rÝ   Ú
present_fnr
   rX   ru   rY   )rZ   s   "r[   r\   rÍ   ´  s&   € ÷ Xñ X°ð XÀð XÈdñ Xr]   c           	     ó`  € ^ RI Hp V P                  P                  p\	        V4      P                  4       P                  4       pVR8X  d   \        R4      h\        P                  ! RV4      '       g   \        R4      h\        V4      '       g   \        R4      hWT9   d&   WE,          P                  p\        RV: RV: 24      hV! WRV P                  \	        \        4       P                  4       4      R	7      p\        P!                  R
V P                  V4       V P#                  RWTVR4       R# )zÿRegister a human approval transport, inactive until ``security.approval.transport:
<name>`` selects it. It receives a redacted ``ApprovalRequest`` and returns only a
correlated decision; policy and persistence stay host-owned. ``present_fn`` may be async.©ÚRegisteredApprovalTransportÚbuiltinú-approval transport name 'builtin' is reservedú[a-z0-9][a-z0-9_-]{0,63}ú;approval transport name must match [a-z0-9][a-z0-9_-]{0,63}ú.approval transport present_fn must be callableúapproval transport ú is already registered by ©rå   Úpresentrß   Úprofile_homeú+Plugin %s registered approval transport: %sÚapproval_transportN)Úhermes_cli.approval_transportr¦  rÏ   Ú_approval_transportsrÝ   rO  Úlowerrò   ÚreÚ	fullmatchr‰  rŠ  rß   r   rd   r�   r_  rD  )rÒ   rå   r£  r¦  Ú
transportsÚcleanÚownerrþ   s   &&&     r[   Úregister_approval_transportÚ)PluginContext.register_approval_transport´  s   € õ 	NØ—]‘]×7Ñ7ˆ
Ü�D“	—‘Ó!×'Ñ'Ó)ˆØ�IÔÜÐLÓMÐMÜ�|Š|Ð7¸×?Ò?ÜÐZÓ[Ð[Ü˜
×#Ò#ÜÐLÓMÐMØÔØÕ%×/Ñ/ˆEÜÐ2°5±)Ð;UÐV[ÑU^Ð_Ó`Ð`Ù+Ø°d·n±nÜœ_Ó.×6Ñ6Ó8Ó9ô
ˆô 	�‰ÐAÀ4Ç>Á>ÐSXÔYð 	×!Ñ!Ð"6¸È5ÐRVÖWr]   c               óD   € V ^8„  d   QhRRRRRRRRRR	R
RRRRRRRRRRR/# )rW   rå   rÝ   ÚtoolsetÚschemaÚdictr…   r
   Úcheck_fnúCallable | NoneÚrequires_envúlist | NoneÚis_asyncrt   ÚdescriptionÚemojiÚoverriderX   rW  rY   )rZ   s   "r[   r\   rÍ   Î  sl   € ÷ %ñ %Øð%Ø"%ð%Ø/3ð%Ø>Fð%à!ð%à8Cð%àVZð%ð ð%ð '*ð%ð ;?ð%ð 
&ñ	%r]   c                óX  a a€ V
'       dM   S P                  S4      '       g6   \        RS P                  P                  : RS: RS P                   R24      h^ RIHp S P                  P                  pVP                  SVR7      pVfK   V
'       gC   VP                  SVR7      e.   \        P                  RS P                  P                  S4       R# VP                  SW#WEWgW‰W¬R	7       VP                  SVR7      pRpVek   WíJdf   VP                  VJ dV   S P                  P                  P!                  S4       S P                  P#                  S P                  R
SW¾VVV 3R lR7      p\        P%                  RS P                  P                  SV
'       d	   R4       V# R4       V# )uw  Register a tool in the global registry and track it as plugin-provided. ``override=True``
replaces a same-named built-in (without it a name claimed by another toolset is rejected) and
needs operator opt-in via ``plugins.entries.<plugin_id>.allow_tool_override: true`` â€” otherwise
any enabled plugin could silently replace a privileged built-in like ``write_file`` (#23194).úPlugin z cannot override built-in tool z. Set plugins.entries.zY.allow_tool_override: true in config.yaml to allow this plugin to replace built-in tools.©rV  rY  Nz>Plugin %s tried to shadow global tool %s without override=True)rå   r¾  r¿  r…   rÁ  rÃ  rÅ  rÆ  rÇ  rÈ  rZ  Útoolc                 ó:   <€ SP                   P                  S 4      # rä   )rÏ   Ú_remove_tool_name_if_unowned©rå   rÒ   s   €€r[   r@  Ú-PluginContext.register_tool.<locals>.<lambda>ï  s   ø€  §¡×!KÑ!KÈDÔ!Qr]   ©ÚfinalizezPlugin %s registered tool: %s%sz (override)Ú )Ú_tool_override_allowedri   rº   rå   rß   Útools.registryrV  rÏ   r[  r\  Ú	get_entryr�   ró   rR  r…   Ú_plugin_tool_namesÚaddr^  r„   )rÒ   rå   r¾  r¿  r…   rÁ  rÃ  rÅ  rÆ  rÇ  rÈ  rV  rZ  r0  Ú
registeredrJ  s   ff&&&&&&&&&     r[   Úregister_toolÚPluginContext.register_toolÍ  s”  ù€ ÷ ˜D×7Ñ7¸×=Ò=Ü)Ø˜$Ÿ-™-×,Ñ,Ñ/Ð/NÈtÉhð W#Ø#'§>¡>Ð"2ð 3QðRóð õ
 	,Ø—‘×'Ñ'ˆØ×1Ñ1°$¸eÐ1ÓDˆØÒ§H°×1CÑ1CÀDÐPUÐ1CÓ1VÒ1bÜ�N‰NÐ[ØŸ=™=×-Ñ-¨tô5áØ×ÑØ˜w¸wØ%ÀkØð 	ô 	
ð
 ×3Ñ3°DÀÐ3ÓFˆ
ØˆØÒ! jÓ&@ÀZ×EWÑEWÐ[bÓEbØ�M‰M×,Ñ,×0Ñ0°Ô6Ø—]‘]×=Ñ=Ø—‘˜v t¨XÀ8ÝQð >ó ˆFô 	�‰Ð6¸¿¹×8JÑ8JÈDß&.�]ô	8àˆð 57ô	8àˆr]   c               ó    € V ^8„  d   QhRRRR/# )rW   Ú
capabilityrÝ   rX   rt   rY   )rZ   s   "r[   r\   rÍ   ö  s   € ÷ Eñ E¨ð E°ñ Er]   c                óv   € V P                   P                  R8X  d
   VR8X  d   R# \        V P                  V4      # )a  True when *capability* is live for this plugin (probe, then degrade gracefully). Bundled
plugins are trusted for ``tools.override``; otherwise granted_capabilities or the legacy
``allow_*`` key decides. Unknown ids / unreadable consent -> False (fail closed).Úbundledútools.overrideT)rº   Úsourcer   rß   )rÒ   rÝ  s   &&r[   Úhas_capabilityÚPluginContext.has_capabilityö  s2   € ð �=‰=×Ñ 9Ô,°Ð?OÔ1OÙÜ(¨¯©¸ÓDÐDr]   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
rW   ÚserverrÝ   rÌ  Ú	argumentsúOptional[dict[str, Any]]ÚtimeoutÚfloatrX   r:  rY   )rZ   s   "r[   r\   rÍ   þ  s6   € ÷ 'ñ 'Øð'Ø!$ð'Ø1Ið'àð'ð 
ñ'r]   c                ó  € WP                  V P                  4      9  d6   \        RV P                  P                  : RV: RV P                   R24      h \        V4      p\        R\        VR4      4      p^ RI
Hp V! WV4      ! \        T;'       g    / 4      4      p\        P                  R	V P                  P                  YT\        T;'       g    R
4      4       V P!                  V4      #   \        \        3 d    Rp L¤i ; i)u7  Call ``tool`` on MCP ``server`` synchronously through :mod:`tools.mcp_tool`'s native client
(same trust gates, breaker, reconnect â€” never a parallel connection). Servers not in
``plugins.entries.<plugin_id>.mcp_allowlist`` raise ``PermissionError`` (default-deny). ``timeout``
clamps to 1â€“600s; results over ~64KB are truncated with a marker.

This is a per-server grant, deliberately not ambient authority over every configured server.
TODO(#64228): swap the per-server allowlist for the declared capability model once it lands
(per-tool grants, expiry, ro/rw).
rÊ  z# is not allowed to call MCP server z. Add it to plugins.entries.zI.mcp_allowlist in config.yaml to grant access (default is no MCP access).ç      >@g      ð?g     À‚@)Ú_make_tool_handlerz;Plugin %s called MCP %s/%s (timeout=%ss, %d chars returned)rÓ  )Ú_mcp_allowlistrß   ÚPermissionErrorrº   rå   ré  rŠ  rò   ÚmaxÚminÚtools.mcp_tool_handlersrì  rÀ  r�   r„   ÚlenÚ_mcp_envelope)rÒ   rå  rÌ  ræ  rè  rì  Úraws   &&&&&  r[   Úcall_mcpÚPluginContext.call_mcpþ  sö   € ð ×,Ñ,¨T¯^©^Ó<Ô<Ü!Ø˜$Ÿ-™-×,Ñ,Ñ/ð 0Ø ™ð $#Ø#'§>¡>Ð"2ð 3>ð?óð ð	Ü˜G“nˆGô �cœ3˜w¨Ó.Ó/ˆÝ>Ù  ¨wÔ7¼¸Y¿_¸_È"Ó8MÓNˆÜ�‰ÐRØ—]‘]×'Ñ'¨°wÄÀCÇIÀIÈ2Ãô	Pà×!Ñ! #Ó&Ð&øô œ:Ð&ô 	ØŠGð	ús   ÁC0 Ã0DÄDi   c               ó    € V ^8„  d   QhRRRR/# )rW   rô  r	   rX   r:  rY   )rZ   s   "r[   r\   rÍ      s   € ÷ Jñ J ð J¨ñ Jr]   c                ó*  € \        V\        4      '       g   Vf   RM
\        V4      p\        V4      V P                  8„  pV'       d   VRV P                   R,           p \        P
                  ! V4      p\        V\        4      '       d   RV9   d   RRRVR,          /pMJ\        V\        4      '       d)   RV9   d"   RRRVR,          /pR	V9   d   VR	,          VR	&   MRRRVe   TMT/pV'       d	   / VCR
R/C# T#   \        \        3 d    Rp Lœi ; i)z>Normalize an MCP handler result string into a stable envelope.NrÓ  u   â€¦ [truncated]rÄ   ÚokFÚresultTÚstructuredContentÚ	truncated)	r  rÝ   rò  Ú_MCP_RESULT_CHAR_CAPÚjsonÚloadsrò   rŠ  rÀ  )Úclsrô  rü  ÚparsedÚenvelopes   &&   r[   ró  ÚPluginContext._mcp_envelope  s  € ô ˜#œs×#Ò#Øš‘"¬¨S«ˆCÜ˜“H˜s×7Ñ7Ñ7ˆ	ßØÐ0˜×0Ñ0Ð1Ð4EÕEˆCð	ÜŸ*š* S›/ˆFô �fœd×#Ò#¨°6Ô(9Ø(,¨e°W¸fÀW½oÐ'N‰HÜ˜¤×%Ò%¨(°fÔ*<Ø˜d H¨f°XÕ.>Ð?ˆHØ" fÔ,Ø06Ð7JÕ0K�Ð,Ñ-øà˜d H¸Ò8J©fÐPSÐTˆHß2;Ð.�(Ð.˜K¨Ñ.ÐIÀÐIøô œIÐ&ô 	ØŠFð	ús   ÁC< Ã<DÄDc               ó    € V ^8„  d   QhRRRR/# )rW   rß   rÝ   rX   r½   rY   )rZ   s   "r[   r\   rÍ   6  s   € ÷ Xñ X #ð X¨)ñ Xr]   c                ó  €  ^ RI Hp V! 4       ;'       g    / p\        Y 4      ;'       g    / P	                  R4      p\        T\        4      '       d   T Uu. uF  p\        T4      NK  	  up# . #   \         d    . u # i ; iu upi )zOOperator-granted MCP server allowlist; missing/unreadable -> [] (default-deny).©Úload_configÚmcp_allowlist)Úhermes_cli.configr  r}  rS   rû   r  rÇ   rÝ   )rß   r  ÚcfgÚ	allowlistÚitems   &    r[   rí  ÚPluginContext._mcp_allowlist5  s}   € ð	Ý5Ù“-×%Ð% 2ˆCô ,¨CÓ;×AÐA¸r×FÑFÀÓWˆ	Ü4>¸yÌ$×4OÒ4O¡iÓ0¡i˜d”�D–	¡iÑ0ÐWÐUWÐWøô ô 	ØŠIð	üò 1s   ‚A0 –A0 ÁBÁ0B Á?B c               ó    € V ^8„  d   QhRRRR/# )rW   Ú	tool_namerÝ   rX   rt   rY   )rZ   s   "r[   r\   rÍ   @  s   € ÷ Wñ W°ð W¸ñ Wr]   c                óF  € V P                   P                  R8X  d   R#  ^ RIHp \	        V P
                  P                  4      ;_uu_ 4        V! 4       ;'       g    / pRRR4       \        T P                  RXR7      #   + '       g   i     L(; i  \         d     R# i ; i)a4  Whether this plugin may override built-in tools: bundled plugins are trusted (a maintainer
choice, not privilege escalation); others need ``tools.override`` via
:func:`plugin_capability_granted` (granted_capabilities OR legacy ``allow_tool_override: true``,
still honored for backward compatibility; #64228).rß  Tr  NFrà  )rú   )
rº   rá  r	  r  r3   rÏ   Ú	home_pathr}  r   rß   )rÒ   r  r  r
  s   &&  r[   rÔ  Ú$PluginContext._tool_override_allowed@  s{   € ð
 �=‰=×Ñ 9Ô,Ùð	Ý5Ü# D§M¡M×$;Ñ$;×<Õ<Ù!“m×)Ð) r�÷ =ô )¨¯©Ð9IÐRUÔVÐV÷ =×<ûäô 	Úð	ús/   Ÿ-B ÁA>ÁB Á>B	Â	B ÂB ÂB ÂB Úsession_keyÚoriginc          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
rW   ÚcontentrÝ   Úroler  ú
str | Noner  zMapping[str, Any] | NonerX   rt   rY   )rZ   s   "r[   r\   rÍ   T  s=   € ÷ bñ bØðbØ"%ðbØ@Jðbà(ðbð 
ñbr]   c               ó$   € ^ RI Hp V! WW#VR7      # )z´Queue *content* for a session (``session_key``) or a chat in this plugin's own profile
(``origin``); ``True`` means a host accepted it. Contract: plugins_injection.py, plugin docs.)Úinject_plugin_message)r  r  )Úhermes_cli.plugins_injectionr  )rÒ   r  r  r  r  r  s   &&&$$ r[   Úinject_messageÚPluginContext.inject_messageT  s   € õ 	GÙ$ T°DÐZ`ÔaÐar]   c               ó   € V ^8„  d   QhRR/# rÜ   rY   )rZ   s   "r[   r\   rÍ   ]  s   € ÷ *ñ *˜Sñ *r]   c                ó2   € ^ RI Hp V! V P                  4      # )zQThe calling session's recorded cwd, never the gateway's own (``plugin_session``).)Úcontext_cwd)Úhermes_cli.plugin_sessionr   rÏ   )rÒ   r   s   & r[   Úsession_cwdÚPluginContext.session_cwd]  s   € å9Ù˜4Ÿ=™=Ó)Ð)r]   c               ó   € V ^8„  d   QhRR/# rÜ   rY   )rZ   s   "r[   r\   rÍ   b  s   € ÷ .ñ . ñ .r]   c                ó2   € ^ RI Hp V! V P                  4      # )zYThe calling session's client (``cli``/``tui``/``desktop``/``acp``) or messaging platform.)Úcontext_surface)r!  r&  rÏ   )rÒ   r&  s   & r[   Úsession_surfaceÚPluginContext.session_surfaceb  s   € å=Ù˜tŸ}™}Ó-Ð-r]   c               ó    € V ^8„  d   QhRRRR/# ©rW   ÚtextrÝ   rX   r	   rY   )rZ   s   "r[   r\   rÍ   g  s   € ÷  ñ   ð  ¨ñ  r]   c                ó   € ^ RI Hp V! W4      # )z·Post *text* into the session bound to this call; the handle's ``edit(text)`` updates it in
place. Never raises (``ok=False`` + ``error`` with no conversation): ``plugin_messages.py``.)Úpost)Úhermes_cli.plugin_messagesr-  )rÒ   r+  r-  s   && r[   Úpost_messageÚPluginContext.post_messageg  s   € õ 	4Ù�DÓÐr]   c               ó    € V ^8„  d   QhRRRR/# r*  rY   )rZ   s   "r[   r\   rÍ   m  s   € ÷ 'ñ '¨ð '°ñ 'r]   c              ƒ  ó:   "  € ^ RI Hp V! W4      G Rj  x€L
 #  L5i)zW``post_message`` for async code on the gateway loop (edit with ``await handle.aedit``).)ÚapostN)r.  r3  )rÒ   r+  r3  s   && r[   Úapost_messageÚPluginContext.apost_messagem  s   é € å4Ù˜4Ó&×&Ð&Ñ&ùs   ‚”•c               ó$   € V ^8„  d   QhRRRRRR/# )rW   ÚquestionrÝ   ÚchoicesrÇ   rX   rÃ   rY   )rZ   s   "r[   r\   rÍ   r  s!   € ÷ -ñ - 3ð -°ð -¸-ñ -r]   c                ó   € ^ RI Hp V! W4      # )z³From a sync slash-command handler: ask its user to pick one of *choices* (``str`` or
``{value, label?, description?}``); the value, or None if unanswerable: ``plugin_choices.py``.)Ú
ask_choice)Úhermes_cli.plugin_choicesr:  )rÒ   r7  r8  r:  s   &&& r[   r:  ÚPluginContext.ask_choicer  s   € õ 	9Ù˜(Ó,Ð,r]   c               ó   € V ^8„  d   QhRR/# ©rW   rX   rt   rY   )rZ   s   "r[   r\   rÍ   x  s   € ÷ jñ j¨Dñ jr]   c                ó8  €  \        V P                  P                  4      ;_uu_ 4        \        4       ;'       g    / pRRR4       \        XT P                  4      ;'       g    / P                  R4      RJ #   + '       g   i     LA; i  \         d     R# i ; i)z’Return whether this plugin may trigger gateway session turns (read from the plugin's
own profile config, never the calling thread's ambient home).NFÚallow_gateway_injectionT)r3   rÏ   r  r   r}  rS   rß   rû   )rÒ   r
  s   & r[   Ú_gateway_injection_allowedÚ(PluginContext._gateway_injection_allowedx  sx   € ð	Ü# D§M¡M×$;Ñ$;×<Õ<Ü*Ó,×2Ð2°�÷ =ô ' s¨D¯N©NÓ;×AÐA¸r×FÑFÐG`ÓaÐeiÐiÐi÷	 =×<ûäô 	Úð	ús-   ‚'B
 ©A7¾B
 Á7B	ÂB
 ÂB
 Â
BÂBc               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )rW   rå   rÝ   ÚhelpÚsetup_fnr
   Ú
handler_fnrÂ  rÆ  rX   rK   rY   )rZ   s   "r[   r\   rÍ   ƒ  sF   € ÷ Rñ RØðRØ"ðRØ.6ðRØDSðRàðRð 
ñRr]   c                ó°   € RVRVRVRVRVRV P                   P                  RV P                  /pV P                  RWP                  P
                  VR	V4      # )
z�Register a CLI subcommand (``hermes <name> ...``). *setup_fn* receives the argparse
subparser; *handler_fn* becomes ``set_defaults(func=...)``.rå   rD  rÆ  rE  rF  ÚpluginÚ
plugin_keyÚcli_commandz$Plugin %s registered CLI command: %s)rº   rå   rß   rK  rÏ   Ú_cli_commands)rÒ   rå   rD  rE  rF  rÆ  rþ   s   &&&&&& r[   Úregister_cli_commandÚ"PluginContext.register_cli_command‚  sh   € ð �D˜& $¨°{ÀJÐPXØ˜* h°·±×0BÑ0BÀLÐRV×R`ÑR`ð
ˆð ×#Ñ# M°4¿¹×9TÑ9TÐV[Ø$JÈDóRð 	Rr]   c               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )rW   rå   rÝ   r…   r
   rÆ  Ú	args_hintÚargument_moder  rX   rW  rY   )rZ   s   "r[   r\   rÍ   ‘  sF   € ÷ Pñ PØðPØ"*ðPØ9<ðPØNQðPà!ðPð 
&ñPr]   c                óð  € VP                  4       P                  4       P                  R4      P                  RR4      pV'       g-   \        P                  RV P                  P                  4       R# \        \        4      ;_uu_ 4        ^ RI
Hp V! V4      e7   \        P                  RV P                  P                  V4        RRR4       R#  RRR4       T;'       g    RP                  4       pR	TR
T;'       g    RRV P                  P                  RV P                  RTRVR9   d   TMV'       d   RMR/p	V P                  RW`P                  P                  V	RV4      #   + '       g   i     Lœ; i)ai  Register an in-session slash command (``/name``); handler ``fn(raw_args: str) -> str | None``
(sync or async), plus the session-context keywords it declares (``plugin_command_dispatch``). ``args_hint`` (e.g. ``"<file>"``) lets adapters like Discord surface an argument
field; without it the command registers parameterless there but still accepts trailing text.Ú/Ú Ú-z;Plugin '%s' tried to register a command with an empty name.N)Úresolve_commandz^Plugin '%s' tried to register command '/%s' which conflicts with a built-in command. Skipping.rÓ  r…   rÆ  zPlugin commandrH  rI  rO  rP  r+  Úcommandz!Plugin %s registered command: /%s>   r+  ÚmixedÚoptions)rµ  rO  ÚlstripÚreplacer�   ró   rº   rå   r   r}  Úhermes_cli.commandsrU  rß   rK  rÏ   Ú_plugin_commands)
rÒ   rå   r…   rÆ  rO  rP  r¹  rU  Úhintrþ   s
   &&&&&&    r[   Úregister_commandÚPluginContext.register_command�  s6  € ð —
‘
“×"Ñ"Ó$×+Ñ+¨CÓ0×8Ñ8¸¸cÓBˆßÜ�N‰NÐXÐZ^×ZgÑZg×ZlÑZlÔmÙÜ”i× Õ Ý;Ù˜uÓ%Ò1Ü—‘ð  DØEIÇ]Á]×EWÑEWÐY^ô`à÷ !Ñ à1÷ !ð —�˜R×&Ñ&Ó(ˆà�w ¨{×/NÐ/NÐ>NØ�d—m‘m×(Ñ(¨,¸¿¹ÈÐUYØ¨mÐ?[Ô.[™]ß ‘& dð	
ˆð ×#Ñ# I¨u·m±m×6TÑ6TÐV[Ø$GÈóPð 	P÷ !× ús   Â	=E%Å%E5	c               ó$   € V ^8„  d   QhRRRRRR/# )rW   r  rÝ   ÚargsrÀ  rX   rY   )rZ   s   "r[   r\   rÍ   ¬  s&   € ÷ 	[ñ 	[ sð 	[°$ð 	[ÀSñ 	[r]   c                óÀ   € ^ RI Hp RV9  d*   \        V P                  P                  RR4      pVe   WSR&   VP
                  ! W3RV P                  P                  /VB # )z«Dispatch a tool call through the registry with the parent agent (when available)
resolved automatically; returns the handler's JSON string. ``kwargs`` forward to dispatch.rË  Úparent_agentÚagentNrZ  )rÕ  rV  r‹  rÏ   Ú_cli_refÚdispatchr[  )rÒ   r  ra  ÚkwargsrV  rd  s   &&&,  r[   Údispatch_toolÚPluginContext.dispatch_tool¬  s[   € õ 	,à Ô'Ü˜DŸM™M×2Ñ2°G¸TÓBˆEØÒ Ø).�~Ñ&Ø× Ò  ÑZ¸¿¹×8OÑ8OÐZÐSYÑZÐZr]   c               ó   € V ^8„  d   QhRR/# ©rW   rX   rW  rY   )rZ   s   "r[   r\   rÍ   ¸  s   € ÷ ñ Ð1Mñ r]   c           	     ó  a a€ S P                   P                  e-   \        P                  RS P                  P
                  4       R# ^ RIHp S P                  SVR4      '       d   R# S P                   P                  pSS P                   n        S P                  RSP
                  R\        S P                   4      R3SVVV 3R lR	7      p\        P                  R
S P                  P
                  SP
                  4       V# )z˜Register the (single) ``agent.context_engine.ContextEngine`` replacing the built-in
ContextCompressor; a second registration is rejected with a warning.NzyPlugin '%s' tried to register a context engine, but one is already registered. Only one context engine plugin is allowed.)ÚContextEnginezcontext engineÚcontext_engineÚmanager_valueÚ_context_enginec                ó>   <€ SP                   P                  R SV 4      # )rp  )rÏ   Ú_restore_value)r?  ÚenginerÒ   s   &€€r[   r@  Ú7PluginContext.register_context_engine.<locals>.<lambda>È  s   ø€ ¨¯©×(DÑ(DÐEVÐX^Ð`kÔ(lr]   rB  z)Plugin '%s' registered context engine: %s)rÏ   rp  r�   ró   rº   rå   Úagent.context_enginerm  r  r6  rC  r_  )rÒ   rs  rm  r0  rJ  s   ff   r[   Úregister_context_engineÚ%PluginContext.register_context_engine·  sÒ   ù€ ð �=‰=×(Ñ(Ò4Ü�N‰Nð \àŸ=™=×-Ñ-ô/ñ Ý6Ø×Ñ˜F MÐ3C×DÒDÙØ—=‘=×0Ñ0ˆØ(.ˆ�‰Ô%Ø×(Ñ(Ø˜fŸk™k°Ä"ÀTÇ]Á]ÓBSÐUfÐ0gØ XÝlð )ó 
ˆô
 	�‰Ð?ÀÇÁ×ASÑASÐU[×U`ÑU`ÔaØˆr]   c               ó   € V ^8„  d   QhRR/# rÖ   rY   )rZ   s   "r[   r\   rÍ   Í  s   € ÷ kñ k°dñ kr]   c                óN  € ^ RI HpHp V P                  WR4      '       d   R#  V! V4       \
        P                  RT P                  P                  TP                  4       R#   \         d7   p\
        P                  RT P                  P                  T4        Rp?R# Rp?ii ; i)z¹Register a :class:`agent.context_references.ContextReferenceProvider`; ``provider.prefix``
defines ``@<prefix>:``. Built-in prefixes (diff, staged, file, folder, git, url) are
rejected.)ÚContextReferenceProviderÚ#register_context_reference_providerzcontext reference providerNz5Plugin '%s' context reference registration failed: %sz.Plugin '%s' registered context reference: @%s:)Úagent.context_referencesrz  r{  r  rò   r�   ró   rº   rå   r_  Úprefix)rÒ   rU  Ú_CRPÚ	_registerrb  s   &&   r[   Úregister_context_referenceÚ(PluginContext.register_context_referenceÍ  s…   € ÷	
ð ×Ñ˜HÐ,H×IÒIÙð	Ù�hÔô 	�‰ÐDÀdÇmÁm×FXÑFXÐZb×ZiÑZiÖjøô ô 	Ü�N‰NÐRÐTX×TaÑTa×TfÑTfÐhkÔlÝûð	ús   ¤A# Á#B$Á.+BÂB$c               ó   € V ^8„  d   QhRR/# rÖ   rY   )rZ   s   "r[   r\   rÍ   Ý  s   € ÷ 	5ñ 	5°Dñ 	5r]   c           	     ó¾   € ^ RI Hp V P                  WR4      '       d   R# Wn        \        P                  RV P                  P                  \        VRR4      4       R# )zîRecord a memory provider (inert). Activation is owned by ``plugins/memory`` via
``memory.provider``; a provider reaching here was loaded by the general manager, and
without this method its ``register()`` would fail on a missing attribute.)ÚMemoryProviderzmemory providerNz*Plugin '%s' registered memory provider: %srå   Ú?)	Úagent.memory_providerr„  r  Ú_memory_providerr�   r„   rº   rå   r‹  )rÒ   rU  r„  s   && r[   Úregister_memory_providerÚ&PluginContext.register_memory_providerÝ  sK   € õ 	9Ø×Ñ˜HÐ6G×HÒHÙØ (ÔÜ�‰ÐAÀ4Ç=Á=×CUÑCUÜ˜X v¨sÓ3ö	5r]   c               ó   € V ^8„  d   QhRR/# rk  rY   )rZ   s   "r[   r\   rÍ   é  s   € ÷ 'ñ 'Ð<Xñ 'r]   c           
     óÌ  aaa€ ^ RI Hp ^ RIHpHo V P                  SVR4      '       d   R# \        \        4       4      pV P                  P                  V8w  dN   \        P                  RV P                  P                  SP                  V P                  P                  V4       R# SP                  o V! S4       T P#                  R	STTT3R
 lRR7      p\        P%                  RT P                  P                  SSP&                  4       T#   \        \        3 dC   p\        P                  RT P                  P                  \!        SRR4      T4        Rp?R# Rp?ii ; i)zËRegister a :class:`hermes_cli.dashboard_auth.DashboardAuthProvider` for the dashboard
auth gate (non-loopback bind without ``--insecure``). Wrong type / duplicate name warn and
are ignored, never raised.)ÚDashboardAuthProvider)Úregister_global_providerÚunregister_global_providerzdashboard-auth providerNz�Plugin '%s' tried to register dashboard-auth provider %r from profile scope %s; ignoring it because dashboard auth is owned by launch scope %s.z=Plugin '%s' failed to register dashboard-auth provider %r: %srå   r…  Údashboard_auth_providerc                 ó   <€ S! SS 4      # rä   rY   )rU  r`  rŽ  s   €€€r[   r@  Ú@PluginContext.register_dashboard_auth_provider.<locals>.<lambda>  s   ø€ Ñ%?ÀÈxÔ%Xr]   Tr(  z7Plugin '%s' registered dashboard-auth provider: %s (%s))Úhermes_cli.dashboard_authrŒ  Ú"hermes_cli.dashboard_auth.registryr�  rŽ  r  r   r   rÏ   r[  r�   ró   rº   rå   rŠ  rò   r‹  r*  r_  Údisplay_name)	rÒ   rU  rŒ  r�  Úlaunch_scopeÚerJ  r`  rŽ  s	   &f     @@r[   Ú register_dashboard_auth_providerÚ.PluginContext.register_dashboard_auth_providerè  s*  ú€ õ
 	DßkØ×Ñ˜HÐ&;Ð=V×WÒWÙÜ&Ô'>Ó'@ÓAˆØ�=‰=×"Ñ" lÔ2Ü�N‰Nð/ð —‘×"Ñ"Ø—‘Ø—‘×'Ñ'Øôñ Ø Ÿ™ˆð
	ñ % XÔ.ð
 —‘Ð6¸ÞXÐeið ó kˆä�‰ÐMÈtÏ}É}×OaÑOaØ! 8×#8Ñ#8ô	:àˆøô œ:Ð&ô 	Ü�N‰NÐZØŸ=™=×-Ñ-¬w°xÀÈÓ/MÈqôRåûð	ús   Â5D ÄE#Ä!7EÅE#c               ó<   € V ^8„  d   QhRRRRRRRRRRR	R
RRRRRR/	# )rW   rå   rÝ   r  Úadapter_factoryr
   rÁ  Úvalidate_configrÂ  Úrequired_envrÄ  Úinstall_hintÚentry_kwargsr	   rX   rW  rY   )rZ   s   "r[   r\   rÍ     sZ   € ÷ ñ ØðØ #ðØ6>ðØJRðà(ðà?Jðð ðð 14ðð 
&ñ	r]   c                ó(  a a€ ^ RI Hp	Hp
Hp VP	                  R4      '       d?   S P
                  P                  R8w  d$   V	! S4      '       d   S P                  RS R24      hVP                  RS P
                  P                  4       T! RRSRTR	TR
TRTRT;'       g    . RVRR/VB pS P                  P                  pV
P                  SVR7      pV
P                  WÍR7       V
P                  SVR7      pV^ ,          VJg   V^,          e   R# S P                  P                  P                  S4       S P                  P!                  S P
                  RSW¯VVV 3R lR7      p\"        P%                  RS P
                  P                  S4       V# )aÝ  Register a gateway platform adapter (``adapter_factory(PlatformConfig) -> BasePlatformAdapter``).
``check_fn`` is a PASSIVE "deps importable?" probe that must never install (status displays call
it freely); an ACTIVE installer goes in ``ensure_deps_fn`` (called from ``create_adapter()`` when
``check_fn`` is False). Extra kwargs (``setup_fn``, ``emoji``, ``allowed_users_env``,
``platform_hint``, ``ensure_deps_fn``) forward to ``PlatformEntry``; unknown keys raise TypeError.)Úcore_ships_platformÚplatform_registryÚPlatformEntryÚtrusted_inboundrß  zcore platform 'z>' with trusted_inbound (it would waive allowlists and pairing)Úplugin_namerå   r  rš  rÁ  r›  rœ  r�  rá  rH  rY  NÚplatformc                 ó:   <€ SP                   P                  S 4      # rä   )rÏ   Ú _remove_platform_name_if_unownedrÏ  s   €€r[   r@  Ú1PluginContext.register_platform.<locals>.<lambda>/  s   ø€ ˜TŸ]™]×KÑKÈDÔQr]   rÑ  z!Plugin %s registered platform: %srY   )Úgateway.platform_registryr   r¡  r¢  rû   rº   rá  r   Ú
setdefaultrå   rÏ   r[  r\  rR  Ú_plugin_platform_namesrØ  r^  r�   r„   )rÒ   rå   r  rš  rÁ  r›  rœ  r�  rž  r   r¡  r¢  rþ   rZ  r0  r/  rJ  s   ff&&&&&&,        r[   Úregister_platformÚPluginContext.register_platform  s™  ù€ ÷ 	dÑcØ×ÑÐ-×.Ò.°4·=±=×3GÑ3GÈ9Ô3TÑYlÐmq×YrÒYrØ—,‘, °°Ð6tÐuÓvÐvØ×Ñ ¨t¯}©}×/AÑ/AÔBÙñ 
Øð
Ø"ð
Ø4Cð
ØNVð
à+ð
à:F×:LÐ:LÈ"ð
ð &ð
ð /7ð
ð ;Gñ
ˆð
 —‘×'Ñ'ˆØ$×:Ñ:¸4ÀuÐ:ÓMˆØ×"Ñ" 5Ð"Ô6Ø#×9Ñ9¸$ÀeÐ9ÓLˆØ�1�:˜UÓ" g¨a¥jÒ&<ÙØ�‰×,Ñ,×0Ñ0°Ô6Ø—‘×9Ñ9Ø�M‰M˜: tÐ->ÈÝQð :ó 
ˆô 	�‰Ð8¸$¿-¹-×:LÑ:LÈdÔSØˆr]   c               ó$   € V ^8„  d   QhRRRRRR/# )rW   Ú	action_idr	   r†  r
   rX   rK   rY   )rZ   s   "r[   r\   rÍ   4  s$   € ÷ ñ ØðØ(0ðà	ñr]   c                óê  a aa€ \        V4      '       g   S P                  R4      hVe-   \        V\        4      '       d(   VP	                  4       '       g   S P                  R4      hWS P
                  P                  3oS P                  P                  oSP                  S4       S P                  R\        V4      VVV 3R l4      p\        P                  RS P
                  P                  V4       V# )a8  Register a Slack Block Kit action handler, wired into ``slack_bolt.AsyncApp`` at connect.
``action_id`` is anything ``slack_bolt.App.action()`` accepts; ``callback`` is
``async def handler(ack, body, action)`` (``await ack()`` within 3s). Raises ``ValueError`` for
a non-callable callback or empty ``action_id``.z3a Slack action handler with a non-callable callbackz.a Slack action handler with an empty action_idÚslack_action_handlerc                 ó<   <€ SP                   P                  SS 4      # rä   )rÏ   Ú_remove_identity)rþ   ÚhandlersrÒ   s   €€€r[   r@  Ú=PluginContext.register_slack_action_handler.<locals>.<lambda>C  s   ø€  T§]¡]×%CÑ%CÀHÈeÔ%Tr]   z-Plugin %s registered Slack action handler: %s)r‰  r   r  rÝ   rO  rº   rå   rÏ   Ú_slack_action_handlersÚappendr*  Úreprr�   r„   )rÒ   r¯  r†  rJ  rþ   r´  s   f&& @@r[   Úregister_slack_action_handlerÚ+PluginContext.register_slack_action_handler4  s¹   ú€ ô ˜×!Ò!Ø—,‘,ÐTÓUÐUØÒ¤¨I´s×!;Ò!;ÀIÇOÁO×DUÒDUØ—,‘,ÐOÓPÐPØ d§m¡m×&8Ñ&8Ð9ˆØ—=‘=×7Ñ7ˆØ�‰˜ÔØ—‘Ð3´T¸)³_ÞTóVˆä�‰ÐDÀdÇmÁm×FXÑFXÐZcÔdØˆr]   c               ó$   € V ^8„  d   QhRRRRRR/# )rW   r¥  rÝ   Úfactoryr
   rX   ru   rY   )rZ   s   "r[   r\   rÍ   G  s&   € ÷ Bñ B°#ð BÀð BÈTñ Br]   c                óà  € \        V4      '       g   V P                  R4      hT;'       g    RP                  4       P                  4       pV'       g   V P                  R4      hV P                  P
                  P                  V. 4      P                  W P                  P                  34       \        P                  RV P                  P                  V\        VR\        V4      4      4       R# )a-  Register ``factory(native, adapter)``, invoked at ``connect()`` before/as the core handlers
register (``adapter`` read-only). ``native``: telegram PTB ``Application``, discord
``commands.Bot``, slack ``AsyncApp``, matrix client, teams ``App``, dingtalk
``DingTalkStreamClient``, line aiohttp ``web.Application``, others ``None``. Keep SDK imports
inside the factory; exceptions are logged and the platform still connects. Scope handlers in
first-match dispatch tables so core flows keep working. Raises ``ValueError`` when not callable
or platform is empty.z6a platform handler factory with a non-callable factoryrÓ  z6a platform handler factory with an empty platform namez+Plugin %s registered %s handler factory: %srj   N)r‰  r   rO  rµ  rÏ   Ú_platform_handler_factoriesrª  r·  rº   rå   r�   r„   r‹  r¸  )rÒ   r¥  r¼  rç   s   &&& r[   Úregister_platform_handlerÚ'PluginContext.register_platform_handlerG  s²   € ô ˜× Ò Ø—,‘,ÐWÓXÐXØ�~ˆ~˜2×$Ñ$Ó&×,Ñ,Ó.ˆßØ—,‘,ÐWÓXÐXØ�‰×1Ñ1×<Ñ<¸SÀ"ÓE×LÑLÈg×WdÑWd×WiÑWiÐMjÔkÜ�‰ÐBÀDÇMÁM×DVÑDVÐX[Ü˜W j´$°w³-Ó@ö	Br]   c               ó    € V ^8„  d   QhRRRR/# )rW   r¼  r
   rX   ru   rY   )rZ   s   "r[   r\   rÍ   X  s   € ÷ <ñ <°ð <¸dñ <r]   c                ó*   € V P                  RV4       R# )uí   ``register_platform_handler("telegram", factory)``. PTB dispatches only the FIRST matching
handler per group and core registers a catch-all ``CallbackQueryHandler`` â€” always scope with
``pattern=`` or you swallow the core button flows.ÚtelegramN)r¿  )rÒ   r¼  s   &&r[   Úregister_telegram_handlerÚ'PluginContext.register_telegram_handlerX  s   € ð 	×&Ñ& z°7Ö;r]   ÚdefaultsÚinherit_fromc               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )rW   rç   rÝ   r”  rÆ  rÆ  rç  rÇ  rÃ   rX   rK   rY   )rZ   s   "r[   r\   rÍ   _  s@   € ÷ 7ñ 7Øð7Ø),ð7Ø;>ð7à*ð7ð $ð7ð 
ñ	7r]   c               ó.  € ^ RI Hp V P                  P                  P	                  V4      pV! V P
                  P                  V P                  WVWEV P                  P                  R7      pV P                  RWP                  P                  VRWVR7      # )a  Register an auxiliary LLM task with its own ``auxiliary.<key>`` config block (picker entry,
``AUXILIARY_<KEY>_*`` env bridge, defaults merged into loaded configs). ``defaults`` may
override provider/model/base_url/api_key/timeout/extra_body (unknown keys kept verbatim).
``inherit_from`` names a built-in or already-registered auxiliary task whose effective
configuration becomes the base for this one; it is resolved at read time, so the task tracks
the base's current config instead of snapshotting it (precedence: inherited base, then
``defaults``, then user config in ``auxiliary.<key>``). An unknown or self-referential
``inherit_from`` logs a warning and registers the task without inheritance.
Raises ``ValueError`` for an empty/invalid key, a built-in key, or another plugin's key.)Úbuild_auxiliary_task_entry)r”  rÆ  rÆ  rÇ  rÙ  Úauxiliary_taskz,Plugin %s registered auxiliary task: %s (%s)©r0  )	Úhermes_cli.plugins_aux_tasksrÊ  rÏ   Ú
_aux_tasksrû   rº   rå   rß   rK  )	rÒ   rç   r”  rÆ  rÆ  rÇ  rÊ  Úexistingrþ   s	   &&$$$$   r[   Úregister_auxiliary_taskÚ%PluginContext.register_auxiliary_task^  s‰   € õ 	LØ—=‘=×+Ñ+×/Ñ/°Ó4ˆÙ*Ø�M‰M×Ñ §¡°Ð\gØÀTÇ]Á]×E]ÑE]ô_ˆð ×#Ñ#Ð$4°c¿=¹=×;SÑ;SÐUZØ$RÐTWØ-5ð $ó 7ð 	7r]   c               ó   € V ^8„  d   QhRR/# )rW   rX   ÚintrY   )rZ   s   "r[   r\   rÍ   v  s   € ÷ ñ °sñ r]   c                ó4  € ^ RI Hp  V! VRV P                  P                   2R7      p\
        P                  RT P                  P                  T4       T#   \         d7   p\
        P                  RT P                  P                  T4        Rp?^ # Rp?ii ; i)a+  Additively register secret-token regexes with :mod:`agent.redact`; returns the count accepted.
Plugins can over-redact, never weaken built-ins; ``security.redact_secrets: false`` applies
equally. Each pattern must compile and start with >= 2 literal characters; invalid entries warn
and are skipped.)Úregister_redaction_patternsr�  )rá  z5Plugin '%s' redaction pattern registration failed: %sNz,Plugin %s registered %d redaction pattern(s))Úagent.redactrÕ  rº   rå   r}  r�   ró   r„   )rÒ   Úpatternsr  Úcountrb  s   &&   r[   rÕ  Ú)PluginContext.register_redaction_patternsv  s‚   € õ
 	Jð	Ù˜h°¸¿¹×9KÑ9KÐ8LÐ/MÔNˆEô 	�‰ÐCÀTÇ]Á]×EWÑEWÐY^Ô_Øˆøô	 ô 	Ü�N‰NÐRÐTX×TaÑTa×TfÑTfÐhkÔlÝûð	ús   ˆ!A ÁBÁ!+BÂBÚendonymÚrtlÚsurfaceÚcorec               ó0   € V ^8„  d   QhRRRRRRRRR	RR
R/# )rW   ÚlangrÝ   rá  zstr | Path | Mapping[str, Any]rÚ  rÃ   rÛ  rt   rÜ  rX   rK   rY   )rZ   s   "r[   r\   rÍ   „  s>   € ÷ ñ ØðØ!?ðØMZðàðà$'ðð 
ñr]   c          
     óà  aa€ ^ RI HpHpHpHp	Hp
Ho V	! V4      pV! V4      '       g   V P                  RV: R24      hWV9  d-   V P                  RV: RV: RRP                  V4       R24      hV! V4      pV
! WµVR	V P                  P                   2W4R
7      oV P                  RV RV 2VV3R l4      p\        P                  RV P                  P                  Wµ\        V4      4       V# )aå  Register a language-pack layer for ``lang`` (``pl``, ``pt-br``): ``source`` is a YAML file path or
a nested/flat mapping of ``dotted.key: text``. ``surface`` is ``core`` (Python ``t()``), ``tui`` or
``desktop`` (served to the renderers over ``i18n.catalog``). Partial catalogs are fine; the last
registration wins key by key. Resets the i18n caches; never changes ``display.language``. Raises
``ValueError`` for a malformed id/surface/file and ``FileNotFoundError`` for a missing path.)ÚSURFACESÚis_language_idÚload_locale_sourceÚnormalize_language_idÚregister_packÚunregister_packz locale with invalid language id z (expected e.g. 'pl', 'pt-br')zlocale z for unknown surface z	 (one of ú, Ú)r�  )rá  rÚ  rÛ  Úlocaler  c                 ó   <€ S! S 4      # rä   rY   )rþ   ræ  s   €€r[   r@  Ú/PluginContext.register_locale.<locals>.<lambda>˜  s   ø€ ÁÐW\ÔG]r]   z,Plugin %s registered locale: %s/%s (%d keys))Úagent.i18n_layersrá  râ  rã  rä  rå  ræ  r   Újoinrº   rå   r*  r�   r„   rò  )rÒ   rß  rá  rÚ  rÛ  rÜ  rá  râ  rã  rä  rå  Úlang_idÚmessagesrJ  rþ   ræ  s   &&&$$$        @@r[   Úregister_localeÚPluginContext.register_locale„  sð   ù€ ÷	
÷ 	
ñ (¨Ó-ˆÙ˜g×&Ò&Ø—,‘,Ð!AÀ$ÁÐIgÐhÓiÐiØÔ"Ø—,‘, ¨©Ð3HÈÉÐS\Ð]a×]fÑ]fÐgoÓ]pÐ\qÐqrÐsÓtÐtÙ% fÓ-ˆÙ˜g°À7È4Ï=É=×K]ÑK]ÐJ^ÐA_Ø&-ô8ˆà—‘˜X¨'¨°!°G°9Ð'=Õ?]Ó^ˆÜ�‰ÐCÀTÇ]Á]×EWÑEWÐY`Ü˜“]ô	$àˆr]   Úmetadatac               ó$   € V ^8„  d   QhRRRRRR/# )rW   Úpathz
str | Pathrò  z)Optional[Mapping[str, Mapping[str, Any]]]rX   zlist[PluginRegistration]rY   )rZ   s   "r[   r\   rÍ   �  s$   € ÷ ñ ØðØ-Vðà	!ñr]   c               óÈ  € ^ RI Hp . pV! \        V4      4       F€  w  rVp\        T;'       g    / P	                  V4      ;'       g    / 4      p VP                  V P                  WWWhP	                  R4      \        VP	                  RR4      4      R7      4       K‚  	  V#   \         d7   p	\        P                  RT P                  P                  Yy4        Rp	?	KÂ  Rp	?	ii ; i)a  Register every ``<lang>[.tui|.desktop].yaml`` under ``path`` (a pack's ``locales/`` dir). The
loader calls this for plugins declaring ``provides_locales``; ``metadata`` maps ids to
``{endonym, rtl}``. A broken file is skipped with a warning so one typo never disables the pack.)Úscan_locale_dirrÚ  rÛ  F)rÜ  rÚ  rÛ  z&Plugin '%s' locale file %s skipped: %sN)rì  rö  r   rÀ  rû   r·  rð  rt   r}  r�   ró   rº   rå   )
rÒ   rô  rò  rö  Úhandlesrî  rÜ  ÚfileÚmetarb  s
   &&$       r[   Úregister_locale_dirÚ!PluginContext.register_locale_dir�  sÌ   € õ 	6Ø,.ˆÙ&5´d¸4³jÖ&AÑ"ˆG˜dÜ˜Ÿ˜ R×,Ñ,¨WÓ5×;Ð;¸Ó<ˆDðhØ—‘˜t×3Ñ3Ø¨7¿H¹HÀYÓ<OÔUYÐZ^×ZbÑZbÐchÐjoÓZpÓUqð  4ó  ö ñ 'Bð ˆøô ô hÜ—‘ÐGÈÏÉ×I[ÑI[Ð]a×gÒgûðhús   ÁAB Â C!Â++CÃC!c               ó$   € V ^8„  d   QhRRRRRR/# )rW   Ú	hook_namerÝ   r†  r
   rX   rK   rY   )rZ   s   "r[   r\   rÍ   ¯  s'   € ÷ dñ d sð d°hð dÐCUñ dr]   c                óZ   € V P                  RWV P                  P                  \        4      # )zMRegister a lifecycle hook callback (unknown names warn but are still stored).Úhook)Ú_track_callbackrÏ   Ú_hooksr¶   )rÒ   rý  r†  s   &&&r[   Úregister_hookÚPluginContext.register_hook¯  s$   € à×#Ñ# F¨IÀÇÁ×AUÑAUÔWbÓcÐcr]   c               ó$   € V ^8„  d   QhRRRRRR/# )rW   r$  rÝ   r†  r
   rX   rK   rY   )rZ   s   "r[   r\   rÍ   ³  s"   € ÷ 
ñ 
¨ð 
°xð 
ÐDVñ 
r]   c                óZ   € V P                  RWV P                  P                  \        4      # )z�Register behavior-changing middleware (request kinds rewrite the payload, execution kinds
wrap the callback). Unknown kinds warn but are stored.Ú
middleware)r   rÏ   Ú_middlewarer   )rÒ   r$  r†  s   &&&r[   Úregister_middlewareÚ!PluginContext.register_middleware³  s+   € ð ×#Ñ#Ø˜$¨$¯-©-×*CÑ*CÔEUó
ð 	
r]   c               ó0   € V ^8„  d   QhRRRRRRRRRR	R
R/# )rW   r$  rÝ   rç   r†  r
   r9  zdict[str, list[Callable]]Úvalidrµ   rX   rK   rY   )rZ   s   "r[   r\   rÍ   º  s>   € ÷ ñ ØðØ!ðØ-5ðØ@Yðàðð 
ñr]   c                ót  a aaa€ SV9  dF   \         P                  RS P                  P                  VSRP	                  \        V4      4      4       SP                  S. 4      P                  S4       S P                  VSVVVV 3R l4      p\         P                  RS P                  P                  VS4       V# )zUAppend ``callback`` under ``key`` (warning on unknown ``key``) and lease its removal.z2Plugin '%s' registered unknown %s '%s' (valid: %s)rç  c                 ó>   <€ SP                   P                  SSS 4      # rä   )rÏ   Ú_remove_callback)r†  rç   r9  rÒ   s   €€€€r[   r@  Ú/PluginContext._track_callback.<locals>.<lambda>Ã  s   ø€ °·±×0NÑ0NÈwÐX[Ð]eÔ0fr]   zPlugin %s registered %s: %s)
r�   ró   rº   rå   rí  Úsortedrª  r·  r*  r„   )rÒ   r$  rç   r†  r9  r  rJ  s   f&fff& r[   r   ÚPluginContext._track_callbackº  s�   û€ ð
 �eÔÜ�N‰NÐOÐQU×Q^ÑQ^×QcÑQcÐeiØ §	¡	¬&°«-Ó 8ô:à×Ñ˜3 Ó#×*Ñ*¨8Ô4Ø—‘˜T 3×(fÓgˆÜ�‰Ð2°D·M±M×4FÑ4FÈÈcÔRØˆr]   ÚpositionÚafter_memoryÚ	max_charsc          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
rW   rC  rÝ   r  z(str | Callable[[Mapping[str, Any]], str]r  r  rÓ  rX   rK   rY   )rZ   s   "r[   r\   rÍ   Ç  s6   € ÷ 7ñ 7Øð7Ø Hð7àð7à36ð7ð 
ñ7r]   c          
     óÈ  € \        V4      '       g   \        R4      h\        V\        4      '       g   \	        V4      '       g   \        R4      hV\        9  d/   \        RRP                  \        \        4      4      ,           4      h\        V\        4      '       g,   \        V\        4      '       d   ^ Tu;8  d   \        8:  g   M \        R\         24      hV P                  P                  P                  V4      pVe   \        RV: RVP                  : 24      h\!        WW4V P"                  R7      pV P%                  R	WP                  P                  VR
VVR7      # )z¤Register bounded context frozen into each new session prompt. Callables receive a
read-only session-info mapping; the rendered prompt is persisted by core verbatim.zdsystem prompt section id must be 1-128 lowercase characters using letters, numbers, '.', '_', or '-'z:system prompt section content must be a string or callablez/system prompt section position must be one of: rç  z6system prompt section max_chars must be between 1 and zsystem prompt section z! is already registered by plugin )rC  r  r  r  rH  Úsystem_prompt_sectionz.Plugin %s registered system prompt section: %srÌ  )rH   rò   r  rÝ   r‰  rŠ  r<   rí  r  rt   rÓ  r8   rÏ   Ú_system_prompt_sectionsrû   rH  rD   rß   rK  )rÒ   rC  r  r  r  rÏ  Úsections   &&&$$  r[   Úregister_system_prompt_sectionÚ,PluginContext.register_system_prompt_sectionÇ  sE  € ô 1°×4Ò4Üð Hó Ið Iä˜'¤3×'Ò'´¸×0AÒ0AÜÐXÓYÐYØÔ:Ô:ÜÐNØ#Ÿy™y¬Ô0OÓ)PÓQõRó Sð Sä�y¤$×'Ò'¬z¸)ÄS×/IÒ/IØ˜9ÖGÔ(GÖGÜÐUÔVuÐUvÐwÓxÐxØ—=‘=×8Ñ8×<Ñ<¸RÓ@ˆØÒÜÐ5°b±VÐ;\Ð]e×]lÑ]lÑ\oÐpÓqÐqÜ+Ø¨XÐSW×SaÑSaô
ˆð ×#Ñ#Ð$;¸RÇÁ×AfÑAfØ$+Ð-]Ð_aØ-5ð $ó 7ð 	7r]   c               ó$   € V ^8„  d   QhRRRRRR/# )rW   ÚeventrÝ   ÚpayloadzOptional[dict]rX   rÓ  rY   )rZ   s   "r[   r\   rÍ   â  s&   € ÷ Uñ U˜#ð U¨ð UÀ#ñ Ur]   c                óÆ  € V P                   pV'       d   \        V\        4      '       g&   \        P	                  RW14       \        RV R24      hRV9   d9   \        P	                  RW1V\        4       \        RV RV RV R\         R	2	4      hVe&   \        V\        4      '       g   \        RV R
24      hV P                  P                  V RV 2T;'       g    / 4      # )ac  Publish bare *event* as ``<plugin_key>:<event>`` (namespace FORCED to this plugin); return
the subscriber count scheduled. Any ``':'`` in the name (``hermes:x`` is reserved for core,
foreign namespaces forbidden) raises ``ValueError``. Delivery is fire-and-forget via a
single-worker queue: order preserved, a blocking subscriber cannot stall the emitter.z2Plugin '%s' tried to emit an invalid event name %rr  z(' emit() requires a non-empty event nameÚ:uÐ   Plugin '%s' tried to emit namespaced/reserved event '%s' â€” a plugin may only emit bare event names under its own '%s:' namespace (the '%s:' prefix is reserved for core, and foreign namespaces are forbidden)z' may not emit 'z>': emit only the bare event name; the namespace is forced to 'z:' and the 'z:' prefix is reserved for corez'' emit() payload must be a dict or None)rß   r  rÝ   r�   ró   rò   r7   rÀ  rŠ  rÏ   Ú_dispatch_event)rÒ   r  r  rI  s   &&& r[   ÚemitÚPluginContext.emitâ  sñ   € ð
 —^‘^ˆ
ßœJ u¬c×2Ò2Ü�N‰NÐOÐQ[ÔcÜ˜x¨
 |Ð3[Ð\Ó]Ð]Ø�%Œ<Ü�N‰Nð Mð &¨jÔ:PôRô ˜x¨
 |Ð3CÀEÀ7ð K<Ø<F¸<À|ÔTjÐSkð l;ð<ó =ð =ð Ò¤z°'¼4×'@Ò'@Ü˜h z lÐ2YÐZÓ[Ð[Ø�}‰}×,Ñ,°
¨|¸1¸U¸GÐ-DÀgÇmÀmÐQSÓTÐTr]   c               ó$   € V ^8„  d   QhRRRRRR/# )rW   r  rÝ   r†  r
   rX   ru   rY   )rZ   s   "r[   r\   rÍ   ÷  s&   € ÷ Uñ U˜sð U¨hð U¸4ñ Ur]   c                ó*  € V'       d   \        V\        4      '       g$   \        RV P                  P                   R24      hV P
                  P                  V P                  W4       \        P                  RV P                  P                  V4       R# )u¢   Subscribe to a fully-qualified ``<plugin_key>:<event>`` name (unrestricted â€” only
emitting is namespace-gated). Owner-tagged so unload removes zombie callbacks.r  z-' subscribe() requires a non-empty event namez!Plugin %s subscribed to event: %sN)
r  rÝ   rò   rº   rå   rÏ   Ú_subscribe_eventrß   r�   r„   )rÒ   r  r†  s   &&&r[   Ú	subscribeÚPluginContext.subscribe÷  sf   € ÷ œJ u¬c×2Ò2Ü˜x¨¯©×(:Ñ(:Ð';Ð;hÐiÓjÐjØ�‰×&Ñ& t§~¡~°uÔGÜ�‰Ð8¸$¿-¹-×:LÑ:LÈeÖTr]   )Úregister_automation_blueprintÚregister_skill)rÐ   rÑ   rÏ   r‡  rº   rä   )r  )NNFrÓ  rÓ  F)Né   )Úuser)NrÓ  )rÓ  rÓ  N)NNrÓ  )Krj   rk   rl   rm   rn   rÓ   rÙ   Úpropertyrß   rî   rô   r   r  r   r	  r  r  r   r*  r6  rü   rD  rK  rc  rj  rq  rw  r~  r‚  rˆ  r   r»  r4   rÚ  râ  rõ  rý  Úclassmethodró  Ústaticmethodrí  rÔ  r  r"  r'  r/  r4  r:  rA  rL  r^  rh  rv  r€  rˆ  r—  r¬  r¹  r¿  rÄ  rÐ  rÕ  rð  rú  r  r  r   r6   r  r"  r'  Úhermes_cli.plugins_contentr)  r*  ro   rY   r]   r[   rÉ   rÉ   å   sã  † ÙGõ%õ$ð ô+ó ð+õ
õ÷
LõHð ôJó ðJð ñ/ó ð/÷õVðkØV[÷kõ5ð Y_÷
ðà÷ðàðáH[ðð 26ðð X\÷ð> ôó ðð ôDó ðDð ô$ó ð$ð ôó ðõ(õ
ð
¸÷ 
õXð2 ö%ó ð%õPE÷'ð> !ÐàôJó ðJð* ôXó ðXõWñ(bØMQðbà+/÷bð bõ*õ
.õ
 õ'õ
-õjð öRó ðRð öPó ðPõ6	[ð ôó ðõ*kõ 	5ð ô'ó ð'ðR öó ðõBõ&Bõ"<ð ð7à-1ð7ð '+ö7ó ð7õ.ðØ]aðàðà*0÷ð2ØY]÷õ$dõ
õð7à&ð7à9`÷7÷6Uõ*U÷ YÓXr]   rÉ   c           	     óF  aaaaa	a
aaa€ VP                  R4      w  o
o	\        SP                  RR4      ,          oSP                  R4      oR V	V
VVVVVV3R lloR V3R llpSP                  R	4      R
8X  d   TMSpV RV  2VuVn        Vn        Vn        \        V4      # )z]Build one ``register_<category>_provider`` method from a ``_SCOPED_PROVIDER_REGISTRARS`` row.r   rM  rO  rR  c               ó   € V ^8„  d   QhRR/# rk  rY   )rZ   s   "r[   r\   Ú5_make_scoped_provider_registrar.<locals>.__annotate__  s   € ÷ 
ñ 
Ð$@ñ 
r]   c                ó  <€ \         P                  ! S
4      pT P                  TS\        \         P                  ! S4      S4      TSSP	                  R R4      SS	'       d   \        VS	4      MRSP	                  R4      R7	      # )r  r  NrS  )r$  r  rV  r  r  rM  rR  rS  )Ú	importlibÚimport_modulerc  r‹  rû   )rÒ   rU  rV  Ú	base_attrÚbase_modr$  r  Únormalize_fnrX  Úregister_nameÚregistry_mods   && €€€€€€€€r[   rR  Ú1_make_scoped_provider_registrar.<locals>.register  su   ø€ Ü×*Ò*¨<Ó8ˆØ×-Ñ-Ø˜4¬G´I×4KÒ4KÈHÓ4UÐW`Ó,aØ U°G·K±KÀ	È3Ó4OÐ[gß9F”W˜X }Ô5ÈDØ"Ÿ;™;Ð'7Ó8ð	 .ó 
ð 	
r]   c               ó   € V ^8„  d   QhRR/# rk  rY   )rZ   s   "r[   r\   r3    s   € ÷ &ñ &Ð)Eñ &r]   c                ó   <€ S! W4      # rä   rY   )rÒ   rá  rR  s   &&€r[   Úregister_sourceÚ8_make_scoped_provider_registrar.<locals>.register_source  s   ø€ Ù˜Ó%Ð%r]   Úparamrá  zPluginContext.)ÚsplitrL   rû   rj   rl   rn   r4   )Úmethod_namer$  r;  Úbase_refr  ÚdocrX  r?  Úmethodr7  r8  r9  rR  r:  s   &ff&f&f  @@@@@r[   Ú_make_scoped_provider_registrarrG    s“   ÿø€ à"Ÿ.™.¨Ó-Ñ€HˆiÜ$ W§[¡[°¸gÓ%FÕG€LØ—K‘K 
Ó+€M÷
÷ 
÷&ð &ð !(§¡¨GÓ 4¸Ô @‰_Àh€FØ;FÈ.ÐYdÐXeÐHfÐhkÐ8€F„O�VÔ(¨&¬.Ü" 6Ó*Ð*r]   c                ó0   a € \        S 4      V 3R l4       pV# )zßTurn a registrar into a no-op once the context's load timed out: the abandoned worker thread may
still be executing register(), and a late registration would land in registries that the failure
path already swept (#108139).c                ó°   <€ \        V R R4      '       d8   \        P                  RV P                  P                  SP
                  4       R# S! V .VO5/ VB # )rÑ   Fz9Plugin '%s' called %s() after its load timed out; ignoredN)r‹  r�   ró   rº   rå   rj   )rÒ   ra  rg  rF  s   &*,€r[   ÚwrappedÚ-_ignore_after_abandoned_load.<locals>.wrapped&  sO   ø€ ä�4Ð*¨E×2Ò2Ü�N‰NØKÈTÏ]É]×M_ÑM_Ø—‘ôñ Ù�dÐ,˜TÒ, VÑ,Ð,r]   )r   )rF  rJ  s   f r[   Ú_ignore_after_abandoned_loadrL  "  s"   ø€ ô ˆ6ƒ]ô-ó ð-ð €Nr]   Ú	register_c               ó   € V ^8„  d   QhRR/# )rW   rX   ré  rY   )rZ   s   "r[   r\   r\   ;  s   € ÷ ñ ¨ñ r]   c                 óä  € \         p  \        4       ;'       g    / P                  R4      p\        V\        4      '       d   VP                  R4      f   V # \        VR,          4      pT^ 8  d   \        P                  RY 4       T # T\        8”  d"   \        P                  RT\        4       \        # T#   \        \        3 d    \        P                  RT 4       T u # \         d    T u # i ; i)ao  Effective hook-callback timeout from ``plugins.hook_callback_timeout`` (default 30s; ``<= 0``
disables the threaded path; clamped to ``_MAX_HOOK_CALLBACK_TIMEOUT_SECS``).

``invoke_hook`` calls this once per hook invocation; ``load_config_readonly()`` serves cache hits
without ``_CONFIG_LOCK``, so this is a stat + dict lookup per call and needs no memo of its own.
r`   Úhook_callback_timeoutz@plugins.hook_callback_timeout is not a number; using default %gsz?plugins.hook_callback_timeout=%g is negative; using default %gsz:plugins.hook_callback_timeout=%g exceeds max %gs; clamping)r?   r   rû   r  rÀ  ré  rŠ  rò   r�   ró   r}  rA   )r÷   Úplugins_cfgrè  s      r[   Ú_resolve_hook_callback_timeoutrR  ;  sÙ   € ô *€Gð	Ü+Ó-×3Ð3°×8Ñ8¸ÓCˆÜ˜+¤t×,Ò,°·±Ð@WÓ0XÒ0`ØˆNÜ˜Ð$;Õ<Ó=ˆð �„{Ü�‰ÐXÐZaÔkØˆØÔ0Ô0Ü�‰ÐSÐU\Ü6ô	8ä.Ð.Ø€Nøô ”zÐ"ô Ü�‰ÐYÐ[bÔcØŠÜô ØŠðús(   ˆB5 ™<B5 ÁB5 Â5)C/Ã C/Ã)C/Ã.C/c                  óº  € ] tR tRtRtRER R llt]R R l4       tR R	 ltR
 R lt	R R lt
]R R l4       tR R ltR R ltR R ltRFR R lltR R ltR R ltR R ltR R ltR  R! ltR" R# ltR$ R% ltR& R' ltRER( R) lltR* R+ ltR, R- ltR. R/ ltR0 R1 ltR2 R3 ltR4 R5 ltR6 R7 ltR8 R9 lt R: R; lt!R< R= lt"R> R? lt#R@ RA lt$RB RC lt%RDt&R# )GrÌ   iW  z;Central manager that discovers, loads, and invokes plugins.Nc               ó    € V ^8„  d   QhRRRR/# )rW   r[  rÃ   rX   ru   rY   )rZ   s   "r[   r\   ÚPluginManager.__annotate__Z  s   € ÷ S;ñ S; -ð S;¸4ñ S;r]   c                	ó  € \        V4      V n        \        V P                  4      V n        \        P
                  ! 4       V n        R V n        R V n        RV n	        RV n
        RV n        RV n        / V n        / V n        / V n        / V n        \#        4       V n        \#        4       V n        / V n        / V n        / V n        / V n        / V n        / V n        / V n        / V n        / V n        . V n        / V n        . V n        / V n         \        P
                  ! 4       V n!        \        PD                  ! V PB                  4      V n#        ^ V n$        ^ ^ /V n%        \L        PN                  ! \P        R7      V n)        RV n*        \        PV                  ! 4       V n,        / V n-        / V n.        / V n/        \        P`                  ! 4       V n1        \d        V n3        \#        4       V n4        / V n5        . V n6        . V n7        / V n8        / V n9        R# )FN)Úmaxsize):r   r[  r   r  Ú	threadingÚRLockÚ_discovery_lockÚ_discoveredÚ!_plugin_secret_sources_reconciledre  Ú_gateway_message_injectorÚ_tui_message_injectorrp  rì   r  Ú_memory_hook_registrationsr  Úsetr×  r«  rK  r\  r  Ú_plugin_skillsÚ_automation_blueprintsÚ_portable_mcp_serversÚ_portable_mcp_server_pluginsrÎ  r´  r¶  r¾  Ú_plugin_loaded_listenersÚ_subscriptionsÚ_event_lockÚ	ConditionÚ_event_idleÚ_event_generationÚ_event_pending_by_generationÚqueueÚQueuer>   Ú_event_queueÚ_event_workerÚlocalÚ_emit_depthÚ_hook_running_callbacksÚ_hook_abandonedÚ_hook_timeout_suppressed_untilÚLockÚ_hook_timeout_lockr@   Ú!_hook_timeout_suppression_secondsÚ_hook_failures_reportedÚ_ownership_ledgerÚ_registration_orderÚ_persistent_carryoverÚ_predeclared_modulesÚ_predeclared_tools)rÒ   r[  s   &&r[   rÓ   ÚPluginManager.__init__Z  s×  € ô
 )¨Ó3ˆŒÜ˜dŸn™nÓ-ˆŒÜ(ŸšÓ0ˆÔØ!&ˆÔð 8=ˆÔ.ØˆŒØIMˆÔ&ð FJˆÔ"Ø#ˆÔð
 24ˆŒØ13ˆŒà[]ˆÔ'Ø68ˆÔÜ,/«EˆÔÜ03³ˆÔ#Ø.0ˆÔØ13ˆÔØMOˆÔ$Ø9;ˆÔØ68ˆÔ#Ø@BˆÔ"Ø<>ˆÔ)Ø57ˆŒØ46ˆÔ!Ø35ˆÔ#ØCEˆÔ(à8:ˆÔ%ð DFˆÔÜ$Ÿ?š?Ó,ˆÔÜ$×.Ò.¨t×/?Ñ/?Ó@ˆÔØ!"ˆÔØ=>À¸FˆÔ)Ü.3¯kªkÔBTÔ.UˆÔØ9=ˆÔÜ$Ÿ?š?Ó,ˆÔð =?ˆÔ$Ø13ˆÔØBDˆÔ+Ü"+§.¢.Ó"2ˆÔÜ1RˆÔ.ä,/«EˆÔ$ð GIˆÔØ=?ˆÔ ð
 @BˆÔ"ð BDˆÔ!Ø8:ˆÖr]   c               ó   € V ^8„  d   QhRR/# r>  rY   )rZ   s   "r[   r\   rU  °  s   € ÷ :ñ :¨dñ :r]   c                ó   € V P                   RJ# )z@Return whether a live gateway can accept plugin-triggered turns.N©r]  rØ   s   &r[   Úhas_gateway_message_injectorÚ*PluginManager.has_gateway_message_injector¯  s   € ð ×-Ñ-°TÐ9Ð9r]   c               ó$   € V ^8„  d   QhRRRRRR/# ©rW   rº  ÚobjectÚinjectorzCallable[..., bool]rX   ru   rY   )rZ   s   "r[   r\   rU  ´  s#   € ÷ ;ñ ;°&ð ;ÐDWð ;Ð\`ñ ;r]   c                ó   € W3V n         R# )z8Publish a live gateway injector and its lifecycle owner.Nr�  ©rÒ   rº  r‡  s   &&&r[   Úset_gateway_message_injectorÚ*PluginManager.set_gateway_message_injector´  s   € à*/Ð):ˆÖ&r]   c               ó    € V ^8„  d   QhRRRR/# ©rW   rº  r†  rX   ru   rY   )rZ   s   "r[   r\   rU  ¸  s   € ÷ 2ñ 2°Fð 2¸tñ 2r]   c                óf   € V P                   e#   V P                   ^ ,          VJ d
   RV n         R# R# R# )z;Clear the injector only when it still belongs to ``owner``.Nr�  ©rÒ   rº  s   &&r[   Úclear_gateway_message_injectorÚ,PluginManager.clear_gateway_message_injector¸  s3   € à×)Ñ)Ò5¸$×:XÑ:XÐYZÕ:[Ð_dÓ:dØ-1ˆDÖ*ñ ;eÑ5r]   c               ó    € V ^8„  d   QhRRRR/# ©rW   rg  r	   rX   rt   rY   )rZ   s   "r[   r\   rU  ½  s   € ÷ Hñ H¨sð H°tñ Hr]   c                ób   € V P                   pVRJ;'       d    \        V^,          ! R/ VB 4      # )z3Submit a plugin-triggered turn to the live gateway.NrY   )r]  rt   ©rÒ   rg  rÙ  s   &, r[   Úinject_gateway_messageÚ$PluginManager.inject_gateway_message½  s1   € à×3Ñ3ˆ
Ø Ð%×GÐG¬$¨z¸!®}Ñ/F¸vÑ/FÓ*GÐGr]   c               ó   € V ^8„  d   QhRR/# r>  rY   )rZ   s   "r[   r\   rU  Ã  s   € ÷ 6ñ 6¨$ñ 6r]   c                ó   € V P                   RJ# )zOReturn whether a live Ink TUI / desktop host can accept plugin-triggered turns.N©r^  rØ   s   &r[   Úhas_tui_message_injectorÚ&PluginManager.has_tui_message_injectorÂ  s   € ð ×)Ñ)°Ð5Ð5r]   c               ó$   € V ^8„  d   QhRRRRRR/# r…  rY   )rZ   s   "r[   r\   rU  Ç  s#   € ÷ 7ñ 7¨fð 7Ð@Sð 7ÐX\ñ 7r]   c                ó   € W3V n         R# )zOPublish a live TUI/desktop injector. Does not touch the messaging-gateway slot.Nrš  r‰  s   &&&r[   Úset_tui_message_injectorÚ&PluginManager.set_tui_message_injectorÇ  s   € à&+Ð%6ˆÖ"r]   c               ó    € V ^8„  d   QhRRRR/# r�  rY   )rZ   s   "r[   r\   rU  Ë  s   € ÷ .ñ .°ð .¸4ñ .r]   c                óf   € V P                   e#   V P                   ^ ,          VJ d
   RV n         R# R# R# )z?Clear the TUI injector only when it still belongs to ``owner``.Nrš  r�  s   &&r[   Úclear_tui_message_injectorÚ(PluginManager.clear_tui_message_injectorË  s3   € à×%Ñ%Ò1°d×6PÑ6PÐQRÕ6SÐW\Ó6\Ø)-ˆDÖ&ñ 7]Ñ1r]   c               ó    € V ^8„  d   QhRRRR/# r“  rY   )rZ   s   "r[   r\   rU  Ð  s   € ÷ Hñ H¨3ð H°4ñ Hr]   c                ób   € V P                   pVRJ;'       d    \        V^,          ! R/ VB 4      # )z<Submit a plugin-triggered turn to the live TUI/desktop host.NrY   )r^  rt   r•  s   &, r[   Úinject_tui_messageÚ PluginManager.inject_tui_messageÐ  s1   € à×/Ñ/ˆ
Ø Ð%×GÐG¬$¨z¸!®}Ñ/F¸vÑ/FÓ*GÐGr]   c               ó    € V ^8„  d   QhRRRR/# rr   rY   )rZ   s   "r[   r\   rU  Õ  s   € ÷ 42ñ 42 tð 42¸ñ 42r]   c           	     óÈ  € ^ RI Hp V! 4       '       g   \        4       '       d   R# V P                  '       d   V'       g   \	        4       '       d   R# V P
                  ;_uu_ 4        \        V P                  4      ;_uu_ 4        V P                  '       d   V'       g    RRR4       RRR4       R# \        R V P                  P                  4        4       4      pV'       d   V P                  4        \        R4      '       d0   \        P                  R4       RV n         RRR4       RRR4       R# RV n         V P                  4        V P!                  4        V P#                  4        V'       d   V P%                  4        RRR4       RRR4       T P)                  X4       R#   \&         d
    RT n        h i ; i  + '       g   i     LB; i  + '       g   i     LM; i)z›Scan all plugin sources and load each plugin found; ``force`` unloads first so config
changes / new bundled backends become visible in long-lived sessions.©Úsafe_worker_enabledNc              3  óz   "  € T F1  w  rVP                   '       d   K  VP                  '       d   K-  Vx € K3  	  R # 5irä   )rÄ   rÅ   )ræ   ÚkÚps   &  r[   ré   Ú2PluginManager.discover_and_load.<locals>.<genexpr>è  s*   é € Ð%lÑ4I©D¨AÐQR×QXÕQX¤aÐab×akÕak§a¢aÓ4Iùs   ‚;�;±
;ÚHERMES_SAFE_MODEu/   HERMES_SAFE_MODE=1 â€” plugin discovery skippedTF)Úagent.safe_worker_policyr¬  r+   r[  r5   rZ  r3   r  Ú	frozensetrì   rí   Úunloadr   r�   r_  Ú_discover_and_load_innerÚ%_evict_stale_persistent_registrationsÚ'_refresh_secret_sources_after_discoveryÚ%_re_register_config_hooks_after_forceÚBaseExceptionÚ_notify_plugin_loaded)rÒ   rs   r¬  Úloaded_befores   &&  r[   Údiscover_and_loadÚPluginManager.discover_and_loadÕ  s_  € õ 	Aá× Ò Ô$?×$AÒ$Añ Ø××Ð§EÔ.C×.EÒ.Eñ Ø×!×!Ó!Ô#5°d·n±n×#EÕ#EØ××Ð¯Ø÷ $F×!Ñ!ô
 &Ñ%l°D·M±M×4GÑ4GÔ4IÓ%lÓlˆMßØ—‘”ÜÐ1×2Ò2Ü—‘ÐMÔNØ#'�Ô Ø÷ $F×!Ñ!ð  $ˆDÔðØ×-Ñ-Ô/ð ×:Ñ:Ô<ð ×<Ñ<Ô>ßð
 ×>Ñ>Ô@÷C $F×!ðL 	×"Ñ" =Ö1øô	 !ô Ø#(�Ô Øðú÷E $F×#Eú×!×!ús[   Á&GÂF>	ÂF>	Â GÂ2A0F>	Ä"GÄ4F>	Ä<7F'Å4F'ÆGÆ'F;Æ;F>	Æ>GÇ	GÇG!	c               ó   € V ^8„  d   QhRR/# rÖ   rY   )rZ   s   "r[   r\   rU    s   € ÷ Tñ T°tñ Tr]   c                óÄ   € R F*  w  r \         P                  ! V4      P                  4        K,  	  R#   \         d"   p\        P                  RY4        Rp?KW  Rp?ii ; i)zŠRestore config-owned shell hooks/outbound webhooks after a force clear; each guarded
independently so one failing does not skip the other.z'force-reload %s re-register skipped: %sN))z
shell-hookzagent.shell_hooks)zoutbound-webhookzagent.outbound_webhooks)r5  r6  Úre_register_config_hooksr}  r�   r„   )rÒ   r  Úmodule_namerb  s   &   r[   r¸  Ú3PluginManager._re_register_config_hooks_after_force  sV   € ó#TÑˆEðTÜ×'Ò'¨Ó4×MÑMÖOó#Tøô ô TÜ—‘ÐFÈ×SÒSûðTús   ‰$3³A¾AÁAc               ó   € V ^8„  d   QhRR/# rÖ   rY   )rZ   s   "r[   r\   rU    s   € ÷ 8Sñ 8S¸ñ 8Sr]   c                ó  a€  ^ RI Hp ^ RIHpHp V! 4       p. pT'       df    ^ RIHp T! 4       ;'       g    / P                  R4      ;'       g    / oR T3R llpT Uu. uF  q‡! T4      '       g   K  \        TRR	4      NK!  	  ppT'       g   T P                  '       g   R# MR
T n
         ^ RIHp	 T	! 4       p
T! T
4       T! T
R7       ^ RIHp T! \        T
4      4       T'       g   RT n
        \         P#                  RRP%                  \'        T4      4      ;'       g    R4       R#   \
         d     R# i ; i  \
         d    / o Løi ; iu upi   \
         d"   p\         P#                  RT4        Rp?R# Rp?ii ; i)z³If any plugin secret source is enabled (per its own ``is_enabled(cfg)``, honoring custom
activation), reset the cache and re-apply. Fail-open: never raises into discover_and_load.)Úlist_plugin_sources)Úload_hermes_dotenvÚreset_secret_source_cacheNr  Úsecretsc               ó   € V ^8„  d   QhRR/# r>  rY   )rZ   s   "r[   r\   ÚKPluginManager._refresh_secret_sources_after_discovery.<locals>.__annotate__&  s   € ÷ !ñ ! Dñ !r]   c                óÖ   <€ SP                  \        V R R4      4      p \        T P                  \	        V\
        4      '       d   V4      4      # / 4      4      #   \         d     R# i ; i)rå   rÓ  F)rû   r‹  rt   Ú
is_enabledr  rÀ  r}  )rá  r  rÈ  s   & €r[   Ú_enabledÚGPluginManager._refresh_secret_sources_after_discovery.<locals>._enabled&  s`   ø€ Ø!Ÿ+™+¤g¨f°f¸bÓ&AÓB�ð!Ü × 1Ñ 1¼ZÈÔQU×=VÒ=V°'Ó _Ó`Ð`Ð\^Ó _Ó`Ð`øÜ ô !Ú ð!ús   Ÿ/A Á	A ÁA(Á'A(rå   rÓ  T©r   )Úhermes_home)Úrefresh_installed_secret_scopeFz8Re-applied secret sources after plugin discovery for: %srç  u,   <none â€” reconciled removed plugin sources>z1secret source re-apply after discovery failed: %s)Úagent.secret_sources.registryrÅ  Úhermes_cli.env_loaderrÆ  rÇ  r}  r	  r  rû   r‹  r\  Úhermes_constantsr   Úagent.secret_scoperÑ  r   r�   r„   rí  r  )rÒ   rÅ  rÆ  rÇ  Úplugin_sourcesÚenabled_namesr  rÍ  Úsr   ÚhomerÑ  rb  rÈ  s   &            @r[   r·  Ú5PluginManager._refresh_secret_sources_after_discovery  s`  ø€ ð	ÝIß[Ù0Ó2ˆNð $&ˆßðÝ9Ù&›=×.Ð.¨B×3Ñ3°IÓ>×DÐDÀ"�÷!ð !ñ >LÓ[¹^¸ÈxÐXYÏ{Ô3œW Q¨°Ö3¹^ˆMÐ[ßð
 ×9×9Ð9Ùð :ð 6:ˆDÔ2ð	Sõ 9Ù"Ó$ˆDÙ% dÔ+Ù¨4Õ0õ
 JÙ*¬4°«:Ô6ß Ø9>�Ô6Ü�L‰LÐSØŸ™¤6¨-Ó#8Ó9×kÐkÐ=kömøô] ô 	Úð	ûô ô Ø’ðüò \øô> ô 	SÜ�L‰LÐLÈc×RÒRûð	SúsX   ƒD* £D< ·D< ÁD< Á EÁ4EÂ,A4E Ä!E Ä*D9Ä8D9Ä<EÅEÅF ÅE;Å;F c               ó   € V ^8„  d   QhRR/# rÖ   rY   )rZ   s   "r[   r\   rU  O  s   € ÷  Mñ  M¨$ñ  Mr]   c           	     óÀ  € V P                  4       pV Uu0 uF  p\        V4      kK  	  ppV P                  4        Uu. uF  p\        V4      V9  g   K  VNK  	  pp\        P	                  R\        V4      4       VP                  V4       \        4       p\        4       p\        V4      pV'       d+   \        P                  RRP                  V4      \        4       \        V4      pVP                  4        U	Uu/ uF!  w  r’V P                  W%V4      '       g   K  W’bK#  	  p
p	p\!        V
4       F>  pW«,          pV P#                  V4       V P%                  V4       V P'                  V4       K@  	  V'       dU   \        P)                  R\        V P*                  4      \-        R V P*                  P/                  4        4       4      4       R# R# u upi u upi u upp	i )u=   The actual discovery sweep â€” see :meth:`discover_and_load`.z  entrypoints: %d manifest(s)z¯Removed Hermes plugin %s is still listed in plugins.enabled; remove it and configure a standard user or system Relay plugins.toml, or use %s for an explicit user-file overriderç  z/Plugin discovery complete: %d found, %d enabledc              3  óL   "  € T F  qP                   '       g   K  ^x € K  	  R# 5i)é   N)rÂ   )ræ   r¯  s   & r[   ré   Ú9PluginManager._discover_and_load_inner.<locals>.<genexpr>o  s   é € ÐKÑ'= !ÇÅŸAšAÓ'=ùs   ‚$š
$N)Ú_collect_directory_manifestsr    Ú_scan_entry_pointsr�   r„   rò  Úextendr&   r'   r   ró   rí  r   r,   rí   Ú_gate_manifestr#   Ú_warn_python_dependenciesÚ_validate_plugin_config_schemaÚ_load_pluginr_  rì   ÚsumÚvalues)rÒ   Ú	manifestsÚmÚdirectory_keysÚep_manifestsÚdisabledrÂ   Ústale_relay_keysÚwinnersr®  Úto_loadÚ
lookup_keyrº   s   &            r[   rµ  Ú&PluginManager._discover_and_load_innerO  s‡  € à*.×*KÑ*KÓ*Mˆ	ñ 4=Ó=±9¨aœ, qž/±9ˆÐ=Ø#'×#:Ñ#:Ô#<ÓfÑ#<˜aÄÈQÃÐWeÑ@eŸ˜Ñ#<ˆÐfÜ�‰Ð4´c¸,Ó6GÔHØ×Ñ˜Ô&Ü(Ó*ˆÜ&Ó(ˆÜ3°GÓ<ÐßÜ�N‰Nð @ð  Ÿ9™9Ð%5Ó6Ô8PôRô +¨9Ó5ˆØ$+§M¡M¤OÔa¡O™D˜A°t×7JÑ7JÈ1ÐX_×7`”4�1’4¡OˆÑaÜ3°GÖ<ˆJØÕ*ˆHØ×*Ñ*¨8Ô4Ø×/Ñ/°Ô9Ø×Ñ˜hÖ'ñ	 =÷
 Ü�K‰KÐIÌ3ÈtÏ}É}ÓK]ÜÑK t§}¡}×';Ñ';Ô'=ÓKÓKöMñ ùò- >ùÚfùó bs   •G½GÁGÃ;GÄGc               ó(   € V ^8„  d   QhRRRRRRRR/# )	rW   rº   r   rí  rµ   rÂ   úOptional[set[str]]rX   rt   rY   )rZ   s   "r[   r\   rU  q  s,   € ÷ ñ Ø&ðØ2:ðØEWðà	ñr]   c                óž  € \        WV4      pVP                  R8X  d   R# VP                  R8X  d   V P                  V4       MZVP                  R8X  d   V P                  V4       M7\	        WP
                  VP                  R7      V P                  \        V4      &   VP                  '       d   \        P                  ! VP                  !   R# )zÍRoute one winning manifest per :func:`gate_manifest`: load now, defer, or record as
skipped (introspection-only placeholder). Returns True only for plugins that go through the
dependency-ordered load pass.ÚloadTÚload_nowÚdefer)rº   rÂ   rÄ   F)r*   Úactionræ  Ú_register_deferred_platformr¹   rÂ   rÄ   rì   r    Úlogr�   )rÒ   rº   rí  rÂ   Úverdicts   &&&& r[   rã  ÚPluginManager._gate_manifestq  s•   € ô   °GÓ<ˆØ�>‰>˜VÔ#ÙØ�>‰>˜ZÔ'Ø×Ñ˜hÕ'Ø�^‰^˜wÔ&Ø×,Ñ,¨XÕ6ä4@Ø!¯?©?À'Ç-Á-ô5QˆD�M‰Mœ, xÓ0Ñ1à�;�;ˆ;Ü�JŠJ˜Ÿ™Ò$Ùr]   c               ó(   € V ^8„  d   QhRRRRRRRR/# )rW   rå   rÝ   r£  r
   rß   rX   ru   rY   )rZ   s   "r[   r\   rU  …  s0   € ÷ Uñ U°ð UÀð UÐY\ð UÐaeñ Ur]   c          	     ó&  € ^ RI Hp \        V4      P                  4       P	                  4       pVR8X  d   \        R4      h\        P                  ! RV4      '       g   \        R4      h\        V4      '       g   \        R4      hWPP                  9   d1   V P                  V,          P                  p\        RV: RV: 24      hV! WRV\        \        4       P                  4       4      R	7      V P                  V&   \        P                  R
W54       R# )z­Manager-level registration (public API kept for out-of-tree plugins); the PluginContext
method is the tracked path plugins normally use. Same validation, no unload tracking.r¥  r§  r¨  r©  rª  r«  r¬  r­  r®  r±  N)r³  r¦  rÝ   rO  rµ  rò   r¶  r·  r‰  rŠ  r´  rß   r   rd   r�   r_  )rÒ   rå   r£  rß   r¦  r¹  rº  s   &&&$   r[   r»  Ú)PluginManager.register_approval_transport…  sç   € õ 	NÜ�D“	—‘Ó!×'Ñ'Ó)ˆØ�IÔÜÐLÓMÐMÜ�|Š|Ð7¸×?Ò?ÜÐZÓ[Ð[Ü˜
×#Ò#ÜÐLÓMÐMØ×-Ñ-Ô-Ø×-Ñ-¨eÕ4×>Ñ>ˆEÜÐ2°5±)Ð;UÐV[ÑU^Ð_Ó`Ð`Ù+FØ°iÌcÔRaÓRc×RkÑRkÓRmÓNnô,
ˆ×!Ñ! %Ñ(ô 	�‰ÐAÀ9ÖTr]   c               ó   € V ^8„  d   QhRR/# )rW   rå   rÝ   rY   )rZ   s   "r[   r\   rU  ˜  s   € ÷ ñ ¨3ñ r]   c                óò   € V P                   P                  \        V4      P                  4       P	                  4       4      pVe1   VP
                  \        \        4       P                  4       4      8w  d   R# V# )z>Return a transport only inside the profile that registered it.N)r´  rû   rÝ   rO  rµ  r°  r   rd   )rÒ   rå   rÙ  s   && r[   Úget_approval_transportÚ$PluginManager.get_approval_transport˜  sY   € à×.Ñ.×2Ñ2´3°t³9·?±?Ó3D×3JÑ3JÓ3LÓMˆ
ØÒ ×!8Ñ!8¼CÄÓ@Q×@YÑ@YÓ@[Ó<\Ô!\ÙØÐr]   c               ó   € V ^8„  d   QhRR/# ©rW   rX   úlist[PluginManifest]rY   )rZ   s   "r[   r\   rU  Ÿ  s   € ÷ -ñ -Ð.Bñ -r]   c                ó   € \        4       # )zVDirectory manifests in full-discovery order (see :func:`collect_directory_manifests`).)r(   rØ   s   &r[   rà  Ú*PluginManager._collect_directory_manifestsŸ  s   € ä*Ó,Ð,r]   c               ó    € V ^8„  d   QhRRRR/# ©rW   Ú
raw_configúMapping[str, Any]rX   rt   rY   )rZ   s   "r[   r\   rU  £  s   € ÷ ñ Ð3Dð Èñ r]   c                óî  € \        R4      '       d   R# VP                  R4      p\        V\        4      '       g   R# R R lpV! VP                  R4      4      pV! VP                  R. 4      4      pV'       g   R# V P	                  4        Uu/ uF  p\        V4      VbK  	  upP                  4        F›  w  rxWxP                  0p	VP                  '       d   W•,          '       g   W”,          '       g   KB   ^ RI	H
p
 T
! \        VP                  4      \        4       R	,          VP                  ;'       g    T,          . RR
7      '       d    R# K�  	  R# u upi   \        \         \"        3 d     K¿  i ; i)z�Probe enabled portable MCP packages without loading plugins (shares the full-discovery
manifest collection so precedence/gating cannot diverge).r±  Fr`   c               ó    € V ^8„  d   QhRRRR/# )rW   rÿ   r	   rX   rµ   rY   )rZ   s   "r[   r\   Ú<PluginManager.has_enabled_portable_mcp.<locals>.__annotate__¬  s   € ÷ 	bñ 	b˜#ð 	b (ñ 	br]   c                ó    € \        V \        4      '       d+   V  Uu0 uF  p\        V\        4      '       g   K  VkK  	  up# \        4       # u upi rä   )r  rÇ   rÝ   r`  )rÿ   Úvs   & r[   Ú_namesÚ6PluginManager.has_enabled_portable_mcp.<locals>._names¬  s;   € Ü?IÈ%ÔQU×?VÒ?V™uÓ;™u˜!¬
°1´c×(:—A�A™uÑ;ÐaÔ\_Ó\aÐaùÒ;s
   ›A¸ArÂ   rí  )Ú_discover_mcpzplugin-data)Úcreate_dataT)Ú_env_enabledrû   r  rÀ  rà  r    rí   rå   ÚportableÚhermes_cli.agent_pluginsr  r   rô  r   r  ÚOSErrorÚRuntimeErrorrò   )rÒ   r  Úplugins_configr  rÂ   rí  rê  rñ  rº   Únamesr  s   &&         r[   Úhas_enabled_portable_mcpÚ&PluginManager.has_enabled_portable_mcp£  sF  € ô Ð*×+Ò+ÙØ#Ÿ™¨	Ó2ˆÜ˜.¬$×/Ò/Ùõ	bñ ˜×+Ñ+¨IÓ6Ó7ˆÙ˜.×,Ñ,¨Z¸Ó<Ó=ˆßÙØAE×AbÑAbÔAdÓ$eÑAd¸A¤\°!£_°aÒ%7ÑAdÑ$e×$kÑ$kÖ$mÑ ˆJØ§¡Ð/ˆEØ×$×$Ð$¨×(8Ô(8ÀÇÄÙðÝBÙ ¤ h§m¡mÓ!4´oÓ6GÈ-Õ6WØ$,×$<Ñ$<×$JÐ$JÀ
õ7LØMOÐ]b÷dó dâñdñ %nñ ùò %føô œ\¬:Ð6ô Úðús   ÂEÃ7>EÄ6EÅE4Å3E4c               ó(   € V ^8„  d   QhRRRRRRRR/# )	rW   rô  r   rá  rÝ   Ú
skip_namesrô  rX   r  rY   )rZ   s   "r[   r\   rU  À  s2   € ÷ Cñ CØðCØ"%ðCØ3EðCà	ñCr]   c                ó   € \        WVR7      # )z9Read manifests under *path* (see :func:`scan_directory`).)r!  )r-   )rÒ   rô  rá  r!  s   &&&&r[   Ú_scan_directoryÚPluginManager._scan_directoryÀ  s   € ô ˜d°zÔBÐBr]   c               ó   € V ^8„  d   QhRR/# r  rY   )rZ   s   "r[   r\   rU  Æ  s   € ÷ /ñ /Ð$8ñ /r]   c                ó   € \        4       # )zORead installed plugin entry points (see :func:`discover_entrypoint_manifests`).)r)   rØ   s   &r[   rá  Ú PluginManager._scan_entry_pointsÆ  s   € ä,Ó.Ð.r]   c               ó   € V ^8„  d   QhRR/# ©rW   rX   úlist[tuple]rY   )rZ   s   "r[   r\   rU  Ê  s   € ÷ 1ñ 1¨;ñ 1r]   c                ó,   € \        V P                  4      # )zW``(action_id, callback, plugin_name)`` tuples for the Slack adapter to wire at connect.)rÇ   r¶  rØ   s   &r[   Úget_slack_action_handlersÚ'PluginManager.get_slack_action_handlersÊ  s   € ä�D×/Ñ/Ó0Ð0r]   c               ó    € V ^8„  d   QhRRRR/# )rW   r¥  rÝ   rX   r*  rY   )rZ   s   "r[   r\   rU  Î  s   € ÷ `ñ `°sð `¸{ñ `r]   c                ó˜   € \        V P                  P                  T;'       g    RP                  4       P	                  4       . 4      4      # )z ``(factory, plugin_name)`` tuples for one platform; adapters call ``factory(native,
adapter)`` at connect (see :meth:`PluginContext.register_platform_handler`).rÓ  )rÇ   r¾  rû   rO  rµ  )rÒ   r¥  s   &&r[   Úget_platform_handler_factoriesÚ,PluginManager.get_platform_handler_factoriesÎ  s;   € ô �D×4Ñ4×8Ñ8¸(¿.¸.Àb×9OÑ9OÓ9Q×9WÑ9WÓ9YÐ[]Ó^Ó_Ð_r]   c               ó   € V ^8„  d   QhRR/# r)  rY   )rZ   s   "r[   r\   rU  Ó  s   € ÷ ?ñ ?°ñ ?r]   c                ó$   € V P                  R4      # )zEBack-compat alias for ``get_platform_handler_factories("telegram")``.rÃ  )r0  rØ   s   &r[   Úget_telegram_handler_factoriesÚ,PluginManager.get_telegram_handler_factoriesÓ  s   € à×2Ñ2°:Ó>Ð>r]   c               ó   € V ^8„  d   QhRR/# ©rW   rX   zlist[dict[str, Any]]rY   )rZ   s   "r[   r\   rU  ×  s   € ÷ 

ñ 

Ð2ñ 

r]   c                óZ  € \        V P                  P                  4       4       UUu. uFö  w  rRVP                  P                  R\        VP                  4      RVP                  P                  RVP                  P                  RVP                  P                  RVP                  P                  RVP                  R\        VP                  4      R	\        VP                  4      R
\        VP                  4      R\        VP                  4      RVP                   /NKø  	  upp# u uppi )z7Return a list of info dicts for all discovered plugins.rå   rç   r$  ÚversionrÆ  rá  rÂ   ÚtoolsÚhooksr  ÚcommandsrÄ   )r  rì   rí   rº   rå   r    r$  r9  rÆ  rá  rÂ   rò  r¾   r¿   rÀ   rÁ   rÄ   )rÒ   Ú_keyr¯  s   &  r[   Úlist_pluginsÚPluginManager.list_plugins×  sé   € ô $ D§M¡M×$7Ñ$7Ó$9Ô:ô
ñ ;‘'�$ð ˜Ÿ
™
Ÿ™¨´¸Q¿Z¹ZÓ0HÈ&ÐRS×R\ÑR\×RaÑRaØ˜1Ÿ:™:×-Ñ-¨}¸a¿j¹j×>TÑ>TØ˜!Ÿ*™*×+Ñ+¨Y¸¿	¹	À7ÌCÐPQ×PbÑPbÓLcØœ˜Q×/Ñ/Ó0°,ÄÀA×D[ÑD[Ó@\ØœC × 5Ñ 5Ó6¸ÀÇÁóñ ;ò
ð 	
ùó 
s   §C<D'c               ó    € V ^8„  d   QhRRRR/# )rW   Úqualified_namerÝ   rX   zOptional[Path]rY   )rZ   s   "r[   r\   rU  ã  s   € ÷ 0ñ 0°ð 0¸ñ 0r]   c                ó^   € V P                   P                  V4      pV'       d
   VR,          # R# )z>Return the ``Path`` to a plugin skill's SKILL.md, or ``None``.rô  N)ra  rû   )rÒ   rA  rþ   s   && r[   Úfind_plugin_skillÚPluginManager.find_plugin_skillã  s)   € à×#Ñ#×'Ñ'¨Ó7ˆß %ˆu�V�}Ð/¨4Ð/r]   c               ó    € V ^8„  d   QhRRRR/# )rW   r¤  rÝ   rX   r½   rY   )rZ   s   "r[   r\   rU  è  s   € ÷ hñ h¨cð h°iñ hr]   c                óh   a€ V R2o\        V3R lV P                  P                  4        4       4      # )zCReturn sorted bare names of all skills registered by *plugin_name*.r   c              3  ól   <"  € T F)  w  rVP                  S4      '       g   K  VR ,          x € K+  	  R# 5i)Ú	bare_nameN)Ú
startswith)ræ   Úqnr–  r}  s   &  €r[   ré   Ú3PluginManager.list_plugin_skills.<locals>.<genexpr>ë  s,   øé € ÐgÑ2M©¨ÐQS×Q^ÑQ^Ð_e×Qf”n�a˜—n’nÓ2Mùs   ƒ4£4)r  ra  rí   )rÒ   r¤  r}  s   &&@r[   Úlist_plugin_skillsÚ PluginManager.list_plugin_skillsè  s/   ø€ à�= Ð"ˆÜÔg°$×2EÑ2E×2KÑ2KÔ2MÓgÓgÐgr]   c               ó   € V ^8„  d   QhRR/# r7  rY   )rZ   s   "r[   r\   rU  í  s   € ÷ 
ñ 
Ð,@ñ 
r]   c                óð   € \        V P                  P                  4       4       UUu. uFA  w  rRVR\        VP	                  RR4      4      RRR\        VP	                  R/ 4      4      /NKC  	  upp# u uppi )zDReturn progressive-disclosure metadata for registered plugin skills.rå   rÆ  rÓ  ÚcategoryrH  Úfrontmatter)r  ra  rí   rÝ   rû   rÀ  )rÒ   Ú	qualifiedrþ   s   &  r[   Úlist_plugin_skill_metadataÚ(PluginManager.list_plugin_skill_metadataí  s{   € ô '-¨T×-@Ñ-@×-FÑ-FÓ-HÔ&Iô	
ñ 'JÑ"�)ð ˜	 =´#°e·i±iÀÈrÓ6RÓ2SØ˜H m´T¸%¿)¹)ÀMÐSUÓ:VÓ5Wóñ 'Jò	
ð 	
ùó 
s   §AA2c               ó   € V ^8„  d   QhRR/# )rW   rX   ú	list[Any]rY   )rZ   s   "r[   r\   rU  ö  s   € ÷ Pñ P¨Iñ Pr]   c                ó|   € \        V P                  P                  4       4       UUu. uF  w  rVNK	  	  upp# u uppi )z:Plugin-registered ``AutomationBlueprint``s, sorted by key.)r  rb  rí   )rÒ   r=  Úbps   &  r[   Úlist_automation_blueprintsÚ(PluginManager.list_automation_blueprintsö  s2   € ä#)¨$×*EÑ*E×*KÑ*KÓ*MÔ#NÔOÑ#N‘x�t“Ñ#NÒOÐOùÓOs   §8c               ó   € V ^8„  d   QhRR/# r>  rY   )rZ   s   "r[   r\   rU  ú  s   € ÷ 0ñ 0¨$ñ 0r]   c                	ó,   € \        V P                  4      # rä   )rt   rc  rØ   s   &r[   Úhas_portable_mcp_serversÚ&PluginManager.has_portable_mcp_serversú  s   € Ü�D×.Ñ.Ó/Ð/r]   c               ó   € V ^8„  d   QhRR/# )rW   rX   zdict[str, dict[str, Any]]rY   )rZ   s   "r[   r\   rU  ý  s   € ÷ [ñ [Ð*Cñ [r]   c                ó~   € V P                   P                  4        UUu/ uF  w  rV\        V4      bK  	  upp# u uppi )z?Return a defensive copy of enabled portable MCP server configs.)rc  rí   rÀ  )rÒ   rå   rú   s   &  r[   Úget_portable_mcp_serversÚ&PluginManager.get_portable_mcp_serversý  s6   € à7;×7QÑ7Q×7WÑ7WÔ7YÔZÑ7Y¡| t�”d˜6“lÒ"Ñ7YÒZÐZùÓZs   ž9c               ó   € V ^8„  d   QhRR/# )rW   rX   zdict[str, str]rY   )rZ   s   "r[   r\   rU    s   € ÷ 7ñ 7°ñ 7r]   c                	ó,   € \        V P                  4      # rä   )rÀ  rd  rØ   s   &r[   Úget_portable_mcp_server_pluginsÚ-PluginManager.get_portable_mcp_server_plugins  s   € Ü�D×5Ñ5Ó6Ð6r]   c               ó    € V ^8„  d   QhRRRR/# )rW   rA  rÝ   rX   ru   rY   )rZ   s   "r[   r\   rU    s   € ÷ 6ñ 6°#ð 6¸$ñ 6r]   c                ó>   € V P                   P                  VR4       R# )z>Remove a stale registry entry (silently ignores missing keys).N)ra  Úpop)rÒ   rA  s   &&r[   Úremove_plugin_skillÚ!PluginManager.remove_plugin_skill  s   € à×Ñ×Ñ °Ö5r]   ).r´  rb  rÎ  rK  re  rp  r[  rZ  rq  rj  ri  rg  rk  rn  ro  r]  rs  rx  rr  rv  rt  rw  r  r_  r  ry  r{  r¾  r\  re  r«  r\  ra  r×  rì   rd  rc  r|  r}  rz  r¶  rf  r  r^  r  r[  rä   ©F)'rj   rk   rl   rm   rn   rÓ   r-  r‚  rŠ  r�  r–  r›  rŸ  r£  r§  r¼  r¸  r·  rµ  rã  r»  r  rà  r  r#  rá  r,  r0  r4  r>  rC  rL  rS  rY  r]  ra  re  rj  ro   rY   r]   r[   rÌ   rÌ   W  sØ   † ÙE÷S;ðj ô:ó ð:õ;õ2õ
Hð
 ô6ó ð6õ7õ.õ
H÷
42õlTõ8Sõt MõDõ(Uõ&õ-õ÷:Cõ/õ1õ`õ
?õ

õ0õ
hõ

õPõ0õ[õ7÷6ñ 6r]   rÌ   úOptional[PluginManager]Ú_plugin_managerzdict[Path, PluginManager]Ú_plugin_managers_by_homeztuple[object, Callable] | NoneÚ#_published_gateway_message_injectorÚ_published_tui_message_injectorc               ó   € V ^8„  d   QhRR/# rV   rY   )rZ   s   "r[   r\   r\   !  s   € ÷ .ñ .˜$ñ .r]   c                 ó¢   €  \        4       P                  4       P                  4       #   \         d    \        4       P                  4       u # i ; i)u³   Resolved active Hermes home â€” the key for per-profile plugin managers (plugins capture the
home at registration, so a process serving several profiles cannot share one manager).)r   Ú
expanduserrd   r}  rY   r]   r[   Ú_plugin_home_keyru  !  sC   € ð.ÜÓ ×+Ñ+Ó-×5Ñ5Ó7Ð7øÜô .ÜÓ ×+Ñ+Ó-Ò-ð.ús   ‚%( ¨#AÁAc               ó    € V ^8„  d   QhRRRR/# )rW   rË   rm  rX   ru   rY   )rZ   s   "r[   r\   r\   *  s   € ÷ :ñ :Ð&=ð :À$ñ :r]   c                óº  € V f   R# \        V R/ 4      P                  4        F¡  p\        \        VRR4      RR4      pV'       d   VP                  \         R24      '       g   KC  \	        V4       \
        ;_uu_ 4        \        P                  ! V4      V P                  8X  d   \        P                  ! VR4       RRR4       K£  	  R#   + '       g   i     K¸  ; i)u¿   Purge ``sys.modules`` entries for this manager's directory plugins (package AND submodules â€”
otherwise a same-slug plugin in another profile reuses the previous profile's submodule state).
Nrì   r»   rj   r  )
r‹  rè  rI  r1   r2   r0   r/   rû   r[  ri  )rË   rè   rÁ  s   &  r[   Ú_clear_plugin_submodulesrx  *  s§   € ð ‚ÙÜ˜' :¨rÓ2×9Ñ9Ö;ˆÜœg f¨h¸Ó=¸zÈ4ÓPˆß +×"8Ñ"8¼J¸<ÀqÐ9I×"JÒ"JÙÜ�{Ô#ß#Ö#Ü!×%Ò% kÓ2°g×6GÑ6GÔGÜ"×&Ò& {°DÔ9÷ $Ñ#ó <÷
 $×#Ð#ús   Á>=C	Ã	Cc               ó   € V ^8„  d   QhRR/# )rW   rX   zlist[PluginManager]rY   )rZ   s   "r[   r\   r\   :  s   € ÷ ñ Ð 3ñ r]   c                 ó  € \         ;_uu_ 4        \        \        P                  \        P                  4       4      4      p \        e!   \        V 9  d   V P                  \        4       R R R 4       V #   + '       g   i     X # ; irä   )Ú_plugin_managers_lockrÇ   rÀ  Úfromkeysro  rè  rn  r·  )Úmanagerss    r[   Ú_known_plugin_managersr~  :  sZ   € ß	Ö	ÜœŸ™Ô&>×&EÑ&EÓ&GÓHÓIˆÜÒ&¬?À(Ô+JØ�O‰OœOÔ,÷ 
ð €O÷	 
Ö	ð €Oús   �AA2Á2B	c               ó$   € V ^8„  d   QhRRRRRR/# r…  rY   )rZ   s   "r[   r\   r\   B  s(   € ÷ Bñ B¨ð BÐ:Mð BÐRVñ Br]   c                ó¦   € \         ;_uu_ 4        W3s\        4        F  pVP                  W4       K  	  RRR4       R#   + '       g   i     R# ; i)zHRemember the process gateway host and stamp managers that already exist.N)Ú_published_gateway_host_lockrp  r~  rŠ  ©rº  r‡  rË   s   && r[   Úpublish_gateway_message_hostrƒ  B  s=   € ÷
 
&Ö	%Ø/4Ð.?Ð+Ü-Ö/ˆGØ×0Ñ0°ÖAñ 0÷ 
&×	%×	%Ò	%ús	   �&?¿A	c               ó    € V ^8„  d   QhRRRR/# r�  rY   )rZ   s   "r[   r\   r\   M  s   € ÷ :ñ :°ð :¸4ñ :r]   c                óÖ   € \         ;_uu_ 4        \        e   \        ^ ,          V J d   Rs\        4        F  pVP                  V 4       K  	  RRR4       R#   + '       g   i     R# ; i)zKForget this owner's process gateway host without clobbering a newer runner.N)r�  rp  r~  r�  ©rº  rË   s   & r[   Ú$clear_published_gateway_message_hostr‡  M  sM   € ÷ 
&Ö	%Ü/Ò;Ü7¸Õ:¸eÓCØ26Ð/Ü-Ö/ˆGØ×2Ñ2°5Ö9ñ 0÷	 
&×	%×	%Ò	%ús   �>AÁA(	c               ó    € V ^8„  d   QhRRRR/# ©rW   rË   rÌ   rX   ru   rY   )rZ   s   "r[   r\   r\   X  s   € ÷ 8ñ 8¨Mð 8¸dñ 8r]   c                ó¬   € \         ;_uu_ 4        \        pVe   V P                  f   V P                  ! V!   RRR4       R#   + '       g   i     R# ; i)zLGive a newly resolved profile manager the live process gateway host, if any.N)r�  rp  r]  rŠ  ©rË   Úhosts   & r[   Ú_attach_published_gateway_hostr�  X  s;   € ç	%Ö	%Ü2ˆØÒ × AÑ AÒ IØ×0Ò0°$Ò7÷ 
&×	%×	%Ò	%ús   �)AÁA	c               ó$   € V ^8„  d   QhRRRRRR/# r…  rY   )rZ   s   "r[   r\   r\   `  s"   € ÷ 	:ñ 	: Fð 	:Ð6Ið 	:Èdñ 	:r]   c                ó¤   € \         ;_uu_ 4        W3sRRR4       \        4        F  pVP                  W4       K  	  R#   + '       g   i     L4; i)z~Remember the process TUI/desktop host and stamp managers that already exist.

Does not call ``set_gateway_message_injector``.
N)Ú_published_tui_host_lockrq  r~  rŸ  r‚  s   && r[   Úpublish_tui_message_hostr‘  `  s<   € ÷ 
"Ö	!Ø+0Ð*;Ð'÷ 
"ä)Ö+ˆØ×(Ñ(¨Ö9ó ,÷ 
"×	!ús	   �?¿A	c               ó    € V ^8„  d   QhRRRR/# r�  rY   )rZ   s   "r[   r\   r\   l  s   € ÷ 2ñ 2¨Fð 2°tñ 2r]   c                óÔ   € \         ;_uu_ 4        \        e   \        ^ ,          V J d   RsRRR4       \        4        F  pVP                  V 4       K  	  R#   + '       g   i     L4; i)zOForget the process TUI host and clear it where this owner still holds the slot.N)r�  rq  r~  r£  r†  s   & r[   Ú clear_published_tui_message_hostr”  l  sN   € ÷ 
"Ö	!Ü+Ò7Ü3°AÕ6¸%Ó?Ø.2Ð+÷ 
"ô *Ö+ˆØ×*Ñ*¨5Ö1ó ,÷	 
"×	!ús   �AÁA'	c               ó    € V ^8„  d   QhRRRR/# r‰  rY   )rZ   s   "r[   r\   r\   w  s   € ÷ -ñ -¨ð -¸$ñ -r]   c                óž   € \         ;_uu_ 4        \        pRRR4       Xe   V P                  f	   Wn        R# R# R#   + '       g   i     L.; i)z^Give a newly resolved manager the process TUI host, if one is installed and the slot is empty.N)r�  rq  r^  r‹  s   & r[   Ú_attach_published_tui_hostr—  w  s;   € ç	!Ö	!Ü.ˆ÷ 
"àÒ˜G×9Ñ9ÒAØ(,Ö%ñ BÑ÷ 
"×	!ús	   �<¼A	c               ó   € V ^8„  d   QhRR/# ©rW   rX   rÌ   rY   )rZ   s   "r[   r\   r\     s   € ÷ ñ ˜Mñ r]   c                 ó~  € \        4       p \        ;_uu_ 4        \        e2   \        \        P	                  4       9  d   \        \        V &   \        pM9\        P                  V 4      pVf   \        \        V 4      R7      pV\        V &   VsRRR4       \        X4       \        V4       V#   + '       g   i     L(; i)z•Return the plugin manager for the active Hermes profile/home (cached per resolved home; a
profile switch gets its own manager and plugin submodules).N)r[  )
ru  r{  rn  ro  rè  rû   rÌ   r   r�  r—  )Úcurrent_homerË   s     r[   Úget_plugin_managerrœ    s”   € ô $Ó%€Lß	Ö	ô Ò&¬?ÔBZ×BaÑBaÓBcÔ+cÜ5DÔ$ \Ñ2Ü%‰Gä.×2Ñ2°<Ó@ˆGØŠÜ'´/À,Ó2OÔP�Ø9@Ô(¨Ñ6Ø%ˆO÷ 
ô # 7Ô+Ü˜wÔ'Ø€N÷ 
×	ús   ™A3B,Â,B<	c               ó   € V ^8„  d   QhRR/# rÖ   rY   )rZ   s   "r[   r\   r\   •  s   € ÷ Lñ L¨$ñ Lr]   c            	     óð  € \         ;_uu_ 4        \        \        P                  \        P                  4       4      4      p \        e!   \        V 9  d   V P                  \        4       V  F  p\        V4        VP                  4        K!  	  \        P                  4        RsRRR4       \        ;_uu_ 4        RsRRR4       \         ;_uu_ 4        RsRRR4        ^ RIHp V! 4        R#   \         d    \        P                  RRR7        K¨  i ; i  + '       g   i     L{; i  + '       g   i     Lu; i  + '       g   i     Lo; i  \         d    \        P                  RRR7        R# i ; i)zPTest-only: drop every cached manager and its submodules for a fully clean slate.Nz!test plugin-manager unload failedT©Úexc_info)Úclear_providersz$dashboard-auth registry clear failed)r{  rÇ   rÀ  r|  ro  rè  rn  r·  rx  r´  r}  r�   r„   Úclearr�  rp  r�  rq  r“  r¡  )r}  rË   r¡  s      r[   Ú _reset_plugin_managers_for_testsr£  •  s  € ÷ 
Ö	ÜœŸ™Ô&>×&EÑ&EÓ&GÓHÓIˆÜÒ&¬?À(Ô+JØ�O‰OœOÔ,ÛˆGÜ$ WÔ-ðQØ—‘Ö ñ  ô 	!×&Ñ&Ô(Øˆ÷ 
÷ 
&Ö	%Ø.2Ð+÷ 
&ç	!Ö	!Ø*.Ð'÷ 
"ðLÝFÙÖøô ô QÜ—‘Ð@È4�×PðQú÷ 
×	ú÷ 
&×	%úç	!×	!ûô ô LÜ�‰Ð;Àdˆ×KðLúsZ   �A)DÁ9C-Â	DÂ9D)ÃD<ÃE Ã-"D	ÄDÄD	ÄDÄD&	Ä)D9	Ä<E	Å"E5Å4E5c               ó    € V ^8„  d   QhRRRR/# r  rY   )rZ   s   "r[   r\   r\   ±  s   € ÷ @ñ @Ð->ð @À4ñ @r]   c                ó4   € \        4       P                  V 4      # )z‰Whether config enables a portable package with MCP servers (manifest-only scan on a fresh
manager; imports nothing, mutates no registry).)rÌ   r  )r  s   &r[   Úhas_enabled_agent_plugin_mcpr¦  ±  s   € ô ‹?×3Ñ3°JÓ?Ð?r]   c               ó    € V ^8„  d   QhRRRR/# rr   rY   )rZ   s   "r[   r\   r\   ·  s   € ÷ 8ñ 8˜Dð 8¨Tñ 8r]   c                óx   € ^ RI Hp V! 4       '       d   R# \        4        \        4       P	                  V R7       R# )zŒDiscover and load all plugins (idempotent; ``force=True`` rescans). Joins an in-flight
background discovery instead of racing a second scan.r«  N©rs   )r²  r¬  Ú_join_background_discoveryrœ  r¼  )rs   r¬  s   & r[   Údiscover_pluginsr«  ·  s-   € õ =á×ÒÙÜÔ ÜÓ×*Ñ*°Ð*Ö7r]   zOptional[threading.Thread]Ú_background_discovery_threadc               ó   € V ^8„  d   QhRR/# rÖ   rY   )rZ   s   "r[   r\   r\   Æ  s   € ÷ -ñ -¨4ñ -r]   c                 óŠ  a€ ^ RI Hp  V ! 4       '       d   R# \        4       oSP                  '       d   R# \        ;_uu_ 4        \
        e&   \
        P                  4       '       d    RRR4       R# R V3R llp\        P                  ! VRRR7      s\
        P                  4        RRR4       R#   + '       g   i     R# ; i)zÜRun discovery in a daemon thread to overlap the rest of CLI startup (~150ms). Every
synchronous consumer joins it via :func:`discover_plugins`, so no one sees a half-loaded
registry. No-op when already done or in flight.r«  Nc               ó   € V ^8„  d   QhRR/# rÖ   rY   )rZ   s   "r[   r\   Ú7start_background_plugin_discovery.<locals>.__annotate__Ö  s   € ÷ 	Tñ 	T�dñ 	Tr]   c                 ó�   <€  S P                  4        \        4        R#   \         d    \        P	                  R RR7        R# i ; i)z"background plugin discovery failedTrŸ  N)r¼  Ú_persist_plugin_toolset_keysr}  r�   ró   ©rË   s   €r[   Ú_runÚ/start_background_plugin_discovery.<locals>._runÖ  s=   ø€ ðTØ×)Ñ)Ô+Ü,Ö.øÜô TÜ—‘ÐCÈd�×SðTús   ƒ Ÿ"AÁAzplugin-discoveryT)Útargetrå   Údaemon)
r²  r¬  rœ  r[  Ú_background_discovery_lockr¬  Úis_aliverX  ÚThreadÚstart)r¬  r´  rË   s     @r[   Ú!start_background_plugin_discoveryr¼  Æ  s‘   ø€ õ =á×ÒÙä Ó"€GØ××ÐÙß	#Ö	#Ü'Ò3Ô8T×8]Ñ8]×8_Ò8_Ø÷ 
$Ñ	#÷	Tð 	Tô (1×'7Ò'7¸tÐJ\ÐeiÔ'jÐ$Ü$×*Ñ*Ô,÷ 
$×	#×	#Ò	#ús   Á"B1Á&B1Á16B1Â1C	c               ó    € V ^8„  d   QhRRRR/# )rW   rè  ré  rX   ru   rY   )rZ   s   "r[   r\   r\   á  s   € ÷ ñ ¨ð ¸ñ r]   c                óÀ   € \         pVe@   VP                  4       '       d*   V\        P                  ! 4       J g   \	        4       '       d   R# VP                  V R7       R# )uœ   Wait for an in-flight background discovery (no-op from its own thread or a plugin-load worker it
spawned â€” that worker's parent is blocked waiting on it).N)rè  )r¬  r¹  rX  Úcurrent_threadr5   rí  )rè  Úts   & r[   rª  rª  á  sB   € ô 	%€AØ‚y˜Ÿ
™
Ÿš¨¬Y×-EÒ-EÓ-GÓ(GÔK`×KbÒKbÙØ‡F�F�7€FÖr]   c               ó   € V ^8„  d   QhRR/# rV   rY   )rZ   s   "r[   r\   r\   ê  s   € ÷ Dñ D¨ñ Dr]   c                 ó2   € \        4       R ,          R,          # )Úcachezplugin_toolset_keys.jsonrÏ  rY   r]   r[   Ú_plugin_toolset_keys_cache_pathrÄ  ê  s   € ÜÓ˜wÕ&Ð)CÕCÐCr]   c               ó   € V ^8„  d   QhRR/# rÖ   rY   )rZ   s   "r[   r\   r\   î  s   € ÷ Iñ I dñ Ir]   c            	     ó\  €  ^ RI Hp  \        \        4        UUu0 uF  w  p q!kK
  	  upp4      p \        \	        4       P                  4       4      pV ! \        4       RVRV/RRR7       R# u uppi   \         d    . p L/i ; i  \         d    \        P                  RRR	7        R# i ; i)
zJPersist discovered plugin toolset keys + portable MCP names (best-effort).)Úatomic_json_writeÚtoolset_keysÚportable_mcpNi€  )ÚindentÚmodez!plugin toolset key persist failedTrŸ  )
ÚutilsrÇ  r  Úget_plugin_toolsetsrœ  ra  r}  rÄ  r�   r„   )rÇ  Úts_keyÚ_Úkeysr  s        r[   r²  r²  î  s³   € ð	IÝ+ÜÔ2EÔ2GÔHÑ2G¡, &¨!¨Q’vÑ2GÒHÓIˆð	ÜÔ0Ó2×KÑKÓMÓNˆHñ 	Ô9Ó;¸nÈdÐTbÐdlÐ=mÐvzð  BG÷  	Hùó Iøô ô 	ØŠHð	ûô ô IÜ�‰Ð8À4ˆ×HðIúsD   ‚B šA,
¨B ±!A2 ÁB Á,B Á2BÁ?B ÂBÂB Â"B+Â*B+c               ó$   € V ^8„  d   QhRRRRRR/# )rW   Úcache_fieldrÝ   Úlivez#Callable[[PluginManager], set[str]]rX   rµ   rY   )rZ   s   "r[   r\   r\   ü  s#   € ÷ ñ  Cð Ð/Rð ÐW_ñ r]   c                ó°  € \        4       p\        pVRJ;'       d    VP                  4       pVP                  '       d   V'       g	   V! V4      # V'       dÝ   \	        \
        4      ;_uu_ 4        \        P                  ! \        4       P                  RR7      4      p\        V\        4      '       d   VP                  V 4      MRp\        V\        4      '       dP   \        ;QJ d    R V 4       F  '       d   K   RM	  RM! R V 4       4      '       d   \        V4      uuRRR4       # RRR4       \!        4        V! V4      #   + '       g   i     L"; i)z\Shared body of the ``*_nowait`` probes: live registry, else last launch's cache, else block.Nz	utf-8-sig)Úencodingc              3  óB   "  € T F  p\        V\        4      x € K  	  R # 5irä   )r  rÝ   )ræ   r  s   & r[   ré   Ú%_nowait_plugin_set.<locals>.<genexpr>  s   é € Ð/SÉFÀq´
¸1¼c×0BÐ0BËFùs   ‚FT)rœ  r¬  r¹  r[  r   r}  rþ  rÿ  rÄ  Ú	read_textr  rÀ  rû   rÇ   Úallr`  r«  )rÒ  rÓ  rË   rÀ  Ú	in_flightÚblobrè  s   &&     r[   Ú_nowait_plugin_setrÜ  ü  sã   € ä Ó"€GÜ$€AØ˜�×.Ð. !§*¡*£,€IØ××Ð§9Ù�G‹}ÐßÜ”i× Õ Ü—:’:Ô=Ó?×IÑIÐS^ÐIÓ_Ó`ˆDÜ.8¸¼t×.DÒ.D�T—X‘X˜kÔ*È$ˆFÜ˜&¤$×'Ò'¯C«CÑ/SÉFÓ/S¯C¯CªCÑ/SÉFÓ/S×,SÒ,SÜ˜6“{÷	 !× Ò ô
 ÔÙ�‹=Ð÷ !× ús   Á.A8EÃ'EÃ;EÄ
EÅE	c               ó   € V ^8„  d   QhRR/# ©rW   rX   rµ   rY   )rZ   s   "r[   r\   r\     s   € ÷ mñ m¨ñ mr]   c                 ó   € \        RR 4      # )zÿPlugin toolset keys without blocking on in-flight discovery: live registry when done, last
launch's persisted set while a background scan runs (callers only EXCLUDE these keys, so a stale
set is harmless and self-heals), else block via discover_plugins().rÈ  c                óL   € \        4        UUu0 uF  w  p q!kK
  	  upp# u uppi rä   )rÍ  )Ú_mrÎ  rÏ  s   &  r[   r@  Ú0get_plugin_toolset_keys_nowait.<locals>.<lambda>  s#   € ÔUhÔUjÔ9kÑUjÁ\ÀVÈQÐPQº&ÑUjÓ9kùÓ9ks   Ž ©rÜ  rY   r]   r[   Úget_plugin_toolset_keys_nowaiträ    s   € ô ˜nÑ.kÓlÐlr]   c               ó   € V ^8„  d   QhRR/# rÞ  rY   )rZ   s   "r[   r\   r\     s   € ÷ [ñ [¨hñ [r]   c                 ó   € \        RR 4      # )zSPortable MCP server names; same contract as :func:`get_plugin_toolset_keys_nowait`.rÉ  c                ó4   € \        V P                  4       4      # rä   )r`  ra  )rê  s   &r[   r@  Ú6get_portable_mcp_server_names_nowait.<locals>.<lambda>  s   € ¼¸A×<VÑ<VÓ<XÔ8Yr]   rã  rY   r]   r[   Ú$get_portable_mcp_server_names_nowaitré    s   € ä˜nÑ.YÓZÐZr]   c               ó   € V ^8„  d   QhRR/# r™  rY   )rZ   s   "r[   r\   r\     s   € ÷ ñ ˜=ñ r]   c                 ót   € \        4       p \        V RR4      '       g   \        4        V P                  4        V # )uj  Active manager, lazily discovering if it never ran â€” delivery must not depend on WHICH
surface imported us (dashboards/TUI/cron never import model_tools). ``getattr`` default
``True`` leaves test doubles untouched.

Hook/middleware delivery must not depend on WHICH surface imported us: dashboards, TUI slash workers,
query mode, and cron delivery paths never import ``model_tools`` (whose import side-effect is the
discovery trigger on the interactive CLI path), so hooks registered by user plugins were silently dead
on those surfaces (#50776, #67597, #67890, #50937; tracking #64178 â€” salvaged from PR #64188).
r[  T)rœ  r‹  rª  r¼  r³  s    r[   Ú_delivery_managerrì    s2   € ô !Ó"€GÜ�7˜M¨4×0Ò0Ü"Ô$Ø×!Ñ!Ô#Ø€Nr]   c               ó$   € V ^8„  d   QhRRRRRR/# ©rW   rý  rÝ   rg  r	   rX   rV  rY   )rZ   s   "r[   r\   r\   *  s&   € ÷ @ñ @˜3ð @¨#ð @°)ñ @r]   c                ó8   € \        4       P                  ! V 3/ VB # )aÓ  Invoke a lifecycle hook (lazy-discovers first); return non-``None`` callback results.

Hot-path / observer hooks in ``_HOOK_TIMEOUT_BOUNDED_HOOKS`` and the policy hook ``pre_tool_call`` are
bounded by ``plugins.hook_callback_timeout`` (default 30s). On timeout the worker is abandoned (not
joined) so we do not reintroduce the #6622 hang. Timed-out or still-running ``pre_tool_call`` callbacks
fail closed with a block directive; other bounded hooks fail open (skip).
Ensures plugins are discovered on first invocation so callers in processes that never explicitly call
``discover_plugins()`` (gateway platform events, TUI slash workers, query mode, cron) still fire
callbacks registered by user plugins (tracking #64178).
)rì  Úinvoke_hook©rý  rg  s   &,r[   rð  rð  *  s   € ô Ó×*Ò*¨9Ñ?¸Ñ?Ð?r]   c               ó$   € V ^8„  d   QhRRRRRR/# rî  rY   )rZ   s   "r[   r\   r\   8  s&   € ÷ Gñ G #ð G°ð G¸ñ Gr]   c              ‹  óT   "  € \        4       P                  ! V 3/ VB G Rj  x€L
 #  L5i)z¬:func:`invoke_hook` for callers on an event loop: ``async def`` callbacks are awaited
there instead of bridged through a helper thread (see ``PluginManager.ainvoke_hook``).N)rì  Úainvoke_hookrñ  s   &,r[   rô  rô  8  s&   é € ô #Ó$×1Ò1°)ÑF¸vÑF×FÐFÑFùs   ‚(¡&¢(c               ó    € V ^8„  d   QhRRRR/# )rW   Úsession_infor  rX   z'list[RenderedPluginSystemPromptSection]rY   )rZ   s   "r[   r\   r\   >  s    € ÷ Tñ TÐ0Að TÐFmñ Tr]   c                ó4   € \        4       P                  V 4      # )z@Render plugin prompt sections after idempotent plugin discovery.)Ú_ensure_plugins_discoveredÚrender_system_prompt_sections)rö  s   &r[   rù  rù  >  s   € ä%Ó'×EÑEÀlÓSÐSr]   c               ó$   € V ^8„  d   QhRRRRRR/# )rW   r$  rÝ   rg  r	   rX   rV  rY   )rZ   s   "r[   r\   r\   C  s&   € ÷ Añ A˜Cð A¨3ð A°9ñ Ar]   c                ó8   € \        4       P                  ! V 3/ VB # )uÄ   Invoke registered middleware callbacks (lazy-discovers like :func:`invoke_hook`).

Lazy-discovers plugins on first use â€” same delivery-parity guarantee as :func:`invoke_hook` (tracking
#64178).
)rì  Úinvoke_middleware)r$  rg  s   &,r[   rü  rü  C  s   € ô Ó×0Ò0°Ñ@¸Ñ@Ð@r]   c               ó    € V ^8„  d   QhRRRR/# )rW   r$  rÝ   rX   rt   rY   )rZ   s   "r[   r\   r\   L  s   € ÷ ?ñ ?˜ð ? ñ ?r]   c                ó¾   € \        4       p\        VRR4      p\        V4      '       d   \        V! V 4      4      # \        \        VR/ 4      P	                  V 4      4      # )a<  True when middleware is registered for ``kind``; lazy-discovers first since callers gate
:func:`invoke_middleware` on it.

Lazy-discovers first: callers use this as a gate before :func:`invoke_middleware`, so a pre-discovery
``False`` here would silently skip delivery on surfaces that never ran discovery (#64178).
Úhas_middlewareNr  )rì  r‹  r‰  rt   rû   )r$  rË   rF  s   &  r[   rÿ  rÿ  L  sT   € ô  Ó!€GÜ�WÐ.°Ó5€FÜ�×ÒÜ‘F˜4“LÓ!Ð!Ü”˜ °Ó3×7Ñ7¸Ó=Ó>Ð>r]   c               ó    € V ^8„  d   QhRRRR/# )rW   rý  rÝ   rX   rt   rY   )rZ   s   "r[   r\   r\   Z  s   € ÷ 3ñ 3˜ð 3 ñ 3r]   c                ó4   € \        4       P                  V 4      # )uÇ   True when a loaded plugin handles a hook (lazy-discovers first, like :func:`has_middleware`).

Lazy-discovers first â€” same gate-before-invoke rationale as :func:`has_middleware` (tracking #64178).
)rì  Úhas_hook©rý  s   &r[   r  r  Z  s   € ô
 Ó×'Ñ'¨	Ó2Ð2r]   c               ó    € V ^8„  d   QhRRRR/# )rW   rý  rÝ   rX   ztuple[Callable, ...]rY   )rZ   s   "r[   r\   r\   b  s   € ÷ ?ñ ? 3ð ?Ð+?ñ ?r]   c                ó4   € \        4       P                  V 4      # )z<Return a stable snapshot of callbacks registered for a hook.)rœ  Úiter_hook_callbacksr  s   &r[   r  r  b  s   € äÓ×3Ñ3°IÓ>Ð>r]   r  r¥  c               ó4   € V ^8„  d   QhRRRRRRRRRRRRR	R
/# )rW   rÜ  rÝ   rV  Ú
alias_usedÚargs_rawr  rÃ   r¥  rX   ru   rY   )rZ   s   "r[   r\   r\   g  sO   € ÷ Nñ NØðNØ!ðNØ/2ðNØ>AðNàðNà1>ðNð 
ñNr]   c           
     óh  €  \        4       pVP                  R4      '       g   R# VP                  RWVW4VR7      pV FB  p\        V\        4      '       g   K  RV9   g
   RV9   g   K+  \
        P                  RW�V 4       KD  	  R#   \         d"   p	\
        P                  RT	4        Rp	?	R# Rp	?	ii ; i)zšFire the observer-only ``pre_command`` hook; never raises. Directive-shaped returns are
logged at debug so future block/rewrite adopters are discoverable.r³   N)rÜ  rV  r  r	  r  r¥  rù  Údecisionzžpre_command is observer-only in v1: ignoring directive %r for /%s (surface=%s). Block/rewrite will arrive with the command middleware variant (#64204/#64231).z0pre_command hook dispatch failed (non-fatal): %s)rœ  r  rð  r  rÀ  r�   r„   r}  )
rÜ  rV  r  r	  r  r¥  rË   Úresultsrú  rb  s
   $$$$$$    r[   Úfire_pre_command_hookr  g  sª   € ðNÜ$Ó&ˆØ×Ñ ×.Ò.ÙØ×%Ñ%Ø 7È
ØÀð &ó 
ˆó ˆFÜ˜&¤$×'Ô'¨X¸Ô-?À:ÐQWÖCWÜ—‘ð nà#¨gö7ó øô
 ô NÜ�‰ÐGÈ×MÒMûðNús(   ‚!B ¥.B ÁB Á(B ÂB1ÂB,Â,B1T)Úfrozenc                  óP   € ] tR tRt$ RtR]R&   RtR]R&   RtR]R&   RtR]R&   R	t	R# )
Ú_PreToolCallDirectivei�  NrÃ   rù  ÚmessageÚrule_keyrç  Úmodified_argsrY   )
rj   rk   rl   rm   rù  rÆ   r  r  r  ro   rY   r]   r[   r  r  �  s+   ‡ à €FˆMÓ Ø!€Gˆ]Ó!Ø"€HˆmÓ"Ø.2€MÐ+×2r]   r  c               ó$   € V ^8„  d   QhRRRRRR/# )rW   Úallowedrô  Údeny_msg_fmtrÝ   rX   ru   rY   )rZ   s   "r[   r\   r\   ‰  s&   € ÷ .ñ .Øð.àð.ð 
ñ.r]   c                ó2   € V \         n        V\         n        R # rä   )Ú_thread_tool_whitelistr  Úfmt)r  r  s   &&r[   Úset_thread_tool_whitelistr  ‰  s   € ð &-ÔÔ"Ø!-ÔÖr]   c               ó   € V ^8„  d   QhRR/# rÖ   rY   )rZ   s   "r[   r\   r\   ‘  s   € ÷ *ñ * Tñ *r]   c                 ó   € R \         n        R # rä   )r  r  rY   r]   r[   Úclear_thread_tool_whitelistr  ‘  s   € Ø%)ÔÖ"r]   rÓ  c               ó<   € V ^8„  d   QhRRRRRRRRRRRRR	RR
RRR/	# )rW   r  rÝ   ra  rç  Útask_idÚ
session_idÚtool_call_idÚturn_idÚapi_request_idÚmiddleware_tracezOptional[list[dict[str, Any]]]rX   r  rY   )rZ   s   "r[   r\   r\   •  sX   € ÷ 4>ñ 4>Øð4>Ø2ð4>Ø=@ð4>ØSVð4>àð4>à%(ð4>à?Bð4>ð 5ð4>ð ñ	4>r]   c                óô  € \        \        RR4      pVe5   W9  d/   \        \        RR4      p	\        RV	P                  V R7      R7      # ^ RIHp
 T
! R	T \        V\        4      '       d   TM/ Y#YET\        T;'       g    . 4      R
7	      pRpRpV EF8  p\        V\        4      '       g   K  VP                  R4      pVR8X  dV   VP                  R4      p\        V\        4      '       d-   V'       d%   / Ve   TM\        V\        4      '       d   TM/ CVCpK‰  VR9  d   K’  VP                  R4      p\        V\        4      '       d   V'       d   TMRpVR8X  d   V'       g   KÖ  VR8X  d   \        RVVR7      u # Ve   Kó  VP                  R4      pT\        V\        4      '       d   VP                  4       ;'       g    RMR3pEK;  	  Ve   \        RV^ ,          V^,          VR7      # \        VR7      # )aô  Check ``pre_tool_call`` hooks for ``{"action": "block", "message"}`` (veto; message becomes
the tool result) or ``{"action": "approve", "message", "rule_key"?}`` (escalate ANY tool to the
human-approval gate; ``rule_key`` picks the ``[a]lways`` allowlist grain). Precedence is
``block`` > ``approve`` > none, not registration order: any plugin's valid veto wins over an
earlier plugin's request for human confirmation (#87420); among approves the first valid one
wins. Irrelevant returns are ignored.r  Nr  zTool '{tool_name}' deniedÚblock)r  )rù  r  )rð  r‡   )r  ra  r  r   r!  r"  r#  r$  rù  Úmodifyra  Úapprover  )rù  r  r  r  )rù  r  r  r  )r  )r&  r(  )r‹  r  r  rZ   Úhermes_cli.lifecyclerð  r  rÀ  rÇ   rû   rÝ   rO  )r  ra  r  r   r!  r"  r#  r$  r  r  Úinvoke_lifecycle_hookÚhook_resultsr  Úfirst_approverú  rù  Úpartialr  r  s   &&&&&&&&           r[   Ú$_get_pre_tool_call_directive_detailsr.  •  sÙ  € ô Ô,¨i¸Ó>€GØÒ˜yÔ7ÜÔ,¨eÐ5PÓQˆÜ$¨G¸S¿Z¹ZÐR[¸ZÓ=\Ô]Ð]ÝIÙ(Ø 9¼:ÀdÌD×;QÒ;Q±4ÐWYØ¸\Ø%¼Ð=M×=SÐ=SÐQSÓ8Tô€Lð
 /3€MØCG€MÜˆÜ˜&¤$×'Ò'ÙØ—‘˜HÓ%ˆð �XÔØ—j‘j Ó(ˆGÜ˜'¤4×(Ò(¯Wð!Z°]Ò5N¡MÜ-7¸¼d×-CÒ-C¡TÈð!ZØQXð!Z�áØÐ-Ô-ÙØ—*‘*˜YÓ'ˆÜ'¨´×5Ò5¿'‘'Àtˆà�WÔ§WÙØ�WÔÜ(°ÀÐXeÔfÒfàÔ Ø—z‘z *Ó-ˆHØ$ÄJÈxÔY\×D]ÒD] x§~¡~Ó'7×'?Ð'?¸4øÐcgÐh‹Mñ3 ð4 Ò Ü$¨I¸}ÈQÕ?OÐZgÐhiÕZjØ3@ôBð 	Bä ¨}Ô=Ð=r]   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	rW   r  rÝ   ra  rç  Úhook_kwargsr	   rX   z#tuple[Optional[str], Optional[str]]rY   )rZ   s   "r[   r\   r\   Ì  s,   € ÷ -ñ -Øð-Ø2ð-ØCFð-à(ñ-r]   c                óJ   € \        W3/ VB pVP                  VP                  3# )z·Back-compat: ``(directive, message)`` with directive ``"block"`` / ``"approve"`` / ``None``.
``hook_kwargs`` are the observability ids of :func:`_get_pre_tool_call_directive_details`.)r.  rù  r  )r  ra  r0  Údetailss   &&, r[   Úget_pre_tool_call_directiver3  Ì  s&   € ô
 3°9ÑRÀkÑR€GØ�N‰N˜GŸO™OÐ,Ð,r]   c               ó(   € V ^8„  d   QhRRRRRRRR/# ©	rW   r  rÝ   ra  rç  r0  r	   rX   rÃ   rY   )rZ   s   "r[   r\   r\   Õ  s,   € ÷ 5ñ 5Øð5Ø2ð5ØCFð5àñ5r]   c                ó4   € \        W3/ VB w  r4VR8X  d   V# R# )zYDeprecated shim: only the ``block`` message (or ``None``); ``approve`` is invisible here.r&  N)r3  )r  ra  r0  Ú	directiver  s   &&,  r[   Úget_pre_tool_call_block_messager8  Õ  s(   € ô 5°YÑTÈÑTÑ€IØ 7Ô*ˆ7Ð4°Ð4r]   c               ó(   € V ^8„  d   QhRRRRRRRR/# r5  rY   )rZ   s   "r[   r\   r\   Ý  s2   € ÷ Lñ LØðLØ2ðLØCFðLàñLr]   c                ó(   € \        W3/ VB ^ ,          # )z°Resolve the pre_tool_call directive to a final block message (or ``None`` to proceed),
running the human-approval gate for ``approve``. See :func:`_resolve_block_from_details`.)Ú_dispatch_pre_tool_call_hooks)r  ra  r0  s   &&,r[   Úresolve_pre_tool_blockr<  Ý  s   € ô
 )¨ÑH¸KÑHÈÕKÐKr]   r"  r!  r   c               ó0   € V ^8„  d   QhRRRRRRRRRRRR	/# )
rW   r2  r  r  rÝ   r"  r!  r   rX   rÃ   rY   )rZ   s   "r[   r\   r\   å  s>   € ÷ ñ Ø"ðØ/2ðØ@CðØX[ðàðð ñr]   c          	     ó  € V P                   R8X  d   V P                  # V P                   R8w  d   R#  ^ RIHp ^ RIHpHp Rp\        \        4      ;_uu_ 4        V! W#VR7      pRRR4        T! YP                  ;'       g    RV P                  ;'       g    TR7      p	Ve*   \        \        4      ;_uu_ 4        V! V4       RRR4       M V	P                  R
4      '       g(   \        V	P                  R4      ;'       g    RV 24      # R#   + '       g   i     L±; i  + '       g   i     Lc; i  Te=   \        \        4      ;_uu_ 4        T! T4       RRR4       i   + '       g   i     i ; ii ; i  \         d	    R	T 2u # i ; i)z¯The ONE place for the fail-closed approval logic: ``block`` blocks with its message; an
``approve`` whose gate errors, denies, or times out is blocked; anything else proceeds.r&  r(  N)Úrequest_tool_approval)Ú#reset_current_observability_contextÚ!set_current_observability_context©r"  r!  r   rÓ  )r  z)BLOCKED: plugin approval gate failed for Úapprovedr  z&BLOCKED: plugin approval required for )rù  r  Útools.approvalr?  Útools.approval_contextr@  rA  r   r}  r  rû   rÝ   )
r2  r  r"  r!  r   r?  r@  rA  Úapproval_tokensrú  s
   &&$$$     r[   Ú_resolve_block_from_detailsrG  å  sK  € ð ‡~�~˜Ô Ø�‰ÐØ‡~�~˜Ô"ÙðGÝ8ßqØˆÜ”i× Õ Ù?ØÀzôSˆO÷ !ð	IÙ*¨9·o±o×6KÐ6KÈÐV]×VfÑVf×VsÐVsÐjsÔtˆFàÒ*Üœi×(Õ(Ù7¸ÔH÷ )Ð(ð +ð �:‰:�j×!Ò!Ü�6—:‘:˜iÓ(×`Ð`Ð.TÐU^ÐT_Ð,`ÓaÐaÙ÷ !× ú÷ )×(ûð Ò*Üœi×(Õ(Ù7¸ÔH÷ )×(×(Ð(úð +ûô ô Gð ;¸9¸+ÐFÒFðGúsƒ   ²'E8 ÁDÁ$E8 Á-D3 ÂD3 ÂD3 ÂE8 Â:	D ÃE8 ÄD	ÄE8 Ä D0	Ä+E8 Ä0E8 Ä3E5Å	E!	Å	E5Å!E1Å,	E5Å5E8 Å8FÆ
Fc               ó(   € V ^8„  d   QhRRRRRRRR/# )	rW   r  rÝ   ra  rç  r0  r	   rX   z.tuple[Optional[str], Optional[dict[str, Any]]]rY   )rZ   s   "r[   r\   r\     s,   € ÷ .ñ .Øð.Ø2ð.ØCFð.à3ñ.r]   c                ó–   € \        W3/ VB p\        W03/ R Uu/ uF  qDVP                  VR4      bK  	  upB pWSP                  3# u upi )uº   Invoke ``pre_tool_call`` hooks once; return ``(block_message, modified_args)`` â€” the resolved
block/approve message (``None`` to proceed) and merged ``modify`` args (``None`` if none).rÓ  rB  )r.  rG  rû   r  )r  ra  r0  r2  r®  Ú	block_msgs   &&,   r[   r;  r;    s^   € ô
 3°9ÑRÀkÑR€GÜ+ØñnÙBkÓlÑBk¸Q +§/¡/°!°RÓ"8Ò8ÑBkÑlñn€Ià×,Ñ,Ð-Ð-ùò ms   ™AÚmodelÚcodingÚattemptÚfinal_responseÚchanged_pathsc               ó8   € V ^8„  d   QhRRRRRRRRRRR	RR
RRR/# )rW   r   rÝ   r¥  rK  rL  rt   rM  rÓ  rN  rO  zOptional[list[str]]rX   rÃ   rY   )rZ   s   "r[   r\   r\     sN   € ÷ ñ ØðØ'*ðØ8;ðØJNðàðà&)ðà?Rðð ñr]   c                ó&  € \        RYY#YE\        T;'       g    . 4      R7      pV Fç  p\        V\        4      '       g   K  \	        VP                  R4      ;'       g    VP                  R4      ;'       g    R4      P                  4       P                  4       p	VP                  R4      ;'       g    VP                  R4      p
V	R	9   g   K§  \        V
\        4      '       g   K¿  V
P                  4       '       g   K×  V
P                  4       u # 	  R# )
a  Check ``pre_verify`` hooks for ``{"action": "continue", "message"}`` (or Claude-Code Stop
``{"decision": "block", "reason"}``) to keep the turn going; first non-empty message wins, any
other return lets the turn finish. ``coding``/``attempt`` let hooks scope and self-throttle.r’   )r   r¥  rK  rL  rM  rN  rO  rù  r  rÓ  r  ÚreasonN)Úcontinuer&  )rð  rÇ   r  rÀ  rÝ   rû   rO  rµ  )r   r¥  rK  rL  rM  rN  rO  r+  rú  rù  r  s   $$$$$$$    r[   Úget_pre_verify_continue_messagerT    sÑ   € ô Ø ÀeØÄdÈ=×K^ÐK^Ð\^ÓF_ô€Ló ˆÜ˜&¤$×'Ò'ÙÜ�V—Z‘Z Ó)×IÐI¨V¯Z©Z¸
Ó-C×IÐIÀrÓJ×PÑPÓR×XÑXÓZˆØ—*‘*˜YÓ'×?Ð?¨6¯:©:°hÓ+?ˆØÐ*Ö*¬z¸'Ä3×/GÔ/GÈGÏMÉMÏOÌOØ—=‘=“?Ò"ñ ñ r]   rU  Ústatus_codeÚ
error_typeÚ
error_codeÚerror_messageÚ
error_bodyrÄ   Úapprox_tokensÚcontext_lengthÚnum_messagesc               óH   € V ^8„  d   QhRRRRRRRRRRRRR	R
RRRRRRRRRR
/# )rW   rU  rÝ   rK  rU  zOptional[int]rV  rW  rX  rY  rç  rÄ   zOptional[BaseException]rZ  rÓ  r[  r\  rX   rY   )rZ   s   "r[   r\   r\   %  sx   € ÷ 5ñ 5Øð5Ø"%ð5Ø9Fð5Ø[^ð5àð5à),ð5à?Wð5ð #ð5ð ;>ð5ð TWð5ð ð	5ð
 ñ5r]   c                óÂ  a€ ^ RI Ho \        RYY#TT\        V\        4      '       d   TM/ WxV	V
R7      pR V3R llpV Uu. uF  qÜ! V4      ;pf   K  WÞ3NK  	  ppV'       g   R# V^ ,          w  rÞRV/pR F!  pVV9   g   K  \        VV,          4      VV&   K#  	  VP                  R4      p\        V\        4      '       d1   VP                  4       '       d   VP                  4       R	,          VR&   \        VP                  R
4      \        4      '       d   VR
,          VR
&   \        V4      ^8”  d'   \        P                  R\        V4      ^,
          4       V# u upi )uq  Consult ``transform_api_error_classification`` hooks BEFORE the built-in classifier.
Run-all-then-pick-first: the first valid result in registration order wins, losing valid results
warn (conflicts visible, not shadowed). Returns a sanitized dict (``reason`` -> ``FailoverReason``,
hint flags -> bool, ``message`` capped at 500) or ``None``. Privacy: inputs may be unredacted.

A callback returns ``None`` to decline, or a dict with a required ``"reason"`` (a
:class:`agent.error_classifier.FailoverReason` member or its string name) plus optional recovery-hint
overrides. Dispatch is run-all-then-pick-first: ``invoke_hook`` runs every registered callback with
failures isolated, then the first result carrying a valid reason wins in registration order â€” mirroring
:func:`get_pre_tool_call_block_message`, invalid or irrelevant returns are silently ignored so a
misbehaving plugin degrades to a no-op. When more than one callback returns a valid classification, the
losing results are skipped with a runtime warning (the #64714 skipped-transform rule) so conflicting
provider plugins are visible in logs instead of silently shadowed.
)ÚFailoverReasonr˜   )rU  rK  rU  rV  rW  rX  rY  rÄ   rZ  r[  r\  c               ó    € V ^8„  d   QhRRRR/# )rW   rú  r	   rX   rY   )rZ   s   "r[   r\   Ú5get_plugin_error_classification.<locals>.__annotate__B  s   € ÷ Fñ F˜ð F ñ Fr]   c                ób  <€ \        V \        4      '       d   V P                  R 4      MRp\        V\        4      '       dG   \	        \
        4      ;_uu_ 4        S! VP                  4       P                  4       4      uuRRR4       # \        VS4      '       d   V# R#   + '       g   i     R# ; i)rR  N)r  rÀ  rû   rÝ   r   rò   rO  rµ  )rú  rR  r_  s   & €r[   Ú_reasonÚ0get_plugin_error_classification.<locals>._reasonB  s{   ø€ Ü)3°F¼D×)AÒ)A�—‘˜HÔ%ÀtˆÜ�fœc×"Ò"Üœ*×%Õ%Ù% f§l¡l£n×&:Ñ&:Ó&<Ó=÷ &Ò%ô $ F¨N×;Ò;ˆvÐEÀÐE÷ &Ö%áús   Á$BÂB.	NrR  r  :Niô  NÚerror_contextz‘transform_api_error_classification: skipped %d valid classification(s) after the first result in registration order won (run-all-then-pick-first))Ú	retryableÚshould_compressÚshould_rotate_credentialÚshould_fallback)Úagent.error_classifierr_  rð  r  rÀ  rt   rû   rÝ   rO  rò  r�   ró   )rU  rK  rU  rV  rW  rX  rY  rÄ   rZ  r[  r\  r+  rc  rú  rR  r  Úwinnerrç   r  r_  s   $$$$$$$$$$$        @r[   Úget_plugin_error_classificationrl  %  sD  ø€ õ( 6ÜØ,°xØÀ:Ø#¼jÈÔUY×>ZÒ>Z±
Ð`bØÀØ!ô€L÷Fð Fñ -9Ód©L &ÀwÈvÃÐ=V¸VÔˆfÓ©L€EÐdßÙØ˜1•X�N€FØ&¨Ð/€FÛ^ˆØ�&Ž=Ü˜v c�{Ó+ˆF�3‹Kñ _ð �j‰j˜Ó#€GÜ�'œ3×Ò G§M¡M§O¢OØ#ŸM™M›O¨DÕ1ˆˆyÑÜ�&—*‘*˜_Ó-¬t×4Ò4Ø"(¨Õ"9ˆˆÑÜ
ˆ5ƒz�A„~Ü�‰ð ZÜ[^Ð_dÓ[eÐhiÕ[iô	kà€Mùò! es   ÁEÁEc               ó    € V ^8„  d   QhRRRR/# )rW   rs   rt   rX   rÌ   rY   )rZ   s   "r[   r\   r\   ]  s   € ÷ ñ  dð °}ñ r]   c                ó>   € \        4       pVP                  V R7       V# )zEReturn the global manager after idempotent (or ``force``d) discovery.r©  )rœ  r¼  )rs   rË   s   & r[   rø  rø  ]  s    € ä Ó"€GØ×Ñ EÐÔ*Ø€Nr]   c                 ó*   € \        4       P                  # )z5Return the plugin-registered context engine, or None.)rø  rp  rY   r]   r[   Úget_plugin_context_enginerp  d  s   € ä%Ó'×7Ñ7Ð7r]   c               ó    € V ^8„  d   QhRRRR/# )rW   rå   rÝ   rX   zOptional[Callable]rY   )rZ   s   "r[   r\   r\   i  s   € ÷ /ñ / Sð /Ð-?ñ /r]   c                ón   € \        4       P                  P                  V 4      pV'       d
   VR,          # R# )zFReturn the handler for a plugin-registered slash command, or ``None``.r…   N)rø  r\  rû   )rå   rþ   s   & r[   Úget_plugin_command_handlerrs  i  s-   € ä&Ó(×9Ñ9×=Ñ=¸dÓC€Eß$ˆ5�ÕÐ.¨$Ð.r]   c               ó   € V ^8„  d   QhRR/# )rW   rX   zdict[str, dict]rY   )rZ   s   "r[   r\   r\   o  s   € ÷ 9ñ 9˜_ñ 9r]   c                 ó*   € \        4       P                  # )zYPlugin commands dict (name -> {handler, description, plugin}) after idempotent discovery.)rø  r\  rY   r]   r[   Úget_plugin_commandsrv  o  s   € ä%Ó'×8Ñ8Ð8r]   c               ó   € V ^8„  d   QhRR/# r7  rY   )rZ   s   "r[   r\   r\   t  s   € ÷ Gñ GÐ$8ñ Gr]   c                 óŠ   € \        4       p \        V P                  4       Uu. uF  qP                  V,          NK  	  up# u upi )zXPlugin auxiliary-task registration dicts sorted by ``key`` (after idempotent discovery).)rø  r  rÎ  )rË   r®  s     r[   Úget_plugin_auxiliary_tasksry  t  s;   € ä(Ó*€GÜ+1°'×2DÑ2DÔ+EÓFÑ+E a×Ñ˜q×!Ð!Ñ+EÑFÐFùÒFs   ¢A c               ó   € V ^8„  d   QhRR/# r)  rY   )rZ   s   "r[   r\   r\   z  s   € ÷ ñ ˜[ñ r]   c            	     ó„  € \        4       p V P                  '       g   . #  ^ RIHp / pT P                   FS  pTP                  T4      pT'       g   K  TP                  TP                  . 4      P                  TP                  4       KU  	  / pT P                  P                  4        F`  pTP                   FM  pTP                  T4      pT'       g   K  TP                  T9   g   K1  TP                  TP                  T4       KO  	  Kb  	  . p\        T4       F‘  pTP                  T4      p	T	'       d   T	P                  P                   MR;'       g!    RP#                  \        Y(,          4      4      p
TP                  TRTP%                  RR4      P'                  4        2T
34       K“  	  T#   \         d    . u # i ; i)zUPlugin toolsets as ``(key, label, description)`` tuples for the ``hermes tools`` TUI.rË  rÓ  rç  u   ðŸ”Œ rÏ  rS  )rœ  r×  rÕ  rV  r}  rÖ  rª  r¾  r·  rå   rì   rè  r¾   r  rû   rº   rÆ  rí  rZ  Útitle)rË   rV  Útoolset_toolsr  rþ   Útoolset_pluginrè   rú  rÎ  rH  Údescs              r[   rÍ  rÍ  z  su  € ä Ó"€GØ×%×%Ð%Øˆ	ðÝ+ð
 +-€MØ×/Ô/ˆ	Ø×"Ñ" 9Ó-ˆß‰5Ø×$Ñ$ U§]¡]°BÓ7×>Ñ>¸u¿z¹zÖJñ 0ð /1€NØ×"Ñ"×)Ñ)Ö+ˆØ×0Ô0ˆIØ×&Ñ& yÓ1ˆEß‰u˜Ÿ™¨-Ö7Ø×)Ñ)¨%¯-©-¸Ö@ó 1ñ ,ð
 €FÜ˜Ö'ˆØ×#Ñ# FÓ+ˆß/5�—‘×+Ò+¸2×jÐjÀ$Ç)Á)ÌFÐS`ÕShÓLiÓBjˆØ�‰�v  v§~¡~°c¸3Ó'?×'EÑ'EÓ'GÐ&HÐIÈ4ÐPÖQñ (ð €Møô) ô ØŠ	ðús    F/ Æ/F?Æ>F?rl  >   rˆ  r'  )rë  )z>Tool '{tool_name}' denied: not in this thread's tool whitelist)rÓ  rÓ  rÓ  rÓ  rÓ  N)ÍÚ__conditional_annotations__rn   Ú
__future__r   r˜  Úimportlib.metadatar5  rþ  ry   ra   rl  r¶  r{   rX  ÚtypesÚ
contextlibr   Údataclassesr   r   Ú	functoolsr   r   Úpathlibr   Útypingr	   r
   r   r   r   r   r   r   r   rÔ  r   r   r   Úregistration_lifecycler   rÌ  r   r	  r   Úhermes_cli.middlewarer   Úhermes_cli.plugin_capabilitiesr   Úhermes_cli.relay_plugin_cutoverr   r   Úhermes_cli.plugins_manifestr   r   r   r   r    r!   r"   r#   r$   Úhermes_cli.plugins_discoveryr%   r&   r'   r(   r)   r*   r+   r,   r-   Úhermes_cli.plugins_loaderr.   r/   r0   r1   r2   r3   r4   r5   Úhermes_cli.plugins_dispatchr6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   Úhermes_cli.plugins_ledgerrJ   rK   Úhermes_cli.plugins_registrarsrL   rM   Úhermes_cli.plugins_staterN   rO   rP   rQ   rR   rS   rT   rg   rî  ri   Ú	getLoggerrj   r�   rw   rx   r†   r¶   rÆ   r·   r  r†  rü   r¹   rÉ   rG  Ú_rowÚsetattrrL  rÇ   Úvarsrí   Ú_nameÚ_methodr‰  rI  rR  rÌ   rn  ro  rY  r{  rp  ru  r�  rq  r�  ru  rx  r~  rƒ  r‡  r�  r‘  r”  r—  rœ  r£  r¦  r«  r¬  r¸  r¼  rª  rÄ  r²  rÜ  rä  ré  rì  rð  rô  rù  rü  rÿ  r  r  r  rp  r  r  r  r  r.  r3  r8  r<  rG  r;  rT  rl  rø  rp  rs  rv  ry  rÍ  )r€  s   @r[   Ú<module>rš     s…  øðôõ #ã Û Û Û Û 	Û Û 	Û 
Û Û Ý ß (ß ,Ý ß R× RÕ Rç VÑ VÝ :Ý !Ý 2Ý 2Ý Dß ^÷÷ õ ÷
÷ õ ÷
÷ ó ÷÷ ÷ ÷ ÷ ó ÷ Lß X÷÷ ñ õ>ôi˜oô ið 
×	Ò	˜8Ó	$€ñ !Ð!7Ó8€Ø Ð ÷Xñ" Ô ð_Øð_Ø%ð_Ø'Bð_ØD[ð_ð ð_ð +ð_ð -<ð_ð ð_ð )ð_ð +:ð_ð <Pð_ð ð_ð $ð_ð &8ð_ð :Mð_ð ð_ð 0ð_ð. )ð/_ð. +=ð/_ð. ?Oð/_ð0 ð1_ð0 .ð1_ð0 0Cð1_ð4 ð5_ð4 +ð5_ð4 -<ð5_ð< ð=_ð< 5ð=_ðD ðE_ðL ðM_ðL 5ðM_ðL 7OðM_ðL QjðM_ðX ðY_ð` ða_ðj ðk_ðj 3ðk_ðj 5Jðk_ðF ðG_ðF !:ðG_ðF <ZðG_ðH ðI_ðH 8ðI_ðl ðm_ðz ð{_ð| ð}_€ˆXó _ðF &JÐ$JÐ ˜Ó Jà€Ù	‹€ð ÷ð ó ð÷ZYñ ZYòB+ó. (€DÙˆM˜4 �7Ñ$CÀTÑ$JÖKñ (àòñ& ™4 Ó.×4Ò4Ó6Ö7�N€Eˆ7Ù�×Ô˜e×.Ò.¨{×;Ò;¸uÐHbÖ?bÙ�˜uÑ&BÀ7Ó&KÖLñ 8ð 
ˆ7õô8o6Ð%Ð':Ð<Mô o6ðl ,0€Ð(Ó /ð
 79Ð Ð3Ó 8Ø!Ÿ›Ó)Ð ð GKÐ #Ð%CÓ JØ(Ÿ~›~Ó/Ð ð
 CGÐ Ð!?Ó FØ$Ÿ>›>Ó+Ð õ.õ:õ õBõ:õ8õ	:õ2õ-õõ,Lõ8@÷8ð <@Ð Ð8Ó ?Ø&Ÿ^›^Ó-Ð õ-÷6õDõIõõ"mõ[õ
õ"@õGõTõ
Aõ?õ3õ?ð
Nà!%ðNàAE÷Nð. #Ÿ›Ó*Ð ñ �$Ô÷3ð 3ó ð3÷.õ*÷4>õn-õ5õLðØFHðØ^`ðà÷õ@.ðØðØ-/ðØ>@ðØQVðàðà,.ðàUY÷ð*5Øð5Ø(*ð5ØIMð5Øacð5àð5à/1ð5àZ^ð5ð &*ð5ð ABð5ð Z[ð5ð ÷	5÷pò8õ
/õ9õ
G÷r]   