
    i3X                        d Z ddlmZmZmZmZmZ g dZi ddddgg dd	d
dgg ddddgg ddddgg dddddgg ddddgg dddg dg dddg dg ddddgg ddd d!gg dd"d#g d$g dd%d&g d'g dd(d)d*gg dd+d,d+gg dd-d.d-gg dd/d0d/gg dd1d2d1gg di d3d4d5gg dd6d7d8gg dd9d:g d;g dd<d=ddgdd%gdd>d?g g d@ddAdBg dCg ddDdEg dFg ddGdHeg ddIdJeg ddKdLeg ddMdNeg ddOdPeg ddQdReg ddSdTeg ddUdVeg ddWdXeg ddYdZeg dd[eg dd\eg dd]eg dd^eg dd_eg dd`eg ddaeg ddbeg ddceg dddg g deddf
Zdge	dheee	ef                  fdiZ
ddge	dkee	         dhee	         fdlZdmee	         dhee	         fdnZdhee	         fdoZdhee	e	f         fdpZdhee	ee	ef         f         fdqZdhee	         fdrZdge	dhefdsZ	 	 ddge	dte	duee	         dvee	         dhdjf
dwZdge	dhee	ef         fdxZedyk    r edz            ed{            ed|            ed}            e                                            D ]U\  ZZ ee          Zed~         rdndZ ede deddedt                      ed eed                    d           V ed            ed}           dD ]RZ ee          Z ede d            ed ee           dd                     ee                                S ed            ed}            eg d          Z  ed            edd                     ee                                  ed            ed}            edddgddg            ed          Z! ed            ede!dt                      edd                    e!d                               djS djS )a  
Toolsets Module

This module provides a flexible system for defining and managing tool aliases/toolsets.
Toolsets allow you to group tools together for specific scenarios and can be composed
from individual tools or other toolsets.

Features:
- Define custom toolsets with specific tools
- Compose toolsets from other toolsets
- Built-in common toolsets for typical use cases
- Easy extension for new toolsets
- Support for dynamic toolset resolution

Usage:
    from toolsets import get_toolset, resolve_toolset, get_all_toolsets
    
    # Get tools for a specific toolset
    tools = get_toolset("research")
    
    # Resolve a toolset to get all tool names (including from composed toolsets)
    all_tools = resolve_toolset("full_stack")
    )ListDictAnySetOptional)$
web_searchweb_extractterminalprocess	read_file
write_filepatchsearch_filesvision_analyzeimage_generateskills_list
skill_viewskill_managebrowser_navigatebrowser_snapshotbrowser_clickbrowser_typebrowser_scrollbrowser_backbrowser_pressbrowser_get_imagesbrowser_visionbrowser_consoletext_to_speechtodomemorysession_searchclarifyexecute_codedelegate_taskcronjobsend_messageha_list_entitiesha_get_stateha_list_servicesha_call_servicewebz)Web research and content extraction toolsr   r	   descriptiontoolsincludessearchz0Web search only (no content extraction/scraping)visionzImage analysis and vision toolsr   	image_genz"Creative generation tools (images)r   r
   z7Terminal/command execution and process management toolsr   moaz,Advanced reasoning and problem-solving toolsmixture_of_agentsskillsz\Access, create, edit, and manage skill documents with specialized instructions and knowledge)r   r   r   browserz|Browser automation for web interaction (navigate, click, type, scroll, iframes, hold-click) with web search for finding URLs)r   r   r   r   r   r   r   r   r   r   r   r&   zbCronjob management tool - create, list, update, pause, resume, remove, and trigger scheduled tasks	messagingzNCross-platform messaging: send messages to Telegram, Discord, Slack, SMS, etc.r'   rlzFRL training tools for running reinforcement learning on Tinker-Atropos)
