{"repo":"NousResearch/hermes-agent","public_id":"3511","display_label":"Missing platform registrations causing KeyErrors","summary":"Multiple platforms (SMS/Twilio, webhook, Mattermost, Matrix, DingTalk) are absent from the PLATFORMS registry or toolset registration, causing KeyErrors and configuration failures at runtime. Members include both bug reports and proposed fixes for these missing registrations.","subsystem":"gateway","counts":{"members":10,"open_issues":0,"open_issues_distinct":0,"open_prs":0,"closed_issues":3,"merged_prs":2,"attempt_prs":5},"landed_fix":{"status":"merged_to_main","basis":"structural","pr":3583},"resolution":{"state":"unresolved","by":null},"freshness":{"state":"stale","last_verified_at":"2026-04-02T21:00:22+00:00","is_stale":true},"grouping":{"backbone":"STRUCTURAL_PARTIAL","link_density":0.17955555555555555},"fix_edges":[{"issue_number":3511,"pr_number":3583,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false},{"issue_number":3773,"pr_number":4660,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false}],"members":[{"kind":"issue","number":3511,"title":"[Bug]: Mattermost configuration parsing fails","url":null,"state":"closed"},{"kind":"issue","number":3773,"title":"[Bug]: Webhook-triggered agent runs crash with KeyError: 'webhook' due to missing platform/toolset registration","url":null,"state":"closed"},{"kind":"issue","number":9789,"title":"KeyError: 'sms' when SMS gateway receives a message — platform missing from PLATFORMS registry","url":null,"state":"closed"},{"kind":"pr","number":3512,"title":"fix: mattermost configuration parsing bugs","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#3583","number":3583}],"category":"merged_via","implication":"superseded"},"merged":false},{"kind":"pr","number":3583,"title":"fix: add missing mattermost/matrix/dingtalk toolsets + platform consistency tests (salvage #3512)","url":null,"state":"merged","close_reason":{"category":"merged","implication":"superseded"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["hermes_cli/skills_config.py","hermes_cli/tools_config.py","tests/hermes_cli/test_tools_config.py","toolsets.py"]},{"kind":"pr","number":3775,"title":"fix(gateway): register webhook platform and toolset to fix KeyError on agent runs ","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"e0b2bdb089dd86adc74298f22b649d684785a616","number":0},{"kind":"pr","value":"#4660","number":4660},{"kind":"pr","value":"#4363","number":4363}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":4660,"title":"fix: webhook platform support — skip home channel prompt, disable tool progress (salvage #4363)","url":null,"state":"merged","close_reason":{"category":"merged","implication":"superseded"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["gateway/run.py","hermes_cli/skills_config.py","hermes_cli/tools_config.py","toolsets.py"],"fix_hunks":[{"file":"gateway/run.py","hunks":["@@ -2449,7 +2449,8 @@ async def _handle_message_with_agent(self, event, source, _quick_key: str):\n             )\n         \n         # One-time prompt if no home channel is set for this platform\n-        if not history and source.platform and source.platform != Platform.LOCAL:\n+        # Skip for webhooks - they deliver directly to configured targets (github_comment, etc.)\n+        if not history and source.platform and source.platform != Platform.LOCAL and source.platform != Platform.WEBHOOK:\n             platform_name = source.platform.value\n             env_key = f\"{platform_name.upper()}_HOME_CHANNEL\"\n             if not os.getenv(env_key):","@@ -5356,7 +5357,10 @@ async def _run_agent(\n             or os.getenv(\"HERMES_TOOL_PROGRESS_MODE\")\n             or \"all\"\n         )\n-        tool_progress_enabled = progress_mode != \"off\"\n+        # Disable tool progress for webhooks - they don't support message editing,\n+        # so each progress line would be sent as a separate message.\n+        from gateway.config import Platform\n+        tool_progress_enabled = progress_mode != \"off\" and source.platform != Platform.WEBHOOK\n         \n         # Queue for progress messages (thread-safe)\n         progress_queue = queue.Queue() if tool_progress_enabled else None"]},{"file":"hermes_cli/skills_config.py","hunks":["@@ -30,6 +30,7 @@\n     \"dingtalk\": \"💬 DingTalk\",\n     \"feishu\": \"🪽 Feishu\",\n     \"wecom\": \"💬 WeCom\",\n+    \"webhook\": \"🔗 Webhook\",\n }\n \n # ─── Config Helpers ───────────────────────────────────────────────────────────"]},{"file":"hermes_cli/tools_config.py","hunks":["@@ -150,6 +150,7 @@ def _get_plugin_toolset_keys() -> set:\n     \"wecom\": {\"label\": \"💬 WeCom\", \"default_toolset\": \"hermes-wecom\"},\n     \"api_server\": {\"label\": \"🌐 API Server\", \"default_toolset\": \"hermes-api-server\"},\n     \"mattermost\": {\"label\": \"💬 Mattermost\", \"default_toolset\": \"hermes-mattermost\"},\n+    \"webhook\": {\"label\": \"🔗 Webhook\", \"default_toolset\": \"hermes-webhook\"},\n }\n \n "]},{"file":"toolsets.py","hunks":["@@ -369,10 +369,16 @@\n         \"includes\": []\n     },\n \n+    \"hermes-webhook\": {\n+        \"description\": \"Webhook toolset - receive and process external webhook events\",\n+        \"tools\": _HERMES_CORE_TOOLS,\n+        \"includes\": []\n+    },\n+\n     \"hermes-gateway\": {\n         \"description\": \"Gateway toolset - union of all messaging platform tools\",\n         \"tools\": [],\n-        \"includes\": [\"hermes-telegram\", \"hermes-discord\", \"hermes-whatsapp\", \"hermes-slack\", \"hermes-signal\", \"hermes-homeassistant\", \"hermes-email\", \"hermes-sms\", \"hermes-mattermost\", \"hermes-matrix\", \"hermes-dingtalk\", \"hermes-feishu\", \"hermes-wecom\"]\n+        \"includes\": [\"hermes-telegram\", \"hermes-discord\", \"hermes-whatsapp\", \"hermes-slack\", \"hermes-signal\", \"hermes-homeassistant\", \"hermes-email\", \"hermes-sms\", \"hermes-mattermost\", \"hermes-matrix\", \"hermes-dingtalk\", \"hermes-feishu\", \"hermes-wecom\", \"hermes-webhook\"]\n     }\n }\n \n"]}]},{"kind":"pr","number":9967,"title":"fix: add SMS to PLATFORMS registry to fix KeyError on inbound message (#9789)","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"a696bceafaa24c68e2598eab65a7eb043af3ed8e","number":0}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false,"is_fix_pr":true,"fix_tier":"suggested","fix_detail_withheld":true},{"kind":"pr","number":13833,"title":"fix(platforms): add missing SMS platform to PLATFORMS registry","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"a696bceafaa24c68e2598eab65a7eb043af3ed8e","number":0}],"category":"superseded_by_pr","implication":"superseded"},"merged":false},{"kind":"pr","number":14112,"title":"fix(cli): register sms platform toolset","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"a696bceafaa24c68e2598eab65a7eb043af3ed8e","number":0}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false}],"trust":{"default_tier":"verified","includes_suggested":false}}