+
    lHàj~  ã                  ó  € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RI	H
t
 ^ RIHtHtHtHtHtHt ^ RIHt ^ RIHt ^ RIHtHt ^ R	IHtHtHtHt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*H+t+H,t,H-t- ^ RI.H/t/H0t0 ^ RI1H2t2H3t3H4t4H5t5 ]Pl                  ! R4      t7^t8^
t9]
! RR7       ! R R4      4       t:RRRRRRRRRRRR/t;R R lt<R R lt=R R lt>R  R! lt?]P€                  ! ]?R"4      tA]P€                  ! ]?R#4      tBR$ R% ltC]]Pˆ                  ! 4       ,          tE]F! ]R&,          R',          R(,          4      tGRdR) R* lltHR+ R, ltIR- R. ltJRdR/ R0 lltKR1 R2 ltLR3 R4 ltMR5R6/R7 R8 lltNR9 R: ltOR; R< ltPR=tQReR> R? lltRRfR@ RA lltS]
 ! RB RC4      4       tTRDRRER/RF RG lltURH RI ltVRgRJ RK lltWRL RM ltXRN RO ltYRP RQ ltZRERRRRRSR/RT RU llt[RVR/RW RX llt\RERRYRRSR/RZ R[ llt]R\ R] lt^R^ R_ lt_R` Ra lt`RdRb Rc llta. RhOtbR# )iuv  Progressive tool disclosure ("tool search"): MCP/plugin tools and a curated set of
event-triggered core tools are replaced in the model-visible array by three bridge tools â€”
tool_search / tool_describe / tool_call. Invariants: core tools (``toolsets._HERMES_CORE_TOOLS``)
and session-gated GUI toolsets never defer unless named in ``defer``; ANY deferrable tool
activates the bridge (the listing scales with budget, not activation); the catalog is
stateless â€” rebuilt from the live tool-defs every assembly (a session-keyed one drifts and
silently drops tools); bridge calls route through ``model_tools.handle_function_call``.)ÚannotationsN)ÚCounter)Ú	dataclass)ÚAnyÚDictÚIterableÚListÚOptionalÚTuple)ÚDEFAULT_CONFIG)Ú
tool_error)ÚCLIENT_SURFACE_TOOLSETSÚTOOLSET_SESSION_PLATFORMS)ÚBRIDGE_TOOL_NAMESÚCHARS_PER_TOKENÚTOOL_CALL_NAMEÚTOOL_DESCRIBE_NAMEÚTOOL_SEARCH_NAMEÚCatalogEntryÚ_fnÚ_listing_group_labelÚ_registry_entryÚ_registry_toolsetÚbuild_catalogÚbuild_catalog_listing_with_formÚsearch_catalog)Úlocal_batch_errorÚnormalize_tool_call_entriesÚnot_deferrable_errorÚsession_unavailable_errorÚunavailable_in_session_reasonÚvalidate_deferred_call_args)ÚCONNECTOR_BATCH_SENTINELÚis_connector_name)Úconnections_in_scopeÚconnector_entries_by_groupÚconnectors_unavailableÚremote_schemas_forztools.tool_searchT)Úfrozenc                  óš   € ] tR t^*t$ RtR]R&   R]R&   R]R&   R]R&   R	tR]R
&   RtR]R&   RtR]R&   ]	R R l4       t
]R R l4       tRtR# )ÚToolSearchConfigzDResolved, validated tool-search configuration for a single assembly.ÚstrÚenabledÚfloatÚthreshold_pctÚintÚsearch_default_limitÚmax_search_limitÚautoÚlistingé   Úlisting_max_tokensNúOptional[frozenset]Údefer_toolsc               ó   € V ^8„  d   QhRR/# )é   ÚreturnÚ	frozenset© )Úformats   "Ú6/home/ubuntu/.hermes/hermes-agent/tools/tool_search.pyÚ__annotate__ÚToolSearchConfig.__annotate__9   s   € ÷ Yñ Y yñ Yó    c                	óB   € V P                   f   \        # V P                   # ©N)r7   Ú_DEFAULT_DEFERRED_TOOLS)Úselfs   &r>   Úeffective_defer_toolsÚ&ToolSearchConfig.effective_defer_tools8   s   € à*.×*:Ñ*:Ò*BÔ&ÐXÈ×HXÑHXÐXrA   c               ó    € V ^8„  d   QhRRRR/# )r9   Úrawr   r:   r*   r<   )r=   s   "r>   r?   r@   =   s   € ÷ Rñ R˜3ð RÐ#3ñ RrA   c                óÔ  € \        V\        4      '       g   RVRJ d   RMR/p\        VP                  R4      ^^^24      pVP                  R4      pVe:   \        V\        \
        \        34      '       g   \        P                  RV4       RpT ! \        VP                  RR4      4      \        R	\        R
\        VP                  R4      R4      4      4      \        VP                  R4      ^^V4      T\        VP                  RR4      4      \        VP                  R4      R^ÈR4      \        V\        \
        \        34      '       d   \        R V 4       4      R7      # RR7      # )uœ   Build from a raw dict / legacy bool / None; every field is clamped and unknown