rl_list_environmentsrl_select_environmentrl_get_current_configrl_edit_configrl_start_trainingrl_check_statusrl_stop_trainingrl_get_resultsrl_list_runsrl_test_inferencefilez_File manipulation tools: read, write, patch (with fuzzy matching), and search (content + files))r   r   r   r   ttszVText-to-speech: convert text to audio with Edge TTS (free), ElevenLabs, OpenAI, or xAIr   r    z.Task planning and tracking for multi-step workr!   zAPersistent memory across sessions (personal notes + user profile)r"   z7Search and recall past conversations with summarizationr#   zAAsk the user clarifying questions (multiple-choice or open-ended)code_executionzMRun Python scripts that call tools programmatically (reduces LLM round trips)r$   
delegationz:Spawn subagents with isolated context for complex subtasksr%   homeassistantz0Home Assistant smart home control and monitoring)r(   r)   r*   r+   	debuggingz%Debugging and troubleshooting toolkitsafez$Safe toolkit without terminal access)r,   r2   r3   z
hermes-acpum   Editor integration (VS Code, Zed, JetBrains) — coding-focused tools without messaging, audio, or clarify UI)r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r$   r%   zhermes-api-serveru|   OpenAI-compatible API server — full agent tools accessible via HTTP (no interactive UI tools like clarify or send_message))!r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r$   r%   r&   r(   r)   r*   r+   z
hermes-clizHFull interactive CLI toolset - all default tools plus cronjob managementhermes-telegramzPTelegram bot toolset - full access for personal use (terminal has safety checks)hermes-discordz]Discord bot toolset - full access (terminal has safety checks via dangerous command approval)hermes-whatsappzMWhatsApp bot toolset - similar to Telegram (personal messaging, more trusted)hermes-slackzNSlack bot toolset - full access for workspace use (terminal has safety checks)hermes-signalz?Signal bot toolset - encrypted messaging platform (full access)hermes-bluebubbleszNBlueBubbles iMessage bot toolset - Apple iMessage via local BlueBubbles serverhermes-homeassistantzDHome Assistant bot toolset - smart home event monitoring and controlhermes-emailz>Email bot toolset - interact with Hermes via email (IMAP/SMTP)hermes-mattermostzAMattermost bot toolset - self-hosted team messaging (full access)zDMatrix bot toolset - decentralized encrypted messaging (full access)zBDingTalk bot toolset - enterprise messaging platform (full access)zLFeishu/Lark bot toolset - enterprise messaging via Feishu/Lark (full access)zFWeixin bot toolset - personal WeChat messaging via iLink (full access)zBQQBot toolset - QQ messaging via Official Bot API v2 (full access)z=WeCom bot toolset - enterprise WeChat messaging (full access)zJWeCom callback toolset - enterprise self-built app messaging (full access)z7SMS bot toolset - interact with Hermes via SMS (Twilio)z=Webhook toolset - receive and process external webhook eventsz7Gateway toolset - union of all messaging platform tools)rK   rL   rM   rN   rO   rP   rQ   rR   
hermes-smsrS   hermes-matrixhermes-dingtalkhermes-feishuhermes-wecomhermes-wecom-callbackhermes-weixinhermes-qqbothermes-webhook)
rU   rV   rW   rZ   r[   rX   rY   rT   r\   zhermes-gatewaynamereturnc                    t                               |           }|r|S 	 ddlm} n# t          $ r Y dS w xY w| }d|  }|                    |           }| t                      vr|}|sdS d|  d}nGd t                                                      D             }|                    |           }|rd| d}||	                    |          g dS )	z
    Get a toolset definition by name.
    
    Args:
        name (str): Name of the toolset
        
    Returns:
        Dict: Toolset definition with description, tools, and includes
        None: If toolset not found
    r   registryNzPlugin toolset: zMCP server 'z' toolsc                 ,    i | ]\  }}|t           v||S  TOOLSETS).0alias	canonicals      0/home/agentuser/.hermes/hermes-agent/toolsets.py
<dictcomp>zget_toolset.<locals>.<dictcomp>  s3     
 
 
 yH$$ u$$$    r-   )
