
    $*jx                     	   d Z ddlmZmZmZmZmZ g d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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	d0d1d2gg d	d3d4d3gg d	i d5d6d5gg d	d7d8g g d	d9d:d9gg d	d;d<d;gg d	d=d>d?gg d	d@dAdBgg d	dCdDg dEg d	dFdGg dHg d	dIdJdIgg d	dKdLdKgg d	dMdNg dOg d	dPdQdRgg d	dSdTg dUg d	dVdWg dXg d	dYdZddgdd-gd	d[d\g g d]d	d^d_g d`g dadbi dcddg deg d	dfdgg dhg d	didjeg d	dkdleg d	dmdneg d	dodpedIdKgz   g d	dqdreg d	dsdteg d	dudveg d	dwdxeg d	dydzeg d	d{d|eg d	d}d~eg d	ddeg d	ddeg d	ddeg dz   g d	ddeg d	deg d	deg d	deg d	deg dOz   dg dde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)1
web_searchweb_extractterminalprocessread_terminal	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_listkanban_completekanban_blockkanban_heartbeatkanban_commentkanban_createkanban_linkkanban_unblockcomputer_use)r   r	   r   r&   webz)Web research and content extraction toolsr   r	   descriptiontoolsincludessearchz0Web search only (no content extraction/scraping)x_searchu   Search X (Twitter) posts and threads via xAI's built-in x_search Responses tool. Available when xAI credentials are configured (SuperGrok OAuth or XAI_API_KEY). Off by default; enable in `hermes tools` → X (Twitter) Search.visionzImage analysis and vision toolsr   videozGVideo analysis and understanding tools (opt-in, not in default toolset)video_analyze	image_genz"Creative generation tools (images)r   	video_genu   Video generation tools. Single ``video_generate`` tool covers text-to-video (prompt only) and image-to-video (prompt + image_url) — the active backend auto-routes. Configure via ``hermes tools`` → Video Generation.video_generater8   u   Background macOS desktop control via cua-driver — screenshots, mouse, keyboard, scroll, drag. Does NOT steal the user's cursor or keyboard focus. Works with any tool-capable model.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*   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)context_enginez2Runtime tools exposed by the active context enginer%   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) list, unblock, and fan out tasks.)	r/   r0   r1   r2   r3   r4   r5   r6   r7   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)r9   r@   rC   codingzbCoding-focused toolset: files, terminal, search, web docs, skills, todo, delegate, vision, browser)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(   T)r;   r<   r=   posturez
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_   r`   hermes-weixinzFWeixin 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)uZ   Yuanbao Bot 元宝消息平台工具集 - 群信息、成员查询、私聊、贴纸表情ztools.yuanbao_tools)r;   r<   moduler=   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)rm   rn   ro   rp   rq   rr   rs   rt   
hermes-smsru   rv   rw   rx   hermes-wecomhermes-wecom-callbackry   hermes-qqbothermes-webhookhermes-yuanbao)r~   r|   r}   r   r{   r   zhermes-gatewaynamereturnc                 ^   t                               |           }	 ddlm} n# t          $ r	 |r|ndcY S w xY w|r[t          t          |                    dg                     t          |                    |                     z            }i |d|iS | }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   registryNr<   z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>l  s3     
 
 
 yH$$ u$$$    r:   )r   gettools.registryr   	Exceptionsortedsetget_tool_names_for_toolsetget_toolset_alias_target_get_plugin_toolset_names_get_registry_toolset_aliasesitems)	r   toolsetr   merged_toolsregistry_toolsetr;   alias_targetreverse_aliasesr   s	            r   get_toolsetr   I  s    ll4  G,+++++++ , , ,!+wwt+++,  2GR(())(55d;;<<=
 
 2'17L111+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   # 66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>  s>       , ,'( yM99 F9999, ,r   r<   r=   )r   get_toolset_namesresolve_toolsetcopyupdater   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   r<   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   r<   s       r   resolve_multiple_toolsetsr     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   r;   r<   r=   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:   Nr   r   r;   r<   r=   s       r   create_custom_toolsetr   7  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
    Nr;   r<   r=   )r   r;   direct_toolsr=   resolved_tools
tool_countis_composite)r   r   r   bool)r   r   r   s      r   get_toolset_infor   O  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:)r9   r
   rj   ri   z
  :z    Resolved to z tools: z, z
Multiple Toolset Resolution:)r9   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   _HERMES_WEBHOOK_SAFE_TOOLSr   strr   r   r   r   r   r   r   r   r   r   r   __name__printr   r   r   info	compositer   r<   joinr   combinedcustom_infor   r   r   <module>r      sT   0 2 1 1 1 1 1 1 1 1 1 1 1 1 1
- - - d   j	B. j I j ?
 	 	j2 8"# 3j> `!" ?jJ ;"# KjV 5
 ##	 	Wjl D !! mj@ Pi( AjL 
E%& MjX u>>> Yjd  V
 
 
 
 
ej| { }jH g ! IjV xEEE Wjb 
o"# cjn G oj jz Z {jF K GjR P"# Sj^ Z _jj f ! kjv S!" wjH I\\\ IjT ?
 
 
 ! Ujz l {jF d!" GjR Z
 
 
 
 
Sjj :#$ kjv S
 
 
  wjH \
 
 
  Ij` >i(FO ajl =222 mj@ {
 
 
  ) Aj j j|  G
 
 
 ! }jb	  V
 
 
8 = c	jd
 a# e
jp
  g#	 	q
jF i# GjR v#'
 
  Sjd f# ejp g# qj| X# }jH g# IjT ]# Uj` W# ajl Z# mjx ]# yjD [# EjP e# '
 '
 '
 
 
 
Qjh _# ij jv \#  W#  d#  t# '
 '
 '
 
 (  Q#  W+  Q r  r  r Kj j j\0c 0htCH~6 0 0 0 0f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   