values fall back to safe defaults â€” a config typo must not break the agent.r,   FÚoffr2   r1   ÚdeferNzžtools.tool_search.defer is %r, expected a YAML list of tool names (e.g. [todo_list, computer_use]; [] keeps every tool eager) - using the curated default set.g        ç      Y@r.   g      @r0   r3   r5   r4   i`ê  c              3  ó–   "  € T F?  p\        V4      P                  4       '       g   K$  \        V4      P                  4       x € KA  	  R # 5irC   )r+   Ústrip©Ú.0Úns   & r>   Ú	<genexpr>Ú,ToolSearchConfig.from_raw.<locals>.<genexpr>T   s*   é € Ð"W¹9°aÌÈAËÏÉÏ¤>¤3 q£6§<¡<§> >»9ùs
   ‚!A	¨!A	)r,   r.   r0   r1   r3   r5   r7   )Ú
isinstanceÚdictÚ_clamped_intÚgetÚlistÚtupleÚsetÚloggerÚwarningÚ
_tri_stateÚmaxÚminÚ_safe_floatr;   )ÚclsrI   r1   Ú	defer_raws   &&  r>   Úfrom_rawÚToolSearchConfig.from_raw<   sJ  € ô ˜#œt×$Ò$Ø s¨e£|™e¸Ð@ˆCÜ'¨¯©Ð0BÓ(CÀRÈÈBÓOÐØ—G‘G˜GÓ$ˆ	ØÒ ¬°IÄÄeÌSÐ?Q×)RÒ)Rô �N‰Nð1à2;ô=ð ˆIÙÜ˜sŸw™w y°&Ó9Ó:Ü˜c¤3 u¬k¸#¿'¹'À/Ó:RÐTWÓ.XÓ#YÓZÜ!-Ø—‘Ð.Ó/°°AÐ7Gó"Ià-Ü˜sŸw™w y°&Ó9Ó:Ü+¨C¯G©GÐ4HÓ,IÈ4ÐQTÐV[Ó\ä& y´4¼ÄÐ2D×EÒEô #Ñ"W¹9Ó"WÓWô	Rð 		Rð LPô	Rð 		RrA   r<   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__annotations__r3   r5   r7   ÚpropertyrF   Úclassmethodrd   Ú__static_attributes__r<   rA   r>   r*   r*   *   sh   ‡ áNØƒLð ÓØÓØÓØ€GˆSÓØ"Ð˜Ó"à'+€KÐ$Ó+àôYó ðYð ôRó ôRrA   r*   ÚtrueÚonÚ1ÚyesÚfalserK   Ú0Únoc               ó    € V ^8„  d   QhRRRR/# )r9   Úvaluer   r:   r+   r<   )r=   s   "r>   r?   r?   [   s   € ÷ [ñ [�cð [˜cñ [rA   c                ó”   € \        V 4      P                  4       P                  4       p\        P	                  YR9   d   V4      # R4      # )zINormalize an ``auto``/``on``/``off`` setting (bool-ish aliases accepted).r2   )r2   rp   rK   )r+   rO   ÚlowerÚ_TRI_STATE_ALIASESrX   )rw   Útexts   & r>   r^   r^   [   s?   € äˆu‹:×ÑÓ×#Ñ#Ó%€DÜ×!Ñ! $Ð8MÔ0M¨ÓZÐZÐSYÓZÐZrA   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )r9   rw   r   Úfallbackr/   ÚloÚhir:   r<   )r=   s   "r>   r?   r?   a   s/   € ÷ #ñ #˜ð # sð #°ð #¸ð #Àñ #rA   c                óv   €  \        V 4      p \        V\	        W04      4      #   \        \        3 d    Tp  L*i ; i)zJ``int(value)`` (or ``fallback`` when unparseable) clamped to ``[lo, hi]``.)r/   Ú	TypeErrorÚ
ValueErrorr_   r`   )rw   r}   r~   r   s   &&&&r>   rW   rW   a   s>   € ðÜ�E“
ˆô ˆr”3�r“>Ó"Ð"øô ”zÐ"ô ØŠðús   ‚" ¢8·8c               ó$   € V ^8„  d   QhRRRRRR/# )r9   rw   r   r}   r-   r:   r<   )r=   s   "r>   r?   r?   j   s!   € ÷ ñ �sð  eð °ñ rA   c                óL   €  \        V 4      #   \        \        3 d    Tu # i ; irC   )r-   r�   r‚   )rw   r}   s   &&r>   ra   ra   j   s*   € ðÜ�U‹|ÐøÜ”zÐ"ô ØŠðús   ‚
 �#¢#c               ó    € V ^8„  d   QhRRRR/# )r9   Úloader_namer+   r:   r*   r<   )r=   s   "r>   r?   r?   q   s   € ÷ 	/ñ 	/ Sð 	/Ð-=ñ 	/rA   c                ód  €  ^ RI Hp \        W4      ! 4       ;'       g    / P                  R4      p\	        V\
        4      '       d   TM/ p\        P                  VP                  R4      4      #   \         d6   p\        P                  RT4       \        P                  R4      u Rp?# Rp?ii ; i)zUTool-search config via ``hermes_cli.config.<loader_name>`` (defaults on any failure).NÚtoolsÚtool_searchz%Failed to load tool-search config: %s)Úhermes_cli.configÚconfigÚgetattrrX   rU   rV   r*   rd   Ú	Exceptionr\   Údebug)r†   Ú_cfg_modÚ	tools_cfgÚes   &   r>   Ú_config_from_loaderr’   q   s‡   € ð/Ý,Ü˜XÔ3Ó5×;Ð;¸×@Ñ@ÀÓIˆ	Ü!+¨I´t×!<Ò!<‘IÀ"ˆ	Ü×(Ñ(¨¯©°}Ó)EÓFÐFøÜô /Ü�‰Ð<¸aÔ@Ü×(Ñ(¨Ó.Õ.ûð/ús#   ‚A/ ŸAA/ Á/B/Á:*B*Â$B/Â*B/Úload_configÚload_config_readonlyc               ó   € V ^8„  d   QhRR/# )r9   r:   úfrozenset[str]r<   )r=   s   "r>   r?   r?   �   s   € ÷ ñ ˜.ñ rA   c                 ó\   €  ^ RI Hp  \        V 4      #   \         d    \        4       u # i ; i)zRNames that never defer by default (lazy: ``toolsets`` imports ``tools.registry``).©Ú_HERMES_CORE_TOOLS)Útoolsetsr™   r;   r�   r˜   s    r>   Ú_core_tool_namesr›   �   s-   € ðÝ/ÜÐ+Ó,Ð,øÜô Ü‹{Òðús   ‚ “+ª+rˆ   r‰   rL   c               ó$   € V ^8„  d   QhRRRRRR/# )r9   Únamer+   r7   r6   r:   Úboolr<   )r=   s   "r>   r?   r?   –   s(   € ÷ Oñ O #ð OÐ4Gð OÐSWñ OrA   c                óÈ   € V \         9   d   R# Ve	   W9   d   R# V \        4       9   d   R# \        V 4      pVRJ;'       d#    VP                  R4      ;'       g
    V\        9  # )zÓTrue if a tool is *eligible* for deferral: named in ``defer_tools`` (curated set or
