
    ik                        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=g d>g dd?d@d?gg ddAdBdAgg ddCdDg dEg ddFdGdHgg ddIdJg dKg ddLdMg dNg ddOdPddgdd%gddQdRg g dSddTdUg dVg ddWdXg dYg ddZd[eg dd\d]eg dd^d_eg di d`daed?dAgz   g ddbdceg ddddeeg ddfdgeg ddhdieg ddjdkeg ddldmeg ddndoeg ddpdqeg ddrdseg ddtdueg dvz   g ddwdxeg ddydzeg dd{d|eg dd}d~eg dddeg dEz   dg dddeg ddeg ddg g dddZde	deee	ef                  fdZ
dde	dee	         dee	         fdZdee	         dee	         fdZdee	         fdZdee	e	f         fdZdee	ee	ef         f         fdZdee	         fdZde	defdZ	 	 dde	de	dee	         dee	         ddf
dZde	dee	ef         fdZedk    r ed            ed            ed            ed            e                                            D ]U\  ZZ ee          Zed         rdndZ ede dedded                      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!d                      edd                    e!d                               dS dS )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browser_cdpbrowser_dialog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kanban_showkanban_completekanban_blockkanban_heartbeatkanban_commentkanban_createkanban_link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    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-   kanbanu  Kanban multi-agent coordination — only active when the agent is spawned by the kanban dispatcher (HERMES_KANBAN_TASK env set). The dispatcher runs inside the gateway by default; see `kanban.dispatch_in_gateway` in config.yaml. Lets workers mark tasks done with structured handoffs, block for human input, heartbeat during long ops, comment on threads, and (for orchestrators) fan out into child tasks.)r.   r/   r0   r1   r2   r3   r4   discordzSDiscord read and participate tools (fetch messages, search members, create threads)discord_adminzKDiscord server management (list channels/roles, pin messages, assign roles)yuanbaozAYuanbao platform tools - group info, member queries, DM, stickers)yb_query_group_infoyb_query_group_members
yb_send_dmyb_search_stickeryb_send_sticker
feishu_docz!Read Feishu/Lark document contentfeishu_doc_readfeishu_drivez:Feishu/Lark document comment operations (list, reply, add))feishu_drive_list_comments!feishu_drive_list_comment_repliesfeishu_drive_reply_commentfeishu_drive_add_commentspotifyzCNative Spotify playback, search, playlist, album, and library tools)spotify_playbackspotify_devicesspotify_queuespotify_searchspotify_playlistsspotify_albumsspotify_library	debuggingz%Debugging and troubleshooting toolkitsafez$Safe toolkit without terminal access)r5   r;   r<   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&   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 managementzhermes-cronzMDefault cron toolset - same core tools as hermes-cli; gated by `hermes tools`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)hermes-matrixzDMatrix bot toolset - decentralized encrypted messaging (full access)hermes-dingtalkzBDingTalk bot toolset - enterprise messaging platform (full access)hermes-feishuzLFeishu/Lark bot toolset - enterprise messaging via Feishu/Lark (full access))r\   r^   r_   r`   ra   hermes-weixinzFWeixin bot toolset - personal WeChat messaging via iLink (full access)hermes-qqbotzBQQBot toolset - QQ messaging via Official Bot API v2 (full access)hermes-wecomz=WeCom bot toolset - enterprise WeChat messaging (full access)hermes-wecom-callbackzJWeCom callback toolset - enterprise self-built app messaging (full access)hermes-yuanbaouZ   Yuanbao Bot 元宝消息平台工具集 - 群信息、成员查询、私聊、贴纸表情ztools.yuanbao_tools)r7   r8   moduler9   
hermes-smsz7SMS 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   rs   r~   rt   ru   rv   rw   rz   r{   rx   ry   hermes-webhookr|   )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      -/home/ubuntu/.hermes/hermes-agent/toolsets.py
<dictcomp>zget_toolset.<locals>.<dictcomp>  s3     
 
 
 yH$$ u$$$    r6   )
