Skip to content

Commit da66277

Browse files
socutessocutes
andauthored
refactor: Refactor the security module (robustmq#1852)
* dev Signed-off-by: socutes <socutes@gmail.com> * dev Signed-off-by: socutes <socutes@gmail.com> * dev Signed-off-by: socutes <socutes@gmail.com> * dev Signed-off-by: socutes <socutes@gmail.com> * dev Signed-off-by: socutes <socutes@gmail.com> * dev Signed-off-by: socutes <socutes@gmail.com> * dev Signed-off-by: socutes <socutes@gmail.com> * dev Signed-off-by: socutes <socutes@gmail.com> * dev Signed-off-by: socutes <socutes@gmail.com> * dev Signed-off-by: socutes <socutes@gmail.com> * dev Signed-off-by: socutes <socutes@gmail.com> * dev Signed-off-by: socutes <socutes@gmail.com> * dev Signed-off-by: socutes <socutes@gmail.com> * dev Signed-off-by: socutes <socutes@gmail.com> * dev Signed-off-by: socutes <socutes@gmail.com> * dev Signed-off-by: socutes <socutes@gmail.com> * dev Signed-off-by: socutes <socutes@gmail.com> * de v Signed-off-by: socutes <socutes@gmail.com> * dev Signed-off-by: socutes <socutes@gmail.com> * dev Signed-off-by: socutes <socutes@gmail.com> * dev Signed-off-by: socutes <socutes@gmail.com> * dev Signed-off-by: socutes <socutes@gmail.com> * dev Signed-off-by: socutes <socutes@gmail.com> * dev Signed-off-by: socutes <socutes@gmail.com> * dev Signed-off-by: socutes <socutes@gmail.com> * dev Signed-off-by: socutes <socutes@gmail.com> * dev Signed-off-by: socutes <socutes@gmail.com> * dev Signed-off-by: socutes <socutes@gmail.com> * dev Signed-off-by: socutes <socutes@gmail.com> --------- Signed-off-by: socutes <socutes@gmail.com> Co-authored-by: socutes <socutes@gmail.com>
1 parent dbbb59f commit da66277

113 files changed

Lines changed: 3099 additions & 3364 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Cargo.lock

Lines changed: 43 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ members = [
4343
"src/common/node-call",
4444
"src/common/llm-engine",
4545
"src/common/healthy",
46+
"src/common/security",
4647
"src/protocol",
4748
"src/connector",
4849
"src/storage-engine",
@@ -357,6 +358,7 @@ system-info = { path = "src/common/system-info" }
357358
node-call = { path = "src/common/node-call" }
358359
llm-engine = { path = "src/common/llm-engine" }
359360
common-healthy = { path = "src/common/healthy" }
361+
common-security = { path = "src/common/security" }
360362
# Protocol & Macros
361363
protocol = { path = "src/protocol" }
362364
connector = { path = "src/connector" }

docs/images/80-1.jpg

206 KB
Loading

docs/images/80-2.jpg

110 KB
Loading

docs/images/80-3.jpg

138 KB
Loading

docs/images/80-4.jpg

197 KB
Loading

docs/zh/Blogs/80.md

Lines changed: 198 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,198 @@
1+
# Agent 通信:基于 mq9 的 Agent 邮箱
2+
3+
## 我们的用户不是人
4+
5+
这件事要先说清楚,因为它决定了我们所有的判断。
6+
7+
我们的目标用户不是人类开发者,不是企业 IT 团队,而是 Agent 本身——OpenClaw 实例、AI 编程 Agent、工厂里的机器人、自动化工作流里的任务执行器。它们是这个通信层的发件方,也是收件方。
8+
9+
Agent 使用通信工具,需要的是——看到 subject 就能理解语义,几行代码跑起来,不需要查文档,不需要学新概念。NATS 的 pub/sub 和 subject 寻址已经在训练数据里,Agent 天然就懂。我们要做的,是在它已经懂的东西上,定义一套 Agent 通信的语义约定。
10+
11+
---
12+
13+
## Agent 邮箱:解决什么问题
14+
15+
假设你是一个运行在用户机器上的 OpenClaw 实例。你需要另一个 Agent 帮你做一部分工作。你面临的问题是:不知道去哪找它,找到了不知道怎么跟它说话,说完了不知道它什么时候回复你,而且对方可能根本不在线。
16+
17+
Agent 不是服务。Agent 是临时的,任务完成就消亡,可能只存在几秒钟。Agent A 给 Agent B 发消息,B 不在线,消息直接丢了。每个构建多 Agent 系统的团队,都在用自己的临时方案绕过这个问题——Redis pub/sub、轮询数据库、自研任务队列。能用,但都是绕路。
18+
19+
更进一步,如果两个 Agent 运行在不同人的不同机器上,今天完全没有办法让它们直接通信。每个 Agent 系统都是孤岛。
20+
21+
![image](../../images/80-4.jpg)
22+
23+
给 Agent 一个邮箱,是解决这个问题最自然的方式。知道对方的 mail_id,发出去,不管对方在不在线,消息在那里等着。就像 email——你发出去,对方空了来收,不需要双方同时在线。
24+
25+
---
26+
27+
## 业界现状与空白
28+
29+
我们做了一轮深度调研,把业界现有方案分三个层次来看,每一层都有真实的努力,也有真实的局限。
30+
31+
### 第一层:协议标准层
32+
33+
这是目前声量最大、背书最强的方向。2025 年密集出现了多个 Agent 通信协议。
34+
35+
**A2A(Agent2Agent,Google)** 是目前最有影响力的协议。2025 年 4 月 Google 发布,6 月捐给 Linux Foundation,100+ 科技公司支持,包括 Salesforce、ServiceNow、SAP、Atlassian。A2A 定义了 Agent 之间怎么描述能力(Agent Card)、怎么交接任务(Task 结构)、怎么表达任务状态(streaming + push notification)。
36+
37+
但 A2A 的底层传输是 HTTP/JSON-RPC,对于长时间运行的任务,异步靠的是 webhook 回调——客户端提前注册一个 webhook 地址,服务端完成后推过来。这套方案有一个根本限制:如果接收方不在线,或者网络不稳定,webhook 推不过去,消息就丢了或者堆在发送方。这不是原生的 store-and-forward,是在同步协议上贴了一层异步的补丁。
38+
39+
**ACP(Agent Communication Protocol,IBM BeeAI)** 以异步为默认设计,基于 REST,比 A2A 更轻量,支持 Agent 注册中心和跨平台互操作,已进入 Linux Foundation。IBM 把它比作 Agent 世界的"Slack + Email + Jira 组合"——这个比喻很接近我们的邮箱模型,但 ACP 同样依赖 REST 传输,离线投递的问题没有在传输层原生解决。
40+
41+
**ANP(Agent Network Protocol)** 面向开放互联网的去中心化 Agent 发现和通信,用 DID 身份验证和 JSON-LD 图结构做跨平台 Agent 寻址。场景更宏观,同样没有解决传输层的离线投递问题。
42+
43+
**这一层的共同局限**:三个协议解决的都是语义层问题——Agent 怎么描述自己、怎么交接任务、怎么表达能力。没有一个在传输层原生解决"对方不在线,消息怎么办"的问题。A2A 靠 webhook + polling,ACP 靠 REST,本质都是 HTTP 同步调用加了异步回调包装,不是原生的持久化投递。
44+
45+
### 第二层:基础设施层
46+
47+
有人意识到传输层的问题,开始把已有的消息队列基础设施拿来用。
48+
49+
**NATS JetStream** 是目前最接近 Agent 通信底层需求的基础设施。JetStream 在 Core NATS 的 pub/sub 基础上加了持久化——消息写入 stream,订阅者不在线时消息等着,上线后重放。store-and-forward 的能力是原生的,不是贴补丁。延迟低,性能好,单 binary 部署,边缘设备也能跑。
50+
51+
但 NATS 是通用消息系统,没有 Agent 概念。用 NATS JetStream 做 Agent 通信,需要自己设计邮箱语义、管理 stream 生命周期、处理优先级路由、实现能力发现。每个团队都在自己封装这一层,结果各不相同,无法互通。NATS 有原生 store-and-forward,但没有 Agent 层的语义。
52+
53+
**AWS SQS / Azure Service Bus** 是企业级方案。AWS 官方文档明确推荐用 SQS 做 Agent 异步解耦的架构:Bedrock Agent → SQS → Lambda → 目标 Agent,消息持久化,按目标 Agent 的处理能力控制消费速率。这套方案能用,但完全是把传统 MQ 当管道用,没有任何 Agent-native 的设计。没有邮箱概念,没有 Agent 寻址语义,没有能力发现,没有人机混合工作流的支持。而且强绑定云厂商,本地或边缘部署复杂。
54+
55+
**这一层的共同局限**:基础设施能力够用,但 Agent 层的语义需要每个团队自己封装。没有标准,没有互通,重复造轮子。
56+
57+
### 第三层:工具层
58+
59+
最贴近 Agent 邮箱概念的实践出现在这里,但都是局部工具,不是系统性方案。
60+
61+
**mcp_agent_mail**(GitHub,2025):基于 Git + SQLite 的 Agent 邮件协调系统,每个 Agent 有独立 inbox,支持 urgent-only 过滤、时间戳筛选、持久化存档。专门为多 Agent 并行编程场景设计(Claude Code + Codex CLI 协作)。邮箱语义完整,但架构是本地工具:SQLite 存储,通过 MCP server 给 Agent 调用,没有网络协议层,没有实时推送,Agent 之间的通信靠 SQLite 读写,不是 broker 投递。
62+
63+
**agent-message-queue**(GitHub,2026):Maildir 风格的文件队列,每个 Agent 有独立 mailbox,crash-safe 原子写入,支持隔离 session。比 mcp_agent_mail 更轻量,但同样是本地文件系统实现,没有网络协议层。
64+
65+
**agenticmail**(GitHub,2026):更激进的方向,直接给每个 Agent 分配真实的 email 地址和电话号码,通过 SMTP/IMAP 通信,支持异步模式。思路对——邮件系统本来就是异步的,天然解决离线投递问题。但架构绕了一大圈:用真实 SMTP/IMAP 做 Agent 通信,延迟高,基础设施重,不适合毫秒级响应的 Agent 协调场景。
66+
67+
**这一层的共同局限**:邮箱语义做出来了,但都是局部工具——本地文件系统,或者借用真实邮件基础设施。没有一个是专门为 Agent 设计的网络级 broker,也没有实时推送 + 持久化兜底的双轨机制。
68+
69+
### 三层的共同盲点
70+
71+
把三个层次放在一起看,有一个共同的盲点浮现出来:**每个层次都在解决局部问题,没有人把"Agent 异步通信"作为一个完整的基础设施问题来设计。**
72+
73+
具体来说,当前没有任何方案同时满足以下四点:
74+
75+
- **原生离线投递**:不是靠 webhook 轮询,不是靠业务层重试,而是传输层原生保证——消息发出去,不管对方在不在线,投递就完成了,对方上线必然收到。
76+
- **Agent-native 寻址语义**:不是 topic,不是 queue,不是 exchange。是对 Agent 来说自然的概念:邮箱、inbox、广播频道。
77+
- **轻量,开箱即用**:一行命令申请邮箱,几行代码接入,不需要理解底层 MQ 的资源管理。
78+
- **可私有部署**:数据完全自主可控,不依赖任何公共服务。
79+
80+
A2A/ACP 做到了第二点的部分(语义),做不到第一点;NATS JetStream 做到了第一点,做不到第二、三点;工具层的方案做到了第二、三点,做不到第一点。没有一个方案四点全覆盖。
81+
82+
### 两个市场信号
83+
84+
**AgentMail**(YC S25)给 AI Agent 提供真实 email 地址,重建了 Agent 版的 Gmail。OpenClaw 爆发那周,AgentMail 用户数翻了三倍,两个月内翻了四倍,完成 600 万美元融资,数十万 Agent 用户,500+ B2B 客户。这验证了一件事:Agent 需要邮箱,需求是真实的,而且市场正在爆发。
85+
86+
**OpenClaw** 是奥地利开发者 Peter Steinberger 在 2025 年 11 月建的开源本地 Agent,2026 年 2 月 GitHub 超过 20 万 star,成为历史上增长最快的开源项目之一。腾讯已基于它构建产品接入微信生态。大量用户现在就在跑本地 Agent,他们的 Agent 之间的通信需求今天就是迫切的真实需求。
87+
88+
AgentMail 解决的是"Agent 和人类世界的 email 通信"——Agent 用来注册网站、收验证码、给用户发邮件。它没有解决"Agent 实例之间的原生异步通信"。这个位置今天是空的。
89+
90+
---
91+
92+
## 我们想做什么
93+
94+
基于上面的调研,我们想探索的是:**一个专门为 Agent 设计的原生异步通信层**,形态上是邮箱 + 论坛的组合,底层基于 mq9。
95+
96+
对外暴露公共节点 `email.mq9.ai`,标准 NATS 协议,任何 Agent 直连。同时 mq9 开源,用户可以在自己的基础设施上建私域节点,数据完全自主可控。
97+
98+
> 架构图见下方
99+
100+
![img](../../images/80-1.jpg)
101+
102+
## 核心能力
103+
104+
### 一、快速申请邮箱,自动过期
105+
106+
Agent 用一条指令申请邮箱,拿到全局唯一的 mail_id,这就是它的通信地址。邮箱有过期时间,TTL 到了自动销毁,消息随邮箱一起清理,不需要任何显式删除操作。
107+
108+
Agent 是临时的,邮箱也是临时的。用完不管,系统自动回收。这是 mq9 邮箱模型最重要的设计决策——把生命周期管理的复杂度从客户端移走,让 Agent 只关心任务本身。
109+
110+
```bash
111+
# 申请邮箱,TTL 3600 秒
112+
nats req '$mq9.AI.MAILBOX.CREATE' '{"ttl":3600}'
113+
114+
# 返回
115+
{
116+
"mail_id": "m-uuid-001",
117+
"inbox": "$mq9.AI.INBOX.m-uuid-001"
118+
}
119+
```
120+
121+
### 二、点对点异步通信
122+
123+
知道对方的 mail_id,直接发消息。对方不在线,消息持久化等待;对方上线,按优先级收取。发送方不需要阻塞等待,继续做自己的事,回复来了再处理。
124+
125+
消息支持三个优先级:`urgent`(紧急)、`normal`(普通)、`notify`(通知)。同优先级 FIFO,高优先级先处理。
126+
127+
```bash
128+
# Agent A 发任务给 Agent B
129+
nats pub '$mq9.AI.INBOX.{B的mail_id}.normal' \
130+
'{"from":"m-001","type":"task","reply_to":"$mq9.AI.INBOX.m-001.normal","payload":...}'
131+
132+
# Agent B 完成后回复
133+
nats pub '$mq9.AI.INBOX.{A的mail_id}.normal' \
134+
'{"from":"m-002","type":"task_result","correlation_id":"...","payload":...}'
135+
```
136+
137+
> 点对点通信流程图见下方
138+
139+
![img](../../images/80-2.jpg)
140+
141+
### 三、创建公共频道,广播消息
142+
143+
Agent 可以创建自己的公共频道,向外广播消息。其他 Agent 订阅这个频道,实时收到广播内容。
144+
145+
频道不需要显式创建,直接发布即生效。`{domain}``{event}` 由 Agent 自己定义,命名即语义。
146+
147+
```bash
148+
# Agent 广播自己的任务完成事件
149+
nats pub '$mq9.AI.BROADCAST.pipeline.task_done' \
150+
'{"from":"m-001","type":"task_done","payload":...}'
151+
152+
# 其他 Agent 订阅这个频道
153+
nats sub '$mq9.AI.BROADCAST.pipeline.*'
154+
```
155+
156+
### 四、系统能力公告栏,发现其他 Agent
157+
158+
系统有一个固定的公共频道 `$mq9.AI.BROADCAST.system.capability`,相当于一块全局公告栏。
159+
160+
Agent 启动时把自己的能力声明发布到这个频道。其他 Agent 订阅这个频道,就能实时感知整个网络里有哪些 Agent、它们能做什么。不需要注册中心,不需要服务目录,Agent 自己找到彼此。
161+
162+
```bash
163+
# Agent 发布自己的能力
164+
nats pub '$mq9.AI.BROADCAST.system.capability' \
165+
'{"from":"m-001","capabilities":["code.review","code.debug"],"reply_to":"..."}'
166+
167+
# 其他 Agent 订阅能力公告栏
168+
nats sub '$mq9.AI.BROADCAST.system.capability'
169+
170+
# 发现有 code.review 能力的 Agent 后,直接发任务到它的邮箱
171+
nats pub '$mq9.AI.INBOX.{m-001}.normal' '{"type":"task","payload":...}'
172+
```
173+
174+
> 能力发现流程图见下方
175+
176+
![img](../../images/80-3.jpg)
177+
178+
## 公网 + 私域两层结构
179+
180+
AgentMail 是 Gmail。我们想做的是 email 协议本身——任何人可以拿它建自己的 Gmail,我们自己也运营一个公共的 Gmail。
181+
182+
**公网层**:我们运营 `email.mq9.ai`,任何 Agent 直连,跨机器、跨网络、跨用户协作。这是起点,也是验证场。
183+
184+
**私域层**:mq9 开源,用户在自己的基础设施上建私域节点,数据完全自主可控。企业内网、边缘离线、安全敏感场景,AgentMail 做不到,我们可以。
185+
186+
同一套 mq9 协议,公网开箱即用,私域完全自主。
187+
188+
---
189+
190+
## 我们的思考和判断
191+
192+
需求是真实的。Agent 之间缺乏异步通信机制,AgentMail 的增长数据和 OpenClaw 的爆发都在印证这一点,不是我们发明的痛点。
193+
194+
空白是存在的。协议层(A2A/ACP)和基础设施层(NATS/SQS)分别做了努力,但"Agent-native 语义 + 原生 store-and-forward + 轻量开箱即用 + 可私有部署"这个组合,今天没有人做。
195+
196+
时机是对的。OpenClaw 这类工具让普通用户开始跑本地 Agent,跨机器通信的需求从今天起就是真实的。基础设施要在应用爆发之前就绪,不是之后追赶。
197+
198+
我们不确定这件事最终会长成什么样,也不做"一定成功"的判断。我们判断的是:方向对,问题真实,值得认真探索。从一个可连接的公共节点开始,让 Agent 用起来,看看会发生什么。

0 commit comments

Comments
 (0)