Ë
    ãß²j™`  ã                   ó$  — U d Z ddlmZmZmZmZmZmZ g d¢Zg d¢Z	g d¢Z
g d¢Zg d¢Zdºd„Zd»d	„Zd
dœd„Z eddddge
¢­ddiŽZi d edddg«      “d eddg«      “d eddg«      “d eddg«      “d edd g«      “d! ed"dg«      “d# ed$g d%¢«      “d ed&dg«      “d' ed(d'd)g«      “d* ed+g d,¢«      “d- ed.eD � cg c]  } | j#                  d/«      sŒ| ‘Œ c} «      “d0 ed1dg«      “d2 ed3g d4¢«      “d5 ed6dg«      “d7 ed8d9g«      “d: ed;d:g«      “d< ed=«      “i d> ed?d>g«      “d@ edAdBg«      “dC edDdEg«      “dF edG«      “dH edIg dJ¢«      “dK edLdKg«      “dM edNdOg«      “dP edQdRg«      “dS edTe
«      “d edUeD � cg c]  } | j#                  dV«      sŒ| ‘Œ c} «      “dW edXdWg«      “dY edZdYg«      “d[ ed\e«      “d] ed^d_g«      “d` edaedbdc «      “dd edeg df¢«      “dg edhd'd)gdd2g¬i«      “¥i dj edkg g dl¢¬i«      “dm edned
¬o«      “dp edqeD � cg c]
  } | dKk7  sŒ	| ‘Œ c} «      “dr eds eddKdd¬«      «      “dt edu«      “dv edw«      “dx edy«      “dz ed{dWdYg«      “d| ed}«      “d~ ed«      “d€ ed�«      “d‚ edƒ«      “d„ ed…«      “d† ed‡«      “dˆ ed‰«      “dŠ ed‹«      “dŒ ed�«      “¥ edŽe«       ed�«       ed�«       ed‘«       ed’«      d“eez   d”g d•œ ed–«       ed—e	«       ed˜g g d™¢¬i«      dšœ	¥Zd›„ Zdœefd�„Zdžeeef   fdŸ„Zd
d œd¡ed¢edžeeeef      fd£„Zd¤edžee   fd¥„Zi Zeeeeeeef   ee   f   ed¦<   d¡edžee   fd§„Zd¼d
d œd¡ed¨ee   d¢edžee   fd©„Zdžee   fdª„Zdžeeef   fd«„Z d¬ed­eeef   džee   fd®„Z!džee   fd¯„Z"džeeeeef   f   fd°„Z#džee   fd±„Z$d¡edžefd²„Z%d½d¡ed³ed´ee   dµee   dždcf
d¶„Z&d¡edžeeef   fd·„Z'd¸ee   džee   fd¹„Z(ycc c} w c c} w c c} w )¾z`Toolset helpers: get/resolve/validate named tool groups (static TOOLSETS + registry-registered).é    )ÚDictÚListÚAnyÚSetÚOptionalÚTuple);Ú
web_searchÚweb_extractÚterminalÚprocess_manageÚ	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Úbrowser_vault_listÚbrowser_vault_unlockÚbrowser_vault_fillÚbrowser_vault_save_loginÚbrowser_vault_enter_codeÚbrowser_execÚtext_to_speechÚ	todo_listÚmemoryÚsession_searchÚclarifyÚexecute_codeÚdelegate_taskÚcronjob_manageÚha_list_entitiesÚha_get_stateÚha_list_servicesÚha_call_serviceÚkanban_showÚkanban_listÚkanban_completeÚkanban_blockÚkanban_request_reviewÚkanban_request_changesÚkanban_heartbeatÚkanban_commentÚkanban_createÚkanban_linkÚkanban_unblockÚkanban_attachÚkanban_attach_urlÚkanban_attachmentsÚcomputer_useÚmanage_connections)r	   r
   r   r,   )r0   r1   r2   r3   )Úfeishu_doc_readÚfeishu_drive_list_commentsÚ!feishu_drive_list_comment_repliesÚfeishu_drive_reply_commentÚfeishu_drive_add_comment)Úyb_query_group_infoÚyb_query_group_membersÚ