re   gettools.registryra   	Exceptionget_toolset_alias_target_get_plugin_toolset_names_get_registry_toolset_aliasesitemsget_tool_names_for_toolset)r]   toolsetra   registry_toolsetr.   alias_targetreverse_aliasesrg   s           ri   get_toolsetrx     sC    ll4  G +++++++   tt +T++K44T::L,....' 	42T222
 
$A$C$C$I$I$K$K
 
 

  ##D)) 	87777K #445EFF  s   ' 
55Nvisitedc                 0   |t                      }| dv ret                      }t                      D ]9}t          ||                                          }|                    |           :t          |          S | |v rg S |                    |            t          |           }|sg S t          |                    dg                     }|                    dg           D ]'}t          ||          }|                    |           (t          |          S )a  
    Recursively resolve a toolset to get all tool names.
    
    This function handles toolset composition by recursively resolving
    included toolsets and combining all tools.
    
    Args:
        name (str): Name of the toolset to resolve
        visited (Set[str]): Set of already visited toolsets (for cycle detection)
        
    Returns:
        List[str]: List of all tool names in the toolset
    N>   *allr/   r0   )	setget_toolset_namesresolve_toolsetcopyupdatesortedaddrx   rl   )	r]   ry   	all_toolstoolset_nameresolvedrt   r/   included_nameincluded_toolss	            ri   r   r     s#    %% |!ee	-// 	' 	'L&|W\\^^DDHX&&&&i   
 w	KK $G 	 GR(())E
 !Z44 % %(@@^$$$$%==rk   toolset_namesc                     t                      }| D ]&}t          |          }|                    |           't          |          S )z
    Resolve multiple toolsets and combine their tools.
    
    Args:
        toolset_names (List[str]): List of toolset names to resolve
        
    Returns:
        List[str]: Combined list of all tool names (deduplicated)
    )r}   r   r   r   )r   r   r]   r/   s       ri   resolve_multiple_toolsetsr     sN     I    %%)rk   c                      	 ddl m}  d |                                 D             S # t          $ r t	                      cY S w xY w)u   Return toolset names registered by plugins (from the tool registry).

    These are toolsets that exist in the registry but not in the static
    ``TOOLSETS`` dict — i.e. they were added by plugins at load time.
    r   r`   c                 $    h | ]}|t           v|S rc   rd   )rf   r   s     ri   	<setcomp>z,_get_plugin_toolset_names.<locals>.<setcomp>  s-     
 
 
8++ +++rk   )rm   ra   get_registered_toolset_namesrn   r}   r`   s    ri   rp   rp     sp    ++++++
 
 ( E E G G
 
 
 	

    uus   #& A Ac                  \    	 ddl m}  |                                 S # t          $ r i cY S w xY w)z@Return explicit toolset aliases registered in the live registry.r   r`   )rm   ra   get_registered_toolset_aliasesrn   r`   s    ri   rq   rq     sO    ++++++66888   			s    ++c                      t          t                    } t                      }t                      D ]L}|}|                                D ]\  }}||k    r|t          vr|} n|| v r6t          |          }|r|| |<   M| S )z
    Get all available toolsets with their definitions.

    Includes both statically-defined toolsets and plugin-registered ones.
    
    Returns:
        Dict: All toolset definitions
    )dictre   rq   rp   rr   rx   )resultaliasests_namedisplay_namerg   rh   rt   s          ri   get_all_toolsetsr   !  s     (^^F+--G,.. 
+ 
+ ' 	 	E9G##X(=(=$6!!l++ 	+#*F< Mrk   c                  T   t          t                                                    } t                      }t	                      D ]W}|                                D ]+\  }}||k    r |t          vr|                     |            n,|                     |           Xt          |           S )z
    Get names of all available toolsets (excluding aliases).

    Includes plugin-registered toolset names.
    
    Returns:
        List[str]: List of toolset names
    )r}   re   keysrq   rp   rr   r   r   )namesr   r   rg   rh   s        ri   r~   r~   :  s       E+--G,..   ' 	 	E9G##X(=(=		%   IIg%==rk   c                 h    | dv rdS | t           v rdS | t                      v rdS | t                      v S )z
    Check if a toolset name is valid.
    
    Args:
        name (str): Toolset name to validate
        
    Returns:
        bool: True if valid, False otherwise
    >   r{   r|   T)re   rp   rq   )r]   s    ri   validate_toolsetr   Q  sM     |txt(****t02222rk   r.   r/   r0   c                 *    ||pg |pg dt           | <   dS )a
  
    Create a custom toolset at runtime.
    
    Args:
        name (str): Name for the new toolset
        description (str): Description of the toolset
        tools (List[str]): Direct tools to include
        includes (List[str]): Other toolsets to include
    r-   Nrd   r]   r.   r/   r0   s       ri   create_custom_toolsetr   e  s)      #"N HTNNNrk   c           
          t          |           }|sdS t          |           }| |d         |d         |d         |t          |          t          |d                   dS )z
    Get detailed information about a toolset including resolved tools.
    
    Args:
        name (str): Toolset name
        
    Returns:
        Dict: Detailed toolset information
    Nr.   r/   r0   )r]   r.   direct_toolsr0   resolved_tools
