diff --git a/scripts/release.py b/scripts/release.py index a943efe066e..e10ffcb7144 100755 --- a/scripts/release.py +++ b/scripts/release.py @@ -45,6 +45,7 @@ ACP_REGISTRY_MANIFEST = REPO_ROOT / "acp_registry" / "agent.json" # Auto-extracted from noreply emails + manual overrides AUTHOR_MAP = { + "rrandqua@gmail.com": "TutkuEroglu", # PR #50481 salvage (AGENTS.md stale token-lock adapter path) "pedro.m.simoes@gmail.com": "pmos69", # PR #29474 salvage (native Antigravity OAuth provider; Gemini CLI sunset #29294/#49701) "mediratta01.pally@gmail.com": "orbisai0security", # PR #9560 salvage (session.py path-traversal guard, V-009) "panghuer023@users.noreply.github.com": "panghuer023", # PR #37994 salvage (interrupt unblocks pending gateway approval; #8697) diff --git a/website/docs/developer-guide/adding-platform-adapters.md b/website/docs/developer-guide/adding-platform-adapters.md index 9e8340c8e11..652beed4fcd 100644 --- a/website/docs/developer-guide/adding-platform-adapters.md +++ b/website/docs/developer-guide/adding-platform-adapters.md @@ -476,7 +476,7 @@ class Platform(str, Enum): ### 2. Adapter File -Create `gateway/platforms/newplat.py`: +Create `plugins/platforms/newplat/adapter.py`: ```python from gateway.config import Platform, PlatformConfig @@ -689,4 +689,4 @@ async def disconnect(self): | `bluebubbles.py` | REST + webhook | Medium | Simple REST API integration | | `weixin.py` | Long-poll + CDN | High | Media handling, encryption | | `wecom_callback.py` | Callback/webhook | Medium | HTTP server, AES crypto, multi-app | -| `telegram.py` | Long-poll + Bot API | High | Full-featured adapter with groups, threads | +| `plugins/platforms/irc/adapter.py` | Long-poll + IRC protocol | High | Full-featured plugin adapter with scoped token lock | diff --git a/website/docs/developer-guide/gateway-internals.md b/website/docs/developer-guide/gateway-internals.md index bdf6b153efc..146b0587b49 100644 --- a/website/docs/developer-guide/gateway-internals.md +++ b/website/docs/developer-guide/gateway-internals.md @@ -143,32 +143,37 @@ Unlike the CLI (which uses `load_cli_config()` with hardcoded defaults), the gat ## Platform Adapters -Each messaging platform has an adapter in `gateway/platforms/`: +Most messaging platforms ship as plugin adapters under `plugins/platforms//adapter.py`; a few legacy adapters still live directly in `gateway/platforms/`. All extend `BasePlatformAdapter` from `gateway/platforms/base.py`: ```text -gateway/platforms/ -├── base.py # BaseAdapter — shared logic for all platforms -├── telegram.py # Telegram Bot API (long polling or webhook) -├── discord.py # Discord bot via discord.py -├── slack.py # Slack Socket Mode -├── whatsapp.py # WhatsApp Business Cloud API +plugins/platforms/ # plugin-packaged adapters (one dir each) +├── telegram/adapter.py # Telegram Bot API (long polling or webhook) +├── discord/adapter.py # Discord bot via discord.py +├── slack/adapter.py # Slack Socket Mode +├── whatsapp/adapter.py # WhatsApp Business Cloud API +├── matrix/adapter.py # Matrix via mautrix (optional E2EE) +├── mattermost/adapter.py # Mattermost WebSocket API +├── email/adapter.py # Email via IMAP/SMTP +├── sms/adapter.py # SMS via Twilio +├── dingtalk/adapter.py # DingTalk WebSocket +├── feishu/adapter.py # Feishu/Lark WebSocket or webhook +├── wecom/adapter.py # WeCom (WeChat Work) callback +├── line/adapter.py # LINE Messaging API +├── teams/adapter.py # Microsoft Teams +├── irc/adapter.py # IRC (canonical scoped-lock example) +├── homeassistant/adapter.py # Home Assistant conversation integration +└── … # google_chat, ntfy, photon, raft, simplex, … + +gateway/platforms/ # core base + legacy direct adapters +├── base.py # BasePlatformAdapter — shared logic for all platforms ├── signal.py # Signal via signal-cli REST API -├── matrix.py # Matrix via mautrix (optional E2EE) -├── mattermost.py # Mattermost WebSocket API -├── email.py # Email via IMAP/SMTP -├── sms.py # SMS via Twilio -├── dingtalk.py # DingTalk WebSocket -├── feishu.py # Feishu/Lark WebSocket or webhook -├── wecom.py # WeCom (WeChat Work) callback ├── weixin.py # Weixin (personal WeChat) via iLink Bot API ├── bluebubbles.py # Apple iMessage via BlueBubbles macOS server -├── qqbot/ # QQ Bot (Tencent QQ) via Official API v2 (sub-package: adapter.py, crypto.py, keyboards.py, …) +├── qqbot/ # QQ Bot (Tencent QQ) via Official API v2 (sub-package) ├── yuanbao.py # Yuanbao (Tencent) DM/group adapter -├── feishu_comment.py # Feishu document/drive comment-reply handler ├── msgraph_webhook.py # Microsoft Graph change-notification webhook (Teams, Outlook, etc.) ├── webhook.py # Inbound/outbound webhook adapter -├── api_server.py # REST API server adapter -└── homeassistant.py # Home Assistant conversation integration +└── api_server.py # REST API server adapter ``` Experimental connector-backed platforms use the generic relay adapter in `gateway/relay/` instead of a direct platform module. When `GATEWAY_RELAY_URL` or `gateway.relay_url` is configured, the gateway registers the `relay` platform, dials the connector over an outbound WebSocket, and receives `descriptor`, `inbound`, and `interrupt_inbound` frames on that same socket. The connector advertises a `CapabilityDescriptor`; Hermes can send normal outbound replies, token-less `follow_up` operations, and interrupt frames back through the relay. The source-grounded wire contract lives in [`docs/relay-connector-contract.md`](https://github.com/NousResearch/hermes-agent/blob/main/docs/relay-connector-contract.md). diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/adding-platform-adapters.md b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/adding-platform-adapters.md index 0a947fa16db..43bd0b49fe3 100644 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/adding-platform-adapters.md +++ b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/adding-platform-adapters.md @@ -472,7 +472,7 @@ class Platform(str, Enum): ### 2. 适配器文件 -创建 `gateway/platforms/newplat.py`: +创建 `plugins/platforms/newplat/adapter.py`: ```python from gateway.config import Platform, PlatformConfig @@ -685,4 +685,4 @@ async def disconnect(self): | `bluebubbles.py` | REST + webhook | 中 | 简单 REST API 集成 | | `weixin.py` | 长轮询 + CDN | 高 | 媒体处理、加密 | | `wecom_callback.py` | 回调/webhook | 中 | HTTP 服务器、AES 加密、多应用 | -| `telegram.py` | 长轮询 + Bot API | 高 | 支持群组、线程的全功能适配器 | \ No newline at end of file +| `plugins/platforms/irc/adapter.py` | 长轮询 + IRC 协议 | 高 | 带作用域令牌锁的全功能插件适配器 | \ No newline at end of file diff --git a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/gateway-internals.md b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/gateway-internals.md index 50de95a1ebf..63c89d7e802 100644 --- a/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/gateway-internals.md +++ b/website/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/gateway-internals.md @@ -143,32 +143,37 @@ Gateway 从多个来源读取配置: ## 平台适配器 -每个消息平台在 `gateway/platforms/` 下均有对应适配器: +大多数消息平台以插件适配器形式位于 `plugins/platforms//adapter.py`;少数旧适配器仍直接位于 `gateway/platforms/`。它们都继承 `gateway/platforms/base.py` 中的 `BasePlatformAdapter`: ```text -gateway/platforms/ -├── base.py # BaseAdapter — 所有平台的共享逻辑 -├── telegram.py # Telegram Bot API(长轮询或 webhook) -├── discord.py # Discord bot(通过 discord.py) -├── slack.py # Slack Socket Mode -├── whatsapp.py # WhatsApp Business Cloud API +plugins/platforms/ # 插件打包的适配器(每个一个目录) +├── telegram/adapter.py # Telegram Bot API(长轮询或 webhook) +├── discord/adapter.py # Discord bot(通过 discord.py) +├── slack/adapter.py # Slack Socket Mode +├── whatsapp/adapter.py # WhatsApp Business Cloud API +├── matrix/adapter.py # Matrix(通过 mautrix,可选 E2EE) +├── mattermost/adapter.py # Mattermost WebSocket API +├── email/adapter.py # 电子邮件(通过 IMAP/SMTP) +├── sms/adapter.py # 短信(通过 Twilio) +├── dingtalk/adapter.py # 钉钉 WebSocket +├── feishu/adapter.py # 飞书/Lark WebSocket 或 webhook +├── wecom/adapter.py # 企业微信(WeCom)回调 +├── line/adapter.py # LINE Messaging API +├── teams/adapter.py # Microsoft Teams +├── irc/adapter.py # IRC(作用域锁的标准示例) +├── homeassistant/adapter.py # Home Assistant 对话集成 +└── … # google_chat、ntfy、photon、raft、simplex 等 + +gateway/platforms/ # 核心 base 与旧的直接适配器 +├── base.py # BasePlatformAdapter — 所有平台的共享逻辑 ├── signal.py # Signal(通过 signal-cli REST API) -├── matrix.py # Matrix(通过 mautrix,可选 E2EE) -├── mattermost.py # Mattermost WebSocket API -├── email.py # 电子邮件(通过 IMAP/SMTP) -├── sms.py # 短信(通过 Twilio) -├── dingtalk.py # 钉钉 WebSocket -├── feishu.py # 飞书/Lark WebSocket 或 webhook -├── wecom.py # 企业微信(WeCom)回调 ├── weixin.py # 微信(个人版,通过 iLink Bot API) ├── bluebubbles.py # Apple iMessage(通过 BlueBubbles macOS 服务端) -├── qqbot/ # QQ Bot(腾讯 QQ,通过官方 API v2,子包:adapter.py、crypto.py、keyboards.py 等) +├── qqbot/ # QQ Bot(腾讯 QQ,通过官方 API v2,子包) ├── yuanbao.py # 元宝(腾讯)私信/群组适配器 -├── feishu_comment.py # 飞书文档/云盘评论回复处理器 ├── msgraph_webhook.py # Microsoft Graph 变更通知 webhook(Teams、Outlook 等) ├── webhook.py # 入站/出站 webhook 适配器 -├── api_server.py # REST API 服务器适配器 -└── homeassistant.py # Home Assistant 对话集成 +└── api_server.py # REST API 服务器适配器 ``` 适配器实现统一接口: