+
    lHàjFÓ  ã                   ó.  a € RL tO0 t R 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 ^ RIHt ^ RIHt ^ RIHtHtHtHtHt ^ RIHtHt ]P8                  ! ]4      t]! RRR	7      t]R
 4       t R t!R t"Rt#Rt$Rt%R R lt&R R lt'R R lt(R R lt)R R lt*RMR R llt+R R lt,R R lt-R  R! lt.]! R"R#R$7       ! R% R&4      4       t/ ! R' R(4      t0R)t1R*t2R+t3R,t4/ t5] ^ k / t6] ^k ]7! 4       t8] ^k ]7! 4       t9] ^k ]	Pt                  ! 4       t;R-t<]7! 4       t=] ^k RNt>R. R/ lt?R0 R1 lt@R2 R3 ltAR4 R5 ltBR6 R7 ltCR8 R9 ltDR: R; ltER< R= ltFR> R? ltGR@ RA ltH ! RB RC4      tIRD RE ltJ]I! 4       tKRF RG ltLRMRH RI lltMRJ RK ltNR# )Oa¹  Central registry for all hermes-agent tools: each tool file calls ``registry.register()``
at import to declare schema, handler, toolset membership and availability check;
``model_tools.py`` queries the registry instead of keeping parallel data structures.
Cycle-safe import chain: this module imports nothing from model_tools or tool files;
tools/*.py import it at module level; model_tools.py imports both; run_agent/cli import
model_tools.N)Ú	dataclass)Úcontextmanager)Ú
ContextVar)ÚPath)ÚCallableÚDictÚListÚOptionalÚSet)Úhermes_home_keyÚnormalize_scopeÚsession_tool_scope)Údefaultc              #  ó    "  € \         P                  V 4      p Rx € \         P                  V4       R#   \         P                  T4       i ; i5i)zCExecution-owned overlay, additive to the existing profile registry.N)Ú_session_tool_scopeÚsetÚreset)ÚscopeÚtokens   & Ú3/home/ubuntu/.hermes/hermes-agent/tools/registry.pyr   r      s<   é € ô  ×#Ñ# EÓ*€Eð)Ûä×!Ñ! %Ö(øÔ×!Ñ! %Õ(üs   ‚A™4 �A´AÁAc                  ó*   € \         P                  4       # ©N)r   Úget© ó    r   Úcurrent_session_tool_scoper   (   s   € Ü×"Ñ"Ó$Ð$r   c                 ó<   € \        \        P                  4       4      # )z´The overlay slot key for the current session scope: writes go through ``normalize_scope``
(``register``/``deregister``), so reads must key the same way or the overlay is invisible.)r   r   r   r   r   r   Ú_session_slot_keyr   ,   s   € ô Ô.×2Ñ2Ó4Ó5Ð5r   i   u   â€¦ [truncated]i    c                ó0   € V ^8„  d   QhR\         R\         /# )é   ÚtextÚreturn©Ústr)Úformats   "r   Ú__annotate__r%   9   s   € ÷ Hñ HœCð H¤Cñ Hr   c                ó¤   € \        V 4      \        8:  d   V # \        P                  R\        V 4      V R\         4       V R\         \
        ,           # )zJBound an error body destined for model context; logs keep a longer prefix.z4tool error body truncated for context (%d chars): %sN)ÚlenÚ_MAX_TOOL_ERROR_CHARSÚloggerÚdebugÚ_MAX_LOGGED_ERROR_CHARSÚ_TOOL_ERROR_TRUNCATION_MARKER)r    s   &r   Ú_bound_error_textr-   9   sL   € ä
ˆ4ƒyÔ)Ô)ØˆÜ
‡L�LØ>ÜˆD‹	�4Ð0Ô0Ð1ô3ð Ð&Ô&Ð'Ô*GÕGÐGr   c                ó0   € V ^8„  d   QhR\         R\         /# )r   Úresultr!   r"   )r$   s   "r   r%   r%   C   s   € ÷ 3ñ 3¤Sð 3¬Sñ 3r   c                ó†  € \        V 4      \        8:  g   RV 9  d   V #  \        P                  ! V 4      p\        T\        4      '       d   TP                  R4      MRp\        T\        4      '       d   \        T4      \        8:  d   T # \        T4      TR&   \        P                  ! TRR7      #   \         d    T u # i ; i)zêTrim an oversized ``error`` field in a JSON string result: handlers that
``json.dumps({"error": str(exc)})`` directly bypass ``tool_error``'s cap, so this runs
at the dispatch boundary to stop unbounded errors stacking across retries.z"error"ÚerrorNF©Úensure_ascii)r'   r(   ÚjsonÚloadsÚ
ValueErrorÚ
isinstanceÚdictr   r#   r-   Údumps)r/   Úpayloadr1   s   &  r   Ú_bound_json_error_resultr;   C   s¢   € ô ˆ6ƒ{Ô+Ô+¨yÀÔ/FØˆðÜ—*’*˜VÓ$ˆô %/¨w¼×$=Ò$=ˆG�K‰K˜Ô À4€EÜ�eœS×!Ò!¤S¨£ZÔ3HÔ%HØˆÜ(¨Ó/€GˆGÑÜ�:Š:�g¨EÔ2Ð2øô ô ØŠðús   ŸB0 Â0C Â?C c                óD   € V ^8„  d   QhR\         P                  R\        /# )r   Únoder!   )ÚastÚASTÚbool)r$   s   "r   r%   r%   T   s"   € ÷ Nñ N¤S§W¡Wð N´ñ Nr   c                óÂ  € \        V \        P                  4      '       d+   \        V P                  \        P                  4      '       g   R# V P                  P
                  p\        V\        P                  4      ;'       d]    VP                  R8H  ;'       dF    \        VP                  \        P                  4      ;'       d    VP                  P                  R8H  # )zATrue when *node* is a ``registry.register(...)`` call expression.FÚregisterÚregistry)
r7   r>   ÚExprÚvalueÚCallÚfuncÚ	AttributeÚattrÚNameÚid)r=   rG   s   & r   Ú_is_registry_register_callrL   T   sœ   € ä�dœCŸH™H×%Ò%¬Z¸¿
¹
ÄCÇHÁH×-MÒ-MÙØ�:‰:�?‰?€Dä�4œŸ™Ó'÷ 	Mð 	M¨D¯I©I¸Ñ,C÷ 	Mð 	MÜ�t—z‘z¤3§8¡8Ó,÷	Mð 	MØ15·±·±À*Ñ1LðNr   c                ó0   € V ^8„  d   QhR\         R\        /# )r   Úmodule_pathr!   )r   r@   )r$   s   "r   r%   r%   ^   s   € ÷ ñ ¬ð ´$ñ r   c                óJ  €  V P                  RR7      pRV9  g   RV9  d   R# \        P                  ! V\        V 4      R7      p\        ;QJ d&    R TP                   4       F  '       g   K   R# 	  R# ! R TP                   4       4      #   \        \
        3 d     R# i ; i)	zôTrue when the module body (or a module-level ``for``) calls ``registry.register(...)``.
Only module-body statements count, so helpers registering inside a function are skipped;
a text prefilter avoids ``ast.parse`` for files lacking both words.ú	utf-8-sig©ÚencodingrC   rB   F)Úfilenamec              3   ó  "  € T F‚  p\        V4      ;'       gk    \        V\        P                  4      ;'       dI    \        ;QJ d&    R  VP
                   4       F  '       g   K   RM	  RM! R  VP
                   4       4      x € K„  	  R# 5i)c              3   ó8   "  € T F  p\        V4      x € K  	  R # 5ir   )rL   )Ú.0Úss   & r   Ú	<genexpr>Ú4_module_registers_tools.<locals>.<genexpr>.<genexpr>l   s   é € Ð-_ÑU^ÐPQÔ.HÈ×.KÐ.KÓU^ùó   ‚TFN)rL   r7   r>   ÚForÚanyÚbody)rV   Ústmts   & r   rX   Ú*_module_registers_tools.<locals>.<genexpr>j   so   é € ð ñ ˆDô 	# 4Ó(÷ 	að 	aÜ�tœSŸW™WÓ%×_Ð_¯#«#Ñ-_ÐUY×U^ÒU^Ó-_¯#¯#ª#Ñ-_ÐUY×U^ÒU^Ó-_Ó*_ô	aãùs   ‚B™!B»BÁBÁ%'BT)Ú	read_textr>   Úparser#   ÚOSErrorÚSyntaxErrorr\   r]   )rN   ÚsourceÚtrees   &  r   Ú_module_registers_toolsrf   ^   s£   € ðØ×&Ñ&°Ð&Ó<ˆØ˜VÔ# z¸Ô'?ÙÜ�yŠy˜¬#¨kÓ*:Ô;ˆ÷ ‹3ñ ð —I’Ió�3Œ3ð Š3ð ˆ3ñ ð —I’Ióó ð øô ”[Ð!ô Úðús   ‚ B ¤!B ÂB"Â!B"c                óF   € V ^8„  d   QhR\         R\        \         ,          /# )r   Ú
tools_pathr!   )r   Úlist)r$   s   "r   r%   r%   p   s   € ÷ ñ ¬ð ´´dµñ r   c                óŠ   € \        V P                  R4      4      \        V P                  R4      4      ,           p\        V4      # )a\  Flat ``tools/*.py`` modules plus the package entry point ``tools/<pkg>/tool.py``, in one
sorted list. Only ``tool.py`` is scanned in a package, so every other file in it is a library
by construction. Sorted after merging: ``register()`` lets a same-name, same-toolset duplicate
overwrite silently, so the import order must not depend on file depth.z*.pyz	*/tool.py)ri   ÚglobÚsorted)rh   Ú
candidatess   & r   Ú_tool_module_candidatesrn   p   s5   € ô
 �j—o‘o fÓ-Ó.´°j·o±oÀkÓ6RÓ1SÕS€JÜ�*ÓÐr   c                ó\   € V ^8„  d   QhR\         \        ,          R\        \        ,          /# )r   Ú	tools_dirr!   )r	   r   ri   r#   )r$   s   "r   r%   r%   y   s"   € ÷ 6ñ 6¤h¬t¥nð 6ÄÄSÅ	ñ 6r   c                ó¾  € ^ RI Hp V! 4       '       d&   . ROpV F  p\        P                  ! V4       K  	  V# V e   \	        V 4      M&\	        \
        4      P                  4       P                  P                  4       p\        4       p/ pRp. p\        V4       EFž  pVP                  R9   d   K  VP                  V4      P                  R4      P                  p	\        V	4      ^8”  dT   VP                  R,          P                  4       '       g-   \         P#                  RWˆP                  P                  4       K¤  \%        VP                  4       4      p
 VP'                  4       pVP(                  VP*                  3pTP/                  T
4      p\1        T\2        \4        34      '       d;   \        T4      ^8X  d+   \5        TR,          4      T8X  d   \7        T^,          4      pM\9        T4      pRpT^ ,          T^,          T.Yj&   T'       g   EKz  TP;                  R	P=                  R
.T	O54      4       EK¡  	  V'       g   \?        V4      \?        V4      8w  d   \A        V4       . pV F+  p \        P                  ! V4       VP;                  V4       K-  	  V#   \,         d     EK  i ; i  \B         d#   p\         P#                  RTT4        Rp?Kl  Rp?ii ; i)a?  Import built-in self-registering tool modules and return their module names. The
per-file AST scan costs ~145 ms over ~100 files, so verdicts are memoized on disk keyed
by ``(mtime_ns, size)``; a mismatch or corrupt cache re-scans that file. The write is
best-effort and atomic, so concurrent processes race harmlessly.)Úsafe_worker_enabledNFú__init__.pyÚ z*Skipping %s: package %s has no __init__.pyºNr   NTÚ.Útoolsz#Could not import tool module %s: %s)ztools.file_toolsztools.terminal_toolztools.process_registry>   rs   úmcp_tool.pyúregistry.py)"Úagent.safe_worker_policyrr   Ú	importlibÚimport_moduler   Ú__file__ÚresolveÚparentÚ_load_discovery_cachern   ÚnameÚrelative_toÚwith_suffixÚpartsr'   Úexistsr)   Úwarningr#   ÚstatÚst_mtime_nsÚst_sizerb   r   r7   ri   Útupler@   rf   ÚappendÚjoinr   Ú_save_discovery_cacheÚ	Exception)rp   rr   Úmodule_namesÚmodule_namerh   ÚcacheÚfresh_cacheÚcache_dirtyÚpathÚ	rel_partsÚabs_pathÚstÚstat_keyÚcachedÚ	registersÚimportedÚmod_nameÚes   &                 r   Údiscover_builtin_toolsrž   y   sO  € õ
 =Ù×Òò ]ˆÛ'ˆKÜ×#Ò# KÖ0ñ (àÐØ%.Ò%:”$�y”/ÄÄXÃ×@VÑ@VÓ@X×@_Ñ@_×hÑhÓj€JÜ!Ó#€EØ#%€KØ€KØ €LÜ'¨
×3ˆØ�9‰9ÐEÔEÙØ×$Ñ$ ZÓ0×<Ñ<¸RÓ@×FÑFˆ	Üˆy‹>˜AÔ t§{¡{°]Õ'B×&JÑ&J×&LÒ&Lô �N‰NÐGÈÏ{É{×O_ÑO_Ô`ÙÜ�t—|‘|“~Ó&ˆð	Ø—‘“ˆBØŸ™¨¯
©
Ð3ˆHð —‘˜8Ó$ˆÜ�fœt¤U˜m×,Ò,´°V³ÀÔ1AÄeÈFÐSUÍJÓFWÐ[cÔFcÜ˜V A�Y›‰Iä/°Ó5ˆIØˆKØ!)¨!¥¨h°q­k¸9Ð EˆÑßŠ9Ø×Ñ §¡¨'Ð)>°IÑ)>Ó ?×@ñ/ 4÷4 ”c˜+Ó&¬#¨e«*Ô4Ü˜kÔ*Ø€HÛ ˆð	OÜ×#Ò# HÔ-Ø�O‰O˜HÖ%ñ !ð €Oøô- ô 	Ûð	ûô( ô 	OÜ�N‰NÐ@À(ÈA×NÒNûð	Oús*   Å(JÉ/'J/ÊJ,Ê+J,Ê/KÊ:KËKc                ó:   € V ^8„  d   QhR\         \        ,          /# ©r   r!   )r	   r   )r$   s   "r   r%   r%   ²   s   € ÷ ñ œx¬�~ñ r   c                 óp   €  ^ RI Hp  \        V ! 4       4      R,          R,          #   \         d     R# i ; i)zBPath of the tool-discovery verdict cache, or None if unresolvable.©Úget_hermes_homer‘   ztool_discovery_cache.jsonN)Úhermes_constantsr£   r   rŽ   r¢   s    r   Ú_discovery_cache_pathr¥   ²   s5   € ðå4Ü‘OÓ%Ó&¨Õ0Ð3NÕNÐNøÜô Úðús   ‚#& ¦5´5c                óF   € V ^8„  d   QhR\         \        \        3,          /# r    ©r8   r#   ri   )r$   s   "r   r%   r%   ¼   s   € ÷ 
ñ 
œt¤C¬ I�ñ 
r   c                 ó  € \        4       p V f   / #  \        V RRR7      ;_uu_ 4       p\        P                  ! V4      pRRR4       \	        X\
        4      '       d   V# / #   + '       g   i     L*; i  \        \        3 d    / u # i ; i)u?   Read the discovery cache; any error â†’ empty dict (full scan).NÚrrP   rQ   )r¥   Úopenr4   Úloadr7   r8   rb   r6   )r”   ÚfhÚdatas      r   r€   r€   ¼   sv   € ä Ó"€DØ‚|Øˆ	ðÜ�$˜ k×2Õ2°bÜ—9’9˜R“=ˆD÷ 3ä! $¬×-Ò-ˆtÐ5°2Ð5÷ 3×2ûô ”ZÐ ô ØŠ	ðús-   ’A4 ¨A!¿A4 ÁA4 Á!A1	Á,A4 Á4B
Â	B
c                óJ   € V ^8„  d   QhR\         \        \        3,          RR/# )r   r‘   r!   Nr§   )r$   s   "r   r%   r%   É   s&   € ÷ Mñ M¤¤c¬4 i¥ð M°Tñ Mr   c                óÖ   € \        4       pVf   R#  ^ RIHp ^ RIHp V! VP
                  4       V! W^ R7       R#   \         d"   p\        P                  RY4        Rp?R# Rp?ii ; i)z>Best-effort atomic write of the discovery cache. Never raises.N)Úatomic_json_write)Úmkdir_under_hermes_home)Úindentz+Could not write tool discovery cache %s: %s)	r¥   Úutilsr°   r¤   r±   r   rŽ   r)   r*   )r‘   r”   r°   r±   r�   s   &    r   r�   r�   É   sX   € ä Ó"€DØ‚|ÙðMÝ+Ý<Ù §¡Ô,Ù˜$¨a×0øÜô MÜ�‰ÐBÀD×LÒLûðMús   ’(< ¼A(ÁA#Á#A(FT)ÚeqÚslotsc                   ó<   a € ] tR t^×t o RtRtRtRtV 3R ltRt	V t
R# )Ú	ToolEntryzXMetadata for one registered tool (identity semantics: restore/CAS paths compare ``is``).Nc                óö   <€ V ^8„  d   Qh/ S[ ;R&   S[ ;R&   S[;R&   S[;R&   S[S[,          ;R&   S[;R&   S[;R&   S[ ;R&   S[ ;R	&   S[S[,          R
,          ;R&   S[S[,          ;R&   S[R
,          ;R&   # )r   r�   ÚtoolsetÚschemaÚhandlerÚcheck_fnÚrequires_envÚis_asyncÚdescriptionÚemojiNÚmax_result_size_charsÚdynamic_schema_overridesÚexecution_timeout)r#   r8   r   r	   ri   r@   ÚintÚfloat)r$   Ú__classdict__s   "€r   r%   ÚToolEntry.__annotate__×   s³   ø‡ ‚ ñ �Iñ	 ñ
 �Lñ ñ �Lñ ñ Ññ ñ ‘xÕ Ñ ñ ñ Ññ ñ �Nñ ñ Ññ ñ �Jñ ñ ¡�;¨Õ-Ñ4ñ ñ  '¡xÕ0Ñ7ñ! ñ" ˜t•|Ñ*ò# r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rÁ   rÂ   rÃ   Ú__annotate_func__Ú__static_attributes__Ú__classdictcell__©rÆ   s   @r   r·   r·   ×   s%   ø‡ € ábð 15Ðð 48ÐØ&*Ð÷# ƒ r   r·   c                   ó:   a € ] tR t^ët o RtRtV 3R lR ltRtV tR# )Ú_PluginOverridePolicyz@Identity-bearing authorization record for one plugin generation.c                ó$   <€ V ^8„  d   QhRS[ RR/# )r   Úallowedr!   N©r@   )r$   rÆ   s   "€r   r%   Ú"_PluginOverridePolicy.__annotate__ð   s   ø€ ÷ %ñ %¡ð %¨ñ %r   c                ó&   € \        V4      V n        R # r   )r@   rÔ   )ÚselfrÔ   s   &&r   Ú__init__Ú_PluginOverridePolicy.__init__ð   s   € Ü˜G“}ˆŽr   )rÔ   N)	rÈ   rÉ   rÊ   rË   rÌ   Ú	__slots__rÙ   rÎ   rÏ   rÐ   s   @r   rÒ   rÒ   ë   s   ø‡ € ÙJà€I÷%ö %r   rÒ   zmPlugin module {owner!r} cannot override built-in tool {name!r} without operator opt-in (allow_tool_override).g      >@g      N@i   rt   c                ó0   € V ^8„  d   QhR\         R\         /# ©r   Úfnr!   )r   )r$   s   "r   r%   r%     s   € ÷ ñ œ(ð ¤xñ r   c                ó0   € \         P                  V 4       V # )z;Mark a local, config-backed availability check as uncached.)Ú_NO_CACHE_CHECK_FNSÚadd©rÞ   s   &r   Úno_cache_check_fnrã     s   € ä×Ñ˜BÔØ€Ir   c                ó0   € V ^8„  d   QhR\         R\        /# rÝ   )r   Úobject)r$   s   "r   r%   r%     s   € ÷ +ñ +”(ð +œvñ +r   c                 ó   € \        V R V 4      # )rÊ   )Úgetattrrâ   s   &r   Ú	_fn_labelrè     s   € Ü�2�~ rÓ*Ð*r   c                ó(   € V ^8„  d   QhR\         RR/# )r   Únowr!   N)rÅ   )r$   s   "r   r%   r%     s   € ÷ 	)ñ 	)¤ð 	)¨$ñ 	)r   c                óV  € \         \        R 3\        \        R 33 Fˆ  w  rp\	        VP                  4       4       F,  w  rEW! V4      ,
          V8¼  g   K  VP                  VR4       K.  	  \        V4      \        8¼  g   Ke  VP                  \        \        V4      4      4       K;  	  R# )zUExpire stale entries and cap profile-dimensional cache growth. Caller holds the lock.c                 ó   € V ^ ,          # ©é    r   ©Úvs   &r   Ú<lambda>Ú(_prune_check_fn_caches.<locals>.<lambda>!  s   € ¸1¸Q¾4r   c                 ó   € V # r   r   rï   s   &r   rñ   rò   "  s   € Ér   N)Ú_check_fn_cacheÚ_CHECK_FN_TTL_SECONDSÚ_check_fn_last_goodÚ_CHECK_FN_FAILURE_GRACE_SECONDSri   ÚitemsÚpopr'   Ú_CHECK_FN_CACHE_MAXÚnextÚiter)rê   r‘   ÚttlÚstampÚkeyrE   s   &     r   Ú_prune_check_fn_cachesr     s‰   € ô 
Ô/±Ð@Ü	Ô=¹{ÐKóMÑˆ�Eô ˜uŸ{™{›}Ö-‰JˆCØ�U˜5“\Õ! SÖ(Ø—	‘	˜#˜tÖ$ñ .ô �%‹jÔ/Ö/Ø�I‰I”dœ4 ›;Ó'Ö(óMr   c                ó:   € V ^8„  d   QhR\         \        ,          /# r    )r	   r#   )r$   s   "r   r%   r%   *  s   € ÷ %ñ %œh¤s�mñ %r   c                 óæ  a€  ^ RI Ho \        ;QJ d#    V3R l\         4       F  '       d   K   RM	  RM! V3R l\         4       4      '       d   ^ RIHp  V ! 4       '       d   \        #  ^ RIH	p ^ RI
Hp T! 4       '       g   R# T! 4       pT'       d1   \        \        T4      P                  4       P                  4       4      # \        #   \         d     Lni ; i  \         d
    \        u # i ; i)	uõ  Return the active profile key when availability is profile-scoped. Browser-controller
availability is request-bound (changes on every attach/detach), so a fully bound
browser-control request bypasses this cache AND model_tools' outer definition cache (same
sentinel) â€” one Browser session's live tools must not leak into another. Single-profile
processes keep the process-wide cache; a multiplex gateway installs a Hermes-home override
per profile turn, so the canonical profile key is the boundary.)Úget_session_envc              3   óx   <"  € T F/  p\        S! VR 4      ;'       g    R 4      P                  4       x € K1  	  R# 5i)rt   N)r#   Ústrip)rV   Úkr  s   & €r   rX   Ú'check_fn_cache_scope.<locals>.<genexpr>3  s3   øé € ÐYÑBX¸QŒs‘? 1 bÓ)×/Ð/¨RÓ0×6Ñ6×8Ð8ÓBXùs   ƒ:�:FT)Úbrowser_control_enabled)Úserves_routed_profile)Úget_hermes_home_overrideN)Úgateway.session_contextr  ÚallÚ_BROWSER_IDENTITY_KEYSÚgateway.browser_control_brokerr  ÚCHECK_FN_CACHE_BYPASSrŽ   Úagent.secret_scoper	  r¤   r
  r#   r   Ú
expanduserr~   )r  r	  r
  Úoverrider  s       @r   Úcheck_fn_cache_scoper  *  s·   ø€ ð
Ý;ß‹3ÔYÕBXÓY�3�3Š3ÔYÕBXÓY×YÒYõ OÙ&×(Ò(Ü,Ð,ð
%Ý<Ý=Ù$×&Ò&ÙÙ+Ó-ˆß=EŒs”4˜“>×,Ñ,Ó.×6Ñ6Ó8Ó9Ð`ÔK`Ð`øô ô Ùðûô ô %ô %Ò$ð%úsK   ƒC ”C ¯!C ÁC Á$C Á+C ÂC Â/C ÃC ÃCÃCÃC0Ã/C0c                ó0   € V ^8„  d   QhR\         R\        /# rÝ   ©r   r@   )r$   s   "r   r%   r%   I  s   € ÷ ñ œxð ¬Dñ r   c                óD  € ^ RI HpHp  \        V ! 4       4      #   T dQ    T! 4       f#   \        P                  R\        T 4      4        R# \        P                  R\        T 4      RR7        R# \         d&    \        P                  R\        T 4      RR7        R# i ; i)z7Run an availability check without cache/grace handling.)ÚUnscopedSecretErrorÚcurrent_secret_scopez…check_fn %s hit the multiplex fail-closed path with no profile secret scope active; dependent tools re-probe on the first scoped turnz€check_fn %s raised UnscopedSecretError while the profile cache scope was resolved; dependent tools will be unavailable this turnT©Úexc_infozAcheck_fn %s raised; dependent tools will be unavailable this turnF)	r  r  r  r@   r)   r*   rè   r†   rŽ   )rÞ   r  r  s   &  r   Ú_run_check_fn_uncachedr  I  s£   € çLð*Ü‘B“D‹zÐøØô .ñ  Ó!Ò)ô �L‰Lðaä˜"“õñ ô �N‰NðTä˜"“¨ð õ .ñ ô	 ô *Ü�‰ØOÜ�b‹M Dð 	õ 	*ñ ð	*ús!   Š š/BÁ!BÁ0BÁ9"BÂBc                ó0   € V ^8„  d   QhR\         R\        /# rÝ   r  )r$   s   "r   r%   r%   h  s   € ÷ <ñ <œð <¤dñ <r   c           
     óþ  € \         P                  ! 4       pV \        9   d   \        V 4      # \	        4       pV\
        8X  d   \        V 4      # W3p\        ;_uu_ 4        \        V4       \        P                  V4      pVe   V^,          uuRRR4       #  RRR4       Rp \        V ! 4       4      RrvV'       g   \        \        V 4      4      M. p	\        ;_uu_ 4        \        V4       V'       d5   V\        V&   \        P!                  V4       VR3\        V&    RRR4       R# \        P                  V4      p
V
eB   W,
          \"        8  d1   \$        P'                  R\)        V 4      V\"        4        RRR4       R# V	'       d_   V\        9   dT   V\*        9  dI   \*        P!                  V4       \$        P'                  R\)        V 4      VRP-                  V	4      VR	7       M=V'       d   \$        P&                  M\$        P.                  pV! R
\)        V 4      VVR	7       VR3\        V&    RRR4       R#   + '       g   i     EL¬; i  \         d   pRRTrWp Rp?EL±Rp?ii ; i  + '       g   i     R# ; i)z+Return bool(fn()), TTL-cached across calls.Nzreturned FalseFÚraisedTzicheck_fn %s failed (%s) within %.0fs of last success; treating as transient and keeping tool(s) availablez–check_fn %s %s; previously available core tool(s) %s dropped (non-deferrable, so not searchable either); dependent tools will be unavailable this turnz, r  z=check_fn %s %s; dependent tools will be unavailable this turn)ÚtimeÚ	monotonicrà   r  r  r  Ú_check_fn_cache_lockr   rô   r   r@   rŽ   rl   Ú_core_tools_gated_byrö   Ú_check_fn_ever_goodrá   r÷   r)   r†   rè   Ú_check_fn_core_drop_warnedrŒ   Úinfo)rÞ   rê   r   Ú	cache_keyr™   r  rE   ÚoutcomeÚexcÚcore_droppedÚ	last_goodÚlogs   &           r   Ú_check_fn_cachedr,  h  s  € ä
�.Š.Ó
€CØ	Ô Ô Ü% bÓ)Ð)Ü Ó"€EØÔ%Ô%Ü% bÓ)Ð)Ø�€Iß	Ö	Ü˜sÔ#Ü ×$Ñ$ YÓ/ˆØÒØ˜!•9÷	 
Ò	ð ÷ 
ð
 €Hð8Ü™b›d›Ð%5ˆw÷ <A”6Ô.¨rÓ2Ô3Àb€Lß	Ö	Ü˜sÔ#ßØ-0Ô 	Ñ*Ü×#Ñ# IÔ.Ø*-¨t¨ŒO˜IÑ&Ø÷ 
Ñ	ô (×+Ñ+¨IÓ6ˆ	ØÒ  S¥_Ô7VÔ%Vä�N‰NðFä˜"“˜wÔ(GôIð ÷ 
Ñ	÷0 ˜IÔ)<Ô<ÀÔRlÔAlÜ&×*Ñ*¨9Ô5Ü�N‰Nð[ä˜"“˜w¨¯	©	°,Ó(?È(ð õ T÷
 %-”&—.’.´&·+±+ˆCÙØOÔQZÐ[]ÓQ^Ð`gØ!õ#ð '*¨5 \Œ˜	Ñ"Ø÷I 
Ñ	÷ 
×	Ð	ûô ô 8ð $)¨(°C˜ˆ�ûð	8ú÷ 
×	Ð	úsK   Á-H9Â!I Ã>I+Ä&AI+Æ I+ÆA%I+Ç.AI+È9I
	ÉI(ÉI#É#I(É+I<	c                óF   € V ^8„  d   QhR\         R\        \        ,          /# rÝ   )r   r   r#   )r$   s   "r   r%   r%   §  s"   € ÷ añ aœXð a¬#¬c­(ñ ar   c                ó
  €  ^ RI Hp \        V4      p\
        P                  4        Uu0 uF3  q3P                  T J g   K  TP                  T9   g   K'  TP                  kK5  	  up#   \         d    \	        4       u # i ; iu upi )zNNames of ``_HERMES_CORE_TOOLS`` members whose registered ``check_fn`` is *fn*.)Ú_HERMES_CORE_TOOLS)	Útoolsetsr/  Ú	frozensetrŽ   r   rC   Ú_snapshot_entriesr¼   r�   )rÞ   r/  Úcorer�   s   &   r   r"  r"  §  sq   € ðÝ/ÜÐ+Ó,ˆô %×6Ñ6Ô8Ó`Ñ8�q¿J¹JÈ"Ð<LŒFÐQR×QWÑQWÐ[_ÑQ_ŒFˆA�FŒFÑ8Ñ`Ð`øô ô Ü‹uŠðüâ`s!   ‚A% ©B ¿B ÁB Á%A=Á<A=c                ó^   € V ^8„  d   QhR\         R\        \         \        3,          R\        /# )r   rÞ   Úmemor!   )r   r8   r@   )r$   s   "r   r%   r%   ±  s*   € ÷ ñ ”Hð ¤D¬´4¨Õ$8ð ¼Tñ r   c                ó8   € W9  d   \        V 4      W&   W,          # )zGPer-pass memo on top of the TTL cache: one probe per distinct check_fn.)r,  )rÞ   r5  s   &&r   Ú_memo_checkr7  ±  s   € à	„~Ü# BÓ'ˆ‰Ø�8€Or   c                ó   € V ^8„  d   QhRR/# )r   r!   Nr   )r$   s   "r   r%   r%   ¸  s   € ÷ +ñ + 4ñ +r   c                 óü   € \         ;_uu_ 4        \        P                  4        \        P                  4        \        P                  4        \
        P                  4        RRR4       R#   + '       g   i     R# ; i)zYDrop all cached ``check_fn`` results (after config changes like ``hermes tools enable``).N)r!  rô   Úclearrö   r#  r$  r   r   r   Úinvalidate_check_fn_cacher;  ¸  sG   € ç	Ö	Ü×ÑÔÜ×!Ñ!Ô#Ü×!Ñ!Ô#Ü"×(Ñ(Ô*÷	 
×	×	Ò	ús   �AA*Á*A;	c                óF   € V ^8„  d   QhR\         R\        \        ,          /# rÝ   )r   r	   r@   )r$   s   "r   r%   r%   Á  s"   € ÷ 
añ 
a¤8ð 
a´¼µñ 
ar   c                ó(  € \         P                  ! 4       p\        4       pV\        8X  d   R# \        ;_uu_ 4        \
        P                  W34      pRRR4       Xe"   W^ ,          ,
          \        8  d
   V^,          # R#   + '       g   i     L7; i)z¥Cached verdict for *fn* if its TTL is still valid, else None. NEVER runs the probe:
for read-only surfaces (dashboard panels) that must not do network/auth/SDK work.N)r  r   r  r  r!  rô   r   rõ   )rÞ   rê   r   r™   s   &   r   Úget_cached_check_fn_resultr>  Á  sm   € ô �.Š.Ó
€CÜ Ó"€EØÔ%Ô%áß	Ö	Ü ×$Ñ$ b [Ó1ˆ÷ 
àÒ*¨s¸AµY­ÔAVÔ/Vˆ6�!�9Ð`Ð\`Ð`÷ 
×	ús   »BÂB	c                   ó(  a € ] tR tRt o RtR t]V 3R lR l4       t]V 3R lR l4       tRR	/V 3R
 lR llt	V 3R lR lt
RkV 3R lR lltV 3R lR ltRkV 3R lR lltV 3R lR ltV 3R lR ltRR/V 3R lR lltRR/V 3R lR lltRR/V 3R  lR! lltV 3R" lR# ltV 3R$ lR% ltV 3R& lR' ltV 3R( lR) ltV 3R* lR+ ltV 3R, lR- ltRR/V 3R. lR/ lltRR/V 3R0 lR1 lltRR/V 3R2 lR3 lltV 3R4 lR5 ltV 3R6 lR7 lt]V 3R8 lR9 l4       tV 3R: lR; ltV 3R< lR= lt V 3R> lR? lt!V 3R@ lRA lt"]V 3RB lRC l4       t#RlV 3RD lRE llt$RR/V 3RF lRG llt%V 3RH lRI lt&RR/V 3RJ lRK llt'RmV 3RL lRM llt(]V 3RN lRO l4       t)RR/V 3RP lRQ llt*V 3RR lRS lt+RkV 3RT lRU llt,V 3RV lRW lt-V 3RX lRY lt.V 3RZ lR[ lt/RnV 3R\ lR] llt0V 3R^ lR_ lt1V 3R` lRa lt2V 3Rb lRc lt3V 3Rd lRe lt4V 3Rf lRg lt5RmV 3Rh lRi llt6Rjt7V t8R# )oÚToolRegistryiÎ  zISingleton registry that collects tool schemas + handlers from tool files.c                óœ   € / V n         / V n        / V n        / V n        / V n        / V n        \        P                  ! 4       V n        ^ V n	        R# )rî   N)
Ú_toolsÚ_scoped_toolsÚ_plugin_override_policyÚ_plugin_module_scopesÚ_toolset_checksÚ_toolset_aliasesÚ	threadingÚRLockÚ_lockÚ_generation©rØ   s   &r   rÙ   ÚToolRegistry.__init__Ñ  sK   € Ø,.ˆŒà>@ˆÔð `bˆÔ$ØDFˆÔ"Ø46ˆÔØ02ˆÔä—_’_Ó&ˆŒ
à !ˆÖr   c                ó    <€ V ^8„  d   QhRS[ /# r    r"   )r$   rÆ   s   "€r   r%   ÚToolRegistry.__annotate__â  s   ø€ ÷ !ñ !™sñ !r   c                 ó   € \        4       # r   )r   r   r   r   Úcurrent_scope_keyÚToolRegistry.current_scope_keyá  s   € äÓ Ð r   c                ó\   <€ V ^8„  d   QhRS[ S[,          RS[S[S[ S[,          3,          /# ©r   Úentriesr!   )ri   r·   r8   r#   )r$   rÆ   s   "€r   r%   rO  æ  s-   ø€ ÷ ñ ™$™y�/ð ©d±3¹¹Y½Ð3GÕ.Hñ r   c                ór   € / pV  F.  pVP                  VP                  . 4      P                  V4       K0  	  V# )z1``{toolset: entries}`` in first-appearance order.)Ú
setdefaultr¹   r‹   )rU  ÚgroupsÚentrys   &  r   Ú_groupedÚToolRegistry._groupedå  s7   € ð .0ˆÛˆEØ×Ñ˜eŸm™m¨RÓ0×7Ñ7¸Ö>ñ àˆr   ÚcreateFc                óR   <€ V ^8„  d   QhRS[ S[,          RS[RS[S[S[3,          /# )r   r   r\  r!   )r	   r#   r@   r8   r·   )r$   rÆ   s   "€r   r%   rO  í  s0   ø€ ÷ 1ñ 1™8¡C�=ð 1±Tð 1ÁdÉ3ÑPYÈ>ÕFZñ 1r   c               ó¸   € \        V4      pVf   V P                  # V'       d   V P                  P                  V/ 4      # V P                  P	                  V/ 4      # )zPThe registration map for *scope*: global when None, else that profile's overlay.)r   rB  rC  rW  r   )rØ   r   r\  s   &&$r   Ú_slotÚToolRegistry._slotí  sP   € ä Ó&ˆØŠ=Ø—;‘;ÐßØ×%Ñ%×0Ñ0°¸Ó;Ð;Ø×!Ñ!×%Ñ% e¨RÓ0Ð0r   c                ó$   <€ V ^8„  d   QhRS[ RR/# )r   r¹   r!   Nr"   )r$   rÆ   s   "€r   r%   rO  ö  s   ø€ ÷ cñ c©Sð c°Tñ cr   c                óˆ   € V P                   P                  4        UUu/ uF  w  r#W18w  g   K  W#bK  	  uppV n         R # u uppi r   )rG  rø   )rØ   r¹   ÚaliasÚtargets   &&  r   Ú_drop_toolset_aliasesÚ"ToolRegistry._drop_toolset_aliasesö  sB   € à/3×/DÑ/D×/JÑ/JÔ/Lô!cÙ/L™m˜eÐPVÑPaŒMˆEŠMÑ/Lò!cˆÖùó !cs   ž
>­>Nc                óL   <€ V ^8„  d   QhRS[ S[,          RS[S[S[3,          /# ©r   r   r!   )r	   r#   r8   r·   )r$   rÆ   s   "€r   r%   rO  ú  s(   ø€ ÷ ñ ¡8©C¥=ð ¹DÁÁiÀÕ<Pñ r   c                óÚ   € / V P                   CV P                  P                  \        V4      / 4      CpVf4   VP	                  V P                  P                  \        4       / 4      4       V# )z=Return global tools overlaid with one profile's plugin tools.)rB  rC  r   r   Úupdater   )rØ   r   rU  s   && r   Ú_merged_toolsÚToolRegistry._merged_toolsú  s[   € àW�T—[‘[ÐW D×$6Ñ$6×$:Ñ$:¼?È5Ó;QÐSUÓ$VÐWˆØŠ=Ø�N‰N˜4×-Ñ-×1Ñ1Ô2CÓ2EÀrÓJÔKØˆr   c                óL   <€ V ^8„  d   QhRS[ RS[S[ ,          RS[S[,          /# )r   r¹   r   r!   )r#   r	   ri   r·   )r$   rÆ   s   "€r   r%   rO    s/   ø€ ÷ Rñ R©ð R±H¹SµMð RÁdÉ9Åoñ Rr   c                ó~   € V P                  V P                  V4      P                  4       4      P                  V. 4      # r   )rZ  rk  Úvaluesr   )rØ   r¹   r   s   &&&r   Ú_toolset_entriesÚToolRegistry._toolset_entries  s2   € Ø�}‰}˜T×/Ñ/°Ó6×=Ñ=Ó?Ó@×DÑDÀWÈbÓQÐQr   c                ór   <€ V ^8„  d   QhRS[ S[,          RS[S[S[,          S[S[S[3,          3,          /# rh  )r	   r#   rŠ   ri   r·   r8   r   )r$   rÆ   s   "€r   r%   rO    s8   ø€ ÷ #ñ #Ù™c•]ð#Ù.3±D¹µOÁTÉ#ÉxÈ-ÕEXÐ4XÕ.Yñ#r   c           	     ó|  € V P                   ;_uu_ 4        \        V P                  V4      P                  4       4      p\	        V P
                  4      pTP                  V Uu/ uF)  qDP                  f   K  VP                  VP                  bK+  	  up4       W#3uuRRR4       # u upi   + '       g   i     R# ; i)zBReturn a coherent snapshot of registry entries and toolset checks.N)	rJ  ri   rk  ro  r8   rF  rj  r¼   r¹   )rØ   r   rU  Úchecksr�   s   &&   r   Ú_snapshot_stateÚToolRegistry._snapshot_state  s†   € ð �Z�Z‹ZÜ˜4×-Ñ-¨eÓ4×;Ñ;Ó=Ó>ˆGÜ˜$×.Ñ.Ó/ˆFØ�M‰M¹'Ó\¹'°QÇZÁZÔ0˜1Ÿ9™9 a§j¡jÒ0¹'Ñ\Ô]Ø�?÷	 ŠZùò ]÷ �ZˆZús$   •AB*Á"B%Á6B%Â	B*Â%B*Â*B;	c                ó0   <€ V ^8„  d   QhRS[ S[,          /# r    ©ri   r·   )r$   rÆ   s   "€r   r%   rO    s   ø€ ÷ )ñ )¡4©	¥?ñ )r   c                ó0   € V P                  4       ^ ,          # rí   )ru  rL  s   &r   r2  ÚToolRegistry._snapshot_entries  s   € Ø×#Ñ#Ó% aÕ(Ð(r   c                ó<   <€ V ^8„  d   QhRS[ RS[S[,          RS[/# )r   r¹   rU  r!   )r#   ri   r·   r@   )r$   rÆ   s   "€r   r%   rO    s,   ø€ ÷ Uñ U±Cð UÁ$ÁyÅ/ð UÑVZñ Ur   c                ó–   aa€ / oV3R lV 4       p\         ;QJ d    V3R lV 4       F  '       g   K   R# 	  R# ! V3R lV 4       4      # )zÿTrue when at least one tool in *toolset* would be exposed. Mirrors
:meth:`get_definitions` per-tool filtering so doctor/banners agree with runtime:
mixed toolsets (``terminal`` + desktop-only ``read_terminal``) must not be gated
by the first ``check_fn``.c              3   óL   <"  € T F  qP                   S8X  g   K  Vx € K  	  R # 5ir   ©r¹   ©rV   r�   r¹   s   & €r   rX   Ú<ToolRegistry._toolset_has_exposable_tools.<locals>.<genexpr>  s   øé € Ð>™g˜¯©°gÑ)=—1’1›gùs   ƒ$š
$c              3   ó€   <"  € T F3  qP                   '       * ;'       g    \        VP                   S4      x € K5  	  R # 5ir   )r¼   r7  )rV   r�   r5  s   & €r   rX   r€    s+   øé € ÐTÉGÀq—z‘z”>×BÐB¤[°·±¸TÓ%BÔBËGùs   ƒ>Ÿ>TF)r\   )rØ   r¹   rU  Úmembersr5  s   &f& @r   Ú_toolset_has_exposable_toolsÚ)ToolRegistry._toolset_has_exposable_tools  s=   ù€ ð
 &(ˆÜ>™gÓ>ˆß‹sÔTÉGÓT�sŒsÐTŠsÐTˆsÔTÉGÓTÓTÐTr   r   c                óL   <€ V ^8„  d   QhRS[ RS[S[ ,          RS[S[,          /# ©r   r�   r   r!   ©r#   r	   r·   )r$   rÆ   s   "€r   r%   rO    s0   ø€ ÷ kñ k™cð k©X±c­]ð kÁhÉyÕFYñ kr   c               óÂ   € V P                   ;_uu_ 4        T P                  Y;'       g    V P                  4       VRJR7      uuRRR4       #   + '       g   i     R# ; i)z7Active profile's entry by name, falling back to global.N)Úexplicit_scope)rJ  Ú_lookuprQ  ©rØ   r�   r   s   &&$r   Ú	get_entryÚToolRegistry.get_entry  s?   € à�Z�Z‹ZØ—<‘< ×&GÐ&G¨t×/EÑ/EÓ/GÐX]ÐeiÐXi�<Ój÷ �Z�Z‹Zús   •-AÁA	r‰  Tc          	      óR   <€ V ^8„  d   QhRS[ RS[S[ ,          RS[RS[S[,          /# )r   r�   Ú	scope_keyr‰  r!   )r#   r	   r@   r·   )r$   rÆ   s   "€r   r%   rO    s4   ø€ ÷ 
%ñ 
%™Cð 
%©H±S­Mð 
%Édð 
%Ñ^fÑgpÕ^qñ 
%r   c               ó  € V'       g6   V P                   P                  \        4       4      pVe   W9   d	   WA,          # V P                   P                  V4      pVe   W9   d	   WQ,          # V P                  P                  V4      # )z°``_merged_tools(scope).get(name)`` without building the merged dict. An implicit scope
(the caller passed none) also sees the current session's tool overlay, as the merge does.)rC  r   r   rB  )rØ   r�   r�  r‰  Úsession_scopedÚscopeds   &&&$  r   rŠ  ÚToolRegistry._lookup  sp   € ÷ Ø!×/Ñ/×3Ñ3Ô4EÓ4GÓHˆNØÒ)¨dÔ.DØ%Õ+Ð+Ø×#Ñ#×'Ñ'¨	Ó2ˆØÒ $¤.Ø•<ÐØ�{‰{�‰˜tÓ$Ð$r   c                óL   <€ V ^8„  d   QhRS[ RS[S[ ,          RS[S[,          /# r†  r‡  )r$   rÆ   s   "€r   r%   rO  *  s.   ø€ ÷ /ñ /Ùð/Ù#+©C¥=ð/Ù<DÁYÕ<Oñ/r   c               ó¨   € V P                   ;_uu_ 4        V P                  V4      P                  V4      uuRRR4       #   + '       g   i     R# ; i)u-   Local slot state only â€” no global fallback.N)rJ  r_  r   r‹  s   &&$r   Úsnapshot_registrationÚ"ToolRegistry.snapshot_registration*  s0   € ð �Z�Z‹ZØ—:‘:˜eÓ$×(Ñ(¨Ó.÷ �Z�Z‹Zús   • A Á A	c                ó0   <€ V ^8„  d   QhRS[ S[,          /# r    ©ri   r#   )r$   rÆ   s   "€r   r%   rO  0  s   ø€ ÷ ?ñ ?©d±3­iñ ?r   c                óR   € \        V P                  V P                  4       4      4      # r   )rl   rZ  r2  rL  s   &r   Úget_registered_toolset_namesÚ)ToolRegistry.get_registered_toolset_names0  s   € Ü�d—m‘m D×$:Ñ$:Ó$<Ó=Ó>Ð>r   c                ó0   <€ V ^8„  d   QhRS[ S[,          /# r    rx  )r$   rÆ   s   "€r   r%   rO  3  s   ø€ ÷ (ñ (¡¡i¥ñ (r   c                ó"   € V P                  4       # r   )r2  rL  s   &r   Úget_all_entriesÚToolRegistry.get_all_entries3  s   € Ø×%Ñ%Ó'Ð'r   c                ó6   <€ V ^8„  d   QhRS[ RS[S[ ,          /# ©r   r¹   r!   )r#   ri   )r$   rÆ   s   "€r   r%   rO  6  s#   ø€ ÷ `ñ `±#ð `¹$¹s½)ñ `r   c                ó€   € \        R  V P                  V P                  4       4      P                  V. 4       4       4      # )c              3   ó8   "  € T F  qP                   x € K  	  R # 5ir   ©r�   )rV   r�   s   & r   rX   Ú:ToolRegistry.get_tool_names_for_toolset.<locals>.<genexpr>7  s   é € Ð_Ñ&^ —f–fÓ&^ùrZ   )rl   rZ  r2  r   ©rØ   r¹   s   &&r   Úget_tool_names_for_toolsetÚ'ToolRegistry.get_tool_names_for_toolset6  s4   € ÜÑ_ d§m¡m°D×4JÑ4JÓ4LÓ&M×&QÑ&QÐRYÐ[]Ô&^Ó_Ó_Ð_r   c                ó*   <€ V ^8„  d   QhRS[ RS[ RR/# )r   rc  r¹   r!   Nr"   )r$   rÆ   s   "€r   r%   rO  9  s"   ø€ ÷ 	"ñ 	"©Cð 	"¹#ð 	"À$ñ 	"r   c                ó6  € V P                   ;_uu_ 4        V P                  P                  V4      pV'       d   W28w  d   \        P	                  RWV4       W P                  V&   V ;P
                  ^,          un        RRR4       R#   + '       g   i     R# ; i)z8Register an explicit alias for a canonical toolset name.z4Toolset alias collision: '%s' (%s) overwritten by %sN)rJ  rG  r   r)   r†   rK  )rØ   rc  r¹   Úexistings   &&& r   Úregister_toolset_aliasÚ#ToolRegistry.register_toolset_alias9  sj   € à�Z�Z‹ZØ×,Ñ,×0Ñ0°Ó7ˆHß˜HÔ/Ü—‘ØJÈEÐ]dôð ,3×!Ñ! %Ñ(Ø×Ò Õ!Õ÷ �Z�ZŠZús   •A(BÂB	c                ó6   <€ V ^8„  d   QhRS[ S[S[3,          /# r    ©r8   r#   )r$   rÆ   s   "€r   r%   rO  D  s   ø€ ÷ /ñ /±±S¹#°Xµñ /r   c                ó’   € V P                   ;_uu_ 4        \        V P                  4      uuR R R 4       #   + '       g   i     R # ; ir   )rJ  r8   rG  rL  s   &r   Úget_registered_toolset_aliasesÚ+ToolRegistry.get_registered_toolset_aliasesD  s%   € Ø�Z�Z‹ZÜ˜×-Ñ-Ó.÷ �Z�Z‹Zús	   •5µA	c                ó6   <€ V ^8„  d   QhRS[ RS[S[ ,          /# )r   rc  r!   ©r#   r	   )r$   rÆ   s   "€r   r%   rO  H  s   ø€ ÷ 4ñ 4©cð 4±h¹sµmñ 4r   c                óž   € V P                   ;_uu_ 4        V P                  P                  V4      uuR R R 4       #   + '       g   i     R # ; ir   )rJ  rG  r   )rØ   rc  s   &&r   Úget_toolset_alias_targetÚ%ToolRegistry.get_toolset_alias_targetH  s+   € Ø�Z�Z‹ZØ×(Ñ(×,Ñ,¨UÓ3÷ �Z�Z‹Zús	   •;»A	c                óB   <€ V ^8„  d   QhRS[ RS[RS[S[ ,          RS[/# )r   Úmodule_namespacerÔ   r   r!   )r#   r@   r	   rÒ   )r$   rÆ   s   "€r   r%   rO  N  s1   ø€ ÷ 
ñ 
Ù #ð
Ù.2ð
Ù>FÁs½mð
á	ñ
r   c               ó  € \        V4      pV P                  ;_uu_ 4        \        V4      pW@P                  W13&   V P                  P                  V\        4       4      P                  V4       VuuRRR4       #   + '       g   i     R# ; i)z¦Bind a plugin module namespace to its current operator opt-in. The identity-bearing
result lets unload/reload revoke a stale authorization without losing attribution.N)r   rJ  rÒ   rD  rE  rW  r   rá   )rØ   rº  rÔ   r   Úpolicys   &&&$ r   Úregister_plugin_override_policyÚ,ToolRegistry.register_plugin_override_policyN  se   € ô
   Ó&ˆØ�Z�Z‹ZÜ*¨7Ó3ˆFØFL×(Ñ(¨%Ð)BÑCØ×&Ñ&×1Ñ1Ð2BÄCÃEÓJ×NÑNÈuÔUØ÷	 �Z�Z‹Zús    AA:Á:B	c                óL   <€ V ^8„  d   QhRS[ RS[S[ ,          RS[S[,          /# )r   rº  r   r!   )r#   r	   rÒ   )r$   rÆ   s   "€r   r%   rO  Z  s4   ø€ ÷ Oñ OÙ #ðOÙ/7¹­}ðOá	Ñ'Õ	(ñOr   c               ó¶   € \        V4      pV P                  ;_uu_ 4        V P                  P                  W!34      uuRRR4       #   + '       g   i     R# ; i)z;Return one local authorization generation without fallback.N)r   rJ  rD  r   )rØ   rº  r   s   &&$r   Úsnapshot_plugin_override_policyÚ,ToolRegistry.snapshot_plugin_override_policyZ  s:   € ô   Ó&ˆØ�Z�Z‹ZØ×/Ñ/×3Ñ3°UÐ4MÓN÷ �Z�Z‹Zús    AÁA	c          
      óX   <€ V ^8„  d   QhRS[ RS[RS[S[,          RS[S[ ,          RS[/# )r   rº  ÚcurrentÚpreviousr   r!   )r#   rÒ   r	   r@   )r$   rÆ   s   "€r   r%   rO  b  s?   ø€ ÷ ñ Ù #ðÙ.CðáÑ0Õ1ðá=EÁc½]ðáVZñr   c               ó8  € \        V4      pV P                  ;_uu_ 4        WA3pV P                  P                  V4      VJd    RRR4       R# Vf   V P                  P	                  VR4       MW0P                  V&    RRR4       R#   + '       g   i     R# ; i)zCCAS-restore policy state while retaining durable scope attribution.NFT)r   rJ  rD  r   rù   )rØ   rº  rÄ  rÅ  r   rÿ   s   &&&&$ r   Úrestore_plugin_override_policyÚ+ToolRegistry.restore_plugin_override_policyb  s}   € ô   Ó&ˆØ�Z�Z‹ZØÐ+ˆCØ×+Ñ+×/Ñ/°Ó4¸GÓCØ÷ ‰Zð ÒØ×,Ñ,×0Ñ0°°dÕ;à4<×,Ñ,¨SÑ1Ø÷ �Z�ZŠZús    $BÁ0BÂB	c                ó<   <€ V ^8„  d   QhRS[ S[,          RS[RS[/# )r   r   rº  r!   )r	   r#   r@   )r$   rÆ   s   "€r   r%   rO  q  s'   ø€ ÷ /ñ /©h±s­mð /Ésð /ÑW[ñ /r   c                óÂ   € V P                   P                  W34      pVf"   Ve   V P                   P                  R V34      p\        T;'       d    VP                  4      # r   )rD  r   r@   rÔ   )rØ   r   rº  r¼  s   &&& r   Ú_plugin_override_allowedÚ%ToolRegistry._plugin_override_allowedq  sX   € Ø×-Ñ-×1Ñ1°5Ð2KÓLˆØŠ>˜eÒ/Ø×1Ñ1×5Ñ5°tÐ=MÐ6NÓOˆFÜ�F×-Ð-˜vŸ~™~Ó.Ð.r   c                ó6   <€ V ^8„  d   QhRS[ RS[S[,          /# ©r   r»   r!   ©r   r	   r#   )r$   rÆ   s   "€r   r%   rO  w  s#   ø€ ÷ Fñ F©ð F±X¹cµ]ñ Fr   c                óZ   € V P                  V4      pV'       d   V P                  V4      # R# )a!  Plugin namespace that DEFINED *handler* (None for built-in/MCP handlers). Bound to
``handler.__globals__["__name__"]``, fixed at definition time so it cannot drift with
call site/thread/timing; lambdas and nested functions inherit it, so a plugin cannot
launder an override via a callback.N)Ú_callable_moduleÚ_plugin_namespace_of_module)rØ   r»   Úmods   && r   Ú_plugin_owner_ofÚToolRegistry._plugin_owner_ofw  s,   € ð
 ×#Ñ# GÓ,ˆß8;ˆt×/Ñ/°Ó4ÐEÀÐEr   c                ó&   <€ V ^8„  d   QhRS[ RS[/# rÎ  )r   r#   )r$   rÆ   s   "€r   r%   rO  €  s   ø€ ÷ Rñ R¡(ð R©sñ Rr   c                óZ  € T p\        4       p\        V4      V9  dÑ   VP                  \        V4      4       \        VRR4      p\	        V\
        P                  4      '       d   VP                  pKe  \        VRR4      e   VP                  pK‚  \	        V\        4      '       d+   VP                  RR4      '       d   \        VR,          4      # \        VRR4      e   VP                  pKß   \        VRR4      p\        T;'       g!    \        \        V4      RR4      ;'       g    R4      # )z@Resolve defining module through wrappers, partials, and objects.Ú__globals__NÚ__func__rÈ   rt   Ú__wrapped__rÉ   )r   rK   rá   rç   r7   Ú	functoolsÚpartialrG   rÙ  r8   r   r#   rÚ  Útype)r»   rÄ  ÚseenÚglobals_dictr�   s   &    r   rÑ  ÚToolRegistry._callable_module  só   € ð ˆÜ›ˆÜ�‹k Ô%Ø�H‰H”R˜“[Ô!Ü" 7¨M¸4Ó@ˆLÜ˜'¤9×#4Ñ#4×5Ò5Ø!Ÿ,™,’Ü˜ *¨dÓ3Ò?Ø!×*Ñ*’Ü˜L¬$×/Ò/°L×4DÑ4DÀZÐQS×4TÒ4TÜ˜<¨
Õ3Ó4Ð4Ü˜ -°Ó6ÒBØ!×-Ñ-’àÜ˜g |°RÓ8ˆÜ�;×PÐP¤'¬$¨w«-¸ÀrÓ"J×PÐPÈbÓQÐQr   c                ó6   <€ V ^8„  d   QhRS[ RS[S[ ,          /# ©r   rº  r!   rµ  )r$   rÆ   s   "€r   r%   rO  ”  s   ø€ ÷ ñ ¹Cð ÁHÉSÅMñ r   c           	     ó®  € V P                   ;_uu_ 4        V P                   Uu. uF'  pW8X  g   VP                  V R24      '       g   K%  VNK)  	  ppV'       d   \        V\        R7      uuRRR4       #  RRR4       VP                  R4      '       d(   RP                  VP                  R4      R,          4      # R# u upi   + '       g   i     LU; i)z;Resolve a module/submodule to its durable plugin namespace.rv   )rÿ   Nzhermes_plugins.ru   )rJ  rE  Ú
startswithÚmaxr'   rŒ   Úsplit)rØ   rº  Ú	namespaceÚmatchess   &&  r   rÒ  Ú(ToolRegistry._plugin_namespace_of_module”  s¸   € à�Z�Z‹Zà+/×+EÒ+EóbÙ+E˜iØ#Ô0Ð4D×4OÑ4OÐS\ÐR]Ð]^ÐP_×4`÷ �	Ñ+Eð ð b÷ Ü˜7¬Ô,÷ ŠZð ÷	 ð ×&Ñ&Ð'8×9Ò9Ø—8‘8Ð,×2Ñ2°3Ó7¸Õ;Ó<Ð<Ùùòb÷ �Zús"   •C¤"B?ÁB?ÁCÂ?CÃC	c                ó6   <€ V ^8„  d   QhRS[ RS[S[ ,          /# râ  rµ  )r$   rÆ   s   "€r   r%   rO  ¢  s   ø€ ÷ 9ñ 9±ð 9¹Á#½ñ 9r   c                óp  € V P                   ;_uu_ 4        V P                  P                  V4      pV'       g    RRR4       R# V P                  4       pW29   d   VuuRRR4       # \	        V4      ^8X  d   \        \        V4      4      uuRRR4       # \        RV: R24      h  + '       g   i     R# ; i)z9Return the profile scope bound to a loaded plugin module.NúPlugin module zP is active in multiple profiles and cannot register outside one of those scopes.)rJ  rE  r   rQ  r'   rû   rü   ÚPermissionError)rØ   rº  ÚscopesÚactive_scopes   &&  r   Ú_plugin_scope_ofÚToolRegistry._plugin_scope_of¢  sœ   € à�Z�Z‹ZØ×/Ñ/×3Ñ3Ð4DÓEˆFßØ÷ ‰Zð  ×1Ñ1Ó3ˆLØÔ%Ø#÷ ŠZô �6‹{˜aÔÜœD ›LÓ)÷ ŠZô "Ø Ð!1Ñ 4ð 58ð 8ó9ð 9÷ �ZˆZús   •%B$ÁB$Á&#B$ÂB$Â$B5	c                ó6   <€ V ^8„  d   QhRS[ RS[S[ ,          /# râ  rµ  )r$   rÆ   s   "€r   r%   rO  ±  s#   ø€ ÷ @ñ @¹ð @ÁÉÅñ @r   c                óZ   € V P                  V4      pT P                  T;'       g    T4      # )z@Public host lookup for a loaded plugin module's immutable scope.)rÒ  rð  )rØ   rº  Úowners   && r   Úplugin_scope_for_moduleÚ$ToolRegistry.plugin_scope_for_module±  s-   € à×0Ñ0Ð1AÓBˆØ×$Ñ$ U×%>Ð%>Ð.>Ó?Ð?r   c                ó6   <€ V ^8„  d   QhRS[ RS[S[,          /# )r   Úcallbackr!   rÏ  )r$   rÆ   s   "€r   r%   rO  ¶  s#   ø€ ÷ Rñ R±(ð R¹xÉ½}ñ Rr   c                óZ   € V P                  V4      pV'       d   V P                  V4      # R# )zAReturn the durable plugin scope for any supported callable shape.N)rÑ  rõ  )rØ   rø  r�   s   && r   Úplugin_scope_for_callableÚ&ToolRegistry.plugin_scope_for_callable¶  s*   € à×+Ñ+¨HÓ5ˆß<Gˆt×+Ñ+¨KÓ8ÐQÈTÐQr   c                ó    <€ V ^8„  d   QhRS[ /# r    r"   )r$   rÆ   s   "€r   r%   rO  ¼  s   ø€ ÷ ñ ™Cñ r   c                 óœ   €  \         P                  ! ^4      P                  P                  RR4      ;'       g    R#   \         d     R# i ; i)u×   Best-effort module name of the registry method's caller (two frames up).
``deregister()`` takes only a tool name â€” no handler for ``_plugin_owner_of`` â€”
so frame inspection is the only way to know who is asking.rÈ   rt   )ÚsysÚ	_getframeÚ	f_globalsr   rŽ   r   r   r   Ú_caller_moduleÚToolRegistry._caller_module»  sC   € ð
	Ü—=’= Ó#×-Ñ-×1Ñ1°*¸bÓA×GÐGÀRÐGøÜô 	Úð	ús   ‚6< ¹< ¼AÁ
Ac                óÄ   <€ V ^8„  d   QhRS[ RS[ RS[RS[RS[R,          RS[R,          RS[R	S[ R
S[ RS[R,          RS[R,          RS[RS[S[ ,          RS[R,          /# )r   r�   r¹   rº   r»   r¼   Nr½   r¾   r¿   rÀ   rÁ   rÂ   r  r   rÃ   )r#   r8   r   ri   r@   rÅ   r	   )r$   rÆ   s   "€r   r%   rO  Å  s·   ø€ ÷ M"ñ M"ÙðM"Ù"%ðM"Ù/3ðM"Ù>FðM"á˜T•/ðM"á8<¸t½ðM"áVZðM"ñ ðM"ñ '*ðM"ñ HMÈtÅ|ðM"ñ #+¨T¥/ð	M"ñ EIð	M"ñ
 ™�}ðM"ñ
 9>À½ñM"r   c                óT  € \        V\        4      '       g&   \        RV: R\        V4      P                   24      hVP                  R4      pVe<   \        V\        4      '       g&   \        RV: R\        V4      P                   24      hV P                  V4      pV P                  V P                  4       4      pT;'       g    TpVf   Ve   V P                  V4      p\        V4      pV P                  ;_uu_ 4        V P                  VRR7      pV P                  W4      pVRJ;'       d    V P                  VV4      '       * pVRJ;'       d(    VRJ;'       d    VV9  ;'       d    WP                  9   pV'       dS   V'       g#   \         P#                  RVV4        RRR4       R# V'       d!   \%        \&        P)                  VVR	7      4      hV'       d²   VP*                  V8w  d¡   V'       dm   V'       dC   \         P#                  R
VVVP*                  4       \%        \&        P)                  VVR	7      4      h\         P-                  RWVP*                  4       M,\         P#                  RWVP*                  4        RRR4       R# \/        YY4TT;'       g    . TT;'       g    VP                  RR4      V	W®VR7      VV&   Vf'   V'       d   W P0                  9  d   WPP0                  V&   V ;P2                  ^,          un        RRR4       R#   + '       g   i     R# ; i)zëRegister a tool (called at import time by each tool file). ``override=True`` is an
explicit opt-in for plugins replacing a built-in implementation (e.g. a headed-Chrome
browser backend); without it, cross-toolset shadowing is rejected.zTool z: schema must be a dict, got Ú
parametersNzA: schema['parameters'] must be an object (JSON Schema dict), got T©r\  z^Tool registration REJECTED: plugin %r attempted to shadow global tool %r without override=True)rô  r�   zÑTool registration REJECTED: plugin %r attempted to override built-in tool %r (existing toolset %r) without operator opt-in. Set plugins.entries.<plugin_id>.allow_tool_override: true in config.yaml to allow it.zOTool '%s': toolset '%s' overriding existing toolset '%s' (override=True opt-in)zÈTool registration REJECTED: '%s' (toolset '%s') would shadow existing tool from toolset '%s'. Pass override=True to register() if the replacement is intentional, or deregister the existing tool first.r¿   rt   )r�   r¹   rº   r»   r¼   r½   r¾   r¿   rÀ   rÁ   rÃ   rÂ   )r7   r8   r6   rÝ  rÈ   r   rÔ  rÒ  r  rð  r   rJ  r_  rŠ  rË  rB  r)   r1   rí  Ú_OVERRIDE_DENIED_MSGr$   r¹   r%  r·   rF  rK  )rØ   r�   r¹   rº   r»   r¼   r½   r¾   r¿   rÀ   rÁ   rÂ   r  r   rÃ   ÚparamsÚhandler_ownerÚcaller_ownerrô  rd  r¬  Úplugin_override_deniedÚshadows_globals   &&&&&&&&&&&&&&&        r   rB   ÚToolRegistry.registerÅ  sí  € ô ˜&¤$×'Ò'ÜØ˜‘xÐ<¼TÀ&»\×=RÑ=RÐ<SÐTóVð Và—‘˜LÓ)ˆØÒ¤j°¼×&>Ò&>ÜØ˜‘xð  Ü˜F“|×,Ñ,Ð-ð/ó0ð 0ð ×-Ñ-¨gÓ6ˆØ×7Ñ7¸×8KÑ8KÓ8MÓNˆØ×-Ð- ˆØŠ=˜UÒ.Ø×)Ñ)¨%Ó0ˆEÜ Ó&ˆØ�Z�Z‹ZØ—Z‘Z ¨d�ZÓ3ˆFØ—|‘| DÓ0ˆHà˜TÐ!×UÐU¨$×*GÑ*GÈÈuÓ*UÔ&Uð #ð ˜TÐ!÷ ?ð ? e°4Ð&7÷ ?ð ?Ø Ñ&÷?ð ?Ø+/·;±;Ñ+>ð ÷ ßÜ—L‘Lð0Ø16¸ô>ð ÷ ‰Z÷ *Ü)Ô*>×*EÑ*EÈEÐX\Ð*EÓ*]Ó^Ð^ß˜H×,Ñ,°Ô7ßß-ÜŸ™ð+ð " 4¨×)9Ñ)9ô;ô .Ô.B×.IÑ.IÐPUÐ\`Ð.IÓ.aÓbÐbä—K‘Kð1Ø26À×AQÑAQõSô —L‘Lð]ð  x×'7Ñ'7ô	9ð
 ÷M ‰ZôN %Ø°6ÐU]Ø)×/Ð/¨R¸(Ø'×HÐH¨6¯:©:°mÀRÓ+HÐPUØ&;Ø)AôCˆF�4‰Lð Š}§¨g×=QÑ=QÔ.QØ08×$Ñ$ WÑ-Ø×Ò Õ!Õ÷g �Z�ZŠZús\   Ä ALÅLÅLÅ,LÆLÆLÆ-LÆ5'LÇLÇ6LÇ>BLÊLÊ+)LË7LÌL'	c                ó:   <€ V ^8„  d   QhRS[ RS[S[ ,          RR/# )r   r�   r   r!   Nrµ  )r$   rÆ   s   "€r   r%   rO    s&   ø€ ÷ 84ñ 84™sð 84©h±s­mð 84Àtñ 84r   c               óÚ  € \        V4      pV P                  ;_uu_ 4        V P                  4       pV P                  V4      pVe   V P	                  V4      MRpVe   Ve   W%8w  d   \        RV: R24      hVf   TpV P                  V4      pVP                  V4      pVf8   Ve)   Ve%   WP                  9   d   \        RV: RV: R24      h RRR4       R# VP                  P                  R4      '       gš   V P                  VP                  4      p\        T;'       d    WH8H  4      p	Ved   V	'       g\   V P                  WT4      '       gE   \        P!                  RW1VP                  V4       \        RV: R	V: R
VP                  : R24      hWa Ve%   V'       g   V P"                  P%                  VR4       V P'                  VP                  V4      '       gB   V P(                  P%                  VP                  R4       V P+                  VP                  4       V ;P,                  ^,          un        RRR4       \        P/                  RV4       R#   + '       g   i     L(; i)u6  Remove a tool; drops the toolset check/aliases if it was the last in its toolset.

``scope`` selects a profile overlay explicitly (multiplexed MCP tools live in the
owning profile's overlay); plugin callers may not name another scope, non-plugin
callers default to the process-global map. Gated by the same opt-in as
``register(override=True)``, else a plugin could deregister a tool it doesn't own
and re-register over the empty slot (the override check only runs when an entry
exists). ``mcp-*`` toolsets are exempt â€” discovery repaves its own tools per refresh.Nrì  z7 cannot deregister tools outside its own profile scope.zScoped plugin module z' cannot deregister process-global tool z%; register a scoped override instead.zmcp-zÇTool deregistration REJECTED: plugin %r attempted to remove tool %r (toolset %r) it does not own, without operator opt-in. Set plugins.entries.%s.allow_tool_override: true in config.yaml to allow it.z cannot deregister tool z
 (toolset z0) without operator opt-in (allow_tool_override).zDeregistered tool: %s)r   rJ  r  rÒ  rð  rí  r_  r   rB  r¹   rä  rÔ  r»   r@   rË  r)   r1   rC  rù   rp  rF  re  rK  r*   )
rØ   r�   r   Ú
caller_modr
  Úcaller_scoperd  rY  rô  Úsame_plugins
   &&$       r   Ú
deregisterÚToolRegistry.deregister  s<  € ô   Ó&ˆØ�Z�Z‹ZØ×,Ñ,Ó.ˆJØ×;Ñ;¸JÓGˆLØBNÒBZ˜4×0Ñ0°Ô>Ð`dˆLØÒ'¨EÒ,=À%ÔBWÜ%Ø$ Z¡Nð 35ð 5ó6ð 6ð Š}Ø$�Ø—Z‘Z Ó&ˆFØ—J‘J˜tÓ$ˆEØŠ}ØÒ$¨Ò)AÀdÏkÉkÔFYÜ)Ø/°
©~ð > Ø $™xÐ'LðNóOð Oð ÷# ‰Zð$ —=‘=×+Ñ+¨F×3Ò3Ø×-Ñ-¨e¯m©mÓ<�ô # 5×#BÐ#B¨\Ñ-BÓC�à Ò,ß'Ø ×9Ñ9¸,×UÒUÜ—L‘Lðcð #¨%¯-©-¸ô	Eô
 *Ø(¨©Ð6NÈtÉhÐV`Ø Ÿ=™=Ñ+Ð+[ð]ó^ð ^ð �ØÒ ¯Ø×"Ñ"×&Ñ& u¨dÔ3Ø×(Ñ(¨¯©¸×>Ò>Ø×$Ñ$×(Ñ(¨¯©¸Ô=Ø×*Ñ*¨5¯=©=Ô9Ø×Ò Õ!Õ÷[ ô\ 	�‰Ð,¨dÖ3÷] �Zús2    B0IÃ IÃ;(IÄ$IÄ9A(IÆ"=IÇ AIÉI*	c                ó$   <€ V ^8„  d   QhRS[ RR/# )r   r   r!   Nr"   )r$   rÆ   s   "€r   r%   rO  N  s   ø€ ÷ &ñ &©#ð &°$ñ &r   c           	     ó†  € \        V4      pV P                  ;_uu_ 4        V Uu/ uF0  q3V P                  9   g   K  W0P                  P                  V4      bK2  	  ppV'       d<   V P	                  VRR7      P                  V4       V ;P                  ^,          un        RRR4       R# u upi   + '       g   i     R# ; i)z®Move process-global registrations into *scope*'s overlay (a single-profile process that
starts multiplexing hands its launch profile's MCP tools to that profile's own scope).Tr  N)r   rJ  rB  rù   r_  rj  rK  )rØ   Únamesr   r�   Úmoveds   &&&  r   Úmove_to_scopeÚToolRegistry.move_to_scopeN  sŠ   € ô   Ó&ˆØ�Z�Z‹ZÙ=BÓZ¹U°TÈdÏkÉkÑFYÔ0�TŸ;™;Ÿ?™?¨4Ó0Ò0¹UˆEÐZßØ—
‘
˜5¨�
Ó.×5Ñ5°eÔ<Ø× Ò  AÕ%Õ ÷	 ‰ZùÚZ÷ �ZˆZús"    B/¥B*¼B*ÁAB/Â*B/Â/C 	c          
      óX   <€ V ^8„  d   QhRS[ RS[RS[S[,          RS[S[ ,          RS[/# )r   r�   rÄ  rÅ  r   r!   )r#   r·   r	   r@   )r$   rÆ   s   "€r   r%   rO  X  s>   ø€ ÷ $ñ $Ùð$Ù"+ð$Ù7?Á	Õ7Jð$á™�}ð$á(,ñ$r   c               óÈ  a
€ V P                   ;_uu_ 4        V P                  VRR7      pVP                  V4      VJd    RRR4       R# Vf   VP                  VR4       MW5V&   Ve%   V'       g   V P                  P                  VR4       VP
                  0pVe   VP                  VP
                  4       V FÙ  o
V P                  S
V4      p\        R V 4       R4      pVf0   Vf   V P                  P                  S
R4       MW€P                  S
&   R V P                  P                  4        4       p	V'       d   K†  \        ;QJ d    V
3R lV	 4       F  '       g   K   RM	  RM! V
3R lV	 4       4      '       d   KÈ  V P                  S
4       KÛ  	  V ;P                  ^,          un        RRR4       \        P                  RV4       R#   + '       g   i     L(; i)	a+  Restore a host-owned registration if it is still current (plugin ownership ledger).
The identity check is deliberate: another plugin (or ``PluginManager`` in a
multi-profile process) may have registered a newer entry under the same name, and
unloading this entry must leave that newer one untouched.Tr  NFc              3   ó`   "  € T F$  qP                   '       g   K  VP                   x € K&  	  R # 5ir   )r¼   ©rV   rY  s   & r   rX   Ú4ToolRegistry.restore_registration.<locals>.<genexpr>q  s   é € Ð Y¹Y°EÏ.Í.¤ §¦»Yùs   ‚.š.c              3   óP   "  € T F  qP                  4        F  q"x € K  	  K  	  R # 5ir   )ro  )rV   Úmr�   s   &  r   rX   r  w  s   é € ÐZÑ*E QÏxÉxÎzÈ!œqÉz™qÓ*Eùs   ‚$&c              3   ó@   <"  € T F  qP                   S8H  x € K  	  R # 5ir   r~  r  s   & €r   rX   r  x  s   øé € Ð,WÉ;Àa¯Y©Y¸'Ö-AË;ùs   ƒzRestored tool registration: %s)rJ  r_  r   rù   rC  r¹   rá   rp  rû   rF  ro  r\   re  rK  r)   r*   )rØ   r�   rÄ  rÅ  r   rd  Úaffected_toolsetsÚ	survivingr¼   Úin_overlaysr¹   s   &&&&$     @r   Úrestore_registrationÚ!ToolRegistry.restore_registrationX  s}  ø€ ð �Z�Z‹ZØ—Z‘Z ¨d�ZÓ3ˆFØ�z‰z˜$Ó wÓ.Ø÷ ‰Zð ÒØ—
‘
˜4 Õ&à'�t‘ØÒ ¯Ø×"Ñ"×&Ñ& u¨dÔ3ð ")§¡Ð 1ÐØÒ#Ø!×%Ñ% h×&6Ñ&6Ô7Û,�Ø ×1Ñ1°'¸5ÓA�	ÜÑ Y¹YÓ YÐ[_Ó`�Ø’=ØÒ'Ø×,Ñ,×0Ñ0°¸$Õ?à8@×,Ñ,¨WÑ5ÙZ¨$×*<Ñ*<×*CÑ*CÔ*EÓZ�ß ‘y¯«Ô,WÉ;Ó,W¯¯ªÔ,WÉ;Ó,W×)WÔ)WØ×.Ñ.¨wÖ7ñ -ð ×Ò Õ!Õ÷7 ô8 	�‰Ð5°tÔ<Ù÷; �Zús0   –*GÁ
&GÁ1CGÅ
GÅGÅ#GÆ.GÇG!	c                óL   <€ V ^8„  d   QhRS[ S[,          RS[RS[S[,          /# )r   Ú
tool_namesÚquietr!   )r   r#   r@   ri   r8   )r$   rÆ   s   "€r   r%   rO  €  s+   ø€ ÷ ñ ©#©c­(ð ¹4ð ÉDÑQUÍJñ r   c                ó®  € . p/ pV P                  4        Uu/ uF  qUP                  VbK  	  pp\        V4       Fã  pVP                  V4      pV'       g   K  VP                  '       d=   \        VP                  V4      '       g!   V'       g   \        P                  RV4       Kl  / VP                  CRVP                  /CpVP                  e9    VP                  4       p	\        V	\        4      '       d   VP                  V	4       VP                  RRRV/4       Kå  	  V# u upi   \         d#   p
Rp	\        P                  RYz4        Rp
?
LoRp
?
ii ; i)z OpenAI-format schemas for the requested tools whose ``check_fn`` passes (or is
absent). Probes use the ~30 s TTL cache so ``hermes tools enable`` lands quickly.z"Tool %s unavailable (check failed)r�   NzCdynamic_schema_overrides for tool %s raised %s; using static schemarÝ  Úfunction)r2  r�   rl   r   r¼   r7  r)   r*   rº   rÂ   rŽ   r†   r7   r8   rj  r‹   )rØ   r)  r*  r/   Úcheck_resultsrY  Úentries_by_namer�   Úschema_with_nameÚ	overridesr(  s   &&&        r   Úget_definitionsÚToolRegistry.get_definitions€  s0  € ð ˆØ.0ˆØ:>×:PÑ:PÔ:RÓSÑ:R°Ÿ:™: uÒ,Ñ:RˆÐSÜ˜:Ö&ˆDØ#×'Ñ'¨Ó-ˆEßÙØ�~�~ˆ~¤k°%·.±.À-×&PÒ&PßÜ—L‘LÐ!EÀtÔLÙØC %§,¡,ÐC°¸¿
¹
ÑCÐð ×-Ñ-Ò9ð#Ø %× >Ñ >Ó @�Iô ˜i¬×.Ò.Ø$×+Ñ+¨IÔ6Ø�M‰M˜6 :¨zÐ;KÐLÖMñ+ 'ð, ˆùò/ Tøô !ô #Ø $�IÜ—N‘NØ]Ø÷#ñ #ûð#ús   —D"ÃD'Ä'EÄ2EÅEc                ó    <€ V ^8„  d   QhRS[ /# )r   r�   r"   )r$   rÆ   s   "€r   r%   rO  ¡  s   ø€ ÷ Sñ S©ñ Sr   c                ó`  € \        V\        4      '       d   \        V4      # \        V\        4      '       d=   VP	                  R4      RJ d(   \        VP	                  R4      \
        4      '       d   V# \        V4      P                  p\        P                  RW4       \        RV 2RWR7      # )z°Results must be a string or the multimodal envelope; anything else becomes a
string error so logging/hooks/budgeting/persistence never receive values they
cannot slice or size.Ú_multimodalTÚcontentz4Tool %s handler returned unsupported result type: %sz/Tool handler returned unsupported result type: Útool_result_contract)Ú
error_typeÚtoolÚresult_type)r7   r#   r;   r8   r   ri   rÝ  rÈ   r)   r1   Ú
tool_error)r�   r/   r:  s   && r   Ú_normalize_handler_resultÚ&ToolRegistry._normalize_handler_result   s‘   € ô
 �fœc×"Ò"Ü+¨FÓ3Ð3ä�vœt×$Ò$Ø—
‘
˜=Ó)¨TÓ1Ü˜6Ÿ:™: iÓ0´$×7Ò7ØˆMÜ˜6“l×+Ñ+ˆÜ�‰ÐKÈTÔ_ÜØ=¸k¸]ÐKØ-°DôSð 	Sr   c          	      óR   <€ V ^8„  d   QhRS[ RS[RS[S[ ,          RS[ S[,          /# )r   r�   Úargsr   r!   )r#   r8   r	   )r$   rÆ   s   "€r   r%   rO  ²  s7   ø€ ÷ )ñ )Ùð)Ù#ð)Ù/7¹­}ð)ÙRUÑX\ÕR\ñ)r   c          
     ó@  € V P                  WR7      pV'       g   \        RV 24      #  \        VP                  V4      pVP                  '       d!   ^ RIHp V! VP                  ! V3/ VB 4      pMVP                  ! V3/ VB pV P                  W4      #   \         d}   p\        P                  RT\        \        T4      4      4       R\        T4      P                   RT 2p	 ^ RIHp
 T
! T	4      pM  \         d    T	p Mi ; i\        T4      u Rp?# Rp?ii ; i)	z�Execute a tool handler by name: async handlers bridged via ``_run_async()``,
results normalized, every exception returned as ``{"error": ...}``.)r   zUnknown tool: )Ú
_run_asynczTool %s dispatch error: %szTool execution failed: z: )Ú_sanitize_tool_errorN)rŒ  r;  Ú_kwargs_accepted_byr»   r¾   Úmodel_toolsrA  r<  rŽ   r)   Ú	exceptionr-   r#   rÝ  rÈ   rB  )rØ   r�   r?  r   ÚkwargsrY  rA  r/   r�   ÚrawrB  Ú	sanitizeds   &&&$,       r   ÚdispatchÚToolRegistry.dispatch²  s  € ð —‘˜t�Ó1ˆßÜ ¨t¨fÐ5Ó6Ð6ð	)ô )¨¯©¸Ó?ˆFØ�~�~ˆ~Ý2Ù# E§M¢M°$Ñ$A¸&Ñ$AÓB‘àŸš tÑ6¨vÑ6�Ø×1Ñ1°$Ó?Ð?øÜô 
	)ä×ÑÐ9¸4ÔARÔSVÐWXÓSYÓAZÔ[à+¬D°«G×,<Ñ,<Ð+=¸RÀ¸sÐCˆCð Ý<Ù0°Ó5‘	øÜô  Ø’	ð úä˜iÓ(Õ(ûð
	)úsC   ªA+B ÂDÂ!ADÃ&C5Ã4DÃ5DÄDÄDÄDÄDÄDc                ó&   <€ V ^8„  d   QhRS[ RS[ /# )r   r�   rI   r"   )r$   rÆ   s   "€r   r%   rO  Ò  s   ø€ ÷ 9ñ 9™#ð 9¡Sñ 9r   c                ó:   € \        V P                  V4      VR 4      # r   )rç   rŒ  )rØ   r�   rI   s   &&&r   Ú_attrÚToolRegistry._attrÒ  s   € Ü�t—~‘~ dÓ+¨T°4Ó8Ð8r   c                óJ   <€ V ^8„  d   QhRS[ RS[R,          RS[S[,          /# )r   r�   r   Nr!   )r#   rÅ   rÄ   )r$   rÆ   s   "€r   r%   rO  Õ  s+   ø€ ÷ )ñ )©ð )±e¸dµlð )ÉcÑTYÍkñ )r   c                óN   € V P                  VR4      pVe   V# Ve   V# ^ RIHp V# )zBReturn per-tool max result size, or *default* (or global default).rÁ   )ÚDEFAULT_RESULT_SIZE_CHARS)rM  Útools.budget_configrQ  )rØ   r�   r   ÚsizerQ  s   &&&  r   Úget_max_result_sizeÚ ToolRegistry.get_max_result_sizeÕ  s2   € à�z‰z˜$Ð 7Ó8ˆØÒØˆKØÒØˆNÝAØ(Ð(r   c                ó0   <€ V ^8„  d   QhRS[ S[,          /# r    r™  )r$   rÆ   s   "€r   r%   rO  ß  s   ø€ ÷ Hñ H¡D©¥Iñ Hr   c                óB   € \        R  V P                  4        4       4      # )c              3   ó8   "  € T F  qP                   x € K  	  R # 5ir   r¥  r  s   & r   rX   Ú2ToolRegistry.get_all_tool_names.<locals>.<genexpr>à  s   é € ÐGÑ.F U—j–jÓ.FùrZ   )rl   r2  rL  s   &r   Úget_all_tool_namesÚToolRegistry.get_all_tool_namesß  s   € ÜÑG¨d×.DÑ.DÔ.FÓGÓGÐGr   c                ó6   <€ V ^8„  d   QhRS[ RS[S[,          /# ©r   r�   r!   )r#   r	   r8   )r$   rÆ   s   "€r   r%   rO  â  s   ø€ ÷ *ñ *™sð *¡x±¥~ñ *r   c                ó&   € V P                  VR4      # )zORaw schema dict, bypassing check_fn filtering (token estimates, introspection).rº   ©rM  ©rØ   r�   s   &&r   Ú
get_schemaÚToolRegistry.get_schemaâ  s   € à�z‰z˜$ Ó)Ð)r   c                ó6   <€ V ^8„  d   QhRS[ RS[S[ ,          /# r]  rµ  )r$   rÆ   s   "€r   r%   rO  æ  s   ø€ ÷ +ñ +©ð +±¹#µñ +r   c                ó&   € V P                  VR 4      # r~  r_  r`  s   &&r   Úget_toolset_for_toolÚ!ToolRegistry.get_toolset_for_toolæ  s   € Ø�z‰z˜$ 	Ó*Ð*r   c                ó,   <€ V ^8„  d   QhRS[ RS[ RS[ /# )r   r�   r   r!   r"   )r$   rÆ   s   "€r   r%   rO  é  s"   ø€ ÷ 4ñ 4™cð 4©Cð 4¹Cñ 4r   c                ó:   € V P                  VR4      ;'       g    T# )z3Return the emoji for a tool, or *default* if unset.rÀ   r_  )rØ   r�   r   s   &&&r   Ú	get_emojiÚToolRegistry.get_emojié  s   € à�z‰z˜$ Ó(×3Ð3¨GÐ3r   c                ó6   <€ V ^8„  d   QhRS[ S[S[3,          /# r    r°  )r$   rÆ   s   "€r   r%   rO  í  s   ø€ ÷ Qñ Q©©c±3¨h­ñ Qr   c                ót   € V P                  4        Uu/ uF  qP                  VP                  bK  	  up# u upi r   )r2  r�   r¹   )rØ   rY  s   & r   Úget_tool_to_toolset_mapÚ$ToolRegistry.get_tool_to_toolset_mapí  s0   € Ø7;×7MÑ7MÔ7OÓPÑ7O¨e—
‘
˜EŸM™MÒ)Ñ7OÑPÐPùÒPs   “5c                ó&   <€ V ^8„  d   QhRS[ RS[/# r¢  )r#   r@   )r$   rÆ   s   "€r   r%   rO  ð  s   ø€ ÷ Tñ T©Cð T±Dñ Tr   c                ó@   € V P                  WP                  4       4      # )zCTrue when a toolset has at least one exposable tool (never raises).)rƒ  r2  r§  s   &&r   Úis_toolset_availableÚ!ToolRegistry.is_toolset_availableð  s   € à×0Ñ0°×:PÑ:PÓ:RÓSÐSr   c                ó6   <€ V ^8„  d   QhRS[ S[S[3,          /# r    )r8   r#   r@   )r$   rÆ   s   "€r   r%   rO  õ  s   ø€ ÷ ;ñ ;©D±±d°­Oñ ;r   c                óž   € V P                  4       p\        V P                  V4      4       Uu/ uF  pW P                  W!4      bK  	  up# u upi r   )r2  rl   rZ  rƒ  )rØ   rU  r¹   s   &  r   Úcheck_toolset_requirementsÚ'ToolRegistry.check_toolset_requirementsõ  sS   € Ø×(Ñ(Ó*ˆô " $§-¡-°Ó"8Ô9ó;á9�ð ×6Ñ6°wÓHÒHÙ9ñ;ð 	;ùò ;s   ­A
c                ó6   <€ V ^8„  d   QhRS[ S[S[ 3,          /# r    r°  )r$   rÆ   s   "€r   r%   rO  û  s   ø€ ÷ 
ñ 
©©S±$¨Y­ñ 
r   c                óþ   € V P                  4       p/ pV P                  V4      P                  4        FB  w  r4RV P                  W14      RV Uu. uF  qUP                  NK  	  upRRR\        V4      /W#&   KD  	  V# u upi )z'Return toolset metadata for UI display.Ú	availablerw   r¿   rt   Úrequirements)r2  rZ  rø   rƒ  r�   Ú_unique_env)rØ   rU  r0  r¹   r‚  rY  s   &     r   Úget_available_toolsetsÚ#ToolRegistry.get_available_toolsetsû  s   € à×(Ñ(Ó*ˆØ$&ˆØ $§¡¨gÓ 6× <Ñ <Ö >ÑˆGà˜T×>Ñ>¸wÓPØ±'Ó:±'¨Ÿ*œ*±'Ñ:Ø˜rØ¤¨GÓ 4ð	!6ˆHÓñ !?ð ˆùò ;s   ÁA:c                ó6   <€ V ^8„  d   QhRS[ S[S[ 3,          /# r    r°  )r$   rÆ   s   "€r   r%   rO    s   ø€ ÷ ñ ©$©s±D¨y­/ñ r   c                ó  € V P                  4       w  r/ pV P                  V4      P                  4        FD  w  rERTR\        V4      RVP	                  V4      RRRV Uu. uF  qfP
                  NK  	  up/W4&   KF  	  V# u upi )zABuild a TOOLSET_REQUIREMENTS-compatible dict for backward compat.r�   Úenv_varsr¼   Ú	setup_urlNrw   )ru  rZ  rø   r{  r   r�   )rØ   rU  Útoolset_checksr/   r¹   r‚  rY  s   &      r   Úget_toolset_requirementsÚ%ToolRegistry.get_toolset_requirements  s†   € à"&×"6Ñ"6Ó"8ÑˆØ"$ˆØ $§¡¨gÓ 6× <Ñ <Ö >ÑˆGà˜ØœK¨Ó0Ø˜N×.Ñ.¨wÓ7Ø˜TØ±'Ó:±'¨Ÿ*œ*±'Ñ:ð<ˆF‹Oñ !?ð ˆùò ;s   ÁA>c                ó    <€ V ^8„  d   QhRS[ /# )r   r*  rÕ   )r$   rÆ   s   "€r   r%   rO    s   ø€ ÷ &ñ &©Tñ &r   c                ól  € . . r2V P                  4       pV P                  V4      p\        V4       Fz  pV P                  Wd4      '       d   VP	                  V4       K-  TP	                  RTRWV,          ^ ,          P
                  RWV,           Uu. uF  qwP                  NK  	  up/4       K|  	  W#3# u upi )zDReturn (available_toolsets, unavailable_info) like the old function.r�   r€  rw   )r2  rZ  rl   rƒ  r‹   r½   r�   )rØ   r*  ry  ÚunavailablerU  rX  ÚtsrY  s   &&      r   Úcheck_tool_availabilityÚ$ToolRegistry.check_tool_availability  s¥   € à!# R�;Ø×(Ñ(Ó*ˆØ—‘˜wÓ'ˆÜ˜–.ˆBØ×0Ñ0°×=Ò=Ø× Ñ  Ö$à×"Ñ"Ø˜B 
¨F­J°q­M×,FÑ,FØ°f¶jÓA±j¨UŸjœj±jÑAð$Cö Dñ	 !ð Ð%Ð%ùò Bs   ÂB1)rK  rJ  rE  rD  rC  rB  rG  rF  r   )
NNFrt   rt   NNFNN)F)u   âš¡)9rÈ   rÉ   rÊ   rË   rÌ   rÙ   ÚstaticmethodrQ  rZ  r_  re  rk  rp  ru  r2  rƒ  rŒ  rŠ  r–  r›  rŸ  r¨  r­  r²  r·  r½  rÁ  rÇ  rË  rÔ  rÑ  rÒ  rð  rõ  rú  r  rB   r  r  r&  r1  r<  rI  rM  rT  rZ  ra  re  ri  rm  rq  ru  r|  rƒ  r‰  rÎ   rÏ   rÐ   s   @r   r@  r@  Î  s–  ø‡ € ÙSò"ð  ÷!ó ð!ð ÷ó ðð1¸E÷ 1ò 1÷cð c÷ò ÷Rð R÷#ò #÷)ð )÷Uð Uðk¸T÷ kò kð

%ÐUY÷ 
%ò 
%ð/Ø37÷/ò /÷?ð ?÷(ð (÷`ð `÷	"ð 	"÷/ð /÷4ð 4ð
ØNR÷
ò 
ðOØ?C÷Oò OðàMQ÷ò ÷/ð /÷Fð Fð ÷Ró ðR÷(ð ÷9ð 9÷@ð @÷
Rð Rð
 ÷ó ð÷M"ò M"ð^84¸d÷ 84ò 84÷t&ð &ð$à#÷$ò $÷Pò ð@ ÷Só ðSð")Ø?C÷)ò )÷@9ð 9÷)ò )÷Hð H÷*ð *÷+ð +÷4ò 4÷Qð Q÷Tð T÷
;ð ;÷
ð 
÷ð ÷&÷ &ð &r   r@  c                óF   € V ^8„  d   QhR\         \        ,          R\         /# rT  rx  )r$   s   "r   r%   r%   #  s   € ÷ ñ œœi�ð ¬Tñ r   c                ó|   a€ . oV  F2  pSP                  V3R lVP                  ;'       g    .  4       4       K4  	  S# )zLUnion of ``requires_env`` across *entries*, first-seen order, no duplicates.c              3   ó8   <"  € T F  qS9  g   K  Vx € K  	  R # 5ir   r   )rV   rð   Úouts   & €r   rX   Ú_unique_env.<locals>.<genexpr>'  s   øé € ÐIÑ7˜ÀS¹L—1’1Ó7ùs   ƒ�
)Úextendr½   )rU  rY  r�  s   & @r   r{  r{  #  s:   ø€ à€CÛˆØ�
‰
ÔI˜u×1Ñ1×7Ð7°RÐ7ÓIÖIñ à€Jr   c                ó$   € V ^8„  d   QhR\         /# r    r"   )r$   s   "r   r%   r%   3  s   € ÷ _ñ _¤Cñ _r   c                ó^   € \         P                  ! R\        \        V 4      4      /VCRR7      # )uz   ``'{"error": "<message>", **extra}'`` â€” the error body is bounded so a raw
exception can't bloat history across retries.r1   Fr2   )r4   r9   r-   r#   )ÚmessageÚextras   &,r   r;  r;  3  s*   € ô �:Š:�wÔ 1´#°g³,Ó ?ÐIÀ5ÐIÐX]Ô^Ð^r   c                ó$   € V ^8„  d   QhR\         /# r    r"   )r$   s   "r   r%   r%   9  s   € ÷ Pñ P¬ñ Pr   c                óJ   € \         P                  ! V e	   V RR7      # TRR7      # )zDJSON-encode a dict positional arg *or* keyword arguments (not both).Fr2   )r4   r9   )r­   rF  s   &,r   Útool_resultr˜  9  s"   € ä�:Š:˜dÒ.�dÈÔOÐO°FÈÔOÐOr   c                ó<   € V ^8„  d   QhR\         R\        R\        /# )r   r»   rF  r!   )r   r8   )r$   s   "r   r%   r%   >  s&   € ÷ 
hñ 
h¤ð 
h´4ð 
h¼Dñ 
hr   c                ó$  €  \         P                  ! V 4      P                  p\
        ;QJ d*    R TP                  4        4       F  '       g   K   RM	  RM! R TP                  4        4       4      '       d   T# \         P                  P                  \         P                  P                  0pTP                  4        UUu/ uF(  w  rEYB9   g   K  Y$,          P                  T9   g   K&  YEbK*  	  upp#   \        \        3 d    Tu # i ; iu uppi )z—*kwargs* narrowed to what *handler*'s signature declares; everything when it takes ``**kwargs`` or
cannot be introspected (builtins, some C callables).c              3   ól   "  € T F*  qP                   \        P                  P                  J x € K,  	  R # 5ir   )ÚkindÚinspectÚ	ParameterÚVAR_KEYWORD)rV   Úps   & r   rX   Ú&_kwargs_accepted_by.<locals>.<genexpr>E  s%   é € Ð
PÑ<O°q�6‰6”W×&Ñ&×2Ñ2Õ2Ó<Oùs   ‚24TF)r�  Ú	signaturer  Ú	TypeErrorr6   r\   ro  rž  ÚPOSITIONAL_OR_KEYWORDÚKEYWORD_ONLYrø   rœ  )r»   rF  r  Úkeyword_kindsr  rð   s   &&    r   rC  rC  >  sÐ   € ðÜ×&Ò& wÓ/×:Ñ:ˆ
÷ ƒsÑ
P¸J×<MÑ<MÔ<OÓ
P‡s‡s‚sÑ
P¸J×<MÑ<MÔ<OÓ
P×PÒPØˆÜ×&Ñ&×<Ñ<¼g×>OÑ>O×>\Ñ>\Ð]€MØ#Ÿ\™\œ^Ôg™^‘T�Q¨q©ŒDÀ:Å=×CUÑCUÐYfÑCfŒDˆAŠD™^ÒgÐgøô ”zÐ"ô ØŠðüó
 hs#   ‚ C3 Ã
DÃDÃ)DÃ3D	ÄD	c                óh  € V ^8„  d   Qh/ ^ \         9   dH   \        \        \        \        \
        ,          3,          \        \        \        3,          3,          ;R&   ^\         9   d7   \        \        \        \        \
        ,          3,          \        3,          ;R&   ^\         9   d1   \        \        \        \        \
        ,          3,          ,          ;R&   ^\         9   d1   \        \        \        \        \
        ,          3,          ,          ;R&   ^\         9   d   \        \        ,          ;R&   # )r   rô   rö   r#  r$  rà   )	Ú__conditional_annotations__r8   rŠ   r   r	   r#   rÅ   r@   r   )r$   s   "r   r%   r%      s×   € ÷ ñ ÷L OÒ N””eœH¤h¬s¥mÐ3Õ4´e¼EÄ4¸KÕ6HÐHÕIÑ NñM÷N FÒ E”Tœ%¤¬(´3­-Ð 7Õ8¼%Ð?Õ@Ñ EñO÷P AÒ @”Sœœx¬´#­Ð6Õ7Õ8Ñ @ñQ÷R HÒ GœC¤¤h´¼µÐ&=Õ >Õ?Ñ GñS÷X +Ò *”Sœ•]Ñ *òYr   r   )ÚHERMES_SESSION_IDÚ HERMES_BROWSER_CONTROL_PRINCIPALÚ'HERMES_BROWSER_CONTROL_TRANSPORT_FAMILY)Pr¨  rÌ   r>   rÛ  r{   r�  r4   Úloggingrþ  rH  r  Údataclassesr   Ú
contextlibr   Úcontextvarsr   Úpathlibr   Útypingr   r   r   r	   r
   r¤   r   r   Ú	getLoggerrÈ   r)   r   r   r   r   r(   r,   r+   r-   r;   rL   rf   rn   rž   r¥   r€   r�   r·   rÒ   r  rõ   r÷   rú   rô   rö   r   r#  r$  ÚLockr!  r  rà   r  rã   rè   r   r  r  r,  r"  r7  r;  r>  r@  r{  rC   r;  r˜  rC  r%   )r¨  s   @r   Ú<module>r´     s·  øðöó Û Û Û Û Û Û 
Û Û Ý !Ý %Ý "Ý ß 6Õ 6ç =à	×	Ò	˜8Ó	$€á Ð!5¸tÔDÐ ð ñ)ó ð)ò%ò6ð Ð Ø 1Ð àÐ õHõ3õ"Nõõ$÷6õrõ
õMñ ˆe˜4Ô ÷+ð +ó !ð+÷&%ñ %ð5ð ð Ð ð #'Ð ØÐ ØLN€Ó NØCEÐ Ó EÙ;>»5Ð Ó @ÙBEÃ%Ð Ó GØ —~’~Ó'Ð ØÐ Ù%(£UÐ Ó *ð/Ð õõ+õ	)õ%õ>õ><õ~aõõ+õ
a÷R	&ñ R	&õjñ ‹>€õ_÷P÷

hr   