
    Ki2Q                        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?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`g g daddbZdce	ddeee	ef                  fdeZ
ddce	dgee	         ddee	         fdhZdiee	         ddee	         fdjZddee	         fdkZddee	ee	ef         f         fdlZddee	         fdmZdce	ddefdnZ	 	 ddce	doe	dpee	         dqee	         dddff
drZdce	ddee	ef         fdsZedtk    r edu            edv            edw            edx            e                                            D ]U\  ZZ ee          Zedy         rdznd{Z ed|e d}ed~dedo                      ed eed                    d           V ed            edx           dD ]RZ ee          Z ede d            ed ee           dd                     ee                                S ed            edx            eg d          Z ed            edd                     ee                                 ed            edx            edddgddg            ed          Z  ed            ede do                      edd                    e d                               dfS dfS )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mixture_of_agentsskills_list
skill_viewskill_managebrowser_navigatebrowser_snapshotbrowser_clickbrowser_typebrowser_scrollbrowser_backbrowser_pressbrowser_close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 toolsr   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   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   ttszQText-to-speech: convert text to audio with Edge TTS (free), ElevenLabs, or OpenAIr!   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.   r4   r5   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&   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+   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-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)hermes-matrixzDMatrix 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)z=WeCom bot toolset - enterprise WeChat 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)rL   rM   rN   rO   rP   rQ   rR   
hermes-smsrS   rT   hermes-dingtalkhermes-feishuhermes-wecomhermes-webhook)rV   rW   rX   rU   rY   zhermes-gatewaynamereturnc                 6    t                               |           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
    )TOOLSETSgetrZ   s    %/home/ubuntu/hermes-agent/toolsets.pyget_toolsetra   }  s     <<    Nvisitedc                     |t                      } dv ret                      }t                      D ]9}t          ||                                          }|                    |           :t          |          S  |v rg S |                                t                                         }|sN t                      v r<	 ddl
m}  fd|j                                        D             S # t          $ r Y nw xY w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   registryc                 4    g | ]}|j         k    |j        S  toolsetrZ   ).0erZ   s     r`   
<listcomp>z#resolve_toolset.<locals>.<listcomp>  s(    VVV1AIQUDUDUDUDUDUrb   r1   r2   )setget_toolset_namesresolve_toolsetcopyupdatelistaddr]   r^   _get_plugin_toolset_namestools.registryrh   _toolsvalues	Exception)
rZ   rc   	all_toolstoolset_nameresolvedrl   rh   r1   included_nameincluded_toolss
   `         r`   rr   rr     s    %% |!ee	-// 	' 	'L&|W\\^^DDHX&&&&I
 w	KK ll4  G ,....333333VVVV(>(>(@(@VVVV   	 GR(())E
 !Z44 % %(@@^$$$$;;s   *C. .
C;:C;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)
    )rp   rr   rt   ru   )r   r|   rZ   r1   s       r`   resolve_multiple_toolsetsr     sL     I    %%	??rb   c                      	 ddl m}  d | j                                        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   rg   c                 8    h | ]}|j         t          v|j         S rj   )rl   r]   )rm   entrys     r`   	<setcomp>z,_get_plugin_toolset_names.<locals>.<setcomp>  s1     
 
 
}H,, M,,,rb   )rx   rh   ry   rz   r{   rp   rg   s    r`   rw   rw     sr    ++++++
 
!//11
 
 
 	

    uus   (+ AAc                      t                                           } t                      D ]N| vrH	 ddlm} fd|j                                        D             }d |d| <   ># t          $ r Y Jw xY wO| S )z
    Get all available toolsets with their definitions.

    Includes both statically-defined toolsets and plugin-registered ones.
    
    Returns:
        Dict: All toolset definitions
    r   rg   c                 4    g | ]}|j         k    |j        S rj   rk   )rm   rn   ts_names     r`   ro   z$get_all_toolsets.<locals>.<listcomp>  s(    ZZZAQYRYEYEYEYEYEYrb   zPlugin toolset: )r0   r1   )r]   rs   rw   rx   rh   ry   rz   r{   )resultrh   r1   r   s      @r`   get_all_toolsetsr     s     ]]__F,.. 
 
&  333333ZZZZ)?)?)A)AZZZ#?g#?#?"# #w     ! Ms   6A''
A43A4c                      t          t                                                    } | t                      z  } t	          |           S )z
    Get names of all available toolsets (excluding aliases).

    Includes plugin-registered toolset names.
    
    Returns:
        List[str]: List of toolset names
    )rp   r]   keysrw   sorted)namess    r`   rq   rq     s6       E	&(((E%==rb   c                 D    | d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
    >   re   rf   T)r]   rw   r_   s    r`   validate_toolsetr     s6     |txt,....rb   r0   r1   r2   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/   N)r]   rZ   r0   r1   r2   s       r`   create_custom_toolsetr   (  s)      #"N HTNNNrb   c           
          t          |           }|sdS t          |           }| |d         |d         |d         |t          |          t          |d                   dk    dS )z
    Get detailed information about a toolset including resolved tools.
    
    Args:
        name (str): Toolset name
        
    Returns:
        Dict: Detailed toolset information
    Nr0   r1   r2   r   )rZ   r0   direct_toolsr2   resolved_tools
tool_countis_composite)ra   rr   len)rZ   rl   r   s      r`   get_toolset_infor   @  sz     $G t$T**N }-(J'(.))GJ/0014  rb   __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
   rK   rJ   z
  :z    Resolved to z tools: z, z
Multiple Toolset Resolution:)r.   r4   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_TOOLSr]   strra   rr   r   rw   r   rq   boolr   r   r   __name__printitemsrZ   rl   info	compositer   r1   joinr   combinedcustom_inforj   rb   r`   <module>r      s5
   0 2 1 1 1 1 1 1 1 1 1 1 1 1 1
" " " Ns	B. s I s 8"# s( ;"# )s4 Pi( 5s@ 
E%& AsL u>>> MsX  V
 
 
 	 	Ysn { osz g ! {sF 	_
 
 
 
 
Gs^ xEEE _sj 
j"# ksv G wsB Z CsN P"# OsZ Z [s sf f ! gsr S!" ssD I\\\ EsV >i(FO Wsb =%&222 cs|  G
 
 
 ! }sb  V
 
 
< A! !csh a# ist i# us@ v# AsL f# MsX g# Ysd X# esp ]# qs| W# }sH Z# IsT ]# Us sb \#  f#  W#  Q#  W#  Q P  P  P ]	s s sn	c htCH~6    9 9# 9C 9DI 9 9 9 9xT#Y 49    &3s8    "$sDcN23    249     /3 /4 / / / /, 	 
 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 rb   