tool_countis_composite)rx   r   lenbool)r]   rt   r   s      ri   get_toolset_infor   }  su     $G t$T**N }-(J'(.))WZ011  rk   __main__zToolsets System Demoz<============================================================z
Available Toolsets:z(----------------------------------------r   z[composite]z[leaf]z   20z - z     Tools: r   z totalz
Toolset Resolution Examples:)r,   r
   rJ   rI   z
  :z    Resolved to z tools: z, z
Multiple Toolset Resolution:)r,   r2   r
   z*  Combining ['web', 'vision', 'terminal']:z    Result: z
Custom Toolset Creation:	my_customz$My custom toolset for specific tasksr   z  Created 'my_custom' toolset:z    Description: z    Resolved tools: )N)NN)"__doc__typingr   r   r   r   r   _HERMES_CORE_TOOLSre   strrx   r   r   rp   rq   r   r~   r   r   r   r   __name__printrr   r]   rt   info	compositer   r/   joinr   combinedcustom_inforc   rk   ri   <module>r      s
   0 2 1 1 1 1 1 1 1 1 1 1 1 1 1
      JI	B. I I I 8"# I( ;"# )I4 Pi( 5I@ 
E%& AIL u>>> MIX  V
 
 
 	 	YIn { oIz g ! {IF 	_
 
 
 
 
GI^ xEEE _Ij 
o"# kIv G wIB Z CIN P"# OIZ Z [I If f ! gIr S!" sID I\\\ EIV >i(FO WIb =222 cI|  G
 
 
 ! }Ib  V
 
 
8 = cId a# eIp i# qI| v# }IH f# IIT g# UI` X# aIl g# mIx ]# yID W# EIP Z# QI I^ ^#  \#  f#  `#  \#  W#  d#  Q#  W#  Q `  `  ` I
I I IZ
+c +htCH~6 + + + +\2 2# 2C 2DI 2 2 2 2jT#Y 49    &3s8    "tCH~    $sDcN23    249    .33 34 3 3 3 3. 	 
 9 3i	
 
   03 4S>    : z	E
 !!!	E(OOO	E
!"""	E(OOO))++1133 B Bg%%%).%9GMMx	C9CCtCCC7=+ACCDDD@SS&6!788@@@AAAA	E
*+++	E(OOO8 Q Q%%nTnnnOUOOTYYvve}}5M5MOOPPPP	E
*+++	E(OOO(()F)F)FGGH	E
6777	E
666(#3#344
6
6777	E
&'''	E(OOO:nh'	    #";//K	E
*+++	E
:k-8
:
:;;;	E
K;7G+H!I!I
K
KLLLLLI rk   