yb_send_dmÚyb_search_stickerÚyb_send_stickerc                 ó6   — | t        |«      t        |«      dœ|¥S )zTOne TOOLSETS entry (fresh lists per entry; extra keys such as posture pass through).©ÚdescriptionÚtoolsÚincludes)Úlist)rP   rQ   rR   Úextras       ú-/home/ubuntu/.hermes/hermes-agent/toolsets.pyÚ_tsrV   4   s   € à&´°e³Ì$ÈxË.ÑbÐ\aÐbÐbó    c                 ó:   — t        | t        t        |«      z   «      S )zRA `hermes-*` platform bundle: the shared core tools plus optional platform extras.)rV   Ú_HERMES_CORE_TOOLSrS   )rP   Úextrass     rU   Ú_bundler[   9   s   € äˆ{Ô.´°f³Ñ=Ó>Ð>rW   T)Úkanbanc                 óf   — t         D �cg c]  }||vsŒ| s|j                  d«      rŒ|‘Œ c}S c c}w )zd_HERMES_CORE_TOOLS minus *excluded* (and, unless kanban=True, every kanban_* tool); order preserved.Úkanban_)rY   Ú
startswith)r\   ÚexcludedÚts      rU   Ú_core_withoutrb   >   s.   € ä)Ök�!¨Q°hÒ->ÁFÐRS×R^ÑR^Ð_hÕRiŠAÒkÐkùÒks   ‰	.“.§.r   r(   r/   rB   r\   FÚwebz)Web research and content extraction toolsr	   r
   Úsearchz0Web search only (no content extraction/scraping)Úx_searchuE  Search X (Twitter) posts and threads via xAI's built-in x_search Responses tool. Read-only public X discovery; use the xurl skill for authenticated X API reads and account actions. 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)Ú	video_genu  Video generation tools. Single ``video_generate`` tool covers text-to-video (prompt only) and image-to-video (prompt + image_url), plus reference-to-video. Provider-specific edit/extend workflows may appear as separate tools. Configure via ``hermes tools`` â†’ Video Generation.)Úvideo_generateÚxai_video_editÚxai_video_extenduÆ   Background desktop control via cua-driver (macOS/Windows/Linux) â€” 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   Ú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)Úbrowser_ÚcronjobzbCronjob management tool - create, list, update, pause, resume, remove, and trigger scheduled tasksÚ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 xAIÚtodoz.Task planning and tracking for multi-step workr)   r*   zAPersistent memory across sessions (personal notes + user profile)Úcontext_enginez2Runtime tools exposed by the active context enginer+   z7Search and recall past conversations with summarizationÚconnectionsz@Remote connector discovery, execution, and account authorizationrC   ÚprojectuG   Desktop Projects â€” create/switch named workspaces (GUI sessions only)Údesktop_projectÚbot_roomz/Verified text-only Group Chat turn capabilitiesÚ
desktop_uiud   Desktop GUI affordances â€” in-app terminal/browser panes, pane focus, reactions (GUI sessions only))
Úread_terminalÚclose_terminalÚdesktop_previewÚdrive_previewÚannotate_previewÚread_window_belowÚ
focus_paneÚreact_to_messageÚgui_tourÚshow_tipr,   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 monitoringuû  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, enter first-class review (request_review â€” not a block), return review changes, block for human input, heartbeat during long ops, comment on threads, attach files, and (for orchestrators) list, unblock, and fan out tasks.r^   Ú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Ú
feishu_docz!Read Feishu/Lark document contentrD   Úfeishu_drivez:Feishu/Lark document comment operations (list, reply, add)é   NÚ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)rR   Úsafez$Safe toolkit without terminal access)rc   rf   ri   ÚcodingzbCoding-focused toolset: files, terminal, search, web docs, skills, todo, delegate, vision, browser)Úposturez
hermes-acpum   Editor integration (VS Code, Zed, JetBrains) â€” coding-focused tools without messaging, audio, or clarify UIzhermes-api-serveru|   OpenAI-compatible API server â€” full agent tools accessible via HTTP (no interactive UI tools like clarify or send_message)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)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)uZ   Yuanbao Bot å…ƒå®�æ¶ˆæ�¯å¹³å�°å·¥å…·é›† - ç¾¤ä¿¡æ�¯ã€�æˆ�å‘˜æŸ¥è¯¢ã€�ç§�è�Šã€�è´´çº¸è¡¨æƒ…ztools.yuanbao_tools)rP   rQ   ÚmodulerR   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)rš   r›   rœ   r�   rž   rŸ   r    r¡   ú
hermes-smsr¢   r£   r¤   úhermes-feishuúhermes-wecomúhermes-wecom-callbackúhermes-weixinúhermes-qqbotúhermes-webhookúhermes-yuanbao)	r§   rª   r«   r¨   r©   r­   r¦   r¬   zhermes-gatewayc                  ó2   — 	 ddl m}  | S # t        $ r Y yw xY w)zBLive tool registry, or None when tools.registry can't be imported.r   ©ÚregistryN)Útools.registryr°   Ú	Exceptionr¯   s    rU   Ú	_registryr³   ô   s!   € ðÝ+ØˆøÜò Ùðús   ‚
 Š	•Úmethodc                 óX   — 	  t        t        «       | «      «       S # t        $ r |cY S w xY w)zTregistry.<method>() or *default* when the registry is unavailable or the call fails.)Úgetattrr³   r²   )r´   Údefaults     rU   Ú_registry_callr¸   ý   s/   € ðØ+Œw”y“{ FÓ+Ó-Ð-øÜò ØŠðús   ‚ ›)¨)Úreturnc                  óN   — t        «       } | �t        | «      t        | dd«      fS dS )NÚ_generationr   )r   r   )r³   Úidr¶   )Úregs    rU   Ú_registry_generationr¾     s*   € Ü
‹+€CØ8;¸ŒBˆs‹G”W˜S -°Ó3Ð4ÐSÈVÐSrW   ©Úinclude_registryÚnamerÀ   c                óŒ  — t         j                  | «      }|s?|r;i |¥t        |j                  dg «      «      t        |j                  dg «      «      dœ¥S dS t        «       }|€|r|S dS |r|t	        |j                  dg «      «      t	        |j                  | «      «      z  }|j                  | «      }|r"|| k7  r|t	        |j                  |«      «      z  }i |¥dt        |«      i¥S | t        «       v r$| }t        | t        «       «      }|rd|› d�nd| › �}n|j                  | «      }|syd| › d�}||j                  |«      g dœS )	aÔ  Toolset definition, or None if unknown.

    include_registry=True merges plugin/overlay tools registered into this toolset
    and resolves registry-only (plugin/MCP) toolsets and aliases; False returns a
    copy of the static TOOLSETS entry only, so platform reverse-mapping is
    unaffected by registry additions.

    Args: name (str): Name of the toolset include_registry (bool): When True (default), merge in tools that
    plugins/overlays registered into this toolset via the registry. Platform reverse-mapping in
    ``_get_platform_tools`` uses False so that a tool registered into a toolset but absent from a platform's
    static composite does not drop the whole toolset from inference. See issue #49622.
    rQ   rR   )rQ   rR   NzMCP server 'z' toolszPlugin toolset: rO   )ÚTOOLSETSÚgetrS   r³   ÚsetÚget_tool_names_for_toolsetÚget_toolset_alias_targetÚsortedÚ_get_plugin_toolset_namesÚ_display_aliasÚ_get_registry_toolset_aliases)	rÁ   rÀ   Útoolsetr°   Úmerged_toolsÚalias_targetÚregistry_toolsetÚaliasrP   s	            rU   Úget_toolsetrÑ   
  sr  € ô �l‰l˜4Ó €GÙÙv}Ðr�'Ðr¤D¨¯©°W¸bÓ)AÓ$BÔPTÐU\×U`ÑU`ÐakÐmoÓUpÓPqÒrð  	Hð  DHð  	Hä‹{€HØÐÙ!ˆwÐ+ tÐ+áÜ˜7Ÿ;™; w°Ó3Ó4´s¸8×;^Ñ;^Ð_cÓ;dÓ7eÑeˆð  ×8Ñ8¸Ó>ˆÙ˜L¨DÒ0ØœC × CÑ CÀLÓ QÓRÑRˆLØ9�'Ð9˜7¤F¨<Ó$8Ñ9Ð9àÔ(Ó*Ñ*àÐÜ˜tÔ%BÓ%DÓEˆÙ7<˜ U G¨7Ñ3ÐDTÐUYÐTZÐB[‰à#×<Ñ<¸TÓBÐÙØØ$ T F¨'Ð2ˆØ&°×1TÑ1TÐUeÓ1fÐtvÑwÐwrW   Útoolset_namec                 ó  — t        t        «      }t        | «      }|rd|v st        t        | «      «      |z
  S t        |d   «      }t	        t        |j                  dg «      «      D ]  }|sŒd|v sŒ|j                  |d   «       Œ  ||z
  S )a  A bundle's tools minus _HERMES_CORE_TOOLS (one level of includes).

    Disabling a `core + extras` bundle must not strip the core tools every other
    toolset shares. One `includes` pass suffices (only hermes-gateway nests
    bundles). Unknown names: full resolution minus core.
    rQ   rR   )rÅ   rY   rÑ   Úresolve_toolsetÚmaprÄ   Úupdate)rÒ   ÚcoreÚts_defÚ	to_removeÚinc_defs        rU   Úbundle_non_core_toolsrÛ   6  s‘   € ô Ô!Ó"€DÜ˜Ó&€FÙ�w &Ñ(Ü”? <Ó0Ó1°DÑ8Ð8Ü�F˜7‘OÓ$€IÜ”{ F§J¡J¨z¸2Ó$>Ó?ò /ˆÚ�w 'Ò)Ø×Ñ˜W WÑ-Õ.ð/ð �tÑÐrW   Ú_resolve_toolset_memoc                 óN  ‡— | j                  d«      sg S | t        d«      d Š	 ddlm} |j	                  ‰«      sg S 	 t        t        «      }	 |j                  ˆfd„t        dd«      D «       «       t        |«      S # t
        $ r g cY S w xY w# t
        $ r Y t        |«      S w xY w)zŸImplicit `hermes-<platform>` bundle for a registered plugin platform: core
    tools plus whatever the plugin registered under the platform name. [] otherwise.zhermes-Nr   )Úplatform_registryc              3   óV   •K  — | ]   }|j                   ‰k(  sŒ|j                  –— Œ" y ­w©N)rÌ   rÁ   )Ú.0ÚeÚplatform_names     €rU   ú	<genexpr>z*_plugin_platform_bundle.<locals>.<genexpr>]  s!   øè ø€ Òi ÈaÏiÉiÐ[hÓNh�Q—V•VÑiùs   ƒ)˜)Úget_all_entries© )r_   ÚlenÚgateway.platform_registryrÞ   Úis_registeredr²   rÅ   rY   rÖ   r¸   rS   )rÁ   rÞ   rQ   rã   s      @rU   Ú_plugin_platform_bundlerê   O  s±   ø€ ð �?‰?˜9Ô%Øˆ	Øœ˜Y›˜Ð)€MðÝ?Ø ×.Ñ.¨}Ô=ØˆIð >ô Ô"Ó#€EðØ�‰Ói¤^Ð4EÀrÓ%JÔiÔiô �‹;Ðøô ò ØŠ	ðûô
 ò ØÜ�‹;Ððús#   ¤A= Á$B Á=BÂ
BÂ	B$Â#B$Úvisitedc                óØ  — |du }|rG| |gt        «       ¢t        dd«      ‘­}t        j                  |«      }|�t	        |«      S t        «       }| dv rOt        «       }t        «       D ]-  }|j                  t        ||j                  «       |¬«      «       Œ/ t        |«      S | |v rg S |j                  | «       t        | |¬«      }|s|rt        | «      S g S t        |j                  dg «      «      }	|j                  dg «      D ]  }
|	j                  t        |
||¬«      «       Œ! t        |	«      }|r8t        t        «      dk\  rt        j                  «        t	        |«      t        <   |S )	a!  Recursively resolve a toolset (and its includes) to a sorted tool-name list.
    include_registry=False resolves the static TOOLSETS view only.

    Args: name (str): Name of the toolset to resolve visited (Set[str]): Set of already visited toolsets
    (for cycle detection) include_registry (bool): When True (default), include tools that plugins/overlays
    registered into a toolset. Platform reverse-mapping uses False so a registry-added tool cannot drop the
    whole toolset from inference (see #49622 and ``_get_platform_tools``).
    NÚcurrent_scope_keyÚ >   Ú*Úallr¿   rQ   rR   é   )r¾   r¸   rÜ   rÄ   rS   rÅ   Úget_toolset_namesrÖ   rÔ   ÚcopyrÈ   ÚaddrÑ   rê   rç   Úclear)rÁ   rë   rÀ   Úexternal_callÚmemo_keyÚcachedÚ	all_toolsrÒ   rÌ   rQ   Úincluded_nameÚresults               rU   rÔ   rÔ   c  sg  € ð ˜t�O€MÙØÐ*ÐmÔ-AÓ-CÐmÄ^ÐTgÐikÓElÑmˆÜ&×*Ñ*¨8Ó4ˆØÐÜ˜“<ÐÜ“%ˆð ˆ|ÑÜ!›eˆ	Ü-Ó/ò 	oˆLØ×Ñœ_¨\¸7¿<¹<»>Ð\lÔmÕnð	oä�iÓ Ð ð ˆw�Øˆ	Ø‡K�K�Ôä˜$Ð1AÔB€GÙÙ0@Ô& tÓ,ÐHÀbÐHä�—‘˜G RÓ(Ó)€EØ Ÿ™ Z°Ó4ò aˆØ�‰”_ ]°GÐN^Ô_Õ`ðaô �E‹]€FÙÜÔ$Ó%¨Ò,Ü!×'Ñ'Ô)Ü*.¨v«,Ô˜hÑ'Ø€MrW   c                  óR   — t        dd«      D � ch c]  } | t        vsŒ| ’Œ c} S c c} w )z<Registry toolset names absent from the static TOOLSETS dict.Úget_registered_toolset_namesræ   )r¸   rÃ   )Úns    rU   rÉ   rÉ   �  s&   € ä%Ð&DÀbÓIÖ_�!ÈQÔV^ÒM^ŠAÒ_Ð_ùÒ_s   �$�$c                  ó   — t        di «      S )NÚget_registered_toolset_aliases)r¸   ræ   rW   rU   rË   rË   •  s   € ÜÐ:¸BÓ?Ð?rW   Úts_nameÚaliasesc                 óJ   ‡ — t        ˆ fd„|j                  «       D «       d«      S )z6First non-static alias pointing at *ts_name*, or None.c              3   óF   •K  — | ]  \  }}|‰k(  sŒ|t         vsŒ|–— Œ y ­wrà   )rÃ   )rá   ÚaÚ	canonicalr  s      €rU   rä   z!_display_alias.<locals>.<genexpr>›  s%   øè ø€ Òe‘|�q˜)¸)ÀwÓ:NÐSTÔ\dÒSd”Ñeùs   ƒ!‘!š!N)ÚnextÚitems)r  r  s   ` rU   rÊ   rÊ   ™  s   ø€ äÓe w§}¡}£ÔeÐgkÓlÐlrW   c                  ól   — t        «       } t        «       D �cg c]  }t        || «      xs |‘Œ c}S c c}w )zOPlugin toolset names, shown under their first non-static alias when one exists.)rË   rÉ   rÊ   )r  rþ   s     rU   Ú_plugin_display_namesr
  ž  s0   € ä+Ó-€GÜ5NÓ5PÖQ°ŒN˜1˜gÓ&Ò+¨!Ñ+ÒQÐQùÒQs   —1c                  ó  — t        t        «      } t        «       }t        «       D ]  }|| v rdn