r   gettools.registryr   	Exceptionget_toolset_alias_target_get_plugin_toolset_names_get_registry_toolset_aliasesitemsget_tool_names_for_toolset)r   toolsetr   registry_toolsetr7   alias_targetreverse_aliasesr   s           r   get_toolsetr     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                    |t                      }| dv ret                      }t                      D ]9}t          ||                                          }|                    |           :t          |          S | |v rg S |                    |            t          |           }|s|                     d          r| t          d          d         	 ddl
m} |                              rst          t                    }	 ddlm} |                    fd|j                                        D                        n# t$          $ r Y nw xY wt'          |          S n# 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>   *allzhermes-r   )platform_registryr   c              3   <   K   | ]}|j         k    |j        V  d S N)r   r   )r   eplatform_names     r   	<genexpr>z"resolve_toolset.<locals>.<genexpr>Y  s>       , ,'( yM99 F9999, ,r   r8   r9   )setget_toolset_namesresolve_toolsetcopyupdatesortedaddr   
startswithlengateway.platform_registryr   is_registered_HERMES_CORE_TOOLSr   r   _toolsvaluesr   listr   )r   r   	all_toolstoolset_nameresolvedr   r   plugin_toolsr   r8   included_nameincluded_toolsr   s               @r   r   r   (  sJ    %% |!ee	-// 	' 	'L&|W\\^^DDHX&&&&i   
 w	KK $G  ??9%% 	 Y1MGGGGGG$22=AA 
.#&'9#:#:L;;;;;;$++ , , , ,,4O,B,B,D,D, , ,     %   ---
.     	 GR(())E
 !Z44 % %(@@^$$$$%==s6   /E# >E E# 
EE# EE# #
E0/E0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   r8   s       r   resolve_multiple_toolsetsr   r  sN     I    %%)r   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 r   r   )r   r   s     r   	<setcomp>z,_get_plugin_toolset_names.<locals>.<setcomp>  s-     
 
 
8++ +++r   )r   r   get_registered_toolset_namesr   r   r   s    r   r   r     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   )r   r   get_registered_toolset_aliasesr   r   s    r   r   r     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
    )dictr   r   r   r   r   )resultaliasests_namedisplay_namer   r   r   s          r   get_all_toolsetsr     s     (^^F+--G,.. 
+ 
+ ' 	 	E9G##X(=(=$6!!l++ 	+#*F< Mr   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   r   keysr   r   r   r   r   )namesr   r   r   r   s        r   r   r     s       E+--G,..   ' 	 	E9G##X(=(=		%   IIg%==r   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)r   r   r   )r   s    r   validate_toolsetr     sM     |txt(****t02222r   r7   r8   r9   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
    r6   Nr   r   r7   r8   r9   s       r   create_custom_toolsetr     s)      #"N HTNNNr   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
    Nr7   r8   r9   )r   r7   direct_toolsr9   resolved_tools
tool_countis_composite)r   r   r   bool)r   r   r   s      r   get_toolset_infor     su     $G t$T**N }-(J'(.))WZ011  r   __main__zToolsets System Demoz<============================================================z
Available Toolsets:z(----------------------------------------r   z[composite]z[leaf]z   20z - z     Tools: r   z totalz
Toolset Resolution Examples:)r5   r
   rk   rj   z
  :z    Resolved to z tools: z, z
Multiple Toolset Resolution:)r5   r;   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: r   )NN)"__doc__typingr   r   r   r   r   r   r   strr   r   r   r   r   r   r   r   r   r   r   __name__printr   r   r   info	compositer   r8   joinr   combinedcustom_infor   r   r   <module>r      s   0 2 1 1 1 1 1 1 1 1 1 1 1 1 1
% % % Tm	B. m I m 8"# m( ;"# )m4 Pi( 5m@ 
E%& AmL u>>> MmX  V
 
 
 
 
Ymp { qm| g ! }mH 	_
 
 
 
 
Im` xEEE aml 
o"# mmx G ymD Z EmP P"# Qm\ Z ]m mh f ! imt S!" umF I\\\ GmR 7
 
 

  Smv l wmB d!" CmN Z
 
 
 
 
Omf :#$ gmr S
 
 
  smD \
 
 
  Em\ >i(FO ]mh =222 imB  G
 
 
 ! Cmh  V
 
 
8 = imj a# kmv  g#	 	wmL	 i# M	m m mX	 v#'
 
  Y	mj	 f# k	mv	 g# w	mB
 X# C
mN
 g# O
mZ
 ]# [
mf
 W# g
mr
 Z# s
m~
 ]# 
mJ [# KmV e# '
 '
 '
 
 
 
Wmn _# omz [# {mF V# GmR c# Sm^ s# '
 '
 '
 
 ( _mx P# ym mF W#  Q r  r  r Qm m mb+c +htCH~6 + + + +\G G# GC GDI G G G GT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 r   