user override), OR an MCP tool, OR neither core nor a session-gated GUI surface (i.e. a
plugin tool). Bridge names never defer.FNTzmcp-)r   r›   r   Ú
startswithÚ_DIRECT_SURFACE_TOOLSETS)r�   r7   Útoolsets   && r>   Úis_deferrable_tool_namer£   –   sm   € ð Ô Ô ÙØÒ 4Ô#6ÙØÔÓ!Ô!ÙÜ Ó%€GØ˜$Ð÷ Oð OØ×Ñ˜6Ó"×MÐM gÔ5MÑ&MðOrA   c               ó    € V ^8„  d   QhRRRR/# )r9   Ú	tool_defsúIterable[dict[str, Any]]r:   zIterable[str]r<   )r=   s   "r>   r?   r?   ¥   s   € ÷ 9ñ 9Ð7ð 9¸Mñ 9rA   c                ó   € R V  4       # )z?Function names of a tool-defs list (``""`` for a nameless def).c              3  óX   "  € T F   p\        V4      P                  R R4      x € K"  	  R# 5i)r�   Ú N)r   rX   )rQ   Útds   & r>   rS   Ú"_tool_def_names.<locals>.<genexpr>§   s"   é € Ð8©i¨ŒC�‹G�K‰K˜ ×#Ð#«iùs   ‚(*r<   ©r¥   s   &r>   Ú_tool_def_namesr­   ¥   s   € á8©iÓ8Ð8rA   c               ó    € V ^8„  d   QhRRRR/# )r9   r¥   r¦   r:   r–   r<   )r=   s   "r>   r?   r?   ª   s   € ÷ Añ AÐ":ð A¸~ñ ArA   c                ó8   € \        R \        V 4       4       4      # )uõ   Every tool name in the session's ``tool_defs`` â€” what this session can actually
reach. Public wrapper over the private name extractor so callers outside this module
(the ``model_tools`` dispatcher) can scope error messages to the real session.c              3  ó8   "  € T F  q'       g   K  Vx € K  	  R # 5irC   r<   rP   s   & r>   rS   Ú%session_tool_names.<locals>.<genexpr>®   s   é € Ð@Ñ :˜1»a—Q’QÓ :ùs   ‚	�
)r;   r­   r¬   s   &r>   Úsession_tool_namesr²   ª   s   € ô Ñ@¤°	Ô :Ó@Ó@Ð@rA   c               ó$   € V ^8„  d   QhRRRRRR/# )r9   r¥   úlist[dict[str, Any]]r7   r6   r:   z1tuple[list[dict[str, Any]], list[dict[str, Any]]]r<   )r=   s   "r>   r?   r?   ±   s$   € ÷ 	ñ 	Ð2ð 	ÐATð 	ØIñ	rA   c                ó®   € . p. p\        V \        V 4      4       F6  w  rEV\        9  g   K  \        WQ4      '       d   TMTP	                  V4       K8  	  W#3# )zlSplit a tool-defs list into (visible, deferrable); bridge tools are dropped (re-added
after classification).)Úzipr­   r   r£   Úappend)r¥   r7   ÚvisibleÚ
deferrablerª   r�   s   &&    r>   Úclassify_toolsrº   ±   sU   € ð %'€GØ')€JÜ˜	¤?°9Ó#=Ö>‰ˆØÔ(Ö(Ü2°4×EÒE‰ZÈ7×ZÑZÐ[]Ö^ñ ?ð ÐÐrA   c               ó    € V ^8„  d   QhRRRR/# )r9   r¥   r´   r:   r<   )r=   s   "r>   r?   r?   ½   s    € ÷ Vñ VÐ2ð VÐ7Kñ VrA   c                óL   € \        V \        4       P                  4      ^,          # )zPDeferrable subset of pre-assembly ``tool_defs`` under the read-only user config.)rº   r”   rF   r¬   s   &r>   Ú_deferrable_inr½   ½   s   € ä˜)Ô%9Ó%;×%QÑ%QÓRÐSTÕUÐUrA   c               ó    € V ^8„  d   QhRRRR/# )r9   r¥   r¦   r:   r/   r<   )r=   s   "r>   r?   r?   Â   s   € ÷ Dñ DÐ,Dð DÈñ DrA   c                ót   € R R lp\         P                  ! \        \        W4      4      \        ,          4      # )zHToken cost via the chars/4 rule (order-of-magnitude precision suffices).c               ó    € V ^8„  d   QhRRRR/# )r9   rª   údict[str, Any]r:   r/   r<   )r=   s   "r>   r?   Ú2estimate_tokens_from_schemas.<locals>.__annotate__Ä   s   € ÷  ñ  �>ð   cñ  rA   c                óž   €  \        \        P                  ! V R RR7      4      #   \        \        3 d    \        \        T 4      4      u # i ; i)F)Úensure_asciiÚ
separators)Ú,Ú:)ÚlenÚjsonÚdumpsr�   r‚   r+   )rª   s   &r>   Ú_charsÚ,estimate_tokens_from_schemas.<locals>._charsÄ   sA   € ð	 Ü”t—z’z "°5ÀZÔPÓQÐQøÜœ:Ð&ô 	 Ü”s˜2“w“<Òð	 ús   ‚!$ ¤%AÁA)ÚmathÚceilÚsumÚmapr   )r¥   rË   s   & r>   Úestimate_tokens_from_schemasrÑ   Â   s'   € õ ô
 �9Š9”Sœ˜VÓ/Ó0´?ÕBÓCÐCrA   Úconnections_grantedFc          
     ó,   € V ^8„  d   QhRRRRRRRRR	R/# )
r9   r‹   r*   Údeferrable_tokensr/   Úcontext_lengthúOptional[int]rÒ   rž   r:   r<   )r=   s   "r>   r?   r?   Ì   s3   € ÷ 	ñ 	Ð,ð 	Àð 	Ø$1ð	ØKOð	Ø\`ñ	rA   c               ó>   € V P                   R8X  d   R# V^ 8”  d   R# V# )uõ   ``"off"`` never activates; ``"on"``/``"auto"`` activate whenever any deferrable tool
exists ("auto" is reserved for a future budget-gated mode â€” do not distinguish them
without that design). ``context_length`` is kept for caller compatibility.rK   FT)r,   )r‹   rÔ   rÕ   rÒ   s   &&&$r>   Úshould_activaterØ   Ì   s$   € ð
 ‡~�~˜ÔÙØ˜1ÔÙØÐrA   c               ó$   € V ^8„  d   QhRRRRRR/# )r9   r‹   r*   rÕ   rÖ   r:   r/   r<   )r=   s   "r>   r?   r?   Ø   s#   € ÷ ;ñ ;Ð!1ð ;À=ð ;ÐUXñ ;rA   c                ó¨   € V'       d*   V^ 8”  d#   \        WP                  R,          ,          4      MRp\        ^ \        V P                  V4      4      # )z€``min(listing_max_tokens, threshold_pct% of context)``; unknown context uses a 10K