t	        |«      }|sŒ|| |<   Œ t        j                  «       |j                  «       z  D ]  }t	        |«      xs | |   | |<   Œ | S )z7All toolset definitions: static plus plugin-registered.N)ÚdictrÃ   rË   r
  rÑ   Úkeys)rû   r  Údisplay_namerÌ   rÁ   s        rU   Úget_all_toolsetsr  ¤  sƒ   € ä”(‹^€FÜ+Ó-€GÜ-Ó/ò +ˆØ&¨&Ñ0‘$´kÀ,Ó6OˆÚØ#*ˆF�<Ò ð+ô
 —‘“ '§,¡,£.Ñ0ò 9ˆÜ" 4Ó(Ò8¨F°4©LˆˆtŠð9à€MrW   c                  óv   — t        t        t        j                  «       «      t        t	        «       «      z  «      S )zBSorted names of all toolsets (static + plugin), excluding aliases.)rÈ   rÅ   rÃ   r  r
  ræ   rW   rU   rò   rò   ²  s&   € ä”#”h—m‘m“oÓ&¬Ô-BÓ-DÓ)EÑEÓFÐFrW   c                 óV   — | dv xs$ | t         v xs | t        «       v xs | t        «       v S )N>   rï   rð   )rÃ   rÉ   rË   )rÁ   s    rU   Úvalidate_toolsetr  ·  sA   € Ø�LÐ ò ^ D¬HÐ$4ò ^ØÔ0Ó2Ð2ò^Ø6:Ô>[Ó>]Ð6]ð_rW   rP   rQ   rR   c                 ó<   — t        ||xs g |xs g «      t        | <   y)z'Register a runtime toolset in TOOLSETS.N)rV   rÃ   )rÁ   rP   rQ   rR   s       rU   Úcreate_custom_toolsetr  ¼  s   € ä˜ e¢k¨r°8²>¸rÓB„HˆT‚NrW   c           
      ó„   — t        | «      }|syt        | «      }| |d   |d   |d   |t        |«      t        |d   «      dœS )z?Toolset definition plus its resolved tools, or None if unknown.NrP   rQ   rR   )rÁ   rP   Údirect_toolsrR   Úresolved_toolsÚ
