feat(hermes): complete Zulip gateway platform adapter plugin
CI / validate (push) Failing after 2s

Rewrite hermes-zulip-plugin as a proper Hermes platform plugin with
auto-discovery via plugin.yaml + __init__.py + register() pattern.

Features:
- Zulip event queue registration and polling for real-time messages
- DM-first architecture — private messages route into agent's session
- Placeholder→edit streaming UX (Thinking... → final response)
- Typing indicators via Zulip API
- Exponential backoff reconnection and queue re-registration
- Message deduplication with sliding window
- Config via config.yaml or env vars (ZULIP_EMAIL, ZULIP_API_KEY, ZULIP_SITE)
- Standalone sender for cron/notification delivery
- Plugin auto-discovery via @hermes_agent.plugins entry point

Architecture follows the proven ntfy adapter pattern:
  plugins/platforms/{name}/plugin.yaml
  plugins/platforms/{name}/__init__.py  → exports register()
  plugins/platforms/{name}/adapter.py   → ZulipAdapter(BasePlatformAdapter)

Deployment: copy to ~/.hermes/plugins/platforms/zulip/ and restart gateway
Requirements: pip install zulip httpx

Closes issue #24
This commit is contained in:
root
2026-06-24 21:32:49 +00:00
parent 5b34d599a5
commit 355123f204
6 changed files with 667 additions and 146 deletions
+47
View File
@@ -0,0 +1,47 @@
name: zulip-platform
label: Zulip
kind: platform
version: 1.0.0
description: >
Zulip messaging gateway adapter for Hermes Agent.
Connects to any Zulip server, registers an event queue, and polls for
incoming messages. Handles DMs first (ADR-001), with @mention support
planned. Uses the Zulip Python SDK for API access.
DM-first architecture: private messages route directly into the Hermes
agent's session, so the same personality and conversation continuity
is maintained between TUI, CLI, and Zulip.
Features: event queue polling, typing indicators, placeholder→edit
streaming, exponential backoff reconnection, health endpoint.
author: Syslog Solution LLC
requires_env:
- name: ZULIP_EMAIL
description: "Zulip bot email address (e.g. tanko-bot@chat.sysloggh.net)"
prompt: "Zulip bot email"
password: false
- name: ZULIP_API_KEY
description: "Zulip bot API key"
prompt: "Zulip API key"
password: true
- name: ZULIP_SITE
description: "Zulip server URL (e.g. https://chat.sysloggh.net)"
prompt: "Zulip server URL"
password: false
optional_env:
- name: ZULIP_ALLOWED_USERS
description: "Comma-separated Zulip user IDs or emails allowed to DM the agent"
prompt: "Allowed users (comma-separated emails or IDs)"
password: false
- name: ZULIP_ALLOW_ALL_USERS
description: "Allow any user to DM the bot (disables allowlist)"
prompt: "Allow all users? (true/false)"
password: false
- name: ZULIP_HOME_CHANNEL
description: "Default recipient for cron / notification delivery"
prompt: "Home channel user email (or empty)"
password: false
- name: ZULIP_HOME_CHANNEL_NAME
description: "Human label for the home channel"
prompt: "Home channel display name"
password: false