percentage leg (5% of a typical 200K window).rM   i'  )r/   r.   r_   r`   r5   )r‹   rÕ   Úpct_legs   && r>   Úlisting_token_budgetrÜ   Ø   sH   € ÷ ! ^°aÔ%7ô �>×%9Ñ%9¸EÕ%AÕBÔCØ=Cð äˆq”#�f×/Ñ/°Ó9Ó:Ð:rA   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r9   r�   r+   ÚdescriptionÚ
propertiesrÁ   Úrequiredz	list[str]r:   r<   )r=   s   "r>   r?   r?   à   s8   € ÷ [ñ [˜ð [¨3ð [¸Nð [Ø&ð[Ø+9ñ[rA   c                ó&   € RRRRV RVRRRRVRV///# )	zIOne OpenAI-style function schema (key order is part of the frozen bytes).ÚtypeÚfunctionr�   rÞ   Ú
parametersÚobjectrß   rà   r<   )r�   rÞ   rß   rà   s   &&&&r>   Ú_bridge_schemaræ   à   s8   € ð �J 
Ø��m [Ø�v˜x¨°zÀ:ÈxÐXð-Zð [ð [rA   z† `connectors__` names are tools of the user's app accounts (Gmail, Linear, ...); `manage_connections` checks or authorizes an account.c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R/# )
r9   Údeferred_countr/   r3   úOptional[str]Úlisting_formr+   rÒ   rž   r:   r<   )r=   s   "r>   r?   r?   í   s2   € ÷ #ñ #¨ð #°mð #ÐSVð #Ø-1ð#Ø>Añ#rA   c                ó,  € V '       d   RV  R2MRR\          R\         R2,           V'       d   \        MR,           pV'       g   V# VR8X  d   VR	V,           ,           # VR
\          R2,          pVR8X  d   VR\         R2,          pVR,           V,           # )a  tool_search bridge description with the listing embedded (framing per ``listing_form``).
``connections_granted`` adds the one sentence that ties ``connectors__`` names to
``manage_connections``; without that tool in the session the sentence would name a tool
the model cannot call.zSearch z- additional tools that are loaded on demand. zLSearch remote connector tools (email, calendars, issue trackers, and more). zdSend one keyword query per capability you need; returns matching tool names and descriptions. Then `z` loads schemas and `z:` invokes. Tools already in your tool list need no search.r©   Úgroupsu  

The servers below are connected and their tools ARE available through this bridge. For any request in these domains, search here FIRST â€” do not claim the capability is unavailable and do not substitute a generic tool (terminal/browser) without searching.

zQ

Every tool listed below exists: never call it unavailable, and go straight to `z` when you see the exact name.ÚmixeduP    For servers marked 'names not listed', the tools exist too â€” find them with `z(` before concluding anything is missing.z

)r   r   Ú_CONNECTIONS_HINTr   )rè   r3   rê   rÒ   Údescs   &&&& r>   Ú_search_descriptionrð   í   sÜ   € ÷ ð �>Ð"Ð"OÑ	PØ nð#Ü#5Ð"6Ð6KÌNÐK[ð \CðCõ	C÷
 !4Õ¸õ	=ð 	÷ ØˆØ�xÔØðð  'õ	'õ(ð 	(ð 	ð	ÜÐÐ=ð	?õ@€Dð �wÔØð'Ü'7Ð&8ð 9.ð.õ	/ˆð �&�=˜7Õ"Ð"rA   c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# )r9   rè   r/   r3   ré   rê   r+   rÒ   rž   r:   r´   r<   )r=   s   "r>   r?   r?     s2   € ÷ 9ñ 9¨ð 9°mð 9Ø&)ð9ØEIð9ØVjñ9rA   c                ó   € \        \        \        WW#4      RRRRRR/RR/RRR	RR
//R.4      \        \        R\         R\         R2RRRRRR/RR//R.4      \        \        R\         R2RRRRRRRRRRRR/RRRRR//RRR./RR//R.4      .# )uÿ   Bridge tool schemas injected in place of deferred tools; kept short â€” every byte is paid
every turn. ``listing`` is embedded in the tool_search description; per-tool forms say
"skip search when you see the exact name", "groups" says search is mandatory.Úqueriesrâ   ÚarrayÚitemsÚstringrÞ   z¹One query per capability: service + action + object keywords (e.g. ['gmail send email', 'github create issue']), never a question; every word must match tool text. Searched in parallel.ÚlimitÚintegerz"Max matches per query (default 5).z2Load the full JSON schemas for tools returned by `z`. Required before `zP` if a tool's parameters are unknown. Batch every schema you need into one call.ÚnameszcExact tool names (as returned by tool_search). A single string is accepted and treated as one name.z²Invoke deferred tools: `calls` is an array of {name, arguments}, one entry per invocation (batch independent calls; results come back in order). Arguments match the schema from `z&`; approvals and hooks apply as usual.Úcallsrå   rß   r�   zExact tool name to invoke.Ú	argumentsz#Arguments matching the tool schema.rà   z2One or more independent deferred tool invocations.)ræ   r   rð   r   r   )rè   r3   rê   rÒ   s   &&&&r>   Úbridge_tool_schemasrü     sA  € ô 	ÜÜ ¸Ó[àØ˜GØ˜f hÐ/Ø!ð  $_ðð
 Ø˜IØ!Ð#Gðð
ð ˆKó	
ô  	ÜØ@ÔAQÐ@Rð S Ü .Ð/ð 09ð9ð Ø˜GØ˜f hÐ/Ø!ð  $Iððð ˆIó	
ô 	Üð ä 2Ð3Ð3Yð[ð Ø˜GØØ Ø$Ø" V¨X°}ÐFbÐ$cØ'¨&°(¸MÐKpÐ)qð'ð # V¨[Ð$9ðð "Ð#Wððð ˆIó'	
ð?4ð 4rA   c                  óv   € ] tR tRt$ RtR]R&   R]R&   ^ tR]R&   ^ tR]R	&   ^ tR]R
&   ^ t	R]R&   Rt
R]R&   RtR# )ÚAssemblyResultiJ  z2Outcome of one assembly (tests and observability).r´   r¥   rž   Ú	activatedr/   rè   Údeferred_tokensÚthreshold_tokensÚtierÚnoner+   rê   r<   N)rf   rg   rh   ri   rj   rk   rè   r   r  r  rê   rn   r<   rA   r>   rþ   rþ   J  sB   ‡ á<Ø#Ó#ØƒOØ€N�CÓØ€O�SÓØÐ�cÓà€Dˆ#ƒMØ€L�#×rA   rþ   rÕ   r‹   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r9   r¥   r´   rÕ   rÖ   r‹   úOptional[ToolSearchConfig]r:   rþ   r<   )r=   s   "r>   r?   r?   W  s+   € ÷ #.ñ #.Ð"6ð #.È=ð #.Ø9ð#.ØESñ#.rA   c               ón  € T;'       g    \        4       p\        V \        V 4      4       UUu. uF  w  r4V\        9  g   K  VNK  	  ppp\	        WRP
                  4      w  rg\        V4      pV'       gB   \        V^ WR7      '       d!   \        V\        ^ VR7      ,           R^R7      # \        VRR7      # \        V4      p	\        W)V4      '       gF   \        TR\        V4      T	\        T;'       g    ^ VP                  R,          ,          4      ^ R7      # RR	rº\        W!4      pVP                  R