tool_countÚis_composite)rÑ   rÔ   rç   Úbool)rÁ   rÌ   r  s      rU   Úget_toolset_infor  Á  sV   € ä˜$Ó€GÙØÜ$ TÓ*€Nà W¨]Ñ%;Ø Ñ(°g¸jÑ6IØ(¼¸NÓ8KÜ˜W ZÑ0Ó1ñ	ð rW   Útoolset_namesc                 ór   — t        «       }| D ]  }t        |«      }|j                  |«       Œ  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Á   rQ   s       rU   Úresolve_multiple_toolsetsr  Ô  s?   € ô “€Iàò  ˆÜ Ó%ˆØ×Ñ˜Õð ô �)ÓÐrW   )ræ   ræ   )ræ   rà   )NN))Ú__doc__Útypingr   r   r   r   r   r   rY   Ú_HERMES_WEBHOOK_SAFE_TOOLSÚ	_HA_TOOLSÚ_FEISHU_TOOLSÚ_YUANBAO_TOOLSrV   r[   rb   Ú_CODING_TOOLSr_   rÃ   r³   Ústrr¸   Úintr¾   r  rÑ   rÛ   rÜ   Ú__annotations__rê   rÔ   rÉ   rË   rÊ   r
  r  rò   r  r  r  r  )ra   s   0rU   ú<module>r)     s|  ðÚ fç 8× 8òÐ ò@ XÐ ÚW€	ò€ò y€ócó
?ð
 %)ô lñ Ð.Ð0@ÐBRÐTbÐ}ÐenÒ}Ðw|Ñ}€ðià	‰3Ð:¸\È=Ð<YÓZðið ‰cÐDÀ|ÀnÓUðið ‘ð	ð
 
