
    PL
jp                        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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/d0d1gg dd2d3d2gg di d4d5d4gg dd6d7d6gg dd8d9d8gg dd:d;d<gg dd=d>d?gg dd@dAg dBg ddCdDg dEg ddFdGdFgg ddHdIdHgg ddJdKg dLg ddMdNdOgg ddPdQg dRg ddSdTg dUg ddVdWddgdd,gddXdYg g dZdd[d\g d]g dd^d_g d`g di dadbeg ddcddeg ddedfeg ddgdhedFdHgz   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{d|eg d}z   g dd~deg dddeg dddeg ddeg ddeg dL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)0
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_listkanban_completekanban_blockkanban_heartbeatkanban_commentkanban_createkanban_linkkanban_unblockcomputer_use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_generater7   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)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) list, unblock, and fan out tasks.)	r.   r/   r0   r1   r2   r3   r4   r5   r6   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)r8   r?   rB   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))rY   r[   r\   r]   r^   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)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)ri   rj   rk   rl   rm   rn   ro   rp   
hermes-smsrq   rr   rs   rt   rw   hermes-wecom-callbackru   rv   hermes-webhookhermes-yuanbao)rz   r|   ry   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/kuhnn/.hermes/hermes-agent/toolsets.py
<dictcomp>zget_toolset.<locals>.<dictcomp>>  s3     
 
 
 yH$$ u$$$    r9   )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     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   N  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
    r9   Nr   r}   r:   r;   r<   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
    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   !  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:)r8   r
   rh   rg   z
  :z    Resolved to z tools: z, z
Multiple Toolset Resolution:)r8   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   r;   joinr   combinedcustom_infor   r   r   <module>r      s   0 2 1 1 1 1 1 1 1 1 1 1 1 1 1
* * * ^I	B. I I I ?
 	 	I2 8"# 3I> `!" ?IJ ;"# KIV 5
 ##	 	WIl D !! mI@ Pi( AIL 
E%& MIX u>>> YId  V
 
 
 
 
eI| { }IH g ! IIV xEEE WIb 
o"# cIn G oI Iz Z {IF P"# GIR Z SI^ f ! _Ij S!" kI| I\\\ }IH ?
 
 
 ! IIn l oIz d!" {IF Z
 
 
 
 
GI^ :#$ _Ij S
 
 
  kI| \
 
 
  }IT >i(FO UI` =222 aIz  G
 
 
 ! {I`  V
 
 
8 = aI I Ib	 a# c	In	  g#	 	o	ID
 i# E
IP
 v#'
 
  Q
Ib
 f# c
In
 g# o
Iz
 X# {
IF g# GIR ]# SI^ W# _Ij Z# kIv ]# wIB [# CIN e# '
 '
 '
 
 
 
OIf _# gIr [# sI~ V# I IL d#  t# '
 '
 '
 
 (  Q#  W#  Q r  r  r II I IZ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   