8w  d   \!        W|R7      w  r«\        \        V4      W«VR7      pVR9   d   ^M^p\"        P%                  RV\        V4      \        V4      W›V4       \        Wm,           R\        V4      WœWëR7      # u uppi )u­   Tool-defs the model should see: passthrough when inactive, else deferrable tools
replaced by the three bridge tools. Idempotent â€” existing bridge tools are stripped first.)rÒ   T)r¥   rÿ   r  F)r¥   rÿ   rM   )r¥   rÿ   rè   r   r  r  Nr  rK   )Ú
max_tokens)r3   rê   rÒ   zutool_search activated (tier %d): %d core/visible tools kept, %d deferred (~%d tokens), listing %s (budget ~%d tokens))r¥   rÿ   rè   r   r  r  rê   )Úfullrù   rí   )r“   r¶   r­   r   rº   rF   r$   rØ   rþ   rü   rÑ   rÈ   r/   r.   rÜ   r3   r   r\   Úinfo)r¥   rÕ   r‹   rª   r�   Úincomingr¸   r¹   rÒ   rÔ   r3   rê   Úlisting_budgetÚbridger  s   &$$            r>   Úassemble_tool_defsr  W  s£  € ð ×$Ð$”{“}€FÜ#& y´/À)Ó2LÔ#Mô 2Ñ#M‘x�rØÔ0Ñ0÷ �Ñ#M€Hñ 2ä(¨×3OÑ3OÓPÑ€GÜ.¨xÓ8ÐßÜ˜6 1 n×^Ó^Ü!¨HÔ7JÈ1ÐbuÔ7vÕ,vØ,0°qô:ð :ä¨¸EÔBÐBÜ4°ZÓ@ÐÜ˜6°n×EÒEÜØ¨%ÄÀJÃØ-Ü  .×"5Ð"5°A¸&×:NÑ:NÐQVÕ:VÕ!WÓXÐ_`ôbð 	bð ! &ˆ\Ü)¨&ÓA€NØ‡~�~˜ÔÜ ?Øô!3Ñˆä ¤ Z£¸'Ø5HôJ€FàÐ :Ô:‰1À€DÜ
‡K�Kð	7àŒc�'‹lœC 
›OÐ->Ènô^ô ØÕ"¨dÄ3ÀzÃ?Ø)Øô.ð .ùó72s   ­F1ÁF1c               ó    € V ^8„  d   QhRRRR/# )r9   r�   r+   r:   rž   r<   )r=   s   "r>   r?   r?   }  s   € ÷ %ñ %˜ð % ñ %rA   c                ó   € V \         9   # rC   )r   ©r�   s   &r>   Úis_bridge_toolr  }  s   € ØÔ$Ñ$Ð$rA   c               ó$   € V ^8„  d   QhRRRRRR/# )r9   r{   r+   Úcapr/   r:   r<   )r=   s   "r>   r?   r?   �  s!   € ÷ <ñ <˜Cð < cð <°Cñ <rA   c                ó>   € \        V 4      V8:  d   V # V RV R,           # )u\  Cap a record description, marking the cut so it reads as deliberate.