ˆóð	ið ‰cÐ3Ð6FÐ5GÓHðið ‰SÐZÐ]lÐ\mÓnðið ‘Ð9Ð<LÐ;MÓNðið ‘ð	Oò 	Aóðið, ‘Cð	@ð 
Ðó	ð-ið8 ‘ÐMÐPZÐ\lÐOmÓnð9ið: ‰cð	%â5óð;iðL ‰sð	à&ÖCˆq¨!¯,©,°zÕ*BŠÒCóðMiðV ‰sð	"à	ÐóðWið` ‰Cð	#â<óðaiðj 
‰3ÐgÐjzÐi{Ó|ðkiðl ‰CÐ@À;À-ÓPðmiðn ‰cÐUÐX`ÐWaÓbðoiðp ‘cÐNÓOñqiðr ‘cÐSÐVfÐUgÓhðsiðt ‘3ÐYÐ\pÐ[qÓrðuiðv ‰sÐ\Ð_pÐ^qÓrðwiðx ‘ÐEÓFðyiðB ‘#ð	(ò	!óðCiðP ‰sÐVÐYbÐXcÓdðQiðR ‘cÐiÐlzÐk{Ó|ðSiðT ‘#ÐRÐUdÐTeÓfðUiðV ‘SÐKÈYÓWðWiðX ‰cð	Kð 'ÖBˆq¨!¯,©,°yÕ*AŠÒBó	ðYiðl ‰sÐhÐktÐjuÓvðmiðn ‘SÐfÐixÐhyÓzðoiðp ‰sÐVÐXfÓgðqiðr ‘#Ð9Ð<MÐ;NÓOðsiðt ‘CÐTÐVcÐdeÐdfÐVgÓhðuiðv ‰sØMò	CóðwiðD ‘Ð<¸zÐK[Ð>\ÐhmÐouÐgvÔwòEiðF ‰CÐ6¸ÒEcÔdðGiðR ‰cð	$àØô	ðSiðf ‘#ð	*à!Ö4ˆq Q¨)£^ŠÒ4óðgiðp ™ð	=áÐ&¨	°>È%ÔPóðqiðz ‘'ÐdÓeð{iðB ‘7ÐjÓkðCiðD ‘wÐqÓrðEiðF ‘gð	à	�OÐ$óðGiðP ‘wÐnÓoðQiðR ‘GÐlÓmðSiðT ‘WÐ^Ó_ðUiðV ™'Ð"rÓsðWiðX ™GÐ$jÓkðYiðZ ‘GÐ\Ó]ð[ið\ ™Ð!dÓeð]ið^ ‘WÐcÓdð_ið` ‘wÐcÓdñaiñb ÐkÐmzÓ{ÙÐeÓfÙÐ`ÓaÙÐ[Ó\Ù$Ð%qÓràsØ# nÑ4Ø'Øñ	ñ ÐSÓTÙÐYÐ[uÓvÙØAØ
ò
ô
ò}i€òXð˜3ó ðT˜e C¨ H™oó Tð
 8<ò )x�cð )x°ð )xÀÈÈcÐSVÈhÉÑ@Xó )xðX¨ð °°C±ó ð, KMÐ �t˜E # t¨S°#°sÐ":Ñ;¸TÀ#¹YÐFÑGÓ Lð #ð ¨$¨s©)ó ð(*ÐUYò *˜#ð *¨¨C©ð *Èdð *Ð^bÐcfÑ^gó *ðZ` 3 s¡8ó `ð
@ t¨C°¨H¡~ó @ðm˜Cð m¨$¨s°C¨x©.ð m¸XÀc¹]ó mð
R˜t C™yó Rð˜$˜s D¨¨c¨¡NÐ2Ñ3ó ðG˜4 ™9ó Gð
_˜3ð _ 4ó _ñ
C ð C°#ð C¸dÀ3¹ið CÐZ^Ð_bÑZcð CÐosó Cð
˜3ð  4¨¨S¨¡>ó ð&¨T°#©Yð ¸4À¹9ô ùòG 	DùòV 	CùòD 	5s$   Ã PÃPÆPÆ$PÈ'
PÈ2P