From 52d9e5782537cbdd0e52ddf13694e090d850bf9b Mon Sep 17 00:00:00 2001 From: Teknium Date: Sat, 11 Apr 2026 19:36:48 -0700 Subject: [PATCH] feat: dynamic toolset generation for plugin platforms Plugin platforms now get full toolset support without any entries in toolsets.py. tools_config._get_platform_tools(): Falls back to 'hermes-' when the platform isn't in the static PLATFORMS dict. No more KeyError for plugin platforms. toolsets.resolve_toolset(): Auto-generates a toolset for plugin platforms (hermes-) containing _HERMES_CORE_TOOLS plus any tools the plugin registered into a matching toolset name. This means a plugin can call ctx.register_tool(toolset='irc', ...) and those tools will be included in the hermes-irc toolset automatically. webhook.py: Registry-aware cross-platform delivery. run_agent.py: Platform hints from plugin registry. IRC adapter: Token lock + platform hint. Removed dead token-empty-warning extension. Updated docs. --- hermes_cli/tools_config.py | 7 ++++++- toolsets.py | 21 +++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/hermes_cli/tools_config.py b/hermes_cli/tools_config.py index 31156f15f9..5290bd1b04 100644 --- a/hermes_cli/tools_config.py +++ b/hermes_cli/tools_config.py @@ -781,7 +781,12 @@ def _get_platform_tools( toolset_names = platform_toolsets.get(platform) if toolset_names is None or not isinstance(toolset_names, list): - default_ts = PLATFORMS[platform]["default_toolset"] + plat_info = PLATFORMS.get(platform) + if plat_info: + default_ts = plat_info["default_toolset"] + else: + # Plugin platform — derive toolset name from platform key + default_ts = f"hermes-{platform}" toolset_names = [default_ts] # YAML may parse bare numeric names (e.g. ``12306:``) as int. diff --git a/toolsets.py b/toolsets.py index a444713f57..ee067aa13e 100644 --- a/toolsets.py +++ b/toolsets.py @@ -564,6 +564,27 @@ def resolve_toolset(name: str, visited: Set[str] = None) -> List[str]: # Get toolset definition toolset = get_toolset(name) if not toolset: + # Auto-generate a toolset for plugin platforms (hermes-). + # Gives them _HERMES_CORE_TOOLS plus any tools the plugin registered + # into a toolset matching the platform name. + if name.startswith("hermes-"): + platform_name = name[len("hermes-"):] + try: + from gateway.platform_registry import platform_registry + if platform_registry.is_registered(platform_name): + plugin_tools = set(_HERMES_CORE_TOOLS) + try: + from tools.registry import registry + plugin_tools.update( + e.name for e in registry._tools.values() + if e.toolset == platform_name + ) + except Exception: + pass + return list(plugin_tools) + except Exception: + pass + return [] # Collect direct tools