A bare slice ends mid-word ("apply exponential bac") and looks like
corruption; the ellipsis says "there is more â€” tool_describe has it".
500 keeps 9 in 10 vendor connector descriptions whole and every first
sentence (measured p90 575, first-sentence max 329 over 353 tools).
Nu   â€¦)rÈ   )r{   r  s   &&r>   Ú_clip_descriptionr  �  s%   € ô �t“9 Ô#ˆ4Ð;¨¨d¨s¨°eÕ);Ð;rA   c               ó    € V ^8„  d   QhRRRR/# )r9   Úentryr   r:   rÁ   r<   )r=   s   "r>   r?   r?   Œ  s   € ÷ 
6ñ 
6˜|ð 
6°ñ 
6rA   c                óž  €  V P                   R,          R,          R,          pRV P                  RV P
                  R\        V P                  ;'       g    R4      R\        V\        4      '       d   TM.  Uu. uF$  p\        V\        4      '       g   K  VR,          NK&  	  upR	,          /#   \        \        \        3 d    . p L£i ; iu upi )
z§One record for the shared ``tools`` map (per-query groups carry names only);
``required`` lets the model attempt a trivial call without a ``tool_describe`` round-trip.rã   rä   rà   ÚsourceÚsource_namerÞ   r©   :Né@   N:Né    N)Úschemar�   ÚKeyErrorÚAttributeErrorr  r  r  rÞ   rU   rY   r+   )r  rà   Úrs   &  r>   Ú_shared_tool_recordr!  Œ  sÁ   € ðØ—<‘< 
Õ+¨LÕ9¸*ÕEˆð �e—l‘l M°5×3DÑ3DØÔ,¨U×->Ñ->×-DÐ-DÀ"ÓEØ´jÀÌ4×6PÒ6P©(ÐVXÐ*Xó 0Ñ*X AÜ& q¬#×.ô  ˜˜3Ÿ˜Ñ*Xñ 0Ø03õ5ð6ð 6øô ”x¤Ð0ô ØŠðüò0s   ‚!B, Á7C
ÂC
Â,CÃCc               ó    € V ^8„  d   QhRRRR/# )r9   Úcatalogzlist[CatalogEntry]r:   r´   r<   )r=   s   "r>   r?   r?   ™  s    € ÷ Qñ QÐ'9ð QÐ>Rñ QrA   c                ó¶   € ^ RI Hp \        R V  4       4      p\        V4       Uu. uF  pRVRW#,          /NK  	  pp\        WA! 4       ,           R R7      # u upi )zFDeterministic summaries of connected and declared unavailable sources.)Úhidden_declared_sourcesc              3  óL   "  € T F  p\        VP                  4      x € K  	  R # 5irC   )r   r  )rQ   r  s   & r>   rS   Ú,_available_source_summary.<locals>.<genexpr>�  s   é € ÐRÉ'ÀÔ)¨%×*;Ñ*;×<Ð<Ë'ùs   ‚"$r�   Ú
tool_countc                ó   € V R ,          # r  r<   )Úrows   &r>   Ú<lambda>Ú+_available_source_summary.<locals>.<lambda>Ÿ  s   € ÀCÈÆKrA   )Úkey)Útools.tool_search_catalogr%  r   Úsorted)r#  r%  Úcountsr�   Úrowss   &    r>   Ú_available_source_summaryr2  ™  sU   € åAäÑRÉ'ÓRÓR€FÜCIÈ&Ä>ÓRÁ>¸4ˆV�T˜<¨­Ó6Á>€DÐRÜ�$Ð0Ó2Õ2Ñ8OÔPÐPùò Ss   ¦Ac               ó0   € V ^8„  d   QhRRRRRRRRR	RR
R/# )r9   ÚargsrÁ   r-  r+   Údeduperž   Ú	max_itemsr/   Ú
retry_hintr:   z)tuple[Optional[list[str]], Optional[str]]r<   )r=   s   "r>   r?   r?   ¢  s9   € ÷ ñ ˜>ð °ð Àð ÐQTð Ø!$ðØ)RñrA   c               óô  € V P                  V4      p\        V\        4      '       d   V.MTp\        V\        4      '       g   R\	        V R24      3# . pV FQ  p\        T;'       g    R4      P                  4       pV'       g   K0  V'       d	   W†9  g   K@  VP                  V4       KS  	  V'       g   R\	        V R24      3# \        V4      V8”  d#   R\	        RV R\        V4       RV RV 24      3# VR3# )	z¯Read a list-of-strings bridge argument -> ``(items, error_json)``. A bare string (a
common model slip) is a one-item list; rejects non-lists, all-blank lists, > ``max_items``.Nz, is required and must be an array of stringsr©   z; is required and must contain at least one non-empty stringz	too many z: z > max z. )rX   rU   r+   rY   r   rO   r·   rÈ   )	r4  r-  r5  r6  r7  rI   ÚoutÚitemr{   s	   &&$$$    r>   Ú_string_list_argr;  ¢  së   € ð �(‰(�3‹-€CÜ˜c¤3×'Ò'ˆ3‰%¨S€CÜ�cœ4× Ò Ø”Z 3 %Ð'SÐ TÓUÐUÐUØ€CÛˆÜ�4—:�:˜2‹×$Ñ$Ó&ˆß‰4Ÿ 4¦?Ø�J‰J�tÖñ ÷ Ø”Z 3 %Ð'bÐ cÓdÐdÐdÜ
ˆ3ƒx�)ÔØ”Z )¨C¨5°´3°s³8°*¸GÀIÀ;ÈbÐQ[ÐP\Ð ]Ó^Ð^Ð^Ø�ˆ9ÐrA   Úconnector_searchÚcallc               ó0   € V ^8„  d   QhRRRRRRRRR	RR
R/# )r9   r4  rÁ   Úcurrent_tool_defsr´   r‹   r  r<  úOptional[Any]r=  r:   r+   r<   )r=   s   "r>   r?   r?   ¶  s;   € ÷ +3ñ +3˜~ð +3ÐEYð +3Ø!;ð+3à+8ð+3àGTð+3à`cñ+3rA   c               ó0  € T;'       g    \        4       p\        V R R\        RR7      w  rVV'       d   \        V^ RR7       V# V P	                  R4      pVf   VP
                  M \        WrP
                  ^VP                  4      p\        \        V4      4      p	V U
u. uF  p
. NK  	  pp
Rp\        V4      '       d   \        WSVR7      w  r¼. p/ p\        V	4      p\        V4       F�  w  ppW›V,          ,           p\        VVVR	7      pV F(  pVP                  VP                   \#        V4      4       K*  	  V Uu. uF  pVP                   NK  	  ppR
VRV/pV'       g   V'       d   VVR&   RVR&   VP%                  V4       KŸ  	  \'        R V 4       4      pR VR\)        V	4      V,           RVRV/pV'       d   \+        VRR7      VR&   \        Y\)        V4      V'       d   RMV'       d   RMRR7       \,        P.                  ! VRR7      # u up
i u upi )ró   Fz(Retry with fewer, more targeted queries.©r5  r6  r7  Úerror)ÚhitsÚoutcomer÷   N)r<  r=  )r÷   ÚqueryÚmatchesÚavailable_sourceszçThis query returned no lexical matches, but the sources above are connected and their tools remain available. Retry tool_search with the service name plus a concrete action or object before concluding the capability is unavailable.Úhintc              3  óL   "  € T F  p\        V4      '       g   K  ^x € K  	  R# 5i)é   N©r#   )rQ   r�   s   & r>   rS   Ú'dispatch_tool_search.<locals>.<genexpr>Ú  s   é € ÐJ¡Y˜TÔ2CÀD×2I—q’q£Yùs   ‚$š
$Útotal_availableÚresultsrˆ   Úsearched)ÚverbÚ
connectorsÚconnector_unavailablerD  Úno_hits)r#  rD  rE  ©rÄ   )r“   r;  Ú_MAX_QUERIES_PER_CALLÚ_record_search_metricrX   r0   rW   r1   r   r½   r$   r%   r2  Ú	enumerater   Ú
setdefaultr�   r!  r·   rÏ   rÈ   r&   rÉ   rÊ   )r4  r?  r‹   r<  r=  ró   ÚerrÚ	raw_limitr÷   r#  Ú_Úremote_entriesÚhosted_failurerO  Ú	tools_maprH  ÚpositionrF  ÚcorpusrD  ÚhrG  ÚgroupÚremote_countÚpayloads   &$$$$                    r>   Údispatch_tool_searchrf  ¶  s  € ð ×$Ð$”{“}€FÜ# D¨)¸EÔMbØ/Yô[�L€Gç
ÜÐ/°aÀÕIØˆ
Ø—‘˜Ó!€IØ,5Ò,=ˆV×(Ò(Ü˜y×*EÑ*EÀqÈ&×JaÑJaÓbð 
äœNÐ+<Ó=Ó>€GÙ<CÓ/D¹G°q³¹G€NÐ/DØ$(€NÜÐ-×.Ò.Ü)CØ¸Tô*CÑ&ˆà$&€GØ+-€IÜ1°'Ó:ÐÜ$ WÖ-‰ˆ�%Ø¨(Õ3Õ3ˆÜ˜f e°5Ô9ˆÛˆAØ× Ñ  §¡Ô)<¸QÓ)?Ö@ñ á#'Ó(¡4˜a�1—6”6¡4ˆÐ(Ø!(¨%°¸GÐ Dˆß×,Ø):ˆEÐ%Ñ&ðJð �&‰Mð
 	�‰�uÖñ .ô ÑJ¡YÓJÓJ€LØ(¨'Ð3DÄcÈ'ÃlÐUaÕFaØ(¨'°7¸IðG€GçÜ 6°~ÈJÔ Wˆ�ÑÜÐ+Ä3ÀyÃ>ß=KÑ"9×[dÑQWÐjsõuä�:Š:�g¨EÔ2Ð2ùò= 0Eùò )s   ÂHÄ;Hr#  c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# )r9   r?  r´   rD  r/   rE  r+   r#  zOptional[list[CatalogEntry]]r:   ÚNoner<   )r=   s   "r>   r?   r?   ä  s:   € ÷ @ñ @Ð-Að @ÈCð @ÐZ]ð @Ø#?ð@ØKOñ@rA   c               ó¬   € ^ RI Hp \        Ve   TM
\        V 4      4      p\	        V 4      pV'       d   V'       d   RMV'       d   RMRpV! WqVR7       R# )zUOne ``hermes.tool_search.count`` row: which corpora the search read, never the query.)Úrecord_tool_searchNÚbothÚ	connectorÚlocal)ÚscoperD  rE  )Ú.hermes_cli.observability.shared_metrics_eventsrj  rž   r½   r$   )r?  rD  rE  r#  rj  rm  Úhostedrn  s   &$$$    r>   rW  rW  ä  sC   € õ Rä˜GÒ/‘´^ÐDUÓ5VÓW€EÜ!Ð"3Ó4€Fß§‰F¿6©KÀw€EÙ˜U°w×?rA   Úconnector_describec               ó0   € V ^8„  d   QhRRRRRRRRR	RR
R/# )r9   r4  rÁ   r?  r´   r‹   r  rq  r@  r=  r:   r+   r<   )r=   s   "r>   r?   r?   ï  s;   € ÷ .2ñ .2 ð .2ÐG[ð .2Ø#=ð.2à/<ð.2àKXð.2àdgñ.2rA   c               ór  € T;'       g    \        4       p\        V R R\        RR7      w  rVV'       d   V# \        V4      p\	        V\        V4      4       UU	u/ uF  w  r‰V	'       g   K  V	\        V4      bK  	  p
pp	\        WQW4R7      w  r¼/ p. p. p/ p\        V4      pV EF:  p	V
P                  V	4      pVP                  V	4      pVe+   RVP                  RR4      RVP                  R/ 4      /WÙ&   KT  \        V\        4      '       d4   R\        VP                  RR4      4      RVP                  R/ 4      /WÙ&   K�  \        V	4      '       d   V'       d   TMTP                  V	4       KË  \        V	V4      ;p'       d   VVV	&   Kæ  \!        V	4      e7   \#        V	\        4       P$                  4      '       g   \'        V	V4      VV	&   EK)  VP                  V	4       EK=  	  RV/pV'       d   VVR	&   R
VR&   V'       d   VVR&   V'       d   \)        VRVR7      VR&   \*        P,                  ! VRR7      # u up	pi )rù   Tz Retry with fewer names per call.rB  )r=  rÞ   r©   rä   rˆ   Ú	not_foundzNNames in not_found are not currently available. Re-run tool_search to refresh.rI  ÚerrorsÚ	described)rQ  rù   rR  FrU  )r”   r;  Ú_MAX_DESCRIBE_NAMES_PER_CALLr½   r¶   r­   r   r'   r²   rX   rU   rV   r+   r#   r·   r   r   r£   rF   r   r&   rÉ   rÊ   )r4  r?  r‹   rq  r=  rù   rZ  r¹   rª   r�   Úby_nameÚremote_schemasr^  rˆ   rt  Úundescribedru  Úsession_namesÚfnÚ	remote_fnÚunavailableÚresults   &$$$$                 r>   Údispatch_tool_describer€  ï  s  € ð ×-Ð-Ô+Ó-€FÜ!Øˆg˜dÔ.JØ5ô7�J€E÷ Øˆ
ÜÐ 1Ó2€JÜ-0°¼_ÈZÓ=XÔ-YÔbÑ-Y¡ Ô]aŒ}ˆt”S˜“WŠ}Ñ-Y€GÑbÜ%7¸ÐRdÔ%pÑ"€Nà')€EØ€IØ€KØ€FÜ&Ð'8Ó9€MÜˆØ�[‰[˜ÓˆØ"×&Ñ& tÓ,ˆ	ØŠ>Ø(¨"¯&©&°ÀÓ*CØ'¨¯©°¸bÓ)AðCˆE‹Kä˜	¤4×(Ò(Ø(¬#¨i¯m©m¸MÈ2Ó.NÓ*OØ'¨¯©°|ÀRÓ)HðJˆE‹Kä˜t×$Ò$ß*‰[°	×AÑAÀ$ÖGÜ5°d¸MÓJÐJˆ[ÖJà&ˆF�4‹LÜ˜TÓ"Ò.Ô7NØÔ&Ó(×>Ñ>÷8@ò 8@ô 0°°mÓDˆF�4ŒLà×Ñ˜T×"ñ' ð( & uÐ-€FßØ'ˆˆ{ÑØiˆˆv‰ßØ!ˆˆxÑßÜ5°nÈ;Ð^iÔjˆˆ|ÑÜ�:Š:�f¨5Ô1Ð1ùóI cs   ÁH3Á)H3c               ó    € V ^8„  d   QhRRRR/# )r9   r¥   r´   r:   r–   r<   )r=   s   "r>   r?   r?      s   € ÷ Gñ GÐ';ð GÀñ GrA   c                óh   a€ \        4       P                  o\        V3R l\        V 4       4       4      # )uì   Deferrable names in the *pre-assembly* ``tool_defs`` of the session scope â€” the
universe ``tool_call`` may reach. Gates bridge dispatch AND the executor unwrap so a
restricted session cannot invoke an out-of-scope tool via the bridge.c              3  ód   <"  € T F%  pV'       g   K  \        VS4      '       g   K!  Vx € K'  	  R # 5irC   )r£   )rQ   rR   r7   s   & €r>   rS   Ú*scoped_deferrable_names.<locals>.<genexpr>%  s-   øé € ð GÑ :˜1Üô Ü5°a¸×E÷ ’QÓ :ùs   ƒ
0’0¦
0)r”   rF   r;   r­   )r¥   r7   s   &@r>   Úscoped_deferrable_namesr…     s5   ø€ ô 'Ó(×>Ñ>€KÜô G¤°	Ô :ó Gó Gð GrA   c               ó    € V ^8„  d   QhRRRR/# )r9   r�   r+   r:   ré   r<   )r=   s   "r>   r?   r?   )  s   € ÷ ñ ˜cð  mñ rA   c                ób   €  \        V 4      \        9   d   RV  R2#  R#   \         d     R# i ; i)u‰  Fail-fast reason for a registered session-gated GUI tool outside this session's
scope (#120413). The generic scope block ("not available ... Use tool_search") sends
the model on a round-trip tool_search can never satisfy â€” the tool is not in this
session's catalog at all. Name the missing surface instead. None for anything else
(the generic message still applies). Fail-open: never raises.Ú'zŸ' needs a desktop-app session with a GUI surface (preview/terminal panes). This session has none: use it only from the Hermes desktop app, not via tool_search.N)r   r¡   r�   r  s   &r>   Úout_of_scope_reasonr‰  )  sO   € ðÜ˜TÓ"Ô&>Ô>Ø˜�vð kð kð lð ?ñ
 øô ô ØÙðús   ‚ Ÿ.­.c               ó    € V ^8„  d   QhRRRR/# )r9   r�   r+   r:   r<   )r=   s   "r>   r?   r?   8  s   € ÷ jñ j˜Sð j Sñ jrA   c                ó–   € \        V 4      ;'       g8    V \        4       9   d   \        V 4      e   \        V 4      MR;'       g    RV  R2# )zÞBlock message for a ``tool_call`` naming a tool outside the session's scope. A core tool
(deferred by ``defer:`` or not) names its real reason, since tool_search cannot surface it
here; anything else keeps the search hint.Nrˆ  zO' is not available in this session. Use tool_search to find tools you can call.)r‰  r›   r   r    r  s   &r>   Úscope_block_reasonrŒ  8  s\   € ô   Ó%÷ ið iàÔ+Ó-Ô-´/À$Ó2GÒ2Sô .¨dÔ3ØY]÷ið ið �4�&ÐgÐhðjrA   c               ó$   € V ^8„  d   QhRRRRRR/# )r9   r4  rÁ   r²   zOptional[Iterable[str]]r:   z3tuple[Optional[str], dict[str, Any], Optional[str]]r<   )r=   s   "r>   r?   r?   B  s#   € ÷ % ñ %  .ð % ÐF]ð % Ø!Tñ% rA   c                ó  € \        V 4      w  r#V'       d   R/ V3# \        V4      ^8”  dI   \        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       d   R/ \        V4      3# \	        V^ ,          R,          4      '       d   \
        RV/R3# V^ ,          R,          pV^ ,          R,          p\        WA4      pV'       d   R/ V3# \        V\        4       P                  4      '       g   R/ \        WA4      3# WER3# )u?  Parse a ``tool_call`` invocation into (underlying_name, args, error_msg).

Used by:
* the dispatcher in ``model_tools.handle_function_call``,
* the display layer (so the activity feed shows the underlying tool),
* the trajectory recorder.

A connector-only batch resolves
to ``(CONNECTOR_BATCH_SENTINEL, {"calls": [...]}, None)``: the batch is
one dispatch unit owned by the ``model_tools`` bridge branch, and the
sentinel is what planners/display layers see. A single local entry keeps
the historical single-tool contract unchanged.

``session_tool_names`` is the session's own tool list, when the caller has it. Passed
through so a core tool this session cannot reach reports *unavailable* rather than
"call it directly" â€” the static core list cannot tell the two apart.

On parse error, returns ``(None, {}, error_message)``.
Nc              3  óP   "  € T F  p\        VR ,          4      '       * x € K  	  R# 5i)r�   NrL  )rQ   r‘   s   & r>   rS   Ú*resolve_underlying_call.<locals>.<genexpr>[  s    é € ÐRÉ'ÀQÔ$5°a¸µiÓ$@× @Ñ @Ë'ùs   ‚$&TFr�   rú   rû   )r   rÈ   Úanyr   r#   r"   r   r£   r”   rF   r   )r4  r²   ÚentriesrZ  r�   Úraw_argsr~  s   &&     r>   Úresolve_underlying_callr”  B  sï   € ô* /¨tÓ4�L€Gß
Ø�R˜ˆ}Ðä
ˆ7ƒ|�aÔŸC›CÑRÉ'ÓRŸCŸCšCÑRÉ'ÓR×RÒRØ�RÔ*¨7Ó3Ð3Ð3Ü˜ � FÕ+×,Ò,Ü'¨'°7Ð);¸TÐAÐAà�1�:�fÕ€DØ�q�z˜+Õ&€HÜ+¨DÓE€KßØ�R˜Ð$Ð$Ü" 4Ô)=Ó)?×)UÑ)U×VÒVØ�RÔ-¨dÓGÐGÐGØ˜4ÐÐrA   rC   )F)Nr©   F)iô  )r   r"   r   r   r   rþ   r   r*   r  rü   r   r   rº   r€  rf  rÑ   r  r#   r£   rÜ   r“   r   r‰  r”  rŒ  r…  r   rØ   r!   )crj   Ú
__future__r   Ú	functoolsrÉ   ÚloggingrÍ   Úcollectionsr   Údataclassesr   Útypingr   r   r   r   r	   r
   Úhermes_cli.config_defaultsr   Útools.registryr   rš   r   r   r.  r   r   r   r   r   r   r   r   r   r   r   r   r   Útools.tool_search_validationr   r   r   r   r    r!   Útools.connectorsr"   r#   Útools.connectors.searchr$   r%   r&   r'   Ú	getLoggerr\   rV  rw  r*   rz   r^   rW   ra   r’   Úpartialr“   r”   r›   Úkeysr¡   r;   rD   r£   r­   r²   rº   r½   rÑ   rØ   rÜ   ræ   rî   rð   rü   rþ   r  r  r  r!  r2  r;  rf  rW  r€  r…  r‰  rŒ  r”  Ú__all__r<   rA   r>   Ú<module>r¤     sG  ðñ[õ #ã Û Û Û Ý Ý !ß =× =å 5Ý %ß G÷D÷ D÷ Dõ D÷@÷ @÷ I÷bó bð 
×	Ò	Ð.Ó	/€ð
 Ð Ø!Ð ñ �$Ô÷*Rð *Ró ð*RðZ ˜d C¨¨u°d¸GÀUÈCÐQVÐX\Ð^cÐdÐ õ[õ#õõ	/ð ×ÒÐ 3°]ÓC€Ø ×(Ò(Ð)<Ð>TÓUÐ õð 3Ð5N×5SÒ5SÓ5UÕUÐ ñ $ N°7Õ$;¸MÕ$JÈ7Õ$SÓTÐ ÷Oõ9õ
A÷	õVõ
Dð	ØRW÷	õ;õ[ð<ð ÷
#÷B9ðx ÷	ð 	ó ð	ð#.Ð[_ð #.Ø<@÷#.õL%÷<õ
6õQõð(+3Ø>Bð+3à;?ð+3àW[÷+3ð\@ØBF÷@ð.2Ø@Dð.2à?Cð.2à[_÷.2õbGõõj÷% òP‚rA   